IST1B05 
         IDENT     IST
************************************************************************
* 
*                         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
* 
************************************************************************
*                  COMMUNICATIONS CHANNEL 
COMCHAN  EQU       1              COMMUNICATIONS CHANNEL NUMBER 
COMDAT1  EQU       0              COMMUNICATION CHANNEL UPPER BYTE
COMDAT2  EQU       1              COMMUNICATION CHANNEL MIDDLE BYTE 
COMDAT3  EQU       2              COMMUNICATION CHANNEL LOWER BYTE
COMDATU  EQU       1              COMMUNICATION OUTPUT DATA UPPER BYTE
COMDATL  EQU       0              COMMUNICATION OUTPUT DATA LOWER BYTE
COMSTAT  EQU       3              COMMUNICATION CHANNEL STATUS
COMCON   EQU       2              COMMUNICATION CHANNEL CONTROL FUNCTION
*                  KEYBOARD 
KEYCHAN  EQU       2              KEYBOARD CHANNEL NUMBER 
KEYDAT   EQU       2              KEYBOARD DATA 
KYBDCON  EQU       0              KEYBOARD CONTROL FUNCTION 
*                  TOUCH PANEL
TPCHAN   EQU       3              TOUCH PANEL CHANNEL NUMBER
TOUCHD   EQU       0                   TOUCH PANEL DATA 
TPCONT   EQU       0              TOUCH PANEL CONTROL 
TOUCHS   EQU       1              TOUCH PANEL STATUS
TPDIS    EQU       0              DISABLE TOUCH PANEL INTERRUPT 
TPEN     EQU       1              ENABLE TOUCH PANEL INTERRUPT
*                  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
YREAD    EQU       1              DISPLAY READ Y REGISTER FUNCTION
XREAD    EQU       0              DISPLAY X REGISTER FUNCTION 
*                  EXTERNAL DEVICES 
IDCHAN   EQU       5              ID CODE CHANNEL 
EXTCH5   EQU       5              EXTERNAL CHANNEL 5
EXTCH6   EQU       6              EXTERNAL CHANNEL 6
EXTCH7   EQU       7              EXTERNAL CHANNEL 7
EXTDATA  EQU       0              INPUT/OUTPUT DATA FUNCTION
EXTCNTL  EQU       1              EXTERNAL CONTROL OUTPUT FUNCTION
EXTSTAT  EQU       3              EXTERNAL IN STATUS
IDLSBS   EQU       0              INPUT LOWER BITS OF ID CODE.
IDMSBS   EQU       1              INPUT UPPER BITS OF ID CODE.
SLDATA0  EQU       0              OUTPUT LOWER BITS OF SLIDE DATA.
SLDATA1  EQU       1              OUTPUT UPPER BITS OF SLIDE DATA.
OPCHAN   EQU       0              OPERATORS PANEL CHANNEL NUMBER
OPDATA   EQU       0              OPERATORS PANEL OUTPUT DATA 
************************************************************************
************************************************************************
* 
*                       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       $
         JMP       RST.SEC0       MASTER RESET
* 
         DB        #00,#00,#00,#00,#00
* 
TRAP1    EQU       $
         PUSH      PSW            COMMUNICATIONS LINE 
         PUSH      B
         PUSH      D
         PUSH      H
         JMP       SIRINP 
* 
         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       START1         TERMINAL INITIALIZATION FROM RESET. 
R.DOT    JMP       POINT2         WRITE ERASE DOT 
R.LINE   JMP       LINE1          DRAW LINE 
R.CHARS  JMP       CHARS          DISPLAY CHARACTERS
R.BLOCK  JMP       BLOCK          BLOCK WRITE/ERA>E 
R.INPX   JMP       INPX           READ DISPLAY X COORDINATE 
R.INPY   JMP       INPY           READ DISPLAY Y COORDINATE 
R.OUTX   JMP       OUTX           SETS NEW X COORDINATE.
R.OUTY   JMP       OUTY           SETS NEW Y COORDINATE.
R.XMIT   JMP       FIFO.ST        TRANSMIT DATA TO HLP
R.MODE   JMP       MODESET        SETS MODE, WRITE/ERASE, BULK ERASE
R.STEPX  JMP       STEPX          STEPS X AXIS COORDINATE 
R.STEPY  JMP       STEPY          STEPS Y AXIS COORDINATE 
R.WE     JMP       POINT3         W/E CURRENT POSITION
R.DIR    JMP       DIR            SET DIRECTION OF XY STEP
R.INPUT  JMP       INPUT          DIRECTS DEVICE INPUT. 
R.SSF    JMP       SSF.X          EXTERNAL INTERFACE
R.CCR    JMP       CCR            SET CHARACTER INFO. 
R.EXTOUT JMP       EXTOUT         OUTPUT TO EXTERNAL DEVICE.
R.EXEC   JMP       EXEC           EXECUTE RESIDENT JOB STACK
R.GJOB   JMP       GJOB           LOAD DATA FROM JOBSTACK 
R.XJOB   JMP       XJOB           EXECUTE DATA FROM JOBSTACK
R.RETURN JMP       RESTORE        RESTORE REGS, ENABLE INTS, RETURN 
************************************************************************
* 
*        INITIALIZE TERMINAL ROUTINE
* 
************************************************************************
START1   EQU       $
         LXI       SP,IST.STK     INITIALIZE STACK POINTER
         LXI       H,IST.STK
* 
*        CLEAR MEMORY FROM TOP OF STACK TO ADDRESS HEX 2300.
* 
START2   EQU       $
         MVI       M,00           CLEAR MEMORY
         INX       H              INCREMENT TO NEXT ADDRESS.
         MVI       A,#23          LOAD WITH LAST ADDRESS TO CLEAR.
         XRA       H              TEST FOR LAST ADDRESS TO CLEAR
         JNZ       START2              JUMP IF NOT COMPLETE 
         MVI       A,#3F
         STA       COMMAND+3      STORE CHAR.BUFF.TERM. 
* 
         MVI       A,#CD          STORE IN EXT.OUT
         STA       EXT.OUT        A CALL TO STATEX AND
         LXI       H,STATEX       AN OUTPUT COMMAND.
         SHLD      EXT.OUT+1
         MVI       A,#D3          LOAD EXTERNAL 
         STA       EXT.OUT+3
         MVI       A,#DB          LOAD INPUT OP CODE
         STA       EXT.IN           AND STORE IN EXTERNAL INPUT.
         MVI       A,#C9                  MEMORY. 
         STA       EXT.OUT+5
         STA       EXT.IN+2 
* 
         IN        RSF.PANL*32+PANLSWCH INPUT PANEL SWITCHES
         ANI       #82            AND MASK MEMORY SIZE
         RLC                        LOAD FOR MEMORY SIZE
         ORI       #72               AND PLATO 5 TERMINAL 
         STA       M.TYPE 
* 
*        DISPLAY MESSAGE SAYING TERMINAL READY
* 
START3   EQU       $
         LXI       D,00           SET Y AXIS TO BOTTOM
         LXI       H,200          SET X AXIS
         CALL      OUTCOORD         TO CENTER OF DISPLAY. 
* 
         MVI       A,01           CLEAR ALL 
         OUT       DISCHAN*32+DISCON2  ROM DISPLAY. 
* 
         CALL      INIT.PLT       INITIALIZE CHARACTER PLOTTING.
* 
         LXI       H,DATA         LOAD ADDRESS OF TERMINAL READY MESS.
         CALL      CHARS          DISPLAY TERMINAL READY MESSAGE
* 
START4   EQU       $
         LXI       H,#0382        LOAD POWER-ON STATUS. 
         CALL      FIFO.ST          AND LOAD FIFO FOR TRANSMIT. 
* 
         LXI       H,#00C0        LOAD INITIAL MASK ENABLING
         CALL      ENAB             THE KEYBOARD AND COMM LINE. 
         EI                       ENABLE SYSTEM INTERRUPTD. 
         JMP       SCAN             AND GO TO SCANNER.
* 
* 
DATA     EQU       $
         DB        #14,#05,#12,#0D
         DB        #09,#0E,#01,#0C
         DB        #2D,#12,#05,#01
         DB        #04,#19,#2D,#02
         DB        #3F,#10,#1B,#20
         DB        #03,#3F,#00
* 
************************************************************************
* 
*        INTERRUPT PROCESSOR ROUTINES 
* 
************************************************************************
* 
*        COMMUNICATIONS LINE INTERRUPT
* 
SIRINP   IN        COMCHAN*32+COMSTAT 
         RAL
         STA       COM.STA        STORE COMM LINE STATUS
         JNC       XMIT 
* 
*        INPUT STATUS AND TEST FOR COMMUNICATIONS ERRORS
* 
         RAL
         RAL                      TEST FOR PARITY ERROR 
         JNC       INTER1 
* 
*        TEST FOR TERMINAL IN ABORT MODE
* 
INTER0   EQU       $
         LDA       ABORT          LOAD THE ABORT FLAG 
         CPI       00               AND TEST FOR ABORT MODE 
         JNZ       XMIT           ABORT MODE, GO TO TRANSMIT. 
* 
*        COMMUNICATIONS ERROR, SET ABORT MODE 
* 
INTER1.A EQU       $
         MVI       A,#60          SET 
         STA       ABORT            ABORT FLAG
         OUT       OPCHAN*32+OPDATA   ERROR LIGHT 
         LXI       H,WORDCNT
         INR       M
         MOV       A,M
         ANI       #7F
         MOV       L,A            LOAD WORD COUNT 
         MVI       H,03             AND OP CODE.
         CALL      FIFO.ST          AND LOAD FIFO FOR TRANSMIT. 
         JMP       XMIT 
* 
*        SAVE COMMUNICATION INPUT DATA
* 
INTER1   EQU       $
         LHLD      M.CLOCK
         INX       H              INCREMENT CLOCK 
         SHLD      M.CLOCK
         IN        COMCHAN*32+COMDAT3  UT DATA
         ANI       #3F
         MOV       C,A            SAVE LOWER BYTE OF INPUT
         IN        COMCHAN*32+COMDAT2 
         ANI       #3F
         MOV       B,A            SAVE MIDDLE BYTE OF INPUT 
         IN        COMCHAN*32+COMDAT1 
         ANI       #BF
         MOV       D,A            SAVE UPPER BITS OF INPUT
* 
*        TEST TO DETERMINE IF RESTART COMMAND HAS BEEN RECEIVED 
* 
INTER2   EQU       $
         ANI       #BA                 MASK OFF UNWANTED BITS 
         CPI       #0A                 TEST FOR OP CODE=001 AND LOAD WC 
         JNZ       INTER3         NO WORD COUNT 
* 
*        RESTART
* 
         MOV       A,D            LOAD UPPER BITS OF WORD COUNT 
         RRC                           SHIFT INTO POSITION
         RRC
         ANI       #40                 MASK OFF UNWANTED BITS 
         MOV       E,A
         MOV       A,B            LOAD MIDDLE BYTE OF INPUT 
         ADD       E
         DCR       A
         STA       WORDCNT             STORE NEW WORD COUNT 
         LXI       H,ABORT        TEST THE
         XRA       A                ABORT FLAG
         CMP       M                  FOR ABORT MODE. 
         JZ        INTER6         NOT SET, THIS IS A LDM. 
* 
         MOV       M,A            CLEAR ABORT FLAG. 
         OUT       OPCHAN*32+OPDATA  LEAR ERROR LIGHT.
         JMP       INTER7 
* 
*        NOT RESTART, TEST FOR ABORT MODE.
* 
INTER3   EQU       $
         LDA       ABORT          TEST ABORT
         ORA       A              FOR ABORT MODE. 
         JNZ       RESTORE        IN ABORT MODE.
* 
*        TEST FOR NOOP COMMAND
* 
         MVI       A,#B8          SET CTL,INSTR. CODE BITS
         ANA       D              MASK W/ UPPER BITS OF INP.
         CPI       08 
         JNC       INTER6 
         MOV       A,C            LOAD LOWER BYTE 
         RAR                        AND TEST FOR SOFTWARE NOOP
         JNC       XMIT 
         JMP       INTER7         INCREMENT WORD COUNT
* 
*        LOAD COMMAND INTO RX.FIFO FOR PROCESSING.
* 
INTER6   EQU       $
         LDA       M.DIFF         LOAD RECEIVE DIFFERANCE DOUNT.
         CPI       #7F              AND TEST FOR FULL BUFFER. 
         JNC       INTER1.A       BUFFER FULL, GO TO ABORT. 
         INR       A              INCREMENT RECEIVE 
         STA       M.DIFF           DIFFERANCE COUNT. 
         LXI       H,RX.FIFO      LOAD ADDRESS OF RECIEVE FIFO. 
         MOV       E,M            LOAD INPUT POINTER. 
         INR       M
         INR       M              INCREMENT POINTER 
         INX       H              INCREMENT TO START OF 
         INX       H                BUFFER STORE AREA.
         XCHG                     SAVE BUFFER START ADDRESS 
         MOV       A,H            SAVE UPPER BITS OF INPUT
         MVI       H,00 
         DAD       H              SET INPUT POINTER FOR 
         DAD       D              ADD INDEX TO START OF BUFFER. 
         MOV       M,C              AND STORE 
         INX       H
         MOV       M,B                THE INPUT 
         INX       H
         MOV       M,A
* 
*        INCREMENT INPUT WORD COUNT.
* 
INTER7   EQU       $
         LXI       H,WORDCNT      LOAD ADDRESS OF WORD COUNT
         INR       M                WORD COUNT. 
* 
*        TRANSMIT ROUTINE 
*        IF CHARACTER REQUEST IS SET, THE FIFO BUFFER IS CHECKED FOR
*        DATA TO TRANSMIT.
* 
XMIT     EQU       $
         LDA       COM.STA        LOAD COMM LINE STATUS 
         RAL                      TEST FOR CHARACTER REQUEST BIT
         JNC       RESTORE        NOT SET, RETURN TO PREVIOUS PROCCESS
* 
         LXI       H,TX.FIFO      LOAD ADDRESS OF TRANSMIT BUFFER 
         CALL      FIFO.RD          AND FETCH TRANSMIT DATA.
         MOV       A,H            TEST FOR DATA IN BUFFER 
         RAL
         JC        RESTORE        NO DATA IN BUFFER.
* 
         MOV       A,L            LOAD LOWER BITS 
         OUT       COMCHAN*32+COMDATL  ND TRANSMIT. 
         MOV       A,H            LOAD UPPER BITS 
         OUT       COMCHAN*32+COMDATU  ND TRANSMIT. 
         MVI       A,01           TURN OFF CHARACTER REQUEST INT. 
         OUT       COMCHAN*32+COMCON
* 
*        LOAD ALL REGISTERS FROM STACK TO RESTORE 
* 
RESTORE  EQU       $
         POP       H              RESTORE REGISTERS 
         POP       D
         POP       B
         POP       PSW
         EI                            ENABLE SYSTEM INTERRUPT
         RET
* 
*        KEYBOARD INTERRUPT 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
KEYINP   IN        KEYCHAN*32+KEYDAT
         CMA                      INPUT CHARACTER FROM KEY BOARD
         ANI       #7F
         MVI       H,#40          LOAD OP CODE AND CATAGORY BITS
         MOV       L,A            B05,LOAD DATA 
         CALL      FIFO.ST        B05,STORE FOR USER/PLATO
         MVI       A,#01          B05 
         OUT       KEYCHAN*32+KYBDCON  B05,ENABLE KYBD INT. 
         JMP       RESTORE
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        TOUCH PANEL INTERRUPT
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
TOUCHINP IN        TPCHAN*32+TOUCHD 
         MVI       H,#41          LOAD OP CODE AND CATAGORY BITS
         MOV       L,A            LOAD DATA 
         CALL      FIFO.ST          STORE FOR USER/PLATO. 
         JMP       RESTORE
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        EXTERNAL INTERRUPT PROCESSOR.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
EXT.PR   EQU       $
* 
         LHLD      M.EXTPA
         MOV       A,L
         ORA       H
         JNZ       EXT.PR2        JUMP TO USER IF ZERO
* 
         CALL      EXT.IN         INPUT DEVICE DATA 
         MOV       L,A            AND LOAD UP FOR 
         MVI       H,#82          FIFO INSERT 
         CALL      FIFO.ST        FOR TRANSFER. 
         JMP       RESTORE        RETURN TO PREVIOUS PROCESSING.
