@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            GRA111
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                              ISSUE 11~
~V9 -1
~P
~V9 1
~YGRA111
~S~M~OGRAPHICS UTILITIES IMPLEMENTATION DESCRIPTION
~S~M~OSection 11 Version 1
~S~OSection 11.1 Graphics Genisco Device Driver
~S1~O1. General Description
~BThis module is the graphics device driver for a Genisco
display terminal.  It consists of a set of procedures for
controlling line drawing and text output on a Genisco.
~S1~O2. Interface
~
Procedures~
   GEN.INIT~
   GEN.TERM~
   GEN.NEW.FRAME~
   GEN.LINE~
   GEN.TEXT~
   GEN.MARKER~
   GEN.ATTR~
   GEN.REPORT~
~
Data Structures~
~S1~O2.1 Hardware Specification
~BThe Genisco raster scan display is a micro
processor-based device that requires a DMA
channel to be set up for the transfer of
control commands for producing graphical output.
~S1~O2.2 Software Interface
~BThis consists of the following procedures.~
~T% 30
~
~
1) GEN.INIT ()~IInitialises the Genisco.~
~
2) GEN.TERM ()~IResets the Genisco.~
~
3) GEN.NEW.FRAME ()~ISets up the Genisco ready to display a diagram.~
~
4) GEN.LINE (X1, Y1, X2, Y2)~IDraws a line from X1, Y1 to X2, Y2 in the
format preselected by the Graphics library.~
~
5) GEN.TEXT (X, Y, STRING,~
             LENGTH)~IGenerates a text string
