ASC1ROM 
         IDENT     ASC1ROM
* 
*       'REVISION 'B005 
* 
************************************************************************
* 
*                         OUTPUT FUNCTION DEFINITIONS 
* 
************************************************************************
* 
* CHANNEL FUNCTION                     DESCRIPTION
* 
*    0        0      OPERATORS PANEL DATA 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  OUTPUT REGISTER BIT 1 
*                            BIT 2  OUTPUT REGISTER BIT 2 
*                            BIT 3  OUTPUT REGISTER BIT 3 
*                            BIT 4  OUTPUT REGISTER BIT 4 
*                            BIT 5  OUTPUT REGISTER BIT 5 
*                            BIT 6  OUTPUT REGISTER BIT 6 
*                            BIT 7  COMMUNICATION ERROR INDICATOR 
*                            BIT 8  UNUSED
* 
*    1        0      COMMUNICATION CHANNEL DATA 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  COMMUNICATION OUTPUT BIT 1
*                            BIT 2  COMMUNICATION OUTPUT BIT 2
*                            BIT 3  COMMUNICATION OUTPUT BIT 3
*                            BIT 4  COMMUNICATION OUTPUT BIT 4
*                            BIT 5  COMMUNICATION OUTPUT BIT 5
*                            BIT 6  COMMUNICATION OUTPUT BIT 6
*                            BIT 7  COMMUNICATION OUTPUT BIT 7
*                            BIT 8  COMMUNICATION OUTPUT BIT 8
* 
*    1        1      COMMUNICATION CHANNEL DATA 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  COMUNICATION OUTPUT BIT 9 
*                            BIT 2  COMUNICATION OUTPUT BIT 10
*                            BIT 3-8  UNUSED
* 
*    1        2      COMMUNICATION CHANNEL CONTROL
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  ENABLE CHARACTER READY INTERRUPT
*                            BIT 2  ENABLE CHARACTER REQUEST INTERRUPT
*                            BIT 3  ENABLE LOOP BACK
*                            BIT 4-8  UNUSED
* 
*    2        0      KEYBOARD CONTROL 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  ENABLE CHARACTER READY INTERRUPT
*                            BIT 2-8  UNUSED
*    3        0      TOUCH PANEL CONTROL
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  ENABLE CHARACTER READY INTERRUPT
*                            BIT 2-8  UNUSED
* 
*    3        1      SLIDE PROJECTOR CONTROL
*                                      OUTPUT FROM A REGISTER 
* 
*                            BIT 1  SHUTTER  OPEN=/ CLOSED=1
*                            BIT 2  LAMP  OFF=0 ON=1
* 
*    3        2      SLIDE PROJECTOR DATA 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  Y IMAGE COORDINATE BIT 1
*                            BIT 2  Y IMAGE COORDINATE BIT 2
*                            BIT 3  Y IMAGE COORDINATE BIT 3
*                            BIT 4  Y IMAGE COORDINATE BIT 4
*                            BIT 5  X IMAGE COORDINATE BIT 1
*                            BIT 6  X IMAGE COORDINATE BIT 2
*                            BIT 7  X IMAGE COORDINATE BIT 3
*                            BIT 8  X IMAGE COORDINATE BIT 4
*    4        3      DISPLAY DATA 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  CHARACTER DATA BIT
*                            BIT 2-7  UNUSED
*                            BIT 8  VECTOR DATA BIT 
* 
*    4        4      DISPLAY  X COORDINATE
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  X COORDINATE BIT 1
*                            BIT 2  X COORDINATE BIT 2
*                            BIT 3  X COORDINATE BIT 3
*                            BIT 4  X COORDINATE BIT 4
*                            BIT 5  X COORDINATE BIT 5
*                            BIT 6  X COORDINATE BIT 6
*                            BIT 7  X COORDINATE BIT 7
*                            BIT 8  X COORDINATE BIT 8
* 
*    4        5      DISPLAY  Y COORDINATE
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  Y COORDINATE BIT 1
*                            BIT 2  Y COORDINATE BIT 2
*                            BIT 3  Y COORDINATE BIT 3
*                            BIT 4  Y COORDINATE BIT 4
*                            BIT 5  Y COORDINATE BIT 5
*                            BIT 6  Y COORDINATE BIT 6
*                            BIT 7  Y COORDINATE BIT 7
*                            BIT 8  Y COORDINATE BIT 8
* 
*    4        6      DISPLAY  CONTROL 1 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  X COORDINATE BIT 9
*                            BIT 2  Y COORDINATE BIT 9
*                            BIT 3  ENABLE LOAD X/Y COORDINATE BITS 
*                            BIT 4  X DIRECTION  DEC EQUALS 1 
*                            BIT 5  Y DIRECTION  DEC EQUALS 1 
*                            BIT 6  SHORT AXIS  Y AXIS EQUALS 1 
*                            BIT 7  INHIBIT WRITE/ERASE  INHIBIT EQUAL 1
*                            BIT 8  VECTOR/CHARACTER  VECTOR EQUALS 1 
* 
*    4        7      DISPLAY  CONTROL 2 
* 
*                                      OUTPUT FROM A REGISTER 
*                            BIT 1  BULK ERASE
*                            BIT 2  W/E0
*                            BIT 3  W/E1
*                            BIT 4  ENABLE SELECT INVERSE VIDEO 
*                            BIT 5  SELECT INVERSE VIDEO
*                            BIT 6  ENABLE CHARACTER ORIENTATION
*                            BIT 7  CHARACTER ORIENTATION 
*                            BIT 8  UNUSED
* 
************************************************************************
************************************************************************
* 
*                         INPUT FUNCTION DEFINITIONS
* 
************************************************************************
* 
* CHANNEL FUNCTION                     DESCRIPTION
* 
*    0        1      OPERATORS PANEL DATA 
* 
*                            BIT 1  INPUT REGISTER BIT 1
*                            BIT 2  INPUT REGISTER BIT 2
*                            BIT 3  INPUT REGISTER BIT 3
*                            BIT 4  INPUT REGISTER BIT 4
*                            BIT 5  INPUT REGISTER BIT 5
*                            BIT 6  INPUT REGISTER BIT 6
*                            BIT 7  UNUSED
*                            BIT 8  UNUSED
* 
*    1        0      COMMUNICATION CHANNEL DATA 
* 
*                            BIT 1  COMMUNICATION INPUT BIT 13
*                            BIT 2  COMMUNICATION INPUT BIT 14
*                            BIT 3  COMMUNICATION INPUT BIT 15
*                            BIT 4  COMMUNICATION INPUT BIT 16
*                            BIT 5  COMMUNICATION INPUT BIT 17
*                            BIT 6  COMMUNICATION INPUT BIT 18
*                            BIT 7  COMMUNICATION INPUT PARITY BIT
*                            BIT 8  COMMUNICATION INPUT BIT 19
* 
* 
*    1        1      COMMUNICATION CHANNEL DATA 
* 
*                            BIT 1  COMMUNICATION INPUT BIT 7 
*                            BIT 2  COMMUNICATION INPUT BIT 8 
*                            BIT 3  COMMUNICATION INPUT BIT 9 
*                            BIT 4  COMMUNICATION INPUT BIT 10
*                            BIT 5  COMMUNICATION INPUT BIT 11
*                            BIT 6  COMMUNICATION INPUT BIT 12
*                            BIT 7  ZERO
*                            BIT 8  ZERO
* 
*    1        2      COMMUNICATION CHANNEL DATA 
* 
*                            BIT 1  COMMUNICATION INPUT BIT 1 
*                            BIT 2  COMMUNICATION INPUT BIT 2 
*                            BIT 3  COMMUNICATION INPUT BIT 3 
*                            BIT 4  COMMUNICATION INPUT BIT 4 
*                            BIT 5  COMMUNICATION INPUT BIT 5 
*                            BIT 6  COMMUNICATION INPUT BIT 6 
*                            BIT 7  UNUSED
*                            BIT 8  UNUSED
* 
*    1        3      COMMUNICATION CHANNEL STATUS 
* 
*                            BIT 1-4  UNUSED
*                            BIT 5  OVERRUN 
*                            BIT 6  PARITY ERROR
*                            BIT 7  CHARACTER REQUEST 
*                            BIT 8  CHARACTER READY 
* 
*    2        2      KEYBOARD DATA
* 
*                            BIT 1  KEYBOARD INPUT DATA BIT 1 
*                            BIT 2  KEYBOARD INPUT DATA BIT 2 
*                            BIT 3  KEYBOARD INPUT DATA BIT 3 
*                            BIT 4  KEYBOARD INPUT DATA BIT 4 
*                            BIT 5  KEYBOARD INPUT DATA BIT 5 
*                            BIT 6  KEYBOARD INPUT DATA BIT 6 
*                            BIT 7  KEYBOARD INPUT DATA BIT 7 
*                            BIT 8  ZERO
* 
*    2       1       KEYBOARD STATUS
* 
*                            BIT 1  CHARACTER READY 
*                            BIT 2-8  UNUSED
* 
*    3        0      TOUCH PANEL DATA 
* 
*                            BIT 1  Y POSITION BIT 1
*                            BIT 2  Y POSITION BIT 2
*                            BIT 3  Y POSITION BIT 3
*                            BIT 4  Y POSITION BIT 4
*                            BIT 5  X POSITION BIT 1
*                            BIT 6  X POSITION BIT 2
*                            BIT 7  X POSITION BIT 3
*                            BIT 8  X POSITION BIT 4
* 
*    3        1      TOUCH PANEL STATUS 
* 
*                            BIT 1  CHARACTER READY 
*                            BIT 2-8  UNUSED
* 
*    4        0      DISPLAY READ X REGISTER
* 
*                            BIT 1  X REGISTER BIT 1
*                            BIT 2  X REGISTER BIT 2
*                            BIT 3  X REGISTER BIT 3
*                            BIT 4  X REGISTER BIT 4
*                            BIT 5  X REGISTER BIT 5
*                            BIT 6  X REGISTER BIT 6
*                            BIT 7  X REGISTER BIT 7
*                            BIT 8  X REGISTER BIT 8
* 
*    4        1      DISPLAY READ Y REGISTER
* 
*                            BIT 1  Y REGISTER BIT 1
*                            BIT 2  Y REGISTER BIT 2
*                            BIT 3  Y REGISTER BIT 3
*                            BIT 4  Y REGISTER BIT 4
*                            BIT 5  Y REGISTER BIT 5
*                            BIT 6  Y REGISTER BIT 6
*                            BIT 7  Y REGISTER BIT 7
*                            BIT 8  Y REGISTER BIT 8
* 
*    4        2      DISPLAY READ X/Y 
* 
*                            BIT 1  X REGISTER BIT 9
*                            BIT 2  Y REGISTER BIT 9
*                            BIT 3-8  UNUSED
************************************************************************
************************************************************************
* 
*                                      EQUATE STATEMENTS
* 
************************************************************************
*                  VIDEO DISPLAY
DISCHAN  EQU       4              DISPLAY CHANNEL NUMBER
DISDATA  EQU       3              DISPLAY DATA
DISCON1  EQU       6              DISPLAY CONTROL 1 FUNCTION
DISCON2  EQU       7              DISPLAY CONTROL 2 FUNCTION
YCOORD   EQU       5              DISPLAY Y COORDINATE DATA 
XCOORD   EQU       4              DISPLAY X COORDINATE DATA 
XYREAD   EQU       2              DISPLAY READ XY BIT 9 FUNCTION
************************************************************************
* 
*                       INTERRUPT AREA
* 
*        THE TERMINAL HAS EIGHT PRIORITY ENCODED INTERRUPT LINES. 
*        LOWER NUMBERED INTERRUPT LINES HAVE A HIGHER PRIORITY THAN 
*        HIGHER NUMBERED INTERRUPT LINES.  THE PROCESSOR RECOGNIZES THE 
*        INTERRUPT AT THE END OF THE CURRENT INSTRUCTION.  THE
*        CURRENT VALUE OF THE PROGRAM COUNTER IS PUSHED INTO THE
*        PUSHDOWN STACK AND THE PROGRAM COUNTER IS SET TO THE TRAP
*        LOCATION DEFINED BY THE ACTIVATED INTERRUPT LINE.
* 
*        INTERRUPT           LOCATION            DEVICE 
*            0                HEX 00             MASTER CLEAR 
*            1                HEX 08             COMMUNICATION CHANNELS 
*            2                HEX 10             KEYBOARD 
*            3                HEX 18             TOUCH PANEL
*            4                HEX 20             RESERVED 
*            5      HEX 28                       EXTERNAL INTERFACE 
*            6                HEX 30             OPTIONS
*            7                HEX 38             OPTIONS
* 
************************************************************************
START    EQU       $
* 
TRAP0    EQU       $
         DI 
         JMP       RST.SEC0       MASTER RESET
         DB        #00,#00,#00,#00
* 
TRAP1    EQU       $
          IN     RSF.COMM*32+COMMSTAT 
          XRA    A           TURN OFF THIS INT. 
          OUT    RSF.COMM*32+COMMCONT 
          EI                 ENABLE SYSTEM INT.S
          RET 
          DB     #00
* 
TRAP2    EQU       $
         PUSH      PSW            KEYBOARD
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       KEYINP 
* 
         DB        #00
* 
TRAP3    EQU       $
         PUSH      PSW            TOUCH PANEL 
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       TOUCHINP 
* 
         DB        #00
* 
TRAP4    EQU       $
         RET                      UNASSIGNED
* 
         DB        #00,#00,#00,#00,#00,#00,#00
* 
TRAP5    EQU       $
         PUSH      PSW
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       EXT.PR         EXTERNAL INTERRUPT
         DB        #00
* 
TRAP6    EQU       $
         PUSH      PSW
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       EXT.PR         EXTERNAL INTERRUPT
         DB        #00
* 
TRAP7    EQU       $
         PUSH      PSW
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       EXT.PR         EXTERNAL INTERRUPT
         DB        #00
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        USER JUMP TABLE TO ACCESS RESIDENT ROUTINES. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
R.INIT    JMP    #4051       PLATO INITIALIZE 
R.DOT    JMP       #4003          WRITE/ERASE DOT 
R.LINE   JMP       #4006          DRAW LINE 
R.CHARS  JMP       CHARS          DISPLAY  CHARACTERS 
R.BLOCK  JMP       #400C          BLOCK WRITE/ERASE 
R.INPX   JMP       #400F          READ DISPLAY X COORD
R.INPY   JMP       #4012          READ DISPLAY Y COORD
R.OUTX   JMP       OUTX           SETS NEW X COORD
R.OUTY   JMP       OUTY           SETS NEW Y COORD
R.XMIT   JMP       #401B          TRANSMIT DATA TO HLP
R.MODE   JMP       MODESET        SETS MODE,W/E,BULK ERASE
R.STEPX  JMP       #4021          STEPS X AXIS COORD
R.STEPY  JMP       #4024          STEPS Y AXIS COORD
R.WE     JMP       #4027          W/E CURRENT POSITION
R.DIR    JMP       #402A          SET DIRECTION OF XY STEP
R.INPUT  JMP       #402D          DIRECTS DEVICE INPUT
R.SSF    JMP       #4030          SELECT SPECIAL FUNCTION 
R.CCR    JMP       CCR            SET CHARACTER INFO. 
R.EXTOUT JMP       #4036          TO R.RETURN FOR NOW 
R.EXEC    JMP    #4039
R.GJOB    JMP    #403C
R.XJOB    JMP    #403F
R.RETURN  JMP    #4042       RESTORE, ENABLE, RETURN
          JMP    #4045       EXPANSION
EXT.PR    JMP    #4048
KEYINP    JMP    #404B
TOUCHINP  JMP    #404E
A.INIT   JMP       #4000          ASCII INITIALIZE
         DB        #00,#00
M0ADR     DW     M0CODE00 
M1ADR     DW     M1CODE00 
* 
*        EXTERNAL ENTRY TO VARIOUS ROUTINES 
*        BEGINNING AT ADDRESS #009A 
         JMP       SUPER
         JMP       SUB
         JMP       SELECTM0 
         JMP       SELECTM1 
         JMP       SELECTMM 
         JMP       HORZ 
         JMP       VERTICAL 
         JMP       FORWARD
         JMP       REVERSE
         JMP       SIZE.1 
         JMP       SIZE.2 
         JMP       BKSPACE
         JMP       RETURN 
         JMP       TAB
         JMP       LINEFEED 
         JMP       VERTAB 
         JMP       FORMFEED 
*        MODE 3 - CHARACTER MODE USER ENTRY 
* 
CHARS    EQU       $
         MOV       A,M            LOAD DATA BYTE. 
         INX       H              INCREMENT ADDRESS TO NEXT BYTE. 
         SHLD      M.ORG            AND STORE FOR NEXT BYTE.
         ANI       #7F            MASK FOR SEVEN BIT CHARACTER CODES. 
         MOV       C,A                 SAVE CHARACTER CODE
         CPI       #1B            TEST FOR ESCAPE SEQ.
         JZ        CHARACT4         SET FLAG FOR CONTROL CODE.
* 
         LXI       H,M.CCR        LOAD ADDRESS OF UNCOVER FLAG
         MVI       A,#80            AND TEST FOR
         ANA       M                  UNCOVER CODE IN PREVIOUS CHARACTER
         JZ        CHARACT3       NOT CONTROL, PROCESS DATA.
         MVI       A,#7F          CLEAR ESCAPE FLAG 
         ANA       M
         MOV       M,A
         MOV       A,C            EXIT IF ESC ASCII ZERO
         CPI       #30
         RZ 
* 
*        EXECUTE CONTROL FUNCTION DEFINED BY CHARACTER CODE 
* 
         MOV       A,C                 LOAD CHARACTER CODE
         CPI       #40
         JC        CHARACT2       CHARACT2, SEQ OUT OF RANGE
         CPI       #50
         JNC       CHARACT2       CHARACT2, SEQ OUT OF RANGE
         SUI       #40            IN RANGE
         LXI       H,CHARESC      BASE ADDR ESC TBL 
         CALL      CONTROL
         JMP       CHARACT2 