EXT.PR2  EQU       $
         PCHL                     JUMP TO USER IF ZERO
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        SCANNER
* 
*        DURING TERMINAL IDLE , PROGRAM CONTROL REMAINS IN THIS ROUTINE 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
* 
SCAN     EQU       $
         CALL      EXEC           GO TEST FIFO BUFFERS FOR PROCESSING.
         XRA       A              CLEAR USER'7S FLAG
         STA       M.FLAG0
         JMP       SCAN 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        CONTRL TO STAY IN THIS LOOP UNTIL RX.FIFO AND TX.FIFO
*        ARE EMPTY OF ALL DATA. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
EXEC     EQU       $
         LDA       M.DIFF         LOAD RECEIVE DIFFERANCE COUNT.
         ORA       A                AND TEST FOR DATA IN BUFFER 
         CNZ       PROCESIN       DATA, GO PROCESS INPUT. 
* 
         LDA       TX.FIFO        LOAD FIFO DIFFERANCE COUNT
         ORA       A                AND TEST FOR DATA TO TRANSMIT.
         MOV       B,A            SAVE COUNT. 
         JZ        EXEC.1         NO TRANSMIT 
* 
         MVI       A,03           SET CHARACTER REQUEST INT. ENABLE 
         OUT       COMCHAN*32+COMCON
* 
EXEC.1   EQU       $
         LDA       M.DIFF         LOAD RECEIVE DIFFERANCE COUNT.
         ORA       B                TEST RECEIVE AND TRANMIT FOR DATA.
         RZ                       NO DATA TO PROCESS, RETURN TO CALLER. 
         JMP       EXEC           TEST FOR MORE DATA TO PROCESS.
*        THIS ROUTINE IS ENTERED FROM THE SCANNER. ITS PURPOSE IS TO
*        PROCESS THE INPUT REQUEST WHETHER IT IS DATA FOR THE SELECTED
*        MODE OR IT IS AN INSTRUCTION REDEFINING THE MODE OF OPERATION
* 
************************************************************************
* 
*                  INSTRUCTION CODES
* 
*        OP CODES 
*        0 0 0       NO OPERATION 
*        0 0 1       LOAD TERMINAL OPERATING MODE 
*        0 1 0       LOAD X/Y COORDINATE
*        0 1 1       LOAD ECHO COMMAND
*        1 0 0       LOAD MEMORY ADDRESS
*        1 0 1       LOAD SLIDE SELECTOR
*        1 1 0       LOAD EXTERNAL CHANNEL 1
*        1 1 1       LOAD EXTERNAL CHANNEL 2
* 
*        THE LAST TWO COMMANDS LISTED ABOVE ARE TREATED AS NO 
*        OPERATIONS IN THIS TERMINAL BECAUSE OF ITS FIXED CONFIGERATION 
*        NOT INCLUDING THESE PERIPHERAL DEVICES 
* 
************************************************************************
* 
*        TEST TO DETERMINE IF AN DATA OR INSTRUCTION WORD 
* 
GJOB     EQU       $
         LXI       H,M.DIFF       LOAD ADDR. OF RX COUNT
         DCR       M              DECREMENT COUNT 
         LXI       H,RX.FIFO+1    LOAD ADDR OF OUT POINTER
         MOV       E,M            LOAD OUT POINTER
         INR       M              UPDATE
         INR       M                POINTER 
         INX       H              POINT TO START OF STORE 
         XCHG                       AREA AND SAVE [DE]
         MVI       H,00           CLEAR UPPER BYTE OF POINT 
         DAD       H              DOUBLE POINTER
         DAD       D              ADD TO START OF STORE 
         MOV       C,M            GET 1ST BYTE OF DATA
         INX       H                AND SAVE IN C REG.
         MOV       B,M            GET 2ND BYTE OF DATA
         INX       H                AND SAVE IN B REG.
         MOV       E,M            GET 3RD BYTE OF DATA
         MOV       H,B            H=2ND BYTE
         MOV       L,C            L=1ST BYTE
         RET
PROCESIN EQU       $
         CALL      GJOB 
* 
XJOB     EQU       $
         MOV       B,E            SAVE UPPER BYTE AS [B]
         LXI       D,COMMAND+2
         MOV       A,L
         STAX      D              STORE 
         DCX       D                E,H, AND L
         MOV       A,H                IN COMMAND. 
         STAX      D
         DCX       D
         MOV       A,B
         STAX      D
* 
         RLC
         JC        DATAMODE            JUMP IF DATA WORD
* 
*        INSTRUCTION WORDS THAT DEFINE THE TERMINAL OPERATING CHARACTERI
* 
         RRC
         RRC
         RRC
         ANI       #0E                 MASK OFF ALL BITS ECCEPT OP CODE 
         MVI       B,#00               CLEAR B REGISTER 
         MOV       C,A
* 
* 
         LXI       H,COMTABLE          LOAD BASE ADDRESS OF JUMP TABLE
         DAD       B              ADD TO FORM TABLE POINTER 
         MOV       E,M                 LOAD LEAST SIGN BYTE OF JUMP ADDR
         INX       H
         MOV       D,M                 LOAD MOST SIGN BYTE
         XCHG 
         PCHL                          JUMP TO ROUTINE
* 
* 
*        JUMP ADDRESS TABLE FOR INSTRUCTIONS
* 
COMTABLE EQU       $
         DW        NOOP           NO OPERATION
         DW        LDM            TERMINAL OPERATION MODE 
         DW        LDC            X/Y COORDINATE
         DW        ECHO           ECHO COMMAND
         DW        LDA            MEMORY ADDRESS
         DW        SSF            SELECT SPECIAL FUNCTION 
         DW        EXT            LOAD EXTERNAL DEVICE
         DW        EXT            EXTERNAL CHANNEL 2
************************************************************************
* 
*        LOAD TERMINAL OPERATING MODE INSTRUCTION 
* 
*        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
* 
************************************************************************
LDM      EQU       $
         LDA       COMMAND        LOAD UPPER BITS OF INPUT. 
         MOV       B,A            SAVE UPPER BYTE 
LDM1     EQU       $
         LDA       INH.FLG        LOAD INHIBIT FLAG 
         XRA       B                AND TEST FOR CHANGE 
         ANI       04                 IN INHIBIT STATUS.
         JZ        LDM3           NO CHANGE, CONTINUE PROCESS.
* 
         ANA       B              TEST FOR SET OR CLEAR INHIBIT 
         STA       INH.FLG          AND STORE NEW FLAG. 
         JZ        LDM2               NO INHIBIT, TURN ON TOUCH PANEL.
* 
         LDA       M.ENAB 
         ANI       #D7
         MOV       L,A
         MVI       H,00 
         CALL      ENAB           DISABLE TOUCH PANEL.
         JMP       LDM3           * 
* 
LDM2     EQU       $
         IN        TPCHAN*32+TOUCHS  NPUT TOUCH PANEL STATUS
         RAR                        AND TEST FOR CHARACTER READY STATUS.
         JNC       LDM2A            NO CHARACTER READY, ENABLE INTERRUPT
         IN        TPCHAN*32+TOUCHD    DUMMY INPUT TO CLEAR REGISTERS.
* 
LDM2A    EQU       $
         LDA       M.ENAB 
         ORI       #28
         MOV       L,A
         MVI       H,00 
         CALL      ENAB           ENABLE TOUCH PANEL. 
* 
LDM3     EQU       $
         LDA       COMMAND+2          LOAD MODE 
         MOV       L,A            SAVE MODE AND W/E BITS
* 
MODESET1 EQU       $
         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 
         XRA       A              CLEAR A REGISTER
         STA       MODE4CNT            SYNC MODE 4 FLAG 
* 
         MOV       A,L            LOAD MODE AND W/E BITS
         RRC
         ANI       #1F            MASK OFF UNWANTED BITS
         STA       M.MODE           AND STORE.
         RET
* 
MODESET  EQU       $
         MOV       A,L            LOAD FOR RESIDENT 
         JMP       MODESET1 
************************************************************************
* 
*        LOAD X/Y COORDINATE    THIS INSTRUCTION LOADS THE X REGISTER 
*        (BIT10=0) OR THE Y REGISTER(BIT10=1) WITH BITS 01 THROUGH 09 
* 
************************************************************************
LDC      EQU       $
         CALL      ASSEMBLE       LOAD THE COMM LINE DATA 
         MOV       C,L            SAVE CONTROL BITS IN C REG. 
* 
LDC1     EQU       $
         MVI       A,04           TEST FOR RELATIVE OR ABSOLUTE . 
         ANA       C                COORDINATE. 
         JZ        LDC4           ABSOLUTE, GO SET COORDINATES AS RECVED
* 
         MOV       A,C            RELATIVE, TEST FOR
         ANI       06               POSITIVE OR 
         CPI       04                 NEGATIVE RELATIVE POSITION. 
         JZ        LDC2           POSITIVE, GO ADD TO CURRENT.
* 
         XCHG                     NOT POSITIVE, 
         CALL      COMPHL           COMPLIMENT HL FOR 
         XCHG                         SUBTRACTION.
* 
LDC2     EQU       $
         MOV       A,C            TEST FOR X OR Y 
         RAR                        AXIS TO BO CHANGED. 
         JC        LDC3           Y AXIS, GO DO IT. 
* 
         CALL      INPX           LOAD CURRENT X COORDINATE 
         DAD       D                AND ADD TO LOADED VALUE.
         CALL      OUTX           SET NEW X COORDINATE
         JMP       LDC6           GO TEST FOR MARGIN SET. 
* 
LDC3     EQU       $
         CALL      INPY           LOAD CURRENT Y COORDINATE 
         DAD       D                AND ADD TO LOADED VALUE.
         CALL      OUTY           SET NEW Y COORDINATE. 
         JMP       LDC6           GO TEST FOR MARGIN SET. 
* 
LDC4     EQU       $
         MOV       A,C            TEST FOR X OR Y 
         XCHG                       AXIS TO BE
         RAR                          SET BY LOADED VALUE 
         JC        LDC5           GO OUTPUT NEW Y 
         CALL      OUTX           OUTPUT NEW X COORDINATE 
         JMP       LDC6           GO TEST FOR MARGIN SET. 
* 
LDC5     EQU       $
         CALL      OUTY           SET NEW Y COORDINATE
* 
LDC6     EQU       $
* 
         MVI       A,08           TEST BITS FOR 
         ANA       C                MARGIN LOAD THIS COORDINATE.
         RZ                       NOT SO, RETURN. 
* 
         SHLD      M.MARGIN       STORE NEW MARGIN FOR CARRIAGE RETURNS 
         RET                      EXIT. 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
* ECHO COMMAND
*        70H-TESTS MEMORY CONFIGURATION OF TERMINAL 
*            RESPONDS WITH';       72H- 4K
*                                 73H- 20K
*                                 76H- 8K 
*                                 77H- 24K
*        7BH-SOUND AUDIBLE AUDIBLE ALERT
*        7CH-ID SERIAL NUMBER 
*        7DH-SEND USER FLAG 
*        OTHERS LOOP BACK 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
ECHO     EQU       $
         CALL      ASSEMBLE       DE HAS BITS 1-9 OF INPUT
         MOV       A,E
         ANI       #7F
         CPI       #7C            TEST FOR ID CODE RESPONSE 
         JNZ       LDE1              NOT ID REQUEST 
         IN        RSF.PANL*32+PANLSWCH 
         ANI       #20            TEST FOR ID SWITCHES
         MVI       A,#7C          RELOAD ECHO CODE. 
         JZ        ECHO.ST        NO ID SWITCHES, SEND BACK ECHO CODE 
         MVI       C,00 
         IN        IDCHAN*32+IDLSBS  ADD LOWER 8 BITS IF ID 
         CALL      LDE3           SET ID CODE IN ECHO RESPONSE
         MVI       C,#20
         IN        IDCHAN*32+IDMSBS  LOAD UPPER BITS OF ID CODE.
         CALL      LDE3           SET ID CODE IN ECHO RESPONSE. 
         RET
* 
LDE3     EQU       $
         MOV       B,A            SAVE ID CODE. 
         ANI       #0F            MASK OFF LOWER 4 BITS 
         ORA       C              ADD ID RESPONSE NUMBER
         PUSH      B              SAVE ID CODE AND RESPONSE 
         CALL      ECHO.ST        STORE CODE FOR TRANSMIT 
         POP       B              RETRIEVE ID CODE
         MOV       A,B
         RRC                      POSITION UPPER
         RRC                         FOUR BITS
         RRC                            OF ID CODE FOR
         RRC                               ECHO RESPONSE. 
         ANI       #0F            MASK OFF UNWANTED BITS. 
         ORA       C              ADD RESPONSE
         ORI       #10              NUMBER FOR 'P'L'A'T'O 
         JMP       ECHO.ST        STORE CODE FOR TRANSMIT 
* 
LDE1     EQU       $
         CPI       #7B            TEST FOR AUDIBLE ALERT
         JNZ       LDE1.A 
         IN        TPCHAN*32+TOUCHD  SOUND TONE AND RETURN
         RET
LDE1.A   EQU       $
         CPI       #70            TEST FOR TERMINAL TYPE
         JNZ       LDE2 
         LDA       M.TYPE         LOAD TERMINAL TYPE
         JMP       ECHO.ST
LDE2     EQU       $
         CPI       #7D            TEST FOR SENDING
         JNZ       ECHO.ST
         LHLD      MEMREG 
         MOV       A,M
         ANI       #7F
* 
ECHO.ST  EQU       $
         ORI       #80            INCLUDE ECHO CODE 
         MOV       L,A              AND STORE 
         MVI       H,00               IN TRANSMIT FIFO. 
         CALL      FIFO.ST
         RET
************************************************************************
* 
*        LOAD MEMORY ADDRESS     THIS INSTRUCTION LOADS THE MEMORY
*        ADDRESS REGISTER WITH BITS 01 THROUGH 10.  THIS INSTRUCTION
*        SPECIFIES THE FIRST STORAGE ADDRESS TO BE USED UPON ENTRY
*        INTO A MODE 1 OPERATION
* 
************************************************************************
LDA      EQU       $
         XRA       A              CLEAR THE 
         STA       BC.REG           BLOCK CHECK REGISTER. 
* 
         CALL      ASSEMBLE       LOAD INPUT DATA.
         MOV       A,L
         ANI       #3F
         RLC
         ADD       D
         MOV       H,A
         MOV       L,E
         SHLD      MEMREG              STORE ADDRESS INTO MEMORY REGISTE
         RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        SSF  (SELECT SPECIAL FUNCTION) 
* 
*        THIS INSTRUCTION ESTABLISHES SPECIAL FUNCTIONS WITHIN THE
*        TERMINAL AND SELECTS THE VARIOUS OUTPUT DEVICES. BITS 11 THRU
*        15 SPECIFY THE DEVICE OR SPECIAL FUNCTIONS AND BITS 01 
*        THRU 10 SPECIFY CONTROL FUNCTIONS. 
* 
*        FUNCTION TYPE (BITS 11 THRU 15)
*                  00             SELECT SLIDE PROJECTOR
*                  01             SET INTERRUPT MASK
*                  02             SERIAL CHANNEL DATA 
*                  03             SERIAL CHANNEL CONTROL
*                  04-1F          PARALLEL CHANNEL DATA/CONTROL 
* 
*        FUNCTION OPERATIONS      (BITS 01 THRU 10) 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
* 
*        TEST FOR EXISTENCE OF EXTERNAL INTERFACE.
* 
SSF      EQU       $
         CALL      ASSEMBLE       LOAD FUNCTION 
         MVI       A,#3F          LOAD LOWER
         ANA       L                15 BITS INTO
         RLC                          HL REGISTER 
         ORA       D                    FOR PROCESSING. 
         MOV       H,A
         MOV       L,E
* 
SSF.X    EQU       $
         IN        RSF.PANL*32+PANLSWCH  PUT THE SWITCH SETTINGS
         ANI       #20                   AND TEST FOR SWITCH NO. 6
         RZ 
* 
         MOV       A,H            LOAD UPPER BITS 
         RRC                        AND TEST
         RRC                          FOR 
         ANI       #1F                  SLIDE PROJECTOR.
         JZ        SSF.1          GO TO SLIDE PROTECTOR 
* 
*        TEST FUNCTION TYPE 
* 
* 
         CPI       01             TEST FOR INTERRUPT MASK 
         JZ        SSF.3          SET MASK. 
