@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            GRA131
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                              ISSUE 11~
~V9 -1
~P
~V9 1
~YGRA131
~S~M~OGRAPHICS UTILITIES IMPLEMENTATION DESCRIPTION
~S~M~OSection 13 Version 1
~S~OSection 13.1 Graphics MC68000 Raster Scan Display Device Driver
~S1~O1. General Description
~BThis module is the graphics device driver for an MC68000 raster scan
display terminal.  It consists of a set of procedures for
controlling line drawing and text output on a Motorola display.~
~S1~O2. Interface
~
Procedures~
   M68.INIT~
   M68.TERM~
   M68.NEW.FRAME~
   M68.LINE~
   M68.TEXT~
   M68.MARKER~
   M68.ATTR~
   M68.REPORT~
~
Data Structures~
~S1~O2.1 Hardware Specification
~BThe Motorola raster scan display is a memory
mapped device. Two pixels are packed per byte
in the memory map.~
~S1~O2.2 Software Interface
~BThis consists of the following procedures.~
~T% 30
~
~
1) M68.INIT ()~IInitialises the display.~
~
2) M68.TERM ()~IResets the display.~
~
3) M68.NEW.FRAME ()~ISets up the display ready to draw a diagram.~
~
4) M68.LINE (X1, Y1, X2, Y2)~IDraws a line from X1, Y1 to X2, Y2 in the
format preselected by the Graphics library.~
~
5) M68.TEXT (X, Y, STRING,~
             LENGTH)~IGenerates a text string