CHARACT2 EQU       $
         LHLD      M.ORG          LOAD FWA OF DATA
         JMP       CHARS          LOAD NEXT CHARACTER CODE. 
* 
* 
CHARACT3 EQU       $
         MOV       A,C            LOAD CHARACTER CODE 
         CPI       #20
         JNC       CHAR3.A        CHAR3.A, NOT CTL CODE 
         CPI       #08            TEST FOR CTL RANGE
         JC        CHARACT2       CHARACT2, CTL OUT OF RANGE
         CPI       #0E
         JP        CHARACT2       CHARACT2, CTL OUT OF RANGE
         SUI       #08            IN RANGE
         LXI       H,CHARCTL      BASE ADDR CTL TBL 
         CALL      CONTROL
         JMP       CHARACT2 
CHAR3.A  EQU       $
         SUI       #20
         CALL      CHAREN           AND DISPLAY CHARACTER.
         JMP       CHARACT2 
* 
CHARACT4 EQU       $
         LXI       B,#7F80
         CALL      UD.CCR 
         JMP       CHARACT2 
CHARCTL  EQU       $
         DW        BKSPACE
         DW        TAB
         DW        LINEFEED 
         DW        VERTAB 
         DW        FORMFEED 
         DW        RETURN 
* 
CHARESC  EQU       $
         DW        SUPER
         DW        SUB
         DW        SELECTM0 
         DW        SELECTM1 
         DW        SELECT            SELECT M2, M3
         DW        SELECT 
         DW        SELECT           M4, M5, M6, OR M7 
         DW        SELECT 
         DW        SELECT           CHARACTER SET.
         DW        SELECT 
         DW        HORZ 
         DW        VERTICAL 
         DW        FORWARD
         DW        REVERSE
         DW        SIZE.1         8 X 16 CHARACTERS 
         DW        SIZE.2         16 X 32 CHARACTERS
* 
CONTROL  EQU       $
         RLC
         MVI       B,#00               CLEAR REGISTER B 
         MOV       C,A                 LOAD CHARACTER CODE
         DAD       B                   FORM JUMP TABLE TABLE POINTER
         MOV       E,M                 LOAD LEAST SIGN BYTE 
         INX       H                   INCREMENT ADDRESS
         MOV       D,M                 LOAD MOST SIGN BYTE
         XCHG 
         LXI       D,HOR          LOAD HOR PLOT FLAG ADDRESS. 
         PCHL 
BKSPACE  EQU       $
         LDA       FWD.REV        LOAD FORWARD REVERSE FLAG 
         CMA                        AND COMPLIMENT IT.
         STA       FWD.REV
         CALL      CH.PLOT        CALCULATE VARIABLES FOR OPPOSITE PLOT 
         CALL      DISP.TAB       TAB TO NEXT CHARACTER POSITION. 
         LDA       FWD.REV        LOAD FORWARD REVERSE FLAG 
         CMA                          AND RESTORE TO
         STA       FWD.REV            THE ORIGINAL .
         JMP       CH.PLOT        RESET PLOTTING VARIABLES. 
* 
TAB      EQU       $
         JMP       DISP.TAB       TAB TO NEXT CHARACTER POSITION. 
* 
LINEFEED EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST FOR ZERO.
         LXI       B,#FFF0        LOAD TAB ADJUSTMENT 
         JNZ       V.ADJ          ADJUST VERTICAL 
         LXI       B,16           LOAD HOR. ADJUST
         JMP       H.ADJ          AMD ADJUST HOR. 
* 
VERTAB   EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST. 
         LXI       B,16           LOAD TAB ADJUST 
         JNZ       V.ADJ             AND ADJUST VERT. 
         LXI       B,#FFF0         LOAD TAB ADJUST
         JMP       H.ADJ            AND ADJUST HOR. 
* 
FORMFEED EQU       $
         LXI       H,0000         LOAD COORDINATE 00
         LDA       FWD.REV        TEST FLAG FOR 
         ORA       A                FORWARD OR REVRESE PLOT.
         CNZ       FF.3           LOAD REVERSE PLOT COORDINATE. 
* 
*        FORWARD PLOT SETTING.
* 
         LDAX      D              LOAD HOR. PLOT FLAG 
         ORA       A                OR HORIZONTAL PLOT. 
         JZ        FF.2           GO TO VERTICAL SETTING. 
* 
*        HORIZONTAL PLOT SETTING. 
* 
FF.1     EQU       $
         CALL      OUTX           OUTPUT X COORDINATE.
         LXI       H,512          LOAD FULL SCREEN COORDINATE 
         LXI       B,#FFF0         LOAD 2 " SIZE
         CALL      SIZE.ADJ         AND ADJUST FOR CHARACTER SIZE.
         JMP       OUTY           OUTPUT Y COORDINATE.
* 
*        VERTICAL PLOT SETTING. 
* 
FF.2     EQU       $
         CALL      OUTY           OUTPUT Y COORDINATE.
         LXI       H,#FFFF         LOAD ADJUST VALUE
         LXI       B,16           LOAD 2 X SIZE.
         CALL      SIZE.ADJ       ADJUST FOR CHARACTER SIZE.
         JMP       OUTX           OUTPUT X COORDINATE 
* 
*        REVERSE PLOT SETTING.
* 
FF.3     EQU       $
         LXI       H,512          LOAD FULL SCREEN COORDINATE.
         LXI       B,#FFF8         LOAD NEGATIVE SIZE 
         JMP       SIZE.ADJ       ADJUST FOR CHARACTER SIZE.
* 
RETURN   EQU       $
         LHLD      M.MARGIN       LOAD DISPLAY MARGIN.
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST. 
         JZ        RETURN1        NOT HORIZONTAL. 
* 
         CALL      OUTX           OUTPUT X COORDINATE.
         LXI       B,#FFF0         LOAD VERTICAL ADJUST 
         JMP       V.ADJ
* 
RETURN1  EQU       $
         CALL      OUTY           OUTPUT Y COORDINATE.
         LXI       B,16           LOAD HORIZONTAL ADJUST VALUE. 
         JMP       H.ADJ
* 
SUPER    EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST
         LXI       B,05           LOAD SUPERSCRIPT ADJUST FOR HOR.
         JNZ       V.ADJ             ADJUST VERT. 
         LXI       B,#FFFB         LOAD SUPERSCRIPT ADJUST
         JMP       H.ADJ
* 
SUB      EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST. 
         LXI       B,#FFFB         LOAD SUBSCRIPT ADJUST
         JNZ       V.ADJ             ADJUST VERT. 
         LXI       B,05           LOAD ADJUST FOR SUBSCRIPT FOR VERT. 
         JMP       H.ADJ          GO ADJUST HOR.
* 
SELECTM0 EQU       $
          LHLD   M0ADR       LOAD ADDRESS OF M0 
         JMP       SELECT.1 
SELECTM1 EQU       $
          LHLD   M1ADR       LOAD ADDRESS OF M1 
         JMP       SELECT.1 
* 
SELECTMM EQU       $
         MOV       A,C
         SUI       #44
         RLC
         JMP       SELECT.0 
* 
SELECT   EQU       $
         RRC                      ADJUST  CODE FOR INDEX
         SUI       #08
SELECT.0 EQU       $
         MOV       E,A                ADDRESS STORE.
* 
         LXI       H,MEMORY.2     LOAD ADDR. OF MEM2 POINTER
         MVI       D,00 
         DAD       D                AND ADD INDEX.
* 
         MOV       E,M            LOAD CHARACTER SET
         INX       H                ADDRESS FROM
         MOV       D,M                STORE AREA. 
         XCHG 
* 
SELECT.1 EQU       $
         SHLD      MEMSEL           CHARACTER SET 
         MOV       A,C            GET BIT PATTERN SET UP
         ADI       #0C            FOR SETTING M.CCR WITH
         MOV       C,A            CORRECT CHARACTER SET 
         MVI       A,#0E          MASK BITS 
         ANA       C                FOR MEMORY SELECTED.
         MOV       C,A
         MVI       B,#F1
         JMP       UD.CCR         GO SET FLAG.
HORZ     EQU       $
         XCHG                     LOAD HOR FLAG ADDRESS 
         MVI       M,#FF            AND SET TO ALL ONES FOR HOR. PLOT.
         INX       H              INCREMENT ADDRESS TO VERT.
         MVI       M,00             AND CLEAR VERT PLOT FLAG. 
* 
         CALL      CH.PLOT        CALL ROUTINE TO CALCULATE PLOTTING. 
         LXI       B,#FE00        LOAD MASK AND HOR BITS
         CALL      UD.CCR         GO UPDATE PLOT FLAG 
         MVI       A,#20          SET HORIZONTAL CHARACTER ORIENTATION. 
         JMP       VERTICA1 
VERTICAL EQU       $
         XCHG                     LOAD HOR FLAG ADDRESS 
         MVI       M,00           CLEAR HOR PLOT FLAG.
         INX       H              INCREMENT ADDRESS 
         MVI       M,#FF            AND SET FLAG FOR VERT. PLOT.
         CALL      CH.PLOT        CALL ROUTINE TO CALCULATE PLOTTING. 
         LXI       B,#FE01        LOAD MASK AND VERT BIT
         CALL      UD.CCR         GO UPDATE PLOT FLAG 
         XRA       A              CLEAR A REGISTER. 
VERTICA1 EQU       $
         ORI       #40            SET ORIENTATION ENABLE BIT
         MOV       B,A            SAVE ORIENTATION BITS 
         LDA       D.CNTL2          LOAD DISPLAY CONTROL 2
         ANI       06                 AND MASK WRITE EREASE BITS. 
         ORA       B              ADD ORIENTATION BITS TO CONTROL 
         STA       D.CNTL2          AND STORE FOR CHARACTER GENERATOR.
         RET
REVERSE  EQU       $
         MVI       A,#FF          LOAD REVERSE FLAG 
         JMP       FRWD.1 
FORWARD  EQU       $
         XRA       A              LOAD FORWARD FLAG 
* 
FRWD.1   EQU       $
         STA       FWD.REV          STORE FORWARD REVERSE FLAG
         LXI       B,#BF40        LOAD MASK AND REVERSE BIT 
         ANA       C              SET REVERSE FOR FORWARD OR REVERSE
         MOV       C,A
         CALL      UD.CCR         GO UPDATE PLOT FLAG 
         JMP       CH.PLOT        CALL ROUTINE TO CALCULATE PLOTTING. 
SIZE.2   EQU       $
         MVI       A,16           LOAD SIZE TWO 
         LXI       H,CHAR.S2      LOAD CHARACTER GENERATOR FOR SIZE 2 
         JMP       SIZE.11
SIZE.1   EQU       $
         MVI       A,8            LOAD SIZE ONE.
         LXI       H,CHAR.S1      LOAD CHARACTER GENERATOR FOR SIZE 1 
SIZE.11  EQU       $
         SHLD      CHAR.GEN         STORE CHARACTER GENERATOR ADDRESS.
         STA       SIZE               IN SIZE REGISTER. 
         MVI       B,#DF          LOAD MASK 
         RLC                      ROTATE SIZE BIT 
         ANI       #20              AND MASK FOR SIZE TWO 
         MOV       C,A
         CALL      UD.CCR         GO UPDATE PLOT FLAG 
         JMP       CH.PLOT        CALL ROUTINE TO CALCULATE PLOTTING. 
* 
*        UPDATE OF M.CCR
* 
UD.CCR   EQU       $
         LDA       M.CCR          LOAD CURRENT FLAG.
         ANA       B              MASK BIT BEING CHANGED
         ORA       C              SET NEW VALUE OF BIT
         STA       M.CCR          STORE UPDATED FLAG. 
         RET                      RETURN TO CALLER
************************************************************************
* 
*                            CHARACTER GENERATOR
* 
************************************************************************
*        THE FORMAT OF MODE 3 DATA WORDS CONTAINS THREE 6 BIT CHARACTER 
*        THESE CODES DEFINES THE MEMORY ADDRESSES OF THE CHARACTERS TO B
*        PLOTTED.  FOUR 64 CHARACTER MEMORIES ARE CONTAINED IN THE TERMI
*        MEMORIES M0 AND M1 CONTAIN FIXED CHARACTERS AND MEMORIES M2 AND
*        CONTAIN VARIABLE CHARACTERS LOADED BY MODE 1 WORDS AND ARE PROC
*        BY MODE 3 AS 64 ARRAYS OF 8X16 MATRIX. THE TOP THREE ROWS AND T
*        BOTTOM ROW OF THE MATRICES FOR ALL CHARACTERS FROM M0 AND M1 AR
*        ALWAYS UNFILLED.  LIKEWISE THE EIGHTH COLOMN IS ALSO UNFILLED T
*        PROVIDE INTERCHARACTER SPACING.  AS A RESULT THE BASIC CHARACTE
*        IS 7X9 FOR THE CHARACTERS FROM M0 AND M1 MEMORIES
* 
*        CHARACTER WRITE/ERASE IS CONTROLLED BY THE WRITE/ERASE BITS IN 
*        LDM INSTRUCTION WORD.    IF BIT 2=1,CHARACTERS ARE WRITTEN IN
*        ACCORDANCE WITH DATA STORED IN M0 AND M1.IF BIT 2=0,CHARACTERS 
*        ARE ERASED.  IF BIT 3=0,THE BACKGROUND OF EACH CHARACTER MATRIX
*        ERASED.IF BIT 3=1,THE BACKGROUND REMAINS UNALTERED(OVERSTRIKE).
* 
*        WHEN A CHARACTER HAS BEEN COMPLETELY PLOTTED THE X/Y ADDRESS IS
*        AT THE LOWER LEFT HAND CORNER OF THE NEXT MATRIX READY FOR THE 
*        PLOT.  IN THIS WAY,CHARACTER PLOTTING PROCEEDS FROM LEFT TO RIG
*        ACROSS THE SCREEN.  UP TO 32 LINES OF 64 CHARACTERS EACH MAY BE
*        FOR A TOTAL OF 2048 CHARACTERS 
* 
************************************************************************
* 
*        INITIALIZE MEMORY ADDRESS OF CHARACTER 
* 
CHAREN   MVI       H,#00          CLEAR H REGISTER
         MOV       L,A                 PLACE CHARACTER CODE IN REGISTER 
         DAD       H                   SHIFT LEFT ONE PLACE 
         DAD       H                   SHIFT LEFT ONE PLACE 
         DAD       H                   SHIFT LEFT ONE PLACE 
         DAD       H                   SHIFT LEFT ONE PLACE 
         XCHG                     SAVE CHARACTER INDEX
         LHLD      MEMSEL           LOAD CHARACTER MEMORY.
         DAD       D                ADD INDEX FOR CHARACTER ADDRESS 
         XCHG                       SAVE CHARACTER ADDRESS IN DE
* 
* 
         LDA       FWD.REV        LOAD FORWARD REVERSE FLAG 
         ANA       A                AND TEST PLOTTING DIRECTION.
         JZ        CHAR6          FORWARD, CONTINUE.
         PUSH      D              SAVE DE REGISTERS 
         CALL      DISP.TAB         AND TAB TO REVERSE CHARACTER
         POP       D                  POSITION BEFORE CHARACTER.
CHAR6    EQU       $
         LDA       D.CNTL2        LOAD CONTROL 2 FOR CHARACTER
         OUT       DISCHAN*32+DISCON2  ND OUT PUT ORIENTATION  AND W/E
         LDA       VER            LOAD VERTICAL PLOT FLAG 
         ANI       08               AND MASK FOR VERTICAL PLOT BIT. 
         OUT       DISCHAN*32+DISCON1  ND OUTPUT FOR CHARACTER PLOT.
         RLC
         MOV       B,A            SAVE X DIRECTION BIT
         LHLD      YREG           LOAD CURRENT Y COORD. 
         SHLD      YSAVE          AND SAVE
         MOV       C,L            SAVE LOWER 8 BITS OF Y
         LHLD      XREG           LOAD CURRENT X COORD. 
         SHLD      XSAVE          AND SAVE
         IN        DISCHAN*32+XYREAD  READ UPPER X,Y BITS 
         ANI       #3 
         MOV       H,A            TEMP SAVE 
         RLC                      SHIFT Y BIT UP 1 POSITION 
         XRA       H              INSERT X BIT
         ANI       #5             MASK FOR X,Y BITS ONLY
         XRI       #08            AND ENABLE BIT,SETS NZ FLG
         XRA       B              ADD X DIRECTION BIT 
         MOV       H,A
         LDA       SIZE           LOAD CHARACTER SIZE 
         MOV       B,A            AND SAVE AS COLUMN COUNT
************************************************************
* 
*        CHARACTER GENERATOR ENTRY
*        REG B COLUMN COUNT 
*        REG C LOWER 8 BITS OF Y COORDINATE 
*        REG L LOWER 8 BITS OF X COORDINATE 
*        REG H ENABLE,Y,0,X 
*        REG DE CHARACTER DATA WORD ADDRESS 
************************************************************
CHAR7    EQU       $
         PUSH      H
         LHLD      CHAR.GEN       LOAD CHARACTER GENERATOR ADDRESS
         CALL      INDIRECT 
         POP       H
* 
         LDA       VER            TEST FOR VERTICAL OR
         RAL                        HORIZONTAL CHARACTER PLOT.
         JC        CHAR9          GO TO VERTICAL PLOT.
* 
*        HORIZONTAL CHARACTER PLOTTING
* 
         INX       H              INCREMENT X COORDINATE
CHARH    MOV       A,L
         OUT       DISCHAN*32+XCOORD  OUTPUT LOWER 8 OF X 
         MOV       A,C
         OUT       DISCHAN*32+YCOORD  OUTPUT LOWER 8 OF Y 
         MOV       A,H
         ANI       #1D            CLEAR X OVERFLOW BIT
         INR       A              MOVES X BIT RIGHT 1 
         RAR                      MOVE WORD RIGHT ONE 
         OUT       DISCHAN*32+DISCON1  OUTPUT UPPER X,Y BITS
         DCR       B              DECREMENT COLUMN COUNT
         JNZ       CHAR7          CHECK FOR CHAR. COMPLETE