* 
         MOV       E,A            SAVE ADDRESS BITS 
         MVI       A,02             AND TEST
         ANA       H                  FOR INPUT OR OUTPUT.
         MVI       A,#E0          LOAD UPPER ADDRESS BITS 
         JNZ       SSF.2          GO TO INPUT 
* 
*        SELECT EXTERNAL DEVICE 
* 
         ORA       E              LOAD DEVICE ADDRESS 
         STA       EXT.OUT+4         AND STORE FOR OUTPUT 
         MVI       A,01           TEST FOR
         ANA       H               OUTPUT BYPASS
         RNZ
* 
         MOV       A,L            LOAD SLIDE DATA 
         CALL      EXT.OUT        OUTPUT TO EXTERNAL DEVICE.
         RET
* 
*        SLIDE PROJECTOR
* 
SSF.1    EQU       $
         MOV       A,L            LOAD DATA 
         OUT       EXTCH7*32+SLDATA0   OUTPUT SLIDE PROJECTOR DATA. 
         MVI       A,03           LOAD LAMP AND SHUTTER BITS
         ANA       H                FOR SLIDE PROJECTOR.
         OUT       EXTCH7*32+SLDATA1   OUTPUT SLIDE PROJECTOR DATA. 
         RET
* 
*        INPUT FROM EXTERNAL DEVICE.
* 
* 
SSF.2    EQU       $
         ORA       E              LOAD DEVICE ADDRESS 
         STA       EXT.IN+1         AND STORE IN INSTRUCTION. 
         MVI       A,01 
         ANA       H              TEST FOR
         RNZ                         DATA BYPASS. 
         CALL      EXT.IN         INPUT DEVICE DATA.
         MOV       L,A              AND LOAD UP FOR 
         LDA       M.KSW          LOAD USER/PLATO FLAG
         CPI       03 
         RZ                       RETURN IF USER SELECTED 
         MVI       H,#82            FOR TRANSMIT TO PLATO.
         CALL      FIFO.ST        LOAD TRANSMIT BUFFER. 
         RET
* 
SSF.3    EQU       $
         LDA       M.ENAB         LOAD CURRENT ENABLE BITS
         ANI       #80              AND MASK COMM LINE BIT. 
         ORA       L              INCLUDE CURRENT COMM LINE BITS .
* 
SSF.4    EQU       $
         MOV       L,A              AND LOAD FOR
         MVI       H,00             SETTING M.ENAB
         ANI       #20
         JZ        SSF.5
         IN        TPCHAN*32+TOUCHS INPUT T.P.STATUS
         RAR                      TEST FOR CHAR. READY
         JNC       SSF.5          CHAR.NOT RDY,ENABLE 
         IN        TPCHAN*32+TOUCHD  DUMMY INPUT TO CLEAR 
SSF.5    EQU       $
         JMP       ENAB 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        EXT       (LOAD EXTERNAL DEVICE) 
* 
*        THIS INSTRUCTION PASSES DATA TO THE DEVICE SELECTED BY THE 
*        SSF INSTRUCTION. ALL 19 BITS OF THE INSTRUCTION ARE PASSED 
*        IN THE FOLLOWING MANNER. 
* 
*        OUTPUT DATA FUNC. 1      BITS 01-08
*        OUTPUT DATA FUNC. 2      BITS 09-16
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
* 
*        TEST FOR EXISTANCE OF EXTERNAL INTERFACE.
* 
EXT      EQU       $
         IN        RSF.PANL*32+PANLSWCH  PUT THE SWITCH SETTINGS
         ANI       #20                   AND TEST FOR SWITCH NO. 6
         RZ 
* 
         CALL      ASSEMBLE 
         DAD       H              ROTATE UPPER 9 BITS LEFT. 
         MOV       A,L       LOAD BITS 10 THRU 16 
         ORA       D                ADD BIT 09
         CALL      EXT.OUT          EXT AND OUTPUT TO DEVICE. 
         MOV       A,E            LOAD MIDDLE BITS OF EXT 
         JMP       EXT.OUT            AND OUTPUT TO DEVICE. 
STATEX   PUSH      A
         LDA       EXT.OUT+4      LOAD DEVICE ADDRESS 
         ANI       #1E            IS SERIAL DATA/CONTROL
         CPI       #02            IF YES, LOOP
         JNZ       EXT.2          OTHERWISE,CONTINUE
EXT.1    IN        EXTCH7*32+EXTSTAT LOOP UNTIL CHARACTER 
         ANI       #02               REQUEST IS UP
         JZ        EXT.1
EXT.2    POP       PSW
         RET
************************************************************************
* 
*        DATA WORDS THAT PERFORM OPERATIONS SPECIFIED BY THE MODE SELECT
* 
************************************************************************
* 
*        MODE 0  POINT PLOT 
*        MODE 1  DRAW LINE
*        MODE 2  LOAD MEMORY
*        MODE 3  CHARACTER
*        MODE 4  BLOCK ERASE
*        MODE 5  JUMP INDIRECT TO RAM MEMORY
*        MODE 6  JUMP INDIRECT TO RAM MEMORY
*        MODE 7  JUMP INDIRECT TO RAM MEMORY
* 
************************************************************************
DATAMODE MVI       B,#00
         LDA       M.MODE         LOAD MODE WRITE ERASE BITS
         ANI       #1C              AND MASK MODE BITS
         RRC                           RIGHT SHIFT
         MOV       C,A
         LXI       H,DATABLE           LOAD BASE ADDRESS OF JUMP TABLE
         DAD       B                   FORM TABLE POINTER 
         MOV       E,M                 LOAD LEAST SIGN BYTE 
         INX       H
         MOV       D,M                 LOAD MOST SIGN BYTE
         XCHG 
         PCHL                          JUMP TO ROUTINE
* 
*        JUMP ADDRESS TABLE FOR DATA WORDS
* 
DATABLE  DW        POINT
         DW        LINE 
         DW        MEMORY 
         DW        CHARACT
         DW        MODE4
         DW        MODE5
         DW        MODE6
         DW        MODE7
************************************************************************
* 
*        MODE 0 IS THE POINT PLOTTING MODE.  EACH MODE 0 DATA WORD
*        SPECIFIES THE ADDRESS OF A POINT ON THE DISPLAY TO BE WRITTEN
*        OR ERASED.  BIT 02 OF THE LDM INSTRUCTION DETERMINES WHETHER IT
*        IS A WRITE OR ERASE OPERATION
* 
************************************************************************
POINT    EQU       $
* 
         CALL      ASSEMBLE       LOAD INPUT DATA 
* 
POINT2   CALL      OUTCOORD            GO OUTPUT COORDINATES TO DISPLAY 
* 
POINT3   EQU       $
         LDA       M.MODE         LOAD MODE WRITE ERASE BITS
         RLC
         ANI       #06
         OUT       DISCHAN*32+DISCON2    SET WRITE ERASE BITS 
         MVI       A,#A0
         OUT       DISCHAN*32+DISCON1    VECT/Y SHORT/X POS 
         MVI       A,#00
         OUT       DISCHAN*32+DISDATA 
         MVI       A,#F8
         OUT       DISCHAN*32+DISCON1       VECTOR/INHIBIT/Y SHORT/ X NE
         MVI       A,#00
         OUT       DISCHAN*32+DISDATA       DECREMENT X AXIS
         RET
************************************************************************
* 
*        MODE 1 IS THE VECTOR DRAWING MODE.  EACH MODE 1 DATA WORD
*        SPECIFIES THE TERMINATING COORDINATES OF A LINE,THE ORGIN OF 
*        WHICH IS CONTAINED IN THE X AND Y REGISTER. THE TERMINAL POINT 
*        OF A GIVEN LINE IS ALSO THE ORIGIN OF THE NEXT LINE.  LINE 
*        ORIGINS CAN BE RELOCATED BY THE LDC INSTRUCTION WITHOUT
*        EXITING FROM MODE 1
* 
************************************************************************
LINE     EQU       $
         CALL      ASSEMBLE       LOAD X AND Y COORDINATES. 
* 
LINE1    EQU       $
         MVI       B,01           LOAD MASK 
         MOV       A,H            LOAD UPPER BIT OF X 
         ANA       B                AND MASK UNWANTED BITS
         MOV       H,A
         MOV       A,D            LOAD UPPER BIT OD Y 
         ANA       B                AND MASK UNWANTED BITS. 
         MOV       D,A
         SHLD      XEND           STORE X END POINT 
         XCHG 
         SHLD      YEND                STORE Y END POINT