at X, Y with a preselected format and rotation.~
~
6) M68.MARKER (X, Y, SYMBOL)~IGenerates the specified symbol ay X, Y.~
~
7) M68.ATTR (NO.)~ISets the attribute specified by NO.~
~
8) M68.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 Implementation
~S1~O3.1 Outline of Operation
~S1~O3.2 Data Structures
~
None~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               GRA131
~V9 -1
~F
@TITLE GRA13(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
MOTOROLA DRIVER PROCEDURES
@BOX 2.0
DECLARATIONS
@BOX 3.0
@BOX 4.0
PROCEDURES IN SUBSECTION:
   M68 INIT
   M68 TERM
   M68 NEW FRAME
   M68 LINE
   M68 TEXT
   M68 MARKER
   M68 ATTRIBUTE
   M68 REPORT
   OUT CHAR
   SET PIXEL
@BOX 5.0
@BOX 6.0
END
@BOX 1.1
$IN32 C.LINE.INDEX,C.LINE.STYLE,C.COLOUR,C.TEXT.INDEX;
$RE NDC.HEIGHT,NDC.SCALE;
MODULE(M68.INIT,M68.TERM,M68.NEW.FRAME,M68.LINE,
   M68.TEXT,M68.MARKER,M68.ATTR,M68.REPORT);
@BOX 2.1
$LI/$LO8 DASHED=2;
*GLOBAL 7;
$IN COLOUR;
$LO8[3] COLS;
*GLOBAL 8;
$LO8[%4000] SCR.TOP,DUMMY,SCR.BOT,DUMMY0;
*GLOBAL 0;
@BOX 3.1
@BOX 4.1
$PS M68.INIT();$PS M68.TERM();
$PS M68.NEW.FRAME();
$PS M68.LINE($RE,$RE,$RE,$RE);
$PS M68.TEXT($RE,$RE,$AD[$LO8],$IN);
$PS M68.MARKER($RE,$RE,$LO8);
$PS M68.ATTR($IN);
$PS M68.REPORT($AD[$RE],$AD[$IN32]);
$PS SET.PIXEL($IN32);
$PS OUT.CHAR($LO8,$IN32);
@BOX 5.1
   #GRA13.1
   #GRA13.2
   #GRA13.3
   #GRA13.4
   #GRA13.5
   #GRA13.6
   #GRA13.7
   #GRA13.8
   #GRA13.9
   #GRA13.10
@BOX 6.1
*END
@END
@TITLE GRA13.1(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
M68 INIT ()
@BOX 2.0
INITILISATION
@BOX 3.0
REPORT DEVICE CAPABILITIES TO CORE
@BOX 4.0
END
@BOX 1.1
PROC M68.INIT ;
@BOX 2.1
C.LINE.INDEX=>C.COLOUR;
M68.ATTR(7)
@BOX 3.1
   #GRA13.1.1(1,10)
@BOX 4.1
END
@END
@TITLE GRA13.1.1(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
REPORT DEVICE CAPABILITIES TO CORE
@BOX 2.0
SET UP CORE VARIABLES
@BOX 3.0
END
@BOX 1.1
BEGIN
@BOX 2.1
IF NDC.HEIGHT < 1.0 THEN
  IF NDC.HEIGHT=< 0.733 THEN
   360.0 => NDC.SCALE
  ELSE
    264.0/NDC.HEIGHT =>NDC.SCALE
  FI    ::19/7,83
ELSE
264.0 => NDC.SCALE;
FI;
@BOX 3.1
END
@END
@TITLE GRA13.2(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
M68 TERM ()
@BOX 2.0
TERMINATE MOTOROLA MC68000
@BOX 3.0
END
@BOX 1.1
PROC M68.TERM;
@BOX 2.1
::NO ACTION REQUIRED FOR THIS DEVICE
@BOX 3.1
END
@END
@TITLE GRA13.3(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
M68 NEW FRAME ()
@BOX 2.0
CLEAR MOTOROLA SCREEN
@BOX 3.0
END
@BOX 1.1
PROC M68.NEW.FRAME;
$IN I;
@BOX 2.1
FOR I < %7FFF DO 0 => SCR.TOP [I] OD;
FOR I < %7FFF DO 0 => SCR.BOT [I] OD;
@BOX 3.1
#GRA13.1.1(1,10)
END
@END
@TITLE GRA13.4(1,10)
@COL 1S-4R-2R-3R-5R-7F
@FLOW 1-4-2-3-5-7
@BOX 1.0
M68 LINE (X.MIN, Y.MIN, X.MAX, Y.MAX)
@BOX 2.0
COMPUTE X AND Y INCREMENTS
@BOX 3.0
DETERMINE SIGNS OF DX AND DY
@BOX 4.0
COVERT NDC TO DEVICE COORDS
@BOX 5.0
SET APPROPRIATE PIXELS ON LINE PATH
ACCORDING TO SIMPLE DDA ALGORITHM
@BOX 7.0
END
@BOX 1.1
PROC M68.LINE (X.MIN, Y.MIN, X.MAX, Y.MAX);
$IN I, DX, DY, SDX, SDY, SX, SY, ERROR, STEP, LENGTH;
$IN32 POINT; $IN COUNT, LIMIT;
$IN X1, Y1, X2, Y2;
@BOX 2.1
IF C.LINESTYLE = DASHED THEN
   5 => LIMIT;
ELSE
   %7FFF => LIMIT;
FI;
0 => COUNT;
X2 - X1 => DX; Y2 - Y1 => DY;
@BOX 3.1
IF DX < 0 THEN 0 - DX => DX; -1 => SDX;
ELSE IF DX = 0 THEN 0 => SDX
     ELSE 1 => SDX;
     FI
FI;
IF DY < 0 THEN 0 - DY => DY; -1 => SDY;
ELSE IF DY = 0 THEN 0 => SDY;
     ELSE 1 => SDY;
     FI
FI;
@BOX 4.1
X.MIN * NDC.SCALE => X1;
NDC.HEIGHT - Y.MIN * NDC.SCALE => Y1;
X.MAX * NDC.SCALE => X2;
NDC.HEIGHT - Y.MAX * NDC.SCALE => Y2;
C.LINE.INDEX=>C.COLOUR;
M68.ATTR(7);
Y1 * 360 + X1 => POINT;
@BOX 5.1
IF DX > DY THEN
   DX => LENGTH; DX ->> 2 => ERROR; DY => STEP;
   SDX => SX; 0 => SY;
ELSE
   DY => LENGTH; DY ->> 2 => ERROR; DX => STEP;
   SDY => SY; 0 => SX;
FI;
SET.PIXEL (POINT);
FOR I < LENGTH DO
   1 +> COUNT;
   ERROR - STEP => ERROR;
   IF ERROR < 0 THEN
  IF SDY=1 THEN
     360+>POINT
  FI;
  IF SDY= -1  THEN
    360 ->POINT
  FI;    ::29/7,83
     SDX +>POINT;
      LENGTH +> ERROR
   ELSE
  IF SY =1  THEN
    360 +>POINT
  FI;
  IF SY = -1  THEN
    360 ->POINT
  FI;
   SX +>POINT;  :: 29/7,83
   FI
IF COUNT > LIMIT THEN
   0 => COUNT;
ELSE
SET.PIXEL (POINT);
FI;
OD
@BOX 7.1
END
@END
@TITLE GRA13.5(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
M68 TEXT (X, Y, STRING, LENGTH)
@BOX 2.0
SET TEXT COLOUR
@BOX 3.0
CONVERT NDC TO DEVICE COORDS
@BOX 4.0
DRAW EACH CHARACTER IN STRING
@BOX 5.0
END
@BOX 1.1
PROC M68.TEXT (X, Y, STRING, LENGTH);
$IN I;
$IN X0,Y0;
$IN32 PIX.ADDR;
@BOX 2.1
C.TEXT.INDEX=>C.COLOUR;
M68.ATTR(7);
@BOX 3.1
X * NDC.SCALE => X0;
NDC.HEIGHT - Y * NDC.SCALE => Y0;
Y0 * 360 + X0 => PIX.ADDR;
@BOX 4.1
FOR I < LENGTH DO
   OUT.CHAR (STRING^ [I], PIX.ADDR);
   6 +> PIX.ADDR
OD;
@BOX 5.1
END
@END
@TITLE GRA13.6(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
M68 MARKER (X, Y, SYMBOL)
@BOX 2.0
SET COLOUR
@BOX 3.0
CONVERT FROM NDC TO DEVICE COORDS
@BOX 4.0
DRAW MARKER
@BOX 5.0
END
@BOX 1.1
PROC M68.MARKER (X, Y, SYMBOL);
$IN32 PIX.ADDR;
@BOX 2.1
C.LINE.INDEX=>C.COLOUR;
M68.ATTR(7);
@BOX 3.1
X * NDC.SCALE => X;
NDC.HEIGHT - Y * NDC.SCALE => Y;
Y * 360 + X => PIX.ADDR;
@BOX 4.1
OUT.CHAR (SYMBOL, PIX.ADDR);
@BOX 5.1
END
@END
@TITLE GRA13.7(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
M68 ATTRIBUTE(ATTRIBUTE NUMBER)
@BOX 2.0
SET CURRENT COLOUR
@BOX 3.0
END
@BOX 1.1
PROC M68.ATTR(NO);
@BOX 2.1
C.COLOUR => COLS [1] <<- 4 => COLS [0];
COLS [0] ! COLS [1] => COLS [2];
@BOX 3.1
END
@END
@TITLE GRA13.8(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
M68 REPORT(REAL ARRAY,INTEGER ARRAY)
@BOX 2.0
WRITE CAPABILITIES TO ARRAYS
@BOX 3.0
END
@BOX 1.1
PROC M68.REPORT(RVEC,IVEC);
@BOX 2.1
1 =>IVEC^ [12];  ::VSTYPE--NONBUFFERED, 29/7,83
360.0 =>RVEC ^[2]; 264.0=> RVEC^ [3];  ::11/8,83
@BOX 3.1
END
@END
@TITLE GRA13.9(1,10)
@COL 1S-2R-4R-5R-6R-7F
@FLOW 1-2-4-5-6-7
@BOX 1.0
OUTPUT CHAR (CHAR CODE, POSITION)
@BOX 2.0
GET 8-BIT CURRENT COLOUR VALUE
@BOX 4.0
COMPUTE INDEX FORM CHAR.CODE INTO CHAR PIXEL ARRAY DATAVEC
@BOX 5.0
DRAW THE CHARACTER (6 ROWS * 3 COLUMNS)
@BOX 6.0
@BOX 7.0
RETURN
@BOX 1.1
PROC OUT.CHAR (CH.CODE, PIX.ADDR);
$LO8 COLOR; $IN CH.INDEX, BYTE.ADDR;
DATAVEC CH.PIX ($LO8)
   #GRA13.9.1
   #GRA13.9.2
   #GRA13.9.3
END;
@BOX 2.1
COLS [2] => COLOR;
@BOX 4.1
PIX.ADDR ->> 1 => PIX.ADDR;
CH.CODE - %20 * 18 => CH.INDEX;
@BOX 5.1
FOR 6 DO
   FOR 3 DO
      IF PIX.ADDR > %7FFF THEN PIX.ADDR - %8000 => BYTE.ADDR;
      CH.PIX [CH.INDEX] & COLOR => SCR.BOT [BYTE.ADDR]
      ELSE
      PIX.ADDR => BYTE.ADDR;
      CH.PIX [CH.INDEX] & COLOR => SCR.TOP [BYTE.ADDR]
      FI;
      1 +> CH.INDEX;
      1 +> PIX.ADDR;
   OD;
   177 +> PIX.ADDR;
OD;
@BOX 6.1
@BOX 7.1
END;
@END
@TITLE GRA13.9.1(1,10)
@COL 1S
@BOX 1.0
CHARACTERS 'SPACE TO '?
@BOX 1.1
%00%00%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 ::SPACE
%00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 %00%00%00 %00%F0%00 ::!
%0F%0F%00 %0F%0F%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 ::"
%00%00%00 %0F%0F%00 %FF%FF%F0 %0F%0F%00 %FF%FF%F0 %0F%0F%00 ::#
%0F%FF%00 %F0%F0%F0 %0F%F0%00 %00%FF%00 %F0%F0%F0 %0F%FF%00 ::$
%FF%00%F0 %FF%0F%00 %00%F0%00 %0F%00%00 %0F%0F%F0 %F0%0F%F0 ::%
%0F%FF%F0 %F0%00%F0 %0F%FF%00 %F0%F0%00 %F0%0F%00 %0F%FF%F0 ::&
%00%F0%00 %00%F0%00 %00%F0%00 %00%00%00 %00%00%00 %00%00%00 ::'
%00%00%F0 %00%0F%00 %00%F0%00 %00%F0%00 %00%0F%00 %00%00%F0 ::(
%F0%00%00 %0F%00%00 %00%F0%00 %00%F0%00 %0F%00%00 %F0%00%00 ::)
%00%00%00 %F0%F0%F0 %0F%FF%00 %FF%FF%F0 %0F%FF%00 %F0%F0%F0 ::*
%00%00%00 %00%F0%00 %00%F0%00 %FF%FF%F0 %00%F0%00 %00%F0%00 ::+
%00%00%00 %00%00%00 %0F%FF%00 %0F%FF%00 %00%F0%00 %0F%00%00 ::,
%00%00%00 %00%00%00 %00%00%00 %FF%FF%F0 %00%00%00 %00%00%00 ::-
%00%00%00 %00%00%00 %00%00%00 %00%00%00 %00%FF%00 %00%FF%00 ::.
%00%00%00 %00%00%F0 %00%0F%00 %00%F0%00 %0F%00%00 %F0%00%00 ::/
%0F%FF%00 %F0%F0%F0 %F0%F0%F0 %F0%F0%F0 %F0%F0%F0 %0F%FF%00 ::0
%00%F0%00 %0F%F0%00 %F0%F0%00 %00%F0%00 %00%F0%00 %FF%FF%F0 ::1
%0F%FF%00 %F0%00%F0 %00%00%F0 %0F%FF%00 %F0%00%00 %FF%FF%F0 ::2
%0F%FF%00 %F0%00%F0 %00%FF%F0 %00%00%F0 %F0%00%F0 %0F%FF%00 ::3
%00%FF%00 %0F%0F%00 %F0%0F%00 %FF%FF%F0 %00%0F%00 %00%0F%00 ::4
%0F%FF%F0 %0F%00%00 %0F%FF%00 %00%00%F0 %F0%00%F0 %0F%FF%00 ::5
%0F%FF%F0 %F0%00%00 %F0%FF%00 %FF%00%F0 %F0%00%F0 %0F%FF%00 ::6
%FF%FF%F0 %00%00%F0 %00%0F%00 %00%F0%00 %0F%00%00 %F0%00%00 ::7
%FF%FF%F0 %F0%00%F0 %0F%FF%00 %F0%00%F0 %F0%00%F0 %0F%FF%00 ::8
%0F%FF%00 %F0%00%F0 %0F%FF%F0 %00%00%F0 %F0%00%F0 %0F%FF%00 ::9
%00%00%00 %00%00%00 %00%F0%00 %00%00%00 %00%F0%00 %00%00%00 :::
%00%00%00 %00%F0%00 %00%00%00 %00%F0%00 %00%F0%00 %0F%00%00 ::;
%00%00%00 %00%0F%00 %00%F0%00 %0F%00%00 %00%F0%00 %00%0F%00 ::<
%00%00%00 %00%00%00 %FF%FF%F0 %00%00%00 %FF%FF%F0 %00%00%00 ::=
%00%00%00 %0F%00%00 %00%F0%00 %00%0F%00 %00%F0%00 %0F%00%00 ::>
%0F%FF%00 %F0%00%F0 %00%0F%00 %00%F0%00 %00%00%00 %00%F0%00 ::?
@END
@TITLE GRA13.9.2(1,10)
@COL 1S
@BOX 1.0
CHARACTERS '@ TO '_
@BOX 1.1
%0F%FF%00 %F0%00%F0 %F0%0F%F0 %F0%F0%F0 %00%F0%F0 %00%FF%00 ::@
%0F%FF%00 %F0%00%F0 %FF%FF%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 ::A
%FF%FF%00 %F0%00%F0 %FF%FF%00 %F0%00%F0 %F0%00%F0 %FF%FF%00 ::B
%0F%FF%00 %F0%00%F0 %F0%00%00 %F0%00%00 %F0%00%F0 %0F%FF%00 ::C
%FF%FF%00 %F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 %FF%FF%00 ::D
%FF%FF%F0 %F0%00%00 %FF%FF%00 %F0%00%00 %F0%00%00 %FF%FF%F0 ::E
%FF%FF%F0 %F0%00%00 %FF%FF%00 %F0%00%00 %F0%00%00 %F0%00%00 ::F
%0F%FF%00 %F0%00%F0 %F0%00%00 %F0%FF%F0 %F0%00%F0 %0F%FF%00 ::G
%F0%00%F0 %F0%00%F0 %FF%FF%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 ::H
%FF%FF%F0 %00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 %FF%FF%F0 ::I
%FF%FF%F0 %00%0F%00 %00%0F%00 %00%0F%00 %F0%0F%00 %0F%F0%00 ::J
%F0%0F%00 %F0%F0%00 %FF%00%00 %F0%F0%00 %F0%0F%00 %F0%00%F0 ::K
%F0%00%00 %F0%00%00 %F0%00%00 %F0%00%00 %F0%00%00 %FF%FF%F0 ::L
%F0%00%F0 %FF%0F%F0 %F0%F0%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 ::M
%F0%00%F0 %FF%00%F0 %F0%F0%F0 %F0%0F%F0 %F0%00%F0 %F0%00%F0 ::N
%0F%FF%00 %F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 %0F%FF%00 ::O
%0F%FF%00 %F0%00%F0 %FF%FF%00 %F0%00%00 %F0%00%00 %F0%00%00 ::P
%0F%F0%00 %F0%0F%00 %F0%0F%00 %F0%FF%00 %F0%0F%00 %0F%F0%F0 ::Q
%0F%FF%00 %F0%00%F0 %FF%FF%F0 %F0%0F%00 %F0%00%F0 %F0%00%F0 ::R
%0F%FF%F0 %F0%00%00 %0F%FF%00 %00%00%F0 %F0%00%F0 %0F%FF%00 ::S
%FF%FF%F0 %00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 ::T
%F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 %0F%FF%00 ::U
%F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%00%F0 %0F%0F%00 %00%F0%00 ::V
%F0%00%F0 %F0%00%F0 %F0%00%F0 %F0%F0%F0 %F0%F0%F0 %0F%0F%00 ::W
%F0%00%F0 %0F%0F%00 %00%F0%00 %00%F0%00 %0F%0F%00 %F0%00%F0 ::X
%F0%00%F0 %F0%00%F0 %0F%0F%00 %00%F0%00 %00%F0%00 %00%F0%00 ::Y
%FF%FF%F0 %00%00%F0 %00%0F%00 %00%F0%00 %0F%00%00 %FF%FF%F0 ::Z
%0F%FF%00 %0F%00%00 %0F%00%00 %0F%00%00 %0F%00%00 %0F%FF%00 ::[
%00%00%00 %F0%00%00 %0F%00%00 %00%F0%00 %00%0F%00 %00%00%F0 ::\
%0F%FF%00 %00%0F%00 %00%0F%00 %00%0F%00 %00%0F%00 %0F%FF%00 ::]
%00%F0%00 %0F%0F%00 %F0%00%F0 %00%F0%00 %00%F0%00 %00%F0%00 ::^
%00%00%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 %FF%FF%F0 ::_
@END
@TITLE GRA13.9.3(1,10)
@COL 1S
@BOX 1.0
CHARACTERS ' TO ~
@BOX 1.1
%0F%00%00 %00%F0%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 ::`
%00%00%00 %0F%FF%00 %F0%00%F0 %0F%F0%F0 %F0%0F%F0 %0F%F0%F0 ::a
%F0%00%00 %F0%00%00 %FF%FF%00 %F0%00%F0 %F0%00%F0 %FF%FF%00 ::b
%00%00%00 %00%00%00 %0F%FF%F0 %F0%00%00 %F0%00%00 %0F%FF%F0 ::c
%00%00%F0 %00%00%F0 %0F%FF%F0 %F0%00%F0 %F0%00%F0 %0F%FF%F0 ::d
%00%00%00 %0F%FF%F0 %F0%00%00 %FF%FF%F0 %F0%00%00 %0F%FF%F0 ::e
%00%00%00 %0F%FF%F0 %F0%00%00 %FF%FF%00 %F0%00%00 %F0%00%00 ::f
%00%00%00 %0F%FF%00 %F0%00%F0 %0F%FF%F0 %00%00%F0 %0F%FF%00 ::g
%00%00%00 %F0%00%00 %F0%00%00 %FF%FF%00 %F0%0F%00 %F0%0F%00 ::h
%00%00%00 %00%F0%00 %00%00%00 %00%F0%00 %00%F0%00 %00%F0%00 ::i
%00%00%00 %00%0F%00 %00%0F%00 %00%0F%00 %00%0F%00 %00%FF%00 ::j
%F0%00%00 %F0%00%00 %F0%F0%00 %FF%00%00 %F0%F0%00 %F0%0F%00 ::k
%00%00%00 %00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 %00%F0%00 ::l
%00%00%00 %00%00%00 %0F%0F%00 %F0%F0%F0 %F0%F0%F0 %F0%00%F0 ::m
%00%00%00 %00%00%00 %FF%FF%00 %F0%00%F0 %F0%00%F0 %F0%00%F0 ::n
%00%00%00 %00%00%00 %0F%FF%00 %F0%00%F0 %F0%00%F0 %0F%FF%00 ::o
%00%00%00 %0F%FF%00 %F0%00%F0 %FF%FF%00 %F0%00%00 %F0%00%00 ::p
%00%00%00 %0F%FF%00 %F0%00%F0 %0F%FF%F0 %00%00%F0 %00%00%F0 ::q
%00%00%00 %00%FF%F0 %0F%00%00 %0F%00%00 %0F%00%00 %0F%00%00 ::r
%00%00%00 %00%FF%F0 %0F%00%00 %00%F0%00 %00%0F%00 %FF%F0%00 ::s
%00%00%00 %0F%00%00 %0F%F0%00 %0F%00%00 %0F%00%00 %00%FF%00 ::t
%00%00%00 %00%00%00 %F0%0F%00 %F0%0F%00 %F0%0F%00 %0F%F0%F0 ::u
%00%00%00 %00%00%00 %F0%00%F0 %F0%00%F0 %0F%0F%00 %00%F0%00 ::v
%00%00%00 %00%00%00 %F0%00%F0 %F0%F0%F0 %F0%F0%F0 %0F%0F%00 ::w
%00%00%00 %00%00%00 %F0%0F%00 %0F%F0%00 %0F%F0%00 %F0%0F%00 ::x
%00%00%00 %F0%0F%00 %FF%FF%F0 %00%0F%00 %F0%0F%F0 %0F%FF%00 ::y
%00%00%00 %00%00%00 %FF%FF%00 %00%F0%00 %0F%00%00 %FF%FF%00 ::z
%00%FF%00 %00%F0%00 %0F%F0%00 %00%F0%00 %00%F0%00 %00%FF%00 ::{
%00%F0%00 %00%F0%00 %00%F0%00 %00%00%00 %00%F0%00 %00%F0%00 ::|
%0F%F0%00 %00%F0%00 %00%FF%00 %00%F0%00 %00%F0%00 %0F%F0%00 ::}
%0F%0F%00 %F0%F0%00 %00%00%00 %00%00%00 %00%00%00 %00%00%00 ::~
@END
@TITLE GRA13.10(1,10)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
SET PIXEL (ADDRESS)
@BOX 2.0
COMPUTE NIBBLE ADDRESS
@BOX 3.0
COMBINE MASK AB
AND COLOUR TO SET PIXEL
@BOX 4.0
END
@BOX 1.1
PROC SET.PIXEL (ADDRESS);
DATAVEC MASK ($LO8)
%0F %F0
END;
$IN NIBBLE, TOP, BOT;
@BOX 2.1
ADDRESS & 1 => NIBBLE;
@BOX 3.1
IF ADDRESS & %FFFF0000 /=0  THEN
   ADDRESS ->> 1 & %7FFF => BOT;
   MASK [NIBBLE] & SCR.BOT [BOT] !
      COLS [NIBBLE] => SCR.BOT [BOT]
ELSE
  ADDRESS ->> 1 => TOP;
  MASK [NIBBLE] & SCR.TOP [TOP] !
      COLS [NIBBLE] => SCR.TOP [TOP]
FI
@BOX 4.1
END
@END