*        LOCATE FOR NEXT CHARACTER. 
CHAR10   EQU       $
         MOV       E,C            SAVE LOWER 8 OF Y COORD.
         MOV       A,H
         RRC
         RRC
         ANI       1
         MOV       D,A            SAVE UPPER BIT OF Y COORD.
         MOV       A,H
         ANI       1
         MOV       H,A            SAVE UPPER X COORD. 
         SHLD      XREG 
         XCHG 
         SHLD      YREG 
         LDA       FWD.REV        TEST FOR FORWARD OR REVERSE 
         ANA       A                CHARACTER PLOTTING. 
         RZ                       FORWARD, GET NEXT CHARACTER.
* 
         LHLD      YSAVE          LOAD Y AND X
         XCHG                       COORDINATES FOR 
         LHLD      XSAVE              FOR POSITIONING 
         JMP       OUTCOORD             FOR REVERSE PLOTTING. 
* 
*        VERTICAL CHARACTER PLOTTING. 
* 
CHAR9    EQU       $
         INR       C              INCREMENT Y COORD.
         JNZ       CHARH          JUMP IF NO OVERFLOW 
         MOV       A,H
         XRI       #04            TOGGLE UPPER BIT OF Y 
         MOV       H,A            SAVE UPPER BITS 
         JMP       CHARH
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        S U B R O U T I N E S
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        SIZE ONE CHARACTER GENERATOR 
* 
*        THIS ROUTINE OUTPUTS TWO BYTES OF A 8 X 16 CHARACTER 
*        TO THE DISPLAY.
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
TWICE    XRA       A              SET ZERO FLAG 
CHAR.S1  EQU       $
         LDAX      D              LOAD BYTE OF CHARACTER DATA 
         INX       D              INCREMENT CHARACTER ADDRESS 
         OUT       DISCHAN*32+DISDATA  OUTPUT BYTE
         RAR
         OUT       DISCHAN*32+DISDATA  OUTPUT 
         RAR
         OUT       DISCHAN*32+DISDATA    CHARACTER
         RAR
         OUT       DISCHAN*32+DISDATA      DATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RZ                       RETURN AFTER SECOND PASS
         JMP       TWICE
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        SIZE TWO CHARACTER GENERATOR 
* 
*        THIS ROUTINE OUTPUTS TWO BYTES OF A 16 X 32 CHARACTER
*        TO THE DISPLAY.
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
TWICE1   XRA       A              SET ZERO FLAG 
CHAR.S2  EQU       $
         LDAX      D              LOAD CHARACTER DATA BYTE
         INX       D              INCREMENT DATA ADDRESS
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         JNZ       TWICE1         CHECK FOR SECOND PASS 
         MOV       A,B            LOAD COLUMN COUNT 
         RAR                        AND TEST FOR
         RC 
         DCX       D              DECREMENT THE DATA
         DCX       D                POINTER 
         RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        DISPLAY TAB ROUTINE. 
* 
*        THIS ROUTINE SET THE X AND Y REGISTERS TO TAB FOR
*        THE NEXT CHARACTER POSITION. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
DISP.TAB EQU       $
         LHLD      XREG           LOAD CURRENT X
         XCHG                       AND SAVE IN DE
         LHLD      X.PLOT         LOAD X CHARACTER PLOT 
         DAD       D                ADD TO CURRENT X
         CALL      OUTX           OUTPUT X COORDINATE.
         LHLD      YREG           LOAD CURREMT Y
         XCHG                       AND SAVE IN DE
         LHLD      Y.PLOT         LOAD Y CHARACTER PLOT 
         DAD       D                ADD TO CURRENT Y
         JMP       OUTY           OUTPUT Y COORDINATE.
* 
* 
*        HORIZONTAL AND VERTICAL COORDINATE ADJUST ROUTINE
* 
V.ADJ    EQU       $
         LHLD      YREG           LOAD CURRENT Y COORDINATE 
         CALL      SIZE.ADJ         AND ADJUST WITH CHARACTER SIZE. 
         JMP       OUTY           OUTPUT Y COORDINATE.
* 
H.ADJ    EQU       $
         LHLD      XREG           LOAD CURRENT X COORDINATE 
         CALL      SIZE.ADJ         AND ADJUST WITH CHARACTER SIZE. 
         JMP       OUTX           OUTPUT X COORDINATE.
* 
SIZE.ADJ EQU       $
         LDA       SIZE           LOAD CHARACTER SIZE 
         CPI       08               AND TEST FOR SIZE 1.
         JZ        S.ADJ.1          SIZE 1 , CONTINUE.
         MOV       A,C            LOAD LOWER BYTE OF ADJUST 
         ADD       A                AND DOUBLE IT.
         MOV       C,A
* 
S.ADJ.1  EQU       $
         DAD       B              ADD ADJUST TO COORDINATE
         RET
*  *  *  *   *  *  *   *  *   *   *   *   *   *  *  *   *  *  *  *  * 
* 
*        INITIALIZE PLOTTING FLAG FOR HORIZONTAL, SIZE 0
*        CHARACTERS IN THE FORWARD DIRECTION. 
* 
INIT.PLT EQU       $
         MVI       L,#1A          SET CHARACTER MODE
         CALL      R.MODE           AND WRITE BITS
         MVI       L,00           SET CHAR. PLOT PARAMS 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        M.CCR AND CHARACTER PLOTTING PARAMETERS ARE SET IN ACCORDANCE
*        WITH THE CONTENTS OF HL REGISTERS. 
* 
*        BIT       FUNCTION 
*        1         1=VERTICAL, 0=HORIZONTAL 
*        2,3,4     CHARACTER MEMORY SELECTED, 0-7 
*        5         UNUSED 
*        6         1=SIZE TWO CHARACTERS, 0=SIZE ONE CHARACTERS 
*        7         1=REVERSE, 0=FORWARD 
*        8         UNUSED 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
CCR      EQU       $
         SHLD      M.CCR          STORE PARAMETERS
         MOV       A,L
* 
         ANI       01             MASK HOR/VERT BIT 
         ADI       #0A            ADD CONSTANT TO RUN 
         LXI       H,CHARESC         THIS THRU CONTROL
         CALL      CONTROL
* 
         LDA       M.CCR          LOAD FLAG BITS
         RRC                        ADD ROTATE TO CHAR SET BITS.
         ANI       07             MASK OFF CHAR SET BITS
         ADI       #02            ADD CONSTANT TO RUN 
         LXI       H,CHARESC         THIS THRU CONTROL AGAIN
         CALL      CONTROL
* 
         LDA       M.CCR          LOAD UP BITS AGAIN
         RLC                        AND ROTATE
         RLC                          TO FORWARD/REVERSE BITS 
         ANI       01             MASK FORWARD/REVERSE BIT
         ADI       #0C            ADD CONSTANT TO RUN 
         LXI       H,CHARESC         THIS THRU CONTROL AGAIN
         CALL      CONTROL
* 
         LDA       M.CCR          LOAD FLAG BITS
         RLC                        NOW ROTATE
         RLC                         TO THE 
         RLC                          SIZE BIT
         ANI       01             MASK HIM OFF
         ADI       #0E            ADD CONSTANT TO RUN 
         LXI       H,CHARESC         THIS THRU CONTROL AGAIN
         CALL      CONTROL
         RET
*        LOAD TERMINAL OPERATING MODE INSTRUCTION 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        CHARACTER PLOTTING CALCULATIONS. 
* 
*        THIS SUBROUTINE CALCULATES THE VALUES TO PLOT CHARACTERS 
*        AS TO HORIZONTAL, VERTICAL, FORWARD, REVERSE, AND SIZE.
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
CH.PLOT  EQU       $
         MVI       B,#FF
         LXI       H,SIZE         LOAD CHARACTER
         MOV       A,M              SIZE AND ADD
         INX       H                  TO FORWARD/REVERSE
         ADD       M                    TO SET DIRECTION OF PLOT. 
         JNC       CH.PLOT1       IF CARRY IS SET 
         CMA                        COMPLIMENT RESULT FOR NEGATIVE. 
CH.PLOT1 EQU       $
         MOV       C,A            SAVE RESULT.
         INX       H
         ANA       M              AND RESULT TO DETERMINE 
         MOV       E,A              VALUE OF X AXIS PLOTTING. 
         MOV       D,B                AND LOAD FOR STORING. 
         JM        CH.PLOT2       IF RESULT IS POSITIVE,
         INR       D                CLEAR UPPER BYTE. 
CH.PLOT2 EQU       $
         XCHG                     STORE THE RESULT
         SHLD      X.PLOT           FOR X AXIS
         XCHG                         CHARACTER PLOTTING. 
         MOV       A,C            LOAD SIZE AND DIRECTION RESULT
         INX       H
         ANA       M              AND RESULT TO DETERMINE 
         MOV       E,A              VALUE OF Y AXIS PLOTTING, 
         MOV       D,B                AND LOAD FOR STORE. 
         JM        CH.PLOT3       IF RESULT IS POSITIVE 
         INR       D                CLEAR UPPER BYTE. 
CH.PLOT3 EQU       $
         XCHG                     STORE RESULT FOR
         SHLD      Y.PLOT           Y AXIS CHARACTER PLOTTING.
         RET
* 
*        THIS INSTRUCTION PERFORMS THE FOLLOWING FOUR FUNCTIONS 
* 
*        1.  INHIBIT TOUCH PANEL IF INHIBIT BIT IS SET
*        2.  LOAD WORD COUNT IF WORD COUNT ENABLE BIT IS SET
*        3.  BULK ERASE IF BULK ERASE BIT IS SET
*        4.  LOAD MODE WORD 
* 
************************************************************************
* 
*                  MODE SELECTION 
* 
*        BIT 1  BULK ERASE
* 
*        BIT 3  BIT 2 
*         0      0   ERASE   WRITE CHARACTER BACKGROUND 
*         0      1   WRITE   ERASE CHARACTER BACKGROUND 
*         1      0   ERASE   NO OPERATION 
*         1      1   WRITE   NO OPERATION 
* 
*        BIT 6  BIT 5  BIT 4
*         0      0      0         MODE 0  POINT PLOT
*         0      0      1         MODE 1  DRAW LINE 
*         0      1      0         MODE 2  LOAD MEMORY 
*         0      1      1         MODE 3  CHARACTER 
*         1      0      0         MODE 4  BLOCK ERASE 
*         1      0      1         MODE 5  USER PROGRAM
*         1      1      0         MODE 6  USER PROGRAM
*         1      1      1         MODE 7  USER PROGRAM
* 
*        BIT 7-13  WORD COUNT 
* 
*        BIT 14    LOAD WORD COUNT
* 
*        BIT 15    INHIBIT
* 
************************************************************************
MODESET  EQU       $
         MOV       A,L
         ANI       #07
         OUT       DISCHAN*32+DISCON2  OUTPUT DISPLAY CONTROL 2 
         ANI       06             SAVE WRITE ERASE BITS 
         MOV       B,A              IN B REG. 
         LDA       D.CNTL2        LOAD DISPLAY CONTROL 2
         ANI       #60              AND MASK ORIENTATION BITS.
         ORA       B              ADD WRITE ERASE BITS
         STA       D.CNTL2          AND STORE FOR CHARACTER GENERATOR 
* 
         MVI       A,#3E      MASK MODE AND 
         ANA       L                 W/E BITS 
         RRC
         STA       M.MODE           AND STORE.
         RET
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
OUTX     EQU       $
         MVI       A,01           CHOP OFF UNWANTED 
         ANA       H                BITS THAT WILL
         MOV       H,A                SCREW THINGS UP.
         SHLD      XREG           STORE NEW X COORDINATE. 
         MOV       A,L            LOAD LOWER 8 BITS 
         OUT       DISCHAN*32+XCOORD  ND OUTPUT TO DISPLAY. 
         IN        DISCHAN*32+XYREAD  PUT UPPER BITS OF X AND Y 
         ANI       02                MASK Y 
         ORA       H                 INCLUDE NEW X BIT
         ORI       04                  SET LOAD ENABLE
         OUT       DISCHAN*32+DISCON1  OUTPUT UPPER BITS OF X AND Y.
         RET                      RETURN TO CALLER
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        SUBROUTINE TO OUTPUT Y COORDINATE TO THE DISPLAY.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
OUTY     EQU       $
         MVI       A,01           CHOP OFF UNWANTED 
         ANA       H                BITS THAT WILL
         MOV       H,A                SCREW THINGS UP.
         SHLD      YREG           STORE NEW Y COORDINATE. 
         MOV       A,L            LOAD LOWER 8 BITS 
         OUT       DISCHAN*32+YCOORD  ND OUTPUT TO DISPLAY. 
         IN        DISCHAN*32+XYREAD  NPUT CURRENT UPPER BITS 
         ANI       01                MASK X COORDINATE BIT
         RRC                           SHIFT IN 
         ORA       H                   NEW Y BIT
         RLC
         ORI       04                  SET LOAD ENABLE BIT
         OUT       DISCHAN*32+DISCON1  OUTPUT NEW UPPER BITS
         RET                      RETURN TO CALLER. 
* * * * * * * * * * 
* 
*        OUTPUT X AND Y COORDINATES 
*                  Y COORDINATE  DE REGISTER PAIR 
*                  X COORDINATE  HL REGISTER PAIR 
* 
* * *@*@  * * * * * * * 
OUTCOORD EQU       $
         CALL      OUTX           SET X COORDINATE
         XCHG 
         JMP       OUTY           SET Y COORDINATE
* * * * * * * * * * 
* 
*        USED TO CALL A ROUTINE WITH CONTENTS OF HL REGISTER
* 
* * * * * * * * * * 
* 
INDIRECT EQU       $
         PCHL 
