@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            GRA121
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                              ISSUE 11~
~V9 -1
~P
~V9 1
~YGRA121
~S~M~OGRAPHICS UTILITIES IMPLEMENTATION DESCRIPTION
~S~M~OSection 12 Version 1
~S~OSection 12.1 Graphics Benson plotter Device Driver
~S1~O1. General Description
~BThis module is the graphics device driver for a Benson
plotter.  It consists of a set of procedures for
controlling line drawing and text output on a Benson.
~S1~O2. Interface
~
Procedures~
   BENSON.INIT~
   BENSON.TERM~
   BENSON.NEW.FRAME~
   BENSON.LINE~
   BENSON.TEXT~
   BENSON.MARKER~
   BENSON.ATTR~
   BENSON.REPORT~
~
Data Structures~
~
   None~
~S1~O2.1 Hardware Specification
~BThe Benson pen plotter is controlled by a
dedicated process set up by the user. The plotter
is driven by issuing commands to this process which
in turn communicates these to the plotter's microprocessor.~
~S1~O2.2 Software Interface
~BThis consists of the following procedures.~
~T% 30
~
~
1) BENSON.INIT ()~IInitialises the Benson.~
~
2) BENSON.TERM ()~IResets the Benson.~
~
3) BENSON.NEW.FRAME ()~IMoves the pen to a fresh area of paper.~
~
4) BENSON.LINE (X1, Y1, X2, Y2)~IDraws a line from X1, Y1 to X2, Y2 in the
format preselected by the Graphics library.~
~
5) BENSON.TEXT (X, Y, STRING,~
             LENGTH)~IGenerates a text string