************************************************************************
* 
*                  VECTOR GENERATOR SUBROUTINE
* 
************************************************************************
* 
*        THE ALGORITHM IMPLEMENTED FOR THE VECTOR GENERATOR IS THE
*        UNIT INCREMENT DIGITAL DIFFERENTIAL ANALYZER.  THE DDA 
*        GENERATES POINTS THAT ARE SPACED ONE UNIT APART ALONG THE
*        AXIS OF GREATER DELTA. THE SPACING IN THE OTHER DIRECTION
*        IS MERELY THE SLOPE. IN EQUATION FORM THE ABOVE CAN BE STATED A
* 
*        Y(0)=Y(I)+1/2                      X(0)=X(I) 
*        Y(N)=Y(N-1)+DELTA Y/DELTA X        X(N)=X(N-1)+1 
* 
*        OR 
* 
*        X(0)=X(I)+1/2                      Y(0)=Y(I) 
*        X(N)=X(N-1)+DELTA X/DELTA Y        Y(N)=Y(N-1)+1 
* 
*        TO PREVENT THE GENERATED LINE FROM BEING BIASED TO LIE 
*        ON ONE SIDE OF THE IDEAL LINE THE POINTS ARE ROUNDED TO THE
*        NEAREST INTEGER. ROUNDING IS EQUIVALENT TO ADDING 1/2 TO THE 
*        INITIAL VALUE
* 
************************************************************************
* 
*                  PARAMETER LOCATIONS UPON ENTRY 
* 
*              LOCATION                USEAGE 
* 
*              XREG                    X BEGINNING POINT
*              XEND                    X ENDING POINT 
*              YREG                    Y BEGINNING POINT
*              YEND                    Y ENDING POINT 
* 
*                  PARAMETER LOCATIONS UPON EXIT
* 
*              XDELTA                  XEND-XREG OR XREG-XEND 
*              YDELTA                  YEND-YREG OR YREG-YEND 
*              SLOPE                   XDELTA/YDELTA OR YDELTA/XDELTA 
*              VECFLAG                 FLAG 
* 
*                                           BITS 1-3  UNUSED
*                                           BIT 4     X SIGN (1 NEG 0 PO
*                                           BIT 5     Y SIGN (1 NEG 0 PO
*                                           BIT 6     LARGEST DELTA (1=X
*                                           BIT 7-8   UNUSED
* 
************************************************************************
* 
*        WRITE OR ERASE FIRST POINT OF VECTOR 
* 
         MVI       C,#80          SET VECTOR MODE.
* 
         LDA       M.MODE         LOAD MODE WRITE ERASE BITS
         RLC
         ANI       #06
         OUT       DISCHAN*32+DISCON2  SET WRITE/ERASE BITS 
         LHLD      XREG           LOAD CURRENT X COORDINATE 
         CALL      CALDELX
         LHLD      YREG           LOAD CURRENT Y COORDINATE 
         CALL      CALDELY
************************************************************************
* 
*        DETERMINE IF 45 DEGREE ANGLE AND IF DELTA X GREATER DELTA Y
* 
************************************************************************
         MOV       A,L
         ORA       H              TEST FOR ZERO 
         JZ        VECTOR6
VECTOR4A CALL      COMPHL 
         XCHG 
         LHLD      XDELTA              LOAD DELTA X 
         DAD       D                   DELTA Y MINUS DELTA X
         JC        VECTOR5             JUMP IF CARRY
* 
*        DELTA Y GREATER THAN DELTA X 
* 
         LHLD      YDELTA              LOAD DELTA Y 
         CALL      COMPHL 
         XCHG 
         LHLD      XDELTA              LOAD DELTA X 
         MOV       A,C                 LOAD OUTPUT FUNCTION FOR VECTOR
         JMP       VECTOR7             JUMP TO OUTPUT FUNCTION
* 
*        DELTA Y IS EQUAL TO OR LESS THAN DELTA X 
* 
VECTOR5  MOV       A,L
         ORA       H              TEST FOR ZERO 
         JZ        VECTOR8             JUMP IF ANGLE IS 45 DEGREES
* 
VECTOR6  LHLD      XDELTA              LOAD DELTA X 
         CALL      COMPHL 
         XCHG                          PLACE DIVISOR INTO REGISTER PAIR 
         LHLD      YDELTA              LOAD DELTA Y 
         MOV       A,C                 LOAD FLAG
         ADI       #20                 SET BIT TO INDICATE Y SHORT AXIS 
* 
VECTOR7  OUT       DISCHAN*32+DISCON1  OUTPUT CONTROL 1 FUNCTION
         STA       VECFLAG
************************************************************************
* 
*                                 FRACTIONAL DIVIDE ROUTINE 
* 
************************************************************************
* 
*                  DIVIDEND  REGISTER PAIR HL 
*                  DIVISOR   REGISTER PAIR DE 
*                  QUOTIENT  REGISTER PAIR BC 
* 
************************************************************************
DIV0     LXI       B,#0040        SET COUNTER TO TEM PLACE ACCURACY 
DIV1     DAD       H              SHIFT DIVIDEND LEFT ONE PLACE 
         SHLD      SAVE           SAVE DIVIDEND VALUE 
         DAD       D              SUBTRACT DIVISOR FROM DIVIDEND
         JC        DIV2           JUMP IF CARRY SET 
* 
         LHLD      SAVE           RESTORE DIDIDEND TO ORIGINAL VALUE
* 
*     THIS CODE SHIFTS QUOTIENT INTO REISTER PAIR BC
* 
DIV2     EQU       $
         MOV       A,C
         RAL
         MOV       C,A
         MOV       A,B
         RAL
         MOV       B,A
* 
         JNC       DIV1           REPEAT IF NOT COMPLETE. 
* 
*     LEFT JUSTIFY FRACTIONAL QUOTIENT
* 
         MOV       L,C            TRANSFER REG PAIR BC TO REG PAIR HL 
         MOV       H,B
* 
         DAD       H              SHIFT REG PAIR HL LEFT SIX PLACES 
         DAD       H
         DAD       H
         DAD       H
         DAD       H
         DAD       H
* 
         XCHG                     SAVE FRACTIONAL ANSWER
         JMP       CALPT1         GO TO CALCULATE POINTS
************************************************************************
* 
*                  INITIALIZE FOR A 45 DEGREE ANGLE 
* 
************************************************************************
VECTOR8  MOV       A,C                 LOAD FUNCTION CODE 
         OUT       DISCHAN*32+DISCON1  OUTPUT 
         STA       VECFLAG
         LXI       D,#FFFF        SET SLOPE TO ALL ONES.
************************************************************************
* 
*        THIS ROUTINE CALCULATES INCREMENTAL MOVEMENTS AND
*        OUTPUTS THEM TO THE DISPLAY
* 
************************************************************************
* 
*                  REGISTER PAIR HL  FRACTIONAL PARTIAL SUM 
*                  REGISTER PAIR DE  SLOPE
*                  REGISTER PAIR BC  LOOP COUNT 
* 
************************************************************************
* 
*        INITIALIZE LOOP COUNT INTO REGISTER PAIR BC
* 
CALPT1   LDA       VECFLAG
         LHLD      XDELTA 
         ANI       #20            TEST FOR LARGEST DELTA. 
         JNZ       CALPT2         DELTA X IS LONG AXIS. 
* 
         LHLD      YDELTA 
CALPT2   EQU       $
         MOV       C,L
         MOV       B,H
         LXI       H,#8000             LOAD ROUNDING FACTOR INTO PARTIAL
         MOV       A,C                 TEST FOR LOWER 8 BITS LENGTH EQUA
         ANA       A
         JZ        CALPT5A
************************************************************************
* 
*        INCREMENTAL CALCULATION LOOP 
* 
************************************************************************
* 
CALPT5   DAD       D                   SHORT AXIS PLUS SLOPE
         RAR                           SHIFT CARRY INTO A REGISTER
         OUT       DISCHAN*32+DISDATA 
         DCR       C                   DECREMENT LOOP COUNT (LOWER 8 BIT
         JNZ       CALPT5              JUMP IF NOT COMPLETE 
* 
CALPT5A  EQU       $
         DCR       B              DECREMENT UPPER BITS
         JP        CALPT5         RETUN IF NOT COMPLETE.
* 
*        PLACE X AND Y END COORDINATES INTO X AND Y REGISTERS 
*        WHICH BECOMES THE BEGGINNING POINT OF THE NEXT VECTOR
* 
CALPT6   EQU       $
         LHLD      YEND 
         XCHG 
         LHLD      XEND 
* 
         JMP       POINT2              DISPLAY LAST POINT 
************************************************************************
* 
*        MODE 2 IS THE LOAD TERMINAL MEMORY MODE.  EACH MODE 2 DATA 
*        WORD CONTAINS A 16 BIT WORD TO BE STORED IN THE MEMORY 
*        LOCATION SPECIFIED BY THE CONTENTS OF THE MEMORY ADDRESS 
*        REGISTER.  AFTER THE DATA HAS BEEN STORED, THE MEMORY ADDRESS
*        REGISTER IS INCREMENTED BY ONE, THUS DATA CAN BE STORED
*        SEQUENTIALLY IN MEMORY BY TRANSMITTING ONLY MODE 2 DATA WORDS. 
*        THE CONTENTS OF THE MEMORY ADDRESS REGISTER CAN BE CHANGED AT
*        ANY TIME WITH THE LDA INSTRUCTION
*        WHEN DISPLAYED ON THE DISPLAY THE DATA APPEARS AS A VERTICAL 
*        COLUMN WITH BIT 01 AT THE BOTTOM AND BIT 16 AT THE TOP.
* 
************************************************************************
* 
*        ASSEMBLE 16 BIT MODE 2 DATA WORD AND STORE IN CHAR MEMORY
* 
MEMORY   EQU       $
         CALL      ASSEMBLE       LOAD COMM LINE DATA 
         DAD       H              ROTATE LEFT 
         MOV       A,L              FROM
         ORA       D                    SAVE IN 
         MOV       D,A                    DE REGISTER PAIR. 
         MOV       B,H            SAVE BLOCK CHECK BITS.
* 
*        STORE DATA WORD INTO CHARACTER MEMORY
* 
MEMORY1  LHLD      MEMREG              LOAD CHARACTER MEMORY ADDRESS REG
* 
* 
         MOV       M,E                 STORE LOWER BYTE INTO MEMORY 
         INX       H                   INCREMENT MEMORY ADDRESS REGISTER
         MOV       M,D                 STORE UPPER BYTE INTO MEMORY 
         INX       H                   INCREMENT MEMORY ADDRESS REGISTER
         SHLD      MEMREG              STORE MEMORY ADDRESS 
* 
MEMORY2  EQU       $
         LXI       H,BC.REG       LOAD ADDRESS OF BLOCK CHECK REGISTER
         MOV       A,E            LOAD LOWER BYTE OF DATA 
         CALL      BLK.CHK        DO BLOCK CHECK ROUTINE. 
* 
         MOV       A,D            LOAD UPPER BYTE OF DATA 
*        THIS ROUTINE CALCULATES THE BLOCK CHECK AND TEST RESULTS.
*        IF RESULTS ARE INCORRECT, A UNSOLICITED STATUS IS TRANSMITTED, 
*        TELLING THE PLATO SYSTEM TO RETRANSMIT THE BLOCK OF DATA.
BLK.CHK  EQU       $
         XRA       M                DO EXCLUSIVE OR 
         RLC                          AND ROTATE RESULTS. 
         MOV       M,A            STORE RESULTS AS NEW CHECK VALUE. 
         MOV       A,B            LOAD BLOCK CHECK BITS 
         RAR                        AND TEST FOR BLOCK CHECK THIS BYTE. 
         MOV       B,A            SAVE BLOCK CHECK BITS.
         RNC                      NO CHECK, GET NEXT BYTE.
         ANA       M              TEST FOR ZERO BLOCK CHECK RESULT. 
         RZ                       BLOCK CHECK CORRECT.
         LXI       H,#0385        LOAD UNSOLICITED STATUS 
         JMP       FIFO.ST          AND STORE FOR TRANSMIT. 
************************************************************************
* 
*        MODE 3 IS THE CHARACTER MODE.  EACH MODE 3 DATA WORD CONTAINS
*        THREE 6 BIT CHARACTER CODES.  THESE CODES DEFINE CHARACTERS TO 
*        BE PLOTTED OR CONTROL FUNCTIONS TO FORMAT TEXT.
* 
************************************************************************
CHARACT  EQU       $
         LDA       COMMAND+2      CHECK FOR CHAR 3 UNCOVER
         CPI       #3F
         JZ        CHARACT0 
         XRA       A              SET TERM.CLEAR UNCOVER
         JMP       CHARACT1 
CHARACT0 MVI       A,#01          SET TERM.DON'7T CLEAR UNCOV 
CHARACT1 STA       COMMAND+4
         LXI       H,COMMAND      ORGIN OF COMM LINE DATA.
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       #3F            TEST FOR UNCOVER CODE 
         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.
         MOV       A,C            LOAD CHARACTER CODE 
         CPI       #01
         RZ 
         MVI       A,#7F            CODE FLAG.
         ANA       M
         MOV       M,A
* 
*        EXECUTE CONTROL FUNCTION DEFINED BY CHARACTER CODE 
* 
         MOV       A,C                 LOAD CHARACTER CODE
         ANA       A              TEST FOR ZERO 
         RZ                       RETURN TO CALLER IF ZERO
         CALL      CONTROL             EXECUTE CONTROL FUNCTION 
CHARACT2 EQU       $
         LHLD      M.ORG          LOAD FWA OF DATA
         JMP       CHARS          LOAD NEXT CHARACTER CODE. 
* 
* 
CHARACT3 EQU       $
         MOV       A,C            LOAD CHARACTER CODE 
         CALL      CHAREN           AND DISPLAY CHARACTER.
         JMP       CHARACT2 
* 
CHARACT4 EQU       $
         LXI       B,#7F80
         CALL      UD.CCR 
         JMP       CHARACT2 
************************************************************************
* 
*        FUNCTIONS SUCH AS CARRIAGE RETURN,LINE FEED,SUBSCRIPT,ETC. ARE 
*        EXECUTED WITH CONTROL CHARACTERS. THE UNCOVER CHARACTER CODE 
*        (3F) IS USED TO GAIN ACCESS TO 12 CONTROL CHARACTERS. THESE
*        CHARACTERS ARE USED TO CONTROL DISPLAY FORMAT.  UPON RECEIPT 
*        OF A 3F CHARACTER CODE, THE TERMINAL INTERPRETS THE NEXT 
*        CHARACTER CODE AS A CONTROL CHARACTER RATHER THAN A MEMORY 
*        ADDRESS.  FOLLOWING EXECUTION OF THE CONTROL CHARACTER,
*        NORMAL CHARACTER PLOTTING RESUMES,  THE CONTROL CHARACTERS ARE 
* 
*                  CODE           DESCRIPTION 
*                     8           BACKSPACE 
*                     9           TAB 
*                     A           LINE FEED 
*                     B           VERTICAL TAB
*                     C           FORM FEED 
*                     D           CARRIAGE RETURN 
*                     E           SUPERSCRIPT 
*                     F           SUBSCRIPT 
*                    10           SELECT M0 
*                    11           SELECT M1 
*                    12           SELECT M2 
*                    13           SELECT M3 
*                    14           SELECT M4 
*                    15           SELECT M5 
*                    16           SELECT M6 
*                    17           SELECT M7 
*                    18           HORIZONTAL
*                    19           VERTICAL
*                    1A           FORWARD 
*                    1B           REVERSE 
*                    1C           SELECT SIZE 1 
*                    1D           SELECT SIZE 2 
* 
************************************************************************
* 
*                  REGISTER PAIR HL    ADDRESS OF JUMP TABLE
*                  REGISTER PAIR DE    JUMP TO ADDRESS
*                  REGISTER A          CONTROL CHARACTER CODE 
* 
************************************************************************
* 
*        JUMP ADDRESS TABLE FOR CONTROL CHARACTERS
* 
BTBL     DW        BKSPACE
         DW        TAB
         DW        LINEFEED 
         DW        VERTAB 
         DW        FORMFEED 
         DW        RETURN 
         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       $
         CPI       #1E            TEST RANGE OF 
         RNC                        CONTROL CODE. 
         CPI       08             IF NOT IN RANGE,
         RC                         DO NOTHING. 
         SUI       08             ADJUST COD EFOR TABLE INDEX.
         RLC
         MVI       B,#00               CLEAR REGISTER B 
         MOV       C,A                 LOAD CHARACTER CODE
         LXI       H,BTBL              LOAD BASE ADDRESS OF JUMP TABLE
         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.
         JZ        LF.1 
         LXI       B,#FFF0         LOAD VERT. ADJUST
         JMP       V.ADJ            AND ADJUST VERT.
LF.1     EQU       $
         LXI       B,16           LOAD HOR. ADJUST
         JMP       H.ADJ          AMD ADJUST HOR. 
* 
VERTAB   EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST. 
         JZ        V.TAB.1        NOT HOR. PLOTTING.
         LXI       B,16           LOAD TAB ADJUST 
         JMP       V.ADJ            AND ADJUST VERT. .
* 
V.TAB.1  EQU       $
         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
         JZ        SUPER.1        NOT HORIZONTAL. 
         LXI       B,05           LOAD SUPERSCRIPT ADJUST FOR HOR.
         JMP       V.ADJ            AND GO TO VERTICAL ADJUST.
* 
SUPER.1  EQU       $
         LXI       B,#FFFB         LOAD SUPERSCRIPT ADJUST
         JMP       H.ADJ
* 
SUB      EQU       $
         LDAX      D              LOAD HOR. PLOT FLAG 
         ANA       A                AND TEST. 
         JZ        SUB.1          NOT HORIZONTAL PLOT.
         LXI       B,#FFFB         LOAD SUBSCRIPT ADJUST
         JMP       V.ADJ            AND GO ADJUST VERTICAL. 
* 
SUB.1    EQU       $
         LXI       B,05           LOAD ADJUST FOR SUBSCRIPT FOR VERT. 
         JMP       H.ADJ          GO ADJUST HOR.
* 
SELECTM0 EQU       $
         LXI       H,M0CODE00     LOAD M0 CHARACTER MEMORY. 
         JMP       SELECT.1 
SELECTM1 EQU       $
         LXI       H,M1CODE00     LOAD M1 CHARACTER MEMORY
         JMP       SELECT.1 
SELECT   EQU       $
         SUI       #14              FOR CHARACTER SET 
         MOV       E,A                ADDRESS STORE.
* 
         LXI       H,MEMORY.2     LOAD BASE OF STORE AREA.
         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 
         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
************************************************************************
* 
*        MODE 4 IS BLOCK ERASE  EACH PAIR OF DATA WORDS SPECIFIES 
*        THE CORNERS OF AN AREA TO BE ERASED.  THE AREA ERASED IS THAT
*        ENCLOSED BY THE ABSOLUTE VALUE OF X2-X1 AND Y2-Y1. 
* 
* 
*        X1,Y1
* 
*          **************************************** 
*          *                                       *
*          *                                       *
*          *                                       *
*          *                                       *
*          *       AREA ERASED
*          *                                       *
*          *                                       *
*          *                                       *
*          *                                       *
*          **************************************** 
* 
*                                                X2,Y2
* 
************************************************************************
BLOCK    EQU       $
         MVI       C,04           LOAD TRANSFER COUNT.
         LXI       D,BLOCKX       LOAD DESTINATION ADDRESS. 
* 
BLOC1    EQU       $
         MOV       A,M            LOAD X/Y DATA 
         STAX      D                AND STORE FOR PROCESSING, 
         INX       H              INCREMENT SOURCE ADDRESS
         INX       D              INCREMENT DESTINATION ADDRESS.
         MOV       A,M            LOAD UPPER BITS 
         ANI       01             MASK FOR BIT 9 OF COORDINATE. 
         STAX      D                AND STORE.
         INX       H              INCREMENT TO
         INX       D                NEXT ADDRESS. 
         DCR       C              DECREMENT COUNT 
         JZ        MODE4A         PROCESS DTAT IF COUNT ZERO
         JMP       BLOC1            ELSE GET NEXT BYTE. 
MODE4    EQU       $
         CALL      ASSEMBLE       LOAD INPUT DATA 
         LDA       MODE4CNT       LOAD INPUT WORD COUNT 
         INR       A
         STA       MODE4CNT 
         RAR
         JNC       WORD2               JUMP IF SECOND SET OF CORRDINATES
* 
*        SAVE FIRST SET OF COORDINATES
* 
         SHLD      BLOCKX              SAVE X1 COORDINATE 
         XCHG 
         SHLD      BLOCKY              SAVE Y1 COORDINATE 
         RET                      RETURN TO CALLER
* 
*        SAVE SECOND SET OF COORDINATES 
* 
WORD2    EQU       $
         SHLD      XEND                STORE X2 COORDINATE
         XCHG 
         SHLD      YEND                STORE Y2 COORDINATE
************************************************************************
* 
*        CALCULATE ABSOLUTE DELTA X AND Y 
* 
************************************************************************
* 
*                  PARAMETER LOCATIONS UPON ENTRY 
* 
*        BLOCKX                   X1 COORDINATE 
*        BLOCKY                   Y1 COORDINATE 
*        XEND                     X2 COORDINATE 
*        YEND                     Y2 COORDINATE 
* 
************************************************************************
MODE4A   MVI       C,#00               CLEAR DIRECTION FLAGS
         LHLD      BLOCKX 
         CALL      CALDELX        CALCULATE DELTA X 
         LHLD      BLOCKY 
         CALL      CALDELY        CALCULATE DELTA Y 
         MOV       A,C
         STA       BLOCKF              SAVE DIRECTION FLAGS 
* 
*        TEST FOR POSITIVE DELTA Y
* 
         ANI       #10                 MASK OFF X DIRECTION BIT 
         LHLD      BLOCKY         LOAD Y1 COORDINATE
         JNZ       YSTART 
* 
NEGY     LHLD      YEND                LOAD Y2 COORDINATE 
* 
*        SET Y STARTING ADDRESS 
* 
YSTART   MOV       A,L
         OUT       DISCHAN*32+YCOORD   OUTPUT Y START ADDRESS 
         IN        DISCHAN*32+XYREAD   GET X REGISTER BIT 9 
         ANI       #01
         MOV       L,A                 SAVE X REGISTER BIT 9
         MOV       A,H
         RLC
         ORA       L              ADD X REGISTER BIT 9
         ADI       #04                 ADD ENABLE LOAD COORDINATE BIT 
         OUT       DISCHAN*32+DISCON1 
* 
*        SET WRITE/ERASE BITS 
* 
         LDA       M.MODE         LOAD MODE WRITE ERASE BITS
         RLC
         ANI       #06
         OUT       DISCHAN*32+DISCON2 
* 
         LHLD      YDELTA              LOAD NUMBER OF LINES 
         INX       H
         XCHG 
         LHLD      XDELTA 
         INX       H
         SHLD      XSAVE          SAVE COORDIMATE.
* 
*        TEST FOR POSITIVE DELTA X
* 
         LDA       BLOCKF 
         ANI       #08                 MASK OFF Y DIRECTION BIT 
         LHLD      BLOCKX         LOAD X1 COORDINATE
         JZ        NEGX1
* 
NEGX     LHLD      XEND                LOAD X2 COORDINATE 
NEGX1    MOV       A,H
         ANI       #01                 MASK IF WRAP AROUND
         MOV       B,A
         MOV       C,L
************************************************************************
* 
*        BLOCK WRITE/ERASE INCREMENTAL LOOP 
* 
************************************************************************
* 
*        REGISTER PAIR BC         BASELINE ADDRESS FOR X
*        REGISTER PAIR HL         NUMBER OF POINTS PER LINE 
*        REGISTER PAIR DE         NUMBER OF LINES PER BLOCK 
* 
************************************************************************
* 
*        RESET X BASELINE ADDRESS FOR NEXT LINE 
* 
XSTART   MOV       A,C
         OUT       DISCHAN*32+XCOORD   OUTPUT BASELINE ADDRESS LOWER 8
         IN        DISCHAN*32+XYREAD   GET Y REGISTER BIT 9 
         ANI       #02                 SAVE Y REGISTER BIT 9
         ADD       B
         ADI       #A4                 VEC/XPOS/YPOS/YSHORT/ENABLE
         OUT       DISCHAN*32+DISCON1 
         LHLD      XSAVE                LOAD NUMBER OF POINTS PER LINE
* 
* 
         PUSH      B              SAVE BC ON STACK
         LXI       B,#FFF0           AND LOAD -16.
* 
BLKER.1  EQU       $
         MOV       A,C            TEST FOR GREATER THAN 
         ANA       L                EIGHT FOR FAST ERASE. 
         JZ        BLKER.3          LESS THAN, TEST UPPER BIT.
         XRA       A              CLEAR A REGISTER
* 
BLKER.2  EQU       $
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA  BLOCK ERASE/WRITE
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         OUT       DISCHAN*32+DISDATA 
         DAD       B              SUBTRACT EIGHT FROM COUNT.
         CMP       L                AND TEST FOR ZERO 
         JNZ       BLKER.1          NOT ZERO, DO AGAIN. 
* 
BLKER.3  EQU       $
         CMP       H                AND TEST UPPER BIT OF COUNT.
         JNZ       BLKER.2          NOT ZERO, OUTPUT ANOTHER EIGHT. 
* 
         POP       B              RESTORE BC REGISTERS
         CMP       L                AND TEST FOR ZERO COUNT.
         JZ        BLOCK2           COMPLETED, TEST Y AXIS. 
BLOCK1   OUT       DISCHAN*32+DISDATA 
         DCR       L
         JNZ       BLOCK1              JUMP IF LINE NOT COMPLETE
* 
* 
*        TEST FOR COMPLETION OF BLOCK 
* 
BLOCK2   EQU       $
         DCX       D              DECREMENT THE LINE COUNT
         MOV       A,E              AND TEST FOR
         ORA       D                  LAST LINE COMPLETED.
         JZ        BLOCK4         COMPLETED, END BLOCK WRITE/EREASE.
* 
*        INCREMENT Y AXIS BY ONE
* 
BLOCK3   EQU       $
         MVI       A,#D0          VEC/INHIBIT/XSHORT/YNEG 
         OUT       DISCHAN*32+DISCON1 
         XRA       A              CLEAR A REGISTER
         OUT       DISCHAN*32+DISDATA    INCREMENT Y AXIS 
         JMP       XSTART 
* 
BLOCK4   EQU       $
         LHLD      BLOCKY              LOAD Y1 COORDINATE 
         LXI       D,#FFF1             SET TO MINUS 15
         DAD       D                   Y1 MINUS 15
         CALL      OUTY           OUTPUT Y COORDINATE.
         LHLD      BLOCKX           LOAD X COORDINATE 
         JMP       OUTX           OUTPUT X COORDINATE.
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        THESE MODES ARE RESERVED FOR USE BY THE USER. USING 7ODE 2,
*        THE USER MAY LOAD A ROUTINE INTO THAT AREA OF MEMORY ALLOCATED 
*        FOR HIS USE.THE ADDRESS OF THAT ROUTINE IS LOADED UNDER
*        MODE 5 ,6, OR 7 TAG. 
*        BY USING THE LDM INSTRUCTION, THE USER CAN CALL THAT ROUTINE.
*        THE USER MUST EXIT THE ROUTINE WITH A RETURN INSTRUCTION 
*        TO INSURE THAT CONTROL IS PASSED CORRECTLY TO THE
*        RESIDENT FIRMWARE. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
MODE5    LHLD      MODE5A 
         JMP       MODESEL        SELECT MODE WITH HL JUMP. 
* 
MODE6    LHLD      MODE6A 
         JMP       MODESEL        SELECT MODE WITH HL JUMP. 
* 
MODE7    LHLD      MODE7A 
* 
MODESEL  EQU       $
         PUSH      H              SAVE ABSOLUTE MODE ADDRESS. 
* 
* 
         CALL      ASSEMBLE       LOAD COMM LINE DATA 
         DAD       H              AND SHOFT 
         MOV       C,H              IT INTO 
         MOV       A,L                REGISTERS 
         ORA       D                   C, D, AND E. 
         MOV       D,A
         POP       H              RETREIVE ABSOLUTE MODE ADDRESS. 
         PCHL 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        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.
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        INPUT X COORDINATE TO HL REGISTER PAIR.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
INPX     EQU       $
         IN        DISCHAN*32+XREAD  INPUT LOWER BITS OF X
         MOV       L,A                 AND SAVE IN L REGISTER.
         IN        DISCHAN*32+XYREAD  NPUT UPPER BIT
         ANI       01                  MASK 
         MOV       H,A                 AND SAVE IN H REGISTER.
         RET                      RETURN TO CALLER. 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        INPUT Y COORDINATE TO HL REGISTER PAIR.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
INPY     EQU       $
         IN        DISCHAN*32+YREAD  INPUT LOWER BITS OF Y
         MOV       L,A                 AND SAVE IN L REGISTER.
         IN        DISCHAN*32+XYREAD  NPUT UPPER BIT
         ANI       02                  MASK 
         RRC
         MOV       H,A                 AND SAVE IN H REGISTER.
         RET                      RETURN TO CALLER. 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        SUBROUTINE TO STEP Y AXIS. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
STEPY    EQU       $
         CALL      INPY           INPUT CURRENT Y COORDINATE. 
* 
         LDA       M.DIR          LOAD STEP DIRECTION BIT 
         ANI       01               AND MASK
         INX       H              INCREMENT COORDINATE
         JZ        OUTY             AND OUTPUT. 
* 
         DCX       H                  ELSE DECREMENT
         DCX       H                      COORDINATE
         JMP       OUTY                   AND OUTPUT
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        SUBROUTINE TO STEP X AXIS
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
STEPX    EQU       $
         CALL      INPX           INPUT CURRENT X COORDINATE. 
* 
         LDA       M.DIR          LOAD STEP DIRECTION BIT 
         ANI       02               AND MASK
         INX       H              INCREMENT COORDINATE
         JZ        OUTX             AND OUTPUT. 
* 
         DCX       H                   ELSE DECREMENT 
         DCX       H                      COORDINATE
         JMP       OUTX                   AND OUTPUT
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        SUBROUTINE TO OUTPUT X COORDINATE TO THE DISPLAY.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
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 REGISTERS.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
INDIRECT EQU       $
         PCHL 
* 
NOOP     EQU       $
         RET
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        STORE DIRECTION BITS FOR COORDINATE STEP ROUTINES. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
DIR      EQU       $
         SHLD      M.DIR          STORE STEP DIRECTION BITS 
         RET
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        INPUT DATA TO USER INSTEAD OF TRANSMITING. 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
INPUT    EQU       $
         LXI       H,US.FIFO      LOAD USER FIFO ADDRESS
         JMP       FIFO.RD          AND GET DATA. 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
ENAB     EQU       $
         SHLD      M.ENAB         STORE INTERRUPT MASK
         MVI       A,#E8          MASK ENABLE BITS. 
         ANA       L                AND SET IN A REGISTER.
         RLC                        AND ROTATE
         OUT       COMCHAN*32+COMCON  TO COMM CHANNEL.
* 
         RLC
         OUT       KEYCHAN*32+KYBDCON   OUTPUT TO KEY BOARD.
* 
         RLC                            TO OUTPUT 
         OUT       TPCHAN*32+TPCONT         TOUCH PANEL.
* 
         MOV       B,A            SAVE ENABLE BITS
         IN        RSF.PANL*32+PANLSWCH  UT PANEL SWITCH SETTINGS 
         ANI       #20                AND TEST FOR EXTERNAL DEVICE. 
         RZ                       NO DEVICE, RETURN TO CALLER.
* 
         MOV       A,B            RETRIEVE ENABLE BITS
         RLC                        AND ROTATE TO 
         RLC                          EXTERNAL BIT. 
         OUT       EXTCH5*32+EXTCNTL  ABLE EXTERNAL DEVICE. 
         RET
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        OUTPUT TO EXTERNAL DEVICE. 
* 
*        ENTRY     HL             FWA OF DATA TO BE OUTPUT TO DEVICE. 
*                  DE             NIMBER OF BYTES TO OUTPUT.
*        EXTERNAL DEVICE SELECTED BY ROUTINE R.SELECT.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
EXTOUT   EQU       $
         MOV       A,E            TEST THE COUNT
         ORA       D                FOR ZERO BYTES TO OUTPUT. 
         RZ                       RETURN IF ZERO COUNT. 
* 
         MOV       A,M            LOAD DATA BYTE
         INX       H                INCREMENT ADDRESS TO NEXT BYTE
         DCX       D                DECREMENT THE COUNT 
         CALL      EXT.OUT        OUTPUT THE DATA.
         JMP       EXTOUT         TEST FOR MORE DATA. 
* 
*        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 1 CHARACTERS 
*        IN THE FORWARD DIRECTION.
* 
INIT.PLT EQU       $
         MVI       L,#1A          SET CHARACTER MODE
         CALL      R.MODE           AND WRITE BITS
         MVI       L,02           SET CHARACTER PLOTTING PARAMETERS.
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        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       #18            ADD CONSTANT TO RUN 
         CALL      CONTROL          THIS THRU CONTROL OF CHAR GEN.
* 
         LDA       M.CCR          LOAD FLAG BITS
         RRC                        ADD ROTATE TO CHAR SET BITS.
         ANI       07             MASK OFF CHAR SET BITS
         ADI       #10              AND ADD CONSTANT
         CALL      CONTROL            TO RUN THRU CONTROL AGAIN.
* 
         LDA       M.CCR          LOAD UP BITS AGAIN
         RLC                        AND ROTATE
         RLC                          TO FORWARD/REVERSE BITS 
         ANI       01             MASK FORWARD/REVERSE BIT
         ADI       #1A              ADD CONSTANT AND
         CALL      CONTROL            SEND IT THRU AGAIN. 
* 
         LDA       M.CCR          LOAD FLAG BITS
         RLC                        NOW ROTATE
         RLC                         TO THE 
         RLC                          SIZE BIT
         ANI       01             MASK HIM OFF
         ADI       #1C            ADD ANOTHER CONSTANT
         JMP       CONTROL            AND GO THRU CONTROL ONE LAST TIME.
************************************************************************
* 
*        SUBROUTINE TO ASSEMBLE X AND Y COORDINATES.  AT COMPLETION 
* 
*                  REGISTER PAIR HL  X COORDINATES
*                       BITS 10 THRU 18 OF COMM LINE INPUT. 
* 
*                  REGISTER PAIR DE  Y COORDINATES
*                       BITS 01 THRU 09 OF COMM LINE INPUT. 
* 
************************************************************************
ASSEMBLE EQU       $
         LDA       COMMAND+2      LOAD LOWER 6 BITS OF INPUT
         MOV       E,A
         LDA       COMMAND+1
         RRC
         RRC
         MOV       C,A
         ANI       #C0                 MASK ALL BITS BUT Y COORDINATE 
         ADD       E
         MOV       E,A                 STORE LOWER 8 BITS Y COORDINATE
         MOV       A,C
         ANI       #01
         MOV       D,A                 STORE BIT 9 OF Y COORDINATE
         MOV       A,C
         RRC
         ANI       #07
         MOV       L,A                 STORE LOWER 3 BITS OF X COORDINAT
         LDA       COMMAND        LOAD UPPER BITS OF INPUT. 
         RLC
         RLC
         RLC
         MOV       C,A
         ANI       #F8
         ADD       L
         MOV       L,A                 STORE LOWER 8 BITS X COORD 
         MOV       A,C
         ANI       #01
         MOV       H,A                 STORE BIT 9 OF X COORD 
         RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        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 ROUTINE LOADS THE FIRST-IN-FIRST OUT BUFFER.
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
FIFO.ST  EQU       $
         MVI       A,#C0          MASK CATAGORY BITS
         ANA       H                FOR DATA
         XCHG                     SAVE DATA INDE REGISTERS. 
* 
         RLC                      ROTATE CATAGORY BITS
         RLC
         MOV       B,A              AND SAVE IN B REGISTER. 
* 
         MVI       A,03           MASK OFF
         ANA       D                FLAG
         MOV       D,A                BITS. 
         LDA       M.KSW          LOAD USER/PLATO FLAG. 
         ANA       B                TEST TO DETERMINE USER OR TRANSMIT B
         LXI       H,TX.FIFO      LOAD ADDRESS OF TRANSMIT FIFO.
         JZ        FIFOS.1          AND STORE FOR TRANSMIT. 
* 
         LXI       H,US.FIFO      LOAD ADDRESS OF USER BUFFER, BIT SET. 
* 
FIFOS.1  EQU       $
         MVI       A,07             AND TEST FOR
         CMP       M                  FULL BUFFRR.
         RZ                       BUFFER FULL, RETURN TO CALLER.
* 
         INR       M              NOT FULL, ADD ONE TO DIFF. COUNTER. 
         INX       H              INCREMENT TO INPUT POINTER. 
         ANA       M                MASK LOWER BITS,
         RLC                        AND SET FOR TWO BYTE ADDRESSING.
         INR       M              ADD ONE TO INPOINTER. 
         MVI       B,00           LOAD BC REGISTERS 
         MOV       C,A              WITH INPUT INDEX. 
         INX       H              INCREMENT TO START OF 
         INX       H                BUFFER STORE AREA.
         DAD       B              ADD INDEX TO BASE ADDRESS.
         MOV       M,E            STORE LOWER BITS. 
         INX       H
         MOV       M,D            STORE UPPER BITS. 
         MVI       A,03           SET THE CHARACTER 
         OUT       COMCHAN*32+COMCON  REQUEST INTERRUPT.
         RET                      RETURN TO CALLER. 
* 
* 
*        READ DATA FROM TRANSMIT BUFFER.
* 
FIFO.RD  EQU       $
         XRA       A              CLEAR A, AND
         CMP       M                TEST FOR DATA IN FIFO.
         LXI       D,#8000        LOAD NO DATA CODE 
         XCHG 
         RZ                       RETURN IF NO DATA.
         XCHG 
         DCR       M              SUBTRACT ONE FOOM DIFF.COUNT
         INX       H              INCREMENT TO
         INX       H                OUTPUT POINTER. 
         MVI       A,07           MASK POINTER
         ANA       M                TO LOWER BITS 
         RLC                          AND SET FOR TWO BYTE ADDRESSING.
         INR       M              INCREMENT POINTER 
         MVI       D,00           LOAD DE WITH
         MOV       E,A              INDEX TO BUFFER.
         INX       H              INCREMENT TO START OF STORE AREA. 
         DAD       D              ADD INDEX TO START OF BUFFER
         MOV       E,M            LOAD LOWER BITS 
         INX       H              INCREMENT ADDRESS 
         MOV       D,M            LOAD UPPER BITS.
         XCHG                       PLACE IN HL FOR TRANSFER. 
         RET                      RETURN TO CALLER. 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        CALCULATE START AND END POINT DIFFERANCE 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
CALDELX  EQU       $
         XCHG 
         LHLD      XEND           LOAD END POINT
         MVI       B,#08          LOAD PLOTTING BIT 
         CALL      CALDEL         DO CALCULATION. 
         SHLD      XDELTA         STORE START AND END DIFFERANCE. 
         RET
* 
* 
CALDELY  EQU       $
         XCHG 
         LHLD      YEND           LOAD END POINT
         MVI       B,#10          LOAD PLOTTING BIT 
         CALL      CALDEL         DO CALCULATION. 
         SHLD      YDELTA         STORE START AND END DIFFERANCE. 
         RET
CALDEL   EQU       $
         MOV       A,E            TEST STARTING 
         ORA       D                POINT FOR ZERO. 
         RZ                       RETURN IF ZERO. 
* 
         XCHG                     SUBTRACT
         CALL      COMPHL           STARTING POINT
         DAD       D                  FROM END POINT. 
         RC                       RETURN IF END GREATER THAN START. 
* 
         CALL      COMPHL         SET DELTA POSITIVR. 
         MOV       A,C            LOAD PLOTTING 
         ORA       B                BIT FOR NEGATIVE
         MOV       C,A               DIRECTION. 
         RET                      ****EXIT****
************************************************************************
* 
*                  SUBROUTINE TO COMLEMENT REGISTER PAIR HL 
* 
************************************************************************
COMPHL   MOV       A,L
         CMA
         MOV       L,A
         MOV       A,H
         CMA
         MOV       H,A
         INX       H                   ADD ONE TO ADJUST FOR TWO,S COMPL
         RET                           RETURN TO CALLING ROUTINE
*** 
*        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 CHECKSUM ALL OF ROM, TEST A 4K/8K AREA
*                  OF RAM, PERFORM A COMMAND TEST, TEST THE IST 
*                  ASYNCHRONOUS COMMUNICATION CHANNEL, 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 
*                  RAM MODULE (4K/8K) 
*                  ROM MODULE (6K)
*                  DISPLAY INTERFACE
*                  IST ASYNCHRONOUS COMMUNICATION BOARD 
*                  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 PLUS A CHECKSUM OF ALL (6K) OF ROM AND
*                  CHARACTER GENERATION VIA THE CONTROLWARE WILL BE 
*                  CHECKED.  IF AN ERROR OCCURS, THE ERROR CODE WILL
*                  BE DISPLAYED ON THE MAINTENANCE 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 - CHECK 4K OF RAM
*                            ON  - CHECK 8K OF RAM
* 
*                  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 0           CHECKSUM ROM MEMORY - RAM TEST 
*                  SECTION 1           COMMAND TEST 
*                  SECTION 2           IST ASYNC COMM CHAN 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. 
* 
*                  WITH MAINTENANCE SWITCH 2 CLEARED, A 4K RAM
*                  AREA WILL BE TESTED, WHEN SET - AN 8K AREA WILL BE 
*                  TESTED.
* 
*                  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
*                      20      ROM FAILURE - CHIP 0 -- 0000-03FF
*                      21      ROM FAILURE - CHIP 1 -- 0400-07FF
*                      22      COMMAND/ROM FAILURE -2- 0800-0BFF
*                      23      ROM FAILURE - CHIP 3 -- 0C00-0FFF
*                      24      ROM FAILURE - CHIP 4 -- 1000-13FF
*                      25      ROM FAILURE - CHIP 5 -- 1400-17FF
*                      26      COMMAND/RAM FAILURE
* 
*                      30      COMMAND FAILURE
* 
*                      40      ASYNCHRONOUS COMM CHAN STATUS ERROR
*                      41      ASYNCHRONOUS COMM CHAN DATA ERROR
* 
*                      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 FIVE (5) SECTIONS OF THE
*                  RESIDENT DIAGNOSTIC.  RIST BEGINS BY CHECKSUMMING
*                  6K OF ROM BEGINNING AT LOC. 17FF HEX AND CONTINUING
*                  THROUGH 0000.  UPON COMPLETION OF THE ROM
*                  CHECKSUM, A 4K/8K AREA OF RAM WILL BE CHECKED FOR
*                  SCRATCH USE LATER IN THE TEST.  THE DIAGNOSTIC 
*                  CONTINUES TESTING THE COMMAND REPERTOIRE, IST ASYNC
*                  COMM CHAN TEST, DISPLAY INTERFACE TEST, KEYBOARD 
*                  TEST, AND THE TOUCH PANEL TEST.
* 
*                  THE MOST SIGNIFICANT DIGIT OF THE ERROR CODE 
*                  INDICATES THE BOARD BELIEVED BAD AND THE SECOND
*                  DIGIT INDICATES WHICH ROM CHIP HAS BEEN DETECTED 
*                  AND ISOLATED TO BE IN ERROR.  THE RAM TEST HAS ONLY
*                  ONE ERROR CODE.
* 
*        7.2       SECTION 0 - CHECKSUM ROM MEMORY - RAM SCRATCH
* 
*                  THIS SECTION WILL CHECKSUM 6K OF ROM WHICH INCLUDES
*                  THE FIRMWARE AND THE RESIDENT DIAGNOSTIC.  THE 
*                  CHECKSUM IS GENERATED AS FOLLOWS: STARTING WITH THE
*                  HIGHEST ROM 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 SHITED END-AROUND.  THE ROM 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 ROM CHIPS.
* 
*                  THE RAM MEMORY TEST WILL TEST A 4K AREA IF 
*                  MAINTENANCE SWITCH 2 IS CLEAR AND TEST AN 8K 
*                  AREA IF THIS SWITCH IS SET.  THE TEST INCLUDES 
*                  WRITING AND READING
* 
*                     1) ALTERNATE BITS IN ALTERNATE BYTES.  10101010 
*                                                            01010101 
*                                                            10101010 
*                                                            ........ 
*                     2) COMPLEMENT OF PATTERN 1) 
*E
* 
*                  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
* 
*        7.3       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.4       SECTION 2 - IST ASYNC COMM CHAN TEST 
* 
*                  THIS SECTION PERFORMS A BASIC CHECK ON THE 
*                  ASYNCHRONOUS COMMUNICATION CHANNEL BY ENABLING THE 
*                  LOOP BACK FUNCTION AND OUTPUTTING SEVERAL PATTERNS 
*                  OF DATA.  AFTER A TERMINAL OUTPUT WORD OF 10 DATA
*                  BITS IS WRITTEN, THE PROGRAM WIATS FOR 
*                  CHARACTER READY AND THEN INPUTS A TERMINAL INPUT 
*                  WORD OF 20 DATA BITS.  AN ERROR WILL OCCUR IF EITHER 
*                  CHARACTER READY FAILS TO SET OR IF THE DATA READ 
*                  FAILS TO COMPARE WITH WHAT WAS WRITTEN.  THIS
*                  INTERFACE OPERATES WITH A 12-BIT OUTPUT WORD AND 
*                  A 21-BIT INPUT WORD ONLY.  ALSO, THIS SECTION DOES 
*                  NOT TEST COMBINATIONS OF STOP BITS.
* 
*                  1. OUTPUT ENABLE LOOPBACK CONTROL FUNCTION 
*                  2. INPUT STATUS
*                  3. VERIFY STATUS TO BE  CHAR REQ, NO ERROR STATUS
*                  4. OUTPUT DATA 1 
*                  5. OUTPUT DATA 2 
*                  6. INPUT STATUS
*                  7. REPEAT STEP 6 UNTIL CHAR RDY IS HIGH
*                  8. INPUT DATA 3
*                  9. INPUT DATA 2
*                  10. INPUT DATA 1 AND THROW AWAY
*                  11. VERIFY CORRECT DATA
*                  12. REPEAT STEPS 2-11 FOR 16 ENTRIES IN TABLE
*                  13. OUTPUT DISABLE LOOPBACK CONTROL FUNCTION 
* 
*                     DATA TABLE
*                     ----------
*                        000
*                        001
*                        002
*                        004
*                        008
*                        010
*                        020
*                        040
*                        080
*                        100
*                        200
*                        3FF
*                        000
*                        155
*                        2AA
*                        000
* 
*                  ERROR CODES ARE: 
*                     40   ASYNCHRONOUS COMM CHAN STATUS ERROR
*                     41   ASYNCHRONOUS COMM CHAN DATA ERROR
* 
* 
*        7.5       SECTION 3 - 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.
* 
**
*E
*        RST.SEC0  ROM/RAM CHECK
* 
*        ENTRY     BY JUMP FROM LOCATION 0000 AFTER 
*                  POWER UP OR MASTER CLEAR 
* 
*        CALLS     NONE 
* 
*        ALTERS    ALL REGISTERS
*                  ALL AVAILABLE RAM
* 
*        EXIT      TO RST.SEC1 IF MAIN. SWITCH 1 OS CLEAR 
*                  TO RST.EXIT IF MAIN. SWITCH 1 IS SET 
* 
*        ERRORS REPORTED (OCTAL CODE) 
* 
*                  20 - ROM CHECKSUM ERROR 0000-03FF
*                  21 - ROM CHECKSUM ERROR 0400-07FF
*                  22 - ROM CHECKSUM ERROR 0800-0BFF
*                       OR COMMAND FAILURE
*                  23 - ROM CHECKSUM ERROR 0C00-0FFF
*                  24 - ROM CHECKSUM ERROR 1000-13FF
*                  25 - ROM CHECKSUM ERROR 1400-17FF
*                  26 - RAM FAILURE 
RST.SEC0 IN        RSF.PANL*32+PANLSWCH  UT OPERATORS PANEL SWITCHES
         ANI       RSM.EXIT       CHECK FOR EXIT SWITCH SET 
         JNZ       RST.DONE       IF SET - EXIT DIAGNOSTIC
* 
*        CONDITION 1 - ROM CHECKSUM 
* 
         MVI       A,#12          ERROR CODE FOR CHIP 2 
         OUT       RSF.PANL*32+PANLDATA 
         LXI       H,RST.CHP5     SET HL TO ADR OF CHECKSUM TABLE 
         MVI       D,6
         MVI       A,0
RST.S002 XRA       M              DO UNTIL CHKSUM TABLE IS CHECKSUMMED
         RLC
         DCX       H
         DCR       D
         JNZ       RST.S002       END DO
         MOV       C,A
         LDA       RST.CKSM       GET EXPECTED RESULT 
         CMP       C              COMPARE 
         JZ        RST.S004       JUMP IF CORRECT 
         HLT                      ERROR HALT
RST.S004 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 MOV       A,H            DO UNTIL ALL CHIPS CHECKED
         ANI       #1C
         RRC
         RRC                           FORM NUMBER OF CURRENT CHIP
         ORI       #10                 FORM ERROR CODE
         OUT       RSF.PANL*32+PANLDATA  TPUT ERROR CODE
         MVI       C,0                 ZERO PARTIAL RESULT
RST.S010 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 CHECKSUM
         POP       B                   GET EXPECTED CHECKSUM IN B 
         DCX       SP                  MODIFY SP FOR NEXT CHIP
         DCX       SP 
         DCX       SP 
         CMP       B                   IF CHECKSUM ERROR
         JZ        RST.S015                 THEN  ERROR HALT
* 
*                  ERROR 2X - CHECKSUM ERROR ON CHIP X
* 
         HLT                                ERROR HALT
*                                           (ELSE)
*                                      END IF 
RST.S015 MOV       A,D                 IF NEXT CHIP = 2 
         CPI       #0C
         JNZ       RST.S016 
         DCX       D                        THEN
         DCX       D                        UPDATE DE AND HL
         DCX       D                        TO SKIP OVER
         DCX       D                        CHECKSUMMING
         DCX       D                        THE LAST
         DCX       D                        4 LOC 
         DCX       D                        OF CHIP 2 
         DCX       H
         DCX       H
         DCX       H
         DCX       H
         DCX       H
         DCX       H
         DCX       H                        (ELSE)
RST.S016 MOV       A,D                 END IF 
         ORA       E                   CHECK FOR COUNT = 0
         JNZ       RST.S005       END DO
* 
*        CONDITION 2 - RAM MEMORY CHECK 
* 
         MVI       A,#16
         OUT       RSF.PANL*32+PANLDATA  UT ERROR CODE
         LXI       B,#AA55        SET PATTERN REGISTERS 
         LXI       H,RSV.RAML     GET LENGTH OF 4K RAM
         IN        RSF.PANL*32+PANLSWCH  T OP. PANEL SWITCHES 
         ANI       RSM.RAM        IF SWITCH IS SET
         JZ        RST.S020 
         DAD       H                   THEN LENGTH = 8K 
*                                      (ELSE) 
RST.S020 LXI       D,RSV.SRAM     END IF  DE = FWA OF RAM 
         DAD       D              HL = LWA+1 OF RAM 
         XCHG                     DE = LWA+1 OF RAM 
RST.S025 LXI       H,RSV.SRAM     DO UNTIL BOTH PATTERNS TESTED 
RST.S030 MOV       M,B                 DO UNTIL RAM IS WRITTEN
         INX       H                        STORE FIRST 
         MOV       M,C                      STORE SECOND
         INX       H
         MOV       A,H
         CMP       D                        CHECK FOR END ON UPPER HALF 
         JNZ       RST.S030 
         MOV       A,L
         CMP       E                        CHECK FOR END ON LOWER HALF 
         JNZ       RST.S030            END DO 
         LXI       H,RSV.SRAM          GET FWA OF RAM 
RST.S035 MOV       A,B            DO UNTIL ALL RAM READ 
         CMP       M                        COMPARE AGAINST MEMORY
         JZ        RST.S040                 IF DATA ERROR 
*                                                THEN  ERROR HALT 
*                  ERROR 26 - RAM ERROR 
* 
         HLT                                     ERROR HALT 
*                                                (ELSE) 
RST.S040 INX       H                        END IF  UPDATE INDEX
         MOV       A,C                      GET EXPECTED DATA 
         CMP       M
         INX       H                        IF DATA ERROR 
         JZ        RST.S045                      THEN  ERROR HALT 
* 
*                  ERROR 26 - RAM ERROR 
* 
         HLT                                     ERROR HALT 
*                                                (ELSE) 
RST.S045 MOV       A,H                      END IF
         CMP       D                        CHECK FOR END ON UPPER HALF 
         JNZ       RST.S035 
         MOV       A,L
         CMP       E                        CHECK FOR END ON LOWER HALF 
         JNZ       RST.S035            END DO 
         MOV       A,B                 SWITCH PATTERN REGISTERS 
         MOV       B,C
         MOV       C,A
         CPI       #55                 CHECK FOR PATTERN BACK TO START
         JNZ       RST.S025       END DO
*                                 EXIT SECTION ZERO 
         JMP       RST.SEC1 
**
*E
*        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.
RST.CHP0 DB        #86            CHECKSUM FOR 0000-03FF
RST.CHP1 DB        #31            CHECKSUM FOR 0400-07FF
RST.CHP2 DB        #B1            CHECKSUM FOR 0800-0BF8
RST.CHP3 DB        #F0            CHECKSUM FOR 0C00-0FFF
RST.CHP4 DB        #8F            CHECKSUM FOR 1000-13FF
RST.CHP5 DB        #3D            CHECKSUM FOR 1400-17FF
RST.CKSM DB        #F5            CHECKSUM FOR 0BF9-0BFF
**
*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.SEC2 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.S130 
         HLT                      ERROR HALT
RST.S130 LXI       SP,RST.STAK    SET SP
         MVI       A,#FF
         CALL      RST.SUB1       CALL SUB 1
         STC
         CC        RST.SUB2       CALL SUB 2
         STC
         CMC                      CLEAR CARRY 
         CNC       RST.SUB3 
         CPI       2              VERIFY A=2
         JZ        RST.S132 
         HLT                      ERROR HALT
RST.SUB1 INR       A              ADD 1 TO A
         RET                      RETURN
         HLT                      ERROR HALT
RST.SUB2 INR       A              ADD 1 TO A
         STC
         RC                            RETURN IF CARRY IS SET 
         HLT                      ERROR HALT
RST.SUB3 INR       A              ADD 1 TO A
         STC
         CMC
         RNC                           RETURN IF CARRY NOT SET
         HLT                      ERROR HALT
RST.S132 LXI       D,RST.CON3 
         LXI       H,RST.CON4 
         XCHG                     EXCHANGE REGISTER PAIRS 
         LDAX      D              A=0 
         ADI       1
         JNZ       RST.S134 
         HLT                      ERROR HALT
RST.S134 MOV       A,M
         ADI       1
         JZ        RST.S136 
         HLT                      ERROR HALT
RST.S136 LXI       SP,RST.STAK    SET SP
         MVI       B,0
         MVI       C,RSM.CCLR     LOAD C WITH CLEAR CONDITION BYTE
         PUSH      B
         POP       PSW            SET CONDITIONS
         JNC       RST.S138       CC SHOULD NOT BE SET
         HLT                      ERROR HALT
RST.S138 JPO       RST.S140 
         HLT                      ERROR HALT
RST.S140 JNZ       RST.S142 
         HLT                      ERROR HALT
RST.S142 JP        RST.S144 
         HLT                      ERROR HALT
RST.S144 MVI       B,0
         MVI       C,RSM.CSET     LOAD C WITH SET CONDITION BYTE
         PUSH      B
         POP       PSW
         JPE       RST.S146 
         HLT                      ERROR HALT
RST.S146 JM        RST.S148 
         HLT                      ERROR HALT
RST.S148 CPI       0
         JZ        RST.S150 
         HLT                      ERROR HALT
RST.S150 MVI       A,#99          SET A FOR DECIMAL ADJUST
         ADI       1
         DAA
         JC        RST.S152 
         HLT                      ERROR HALT
RST.S152 CPI       0
         JZ        RST.SEC2 
         HLT                      ERROR HALT
*                                 EXIT SECTION ONE
**
*E
*        RST.SEC2  COMM CHANNEL TEST
* 
*        ENTRY     CONTROL IS GIVEN TO SECTION TWO UPON 
*                  COMPLETION OF SECTION ONE
* 
*        CALLS     NONE 
* 
*        ALTERS    ALL REGISTERS
* 
*        EXIT      TO RST.SEC3 UPON COMPLETION
* 
*        ERRORS REPORTED (OCTAL CODE) 
* 
*                  40 - COMM CHAN STATUS ERROR
*                  41 - COMM CHAN DATA ERROR
RST.SEC2 MVI       A,#04
         OUT       RSF.COMM*32+COMMCONT  UT ENABLE DATA LOOPBACK
         IN        RSF.COMM*32+COMMDAT1  R ANY GARBAGE CHARACTER
         LXI       H,RST.DATT     SET UP TABLE INDEX
         MVI       C,16           SET UP TABLE COUNTER
RST.S205 MVI       A,#20          DO UNTIL TABLE COUNTER=0
         PUSH      B                   SAVE COUNTER IN STACK
         OUT       RSF.PANL*32+PANLDATA  TPUT STATUS ERROR
         LXI       D,#FFFF             SET TIME-OUT COUNTER 
RST.S206 IN        RSF.COMM*32+COMMSTAT  PUT COMM STATUS
         ANI       #40                 IF CHAR. REQ.
         JNZ       RST.S210                 (THEN)
         DCX       D                        ELSE  DECREMENT TIME-OUT
         MOV       A,E
         ORA       D
         JNZ       RST.S206                 LOOP TILL TIME-OUT
*                                           ERROR HALT
         HLT
*                                      END IF 
RST.S210 MOV       B,M                 GET DATA 2  BITS 9-10
         INX       H                   UPDATE INDEX 
         MOV       A,M                 GET DATA 1  BITS 1-8 
         OUT       RSF.COMM*32+COMMDAT1  TPUT DATA 1
         MOV       A,B
         ANI       3                   SAVE BITS 9-10 
         OUT       RSF.COMM*32+COMMDAT2  TPUT DATA 2
RST.S215 IN        RSF.COMM*32+COMMSTAT   UNTIL CHAR RDY IS HIGH
         ANI       #80
         JZ        RST.S215            END DO 
         MVI       A,#21
         OUT       RSF.PANL*32+PANLDATA  TPUT DATA ERROR CODE 
         IN        RSF.COMM*32+COMMDAT3  PUT DATA 3 
         MOV       E,A
         IN        RSF.COMM*32+COMMDAT2  PUT DATA 2 
         MOV       D,A
         IN        RSF.COMM*32+COMMDAT1  PUT DATA 1 
         ANI       #40                 SAVE STOP BIT
         JZ        RST.S218            IF STOP = 0
*                                           (THEN)
* 
         HLT                                ELSE  ERROR HALT
*                                      END IF 
RST.S218 MOV       A,E                 GET DATA 1 
         ANI       1                   SAVE PARITY
         MOV       C,A
         MOV       A,B
         ANI       #80                 SAVE EXPECTED PARITY 
         RLC
         CMP       C                   IF PARITY CORRECT
         JZ        RST.S220                 (THEN)
* 
         HLT                                ELSE  ERROR HALT
*                                      END IF 
RST.S220 MOV       A,E                 GET DATA 1 
         RRC                           SHIFT OFF STOP BIT 
         ANI       #1F                 SAVE BITS 2-6
         MOV       E,A
         MOV       A,D                 GET DATA 2 
         ANI       7                   SAVE BITS 7-9
         RRC
         RRC
         RRC
         ORA       E                   FORM ACTUAL DATA 1-8 
         CMP       M                   IF ACTUAL MATCHES EXPECTED 
         JZ        RST.S222                 (THEN)
* 
         HLT                                ELSE  ERROR HALT
*                                      END IF 
RST.S222 MOV       A,D                 GET DATA 2 
         RRC
         RRC
         RRC
         ANI       7                   SAVE BITS 10-12
         MOV       D,A
         MOV       A,B                 GET EXPECTED DATA
         ANI       7                   MASK FOR BITS 10-12
         CMP       D                   IF DATA MATCHES
         JZ        RST.S225                 (THEN)
* 
         HLT                                ELSE  ERROR HALT
*                                      END IF 
RST.S225 INX       H                   UPDATE INDEX 
         POP       B                   RESTORE COUNTER
         DCR       C                   UPDATE COUNTER 
         JNZ       RST.S205       END DO
         MVI       A,0
         OUT       RSF.COMM*32+COMMCONT  UT DISABLE LOOPBACK
*                                 EXIT SECTION TWO
**
*E
*        RST.SEC3  DISPLAY INTERFACE TEST 
* 
*        ENTRY     CONTROL IS GIVEN TO SECTION THREE UPON 
*                  COMPLETION OF SECTION TWO
* 
*        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      INDI.1         INITIALIZE FOR CHARACTER PLOTTING.
         LXI       H,208          LOAD X COORDINATE 
         LXI       D,80           LOAD Y COORDINATE.
         CALL      INDI.2         SET COORDINATES ON DISPLAY. 
         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 
**
*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 
         JMP       R.INIT         PASS CONTROL TO FIRMWARE PROGRAM. 
**
*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      INDI.2         SET COORDINATES ON DISPLAY. 
         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  CPI       #0A            CHECK FOR 0-9 OR A-F
         JC        RST.OUT5       JUMP IF 0-9 
         MOV       D,A
         LXI       H,M1CODE00     LOAD M1 CHARACTER 
         SHLD      MEMSEL           SET IN MEMORY SELECT. 
         MOV       A,D
         SUI       9              FOR CODE FOR USE IN M1
         CALL      INDI.3         CALL CHARACTER GENERATOR. 
         RET                      RETURN TO CALLER
RST.OUT5 MOV       D,A
         LXI       H,M0CODE00     LOAD M0 CHARACTER 
         SHLD      MEMSEL           SET IN MEMORY SELECT. 
         MOV       A,D
         ADI       27             FORM CODE FOR M0
         CALL      INDI.3         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       0
PANLSWCH EQU       1
         DB        #00,#00,#00,#00,#00,#00,#00
************************************************************************
* 
*                  M0 CHARACTER SET 
* 
************************************************************************
* 
* 
*                                       SEMICOLON 
M0CODE00 DB        #00,#00,#00,#00
         DB        #30,#03,#30,#03
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       SMALL LETTER A
M0CODE01 DB        #60,#00,#90,#02
         DB        #90,#02,#90,#02
         DB        #90,#02,#E0,#01
         DB        #10,#00,#00,#00
*                                       SMALL LETTER B
M0CODE02 DB        #F0,#1F,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
*                                       SMALL LETTER C
M0CODE03 DB        #C0,#00,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#10,#02
         DB        #20,#01,#00,#00
*                                       SMALL LETTER D
M0CODE04 DB        #C0,#00,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #F0,#1F,#00,#00
*                                       SMALL LETTER E
M0CODE05 DB        #C0,#00,#A0,#01
         DB        #90,#02,#90,#02
         DB        #90,#02,#90,#02
         DB        #90,#01,#00,#00
*                                       SMALL LETTER F
M0CODE06 DB        #00,#00,#00,#00
         DB        #10,#02,#F0,#0F
         DB        #10,#12,#00,#10
         DB        #00,#08,#00,#00
*                                       SMALL LETTER G
M0CODE07 DB        #A8,#01,#54,#02
         DB        #54,#02,#54,#02
         DB        #54,#02,#94,#01
         DB        #08,#02,#00,#00
*                                       SMALL LETTER H
M0CODE08 DB        #00,#10,#F0,#1F
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
*                                       SMALL LETTER I
M0CODE09 DB        #00,#00,#00,#00
         DB        #10,#02,#F0,#13
         DB        #10,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       SMALL LETTER J
M0CODE0A DB        #02,#00,#02,#02
         DB        #FC,#13,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       SMALL LETTER K
M0CODE0B DB        #10,#10,#F0,#1F
         DB        #80,#00,#40,#01
         DB        #20,#02,#10,#02
         DB        #10,#00,#00,#00
*                                       SMALL LETTER L
M0CODE0C DB        #00,#00,#10,#10
         DB        #F0,#1F,#10,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       SMALL LETTER M
M0CODE0D DB        #F0,#03,#00,#02
         DB        #00,#02,#F0,#01
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
*                                       SMALL LETTER N
M0CODE0E DB        #00,#02,#F0,#03
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #F0,#01,#00,#00
*                                       SMALL LETTER O
M0CODE0F DB        #C0,#00,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
*                                       SMALL LETTER P
M0CODE10 DB        #FE,#03,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #C0,#00,#00,#00
*                                       SMALL LETTER Q
M0CODE11 DB        #C0,#00,#20,#01
         DB        #10,#02,#10,#02
         DB        #10,#02,#20,#01
         DB        #FE,#03,#00,#00
*                                       SMALL LETTER R
M0CODE12 DB        #00,#02,#F0,#03
         DB        #00,#01,#00,#02
         DB        #00,#02,#00,#02
         DB        #00,#01,#00,#00
*                                       SMALL LETTER S
M0CODE13 DB        #20,#01,#90,#02
         DB        #90,#02,#90,#02
         DB        #90,#02,#90,#02
         DB        #60,#00,#00,#00
*                                       SMALL LETTER T
M0CODE14 DB        #00,#02,#00,#02
         DB        #E0,#1F,#10,#02
         DB        #10,#02,#10,#02
         DB        #00,#00,#00,#00
*                                       SMALL LETTER U
M0CODE15 DB        #E0,#03,#10,#00
         DB        #10,#00,#10,#00
         DB        #10,#00,#E0,#03
         DB        #10,#00,#00,#00
*                                       SMALL LETTER V
M0CODE16 DB        #00,#02,#00,#03
         DB        #C0,#00,#30,#00
         DB        #C0,#00,#00,#03
         DB        #00,#02,#00,#00
*                                       SMALL LETTER W
M0CODE17 DB        #E0,#03,#10,#00
         DB        #20,#00,#C0,#01
         DB        #20,#00,#10,#00
         DB        #E0,#03,#00,#00
*                                       SMALL LETTER X
M0CODE18 DB        #00,#02,#10,#02
         DB        #20,#01,#C0,#00
         DB        #C0,#00,#20,#01
         DB        #10,#02,#00,#00
*                                       SMALL LETTER Y
M0CODE19 DB        #82,#03,#44,#00
         DB        #28,#00,#10,#00
         DB        #20,#00,#40,#00
         DB        #80,#03,#00,#00
*                                       SMALL LETTER Z
M0CODE1A DB        #10,#03,#30,#02
         DB        #50,#02,#90,#02
         DB        #10,#03,#30,#02
         DB        #00,#00,#00,#00
*                                       NUMERIAL ZERO 
M0CODE1B DB        #10,#00,#E0,#07
         DB        #50,#08,#90,#09
         DB        #10,#0A,#E0,#07
         DB        #00,#08,#00,#00
*                                       NUMERIAL ONE
M0CODE1C DB        #00,#00,#00,#00
         DB        #10,#04,#F0,#0F
         DB        #10,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       NUMERIAL TWO
M0CODE1D DB        #00,#00,#30,#04
         DB        #50,#08,#90,#08
         DB        #10,#09,#10,#06
         DB        #00,#00,#00,#00
*                                       NUMERIAL THREE
M0CODE1E DB        #00,#00,#20,#04
         DB        #10,#08,#10,#09
         DB        #10,#09,#E0,#06
         DB        #00,#00,#00,#00
*                                       NUMERIAL FOUR 
M0CODE1F DB        #00,#00,#80,#00
         DB        #80,#01,#80,#02
         DB        #80,#04,#F0,#0F
         DB        #80,#00,#00,#00
*                                       NUMERIAL FIVE 
M0CODE20 DB        #00,#00,#10,#0F
         DB        #10,#09,#10,#09
         DB        #20,#09,#C0,#08
         DB        #00,#00,#00,#00
*                                       NUMERIAL SIX
M0CODE21 DB        #00,#00,#E0,#03
         DB        #10,#05,#10,#09
         DB        #10,#09,#E0,#00
         DB        #00,#00,#00,#00
*                                       NUMERIAL SEVEN
M0CODE22 DB        #00,#00,#00,#08
         DB        #30,#08,#C0,#08
         DB        #00,#0B,#00,#0C
         DB        #00,#00,#00,#00
*                                       NUMERIAL EIGHT
M0CODE23 DB        #00,#00,#E0,#06
         DB        #10,#09,#10,#09
         DB        #10,#09,#E0,#06
         DB        #00,#00,#00,#00
*                                       NUMERIAL NINE 
M0CODE24 DB        #00,#00,#00,#07
         DB        #90,#08,#90,#08
         DB        #A0,#08,#C0,#07
         DB        #00,#00,#00,#00
*                                       PLUS
M0CODE25 DB        #00,#00,#80,#00
         DB        #80,#00,#E0,#03
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
*                                       MINUS 
M0CODE26 DB        #00,#00,#80,#00
         DB        #80,#00,#80,#00
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
*                                       ASTERICK
M0CODE27 DB        #00,#00,#40,#02
         DB        #80,#01,#60,#06
         DB        #80,#01,#40,#02
         DB        #00,#00,#00,#00
*                                       SLASH 
M0CODE28 DB        #10,#00,#20,#00
         DB        #40,#00,#80,#00
         DB        #00,#01,#00,#02
         DB        #00,#04,#00,#00
*                                       LEFT CLOSURE
M0CODE29 DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #E0,#07,#10,#08
         DB        #08,#10,#00,#00
*                                       RIGHT CLOSURE 
M0CODE2A DB        #08,#10,#10,#08
         DB        #E0,#07,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       DOLLAR SIGN 
M0CODE2B DB        #40,#06,#20,#09
         DB        #20,#09,#F0,#1F
         DB        #20,#09,#20,#09
         DB        #C0,#04,#00,#00
*                                       EQUAL 
M0CODE2C DB        #00,#00,#40,#01
         DB        #40,#01,#40,#01
         DB        #40,#01,#40,#01
         DB        #00,#00,#00,#00
*                                       SPACE 
M0CODE2D DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       COMMA 
M0CODE2E DB        #00,#00,#00,#00
         DB        #34,#00,#38,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       PERIOD
M0CODE2F DB        #00,#00,#00,#00
         DB        #30,#00,#30,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       DIVIDE SIGN 
M0CODE30 DB        #00,#00,#80,#00
         DB        #80,#00,#A0,#02
         DB        #80,#00,#80,#00
         DB        #00,#00,#00,#00
*                                       LEFT BTACKET
M0CODE31 DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#F8,#1F
         DB        #08,#10,#08,#10
*                                       RIGHT BRACKET 
M0CODE32 DB        #08,#10,#08,#10
         DB        #F8,#1F,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       PERCENT SIGN
M0CODE33 DB        #20,#0C,#40,#12
         DB        #80,#0C,#00,#01
         DB        #60,#02,#90,#04
         DB        #60,#08,#00,#00
*                                       STAR
M0CODE34 DB        #00,#00,#00,#00
         DB        #40,#02,#80,#01
         DB        #80,#01,#40,#02
         DB        #00,#00,#00,#00
*                                       LEFT DOUBLE ARROW 
M0CODE35 DB        #80,#00,#40,#01
         DB        #20,#02,#70,#07
         DB        #40,#01,#40,#01
         DB        #40,#01,#00,#00
*                                       SINGLE QUOTATION
M0CODE36 DB        #00,#00,#00,#00
         DB        #00,#00,#00,#1C
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       DOUBLE QUOTATION MARKS
M0CODE37 DB        #00,#00,#00,#00
         DB        #00,#1C,#00,#00
         DB        #00,#1C,#00,#00
         DB        #00,#00,#00,#00
*                                       EXCLAIMATION MARK 
M0CODE38 DB        #00,#00,#00,#00
         DB        #00,#00,#90,#1F
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       SEMICOLON 
M0CODE39 DB        #00,#00,#00,#00
         DB        #34,#03,#38,#03
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       LESS THAN 
M0CODE3A DB        #00,#00,#80,#00
         DB        #40,#01,#20,#02
         DB        #10,#04,#00,#00
         DB        #00,#00,#00,#00
*                                       GREATER THAN
M0CODE3B DB        #00,#00,#00,#00
         DB        #10,#04,#20,#02
         DB        #40,#01,#80,#00
         DB        #00,#00,#00,#00
*                                       UNDERLINE 
M0CODE3C DB        #04,#00,#04,#00
         DB        #04,#00,#04,#00
         DB        #04,#00,#04,#00
         DB        #04,#00,#00,#00
*                                       QUESTION MARK 
M0CODE3D DB        #00,#00,#00,#0C
         DB        #00,#10,#D0,#10
         DB        #00,#11,#00,#0E
         DB        #00,#00,#00,#00
*                                       RIGHT ARROW HEAD
M0CODE3E DB        #1C,#1C,#24,#12
         DB        #48,#09,#90,#04
         DB        #20,#02,#40,#01
         DB        #80,#00,#00,#00
*                                       UNCOVER 
M0CODE3F DB        #00,#00,#00,#00
         DB        #00,#00,#0A,#00
         DB        #06,#00,#00,#00
         DB        #00,#00,#00,#00
************************************************************************
* 
*                  M1 CHARACTER SET 
* 
************************************************************************
*                                       NUMBER SIGN 
M1CODE00 DB        #00,#05,#00,#05
         DB        #C0,#1F,#00,#05
         DB        #C0,#1F,#00,#05
         DB        #00,#05,#00,#00
*                                       CAPITAL A 
M1CODE01 DB        #F0,#07,#00,#09
         DB        #00,#11,#00,#11
         DB        #00,#11,#00,#09
         DB        #F0,#07,#00,#00
*                                       CAPITAL B 
M1CODE02 DB        #F0,#1F,#10,#12
         DB        #10,#12,#10,#12
         DB        #10,#12,#10,#0E
         DB        #E0,#01,#00,#00
*                                       CAPITAL C 
M1CODE03 DB        #C0,#07,#20,#08
         DB        #10,#10,#10,#10
         DB        #10,#10,#10,#10
         DB        #20,#08,#00,#00
*                                       CAPITAL D 
M1CODE04 DB        #F0,#1F,#10,#10
         DB        #10,#10,#10,#10
         DB        #10,#10,#20,#08
         DB        #C0,#07,#00,#00
*                                       CAPITAL E 
M1CODE05 DB        #F0,#1F,#10,#11
         DB        #10,#11,#10,#11
         DB        #10,#11,#10,#10
         DB        #10,#10,#00,#00
*                                       CAPITAL F 
M1CODE06 DB        #F0,#1F,#00,#11
         DB        #00,#11,#00,#11
         DB        #00,#10,#00,#10
         DB        #00,#10,#00,#00
*                                       CAPITAL G 
M1CODE07 DB        #C0,#07,#20,#08
         DB        #10,#10,#10,#10
         DB        #90,#10,#90,#10
         DB        #E0,#08,#00,#00
*                                       CAPITAL H 
M1CODE08 DB        #F0,#1F,#00,#01
         DB        #00,#01,#00,#01
         DB        #00,#01,#00,#01
         DB        #F0,#1F,#00,#00
*                                       CAPITAL I 
M1CODE09 DB        #00,#00,#10,#10
         DB        #10,#10,#F0,#1F
         DB        #10,#10,#10,#10
         DB        #00,#00,#00,#00
*                                       CAPITAL J 
M1CODE0A DB        #20,#00,#10,#00
         DB        #10,#10,#10,#10
         DB        #E0,#1F,#00,#10
         DB        #00,#10,#00,#00
*                                       CAPITAL K 
M1CODE0B DB        #F0,#1F,#80,#00
         DB        #00,#01,#80,#02
         DB        #40,#04,#20,#08
         DB        #10,#10,#00,#00
*                                       CAPITAL L 
M1CODE0C DB        #F0,#1F,#10,#00
         DB        #10,#00,#10,#00
         DB        #10,#00,#10,#00
         DB        #10,#00,#00,#00
*                                       CAPITAL M 
M1CODE0D DB        #F0,#1F,#00,#08
         DB        #00,#04,#00,#02
         DB        #00,#04,#00,#08
         DB        #F0,#1F,#00,#00
*                                       CAPITAL N 
M1CODE0E DB        #F0,#1F,#00,#08
         DB        #00,#06,#00,#01
         DB        #C0,#00,#20,#00
         DB        #F0,#1F,#00,#00
*                                       CAPITAL O 
M1CODE0F DB        #C0,#07,#20,#08
         DB        #10,#10,#10,#10
         DB        #10,#10,#20,#08
         DB        #C0,#07,#00,#00
*                                       CAPITAL P 
M1CODE10 DB        #F0,#1F,#00,#11
         DB        #00,#11,#00,#11
         DB        #00,#11,#00,#11
         DB        #00,#0E,#00,#00
*                                       CAPITAL Q 
M1CODE11 DB        #C0,#07,#20,#08
         DB        #10,#10,#18,#10
         DB        #14,#10,#24,#08
         DB        #C0,#07,#00,#00
*                                       CAPITAL R 
M1CODE12 DB        #F0,#1F,#00,#11
         DB        #00,#11,#80,#11
         DB        #40,#11,#20,#11
         DB        #10,#0E,#00,#00
*                                       CAPITAL S 
M1CODE13 DB        #20,#0E,#10,#11
         DB        #10,#11,#10,#11
         DB        #10,#11,#10,#11
         DB        #E0,#08,#00,#00
*                                       CAPITAL T 
M1CODE14 DB        #00,#10,#00,#10
         DB        #00,#10,#F0,#1F
         DB        #00,#10,#00,#10
         DB        #00,#10,#00,#00
*                                       CAPITAL U 
M1CODE15 DB        #E0,#1F,#10,#00
         DB        #10,#00,#10,#00
         DB        #10,#00,#10,#00
         DB        #E0,#1F,#00,#00
*                                       CAPITAL V 
M1CODE16 DB        #00,#18,#00,#07
         DB        #C0,#00,#30,#00
         DB        #C0,#00,#00,#07
         DB        #00,#18,#00,#00
*                                       CAPITAL W 
M1CODE17 DB        #E0,#1F,#10,#00
         DB        #20,#00,#C0,#03
         DB        #20,#00,#10,#00
         DB        #E0,#1F,#00,#00
*                                       CAPITAL X 
M1CODE18 DB        #30,#18,#40,#04
         DB        #80,#02,#00,#01
         DB        #80,#02,#40,#04
         DB        #30,#18,#00,#00
*                                       CAPITAL Y 
M1CODE19 DB        #00,#18,#00,#04
         DB        #00,#02,#F0,#01
         DB        #00,#02,#00,#04
         DB        #00,#18,#00,#00
*                                       CAPITAL Z 
M1CODE1A DB        #30,#18,#50,#10
         DB        #90,#10,#10,#11
         DB        #10,#12,#10,#14
         DB        #30,#18,#00,#00
*                                       SPECIAL 
M1CODE1B DB        #00,#00,#00,#10
         DB        #00,#20,#00,#20
         DB        #00,#10,#00,#10
         DB        #00,#20,#00,#00
*                                       SPECIAL 
M1CODE1C DB        #00,#00,#00,#00
         DB        #00,#10,#00,#00
         DB        #00,#10,#00,#00
         DB        #00,#00,#00,#00
*                                       SPECIAL 
M1CODE1D DB        #00,#00,#00,#10
         DB        #00,#20,#00,#40
         DB        #00,#20,#00,#10
         DB        #00,#00,#00,#00
*                                       SPECIAL 
M1CODE1E DB        #00,#00,#00,#00
         DB        #00,#00,#00,#10
         DB        #00,#20,#00,#40
         DB        #00,#00,#00,#00
*                                       SPECIAL 
M1CODE1F DB        #00,#00,#00,#40
         DB        #00,#20,#00,#10
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       UP ARROW
M1CODE20 DB        #00,#00,#00,#01
         DB        #00,#03,#F0,#07
         DB        #00,#03,#00,#01
         DB        #00,#00,#00,#00
*                                       RIGHT ARROW 
M1CODE21 DB        #80,#00,#80,#00
         DB        #80,#00,#80,#00
         DB        #E0,#03,#C0,#01
         DB        #80,#00,#00,#00
*                                       DOWN ARROW
M1CODE22 DB        #00,#00,#40,#00
         DB        #60,#00,#F0,#07
         DB        #60,#00,#40,#00
         DB        #00,#00,#00,#00
*                                       LEFT ARROW
M1CODE23 DB        #80,#00,#C0,#01
         DB        #E0,#03,#80,#00
         DB        #80,#00,#80,#00
         DB        #80,#00,#00,#00
*                                       APPROXIMATE 
M1CODE24 DB        #00,#00,#80,#00
         DB        #00,#01,#00,#01
         DB        #80,#00,#80,#00
         DB        #00,#01,#00,#00
*                                       CAPITAL SIGMA 
M1CODE25 DB        #10,#10,#30,#18
         DB        #50,#14,#90,#12
         DB        #10,#11,#10,#10
         DB        #10,#10,#00,#00
*                                       CAPITAL DELTA 
M1CODE26 DB        #30,#00,#D0,#00
         DB        #10,#03,#10,#0C
         DB        #10,#03,#D0,#00
         DB        #30,#00,#00,#00
*                                       SPECIAL 
M1CODE27 DB        #00,#00,#80,#03
         DB        #40,#00,#40,#00
         DB        #40,#00,#80,#03
         DB        #00,#00,#00,#00
*                                       SPECIAL 
M1CODE28 DB        #00,#00,#C0,#01
         DB        #00,#02,#00,#02
         DB        #00,#02,#C0,#01
         DB        #00,#00,#00,#00
*                                       LEFT PARENTHESIS
M1CODE29 DB        #00,#00,#00,#00
         DB        #00,#00,#80,#00
         DB        #78,#0F,#04,#10
         DB        #04,#10,#00,#00
*                                       RIGHT PARENTHESIS 
M1CODE2A DB        #04,#10,#04,#10
         DB        #78,#0F,#80,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       AMPER SIGN
M1CODE2B DB        #E0,#00,#10,#0D
         DB        #10,#13,#90,#0C
         DB        #60,#00,#60,#00
         DB        #90,#01,#00,#00
*                                       NOT EQUAL 
M1CODE2C DB        #50,#01,#60,#01
         DB        #40,#01,#C0,#01
         DB        #40,#01,#40,#03
         DB        #40,#05,#00,#00
*                                       SPACE 
M1CODE2D DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       VERTICAL
M1CODE2E DB        #00,#00,#00,#00
         DB        #00,#00,#F0,#1F
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
*                                       DEGREE SIGN 
M1CODE2F DB        #00,#00,#00,#0C
         DB        #00,#12,#00,#12
         DB        #00,#0C,#00,#00
         DB        #00,#00,#00,#00
*                                       EQUIVALENT
M1CODE30 DB        #00,#00,#A0,#02
         DB        #A0,#02,#A0,#02
         DB        #A0,#02,#A0,#02
         DB        #00,#00,#00,#00
*                                       ALPHA 
M1CODE31 DB        #E0,#01,#10,#02
         DB        #10,#02,#A0,#01
         DB        #60,#00,#90,#00
         DB        #10,#03,#00,#00
*                                       BETA
M1CODE32 DB        #02,#00,#FC,#03
         DB        #10,#05,#10,#09
         DB        #10,#09,#90,#06
         DB        #60,#00,#00,#00
*                                       SMALL DELTA 
M1CODE33 DB        #00,#00,#E0,#0C
         DB        #10,#13,#10,#11
         DB        #90,#08,#60,#04
         DB        #00,#00,#00,#00
*                                       LAMDA 
M1CODE34 DB        #00,#00,#30,#10
         DB        #C0,#0C,#00,#03
         DB        #C0,#00,#30,#00
         DB        #00,#00,#00,#00
*                                       MU
M1CODE35 DB        #02,#00,#02,#00
         DB        #FC,#03,#10,#00
         DB        #10,#00,#E0,#03
         DB        #10,#00,#00,#00
*                                       PI
M1CODE36 DB        #00,#01,#00,#02
         DB        #F0,#03,#00,#02
         DB        #F0,#03,#00,#02
         DB        #00,#04,#00,#00
*                                       RHO 
M1CODE37 DB        #06,#00,#38,#00
         DB        #E0,#00,#10,#01
         DB        #10,#02,#20,#02
         DB        #C0,#01,#00,#00
*                                       SMALL SIGMA 
M1CODE38 DB        #E0,#00,#10,#01
         DB        #10,#02,#10,#03
         DB        #E0,#02,#00,#02
         DB        #00,#02,#00,#00
*                                       OMEGA 
M1CODE39 DB        #E0,#01,#10,#02
         DB        #10,#00,#E0,#00
         DB        #10,#00,#10,#02
         DB        #E0,#01,#00,#00
*                                       LESS THAN OR EQUAL TO 
M1CODE3A DB        #20,#02,#20,#02
         DB        #20,#05,#20,#05
         DB        #A0,#08,#A0,#08
         DB        #00,#00,#00,#00
*                                       GREATER THAN OR EQUAL TO
M1CODE3B DB        #00,#00,#A0,#08
         DB        #A0,#08,#20,#05
         DB        #20,#05,#20,#02
         DB        #20,#02,#00,#00
*                                       THETA 
M1CODE3C DB        #C0,#07,#20,#09
         DB        #10,#11,#10,#11
         DB        #10,#11,#20,#09
         DB        #C0,#07,#00,#00
*                                       COMMERICAL AT 
M1CODE3D DB        #E0,#01,#10,#02
         DB        #C8,#04,#28,#05
         DB        #E8,#05,#20,#02
         DB        #C0,#01,#00,#00
*                                       REVERSE SLASH 
M1CODE3E DB        #00,#04,#00,#02
         DB        #00,#01,#80,#00
         DB        #40,#00,#20,#00
         DB        #10,#00,#00,#00
*                                       UNCOVER 
M1CODE3F DB        #E0,#01,#10,#02
         DB        #10,#02,#E0,#01
         DB        #90,#02,#90,#02
         DB        #A0,#01,#00,#00
         ORG       #2000
         BSS       39 
         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.
EMPTY    BSS       3              AVAILABLE FOR USE 
WORDCNT  BSS       1              COMM LINE INPUT WORD COUNT
ABORT    BSS       1              ABORT MODE FLAG 
BC.REG   BSS       1              BLOCK CHECK REGISTER
COM.STA  BSS       1              COMM LINE STATUS
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
BLOCKX   BSS       2
BLOCKY   BSS       2
XEND     BSS       2
YEND     BSS       2
XDELTA   BSS       2
YDELTA   BSS       2
SAVE     BSS       2              TEMPORARY STORAGE FOR REGS PAIR HL
AUD.CNT  BSS       1              AUDIO COUNTER FOR 7F ECHO CODE. 
VECFLAG  BSS       1
MODE4CNT BSS       1
XSAVE    BSS       2              X POSITION SCRATCH REGISTER 
YSAVE    BSS       2              Y POSITION SCRATCH REGISTER 
BLOCKF   BSS       1
MEMSEL   BSS       2              CHARACTER MEMORY SELECTED ADDRESS 
MEMREG   BSS       2              LDA MEMORY ADDRESS
M.ORG    BSS       2              BASE ADDRESS OF DATA
M.LGTH   BSS       2              LENGTH OF DATA BUFFER 
INH.FLG  BSS       1              INPUT DEVICE INHIBIT STATUS 
COMMAND  BSS       5              COMM LINE INPUT WORD
*        EXTERNAL DEVICE OUTPUT INSTRUCTION 
EXT.OUT  BSS       6
*        EXTERNAL DEVICE INPUT INSTRUCTION
EXT.IN   BSS       3
US.FIFO  BSS       1              DIFFERANCE COUNTER
         BSS       1              INPUT POINTER 
         BSS       1              OUTPUT POINTER
         BSS       16             BUFFER STORE AREA 
* 
TX.FIFO  BSS       1              DIFFERANCE COUNTER
         BSS       1              INPUT POINTER 
         BSS       1              OUTPUT POINTER
         BSS       16             BUFFER STORE AREA 
* 
RX.FIFO  BSS       1              INPUT POINTER 
         BSS       1              OUTPUT POINTER
         BSS       512            BUFFER STORE AREA 
         ORG       #22EA
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
M.FLAG0  BSS       1              USER FLAG 
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
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
         END       START