* 
*** 
*        1.0       GENERAL- 
* 
*                  RIST - RESIDENT DIAGNOSTIC FOR INFORMATION SYSTEMS 
*                            TERMINAL (IST) 
* 
*                  COPYRIGHT CONTROL DATA CORP., 1975 
* 
*                  M.C. FEGELY
*                  SUPAL ASSEMBLY LANGUAGE
*                  FIELD DIAGNOSTIC 
* 
*        2.0       PURPOSE- 
* 
*                  THIS DIAGNOSTIC WILL VERIFY CORRECT OPERATION OF THE 
*                  SUB-MINI CONTROLLER (SMC) AND THE IST TERMINAL.  THE 
*                  TESTING WILL PERFORM A COMMAND TEST
*                  TEST THE DISPLAY INTERFACE, TEST THE 
*                  KEYBOARD AND TOUCH PANEL.
* 
*        3.0       APPLICABLE DOCUMENTS 
* 
*                  16031600   PROCESSOR MODULE SPECIFICATION
*                  -          IST DIAGNOSTIC PLAN 
*                  ARH750   - EXTERNAL REFERENCE SPECIFICATION - SUPAL
*                                ASSEMBLER
*                  -          INTEL 8080 PROGRAMMING MANUAL 
*                  16040600   EXTERNAL SPECIFICATION - INFORMATION
*                                SYSTEMS TERMINAL (REV. C)
*                  62964500   QLIA - QUICKLOOK CONFIDENCE TEST FOR
*                                THE SMC (SUB-MINI CONTROLLER) - ERS
* 
* 
*        4.0       REQUIREMENTS 
* 
*        4.1       HARDWARE-
* 
*                  IST CONFIGURATION: 
* 
*                  PROCESSOR MODULE 
*                  16K RAM BOARD
*                  ROM MODULE (6K)
*                  DISPLAY INTERFACE
*                  MAINTENANCE PANEL FOR EXECUTION SELECTION AND
*                     DISPLAYING OF ERRORS
*                  KEYBOARD/TOUCH PANNEL
* 
*        4.2       SOFTWARE-
* 
*                  THE DIAGNOSTIC WILL TEST THE HARDWARE OF THE IST 
*                  TERMINAL. IF AN ERROR OCCURS, THE ERROR
*                  CODE WILL BE DISPLAYED ON THE
*                  MAINENANCE PANEL LEDS. 
* 
*                  UPON SUCCESSFUL EXECUTION OF THE RESIDENT DIAGNOSTIC,
*                  CONTROL WILL BE GIVEN TO THE CONTROLWARE.
* 
*        4.3       ACCESORIES-
* 
*                  NONE 
* 
*        4.4       TIME LIMIT 
* 
*                  EXECUTION TIME SHALL NOT EXCEED 1 MIN. EXCLUDING 
*                  THE MANUAL INTERVENTION SECTION (SEC. 4 - KEYBOARD/
*                  TOUCH PANEL TEST). 
* 
*        4.5       DETECTION/ISOLATION
* 
*                  THE DETECTION LEVEL WILL BE 95 PER CENT.  THE
*                  ISOLATION WILL BE 90 PER CENT. 
* 
*        5.0       OPERATIONAL PROCEDURE- 
* 
*        5.1       LOADING- 
* 
*                  NO LOADING IS REQUIRED IN THAT THE DIAGNOSTIC
*                  RESIDES IN ROM.
* 
*        5.2       PARAMETERS-
* 
*                  MAINTENANCE SWITCHES MAY BE SELECTED AS DESCRIBED
*                  IN 5.4 (EXECUTION) BELOW.
* 
*                  SWITCH SUMMARY 
* 
*                  SWITCH 1  OFF - EXECUTE DIAGNOSTIC 
*                            ON  - BYPASS DIAGNOSTIC
* 
*                  SWITCH 2 OFF - 300 BAUD
*                           ON  - 1200 BAUD 
* 
*                  SWITCH 3  OFF - BYPASS KYBD-TOUCH PANEL SECTION
*                            ON  - EXECUTE KYBD-TOUCH PANEL SECTION 
* 
*                  SWITCH 4  OFF - DO NOT LOOP DIAGNOSTIC 
*                            ON  - LOOP ENTIRE DIAGNOSTIC 
* 
*                  SWITCH 5  OFF - CHECK KYBD ONLY
*                            ON  - CHECK KYBD AND TOUCH PANEL 
* 
*        5.3       SECTION DESCRIPTION INDEX- 
* 
*                  SECTION 1           COMMAND TEST 
*                  SECTION 3           DISPLAY INTERFACE TEST 
*                  SECTION 4           KEYBOARD/TOUCH PANEL TEST
* 
*        5.4       EXECUTION- 
* 
*                  THERE ARE TWO (2) WAYS TO EXECUTE THE RESIDENT 
*                  DIAGNOSTIC:  
*                     1) POWER-ON 
*                     2) MASTER CLEAR 
* 
*                  TO BY-PASS THE RESIDENT TEST COMPLETLY, SET SWITCH 1 
*                  ON THE MAINTENANCE SWITCHES BEFORE MASTER CLEAR. 
* 
* 
*                  TO EXECUTE THE KEYBOARD-TOUCH PANEL TEST, SET
*                  SWITCHES 3,5 ON THE MAINTENANCE SWITCHES 
*                  SET SWITCH 3 ONLY TO BYPASS THE TOUCH PANEL
* 
*        6.0       OPERATOR COMMUNICATION-
* 
*        6.1       ERRORS AND RESPONSES-
* 
*                  WHEN AN ERROR IS ENCOUNTERED, THE RESIDENT TEST
*                  WILL EXECUTE A HALT INSTRUCTION.  ERROR CODES WILL 
*                  BE DISPLAYED ON THE MAINTENANCE PANEL LEDS WHICH 
*                  WILL INDICATE WHICH BOARD IS BELIEVED TO BE BAD
*                  VIA THE MOST SIGNIFICANT DIGIT OF THE ERROR CODE 
*                  DESCRIBED BELOW INDICATING THE LOCATION OF THE 
*                  BOARD BELIEVED TO BE BAD.
* 
*                  OCTAL CODE FAILURE 
*                                                       ADDRESS 
*                                                        RANGE
* 
*                      30      COMMAND FAILURE
* 
* 
*                      42      TOUCH PANEL ERROR
* 
*                      70      DISPLAY INTERFACE ERROR
*                      71      KEYBOARD ERROR 
* 
*                      77      INDICATES TERMINATION OF THE DIAGNOSTIC
* 
*E
*        7.0       DESCRIPTION
* 
*        7.1       GENERAL
* 
*                  THIS PROGRAM CONSISTS OF 3 SECTIONS OF 
*                  RESIDENT DIAGNOSTICS.  THE TESTING 
*                  INCLUDES THE COMMAND REPERTOIRE, 
*                  DISPLAY INTERFACE TEST, KEYBOARD AND 
*                  TOUCH PANEL TESTS. 
*        7.2       SECTION 1 COMMAND TEST 
* 
*                  THIS SECTION WILL EXECUTE ALL OF THE COMMAND 
*                  REPERTOIRE OF THE SUB-MINI CONTROLLER EXCLUDING THE
*                  EIN,DIN,RST,HLT INSTRUCTIONS.  THE TESTING OF THE
*                  INSTRUCTIONS IS BASIC AND DOES NOT DIAGNOSE THE
*                  SETTING OR CLEARING OF ALL POSSIBLE FLAG CONDITIONS
*                  FOR A PARTICULAR INSTRUCTION.
* 
*                  ERROR CODES ARE: 
*                     30   COMMAND FAILURE
* 
*E
*        7.3       SECTION 2 DISPLAY INTERFACE TEST 
* 
*                  THIS SECTION PERFORMS A BASIC CHECK ON THE DISPLAY 
*                  INTERFACE TEST.  THE DISPLAY INTERFACE MODULE
*                  CONTAINS TWO REGISTERS, ONE FOR THE X-COORDINATE 
*                  AND ONE FOR THE Y-COORDINATE.  THESE REGISTERS CAN 
*                  BE LOADED, INCREMENTED AND DECREMENTED, AND
*                  READ VIA ISSUING FUNCTION COMMANDS TO THE MODULE.
*                  THE FOLLOWING TYPE OF CHECKS SHALL BE MADE IN THIS 
*                  SECTION CONSISTING OF THREE DISTINCT CONDITIONS: 
* 
*                  1) LOAD X AND Y REGISTERS, READ BACK AND COMPARE 
* 
*                     OUTPUT - CH=4,DV=0,FN=7  (BULK ERASE, WRITE/ERASE)
*                   * OUTPUT -          ,FN=4  (X COOR.)
*                   * OUTPUT -          ,FN=5  (Y COOR.)
*                   * OUTPUT -          ,FN=6  (X/Y 2-8)
*                   * INPUT -           ,FN=0  (X COOR.)
*                   * INPUT -           ,FN=1  (Y COOR.)
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                        ... CONTINUE THRU DATA TABLE - DEFINED IN SEC 2
* 
* 
* 
* 
*                  2) INCREMENT/DECREMENT X,Y REGISTERS IN VECTOR MODE
* 
*                                  C
*                         <.................
*                         .              .>.
*                         .             .  .
*                         .      F  .      .
*                         .      .    .    .
*                       D .   .     .E     . B
*                         .<      .        .
*                         .     .          .
*                         .   .            .
*                         . .              .
*                         .................>
*                                  A
* 
* 
*                  MOVE TO LOWER LEFT CORNER
* 
*                     OUTPUT - CH=4,DV=0,FN=7  (BULK ERASE, WRITE/ERASE)
*                     OUTPUT -          ,FN=4  (X COOR. = 00) 
*                     OUTPUT -          ,FN=5  (Y COOR. = 00) 
* 
* 
*                  A) OUTPUT -          ,FN=6  (Y SHT VTR,X/Y 2-8,INC X,
*                                                  VECTOR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=00) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                         ... CONTINUE TO END OF VECTOR 
* 
* 
*                  B) OUTPUT -          ,FN=6  (X SHT VTR, INC Y, 
*                                                  VECTOR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=00) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                         ... CONTINUE TO END OF VECTOR 
* 
* 
*                  C) OUTPUT -          ,FN=6  (Y SHT VTR, DEC X, 
*                                                  VECTOR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=00) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                         ... CONTINUE TO END OF VECTOR 
* 
* 
*                  D) OUTPUT -          ,FN=6  (X SHT VTR, DEC Y, 
*                                                  VECTOR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=00) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                         ... CONTINUE TO END OF VECTOR 
* 
* 
*                  E) OUTPUT -          ,FN=6  (Y SHT VTR,INC,X,INC Y,
*                                                 VECTOR MODE)
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=80) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
* 
*                  F) OUTPUT            ,FN=6  (Y SHT VTR,DEC X,VTR MODE
*                                               DEC Y EVERY OTHER TIME) 
*                   * OUTPUT -          ,FN=3  (DATA) VECTOR BIT (A=80) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
* 
* 
* 
*                  3) INCREMENT/DECREMENT X,Y REGISTERS IN CHARACTER
*                        MODE.
* 
* 
* 
*                  MOVE TO LOWER LEFT 
* 
*                     OUTPUT -          ,FN=4  (X COOR. = 00) 
*                     OUTPUT -          ,FN=5  (Y COOR. = 00) 
* 
*                  A) OUTPUT -          ,FN=6  (X/Y 2-8,INC X,CHAR MODE)
*                     OUTPUT -          ,FN=7  (BULK ERASE, 90 DEG ORNT,
*                                                  WRITE/ERASE) 
*                   * OUTPUT -          ,FN=3  (DATA) CHAR BIT (A=01) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
* 
*                  B) OUTPUT -          ,FN=7  (NORMAL ORNT,WRITE/ERASE)
*                     OUTPUT -          ,FN=6  (INC Y, CHAR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) CHAR BIT (A=01) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
* 
*                  C) OUTPUT -          ,FN=7  (90 DEG ORNT,WRITE/ERASE)
*                     OUTPUT -          ,FN=6  (DEC X, CHAR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) CHAR BIT (A=01) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
* 
*                  D) OUTPUT -          ,FN=7  (NORMAL ORNT,WRITE/ERASE)
*                     OUTPUT -          ,FN=6  (DEC Y, CHAR MODE) 
*                   * OUTPUT -          ,FN=3  (DATA) CHAR BIT (A=01) 
*                   * INPUT -           ,FN=0  (X REG)
*                           COMPARE 
*                   * INPUT -           ,FN=1  (Y REG)
*                           COMPARE 
*                   * INPUT -           ,FN=2  (X/Y 2-8)
*                           COMPARE 
*                        ... CONTINUE TO END OF VECTOR
* 
*                  ERROR CODES ARE: 
*                     70   DISPLAY INTERFACE ERROR
* 
* 
*E
*        7.6       SECTION 4 - KEYBOARD/TOUCH PANEL TEST
* 
*                  THIS SECTION PERFORMS A BASIC CHECK ON THE KEYBOARD
*                  AND TOUCH PANEL BY INPUTTING THE CODE AFTER A
*                  CHARACTER READY HAD BEEN DETECTED.  THE CODE IS THEN 
*                  DISPLAYED ON THE LEDS LOCATED ON THE MAINTENANCE 
*                  PANEL.  THIS SECTION OF THE TEST WILL BE BY-PASSED 
*                  IF SWITCH 3 OF THE MAINTENANCE SWITCHES IS OFF.
*                  IF SWITCH 5 IS OFF ONLY THE KEYBOARD WILL BE CHECKED.
* 
* 
*                  1. CHECK IF SWITCH 3 IS SET ON MAINT PANEL 
*                  2. IF NOT, THEN EXIT SECTION 
*                  3. IF SWITCH 5 IS OFF  CONTINUE AT STEP 7
*                     ELSE STATUS TOUCH PANEL 
*                     IF NO CHAR ROY, THEN CONTINUE AT STEP 7 
*                  4. ELSE INPUT TOUCH PANEL X,Y DATA 
*                  5. DISPLAY SAME DATA VIA CONTROLWARE ON DISPLAY
*                  6. CONTINUE AT STEP 3
*                  7. STATUS KEYBOARD 
*                     IF NO CHAR ROY, THEN CONTINUE AT STEP 3 
*                  8. ELSE INPUT KEYBOARD DATA
*                  9. DISPLAY KYEBOARD DATA AS TWO (2) HEX DIGITS VIA 
*                     CONTROLWARE ON DISPLAY
*                  10. IF KEYBOARD DATA IS A SHIFT/STOP CODE
*                      THEN EXIT SECTION (EXIT DIAGNOSTIC)
*                  11. ELSE CONTINUE AT STEP 3
* 
*                  ERROR CODES ARE: 
*                     42   TOUCH PANEL ERROR
*                     71   KEYBOARD ERROR 
* 
*E
*        7.7       END OF DIAGNOSTIC
* 
*                  CODE 77 IS DISPLAYED ON MAINTENANCE PANEL LEDS 
*                  INDICATING COMPLETION OF DIAGNOSTIC. 
* 
*                  CONTROL IS THEN GIVEN TO CONTROLWARE WHICH WILL
*                  BEGIN BY INDICATING TERMIANL IS READY ON DISPLAY.
* 
RST.SEC0 EQU       $
         IN        RSF.PANL*32+PANLSWCH 
         ANI       RSM.EXIT       CHECK FOR EXIT DIAG.
         JNZ       RST.DONE       SET, EXIT DIAGNOSTICS 
          JMP    RST.S000    DO ROM/RAM TESTS 
*        RST.VXY   VERIFY X,Y REGISTERS 
* 
*        ENTRY     BY CALL FROM SECTION THREE 
* 
*        CALLS     NONE 
* 
*        ALTERS    A,B,C REGISTERS
* 
*        EXIT      BY RETURN TO CALLER
* 
*        ERRORS REPORTED
*                  NONE 
RST.VXY  SHLD      RSV.SRAM       SAVE HL 
         XCHG 
         SHLD      RSV.SRAM+2     SAVE DE 
         POP       H              GET RETURN ADDRESS
         POP       D              GET X COR 
         POP       B              GET Y COR 
         IN        RSF.DISP*32+DISPXREG 
         CMP       E              COMPARE X COR 0-7 
         JZ        RST.VXY2 
         HLT                      ERROR HALT
RST.VXY2 IN        RSF.DISP*32+DISPYREG 
         CMP       C              COMPARE Y COR 0-7 
         JZ        RST.VXY4 
         HLT                      ERROR HALT
RST.VXY4 PUSH      B              RESTORE Y 
         PUSH      D              RESTORE X 
         PUSH      H              RESTORE RETURN ADDRESS
         MOV       A,B
         ANI       1              SAVE Y COR 2**8 
         RLC
         MOV       B,A
         MOV       A,D
         ANI       1              SAVE X COR 2**8 
         ORA       B
         MOV       B,A            SAVE EXPECTED XY 2**8 
         LHLD      RSV.SRAM+2 
         XCHG                     RESTORE DE
         LHLD      RSV.SRAM       RESTORE HL
         IN        RSF.DISP*32+DISPXY28 
         ANI       3
         CMP       B              COMPARE XY 2**8 
         RZ                       RETURN IF EQUAL 
         HLT                      ERROR HALT
RST.DATT DB        #04,#00
         DB        #84,#01
         DB        #84,#02
         DB        #84,#04
         DB        #84,#08
         DB        #84,#10
         DB        #84,#20
         DB        #84,#40
         DB        #84,#80
         DB        #85,#00
         DB        #86,#00
         DB        #07,#FF
         DB        #04,#00
         DB        #85,#55
         DB        #86,#AA
         DB        #04,#00
RST.MSG  DB        #14,#22,#0B,#0D,#36,#1D,#19,#36,#1D,#0E,#1C,#1D
RST.CON1 DB        255
RST.CON2 DB        1,0
RST.CON3 DB        255
RST.CON4 DB        0,0
RST.TPAL LXI       H,40           OUTPUT X,Y = 1,15 
         LXI       D,488          TO ALLIGN 
         MVI       C,#1F          TOUCH PANEL 
         CALL      RST.OCHR 
         LXI       H,296          OUTPUT X,Y = 9,7
         LXI       D,232
         MVI       C,#97
         CALL      RST.OCHR 
         LXI       H,456          OUTPUT X,Y = 14,0 
         LXI       D,8
         MVI       C,#E0
         CALL      RST.OCHR 
         RET
INDI.1   JMP       INIT.PLT       INDIRECT TO INITIALIZE CHARACTER PLOT.
INDI.2   JMP       OUTCOORD       INDIRECT TO OUTPUT COORDINATES. 
INDI.3   JMP       CHAREN         INDIRECT TO CHARACTER GENERATOR.
          DB     #00,#00,#00,#00
          DB     #00,#00,#00
          EJECT 
**
*E
*        RST.SEC1  COMMAND TEST 
* 
*        ENTRY     CONTROL IS GIVEN TO SECTION ONE UPON 
*                  COMPLETION OF SECTION ZERO.
* 
*        CALLS     NONE 
* 
*        ALTERS    ALL REGISTERS
* 
*        EXIT      TO RST.SEC3 UPON COMPLETION
* 
*        ERRORS REPORTED (OCTAL CODE) 
* 
*                  30 - COMMAND FAILURE 
RST.SEC1 MVI       A,#18
         OUT       RSF.PANL*32+PANLDATA  UT ERROR CODE FOR COMMAND FAIL 
         MVI       A,#55          A=55
         MOV       B,A            LOAD ALL REGISTERS FROM A 
         MOV       C,A
         MOV       D,A
         MOV       E,A
         MOV       H,A
         MOV       L,A
         RLC                      A=AA
         ORA       B              A=FF
         XRA       C              A=AA
         ANA       D              A=00
         SUB       E              A=AB
         XRI       #AB            A=00
         INR       H              H=56
         DCR       L              L=54
         ADD       H              A=56
         ADD       L              A=AA
         ADI       #55            A=FF
         SUI       #AA            A=55
         ORI       #22            A=77
         ANI       #AA            A=22
         XRI       #22            A=0 
         STC                      SET CARRY 
         ACI       #0E            A=0F
         CMA                      A=F0
         RRC                      A=78  CARRY=0 
         CMC                      CARRY=1 
         ADC       B              A=CE
         CMC                      CARRY=1 
         SBB       B              A=78
         CMC                      CARRY=1 
         SBI       #07            A=70
         CMC                      CARRY=1 
         RAR                      A=B8  CARRY=0 
         RAL                      A=70  CARRY=1 
         NOP
         JC        RST.S105       IF CARRY NOT SET  REPORT ERROR
* 
*                  ERROR 50 - COMMAND FAILURE 
* 
         HLT                      ERROR HALT
RST.S105 CPI       #70
         JZ        RST.S110 
         HLT                      ERROR HALT
RST.S110 MVI       A,#EE
         STA       RST.CON5 
         MVI       B,#EE
         LXI       H,RST.CON5+1 
         MOV       M,B
         CMP       M              VERIFY B STORED CORRECTLY 
         JZ        RST.S112 
         HLT                      ERROR HALT
RST.S112 LDA       RST.CON5 
         CPI       #EE            VERIFY A STORED CORRECTLY 
         JZ        RST.S114 
         HLT                      ERROR HALT
RST.S114 LXI       B,RST.CON1 
         LXI       H,RST.CON3 
         LXI       SP,RST.STAK
         LDAX      B
         CMP       M
         JZ        RST.S116 
         HLT                      ERROR HALT
RST.S116 LHLD      RST.CON1       LOAD HL 
         SHLD      RST.CON5       STORE HL INTO MEMORY
         PUSH      H              STORE HL INTO STACK 
         LXI       H,RST.STAK     LOAD HL WITH STACK ADDRESS
         SPHL 
         DCX       SP             DECREMENT SP
         DCX       SP             DECREMENT SP
         DCX       SP             DECREMENT SP
         INX       SP             INCREMENT SP
         POP       D              LOAD DE FROM STACK
         LDA       RST.CON5 
         CMP       E
         JZ        RST.S118 
         HLT                      ERROR HALT
RST.S118 LDA       RST.CON5+1 
         CMP       D
         JZ        RST.S120 
         HLT                      ERROR HALT