at X, Y with a preselected format and rotation.~
~
6) BENSON.MARKER (X, Y, SYMBOL)~IGenerates the specified symbol at X, Y.~
~
7) BENSON.ATTR (NO., VALUE)~ISets the attribute specified by NO.
The only attributes catered for by this Benson device
driver are pen selection, character size and rotation.~
~
8) BENSON.REPORT (RVEC, IVEC)~ISets up the device capabilities in RVEC
and IVEC.  This procedure is irrelevant to SUBSET. It is only used by
the full CORE.~
~S1~O3.1 Outline of Operation
~BThe procedures comprising this module send output to the current
stream.~
~S1~O3.2 Data Structures
~
None~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               GRA121
~V9 -1
~F
@TITLE GRA12(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
BENSON DRIVER PROCEDURES
@BOX 2.0
DECLARATIONS
@BOX 3.0
@BOX 4.0
PROCEDURES IN SUBSECTION:
   BENSON INITIALISE
   BENSON TERMINATE
   BENSON NEW FRAME
   BENSON LINE
   BENSON TEXT
   BENSON MARKER
   BENSON ATTRIBUTE
   BENSON REPORT
   BENSON MOVE
@BOX 5.0
@BOX 6.0
END
@BOX 1.1
$IN32 A4, A4Q, LANSP;
$RE WNDW.XMIN, WNDW.X.MAX, WNDW.Y.MIN, WNDW.Y.MAX;
$IN32 C.CHARPATH,PEN,OLD.OUTPUT.STREAM;
$RE TX.SIN,TX.COS,PLT.X,PLT.Y,RES.VERT,RES.HORIZ, A4W.NDC,A4H.NDC;
$RE NDC.WIDTH,NDC.HEIGHT,NDC.SCALE,CHARSZ.WIDTH,CHARSZ.HEIGHT;
MODULE(BENSON.INIT,BENSON.TERM,BENSON.NEW.FRAME,BENSON.LINE,
   BENSON.TEXT,BENSON.MARKER,BENSON.ATTR,BENSON.REPORT);
@BOX 2.1
*GLOBAL 7;
$LI PEN.UP=0,PEN.DOWN=1;
$LI/$LO8 CR=13,LF=10;
$LI/$RE A4W.CM =21.0, A4H.CM =29.7;
$IN COUNT.A4;
$RE DW, DH;
$RE A11, A22, A33, A44;
$IN BEN.FILE;
*GLOBAL 0;
@BOX 3.1
@BOX 4.1
PSPEC BENSON.INIT();
PSPEC BENSON.TERM();
PSPEC BENSON.NEW.FRAME();
PSPEC BENSON.LINE($RE,$RE,$RE,$RE);
PSPEC BENSON.TEXT($RE,$RE,$AD[$LO8],$IN);
PSPEC BENSON.MARKER($RE,$RE,$LO8);
PSPEC BENSON.ATTR($IN);
PSPEC BENSON.REPORT($AD[$RE],$AD[$IN32]);
PSPEC BENSON.MOVE($RE,$RE);
@BOX 5.1
   #GRA12.1
   #GRA12.2
   #GRA12.3
   #GRA12.4
   #GRA12.5
   #GRA12.6
   #GRA12.7
   #GRA12.8
   #GRA12.9
@BOX 6.1
*END
@END
@TITLE GRA12.1(1,10)
@COL 1S-2R-4R-5F
@FLOW 1-2-4-5
@BOX 1.0
BENSON INITIALISE ()
@BOX 2.0
CREATE CODE FILE
@BOX 4.0
SET DEFAULT CHARACTER SIZE
@BOX 5.0
END
@BOX 1.1
PROC BENSON.INIT ;
@BOX 2.1
::CURRENT.OUTPUT () => OLD.OUTPUT.STREAM;
::DEFINE.OUTPUT (-1, %"B.CODE00", %200, 64, 5, 0) => BEN.FILE;
::SELECT.OUTPUT (BEN.FILE);
0.0 => TX.SIN ; 1.0 => TX.COS;
0.0 => PLT.X => PLT.Y;
200.0 => RES.HORIZ => RES.VERT;
IF NDC.HEIGHT < 1.0 THEN
   200.0 * 73.0 / NDC.HEIGHT => NDC.SCALE
ELSE
   200.0 * 73.0 => NDC.SCALE
FI;
 A4W.CM/73.0 * NDC.HEIGHT => A4W.NDC;
 A4H.CM/73.0 * NDC.HEIGHT => A4H.NDC;
0.0=> DW =>DH;
 0 => COUNT.A4;
1 => LANSP;
IF WNDW.X.MAX-WNDW.X.MIN < WNDW.Y.MAX-WNDW.Y.MIN  THEN
    0 => LANSP
FI
@BOX 4.1
@BOX 5.1
END
@END
@TITLE GRA12.2(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
BENSON TERMINATE ()
@BOX 2.0
FORCE NEW FRAME AND RESET OUTPUT STREAMS
@BOX 3.0
END
@BOX 1.1
PROC BENSON.TERM ;
@BOX 2.1
IF A4 = 0  THEN
BENSON.NEW.FRAME ();
ELSE
 L: IF COUNT.A4 >2 THEN
      3->COUNT.A4;
       ->L;
    FI
   IF COUNT.A4 /=0 THEN
    BENSON.MOVE (A4H.CM+DH+5.0/73.0*NDC.HEIGHT,
             (A4W.CM+DW)*(0.0-COUNT.A4)/73.0*NDC.HEIGHT);
  ELSE
  BENSON.MOVE (5.0/73.0*NDC.HEIGHT, 0.0);
  FI
FI
::END.OUTPUT (BEN.FILE, 0);
::SELECT.OUTPUT (OLD.OUTPUT.STREAM);
@BOX 3.1
END
@END
@TITLE GRA12.3(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
BENSON NEW FRAME ()
@BOX 2.0
MOVE PAPER ON TO CLEAR AREA
@BOX 3.0
END
@BOX 1.1
PROC BENSON.NEW.FRAME;
@BOX 2.1
 $IN  I ;
IF A4 /= 0  THEN
  IF A4Q =0 THEN
    0.0 => DW; 0.0 => DH;
  ELSE
    0.7 => DW; -1.7=> DH;
  FI
  1 +> COUNT.A4 => I;
 L1: IF I> 2  THEN
     3 -> I;
      -> L1
     FI
   IF I /= 0  THEN
    BENSON.MOVE (0.0, (A4W.CM+DW)/73.0*NDC.HEIGHT)
   ELSE
    BENSON.MOVE ((A4H.CM+DH)/73.0*NDC.HEIGHT,
                 (A4W.CM+DW)*(-2)/73.0*NDC.HEIGHT);
   FI
ELSE
   BENSON.MOVE (NDC.WIDTH, 0.0)
FI
   0.0 =>PLT.X =>PLT.Y;
@BOX 3.1
END
@END
@TITLE GRA12.4(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
BENSON LINE (X.MIN, Y.MIN, X.MAX, Y.MAX)
@BOX 2.0
MOVE PEN TO START POINT OF LINE
[GRA12.9]
@BOX 3.0
COMPUTE LINE X AND Y INCREMENTS
@BOX 4.0
ISSUE LINE DRAWING INSTRUCTIONS
@BOX 5.0
RESET PLOTTER CURRENT PEN POSITION
@BOX 6.0
END
@BOX 1.1
PROC BENSON.LINE (X.MIN, Y.MIN, X.MAX, Y.MAX);
$IN X.INC, Y.INC;
 $RE T1,T2;
 $RE RX, RY;
@BOX 2.1
IF A4 /= 0 AND LANSP =0  THEN
   XMIN => T1; XMAX => T2;
   YMIN =>XMIN; YMAX => XMAX;
    A4W.NDC -T1=> YMIN;
     A4W.NDC -T2=> YMAX;
FI
BENSON.MOVE (X.MIN, Y.MIN);
@BOX 3.1
X.MAX  * NDC.SCALE - PLT.X=> X.INC;
Y.MAX  * NDC.SCALE - PLT.Y=> Y.INC;
X.INC =>RX; Y.INC=> RY;
@BOX 4.1
OUTCH (%00);
CAPTION (%"PL ");
OUT.I (X.INC, 0); SPACES (1);
OUT.I (Y.INC, 0); SPACES (1);
OUT.I (PEN.DOWN, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 5.1
RX +> PLT.X;
RY +> PLT.Y;
@BOX 6.1
END
@END
@TITLE GRA12.5(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
BENSON TEXT (X, Y, STRING)
@BOX 2.0
INITIALISE PEN TO START OF TEXT STRING
[GRA12.9]
@BOX 3.0
ISSUE TEXT DRAWING INSTRUCTION
@BOX 4.0
RESET PEN TO START OF TEXT STRING
@BOX 5.0
END
@BOX 1.1
PROC BENSON.TEXT (X, Y, STRING, LENGTH);
$RE T;
@BOX 2.1
IF A4 /= 0 AND LANSP =0 THEN
   X =>T;  Y=>X;
    A4W.NDC -T=>Y;
FI
BENSON.MOVE (X, Y);
@BOX 3.1
OUTCH (%00);
CAPTION (%"TX ");
OUT.I (LENGTH, 0); SPACES (1);
CAPTION (STRING); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 4.1
CAPTION (%"NT ");
OUT.I (0, 0); SPACES (1);
OUT.I (0, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 5.1
END
@END
@TITLE GRA12.6(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
BENSON MARKER (X, Y, SYMBOL)
@BOX 2.0
SET PEN POSITION TO DRAW MARKER
[GRA12.9]
@BOX 3.0
ISSUE INSTRUCTION TO DRAW MARKER
@BOX 4.0
RESET PEN POSITION
@BOX 5.0
END
@BOX 1.1
PROC BENSON.MARKER (X, Y, SYMBOL);
$RE T;
@BOX 2.1
IF A4 /= 0 AND LANSP = 0  THEN
   X => T; Y =>X;
   A4W.NDC -T=>Y;
FI
BENSON.MOVE (X, Y);
@BOX 3.1
CAPTION (%"TX ");
OUT.I (1, 0); SPACES (1);
OUT.CH (SYMBOL); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 4.1
CAPTION (%"NT ");
OUT.I (0, 0); SPACES (1);
OUT.I (0, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 5.1
END
@END
@TITLE GRA12.7(1,10)
@COL 8R-9R
@COL 1S-2R-3R-4R-5R-6R-7F
@COL 10R-11R
@ROW 8-3-10
@FLOW 1-2
@FLOW 3-4-5-6-7
@FLOW 8-9-7
@FLOW 10-11-4
@BOX 8.0
SELECT PEN
@BOX 9.0
SELECT SPECIFIED
PEN(0,1,2)
@BOX 1.0
BENSON ATTRIBUTE(ATTRIBUTE NUMBER)
@BOX 2.0
SWITCH ON
ATTRIBUTE NUMBER
@BOX 3.0
SET CHAR
SIZE
@BOX 4.0
CONVERT NDC CHAR SIZE
TO CMS.
@BOX 5.0
COMPUTE TEXT PARAMETERS
@BOX 6.0
ISSUE TEXT DRAWING
INSTRUCTION
@BOX 7.0
END
@BOX 10.0
SET CHAR PATH
@BOX 11.0
SWITCH ON VALUE OF
PATH TO COMPUTE NEW
TEXT PARAMETERS
@BOX 1.1
PROC BENSON.ATTR(NO);
$RE W.CM, H.CM;
@BOX 2.1
SWITCH NO&7\ IGN,IGN,
IGN,CHARSIZE,CHARPATH,IGN,SETPEN,IGN;
@BOX 3.1
CHARSIZE:
@BOX 4.1
CHARSZ.WIDTH * 73.0 => W.CM;
CHARSZ.HEIGHT * 73.0 => H.CM;
IF A4 /=0  THEN
   0.75 *> H.CM
FI;
@BOX 5.1
4.0 * W.CM * RES.HORIZ * TX.COS / 3.0 => A11;
-4.0 * H.CM * RES.HORIZ * TX.SIN / 3.0 => A22;
4.0 * W.CM * RES.HORIZ * TX.SIN / 3.0 => A33;
4.0 * H.CM * RES.HORIZ * TX.COS / 3.0 => A44;
@BOX 6.1
OUTCH (%00);
CAPTION (%"SZ ");
OUT.I (A11, 0); SPACES (1);
OUT.I (A22, 0); SPACES (1);
OUT.I (A33, 0); SPACES (1);
OUT.I (A44, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 7.1
IGN:
END
@BOX 8.1
SETPEN:
@BOX 9.1
CAPTION (%"NP ");
OUT.I (PEN, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
@BOX 10.1
CHARPATH:
@BOX 11.1
IF A4 /=0 AND LANSP =0 THEN
   IF C.CHAR.PATH =0  THEN
      3 => C.CHAR.PATH;
   ELSE
     1-> C.CHAR.PATH;
   FI;
FI
ALTERNATIVE C.CHAR.PATH FROM
   BEGIN
   0.0 => TX.SIN;
   1.0 => TX.COS;
   END
   BEGIN
   0.0 => TX.COS;
   1.0 => TX.SIN;
   END
   BEGIN
   -1.0 => TX.COS;
   0.0 => TX.SIN;
   END
   BEGIN
   0.0 => TX.COS;
   -1.0 => TX.SIN
   END
END
@END
@TITLE GRA12.8(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
BENSON.REPORT (RVEC, IVEC)
@BOX 2.0
REPORT INTEGER DEVICE CAPABILITIES
@BOX 3.0
REPORT REAL DEVICE CAPABILITIES
@BOX 4.0
END
@BOX 1.1
PROC BENSON.REPORT (RVEC, IVEC);
@BOX 2.1
0 => IVEC ^[0] => IVEC ^ [1]; ::::NOT USED;
3 => IVEC ^[2];   0 => IVEC ^[3];   1 => IVEC ^[4];
0 => IVEC ^[5];   1 => IVEC ^[6];   1 => IVEC ^[7];
0 => IVEC ^[8];   1 => IVEC ^[9];  10 => IVEC ^[10];
0 => IVEC ^[11];  1 => IVEC ^[12];  0 => IVEC ^[13];
4 => IVEC ^[14];  2 => IVEC ^[15];  2 => IVEC ^[16];
1 => IVEC ^[17];  0 => IVEC ^[18];  0 => IVEC ^[19];
0 => IVEC ^[20];  0 => IVEC ^[21];  1 => IVEC ^[22];
0 => IVEC ^[23];  0 => IVEC ^[24];  0 => IVEC ^[25];
2 => IVEC ^[26];  1 => IVEC ^[27];  8 => IVEC ^[28];
0 => IVEC ^[29];  1 => IVEC ^[30];  0 => IVEC ^[31];
0 => IVEC ^[32];  1 => IVEC ^[33];  0 => IVEC ^[34];
@BOX 3.1
200.0 => RVEC ^[0];  200.0 => RVEC ^[1];
14600.0 => RVEC ^[2];  14600.0 => RVEC ^[3];
0.0 =>  RVEC ^[4];  0.0 =>  RVEC ^[5];
73.0 => RVEC ^[6];  73.0 => RVEC ^[7];
0.0 =>  RVEC ^[8];  0.0 =>  RVEC ^[9];
0.0 =>  RVEC ^[10]; 0.0 =>  RVEC ^[11];
0.0 =>  RVEC ^[12]; 0.0 =>  RVEC ^[13];
@BOX 4.1
END
@END

@TITLE GRA12.9(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
BENSON MOVE (X, Y)
@BOX 2.0
COMPUTE MOVE INCREMENT
@BOX 3.0
ISSUE INSTRUCTIONS TO MOVE PEN
@BOX 4.0
@BOX 4.0
RESET PEN POSITION
@BOX 5.0
END
@BOX 1.1
PROC BENSON.MOVE (X, Y);
$IN X.INC, Y.INC;
$RE RX, RY;
@BOX 2.1
X*NDC.SCALE - PLT.X => X.INC;
Y* NDC.SCALE - PLT.Y => Y.INC;
X.INC =>RX; Y.INC => RY;
@BOX 3.1
IF X.INC/=0 OR Y.INC/=0 THEN
OUTCH (%00);
CAPTION (%"PL ");
OUT.I (X.INC, 0); SPACES (1);
OUT.I (Y.INC, 0); SPACES (1);
OUT.I (PEN.UP, 0); SPACES (1);
OUT.CH (CR); OUT.CH (LF);
FI;
@BOX 4.1
RX +> PLT.X; RY +> PLT.Y;
@BOX 5.1
END
@END