at X, Y with a preselected format and rotation.~
~
6) GEN.MARKER (X, Y, SYMBOL)~IGenerates the specified symbol ay X, Y.~
~
7) GEN.ATTR (NO., VALUE)~ISets the attribute specified bu NO. to the
specified value.  The only attribute catered for by this Genisco device
driver is colour setting.~
~
8) GEN.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 drive the Genisco via a set
of library commands described in Chapter 25 of the User Manual.  Those
used are START.GR.OPERATION, STOP.GR.OPERATION and GR.WRITE.
~S1~O3.2 Data Structures
~
~
GENISCO~Ia descriptor specifying a buffer area for controlling the
Genisco through the library commands mentioned above.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               GRA111
~V9 -1
~F
@TITLE GRA11(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
GENISCO DRIVER PROCEDURES
@BOX 2.0
DECLARATIONS
@BOX 3.0
@BOX 4.0
PROCEDURES IN SUBSECTION:
   GEN INIT
   GEN TERM
   GEN NEW FRAME
   GEN LINE
   GEN TEXT
   GEN MARKER
   GEN ATTRIBUTE
   FLUSH BUFFER
@BOX 5.0
@BOX 6.0
*END
@BOX 1.1
$AD PW0,PW1,PW2,PW3,PW4,PW5,PW6;
$IN32 PTR,BLOCK.NO,OLD.SEG.NO,OLD.OUTPUT.STREAM,C.COLOUR;
$IN32 C.LINE.INDEX,C.LINE.STYLE,C.TEXT.INDEX,C.CHARPATH;
$RE NDC.HEIGHT,NDC.SCALE;
$IM$LI SYS14.SEG.SIZE,GR.MAPPED.SEG;
MODULE(GEN.INIT,GEN.TERM,GEN.NEW.FRAME,GEN.LINE,
   GEN.TEXT,GEN.MARKER,GEN.ATTR,GEN.REPORT);
@BOX 2.1
*GLOBAL 7;
$IN GENISCO.VA,GEN.SEG.NO, COLOUR;
$AD[$IN16] GENISCO;
$LI/$LO16 SEL=%0001,LIX=%2800,VTS=%8000,
          LZM=%5800,PWT=%D000,TCW=%6800,LIY=%3000,
          VCC=%0000,LEX=%3800,WTC=%7000,PMS=%0800,
          LEY=%4000,SMS=%1000,LBC=%6000,SPL=%A000;
$LI/$LO8 DASHED=2;
*GLOBAL 0;
@BOX 3.1
@BOX 4.1
PSPEC GEN.INIT();
PSPEC GEN.TERM();
PSPEC GEN.NEW.FRAME();
PSPEC GEN.LINE($RE,$RE,$RE,$RE);
PSPEC GEN.TEXT($RE,$RE,ADDR[$LO8],$IN);
PSPEC GEN.MARKER($RE,$RE,$LO8);
PSPEC GEN.ATTR($IN);
PSPEC GEN.REPORT(ADDR[$RE],ADDR[$IN32]);
PSPEC FLUSH.BUFFER($IN);
@BOX 5.1
   #GRA11.1
   #GRA11.2
   #GRA11.3
   #GRA11.4
   #GRA11.5
   #GRA11.6
   #GRA11.7
   #GRA11.8
   #GRA11.9
@BOX 6.1
*END
@END
@TITLE GRA11.1(1,10)
@COL 7R
@COL 1S-2T-3R-4T-5R-6F
@ROW 7-5
@FLOW 1-2NO-7-6
@FLOW 2OK-3-4NO-7-6
@FLOW 4OK-5-6
@BOX 1.0
GENISCO INIT ()
@BOX 2.0
CREATE SEGMENT FOR GENISCO CODE
SUCCESSFUL ?
@BOX 3.0
MAP CODE SEGMENT
@BOX 4.0
REQUEST DMA CHANNEL
SUCCESSFUL ?
@BOX 5.0
INITIALISE GENISCO
@BOX 6.0
END
@BOX 7.0
FAULT
@BOX 1.1
PROC GEN.INIT;
@BOX 2.1
CREATE.SEGMENT (-1, SYS14.SEG.SIZE);
IF PW0 /= 0
@BOX 3.1
0 => BLOCK.NO;
-1 => PTR;
PW1 => GEN.SEG.NO;
CAPTION (%"CODE SEG NO - "); OUTI (GEN.SEG.NO,0);NEWLINES (1);::DEBUG
MAP (GEN.SEG.NO, GR.MAPPED.SEG, 0);
PW1 => OLD.SEG.NO;
MAKE ($IN16, SYS14.SEG.SIZE/2, PW6*SYS14.SEG.SIZE) => GENISCO;
SYS14.SEG.SIZE * GEN.SEG.NO => GENISCO.VA;
@BOX 4.1
START.GR.OPERATION (0);
IF PW0 /= 0
@BOX 5.1
C.LINE.INDEX=>COLOUR;
GEN.ATTR(7);
SEL  => GENISCO^ [1 +> PTR];
%0001  => GENISCO^ [1 +> PTR];
%00FF  => GENISCO^ [1 +> PTR];
TCW + 1  => GENISCO^ [1 +> PTR];
VCC + %00FF  => GENISCO^ [1 +> PTR];
SMS  => GENISCO^ [1 +> PTR];
LZM + 0  => GENISCO^ [1 +> PTR];
IF NDC.HEIGHT < 1.0 THEN
   640.0 => NDC.SCALE
ELSE
   512.0 => NDC.SCALE;
FI;
@BOX 6.1
END
@BOX 7.1
::FAULT (19, 8);
@END
@TITLE GRA11.2(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
GENISCO TERM ()
@BOX 2.0
FLUSH CODE BUFFER
[GRA11.8]
@BOX 3.0
TERMINATE DMA CHANNEL
@BOX 4.0
REMAP CODE SEGMENT
@BOX 5.0
END
@BOX 1.1
PROC GEN.TERM;
@BOX 2.1
FLUSH.BUFFER (512);
@BOX 3.1
STOP.GR.OPERATION (0);
@BOX 4.1
MAP (OLD.SEG.NO, GR.MAPPED.SEG, 0);
@BOX 5.1
END
@END
@TITLE GRA11.3(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GENISCO NEW FRAME ()
@BOX 2.0
FLUSH CODE BUFFER
[GRA11.8]
@BOX 3.0
ISSUE SCREEN CLEAR INSTRUCTIONS
@BOX 4.0
END
@BOX 1.1
PROC GEN.NEW.FRAME;
@BOX 2.1
FLUSH.BUFFER (5);
@BOX 3.1
SEL  => GENISCO^ [1 +> PTR];
0  => GENISCO^ [1 +> PTR];
255  => GENISCO^ [1 +> PTR];
PMS + 3  => GENISCO^ [1 +> PTR];
SPL  => GENISCO^ [1 +> PTR];
FLUSH.BUFFER (512);
@BOX 4.1
END
@END
@TITLE GRA11.4(1,10)
@COL 1S-2R-3R-4R-5R-6R-7F
@FLOW 1-2-3-4-5-6-7
@BOX 1.0
GENISCO LINE (X.MIN, Y.MIN, X.MAX, Y.MAX)
@BOX 2.0
FLUSH CODE BUFFER
@BOX 3.0
ISSUE INSTRUCTIONS TO SET CURRENT
LINE COLOUR AND LINESTYLE
@BOX 4.0
MAP NDC TO DEVICE COORDS
@BOX 5.0
ISSUE LINE DRAWING INSTRUCTIONS
@BOX 6.0
FLUSH BUFFER
[GRA11.8]
@BOX 7.0
END
@BOX 1.1
PROC GEN.LINE (X.MIN, Y.MIN, X.MAX, Y.MAX);
$IN X0, Y0, X1, Y1;
@BOX 2.1
FLUSH.BUFFER (10);
@BOX 3.1
C.LINE.INDEX => COLOUR;
GEN.ATTR(7);
PMS + 6 => GENISCO^ [1 +> PTR];
IF C.LINESTYLE = DASHED THEN
   SMS + 4 => GENISCO^ [1 +> PTR]
ELSE
   SMS + 0 => GENISCO^ [1 +> PTR]
FI;
@BOX 4.1
X.MIN * NDC.SCALE => X0;
512.0 - (Y.MIN * NDC.SCALE) => Y0;
X.MAX * NDC.SCALE => X1;
512.0 - (Y.MAX * NDC.SCALE) => Y1;
@BOX 5.1
NEWLINES (1);
CAPTION (%"GEN LINE X0 Y0 X1 Y1");NEWLINES (1);
OUTI(X0,0); SPACES (1);
OUTI (Y0,0); SPACES (1);
OUTI (X1,0); SPACES (1);
OUTI (Y1,0);SPACES (1);NEWLINES (1);
LIX + X0  => GENISCO^ [1 +> PTR];
LIY + Y0  => GENISCO^ [1 +> PTR];
LEX + X1  => GENISCO^ [1 +> PTR];
LEY + Y1  => GENISCO^ [1 +> PTR];
@BOX 6.1
FLUSH.BUFFER (512);
@BOX 7.1
END
@END
@TITLE GRA11.5(1,10)
@COL 1S-2R-3R-4R-7R-5R-6F
@FLOW 1-2-3-4-7-5-6
@BOX 1.0
GENISCO TEXT (X, Y, STRING, LENGTH)
@BOX 2.0
ISSUE INSTRUCTIONS TO SET TEXT COLOUR
AND FLUSH BUFFER [GRA11.8]
@BOX 3.0
MAP NDC TO DEVICE COORDS
@BOX 4.0
ISSUE TEXT DRAWING INSTRUCTIONS
@BOX 5.0
PLANT STRING IN CODE BUFFER AND FLUSH
[GRA11.8]
@BOX 6.0
END
@BOX 7.0
SET ROTATION CODE
@BOX 1.1
PROC GEN.TEXT (X, Y, STRING, LENGTH);
$LO16 CHAR.WORD;
$IN MSB, I, X0, Y0;
$LO8 ROTATION;
@BOX 2.1
C.TEXT.INDEX=>COLOUR;
GEN.ATTR(7);
FLUSH.BUFFER (8 + LENGTH);
@BOX 3.1
X * NDC.SCALE => X0;
512.0 - (Y * NDC.SCALE) => Y0;
CAPTION (%"GEN TEXT X0 Y0");NEWLINES (1);
OUTI (X0,0);SPACES (1);
OUTI (Y0 - 12,0); SPACES (1);
CAPTION (STRING);NEWLINES (1);
@BOX 4.1
PMS + 2  => GENISCO^ [1 +> PTR];
SMS + 128  => GENISCO^ [1 +> PTR];
LIX + X0  => GENISCO^ [1 +> PTR];
LIY - 12 + Y0  => GENISCO^ [1 +> PTR];
LBC + LENGTH  => GENISCO^ [1 +> PTR];
@BOX 5.1
FOR I < LENGTH DO
   IF MSB = 1 THEN
      STRING^ [I] <<- 8 => CHAR.WORD;
      0 => MSB;
   ELSE
      STRING^ [I] !> CHAR.WORD;
      CHAR.WORD => GENISCO^ [1 +> PTR];
    CAPTION (%"2 : "); OUT.I(CHAR.WORD,0);NEWLINES (1);
      0 => CHAR.WORD; 1 => MSB;
   FI
OD
IF MSB = 0 THEN
   CHAR.WORD  => GENISCO^ [1 +> PTR];
CAPTION (%"3 : "); OUTI(CHARWORD,0); NEWLINES (1);
FI;
FLUSH.BUFFER (512);
@BOX 6.1
END
@BOX 7.1
ALTERNATIVE C.CHARPATH FROM
   %80 => ROTATION;
   %83 => ROTATION;
   %82 => ROTATION;
   %81 => ROTATION;
END
0 => CHAR.WORD;
::ROTATION <<- 8 => CHAR.WORD;
::CAPTION (%"1 : "); OUTI (CHAR.WORD, 0);NEWLINES (1);
1 => MSB;
@END

@TITLE GRA11.6(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
GENISCO MARKER (X, Y, SYMBOL);
@BOX 2.0
SET MARKER COLOUR
[GRA11.7]
@BOX 3.0
MAP NDC TO DEVICE COORDS
@BOX 4.0
ISSUE INSTRUCTIONS TO DRAW MARKER
@BOX 5.0
PLANT MARKER IN BUFFER
@BOX 6.0
END
@BOX 1.1
PROC GEN.MARKER (X, Y, SYMBOL);
$LO16 CHAR.WORD;
$IN X0, Y0;
@BOX 2.1
C.LINE.INDEX => COLOUR;
GEN.ATTR(7);
@BOX 3.1
X * NDC.SCALE => X0;
512.0 - (Y * NDC.SCALE) => Y0;
@BOX 4.1
PMS + 2  => GENISCO^ [1 +> PTR];
SMS + 128  => GENISCO^ [1 +> PTR];
LIX + X0  => GENISCO^ [1 +> PTR];
LIY + Y0  => GENISCO^ [1 +> PTR];
LBC + 1  => GENISCO^ [1 +> PTR];
@BOX 5.1
0 => CHAR.WORD;
SYMBOL => CHAR.WORD;
CHAR.WORD <<- 8  => GENISCO^ [1 +> PTR];
FLUSH.BUFFER (512);
@BOX 6.1
END
@END
@TITLE GRA11.7(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GENISC0 ATTRIBUTE(ATTRIBUTE.NUMBER)
@BOX 2.0
COMPUTE COLOUR BITS
@BOX 3.0
ISSUE PLANE SELECT INSTRUCTION
@BOX 4.0
END
@BOX 1.1
PROC GEN.ATTR(NO);
$IN PLANE;
@BOX 2.1
1 => PLANE;
FOR COLOUR DO 2 *> PLANE OD;
@BOX 3.1
SEL  => GENISCO^ [1 +> PTR];
PLANE  => GENISCO^ [1 +> PTR];
%00FF  => GENISCO^ [1 +> PTR];
@BOX 4.1
END
@END
@TITLE GRA11.8(1,10)
@COL 1S-2T-3T-4R-5R-6T-7R-8F
@COL 9R-10R
@ROW 4-9
@ROW 7-10
@FLOW 1-2NO-8
@FLOW 2FLUSH-3FIRST-9-5
@FLOW 3NO-4-5-6MAX-10-8
@FLOW 6OK-7-8
@BOX 1.0
FLUSH BUFFER (EXTRA CODE)
@BOX 2.0
NEED TO FLUSH BUFFER ?
@BOX 3.0
FIRST CODE BLOCK ?
@BOX 4.0
SEND CODE TO GENISCO WITHOUT RESTARTING PGP
@BOX 5.0
UPDATE BLOCK COUNT AND CODE POINTER
@BOX 6.0
MAXIMUM BLOCKS REACHED ?
@BOX 7.0
MARK SUCCESS IN PW0
@BOX 8.0
END
@BOX 9.0
SEND CODE TO GENISCO AND RESTART PGP
@BOX 10.0
MARK FAILURE IN PW0
@BOX 1.1
PROC FLUSH.BUFFER (EXTRA.CODE);
$LI / $IN MAX.BLOCK.BYTE.SIZE = 512,
         PGP.RESTART = %36, NO.PGP.RESTART = -1,
         MAX.BLOCKS = 999;
@BOX 2.1
IF PTR*2 + EXTRA.CODE < MAX.BLOCK.BYTE.SIZE
@BOX 3.1
IF BLOCK.NO = 0
@BOX 4.1
GR.WRITE (0, GENISCO.VA, PTR + 1 * 2, NO.PGP.RESTART);
@BOX 5.1
1 +> BLOCK.NO;
-1 => PTR;
@BOX 6.1
IF BLOCK.NO = MAX.BLOCKS
@BOX 7.1
0 => PW0;
@BOX 8.1
END
@BOX 9.1
GR.WRITE (0, GENISCO.VA, PTR + 1 * 2, PGP.RESTART);
@BOX 10.1
1 => PW0;
@END
@TITLE GRA11.9(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GEN REPORT (RVEC, IVEC)
@BOX 2.0
REPORT INTEGER DEVICE CAPABILITY
@BOX 3.0
REPORT REAL DEVICE CAPABILITY
@BOX 4.0
END
@BOX 1.1
PROC GEN.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
20.0 => RVEC ^[0];  20.0 => RVEC ^[1];
33.6 => RVEC ^[2];  26.9 => RVEC ^[3];
0.0 =>  RVEC ^[4];  0.0 =>  RVEC ^[5];
33.6 => RVEC ^[6];  26.9 => 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