RST.S120 LXI       H,#AAAA        LOAD HL 
         LXI       D,#5555        LOAD DE 
         PUSH      D              STORE DE INTO STACK 
         XTHL                     EXCHANGE STACK AND HL 
         POP       D
         MOV       A,D
         CPI       #AA            VERIFY EXCHANGE 
         JZ        RST.S122 
         HLT                      ERROR HALT
RST.S122 MOV       A,H
         CPI       #55            VERIFY EXCHANGE 
         JZ        RST.S124 
         HLT                      ERROR HALT
RST.S124 LHLD      RST.CON2       LOAD HL FROM MEMORY  HL=0001
         LXI       D,#0001
         DAD       D              HL=0002 
         INX       H              HL=0003 
         MOV       A,H
         CPI       0              VERIFY H=0
         JZ        RST.S126 
         HLT                      ERROR HALT
RST.S126 MOV       A,L
         CPI       3              VERIFY L=3
         JZ        RST.S128 
         HLT                      ERROR HALT
RST.S128 LXI       H,#0001        HL=0001 
         SHLD      RST.CON6       STORE HL INTO MEMORY
         LXI       H,RST.CON6     SET HL TO ADDRESS 
         MVI       A,0
         ADD       M              A=1 
         STC
         ADC       M              A=3 
         INR       M              MEMORY = 2
         SUB       M              A=1 
         DCR       M
         DCR       M              MEMORY=0
         STC
         SBB       M              A=0 
         ADI       #0F            A=0F
         ORA       M              A=0F
         MVI       M,#01          MEMORY=1
         ANA       M              A=1 
         XRA       M              A=0 
         CPI       0              VERIFY A = 0
         JZ        RST.SEC3 
         HLT                      ERROR HALT
*                                 EXIT SECTION ONE
*        RST.SEC3  DISPLAY INTERFACE TEST 
* 
*        ENTRY     CONTROL IS GIVEN TO SECTION THREE UPON 
*                  COMPLETION OF SECTION ONE
* 
*        CALLS     RST.VXY        VERIFY X,Y REGISTERS
* 
*        ALTERS    ALL REGISTERS
* 
*        EXIT      TO RST.SEC4 UPON COMPLETION
* 
*        ERRORS REPORTED (OCTAL CODE) 
* 
*                  70 - DISPLAY INTERFACE ERROR 
RST.SEC3 MVI       A,#38          ERROR CODE FOR DISPLAY TEST 
         OUT       RSF.PANL*32+PANLDATA 
* 
*        CONDITION 1
* 
         MVI       A,#03          BULK ERASE, WRITE/ERASE 
         OUT       RSF.DISP*32+DISPCON2 
         LXI       H,RST.DATT     SET UP TABLE POINTER
         MVI       E,16           SET UP COUNTER
RST.S305 MOV       B,M            DO UNTIL COUNTER=0
         INX       H
         MOV       C,M                 FORM X COR IN BC 
         INX       H
         LXI       SP,RST.STAK         SET STACK POINTER
         PUSH      B                   SAVE Y COR IN STACK
         PUSH      B                   SAVE X COR IN STACK
         MOV       A,C
         OUT       RSF.DISP*32+DISPXCOR  TPUT XCOR 0-7
         OUT       RSF.DISP*32+DISPYCOR  TPUT YCOR 0-7
         MOV       A,B
         ANI       1                   SAVE XCOR 2**8 
         MOV       B,A
         RLC
         ORA       B
         ADI       #04                 FORM - ENABLE XY 2**8 LOAD 
         OUT       RSF.DISP*32+DISPCON1 
         CALL      RST.VXY             GO VERIFY XY 
         DCR       E                   UPDATE COUNTER 
         JNZ       RST.S305       END DO
* 
*        CONDITION 2
* 
         MVI       A,#03          BULK ERASE, WRITE/ERASE 
         OUT       RSF.DISP*32+DISPCON2 
         LXI       H,0
         PUSH      H              STORE Y COR 
         PUSH      H              STORE X COR 
         MVI       A,#A4          VECTOR,Y=SHORT,INC X,LOAD XY
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S310 MVI       A,0            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT INC X COMMAND 
         POP       D                   GET X COR
         INX       D                   UPDATE 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S310       END DO
         MVI       A,#80          VECTOR,X=SHORT,INC Y
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S315 MVI       A,0            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT INC Y COMMAND 
         POP       D                   GET X COR
         POP       B                   GET Y COR
         INX       B                   MODIFY Y 
         PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE    COUNTER
         MOV       A,H
         ORA       L
         JNZ       RST.S315       END DO
         MVI       A,#A8          VECTOR,Y=SHORT,DEC X
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S320 MVI       A,0            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT DEC X COMMAND 
         POP       D                   GET X COR
         DCX       D                   MODIFY 
         PUSH      D                   SAVE 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H
         MOV       A,H
         ORA       L
         JNZ       RST.S320       END DO
         MVI       A,#90          VECTOR,X=SHORT,DEC Y
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S325 MVI       A,0            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT DEC Y COMMAND 
         POP       D                   GET X COR
         POP       B                   GET Y COR
         DCX       B                   MODIFY Y 
         PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S325       END DO
         MVI       A,#A0          VECTOR,Y=SHORT,INC X,INC Y
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S330 MVI       A,#80          DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT INC X, INC Y COMMAND
         POP       D                   GET X COR
         POP       B                   GET Y COR
         INX       D
         INX       B
         PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S330       END DO
         MVI       A,#B8          VECTOR,Y=SHORT,DECX,(DEC Y) 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S335 MOV       A,L            DO UNTIL COUNTER=0
         ANI       1
         RRC                           FORM DATA OUTPUT CONTROL 
         OUT       RSF.DISP*32+DISPDATA 
         POP       D                   GET X COR
         POP       B                   GET Y COR
         DCX       D                   MODIFY X COR 
         JNC       RST.S340 
         DCX       B                   CONDITIONALLY MODIFY Y 
RST.S340 PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   MODIFY COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S335       END DO
* 
*        CONDITION 3
* 
         MVI       A,0
         OUT       RSF.DISP*32+DISPXCOR  UT XCOR=0
         OUT       RSF.DISP*32+DISPYCOR  UT YCOR=0
         MVI       A,#43          BULK ERASE, WRITE/ERASE, 90 DEG 
         OUT       RSF.DISP*32+DISPCON2 
         MVI       A,#04          CHAR, INC X, LOAD XY 2**8 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,0
         PUSH      H              INIT. Y COR 
         PUSH      H              INIT. X COR 
         LXI       H,511          SET UP COUNTER
RST.S345 MVI       A,1            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT INC X COMMAND 
         POP       D                   GET X COR
         INX       D                   UPDATE 
         PUSH      D                   SAVE X COR 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S345       END DO
         MVI       A,#62          WRITE/ERASE, NORMAL 
         OUT       RSF.DISP*32+DISPCON2 
         MVI       A,#00          CHAR, INC Y 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S350 MVI       A,1            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT INC Y COMMAND 
         POP       D                   GET X COR
         POP       B                   GET Y COR
         INX       B                   UPDATE Y 
         PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S350       END DO
         MVI       A,#42          WRITE/ERASE, 90 DEG 
         OUT       RSF.DISP*32+DISPCON2 
         MVI       A,#08          CHAR, DEC X 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S355 MVI       A,1            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT DEC X COMMAND 
         POP       D                   GET X COR
         DCX       D                   UPDATE 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S355       END DO
         MVI       A,#62          WRITE/ERASE, NORMAL 
         OUT       RSF.DISP*32+DISPCON2 
         MVI       A,#10          CHAR, DEC Y 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S360 MVI       A,1            DO UNTIL COUNTER=0
         OUT       RSF.DISP*32+DISPDATA  TPUT DEC Y COMMAND 
         POP       D                   GET X COR
         POP       B                   GET Y COR
         DCX       B                   MODIFY Y 
         PUSH      B                   SAVE Y 
         PUSH      D                   SAVE X 
         CALL      RST.VXY             GO VERIFY XY 
         DCX       H                   UPDATE COUNTER 
         MOV       A,H
         ORA       L
         JNZ       RST.S360       END DO
*                                 EXIT SECTION THREE
**
*E
*        RST.SEC4  KEYBOARD - TOUCH PANEL TEST
* 
*        ENTRY     CONTROL IS GIVEN TO SECTION FOUR UPON
*                  COMPLETION OF SECTION THREE
* 
*        CALLS     RST.OCHR       OUTPUT CHAR. TO CONTROLWARE 
* 
*        ALTERS    ALL REGISTERS
*                  MODE           FLAG IN CONTROLWARE 
* 
*        EXIT      TO RST.EXIT UPON COMPLETION
* 
*        ERRORS REPORTED
* 
*                  42 - TOUCH PANEL ERROR 
*                  71 - KEYBOARD ERROR
RST.SEC4 IN        RSF.PANL*32+PANLSWCH 
         ANI       RSM.SEC4       CHECK FOR BYPASS OF SECTION 
         JZ        RST.EXIT       IF NOT SET - BYPASS SECTION 
         LXI       SP,IST.STK     INITIALIZE STACK POINTER. 
         MVI       A,0            OUTPUT X-YCORDS 
         OUT       RSF.DISP*32+DISPXCOR 
         OUT       RSF.DISP*32+DISPYCOR 
         MVI       A,#A4          VECTOR Y%SHORT LOAD XY 2**8 
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511          SET UP COUNTER
RST.S430 MVI       A,#80          DO UNTIL COUNTER = 0
         OUT       RSF.DISP*32+DISPDATA  C X - INC Y COMMAND
         DCX       H
         MOV       A,H
         ORA       L
         JNZ       RST.S430       END DO
         MVI       A,0
         OUT       RSF.DISP*32+DISPXCOR 
         MVI       A,#FF
         OUT       RSF.DISP*32+DISPYCOR 
         MVI       A,#B6
         OUT       RSF.DISP*32+DISPCON1 
         LXI       H,511
RST.S440 MVI       A,#80
         OUT       RSF.DISP*32+DISPDATA 
         DCX       H
         MOV       A,H
         ORA       L
         JNZ       RST.S440 
          CALL   INIT.PLT    INITIALIZE FOR CHARACTER PLOT
         LXI       H,208          LOAD X COORDINATE 
         LXI       D,80           LOAD Y COORDINATE.
          CALL   OUTCOORD    SET DISPLAY COORDINATES
         MVI       D,12 
         LXI       H,RST.MSG           GET ADDRESS OF MSG 
RST.S402 PUSH      H                   SAVE HL
         PUSH      D                   SAVE DE
         MOV       A,M                 GET NEXT CODE
         CALL      RST.OUT             OUTPUT TO FIRMWARE 
         POP       D                   RESTORE DE 
         POP       H                   RESTORE HL 
         INX       H                   UPDATE INDEX 
         DCR       D                   UPDATE COUNTER 
         JNZ       RST.S402            LOOP FOR COMPLETE TABLE
         CALL      RST.TPAL 
RST.S404 IN        RSF.PANL*32+PANLSWCH  PUT SWITCHES 
         ANI       RSM.TOCH            CHECK FOR TOUCH PANEL PRESENT
         JZ        RST.S420            JUMP IF NOT
RST.S405 MVI       A,#22               OUTPUT TOUCH PANEL ERROR CODE
         OUT       RSF.PANL*32+PANLDATA 
         IN        RSF.TOCH*32+TOCHSTAT  PUT TOUCH PANEL STATUS 
         ANI       1                   CHECK FOR CHAR RDY 
         JZ        RST.S420            JUMP IF NOT
         IN        RSF.TOCH*32+TOCHDATA  PUT DATA (X,Y) 
         MOV       C,A                 SAVE DATA IN C 
         LXI       H,244
         LXI       D,32 
         CALL      RST.OCHR            GO TO OUTPUT SUBROUTINE
         MVI       A,#1D
         CALL      RST.OUT             OUTPUT -T- FOR TOUCH PANEL 
         JMP       RST.S405            LOOP 
RST.S420 MVI       A,#39               OUTPUT KYBD ERROR CODE 
         OUT       RSF.PANL*32+PANLDATA 
         IN        RSF.KYBD*32+KYBDSTAT  PUT KYBD STATUS
         ANI       1                   CHECK FOR CHAR RDY 
         JZ        RST.S404            JUMP IF NOT SET
         IN        RSF.KYBD*32+KYBDDATA  PUT DATA (KYBD CODE) 
         CMA
         ANI       #7F
         MOV       C,A                 SAVE IN C
         CPI       #3A                 CHECK FOR SHIFT-STOP 
         JZ        RST.EXIT            IF MATCH  EXIT SECTION 
         LXI       H,244
         LXI       D,32 
         CALL      RST.OCHR            GO TO OUTPUT SUBROUTINE
         MVI       A,#14
         CALL      RST.OUT             OUTPUT -K- FOR KYBD
         MOV       A,C                 GET DATA 
         JMP       RST.S404 
         EJECT
**
*E
*        RST.EXIT  DIAGNOSTIC EXIT ROUTINE
* 
*        ENTRY     BY JUMP FROM SECTION ZERO OR SECTION FOUR
* 
*        CALLS     NONE 
* 
*        ALTERS    A REGISTER 
* 
*        EXIT      CONTROL IS GIVEN TO -START1- IN CONTROLWARE
* 
*        ERRORS REPORTED
*                  NONE 
RST.EXIT IN        RSF.PANL*32+PANLSWCH  PUT SWITCHES 
         ANI       RSM.LOOP            CHECK FOR LOOP OPTION
         JNZ       RST.SEC0            LOOP IF SET
RST.DONE MVI       A,#3F               OUTPUT TERMINATION CODE
         OUT       RSF.PANL*32+PANLDATA 
          IN     RSF.PANL*32+PANLSWCH    SWITCH SETTING 
          ANI    #02
          JZ     RST.HI      NOT SET, 1200 BAUD 
          MVI    A,#3E       SET, SO 300 BAUD 
          JMP    RST.BD 
RST.HI    EQU    *
          MVI    A,#7E       SET UP FOR 1200
RST.BD    EQU    *
          STA    SC.OC
         LXI       SP,IST.STK 
         CALL      INIT.PLT       INITIALIZE CHAR. PLOT 
          MVI    A,0
          STA    M.HALT      INITIALIZE SOME VARAIBLES
          STA    M.STATUS 
          MVI    A,3
          STA    M.SBTYPE 
          LXI    H,M0CODE00 
          SHLD   M.M0 
* 
*         CHECKSUM RAM
*        IF BAD, RELOAD AND JUMP TO ASCII INIT
*        OTHERWISE, CHECK MODE AND GO TO CORRESPONDING INIT 
* 
RAMCK     EQU    *
          MVI    C,00        INITIALIZE SUM AND 
          LXI    H,#3FFF       RAM MEMORY ADDRESS POINTER.
          LDA    LWA+1       LOAD UPPER BITS FOR LWA
          CMP    H             AND TEST FOR VALUE.
          JC     RST.LDR     INCORRECT ADDRESS STORED.
  
CS1       EQU    *
          MOV    A,C         LOAD CHECKSUM RESULTS
          INX    H           INCREMENT MEMORY POINTER 
          ADD    M           ADD BYTE TO CHECKSUM 
          MOV    C,A           AND SAVE 
          LDA    LWA         LOAD LOWER HALF OF LWA 
          DCR    A
          CMP    L             AND TEST.
          JNZ    CS1         JUMP IF NOT END. 
  
          MOV    A,H         TEST UPPER BITS OF LOADING 
          CPI    #5F          ADDRESS FOR MAX.
          JZ     RST.LDR     ADDRESS TOO HIGH, LOAD.
          LDA    LWA+1       LOAD UPPER HALF OF ADDR. 
          CMP    H           AND TEST.
          JNZ    CS1          JUMP IF NOT END.
  
          LDA    CKSM        LOAD CHECKSUM
          CMP    C            AND TEST AGAINST CAL. 
          JNZ    RST.LDR     LOAD RAM IF NOT CORRECT. 
* 
*        TEST FOR ASCII MODE OR PLATO 
* 
         LDA       MODE 
         ANI       #80
         JZ        A.INIT 
* 
* 
         LXI       H,IST.STK
PLATO.1  EQU       $
         MVI       M,00 
         INX       H
         MVI       A,#23
         XRA       H
         JNZ       PLATO.1
         LDA       #34
         STA       M.TYPE 
         JMP       R.INIT 
         EJECT
* 
*        RAM RESIDENT LOAD ROUTINE
* 
RST.LDR   EQU    $
          LDA    SC.OC       LOAD SERIAL CHAN. CONTROL
          OUT    COMSTAT
*         INITIALIZE FOR LOAD ROUTINE.
S100      XRA    A
          STA    SEQ1 
          STA    SEQ2 
          STA    A1 
          STA    A3 
          STA    FLAGREG
          STA    CNTR 
          STA    CHAR 
          STA    CKSM        CLEAR CHECKSUM 
          IN     RSF.PANL*32+PANLSWCH 
          ANI    #E0         GET LOAD NUMBER
          RLC                 FROM THE TOP THREE
          RLC                  SWITCH SETTINGS. 
          RLC 
          STA    LDN
          LXI    H,DISP4     LOAD MESSAGE STORE ADDRESS 
          MVI    M,SPACE
          INX    H           LOAD BLOCK 
          MVI    M,SPACE         NUMBER DATA. 
          INX    H
          MVI    M,SPACE
          INX    H
          MVI    M,SPACE
          INX    H
          MVI    M,ESC
          INX    H
          MVI    M,ASC0 
          INX    H
          MVI    M,ASCL       LOAD
          INX    H
          INX    H             L,N,N,CR 
          INX    H
          MVI    M,CR           MESSAGE.
          INX    H
          MVI    M,DLE       LOAD DLE,EOT 
          INX    H
          MVI    M,EOT
          INX    H
          MVI    M,NAK        LOAD NAK,XXYY MESSAGE.
          MVI    A,#40
          STA    A2 
          MVI    L,#1B
          CALL   R.MODE      BULK ERASE, MODE 05
* 
*          LXI    H,SAVE
*          MVI    A,#3A       LOAD SHIFT STOP CODE
*          MOV    M,A           AND SEND FOUR TIMES 
*          MVI    B,4             TO TAKE TERMINAL OUT
*S100A     CALL   OUTDATA           OF PLATO MODE.
*          DCR    B 
*          JNZ    S100A 
* 
S101      CALL   S107        SEND LOAD REQUEST
S101A     LXI    H,0000      INITIALIZE 30 SEC TIME-OUT.
          MVI    B,#0F       30 SEC TIMEOUT 
S102      CALL   INDATA 
          JC     S104 
          DAD    D
          JNC    S102 
          DCR    B
          JZ     S109 
S103      JMP    S102 
S104      DAD    D
          JNC    S105 
          DCR    B
          JZ     S109 
S105      LDA    CHAR 
          CPI    SLASH       TEST FOR / CODE. 
          JNZ    S102 
D.LOOP    INX    H           TIME DELAY 
          MOV    A,L
          ORA    H
          JNZ    D.LOOP 
          LXI    D,#00       DISP ',LOADING BLOCK', 
          LXI    H,#B8
          CALL   R.OUTX 
          XCHG
          CALL   R.OUTY 
          MVI    L,#1B
          CALL   R.MODE      BULK ERASE AND MODE 5
          LXI    H,DISP1
          CALL   R.CHARS
          CALL   L.DISP      DISPL BLOCK NO.
S106      EQU    *
          LDA    FLAGREG
          ANI    #01
          JNZ    A.INIT      EOT FLAG SET, JUMP 
          MVI    A,#03
          STA    CNTR 
          CALL   S107        SEND LOAD REQUEST
          JNC    TERLD       LOADING TERMINATED 
          JMP    S200 
  
S109      LDA    FLAGREG
          ANI    #01
          JZ     TERLD
          LDA    CNTR 
          ORA    A
          JZ     TERLD
          DCR    A
          STA    CNTR 
          JMP    E006 
  
F000      EQU    *
          LDA    CNTR 
          ORI    #00
          JZ     TERLD
          DCR    A
          STA    CNTR 
          LDA    FLAGREG
          ANI    #04         NAK FLAG 
          JNZ    C000 
          CALL   S107        SEND LOAD REQUEST. 
          JNC    TERLD       LOADING TERMINATED 
  
S200      EQU    *           DLE-STX
          MVI    B,#0F       30 SEC TIMEOUT 
          LXI    H,#0000
S201      CALL   INDATA 
          JC     S203 
          DAD    D
          JNC    S201 
          DCR    B
          JZ     F000        TIMEOUT, JUMP
          JMP    S201 
  
S203      DAD    D
          JNC    S204 
          DCR    B
          JZ     F000 
S204      LDA    CHAR 
S205      CPI    DLE         TEST FOR DLE CODE
          JNZ    S201 
S206      CALL   INDATA 
          JC     S208 
          DAD    D
          JNC    S206 
          DCR    B
          JZ     F000 
          JMP    S206 
  
S208      DAD    D
          JNC    S209 
          DCR    B
          JZ     F000 
S209      LDA    CHAR 
          CPI    STX       TEST FOR STX CODE
          JNZ    S205 
S210      XRA    A
          STA    CRC1 
          STA    CRC2 
          STA    CNTR 
          STA    FLAGREG
B000      EQU    *           HEADER ROUTINE 
          LXI    H,SEQ1 
          MVI    B,#06
          MVI    A,#02       LOAD DLE COUNT 
          STA    SAVE 
B001      CALL   INDATA 
          JNC    B001 
          MOV    C,A         SAVE CHAR. 
          CPI    DLE         TEST FOR DLE CODE
          JZ     B004 
B002      LDA    SAVE        GET DLE COUNT
          ORA    A             AND TEST FOR ZERO. 
          JNZ    B005 
          MOV    C,M
          LDA    CHAR 
          CMP    C
          JNZ    C000 
B003      CALL   CRCGEN 
          DCR    B
          JZ     D000 
          INX    H
          JMP    B001 
B004      CALL   INDATA 
          JNC    B004 
          MOV    C,A         SAVE CHAR. 
          CPI    DLE         TEST FOR DLE CODE
          JZ     B002 
          JMP    E000 
  
B005      MOV    A,M
          CMP    C
          JNZ    B006 
          LDA    SAVE        GET DLE COUNT
          DCR    A             AND DECREMENT IT.
          STA    SAVE 
          JMP    B003 
  
B006      EQU    *
          JNC    S201 
  
C000      EQU    *           NAK ARQ
          LXI    H,OUT4+1 
          LDA    SEQ1 
          MOV    M,A
          CMA 
          MOV    D,A
          INX    H
          LDA    SEQ2 
          MOV    M,A
          CMA 
          INX    H
          MOV    M,D
          INX    H
          MOV    M,A
          LXI    H,OUT4 
          MVI    B,#05
C001      CALL   OUTDATA
          JNC    TERLD
          INX    H
          DCR    B
          JNZ    C001 
          LDA    FLAGREG
          ANI    #04
          JNZ    C002 
          MVI    A,#02
          STA    CNTR 
          LDA    FLAGREG
          ORI    #04
          STA    FLAGREG
C002      JMP    S200 
         EJECT
* 
*        LOAD RAM RESIDENT DATA 
*                  B REG.         BYTE COUNT
*                  HL REG.        DATA STORE ADDR.
* 
D000      EQU    *           DATA SECTION 
          LDA    A3 
          MOV    L,A
          LDA    A2 
          MOV    H,A
          XRA    A
          MOV    B,A         CLEAR BYTE COUNTER 
          STA    CNTR 
D001      CALL   INDATA 
          JNC    D001 
          CPI    DLE         TEST FOR DLE CODE
          JZ     D003 
D002      MOV    A,B
          CPI    #F0
          JZ     C000 
          LDA    CHAR 
          MOV    M,A
          LDA    CKSM        LOAD CHECKSUM
          ADD    M            AND ADD LAST BYTE 
          STA    CKSM          AND SAVE.
          CALL   CRCGEN 
          INX    H
          SHLD   LWA         SAVE LAST STORE ADDRESS
          INR    B
          LDA    CNTR 
          INR    A
          STA    CNTR 
          JMP    D001 
  
D003      CALL   INDATA 
          JNC    D003 
          CPI    DLE         TEST FOR DLE CODE
          JNZ    D004          JUMP IF NOT DLE
          INR    B           ELSE INC. BYTE COUNT.
          JMP    D002 
D004      INX    H           INC. STORE ADDRESS 
         EJECT
E000      EQU    *           ETB/ETX DETECTION
          CPI    ETB         TEST FOR ETB CODE
          JNZ    E005 
          MVI    A,#02       SET ETB FLAG 
          STA    FLAGREG
E001      CALL   CRCGEN      DO CRC CALCULATION 
* 
*         TEST CRC CALCULATION WITH CRC RECEIVED
* 
E001A     CALL   INDATA 
          JNC    E001A
          LXI    H,CRC1      LOAD ADDRES OF CRC 
          CMP    M             AND TEST AGAINST REC.
          JNZ    C000        JUMP IF BAD CRC
E001B     CALL   INDATA 
          JNC    E001B
          LXI    H,CRC2      LOAD ADDRESS OF CRC
          CMP    M             AND TEST AGAINST REC 
          JNZ    C000        JUMP IF BAD CRC
          LDA    CNTR 
          LXI    H,A3 
          ADD    M
          MOV    M,A
          JNC    E002 
          DCX    H
          INR    M
E002      EQU    *           INCREMENT DATA STORE ADDR. 
          LDA    SEQ2 
          ADI    #01
          STA    SEQ2 
          JNC    E003 
          LDA    SEQ1 
          ADI    #01
          STA    SEQ1 
  
E003      LDA    FLAGREG
          ANI    #02         TEST FOR ETB FLAG
          JZ     E003A
          CALL   L.DISP      DISP LOADING BLOCK 
          JMP    S200 
  
E003A     LDA    FLAGREG
          ORI    #01
          STA    FLAGREG
          MVI    A,#02
          STA    CNTR 
E006      LXI    H,OUT3      OUTPUT ',DLE EOT', 
          MVI    B,#02
E004      CALL   OUTDATA
          JNC    TERLD
          INX    H
          DCR    B
          JNZ    E004 
          JMP    E007 
E005      CPI    ETX         TEST FOR ETX CODE
          JZ     E001 
          CPI    STX         TEST FOR STX CODE# 
          JNZ    C000 
          JMP    S210 
  
E007      EQU    *
          MVI    L,#1B       DO BULK ERASE, 
          CALL   R.MODE        AND SET MODE 5.
          JMP    S101A       RETURN TO LOOK FOR SLASHES 
  
TERLD     EQU    *
          LXI    D,#00
          LXI    H,#B8
          CALL   R.OUTX      OUTPUT COORDINATES 
          XCHG                TO THE DISPLAY. 
          CALL   R.OUTY 
          MVI    L,#1B       DO BULK ERASE, 
          CALL   R.MODE        AND SET MODE 5.
          LXI    H,DISP2     DISPLAY '7SYSTEM 
          CALL   R.CHARS       NOT ESTABLISHED'7. 
          JMP    S101 
          EJECT 
  
S107      LXI    H,OUT1      OUTPUT ',LNN ',
          INX    H
          LDA    LDN
          CALL   CONVERT     CONVERT HEX TO ASCII 
          LXI    H,OUT1 
          MVI    B,#04
S108      CALL   OUTDATA
          RNC                ERROR, TERMINATE LOADING 
          INX    H
          DCR    B
          JNZ    S108 
          RET 
  
* 
*        INPUT COMM. DATA 
*                  DATA INPUT IS DONE USING COMM. STATUS. 
* 
INDATA    EQU    *
          LXI    D,#0000
IN1       INX    D
          MVI    A,#0A
          SUB    D
          RZ
          IN     COMSTAT
          ANI    #04         TEST FOR CHAR. RDY. STATUS 
          JZ     IN1
          IN     COMDATA
          STA    CHAR 
          STC                SET '7RECEIVED DATA'7 FLAG.
          RET 
  
OUTDATA   EQU    *
          LXI    D,#0A00
O100      DCX    D
          MOV    A,D
          ORA    E
          RZ
          IN     COMSTAT
          ANI    #02         TEST FOR CHAR. REQ. STATUS 
          JZ     O100 
          MOV    A,M
          OUT    COMDATA
          STC                SET DATA TRANSMITTED FLAG. 
          RET 
  
* 
*        CODE CONVERTION ROUTINE
*                  A BINARY BYTE IS CONVERTED TO TWO
*                  ASCII CHARACTERS.
* 
CONVERT   EQU    *
          MOV    B,A
          RAR 
          RAR 
          RAR 
          RAR 
          ANI    #0F         CONVERT LOWER 4 BITS 
          CALL   C.CON       BINARY TO ASCII
          MOV    M,A
          INX    H
          MOV    A,B
          ANI    #0F         CONVERT UPPER 4 BITS 
          CALL   C.CON
          MOV    M,A
          RET 
* 
*         ENTRY  LOWER FOUR BITS OF A IS HEX CODE 
*         EXIT   A REG IS ASCII EQUIVALENT
*                C REG. IS CHANGED
* 
C.CON     EQU    *           BINARY TO ASCII
          MOV    C,A
          SUI    #09
          JZ     CON01
          JP     CON02
CON01     MOV    A,C
          ADI    #30
          JMP    CON03
CON02     MOV    A,C
          ADI    #37
CON03     JPE    CON04
          XRI    #80
CON04     RET 
  
* 
*         CRC GENERATOR 
*                THE POLYNOMIAL DIVISOR IS
*                  X**16+X**15+X**2+1 
* 
CRCGEN    EQU    *
          LDA    CRC1 
          MOV    C,A
          LDA    CHAR 
          XRA    C
          MOV    C,A
          RAR 
          ANI    #7F
          XRA    C
          MOV    C,A
          RAR 
          RAR 
          XRA    C
          MOV    D,A
          RAR 
          RAR 
          RAR 
          RAR 
          XRA    D
          ANI    #03
          MOV    D,A
          MOV    A,C
          RLC 
          RLC 
          MOV    E,A
          ANI    #FC
          ORA    D
          MOV    D,A
          MOV    A,E
          RLC 
          ANI    #06
          MOV    E,A
          MOV    A,D
          RAR 
          MOV    A,E
          RAR 
          MOV    C,A
          LDA    CRC2 
          XRA    C
          STA    CRC1 
          MOV    A,D
          STA    CRC2 
          RET 
          EJECT 
L.DISP    EQU    *           DISPL LOADING BLOCK
          LXI    D,#00
          LXI    H,#0120
          CALL   R.OUTX      OUTPUT COORDINATES 
          XCHG                 TO THE DISPLAY.
          CALL   R.OUTY 
          LXI    H,DISP4
          LDA    SEQ1 
          CALL   CONVERT     CONVERT HEX TO ASCII 
          INX    H
          LDA    SEQ2 
          CALL   CONVERT     CONVERT HEX TO ASCII 
          LXI    H,DISP4
          CALL   R.CHARS
          RET 
          SPACE  6
          BSSZ   #0BF9+START-*
* 
*         ROM CHECKSUM TABLE
* 
RST.CHP0  BSSZ   1           ROM 0 CHECKSUM 
RST.CHP1  BSSZ   1           ROM 1 CHECKSUM 
RST.CHP2  BSSZ   1           ROM 2 CHECKSUM 
RST.CHP3  BSSZ   1           ROM 3 CHECKSUM 
RST.CHP4  BSSZ   1           ROM 4 CHECKSUM 
RST.CHP5  BSSZ   1           ROM 5 CHECKSUM 
RST.CKSM  BSSZ   1           ROM TABLE CHECKSUM 
* 
*  *  *  *  *  *  *  *  *  *  *  *
* 
*         'R'O'M 'CHECKSUM AND 'R'A'M 'TESTS
* 
*         'THIS SECTION WILL CHECKSUM 6'K OF 'R'O'M WHICH INCLUDES
*         LOADER, DIAGNOSTIC AND CHARACTER GENERATORS.  'THE
*         CHECKSUM IS GENERATED AS FOLLOWS'; STARTING WITH THE
*         HIGHEST 'R'O'M ADDRESS AND THE 'A REGISTER EQUAL TO  ZERO 
*         AN EXCLUSIVE-OR BETWEEN THE CONTENTS OF MEMORY AND
*         THE A REGISTER WILL BE PERFORMED.  'THE RESULT IS THEN
*         LEFT-SHIFTED END-AROUND.  'THE 'R'O'M ADDRESS IS DECREMENTED
*         AND THE PROCEDURE CONTINUES UNTIL A CHIP
*         BOUNDARY IS REACHED.  'THE RESULTING CHECKSUM IS
*         VERIFIED AGAINST A TABLE OF EXPECTED CHECKSUM 
*         BYTES.  'THIS PROCEDURE IS REPEATED FOR ALL SIX 
*         CHIPS.
* 
*         'THE RAM MEMORY TEST WILL TEST A 2000H TO 3000H 
*         AND 4000H TO 8000H
* 
*         'ERROR CODES ARE';
*           20   ROM FAILURE - CHIP 0 
*           21   ROM FAILURE - CHIP 1 
*           22   COMMAND/ROM FAILURE - CHIP 2 
*           23   ROM FAILURE - CHIP 3 
*           24   ROM FAILURE - CHIP 4 
*           25   ROM FAILURE - CHIP 5 
*           26   COMMAND/RAM  FAILURE 
* 
*  *  *  *  *  *  *  *  *  *  *  *  * 
* 
RST.S000  EQU    *
          MVI    A,#12       ERROR CODE FOR CHIP 2
          OUT    RSF.PANL*32+PANLDATA 
          LXI    H,RST.CHP5  SET HL TO ADDR OF CHECKSUM TABLE 
          MVI    D,6
          MVI    A,0
RST.S002  EQU    *
          XRA    M           DO UNTIL CHKSUM TABLE IS CHECKSUMMED 
          RLC 
          DCX    H
          DCR    D
          JNZ    RST.S002 
          MOV    C,A
          LDA    RST.CKSM    GET EXPECTED RESULT
          CMP    C           COMPARE
          JZ     RST.S004    JUMP IF CORRECT
          HLT 
RST.S004  EQU    *
          LXI    H,RSV.HROM  SET HL TO FIRST ADR. TO CHECKSUM 
          LXI    D,RSV.ROML  SET DE TO LENGTH OF CHECKSUM 
          LXI    SP,RST.CHP5-1   SET SP TO EXPECTED CHECKSUM
RST.S005  EQU    *
          MOV    A,H
          ANI    #1C
          RRC 
          RRC                FORM NUMBER OF CURRENT CHIP
          ORI    #10         FORM ERROR CODE
          OUT    RSF.PANL*32+PANLDATA   OUTPUT ERROR CODE 
          MVI    C,0         ZERO PARTIAL RESULT
RST.S010  EQU    *
          MOV    A,C         DO UNTIL CURRENT CHIP IS DONE
          XRA    M              CHECKSUM NEXT BYTE
          RLC 
          MOV    C,A         SAVE PARTIAL RESULT
          DCX    H           UPDATE INDEX 
          DCX    D           UPDATE COUNTER 
          MOV    A,D         CHECK FOR CHIP BOUNDARY
          ANI    #03
          ORA    E
          JNZ    RST.S010    END DO 
          MOV    A,C         GET ACTUAL CHECK SUM 
          POP    B           GET EXPECTED CHECKSUM IN B 
          DCX    SP 
          DCX    SP          MODIFY SP FOR NEXT CHIP
          DCX    SP 
          CMP    B
          JZ     RST.S015 
* 
*         ERROR 2X - CHECKSUM ERROR ON CHIP X 
* 
          HLT 
* 
RST.S015  EQU    *
          MOV    A,D         END IF NEXT CHIP = 2 
          CPI    #0C
          JNZ    RST.S016 
          DCX    D
          DCX    D           THEN UPDATE DE AND HL TO SKIP
          DCX    D           OVER CHECKSUMMING LAST 
          DCX    D           4 LOCATIONS OF CHIP 2
          DCX    D
          DCX    D
          DCX    D
          DCX    H
          DCX    H
          DCX    H
          DCX    H
          DCX    H
          DCX    H
          DCX    H
RST.S016  EQU    *
          MOV    A,D         END IF 
          ORA    E           CHECK FOR COUNT = 0
          JNZ    RST.S005 
* 
*         'R'A'M CHECK
* 
          MVI    A,#16
          OUT    RSF.PANL*32+PANLDATA   OUTPUT ERROR CODE 
          MVI    B,#55       LOAD DATA PATTERN
RST.S030  EQU    *
          LXI    H,#2000     STARTING ADDRESS 
          LXI    D,#1000     LENGTH 
RST.S020  EQU    *
          MOV    M,B
          MOV    A,M
          CMP    B
          JNZ    RST.S050   JUMP IF ERROR 
          INX    H
          DCX    D
          MOV    A,D
          ORA    E
          JNZ    RST.S020    REPEAT IF NOT DONE ALL BYTES 
          MOV    A,H
          XRI    #80
          JZ     RST.S025     IF DONE HL = 8000H
          LXI    H,#4000
          LXI    D,#4000
          JMP    RST.S020 
  
RST.S025  EQU    *
          LDA    #7FFF
          XRI    #AA
          JZ     RST.SEC1 
          MVI    B,#AA
          JMP    RST.S030 
  
  
RST.S050  EQU    *
          HLT                ERROR 26 
  
  
         EJECT
          BSSZ   #0D00-*+START
**
*E
*        RST.OCHR  DISPLAY CHAR ON DISPLAY VIA CONTROLWARE
* 
*        ENTRY     BY CALL FROM SECTION FOUR
* 
*        CALLS     CHAREN         CONTROLWARE ENTRY POINT 
* 
*        ALTERS    MEMSEL         FLAG IN CONTROLWARE 
* 
*        EXIT      BY RETURN TO CALLER
* 
*        ERRORS REPORTED
*                  NONE 
RST.OCHR PUSH      B              SAVE BC 
          CALL   OUTCOORD    SET DISPLAY COORDINATES
         MOV       A,C            GET CHAR TO OUTPUT
         RRC
         RRC
         RRC
         RRC
         ANI       #0F            SAVE UPPER DIGIT
         CALL      RST.OUT        GO TO COMMON CODE 
         POP       B              RESTORE BC
         PUSH      B
         MOV       A,C
         ANI       #0F            SAVE LOWER DIGIT
         CALL      RST.OUT
         POP       B              RESTORE BC
         RET                      RETURN TO CALLER
RST.OUT  EQU       $
          LHLD   M0ADR       LOAD ADDRESS OF M0 
         SHLD      MEMSEL      CHARACTER SET. 
         CPI       #0A
         JC        RST.OUT5       JUMP IF 0-9 
         CPI       #36
         JNZ       RST.OUT3 
         XRA       A              SET TO 00 FOR SPACE 
         JMP       RST.OUT4 
RST.OUT3 EQU       $
         ADI       #17
RST.OUT4 EQU       $
          CALL   CHAREN      CALL CHARACTER GENERATOR 
         RET                      RETURN TO CALLER
RST.OUT5 EQU       $
         ADI       #10
          CALL   CHAREN      CALL CHARACTER GENERATOR 
         RET                      RETURN TO CALLER
RSV.HROM EQU       #17FF          LWA OF ROM
RSV.ROML EQU       #1800          LENGTH OF ROM 
RSV.RAML EQU       #1000          LENGTH OF 4K RAM
RSV.SRAM EQU       #2000          FWA OF RAM
RST.STAK EQU       #205D
RST.CON5 EQU       #2055
RST.CON6 EQU       #2056
RSM.EXIT EQU       #01
RSM.RAM  EQU       #02
RSM.SEC4 EQU       #04
RSM.LOOP EQU       #08
RSM.TOCH EQU       #10
RSM.CCLR EQU       #02
RSM.CSET EQU       #D7
RSF.PANL EQU       0
RSF.COMM EQU       1
RSF.KYBD EQU       2
RSF.TOCH EQU       3
RSF.DISP EQU       4
COMMDAT1 EQU       0
COMMDAT2 EQU       1
COMMDAT3 EQU       2
COMMCONT EQU       2
COMMSTAT EQU       3
KYBDCONT EQU       0
KYBDSTAT EQU       1
KYBDDATA EQU       2
TOCHCONT EQU       0
TOCHSTAT EQU       1
TOCHDATA EQU       0
DISPDATA EQU       3
DISPXCOR EQU       4
DISPYCOR EQU       5
DISPCON1 EQU       6
DISPCON2 EQU       7
DISPXREG EQU       0
DISPYREG EQU       1
DISPXY28 EQU       2
PANLDATA EQU       #10
PANLSWCH EQU       #11
*        EQUATES USED FOR LOADER
CONT1     EQU    #A1
COMSTAT   EQU    #E3
COMDATA   EQU    #E2
DUMPY     EQU    #00
ETX       EQU    #03         ETX CODE 
ETB       EQU    #17         ETB CODE 
ESC       EQU    #1B         ESCAPE CODE
SPACE     EQU    #20         SPACE CODE 
DLE       EQU    #90         DLE CODE 
STX       EQU    #82         STX CODE 
EOT       EQU    #84         EOT CODE 
CR        EQU    #8D         CR CODE
NAK       EQU    #95         NAK CODE 
ASCL      EQU    #CC         ASCII L
ASC0      EQU    #30         ASCII 0
SLASH     EQU    #AF         / CODE 
         EJECT
FIX       EQU    *
          BSSZ   #0DAB-*+START
* 
*        LOADER DISPLAY MESSAGES
* 
         SPACE     2
DISP3     EQU    *
          DB     #4C,#4F,#41,#44      L O A D 
          DB     #49,#4E,#47,#20      I N G 
          DB     #44,#4F,#4E,#45      D O N E 
          DB     #1B,#30
  
DISP2     EQU    *
          DB     #4C,#4F,#41,#44     'L 'O 'A 'D
          DB     #49,#4E,#47,#20     'I 'N 'G SP
          DB     #46,#41,#49,#4C     'F 'A 'I 'L
          DB     #55,#52,#45,#20     'U 'R 'E SP
          DB     #1B,#30
  
DISP1     EQU    *
          DB     #4C,#4F,#41,#44      L O A D 
          DB     #49,#4E,#47,#20      I N G 
          DB     #42,#4C,#4B,#20      B L K 
          DB     #20,#1B,#30
          EJECT 
  
* 
*        PLATO M0 CHARACTER SET 
* 
M0CODE00 DB        #00,#00,#00,#00     SPACE
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE01 DB        #00,#00,#00,#00     EXCLAMATION MARK 
         DB        #00,#00,#90,#1F
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE02 DB        #00,#00,#00,#00     DOUBLE QUOTES
         DB        #00,#1C,#00,#00
         DB        #00,#1C,#00,#00
         DB        #00,#00,#00,#00
M0CODE03 DB        #00,#05,#00,#05     NUMBER SIGN
         DB        #C0,#1F,#00,#05
         DB        #C0,#1F,#00,#05
         DB        #00,#05,#00,#00
M0CODE04 DB        #40,#06,#20,#09     DOLLAR SIGN
         DB        #20,#09,#F0,#1F
         DB        #20,#09,#20,#09
         DB        #C0,#04,#00,#00
M0CODE05 DB        #20,#0C,#40,#12     PERCENT SIGN 
         DB        #80,#0C,#00,#01
         DB        #60,#02,#90,#04
         DB        #60,#08,#00,#00
M0CODE06 DB        #E0,#00,#10,#0D     AMPER SIGN 
         DB        #10,#13,#90,#0C
         DB        #60,#00,#60,#00
         DB        #90,#01,#00,#00
M0CODE07 DB        #00,#00,#00,#00     SINGLE QUOTE 
         DB        #00,#00,#00,#1C
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE08 DB        #00,#00,#00,#00     LEFT PAREN 
         DB        #00,#00,#00,#00
         DB        #E0,#07,#10,#08
         DB        #08,#10,#00,#00
M0CODE09 DB        #08,#10,#10,#08     RIGHT PAREN
         DB        #E0,#07,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE0A DB        #00,#00,#40,#02     ASTERISK 
         DB        #80,#01,#60,#06
         DB        #80,#01,#40,#02
         DB        #00,#00,#00,#00
M0CODE0B DB        #00,#00,#80,#00     PLUS 
         DB        #80,#00,#E0,#03
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
M0CODE0C DB        #00,#00,#00,#00     COMMA
         DB        #34,#00,#38,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE0D DB        #00,#00,#80,#00     MINUS
         DB        #80,#00,#80,#00
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
M0CODE0E DB        #00,#00,#00,#00     PERIOD 
         DB        #30,#00,#30,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE0F DB        #10,#00,#20,#00     SLASH
         DB        #40,#00,#80,#00
         DB        #00,#01,#00,#02
         DB        #00,#04,#00,#00
M0CODE10 DB        #10,#00,#E0,#07     NUMERAL ZERO 
         DB        #50,#08,#90,#09
         DB        #10,#0A,#E0,#07
         DB        #00,#08,#00,#00
M0CODE11 DB        #00,#00,#00,#00     NUMERAL ONE
         DB        #10,#04,#F0,#0F
         DB        #10,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE12 DB        #00,#00,#30,#04     NUMERAL TWO
         DB        #50,#08,#90,#08
         DB        #10,#09,#10,#06
         DB        #00,#00,#00,#00
M0CODE13 DB        #00,#00,#20,#04     NUMERAL THREE
         DB        #10,#08,#10,#09
         DB        #10,#09,#E0,#06
         DB        #00,#00,#00,#00
M0CODE14 DB        #00,#00,#80,#00     NUMERAL FOUR 
         DB        #80,#01,#80,#02
         DB        #80,#04,#F0,#0F
         DB        #80,#00,#00,#00
M0CODE15 DB        #00,#00,#10,#0F     NUMERAL FIVE 
         DB        #10,#09,#10,#09
         DB        #20,#09,#C0,#08
         DB        #00,#00,#00,#00
M0CODE16 DB        #00,#00,#E0,#03     NUMERAL SIX
         DB        #10,#05,#10,#09
         DB        #10,#09,#E0,#00
         DB        #00,#00,#00,#00
M0CODE17 DB        #00,#00,#00,#08     NUMERAL SEVEN
         DB        #30,#08,#C0,#08
         DB        #00,#0B,#00,#0C
         DB        #00,#00,#00,#00
M0CODE18 DB        #00,#00,#E0,#06     NUMERAL EIGHT
         DB        #10,#09,#10,#09
         DB        #10,#09,#E0,#06
         DB        #00,#00,#00,#00
M0CODE19 DB        #00,#00,#00,#07     NUMERAL NINE 
         DB        #90,#08,#90,#08
         DB        #A0,#08,#C0,#07
         DB        #00,#00,#00,#00
M0CODE1A DB        #00,#00,#00,#00     COLON
         DB        #30,#03,#30,#03
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE1B DB        #00,#00,#00,#00     SEMICOLON
         DB        #34,#03,#38,#03
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE1C DB        #00,#00,#80,#00     LESS THAN
         DB        #40,#01,#20,#02
         DB        #10,#04,#00,#00
         DB        #00,#00,#00,#00
M0CODE1D DB        #00,#00,#40,#01     EQUALS 
         DB        #40,#01,#40,#01
         DB        #40,#01,#40,#01
         DB        #00,#00,#00,#00
M0CODE1E DB        #00,#00,#00,#00     GREATER THAN 
         DB        #10,#04,#20,#02
         DB        #40,#01,#80,#00
         DB        #00,#00,#00,#00
M0CODE1F DB        #00,#00,#00,#0C     QUESTION MARK
         DB        #00,#10,#D0,#10
         DB        #00,#11,#00,#0E
         DB        #00,#00,#00,#00
M0CODE20 DB        #E0,#01,#10,#02     COMMERCIAL AT
         DB        #C8,#04,#28,#05
         DB        #E8,#05,#20,#02
         DB        #C0,#01,#00,#00
M0CODE21 DB        #F0,#07,#00,#09     UPPER CASE A 
         DB        #00,#11,#00,#11
         DB        #00,#11,#00,#09
         DB        #F0,#07,#00,#00
M0CODE22 DB        #F0,#1F,#10,#12     UPPER CASE B 
         DB        #10,#12,#10,#12
         DB        #10,#12,#10,#0E
         DB        #E0,#01,#00,#00
M0CODE23 DB        #C0,#07,#20,#08     UPPER CASE C 
         DB        #10,#10,#10,#10
         DB        #10,#10,#10,#10
         DB        #20,#08,#00,#00
M0CODE24 DB        #F0,#1F,#10,#10     UPPER CASE D 
         DB        #10,#10,#10,#10
         DB        #10,#10,#20,#08
         DB        #C0,#07,#00,#00
M0CODE25 DB        #F0,#1F,#10,#11     UPPER CASE E 
         DB        #10,#11,#10,#11
          DB     #10,#10,#10,#10
         DB        #10,#10,#00,#00
M0CODE26 DB        #F0,#1F,#00,#11     UPPER CASE F 
         DB        #00,#11,#00,#11
         DB        #00,#10,#00,#10
         DB        #00,#10,#00,#00
M0CODE27 DB        #C0,#07,#20,#08     UPPER CASE G 
         DB        #10,#10,#10,#10
         DB        #90,#10,#90,#10
         DB        #E0,#08,#00,#00
M0CODE28 DB        #F0,#1F,#00,#01     UPPER CASE H 
         DB        #00,#01,#00,#01
         DB        #00,#01,#00,#01
         DB        #F0,#1F,#00,#00
M0CODE29 DB        #00,#00,#10,#10     UPPER CASE I 
         DB        #10,#10,#F0,#1F
         DB        #10,#10,#10,#10
         DB        #00,#00,#00,#00
M0CODE2A DB        #20,#00,#10,#00     UPPER CASE J 
         DB        #10,#10,#10,#10
         DB        #E0,#1F,#00,#10
         DB        #00,#10,#00,#00
M0CODE2B DB        #F0,#1F,#80,#00     UPPER CASE K 
         DB        #00,#01,#80,#02
         DB        #40,#04,#20,#08
         DB        #10,#10,#00,#00
M0CODE2C DB        #F0,#1F,#10,#00     UPPER CASE L 
         DB        #10,#00,#10,#00
         DB        #10,#00,#10,#00
         DB        #10,#00,#00,#00
M0CODE2D DB        #F0,#1F,#00,#08     UPPER CASE M 
         DB        #00,#04,#00,#02
         DB        #00,#04,#00,#08
         DB        #F0,#1F,#00,#00
M0CODE2E DB        #F0,#1F,#00,#08     UPPER CASE N 
         DB        #00,#06,#00,#01
         DB        #C0,#00,#20,#00
         DB        #F0,#1F,#00,#00
M0CODE2F DB        #C0,#07,#20,#08     UPPER CASE O 
         DB        #10,#10,#10,#10
         DB        #10,#10,#20,#08
         DB        #C0,#07,#00,#00
M0CODE30 DB        #F0,#1F,#00,#11     UPPER CASE P 
         DB        #00,#11,#00,#11
         DB        #00,#11,#00,#11
         DB        #00,#0E,#00,#00
M0CODE31 DB        #C0,#07,#20,#08     UPPER CASE Q 
         DB        #10,#10,#18,#10
         DB        #14,#10,#24,#08
         DB        #C0,#07,#00,#00
M0CODE32 DB        #F0,#1F,#00,#11     UPPER CASE R 
         DB        #00,#11,#80,#11
         DB        #40,#11,#20,#11
         DB        #10,#0E,#00,#00
M0CODE33 DB        #20,#0E,#10,#11     UPPER CASE S 
         DB        #10,#11,#10,#11
         DB        #10,#11,#10,#11
         DB        #E0,#08,#00,#00
M0CODE34 DB        #00,#10,#00,#10     UPPER CASE T 
         DB        #00,#10,#F0,#1F
         DB        #00,#10,#00,#10
         DB        #00,#10,#00,#00
M0CODE35 DB        #E0,#1F,#10,#00     UPPER CASE U 
         DB        #10,#00,#10,#00
         DB        #10,#00,#10,#00
         DB        #E0,#1F,#00,#00
M0CODE36 DB        #00,#18,#00,#07     UPPER CASE V 
         DB        #C0,#00,#30,#00
         DB        #C0,#00,#00,#07
         DB        #00,#18,#00,#00
M0CODE37 DB        #E0,#1F,#10,#00     UPPER CASE W 
         DB        #20,#00,#C0,#03
         DB        #20,#00,#10,#00
         DB        #E0,#1F,#00,#00
M0CODE38 DB        #30,#18,#40,#04     UPPER CASE X 
         DB        #80,#02,#00,#01
         DB        #80,#02,#40,#04
         DB        #30,#18,#00,#00
M0CODE39 DB        #00,#18,#00,#04     UPPER CASE Y 
         DB        #00,#02,#F0,#01
         DB        #00,#02,#00,#04
         DB        #00,#18,#00,#00
M0CODE3A DB        #30,#18,#50,#10     UPPER CASE Z 
         DB        #90,#10,#10,#11
         DB        #10,#12,#10,#14
         DB        #30,#18,#00,#00
M0CODE3B DB        #00,#00,#00,#00     LEFT BRACKET 
         DB        #00,#00,#00,#00
          DB     #F8,#1F,08,#10 
          DB     08,#10,00,00 
M0CODE3C DB        #00,#04,#00,#02     REVERSE SLASH
         DB        #00,#01,#80,#00
         DB        #40,#00,#20,#00
         DB        #10,#00,#00,#00
M0CODE3D DB        #08,#10,#08,#10    RIGHT BRACKET 
         DB        #F8,#1F,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE3E DB        #00,#00,#00,#10     HAT
         DB        #00,#20,#00,#40
         DB        #00,#20,#00,#10
         DB        #00,#00,#00,#00
M0CODE3F DB        #04,#00,#04,#00     UNDERLINE
         DB        #04,#00,#04,#00
         DB        #04,#00,#04,#00
         DB        #04,#00,#00,#00
M0CODE40 DB        #00,#00,#00,#40     SINGLE LEFT QUOTE
         DB        #00,#20,#00,#10
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE41 DB        #60,#00,#90,#02     LOWER CASE A 
         DB        #90,#02,#90,#02
         DB        #90,#02,#E0,#01
         DB        #10,#00,#00,#00
M0CODE42 DB        #F0,#1F,#20,#01     LOWER CASE B 
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
M0CODE43 DB        #C0,#00,#20,#01     LOWER CASE C 
         DB        #10,#02,#10,#02
         DB        #10,#02,#10,#02
         DB        #20,#01,#00,#00
M0CODE44 DB        #C0,#00,#20,#01     LOWER CASE D 
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #F0,#1F,#00,#00
M0CODE45 DB        #C0,#00,#A0,#01     LOWER CASE E 
         DB        #90,#02,#90,#02
         DB        #90,#02,#90,#02
         DB        #90,#01,#00,#00
M0CODE46 DB        #00,#00,#00,#00     LOWER CASE F 
         DB        #10,#02,#F0,#0F
         DB        #10,#12,#00,#10
         DB        #00,#08,#00,#00
M0CODE47 DB        #A8,#01,#54,#02     LOWER CASE G 
         DB        #54,#02,#54,#02
         DB        #54,#02,#94,#01
         DB        #08,#02,#00,#00
M0CODE48 DB        #00,#10,#F0,#1F     LOWER CASE H 
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
M0CODE49 DB        #00,#00,#00,#00     LOWER CASE I 
         DB        #10,#02,#F0,#13
         DB        #10,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE4A  DB     00,00,02,00     LOWER CASE J 
          DB     02,02,#FC,#13
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE4B DB        #10,#10,#F0,#1F     LOWER CASE K 
         DB        #80,#00,#40,#01
         DB        #20,#02,#10,#02
         DB        #10,#00,#00,#00
M0CODE4C  DB     00,00,00,00     LOWER CASE L 
          DB     #10,#10,#F0,#1F
          DB     #10,00,00,00 
         DB        #00,#00,#00,#00
M0CODE4D DB        #F0,#03,#00,#02     LOWER CASE M 
         DB        #00,#02,#F0,#01
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
M0CODE4E DB        #00,#02,#F0,#03     LOWER CASE N 
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
M0CODE4F DB        #C0,#00,#20,#01     LOWER CASE O 
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
M0CODE50 DB        #FE,#03,#20,#01     LOWER CASE P 
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
M0CODE51 DB        #C0,#00,#20,#01     LOWER CASE Q 
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #FE,#03,#00,#00
M0CODE52 DB        #00,#02,#F0,#03     LOWER CASE R 
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #00,#01,#00,#00
M0CODE53 DB        #20,#01,#90,#02     LOWER CASE S 
         DB        #90,#02,#90,#02
         DB        #90,#02,#90,#02
         DB        #60,#00,#00,#00
M0CODE54 DB        #00,#02,#00,#02     LOWER CASE T 
         DB        #E0,#1F,#10,#02
         DB        #10,#02,#10,#02
         DB        #00,#00,#00,#00
M0CODE55 DB        #E0,#03,#10,#00     LOWER CASE U 
         DB        #10,#00,#10,#00
         DB        #10,#00,#E0,#03
         DB        #10,#00,#00,#00
M0CODE56 DB        #00,#02,#00,#03     LOWER CASE V 
         DB        #C0,#00,#30,#00
         DB        #C0,#00,#00,#03
         DB        #00,#02,#00,#00
M0CODE57 DB        #E0,#03,#10,#00     LOWER CASE W 
         DB        #20,#00,#C0,#01
         DB        #20,#00,#10,#00
         DB        #E0,#03,#00,#00
M0CODE58 DB        #00,#02,#10,#02     LOWER CASE X 
         DB        #20,#01,#C0,#00
         DB        #C0,#00,#20,#01
         DB        #10,#02,#00,#00
M0CODE59 DB        #82,#03,#44,#00     LOWER CASE Y 
         DB        #28,#00,#10,#00
         DB        #20,#00,#40,#00
         DB        #80,#03,#00,#00
M0CODE5A DB        #10,#03,#30,#02     LOWER CASE Z 
         DB        #50,#02,#90,#02
         DB        #10,#03,#30,#02
         DB        #00,#00,#00,#00
M0CODE5B DB        #00,#00,#00,#00     LEFT BRACE 
         DB        #00,#00,#80,#00
         DB        #78,#0F,#04,#10
         DB        #04,#10,#00,#00
M0CODE5C DB        #00,#00,#E0,#3D    ELONGATED COLON 
         DB        #E0,#3D,#E0,#3D
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE5D DB        #04,#10,#04,#10     RIGHT BRACE
         DB        #78,#0F,#80,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M0CODE5E DB        #00,#00,#80,#00     APPROXIMATE
         DB        #00,#01,#00,#01
         DB        #80,#00,#80,#00
         DB        #00,#01,#00,#00
M0CODE5F DB        #F0,#1F,#F0,#1F     RUBOUT 
         DB        #F0,#1F,#F0,#1F
         DB        #F0,#1F,#F0,#1F
         DB        #F0,#1F,#F0,#1F
M0CODE60 DB        #01,#00,#01,#00     CURSOR 
         DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
M0CODE61 DB        #00,#00,#00,#00     CHCURSOR 
         DB        #00,#00,#00,#01
         DB        #80,#03,#00,#01
         DB        #00,#00,#00,#00
* 
*        PLATO M1 CHARACTER SET 
* 
M1CODE00 DB        #00,#00,#00,#00     SPACE
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
M1CODE01 DB        #00,#00,#40,#00    SHORTER SLASH 
         DB        #80,#00,#00,#01
         DB        #00,#02,#00,#04
         DB        #00,#08,#00,#00
M1CODE02 DB        #00,#00,#A0,#02    EQUIVALENT
         DB        #A0,#02,#A0,#02
         DB        #A0,#02,#A0,#02
         DB        #00,#00,#00,#00
M1CODE03 DB        #00,#00,#00,#10     SPANISH N
         DB        #00,#20,#00,#20
         DB        #00,#10,#00,#10
         DB        #00,#20,#00,#00
M1CODE04 DB        #80,#00,#40,#01     REPLACEMENT ARROW
         DB        #20,#02,#70,#07
         DB        #40,#01,#40,#01
         DB        #40,#01,#00,#00
M1CODE05 DB        #50,#01,#60,#01     NOT EQUAL
         DB        #40,#01,#C0,#01
         DB        #40,#01,#40,#03
         DB        #40,#05,#00,#00
M1CODE06 DB        #00,#00,#00,#01     UP ARROW 
         DB        #00,#03,#F0,#07
         DB        #00,#03,#00,#01
         DB        #00,#00,#00,#00
M1CODE07 DB        #80,#00,#80,#00     RIGHT ARROW
         DB        #80,#00,#80,#00
         DB        #E0,#03,#C0,#01
          DB     #80,00,00,00 
M1CODE08 DB        #00,#00,#40,#00     DOWN ARROW 
         DB        #60,#00,#F0,#07
         DB        #60,#00,#40,#00
         DB        #00,#00,#00,#00
M1CODE09 DB        #80,#00,#C0,#01     LEFT ARROW 
         DB        #E0,#03,#80,#00
         DB        #80,#00,#80,#00
         DB        #80,#00,#00,#00
M1CODE0A DB        #00,#00,#00,#00     STAR 
         DB        #40,#02,#80,#01
         DB        #80,#01,#40,#02
         DB        #00,#00,#00,#00
M1CODE0B DB        #10,#10,#30,#18     CAPITAL SIGMA
         DB        #50,#14,#90,#12
         DB        #10,#11,#10,#10
         DB        #10,#10,#00,#00
M1CODE0C DB        #30,#00,#D0,#00     CAPITAL DELTA
         DB        #10,#03,#10,#0C
         DB        #10,#03,#D0,#00
         DB        #30,#00,#00,#00
M1CODE0D DB        #00,#00,#80,#03     CUP
         DB        #40,#00,#40,#00
         DB        #40,#00,#80,#03
         DB        #00,#00,#00,#00
M1CODE0E DB        #00,#00,#C0,#01     CAP
         DB        #00,#02,#00,#02
         DB        #00,#02,#C0,#01
         DB        #00,#00,#00,#00
M1CODE0F DB        #00,#00,#80,#00     DIVIDE 
         DB        #80,#00,#A0,#02
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
M1CODE10 DB        #E0,#01,#10,#02     ALPHA
         DB        #10,#02,#A0,#01
         DB        #60,#00,#90,#00
         DB        #10,#03,#00,#00
M1CODE11 DB        #02,#00,#FC,#03     BETA 
         DB        #10,#05,#10,#09
         DB        #10,#09,#90,#06
         DB        #60,#00,#00,#00
M1CODE12 DB        #00,#00,#E0,#0C     SMALL DELTA
         DB        #10,#13,#10,#11
         DB        #90,#08,#60,#04
         DB        #00,#00,#00,#00
M1CODE13 DB        #00,#00,#30,#10     LAMDA
         DB        #C0,#0C,#00,#03
         DB        #C0,#00,#30,#00
         DB        #00,#00,#00,#00
M1CODE14 DB        #02,#00,#02,#00     MU 
         DB        #FC,#03,#10,#00
         DB        #10,#00,#E0,#03
         DB        #10,#00,#00,#00
M1CODE15 DB        #00,#01,#00,#02     PI 
         DB        #F0,#03,#00,#02
         DB        #F0,#03,#00,#02
         DB        #00,#04,#00,#00
M1CODE16 DB        #06,#00,#38,#00     RHO
         DB        #E0,#00,#10,#01
         DB        #10,#02,#20,#02
         DB        #C0,#01,#00,#00
M1CODE17 DB        #E0,#00,#10,#01     SMALL SIGMA
         DB        #10,#02,#10,#03
         DB        #E0,#02,#00,#02
         DB        #00,#02,#00,#00
M1CODE18 DB        #E0,#01,#10,#02     OMEGA
         DB        #10,#00,#E0,#00
         DB        #10,#00,#10,#02
         DB        #E0,#01,#00,#00
M1CODE19 DB        #20,#02,#20,#02     LESSOR OR EQUAL
         DB        #20,#05,#20,#05
         DB        #A0,#08,#A0,#08
         DB        #00,#00,#00,#00
M1CODE1A DB        #00,#00,#A0,#08     GREATER OR EQUAL 
         DB        #A0,#08,#20,#05
         DB        #20,#05,#20,#02
         DB        #20,#02,#00,#00
M1CODE1B DB        #C0,#07,#20,#09     THETA
         DB        #10,#11,#10,#11
         DB        #10,#11,#20,#09
         DB        #C0,#07,#00,#00
M1CODE1C  DB     00,00,#80,00   EMBEDDED LEFT PAREN 
          DB     #40,01,#20,02
          DB     #F0,07,#10,08
          DB     #08,#10,00,00
M1CODE1D DB        #00,#00,#00,#0C     DEGREE SIGN
         DB        #00,#12,#00,#12
         DB        #00,#0C,#00,#00
         DB        #00,#00,#00,#00
M1CODE1E  DB     08,#10,#10,08 EMBEDDED RIGHT PAREN 
          DB     #F0,07,#20,02
          DB     #40,01,#80,00
          DB     #00,00,00,00 
M1CODE1F DB        #1C,#1C,#24,#12     RIGHT ARROW HEAD 
         DB        #48,#09,#90,#04
         DB        #20,#02,#40,#01
         DB        #80,#00,#00,#00
M1CODE20 DB        #84,#21,#44,#22     PART OF COPYRIGHT
         DB        #24,#24,#24,#24        CENTER
         DB        #24,#24,#24,#24
         DB        #44,#22,#00,#00
M1CODE21 DB        #00,#00,#00,#00    2 DOTS
         DB        #00,#10,#00,#00
         DB        #00,#10,#00,#00
         DB        #00,#00,#00,#00
M1CODE22 DB        #00,#00,#C0,#03     SQUARE 
         DB        #40,#02,#40,#02
         DB        #40,#02,#C0,#03
         DB        #00,#00,#00,#00
M1CODE23  DB     00,00,#80,01   MATRIX MULTIPLY 
          DB     #40,02,#40,02
          DB     #80,01,00,00 
          DB     #00,00,00,00 
M1CODE24 DB        #80,#00,#C0,#01     DIAMOND
         DB        #E0,#03,#F0,#07
         DB        #E0,#03,#C0,#01
         DB        #80,#00,#00,#00
M1CODE25  DB     #10,04,#20,02    VECTOR PRODUCT
          DB     #40,01,#80,00
          DB     #40,01,#20,02
          DB     #10,04,00,00 
M1CODE26  DB     00,00,00,00     SINGLE RIGHT QUOTE 
          DB     00,00,00,#10 
          DB     00,#20,00,#40
          DB     00,00,00,00
M1CODE27  DB     00,00,00,00      CEDILLA 
          DB     00,00,08,00
          DB     #10,00,#20,00
          DB     #00,00,00,00 
M1CODE28  DB     #00,00,00,#40   MAD HAT
          DB     00,#20,00,#10
          DB     00,#20,00,#40
          DB     00,00,00,00
M1CODE29  DB     00,00,#40,01    UP AND DOWN ARROWS 
          DB     #60,03,#F0,#07 
          DB     #60,#03,#40,01 
          DB     00,00,00,00
M1CODE2A  DB     00,00,00,00    VERTICAL LINE 
          DB     00,00,#F0,#1F
          DB     00,00,00,00
          DB     00,00,00,00
  
          BSSZ   #2000-*+START
  
  
  
          ORG    #2000
LWA       BSS    2           LWA OF RAM RESIDENT
CKSM      BSS    1           RAM RESIDENT CHECKSUM
          BSS    36 
         BSS       41             STACK STORAGE AREA
IST.STK  EQU       $              *****STACK INITIALIZATION ADDRESS*****
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*        TERMINAL VARIABLES AND SCRATCH AREA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
D.CNTL2  BSS       1              DISPLAY CONTROL 2 FOR CHARACTER GEN.
SIZE     BSS       1              CHARACTER SIZE REGISTER 
FWD.REV  BSS       1              CHARACTER PLOT FORWARD OR REVERSE 
HOR      BSS       1              HORIZONTAL PLOTTING FLAG
VER      BSS       1              VERTICAL PLOTTING FLAG. 
X.PLOT   BSS       2              X CONSTANT FOR NEXT CHARACTER.
Y.PLOT   BSS       2              Y CONSTANT FOR NEXT CHARACTER.
CHAR.GEN BSS       2              CHARACTER GENERATOR ADDRESS 
XREG     BSS       2              CURRENT X COORDINATE
YREG     BSS       2              CURRENT Y POSITION
XSAVE    BSS       2              X POSITION SCRATCH REGISTER 
YSAVE    BSS       2              Y POSITION SCRATCH REGISTER 
MEMSEL   BSS       2              CHARACTER MEMORY SELECTED ADDRESS 
M.ORG    BSS       2              BASE ADDRESS OF DATA
          ORG    #22E6
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
M.SBTYPE  DB     03 
M.CONFIG  DB     0
M.M0      DW     M0CODE00 
M.VERS    DB     01 
M.TYPE   BSS       1              TERMINAL TYPE 
M.CLOCK  BSS       2              CLOCK 
M.EXTPA  BSS       2              EXTERNAL INTERRUPT PROCESSOR ADDRESS
M.MARGIN BSS       2              MARGIN USED FOR CARRIAGE RETURNS
M.DIFF   BSS       2              INPUT FIFO DIFFERANCE COUNT.
M.CCR    BSS       2
M.MODE   BSS       2              WRITE/ERASE/MODE
M.DIR    BSS       2              DIRECTION OF STEPY/X, 0=FWD, 1=REV
M.KSW    BSS       2
M.ENAB   BSS       2
M.SELECT BSS       2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*        COMPUTER LOADED MODE ADDRESSES 
MODE5A   BSS       2              MODE 5 ADDRESS
MODE6A   BSS       2              MODE 6 ADDRESS
MODE7A   BSS       2              MODE 6 ADDRESS
*        COMPUTER LOADED CHARACTER SET STORAGE
MEMORY.2 BSS       2              CHARACTER SET M2 STORE ADDRESS
MEMORY.3 BSS       2              CHARACTER SET M3 STORE ADDRESS
MEMORY.4 BSS       2              CHARACTER SET M4 STORE ADDRESS
MEMORY.5 BSS       2              CHARACTER SET M5 STORE ADDRESS
MEMORY.6 BSS       2              CHARACTER SET M6 STORE ADDRESS
MEMORY.7 BSS       2              CHARACTER SET M7 STORE ADDRESS
          BSS    2
M.HALT    DW     0000 
M.STATUS  DW     0000 
  
MODE     BSSZ      1
SC.OC    BSSZ      1
* 
*FOLLOWING FLAGS USED FOR LOAD AND MUST BE IN THIS ORDER
* 
FLAGREG   BSSZ   1
CNTR      BSSZ   1
CHAR      BSSZ   1           INPUT DATA SAVE
CRC1      BSSZ   1           16 BIT CYCLIC
CRC2      BSSZ   1            REDUNDENCY CHECK. 
SEQ1      BSSZ   1           16 BIT LOAD BLOCK
SEQ2      BSSZ   1            SEQUEANCE NUMBER. 
LDN       BSSZ   1           LOAD FILE IDENTIFIER.
A1        BSSZ   1           24 BIT STARTING
A2        BSSZ   1            ADDRESS OF THE
A3        BSSZ   1             LOAD DATA. 
SAVE      BSSZ   1           SAVE DLE COUNT 
* 
*         OUTPUT MESSAGE STORE FOR LOAD PROTOCOL
* 
DISP4     EQU    *
          BSS    6           BLOCK NUMDER 
OUT1      EQU    *
          BSS    4           MSG L,N,N,CR 
OUT3      EQU    *
          BSS    2           MSG DLE,EOT
OUT4      EQU    *
          BSS    5           MSG NAK,XXYY 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
         END       START
