ASC1RAM 
         IDENT     IGT,#4000
          CHIP
  
          TITLE  INTERACTIVE GRAPHICS 
         ORG       #4000
  
********************
* 
*        EQUATE STATEMENTS
* 
**************************************
*                                 PANEL SWITCHES
RSF.PANL EQU       #00
PANLSWCH EQU       #11            FOR BREADBOARD AND IST
*                                 INTERRUPT CONTROL 
COMCHAN  EQU       1              CLA CHANNEL NUMBER
COMCON   EQU       2              CLA CONTROL FUNCTION
COMSTA    EQU    3           CLA STATUS FUNCTION
*                                 ASCII COMMUNICATIONS
COMDATA  EQU       #E2            SERIAL CHANNEL DATA 
COMSTAT  EQU       #E3            SERIAL CHANNEL STATUS 
*                                 TOUCH PANEL 
*                  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
*                                 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 
*********************** 
M.SBTYPE EQU     #22E6
M.CONFIG  EQU    #22E7
M.M0      EQU    #22E8
M.VERS    EQU    #22EA
M.TYPE   EQU       #22EB
M.CLOCK  EQU       #22EC
M.EXTPA  EQU       #22EE
M.MARGIN EQU       #22F0
M.JOBS   EQU       #22F2
M.CCR    EQU       #22F4
M.MODE   EQU       #22F6
M.DIR    EQU       #22F8
M.KSW    EQU       #22FA
M.ENAB   EQU       #22FC
M.SELECT EQU       #22FE
* 
M0ADR     EQU    #0096       LOCATION OF M0 CHAR. SET ADR.
M1ADR     EQU    #0098       LOCATION OF M1 CHAR. SET ADR.
MODE5A   EQU       #2300
MODE6A   EQU       #2302
MODE7A   EQU       #2304
* 
MEM2     EQU       #2306
MEM3     EQU       #2308
MEM4     EQU       #230A
MEM5     EQU       #230C
MEM6     EQU       #230E
MEM7     EQU       #2310
* 
SUPER    EQU       #009A
SUB      EQU       #009D
SELECTM0 EQU       #00A0
SELECTM1 EQU       #00A3
SELECTMM EQU       #00A6
HORZ     EQU       #00A9
VERTICAL EQU       #00AC
FORWARD  EQU       #00AF
REVERSE  EQU       #00B2
SIZE.1   EQU       #00B5
SIZE.2   EQU       #00B8
BKSPACE  EQU       #00BB
RETURN   EQU       #00BE
TAB      EQU       #00C1
LINEFEED EQU       #00C4
VERTAB   EQU       #00C7
FORMFEED EQU       #00CA
* 
D.CNTL2  EQU       #2050
SIZE     EQU       #2051
FWD.REV  EQU       #2052
HOR      EQU       #2053
VER      EQU       #2054
X.PLOT   EQU       #2055
Y.PLOT   EQU       #2057
CHAR.GEN EQU       #2059
XREG     EQU       #205B
YREG     EQU       #205D
XSAVE    EQU       #205F
YSAVE    EQU       #2061
MEMSEL   EQU       #2063
M.ORG    EQU       #2065
* 
* 
M.HALT    EQU    #2314
M.STATUS  EQU    #2316
MODE      EQU    #2318
SC.OC     EQU    #2319
* 
A.INIT   JMP       ASTART 
R.DOT    JMP       POINT2         PLOT POINT
R.LINE   JMP       LINE1          DRAW LINE 
R.CHARS  JMP       #0049
R.BLOCK  JMP       BLOCK          BLOCK WRITE/ERASE 
R.INPX   JMP       INPX           READ DISPLAY X COORD
R.INPY   JMP       INPY           READ DISPLAY Y COORD
R.OUTX   JMP       #0055
R.OUTY   JMP       #0058
R.XMIT   JMP       XMIT           TRANSMIT DATA TO HLP
R.MODE   JMP       #005E
R.STEPX  JMP       STEPX          STEPS X AXIS COORD
R.STEPY  JMP       STEPY          STEPS Y AXIS COORD
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          SELECT SPECIAL FUNCTION 
R.CCR    JMP       #0073
R.EXTOUT  JMP    RESTORE
R.EXEC    JMP    EXEC 
R.GJOB    JMP    GJOB 
R.XJOB    JMP    PPROC
R.RETURN JMP       RESTORE        RESTORE, ENABLE, RETURN 
          JMP    RESTORE     EXPANSION
SERINP   JMP       SERCHN 
KBINP    JMP       KEYINP 
TPIN     JMP       TOUCHINP 
R.INIT   JMP       PSTART    PLATO INITIALIZE 
* 
* 
* 
*STRAP   DB        #E8            NO ECHO, 'FRYE/'PEDERSON
STRAP    DB        #22            #22 300 BAUD;#62 1200 BAUD
         DB        #38
* * * * * * *@* * * * * * 
*        SERIAL CHANNEL INTERRUPT PROCESSOR 
* 
SERCHN   EQU       $
         IN        COMSTAT        INPUT SERIAL CHAN. STATUS 
         RAL                        AND TEST, IS CHAN. READY
          JC     EXT.PR 
* 
         RAR                      TEST FOR
         RAR                        INTERRUPT PENDING 
          JNC    EXT.PR 
* 
         RAR
         RAR                      TEST FOR CHAR. RDY
         JNC       SERCHN1        NOT CHARACTER READY 
* 'CHARACTER 'READY 
         IN        COMDATA        INPUT SERIAL DATA 
         MOV       C,A
         LDA       MODE 
         ANI       #80
         MVI       A,#7F
         JNZ       SERCHN0
         ANA       C              ASCII, MASK FOR 7 BITS
         MOV       C,A
SERCHN0  EQU       $
         LXI       H,RXBUF        LOAD RECEIVE BUFFER ADDR. 
         MVI       A,#FF          LOAD MASK FOR INDEX 
         CMP       M              TEST FOR FULL STACK 
         JZ        R.RETURN       BUFFER FULL 
         INR       M              INCREMENT DIFFERENCE COUNT
         INX       H              STEP TO INPUT INDEX 
         ANA       M                MASK FOR LOWER SIX BITS.
         INR       M              INCREMENT INDEX.
         INX       H              STEP TO START 
         INX       H                OF STACK STORE AREA.
         MOV       E,A            ADD INDEX 
         MVI       D,00             TO START
         DAD       D                  OF STORE AREA.
         MOV       M,C            STORE SERIAL CHANNEL DATA.
          LDA    M.JOBS 
          INR    A
          STA    M.JOBS 
         JMP       R.RETURN 
* 
* 
SERCHN1  EQU       $
         RAL                      TEST FOR CHAR. REQ. 
         JNC       R.RETURN       NO CHARACTER REQ. 
* 'CHARACTER 'REQUEST 
         LXI       H,TXBUF        LOAD ADDR. OF XMIT BUFFER 
         XRA       A              TEST FOR EMPTY
         ORA       M                BUFFER. 
         JZ        SERCHN2        NO DATA 
         DCR       M              DECREMENT DIFF. COUNT 
         INX       H              STEP TO 
         INX       H                OUT INDEX 
         MVI       A,7            LOAD MASK FOR INDEX 
         ANA       M              MASK FOR INDEX BITS 
         INR       M              INCREMENT INDEX 
         INX       H              STEP TO STORE AREA. 
         MOV       E,A            ADD INDEX TO
         MVI       D,00              START OF 
         DAD       D                  STORE AREA. 
         MOV       A,M            LOAD DATA TO TRANSMIT 
         OUT       COMDATA        OUTPUT DATA 
SERCHN2  EQU       $
         LDA       SC.OC          TURN OFF CHAR.REQ.INT.
         OUT       COMSTAT
         JMP       R.RETURN       RETURN TO PROCESSING
* 
*        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
* 
PSTART   EQU       $
          MVI    A,#0F
          STA    PMC.FLG     SET PLATO MASTER CLEAR FLAG
          CALL   PLATO0      INITIALIZE PLATO 
          JMP    STRT.3 
* 
*        INITIALIZE TERMINAL ROUTINE
* 
ASTART   EQU       $
         LXI       H,G.BEGIN      HL _ BEGIN OF SCRATCH AREA
         LXI       D,G.END        DE _ END OF SCRATCH AREA
STRT.1   MVI       M,00           CLEAR SCRATCH AREA
         INX       H
         MOV       A,L
         CMP       E
         JC        STRT.1 
         MOV       A,H
         CMP       D
         JC        STRT.1 
         LXI       H,#180 
         SHLD      CLOCK
         CALL      ASCII          SET UP ASCII OPERATIONS 
         LHLD      STRAP          TEST BIT 1
         MOV       A,L
         ANI       01             ON/OVERSTRIKE 
         JNZ       STRT.2A        OFF/NORMAL
         MVI       L,07           SET OVERSTRIKE
         JMP       STRT.2B
STRT.2A  EQU       $
         MVI       L,03           SET NORMAL WRITE
* 
* 
STRT.2B  EQU       $
         CALL      R.MODE            VIA R.MODE 
         XRA       A
         STA       M.KSW
         LXI       H,#00          POSITION X
         CALL      R.OUTX         AND Y TO (0,511)
         CALL      LF.2           Y=PAGE TOP - HEIGHT 
* 
STRT.3    EQU    *
          LXI    H,0000 
          SHLD   M.EXTPA     ZERO OUT EXT PROCESSOR 
          LXI    H,0000 
          SHLD   EXT.OUT     SET UP OUTPUT AND IN ROUTINE 
          LXI    H,#D300
          SHLD   EXT.OUT+2
          LXI    H,#C900
          SHLD   EXT.OUT+4
          LXI    H,#EBDB
          SHLD   EXT.IN 
          MVI    A,#C9
          STA    EXT.IN+2 
         LDA       SC.OC          OUTPUT SERIAL CHANNEL 
         OUT       COMSTAT           CONTROL WORD 
          IN     COMCHAN*32+COMSTA
          XRA    A           TURN OFF PLATO CHAN. 
          OUT    COMCHAN*32+COMCON
          INR    A            AND TURN ON KEYBOARD,SER.CHAN.
          OUT    KEYCHAN*32+KYBDCON 
          OUT    EXTCH5*32+EXTCNTL
          EI                 ENABLE SYSTEM INTERRUPTS.
* 
IDLE     EQU       $
          CALL   EXEC 
          JMP    IDLE 
  
EXEC      EQU    *
         LDA       MODE 
         RLC
         JNC       IDLE0
         LDA       EREG 
         ANI       #04
         CNZ       TIMOUT 
IDLE0    EQU       $
         LXI       H,RXBUF        LOAD RECEIVE BUFF.  ADDR. 
         XRA       A              CLEAR A REGISTER. 
         ORA       M              INCLUSIVE OR A WITH DIFF. 
         JZ        IDLE2          NO DATA, CONTINUE 
          LDA    M.JOBS 
          DCR    A
          STA    M.JOBS 
         DCR       M              IS DATA, DEC. DIFF. COUNT 
         INX       H              UNLOAD DATA; STEP TO OUT. 
         INX       H
         MVI       A,#FF          MASK OUT INDEX W/ BUFFR.LN
         ANA       M
         INR       M              INCREMENT OUT INDEX.
         INX       H              BEGIN OF STORE FOR JOBSTK 
         MOV       E,A               PLUS OUTPUT INDEX
         MVI       D,00 
         DAD       D
         MOV       C,M            UNLOAD DATA INTO C
         LXI       H,KBDATA       CLEAR KB DATA FLAG
         MVI       M,00 
         LDA       MODE 
         ANI       #80
         JZ        IDLE1
         CALL      ERRCHK 
          JC     EXEC 
         MVI       A,#7F
         ANA       C
         MOV       C,A
         CALL      PPROC          PROCESS PLATO MODE DATA 
          JMP    EXEC 
IDLE1    EQU       $
         CALL      TESTMODE       PROCESS DATA
* 
IDLE2    EQU       $
         LDA       TXBUF
         ORA       A              TEST XMIT BUFFR. FOR DATA 
         JZ        IDLE3          NO DATA, CONTINUE 
         LXI       H,KBDATA       CLEAR KB DATA FLAG
         MVI       M,00 
         IN        COMSTAT        INPUT STATUS WORD 
         RAR
         RAR
         JNC       IDLE3          CHAR. REQ. LOW
         LDA       SC.OC          ENABLE CHAR REQ 
         INR       A
         OUT       COMSTAT
          JMP    EXEC 
* 
IDLE3    EQU       $
         LXI       H,RXBUF        LOAD RECEIVE BUFF.  ADDR. 
         XRA       A              CLEAR A REGISTER. 
         ORA       M              INCLUSIVE OR A WITH DIFF. 
          JNZ    EXEC 
         CALL      INDATA         CHECK KB/TP INPUT BUFFER
         MOV       E,L              BUFFER AND SAVE IN DE 
         MOV       D,H
         DAD       H              TEST FOR NO DATA FLAG 
         JC        IDLE14         NO DATA, CONTINUE 
         XCHG                     NONSHIFTED FOR P.XMIT 
         LDA       MODE 
         ANI       #80            IF PLATO OPERATION
         JZ        IDLE3.A        IDLE3.A, NOT PLATO OP.
         CALL      P.XMIT 
          RET 
IDLE3.A  EQU       $
         XCHG                     SHIFTED FOR ASCII TESTS 
         MVI       A,07 
         ANA       H              TEST FOR KEY BOARD DATA 
         JZ        IDLE4          KEYBOARD DATA 
         XRA       A
         STA       KBDATA         CLEAR KB DATA FLAG
         MVI       A,06           TEST FOR TOUCH PANEL DATA 
         ANA       H
         CPI       02 
         JZ        GIN.TP         GO HANDLE TOUCH PANEL DATA
         JMP       IDLE14         NOT KB DATA, NOT TP DATA
IDLE4    EQU       $
         LXI       H,KBDATA       SET KB DATA FLAG
         MVI       M,01 
         CALL      KBCON          CONVERT KB TO ASCII 
         ANA       A              CLEAR CARRY 
         RAL                      IF UPPER BIT SET,SPEC.CODE
         JNC       IDLE8          OTHERWISE,CONT. PROCESSING
*                                 BC HAS INDEX INTO SPTBL 
         MOV       C,A
         MOV       B,D
         LXI       H,SPTBL
         DAD       B
         MOV       E,M
         INX       H
         MOV       D,M
         XCHG 
         PCHL                     JUMP TO SPECIAL CODE
* 
IDLE8    EQU       $
         JZ        IDLE9
         LDA       G.TTYFLG       IF TELETYPE FLAG SET
         ORA       A                 CHECK FOR BIT 7 SET. 
         JZ        IDLE9
         MOV       A,C
         ANI       #40
         JZ        IDLE9
         MOV       A,C            PUT DATA IN A REG 
         ANI       #5F            TURN OFF BIT 6 OF 8 
         MOV       C,A
* 
IDLE9    EQU       $
         LDA       G.CTLFLG       TEST FOR CONTROL
         ORA       A                KEY AS PREVIOUS KEY 
         JZ        IDLE12         NO CONTROL KEY
         XRA       A               CLEAR CONTROL FLAG 
         STA       G.CTLFLG 
         MOV       A,C
         CPI       #31
         JZ        OFFLINE
         CPI       #30
         JZ        ONLINE 
         CPI       #3D             CHECK FOR EXCEPTIONS TO
         JZ        UNSCALE        CTL KEY SEQUENCES.
         CPI       #39
         JZ        SCALE
         CPI       #32
         JZ        CURSON 
         CPI       #33
         JNZ       IDLE10 
* 
CURSOFF  EQU       $
         LDA       ECURSOR
         MOV       B,A
         CALL      DISCURS
         STA       G.SUPCUR       SUPPRESS CURSOR 
          JMP    EXEC 
* 
CURSON   EQU       $
         XRA       A              DO NOT SUPPRESS CURSOR
         STA       G.SUPCUR 
          JMP    EXEC 
* 
OFFLINE  EQU       $
         LXI       H,LOC.RMT      SET  OFFLINE CONDITION
         MVI       M,1
          JMP    EXEC 
* 
ONLINE   EQU       $
         LXI       H,LOC.RMT      SELECT  ONLINE CONDITION
         MVI       M,00 
          JMP    EXEC 
* 
SCALE    EQU       $
         XRA       A              CTL 3D
         STA       SCALEFG           WILL SCALE TO 511 X 511
         LXI       H,#0070
         SHLD      BIAS           BIAS IS 112 
          JMP    EXEC 
* 
UNSCALE  EQU       $
         LXI       H,SCALEFG      CTL 39
         MVI       M,01              ACCEPTS COORDS. AS IS
         LXI       H,0000 
         SHLD      BIAS            BIAS IS 0
          JMP    EXEC 
* 
IDLE10   EQU       $
         MVI       A,#20          TEST FOR SHIFTED
         ANA       C                KEY INPUT.
         JNZ       IDLE11         NOT SHIFTED 
         MVI       A,#10          ELSE TOGGLE 
         XRA       C                BIT FOUR OF 
         MOV       C,A                  KEY INPUT.
* 
IDLE11   EQU       $
         MVI       A,#1F          LOAD MASK AND 
         ANA       C                MASK CONTROL CODE 
         MOV       C,A
         XRA       A              CLEAR CONTROL FLAG
         STA       G.CTLFLG 
* 
IDLE12   EQU       $
         LDA       MODE 
         CPI       #08            TEST FOR GIN MODE 
          JNZ    IDLE12.A 
          CALL   GIN.A       GIN MODE, GIN.A
          JMP    IDLE14      SKIP TO IDLE14 
IDLE12.A  EQU    $
         LDA       LOC.RMT        LOAD LOCAL/REMOTE FLAG
         ORA       A
         CZ        XMIT.1         STORE DATA FOR TRANSMIT 
* 
         LDA       BYPASS         LOAD AND TEST FOR BYPASS
         ORA       A
         JZ        IDLE13         BYPASS NOT ON 
         MOV       A,C            PUT DATA IN C REG.
         CPI       #20            IF DATA IS CTL CODE,
         JNC       IDLE14         KEY NOT CTL CODE
* 
IDLE13   EQU       $
         LHLD      STRAP          TEST FOR ECHO OPTION
         MOV       A,L
         ANI       #80
         JNZ       IDLE14         NO ECHO 
         CALL      TESTMODE       PROCESS ASCII OP. DATA
* 
IDLE14   EQU       $
         LXI       H,KBDATA       CLEAR KB DATA FLAG
         MVI       M,00 
         LDA       MODE           IF ALPHA, BLINK CURSOR
         CPI       #08
         JZ        IDLE15 
         CPI       #03
          RNZ 
IDLE15   EQU       $
         LHLD      CLOCK          TEST BLINK COUNT
         DCX       H
         SHLD      CLOCK
         MOV       A,L
         ORA       H
          JNZ    EXEC 
         LXI       H,#180 
         SHLD      CLOCK
         LDA       WEFLAG         CHECK FOR W/E CURSOR
         ORA       A
         JZ        BLINK
         MVI       B,04 
         CALL      DISCURS        ERASE CURSOR
         XRA       A              CLEAR W/E FLAG_WRITE
         STA       WEFLAG 
          RET 
  
GJOB      EQU    *
          MVI    C,0
          LDA    EREG 
          ANI    #04
          CNZ    TIMOUT 
          LXI    H,RXBUF
          XRA    A
          ORA    M
          RZ                 RETURN IF NO JOBS RECEIVED 
          LDA    M.JOBS 
          DCR    A
          STA    M.JOBS 
          DCR    M
          INX    H
          INX    H
          MVI    A,#FF
          ANA    M
          INR    M
          INX    H
          MOV    E,A
          MVI    D,00 
          DAD    D
          MOV    C,M
          LXI    H,KBDATA 
          MVI    M,0
          CALL   ERRCHK 
          RC                 RETURN IF ERROR
          MVI    A,#7F
          ANA    C
          MOV    C,A
          RET 
  
* 
BLINK    EQU       $
         MVI       B,6
         CALL      DISCURS        WRITE CURSOR
         MVI       A,1            SET W/E FLAG_WRITE
         STA       WEFLAG 
          JMP    EXEC 
* 
ERRCHK   EQU       $
         MVI       A,#06
         CMP       C
         JNZ       E001           NOT ACK JUMP
         LDA       EREG 
         ORI       #80
         STA       EREG 
         STC
         RET
E001     LDA       EREG 
         RAR
         JNC       E100           NOT STATE 0 JUMP
         MOV       A,C
         ORA       A
         JPO       E006           P ERROR JUMP
         LDA       EREG 
         RAL
         JNC       E006 
E002     EQU       $
         MOV       A,C
         ANI       #7F
         SUI       #20
         JM        E003 
         STA       MREG 
         STA       NREG 
         MVI       A,#02
         STA       EREG 
E003     LDA       EREG 
         ANI       #0F
         STA       EREG 
         STC
         RET
E006     LDA       EREG 
         ANI       #0F
         STA       EREG 
         RET
E100     EQU       *
         RAR
         JNC       E200           NOT STATE 1 JUMP
         MOV       A,C
         ORA       A
         JPE       E104           NOT P ERROR JUMP
         XRA       A
         ORI       #04
         STA       EREG 
E101     MVI       C,#95          NAK 
E102     CALL      XMIT.1 
         JC        E102 
         LDA       MREG 
         ADI       #20
         MOV       C,A
E103     CALL      XMIT.1 
         JC        E103 
         XRA       A
         STA       CLK.1
         STA       CLK.2
         STC
         RET
E104     LDA       EREG 
         ANI       #80
         JZ        E105           NO ACK FLAG JUMP
         MOV       A,C
         ORA       A
         RAL
         RRC
         SUI       #20
         STA       NREG 
         JMP       E003 
E105     LDA       MREG 
         MOV       B,A
         LDA       NREG 
         CMP       B
         JNZ       E107           N^=M JUMP 
         INR       A
         MVI       B,#60
         CMP       B
         JNZ       E106 
         XRA       A
E106     STA       NREG 
         STA       MREG 
         LDA       EREG 
         ANI       #BF
         STA       EREG 
         JMP       E109 
E107     INR       A
         MVI       C,#60
         CMP       C
         JNZ       E108 
         XRA       A
E108     STA       NREG 
         LDA       EREG 
         ORI       #40
         STA       EREG 
E109     LDA       E.CNTR 
         DCR       A
         JZ        E110 
         STA       E.CNTR 
         LDA       EREG 
         RLC
         RLC
         RET
E110     MOV       B,C
         MVI       A,#14
         STA       E.CNTR 
         MVI       C,#06          ACK 
E111     CALL      XMIT.1 
         JC        E111 
         LDA       MREG 
         ADI       #20
         MOV       C,A
E113     CALL      XMIT.1 
         JC        E113 
         MOV       C,B
         LDA       EREG 
         RLC
         RLC
         RET
E200     MOV       A,C
         ORA       A
         JPO       E202 
         LDA       EREG 
         RLC
         JC        E002 
E201     STC
         RET
E202     LDA       EREG 
         ANI       #0F
         JMP       E201 
* 
P.XMIT   EQU       $
         MOV       E,L            SAVE DATA BITS IN E 
         MOV       D,H            SAVE NON-SHIFTED H IN D 
         DAD       H              FOR TEST OF DATA TYPE 
         MVI       A,#07
         ANA       H
         JNZ       PX007          NOT KBDATA JP PX007 
         CALL      KBCON
         MVI       A,#17
         CMP       C
         JNZ       PX002
         MVI       A,#01
         STA       SH.SUP 
PX001    CALL      XMIT.1 
         JC        PX001
         RET
PX002    LDA       SH.SUP 
         ORA       A
         JNZ       PX004          SH.SUP SET JUMP 
PX003    CALL      XMIT.1 
         JC        PX003
         RET
PX004    MVI       A,#11
         CMP       C
         JNZ       PX005
         XRA       A
         STA       SH.SUP 
         CALL      ASCII
         RET
PX005    XRA       A
         STA       SH.SUP 
PX006    CALL      XMIT.1 
         JC        PX006
         RET
PX007    EQU       $
         PUSH      D
         MVI       C,#1B
PX008    CALL      XMIT.1 
         JC        PX008
         POP       D
         MVI       A,#3F
         ANA       E
         ADI       #40
         MOV       C,A
         PUSH      D
PX010    EQU       $
         CALL      XMIT.1 
         JC        PX010
         POP       D
         MVI       A,#C0
         ANA       E
         RLC
         RLC
         MOV       E,A
         MVI       A,#03
         ANA       D
         RLC
         RLC
         ORA       E
         ADI       #40
         MOV       C,A
PX012    CALL      XMIT.1 
         JC        PX012
         RET
TIMOUT   EQU       *
         LDA       CLK.1
         ADI       #01
         STA       CLK.1
         RNC
         LDA       CLK.2
         INR       A
         STA       CLK.2
         SUI       #20
         RNZ
         XRA       A
         STA       CLK.1
         STA       CLK.2
         MVI       C,#95
TO01     CALL      XMIT.1 
         JC        TO01 
         LDA       MREG 
         ADI       #20
         MOV       C,A
TO03     CALL      XMIT.1 
         JC        TO03 
         RET
* 
* TRANSMIT BUFFER STORE 
XMIT     EQU       $
          CALL   P.XMIT 
          RET 
* 
XMIT.1   EQU       $
         LXI       H,TXBUF        TEST FOR
         MVI       A,07              FULL BUFFER. 
         CMP       M
         JC        XMIT.3         FULL, ENABLE CREQ 
         INR       M              BUFFER NOT FULL,INCR. DIFF
         INX       H              STEP TO INPUT INDEX 
         ANA       M              PICK UP   INPUT INDEX.
         INR       M
         INX       H              STEP TO STORE AREA. 
         INX       H
         MOV       E,A            ADD INPUT INDEX.
         MVI       D,00 
         DAD       D
         LDA       MODE 
         ANI       #80
         MOV       A,C
*         JZ        XMIT.2         IF ASCII OP. SKIP PARITY 
         ORA       A
         JPE       XMIT.2         PLATO SO EVEN PARITY CHK. 
         XRI       #80
XMIT.2   EQU       $
         MOV       M,A            STORE DATA IN TXBUF 
XMIT.3   EQU       $
         LDA       SC.OC          SET CREQ ENABE
         INR       A
         OUT       COMSTAT
         RET
TESTMODE EQU       $
         LDA       MODE           LOAD MODE.
         ANI       #0F            MASK OFF MODE BITS
         RLC
         MOV       E,A
         MVI       D,0
         LHLD      SELECT.M       LOAD BASE ADDR. JUMP TABLE
         DAD       D
         MOV       E,M
         INX       H
         MOV       D,M
         XCHG 
* 
JMPHL    EQU       $
         PCHL 
* 
SELECT.P EQU       $
         DW        POINT
         DW        GRAPH
         DW        MEMORY         MODE 2
         DW        CHARACT
         DW        ABLOCK 
          DW     MODE5
          DW     MODE6
          DW     MODE7
         DW        TEMP 
* 
SELECT.A EQU       $
         DW        POINT
         DW        GRAPH
         DW        TEMP 
         DW        ALPHMODE 
         DW        ABLOCK 
         DW        TEMP 
         DW        TEMP 
         DW        TEMP 
         DW        GIN
* 
COMMODE  EQU       $
         LDA       CMODE          LOAD COMMAND MODE 
         ANI       #07            MASK OFF UNWANTED BITS
         RLC
         MOV       E,A
         MVI       D,00 
         LXI       H,SELECT.C     LOAD BASE ADDR. JUMP TABLE
         DAD       D
         MOV       E,M
         INX       H
         MOV       D,M
         XCHG 
         PCHL 
* 
SELECT.C EQU       $
         DW        LDC
         DW        SSF
         DW        ECHO 
         DW        LDA
         DW        EXT
          DW     COLOR
* 
SPTBL    EQU       $
         DW        G.CTL          CONTROL 
         DW        G.RESET        RESET 
         DW        G.TTY
          DW     G.BREAK
         DW        G.PAGE         PAGE
         DW        G.ERASE        'B'S WITH ERASE ALWAYS
          DW     G.RUBOUT 
* 
* 
* FOLLOWING ARE EXCEPTIONS TO NORMAL ASCII CHAR. SET
* 
* 
G.CTL    EQU       $
         MVI       A,01           SET CONTROL FLAG
         STA       G.CTLFLG 
          JMP    EXEC 
* 
* 
G.RESET  EQU       $
         LDA       MODE           IF IN ALPHA, ERASE CURSOR 
         CPI       03 
         JNZ       G.RES.1
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
G.RES.1  EQU       $
         CALL      SIZE1
         CALL      AFF.1
          JMP    EXEC 
* 
G.PAGE   EQU       $
         CALL      AFF            SAME AS ESC FF SEQ. 
          JMP    EXEC 
* 
G.TTY    EQU       $
          LDA    G.TTYFLG 
          XRI    01          CHANGE 'C'A'P'S
         STA       G.TTYFLG 
          JMP    EXEC 
* 
G.ERASE  EQU       $
         CALL      BS 
         LDA       D.CNTL2
         STA       D.CNTL2P 
         LDA       M.MODE 
         STA       M.MODEP
         MVI       L,02 
         CALL      R.MODE 
         MVI       C,#00
         CALL      CHARGEN
         LDA       D.CNTL2P 
         STA       D.CNTL2
         LDA       M.MODEP
         STA       M.MODE 
         MVI       C,#08
         JMP       IDLE12 
* 
G.BREAK   EQU    *
  
G.RUBOUT  EQU    *
          JMP    EXEC 
* 
KBCON    EQU       $
         MVI       D,00           DE-KEYBOARD DATA
         LHLD      KBAADR         HL-KB CONVERSION TABLE
         DAD       D                 BASE ADDR. + KEY CODE
         MOV       A,M
         MOV       C,A            IF VALID, RETURN IN C 
         CPI       #FF
         RNZ
         POP       H              OTHERWISE, POP STACK
          JMP    EXEC 
* 
ISTASC   EQU       $
         DB        #30,#31,#32,#33
         DB        #34,#35,#36,#37
         DB        #38,#39,#26,#60
         DB        #0A,#5E,#2B,#2D
         DB        #13,#04,#07,#08
         DB        #7B,#0B,#0D,#1A
         DB        #02,#12,#01,#03
         DB        #7D,#0C,#FF,#FF
         DB        #3C,#3E,#5B,#5D
         DB        #24,#25,#5F,#7C
         DB        #2A,#28,#40,#27
         DB        #1C,#5C,#23,#7E
         DB        #17,#05,#14,#19
         DB        #7F,#09,#1E,#18
         DB        #0E,#1D,#11,#16
         DB        #00,#0F,#FF,#FF
         DB        #20,#61,#62,#63
         DB        #64,#65,#66,#67
         DB        #68,#69,#6A,#6B
         DB        #6C,#6D,#6E,#6F
         DB        #70,#71,#72,#73
         DB        #74,#75,#76,#77
         DB        #78,#79,#7A,#3D
         DB        #3B,#2F,#2E,#2C
         DB        #1F,#41,#42,#43
         DB        #44,#45,#46,#47
         DB        #48,#49,#4A,#4B
         DB        #4C,#4D,#4E,#4F
         DB        #50,#51,#52,#53
         DB        #54,#55,#56,#57
         DB        #58,#59,#5A,#29
         DB        #3A,#3F,#21,#22
**********
* KEYBOARD TO ASCII CONVERSION TABLE
**********
IGTASC   EQU       $
         DB        #30,#31,#32,#33
         DB        #34,#35,#36,#37
          DB     #38,#39,#40,#5C
         DB        #09,#5E,#2B,#2D
          DB     #7D,#1B,#FF,#85       1X 
          DB     #82,#FF,#0D,#0A
          DB     #08,#86,#83,#80
         DB        #84,#FF,#FF,#FF
          DB     #3C,#3E,#5B,#5D       2X 
          DB     #24,#25,#5F,#27
          DB     #2A,#28,#60,#7C
          DB     #09,#7E,#23,#26
          DB     #7B,#1B,#FF,#85      3X
         DB        #82,#FF,#0D,#0A
          DB     #08,#86,#83,#80
         DB        #81,#FF,#FF,#FF
         DB        #20,#61,#62,#63
         DB        #64,#65,#66,#67
         DB        #68,#69,#6A,#6B
         DB        #6C,#6D,#6E,#6F
         DB        #70,#71,#72,#73
         DB        #74,#75,#76,#77
         DB        #78,#79,#7A,#3D
         DB        #3B,#2F,#2E,#2C
         DB        #20,#41,#42,#43
         DB        #44,#45,#46,#47
         DB        #48,#49,#4A,#4B
         DB        #4C,#4D,#4E,#4F
         DB        #50,#51,#52,#53
         DB        #54,#55,#56,#57
         DB        #58,#59,#5A,#29
         DB        #3A,#3F,#21,#22
* 
PPROC    EQU       $
          MOV    A,C
          ANA    A
          RZ
         LDA       CMODE          TEST FOR COMMAND MODES
         ANI       #80
         JZ        PPROC.1
         CALL      COMMODE        COMMAND MODE PROCESSOR
         RET
PPROC.1  EQU       $
         LDA       MODE 
         ANI       #40            IF THIS BIT SET,
         JZ        PPROC.2        NOT COMMAND OR DATA MODES 
         CALL      TESTMODE 
         RET
PPROC.2  EQU       $
         CALL      ESCCTL 
         RET
* 
ESCADR.P EQU       $
         DB        #03
         DW        ASCII
         DB        #11
         DW        DC1
         DB        #12
         DW        DC2
         DB        #13
         DW        DC3
         DB        #14
         DW        DC4
          DB     #1B
          DW     ESC
         DB        #0C
         DW        BULKER 
         DB        #40
         DW        SUPER
         DB        #41
         DW        SUB
         DB        #42
         DW        SELECTM0 
         DB        #43
         DW        SELECTM1 
         DB        #44
         DW        SELECTMM 
         DB        #45
         DW        SELECTMM 
         DB        #46
         DW        SELECTMM 
         DB        #47
         DW        SELECTMM 
         DB        #48
         DW        SELECTMM 
         DB        #49
         DW        SELECTMM 
         DB        #4A
         DW        HORZ 
         DB        #4B
         DW        VERTICAL 
         DB        #4C
         DW        FORWARD
         DB        #4D
         DW        REVERSE
         DB        #4E
         DW        SIZE.1 
         DB        #4F
         DW        SIZE.2 
         DB        #32
         DW        LCOORD 
         DB        #51
         DW        SSPECF 
         DB        #52
          DW     LEXT 
         DB        #53
         DW        LDM2 
         DB        #54
          DW     MODE567
         DB        #55
          DW     MODE567
         DB        #56
          DW     MODE567
         DB        #57
         DW        LADDR
         DB        #59
         DW        LECHO
         DB        #5A
         DW        LMARG
          DB     #3D
          DW     STCOL
         DB        #FF
* 
CTLADR.P EQU       $
         DB        #08
         DW        BKSPACE
         DB        #0D
         DW        RETURN 
         DB        #09
         DW        TAB
         DB        #0A
         DW        LINEFEED 
         DB        #0B
         DW        VERTAB 
         DB        #0C
         DW        FORMFEED 
         DB        #19
         DW        EM.1 
         DB        #1B
         DW        ESC
         DB        #1C
         DW        FS.1 
         DB        #1D
         DW        GS.1 
         DB        #1F
         DW        US 
         DB        #FF
* 
TEMP     EQU       $
         RET
* 
ASCII    EQU       $
         MVI       A,#B5          SET INITIAL TERMINAL STAT.
         STA       TSTAT
         MVI       A,#03          SELECT ASCII MODE 3 
         STA       MODE 
         STA       WEFLAG         SET W/E FLAG
         LXI       H,IGTASC       SELECT IGT ASCII KEYBOARD 
         SHLD      KBAADR 
         LXI       H,SELECT.A     SELECT ASCII MODE TABLE 
         SHLD      SELECT.M 
         LXI       H,CTLADR.A     SELECT ASCII CTL CODE TBL 
         SHLD      CTLADR 
         LXI       H,ESCADR.A     SELECT ASCII ESC SEQ TBL
         SHLD      ESCADR 
         CALL      SIZE1
         LXI       H,#0070
         SHLD      BIAS 
         MVI       A,4
         STA       ECURSOR
         MVI       A,6
         STA       WCURSOR
         XRA       A
         STA       SCALEFG
         CALL      BULKER         ERASE SCREEN
         LXI       H,#00          POSITION X TO 00
         CALL      R.OUTX 
         CALL      LF.2           POSITION Y TO 512 - HEIGHT
         RET
* 
BULKER   EQU       $
         LDA       M.MODE 
         RLC
         ORI       01 
         MOV       L,A
         CALL      R.MODE 
         RET
LDM2     EQU       $
         MVI       A,#C2          SELECT LOAD MEMORY
         STA       MODE              MODE 2,PLATO OP. 
         XRA       A              CLEAR NUMBER OF INPUTS
         STA       NINPUT            TO GETXY ROUTINE 
         RET
* 
LCOORD   EQU       $
         MVI       A,#80          SELECT COMMAND LOAD 
         STA       CMODE             COORDINATE 
         XRA       A
         STA       NINPUT 
         RET
* 
LMARG    EQU       $
         CALL      R.INPX 
         LDA       M.CCR
         ANI       01 
         JZ        LMARG.1        HORIZONTAL, HL HAS X
         CALL      R.INPY 
LMARG.1  EQU       $
         SHLD      M.MARGIN       SET MARGIN
         RET
* 
SSPECF   EQU       $
         MVI       A,#81
         STA       CMODE             SPECIAL FUNCTION 
         XRA       A
         STA       NBYTES 
         RET
* 
LECHO   EQU       $ 
         MVI       A,#82
         STA       CMODE             ECHO 
         XRA       A
         STA       NBYTES 
         RET
* 
LADDR    EQU       $
         MVI       A,#83
         STA       CMODE             ADDRESS
         XRA       A
         STA       NBYTES 
         RET
* 
LEXT     EQU       $
         MVI       A,#84
         STA       CMODE             EXTERNAL DEVICE
         XRA       A
         STA       NBYTES 
         RET
* 
STCOL     EQU    *
          MVI    A,#85
          STA    CMODE       COLOR
          XRA    A
          STA    NBYTES 
          RET 
  
COLOR     EQU    *
          LXI    H,NBYTES 
          INR    M
          MVI    A,02 
          CMP    M
          RNZ 
          XRA    A
          STA    CMODE
          RET 
* 
LDC      EQU       $              LOAD COORDINATE PROCESSOR 
         CALL      ESCCTL         CHECK FOR COMMAND CHANGE
         CALL      GETXY          GET COORDINATES 
         CALL      OUTCOORD 
         RET
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
* ECHO COMMAND
*        70H-TESTS MEMORY CONFIGURATION OF TERMINAL 
*            RESPONDS WITH';       72H- 4K
*                                 73H- 20K
*                                 76H- 8K 
*                                 77H- 24K
*         71H-SUBTYPE  (3)
*         72H-LOADFILE (SWITCH - USUALLY 3) 
*         73H-CONFIG   (0)
*        7BH-SOUND AUDIBLE AUDIBLE ALERT
*        7CH-ID SERIAL NUMBER 
*        7DH-SEND USER FLAG 
*        OTHERS LOOP BACK 
* 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
ECHO     EQU       $
         CALL      ESCCTL         CHECK FOR COMMAND CHANGE
         CALL      GET3           GET NEXT 3 BYTES
         MOV       A,E
         ANI       #7F
         CPI       #7C            TEST FOR ID CODE RESPONSE 
         JNZ       LDE1              NOT ID REQUEST 
          MVI    A,#20       ALWAYS HAVE EXT
         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    LDE1.B 
         LDA       M.TYPE         LOAD TERMINAL TYPE
         JMP       ECHO.ST
  
LDE1.B    EQU    *
          CPI    #71         TEST FOR SUB TYPE
          JNZ    LDE1.C 
          MVI    A,3
          JMP    ECHO.ST
  
LDE1.C    EQU    *
          CPI    #72         TEST FOR LOADFILE
          JNZ    LDE1.D 
          IN     RSF.PANL*32+PANLSWCH 
          ANI    #0E0 
          RLC 
          RLC 
          RLC 
          JMP    ECHO.ST
  
LDE1.D    EQU    *
          CPI    #73         TEST FOR CONFIG
          JNZ    LDE2 
          MVI    A,0
          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      P.XMIT 
         RET
************************************************************************
* 
*        LOAD MEMORY ADDRESS     THIS INSTRUCTION LOADS THE MEMORY
*        ADDRESS REGISTER WITH BITS 01-15.  THIS INSTRUCTION
*        SPECIFIES THE FIRST STORAGE ADDRESS TO BE USED UPON ENTRY
*        INTO A MODE 2 OPERATION. 
* 
************************************************************************
LDA      EQU       $
         CALL      ESCCTL         CHECK FOR COMMAND CHANGE
         CALL      GET3           GET NEXT 3 BYTES
         XRA       A              CLEAR THE 
         STA       BC.REG           BLOCK CHECK REGISTER. 
         MVI       A,#82
         STA       MODE           SELECT LOAD MEM. DATA MODE
         MOV       A,L
         ANI       #3F
         RLC
         ADD       D
         MOV       H,A
         MOV       L,E
         CALL      CHKRG          CHECK ADDRESS RANGE 
         SHLD      MEMREG              STORE ADDRESS INTO MEMORY REGISTE
         RET
* 
CHKRG    EQU       $              MEMREG RANGE CHK
         MOV       A,H
         CPI       #22
         JC        POPRET 
         JNZ       CHKRG.1
         MOV       A,L
         CPI       #EA
         JC        POPRET 
CHKRG.1  EQU       $
         MOV       A,H
          CPI    #7F
         JZ        CHKRG.2
         JNC       POPRET 
         RET
CHKRG.2  EQU       *
         MOV       A,L
         CPI       #FF
         JZ        POPRET 
         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 
*                  04-1F          PARALLEL CHANNEL DATA/CONTROL 
* 
*        FUNCTION OPERATIONS      (BITS 01 THRU 10) 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
* 
*        TEST FOR EXISTENCE OF EXTERNAL INTERFACE.
* 
SSF      EQU       $
         CALL      ESCCTL         CHECK FOR COMMAND CHANGE
         CALL      GET3           GET NEXT 3 BYTES
         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       $
         MOV       A,H            LOAD UPPER BITS 
         RRC
         RRC
         ANI       #1F
* 
*        TEST FUNCTION TYPE 
* 
* 
         CPI       02             TEST FOR INTERRUPT MASK 
         RZ                       RETURN IF TRY FOR SERIAL
         CPI       01 
         JZ        SSF.3          SET INTERRUPT MASK
* 
         MOV       E,A            SAVE ADDRESS BITS 
         XRA       A              TEST FOR SLIDE PROJECTOR
         ORA       E                 ADDRESS
         JZ        SSF.1
         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
         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      P.XMIT         HL - TRANSMIT FOR P.XMIT
         RET
* 
SSF.3    EQU       $
         MOV       A,L
         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       $
         MOV       A,L
         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       $
* 
          CALL   ESCCTL 
          CALL   GET3 
         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
************************************************************************
* 
*        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
* 
************************************************************************
         STA       COMMAND+1
         MVI       A,#30
         STA       COMMAND+2
         LXI       H,COMMAND
* 
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 
         XRA       A
         OUT       DISCHAN*32+DISDATA 
         MVI       A,#F8
         OUT       DISCHAN*32+DISCON1       VECTOR/INHIBIT/Y SHORT/ X NE
         XRA       A
         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      ESCCTL         CHECK FOR COMMAND CHANGE
         CALL      GET3           GET NEXT 3 BYTES
         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
         CALL      CHKRG
* 
* 
         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 
         RET
* 
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. 
         ORA       M              TEST BLOCK CHECK RESULT 
         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.
         RZ                       BLOCK CHECK CORRECT.
         MOV       M,00 
         LXI       H,#0385        LOAD UNSOLICITED STATUS 
         CALL      P.XMIT 
         RET
************************************************************************
* 
*        MODE 3 - CHARACTER MODE ONLINE ENTRY 
*                  IF NOT ESC OR CTL CODE BUILD 
*                  COMMAND - CODE/ESC/#30 
* 
CHARACT  EQU       $
         CALL      ESCCTL 
         MOV       A,C
         STA       COMMAND
         MVI       A,#1B
         STA       COMMAND+1
         MVI       A,#30
         STA       COMMAND+2
         LXI       H,COMMAND
         CALL      R.CHARS
         RET
************************************************************************
* 
*        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. 
************************************************************************
* 
*        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,#FFF8           AND LOAD -8
* 
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 
         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     EQU    *
          CALL   ESCCTL 
          LHLD   MODE5A 
         JMP       MODESEL        SELECT MODE WITH HL JUMP. 
* 
MODE6     EQU    *
          CALL   ESCCTL 
          LHLD   MODE6A 
         JMP       MODESEL        SELECT MODE WITH HL JUMP. 
* 
MODE7     EQU    *
          CALL   ESCCTL 
          LHLD   MODE7A 
* 
MODESEL  EQU       $
          SHLD   MODEADR     SAVE ABSOLUTE MODE ADDRESS 
          CALL   GET3        GET NEXT 3 BYTES 
         DAD       H              AND SHOFT 
         MOV       C,H              IT INTO 
         MOV       A,L                REGISTERS 
         ORA       D                   C, D, AND E. 
         MOV       D,A
          LHLD   MODEADR     RETURN ABSOLUTE MODE ADDRESS 
         PCHL 
MODE567   EQU    *
          MOV    A,C
          SBI    #4F
          MOV    C,A
          LDA    MODE        UPDATE MODE
          ANI    #C0
          ORA    C
          STA    MODE 
          MOV    A,C
          ADD    A
          ADD    A
          MOV    C,A
          LDA    M.MODE      UPDATE M.MODE
          ANI    #E3
          ORA    C
          STA    M.MODE 
          XRA    A
          STA    NBYTES 
          RET 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*        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. 
INDATA   EQU       $
         LXI       H,IN.BUF       LOAD KB/TP INPUT BUFFER 
         JMP       FIFO.RD
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
ENAB     EQU       $
         STA       M.ENAB         STORE INTERRUPT MASK
         RLC
         RLC
         RLC                            TO OUTPUT 
         OUT       TPCHAN*32+TPCONT         TOUCH PANEL.
* 
         RLC                        AND ROTATE TO 
         RLC                          EXTERNAL BIT. 
         ANI       01 
          ORI    01          ALWAYS ENABLE EXT CHANNEL
         OUT       EXTCH5*32+EXTCNTL  ABLE EXTERNAL DEVICE. 
         RET
* 
GET3     EQU       $
         MVI       A,#3F
         ANA       C
         MOV       C,A
         LDA       NBYTES 
         CPI       #02
         JNZ       GET3.1 
         MOV       A,C
         STA       COMMAND        STORE HIGH 6 BITS 
         XRA       A
         STA       NBYTES 
         STA       CMODE
         CALL      ASSEMBLE 
         RET
GET3.1   EQU       $
         CPI       #01
         JNZ       GET3.2 
         MOV       A,C
         STA       COMMAND+1      STORE MIDDLE 6 BITS 
         JMP       GET3.R 
GET3.2   EQU       $
         MOV       A,C
         STA       COMMAND+2      STORE LOWER 6 BITS
GET3.R   EQU       $
         LXI       H,NBYTES 
         INR       M
         POP       H
         RET
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
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
* 
*        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,IN.BUF       LOAD ADDRESS OF KB/TP INB 
         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. 
         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
* 
SAVESTUF EQU       $
         CALL      R.INPX         SAVE SCREEN POSITIONING 
         SHLD      G.XPOS 
         CALL      R.INPY 
         SHLD      G.YPOS 
         RET
* 
RESTORES EQU       $
         LHLD      G.XPOS         RESTORE SCREEN POSITIONING
         CALL      R.OUTX 
         LHLD      G.YPOS 
         CALL      R.OUTY 
         RET
* 
XHAIR    EQU       $
         CALL      SAVESTUF 
         LDA       WIDTH
         RRC
         MOV       L,A
         MVI       H,00 
         CALL      COMPHL 
         XCHG 
         CALL      R.INPX 
         DAD       D
         CALL      R.OUTX 
         LDA       HEIGHT 
         RRC
         MOV       L,A
         MVI       H,00 
         CALL      COMPHL 
         XCHG 
         CALL      R.INPY 
         DAD       D
         CALL      R.OUTY 
         MVI       C,#61
         CALL      DISCURSX 
         CALL      RESTORES 
         RET
* 
GIN       EQU    $           COMM LINE ENTRY TO GIN MODE
          CALL   ESCCTL 
          RET 
* 
GIN.A     EQU    $           KEYBOARD ENTRY TO GIN MODE 
         CALL      ESCCTL         IS ESC SEQ. OR CTL CODE 
         MOV       A,C
         STA       GIN.KEY        SAVE GIN CHAR. KEY
         ANI       #20            2 TO THE FIFTH SET'/
         JNZ       GIN.1
         MVI       B,4            COURSE GRID 
         JMP       GIN.2
GIN.1    EQU       $
         MVI       B,1            FINE GRID 
GIN.2    EQU       $
         MOV       A,B
         STA       DOTS           STORE GRID MOVEMENT VALUE 
         MOV       A,C            CHARACTER CODE IN C 
         ANI       #DF            CODE MASKED OUT 2 TO 5TH
         MOV       B,A               IN REGISTER B. 
         LXI       H,MOVTAB       BASE OF CURSOR MOVE TABLE 
GIN.3    EQU       $
         MOV       A,M
         CPI       #FF
         JZ        GIN.XMT        NOT A CURSOR MOVE KEY 
         CMP       B              CHECK FOR CURSOR MOVE KEY 
         JZ        MOVCURS
         INX       H
         INX       H
         INX       H
         JMP       GIN.3
MOVCURS  EQU       $
         INX       H              MATCH FOUND SO JUMP TO
         MOV       E,M               CURSOR MOVE ROUTINE. 
         INX       H
         MOV       D,M
         PUSH      D              SAVE DE ON STACK
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
         POP       H
         CALL      JMPHL
         RET
* 
GIN.XMT  EQU       $
         LDA       LOC.RMT        TEST FOR ONLINE 
         ORA       A
         RNZ                      RETURN, NOT ONLINE
         LDA       GIN.KEY        SEND LAST KEY STORED
         MOV       C,A
         CALL      XMIT.1 
         CALL      ENQ.1          TRANSMIT CURSOR POSITION
         RET
* 
* 
MOVTAB   EQU       $
         DB        #41
         DW        WEST 
         DB        #43
         DW        SEAST
         DB        #44
         DW        EAST 
         DB        #45
         DW        NEAST
         DB        #51
         DW        NWEST
         DB        #57
         DW        NORTH
         DB        #58
         DW        SOUTH
         DB        #5A
         DW        SWEST
         DB        #FF
* 
WEST     EQU       $
         CALL      MINUSX 
         RET
* 
SEAST    EQU       $
         CALL      PLUSX
         CALL      MINUSY 
         RET
* 
EAST     EQU       $
         CALL      PLUSX
         RET
* 
NEAST    EQU       $
         CALL      PLUSX
         CALL      PLUSY
         RET
* 
NWEST    EQU       $
         CALL      MINUSX 
         CALL      PLUSY
         RET
* 
NORTH    EQU       $
         CALL      PLUSY
         RET
* 
SOUTH    EQU       $
         CALL      MINUSY 
         RET
* 
SWEST    EQU       $
         CALL      MINUSX 
         CALL      MINUSY 
         RET
* 
MINUSX   EQU       $
         LDA       DOTS 
         MOV       L,A
         MVI       H,00 
         CALL      COMPHL 
         PUSH      H
         CALL      R.INPX 
         POP       D
         DAD       D
         CALL      R.OUTX 
         RET
* 
MINUSY   EQU       $
         LDA       DOTS 
         MOV       L,A
         MVI       H,00 
         CALL      COMPHL 
         PUSH      H
         CALL      R.INPY 
         POP       D
         DAD       D
         CALL      R.OUTY 
         RET
* 
PLUSX    EQU       $
         LDA       DOTS 
         MOV       L,A
         MVI       H,00 
         PUSH      H
         CALL      R.INPX 
         POP       D
         DAD       D
         CALL      R.OUTX 
         RET
* 
PLUSY    EQU       $
         LDA       DOTS 
         MOV       L,A
         MVI       H,00 
         PUSH      H
         CALL      R.INPY 
         POP       D
         DAD       D
         CALL      R.OUTY 
         RET
* 
* 
GIN.TP   EQU       $
         PUSH      D              SAVE DATA ON STACK
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
         POP       D              RESTORE DATA
         PUSH      D              SAVE DATA AGAIN 
         CALL      GIN.TP1           GET Y COORD. 
         CALL      R.OUTY 
         POP       D              DE _ DATA 
         MOV       A,E
         RRC
         RRC
         RRC
         RRC
         MOV       E,A            L HAS X TOUCH PANEL VAL.
         CALL      GIN.TP1           GET X COORD
         CALL      R.OUTX 
         JMP       IDLE14 
* 
GIN.TP1  EQU       $
         MVI       A,#0F          MASK WITH LOWER 4 BITS
         ANA       E
         MOV       L,A
         MVI       H,00           HL _ TOUCH PANEL VALUE
         DAD       H                 MULTIPLY BY 32 
         DAD       H
         DAD       H
         DAD       H
         DAD       H
         LXI       D,#0010           ADD 16 
         DAD       D
         RET
**********
* POINT PLOT MODE- GET X AND Y COORDINATES
*                  AND CALL R.DOT TO OUTPUT POINT 
**********
* 
POINT    EQU       $
         CALL      ESCCTL 
         CALL      GETXY
         CALL      R.DOT
         RET
* 
**********
* BLOCK W/E MODE
**********
* 
ABLOCK   EQU       $
         CALL      ESCCTL         CHECK FOR ESC/CTL CODES 
         CALL      GETXY          GET AN X AND Y COORD. 
         LDA       BTWICE         SECOND SET COORDS 
         ORA       A
         JNZ       XY2
         SHLD      X1             NO FIRST SET
         XCHG 
         SHLD      Y1 
         INR       A
         STA       BTWICE         SET BTWICE TO TRUE*D
         RET
* 
XY2      EQU       $
         SHLD      X2             SECOND SET
         XCHG 
         SHLD      Y2 
         XRA       A
         STA       BTWICE         TURN BTWICE OFF 
         LXI       H,X1           HL HAS ADDR. OF XY BUFF.
         CALL      R.BLOCK
         RET
* 
* 
GETXY    EQU       $
         MOV       A,C            RESTORE DATA
         LXI       H,NINPUT       INCR.  NUMBER OF INPUTS 
         INR       M                 OF CURRENT  NO. INPUTS 
         ANI       #60            IF CHAR AND 60H=20H,HI Y
         CPI       #20
         JNZ       LOYCHK         OTHERWISE, CHECK FOR LO Y 
         MVI       A,#1F          HIGH=(CHAR-32)*32.
         ANA       C
         MOV       L,A
         MVI       H,0
         DAD       H
         DAD       H
         DAD       H
         DAD       H
         DAD       H              HL=HIGH 
         LDA       NINPUT         IF THIS INPUT IS FIRST
         CPI       1              IN SEQ. IT IS HIGH Y BYTE.
         JZ        HIYBYTE
         SHLD      HIX            OTHERWISE, IT IS HIGH X 
         POP       PSW            POP AND RET TO IDLE 
         RET
* 
HIYBYTE  SHLD      HIY
         POP       PSW            POP AND RET TO IDLE 
         RET
LOYCHK   EQU       $
         CPI       #60            IF CHAR AND 60H=60H, LO Y 
         JNZ       LOXCHK         OTHERWISE,CHECK FOR LOW X 
         MOV       A,C
         ANI       #1F            LOY=(CHAR-32) 
         STA       LOY
         POP       PSW            POP AND RET TO IDLE 
         RET
* 
LOXCHK   CPI       #40            IF CHAR AND 60H=40H,LO X
         JNZ       ERR            ERR RETURN TO IDLE DEFAULT
         MOV       A,C
         ANI       #1F            LOX=(CHAR-32) 
         STA       LOX
         LHLD      HIX
         ORA       L
         MOV       L,A
         XCHG                     DE HAS X COORDINATE 
         LXI       H,NINPUT       SET INPUTS BACK TO 0
         MVI       M,0
         LDA       LOY
         LHLD      HIY
         ORA       L
         MOV       L,A
         XCHG                     DE HAS Y COORDINATE 
*                                 HL HAS X COORDINATE 
         XRA       A              CLEAR COMMAND MODE FLAG 
         STA       CMODE
         LDA       SCALEFG         LOAD SCALE/NO SCALE FLAG 
         RAR
         RC                       IF SET, COORDS. AS IS..RET
         CALL      DIVIDE               OTHERWISE  SCALE
         XCHG                           BY FACTOR OF 2
         CALL      DIVIDE               TO MAP INTO 511X511 
         XCHG 
         PUSH      H              SAVE X COORD. 
         LHLD      BIAS           BIAS Y COORD. 
         DAD       D
         XCHG                     DE HAS BIASED Y COORD.
         POP       H
         RET
* 
ERR      EQU       $
         POP       PSW
         RET
* 
G.LINE1  EQU       $
         SHLD      XEND           STORE X END POINT 
         XCHG 
         SHLD      YEND                STORE Y END POINT
* 
**********
* VECTOR GENERATOR SUBROUTINE 
**********
* 
* 'THE ALGORITHM IMPLEMENTED FOR THE VECT. GEN. IS THE
* UNIT INCREMENT DIGITAL DIFFERENTIAL ANALYZER.  'THE 'D'D'A
* GENERATES POINTS THAT ARE SPACED ONE UNIT APART ALONG THE 
* AXIS OF GREATER DELTA. THE SPACING IN THE OTHER DIRECTION 
* IS MERELY THE SLOPE. 'I EQUA. FORM THE ABOVE CAN BE STATED
* 
* Y(0)=Y(I)+1/2      X(0)=X(I)
* Y(N)=Y(N-1)+DY/DX  X(N)=X(N-1)+1
* OR *
* X(0)=X(I)+1/2      Y(0)=Y(I)
* X(N)=X(N-1)+DX/DY  Y(N)=Y(N-1)+1
* 
* TO PREVENT THE GENERATED LINE FROM BEING BIASED TO LIE
* ON ONE SIDE OF THE IDEAL LINE THE PTS. ARE ROUNDED TO THE 
* NEAREST INTEGER. 'ROUNDING IS SAME AS 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 / XREG-XEND
*              YDELTA                  YEND-YREG / YREG-YEND
*              SLOPE                   DX/DY OR DY/DX 
*              VECFLAG                 FLAG 
* 
* 
*                                           BITS 1-3  UNUSED
*                                           BIT 4     X SIGN
*                                           BIT 5     Y SIGN
*                                           BIT 6     BIG 'D
*                                           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 
* 
*        CALCULATE DELTA X
* 
         XCHG 
         LHLD      XEND           LOAD END POINT
         MVI       B,#08          LOAD PLOTTING BIT 
         CALL      CALDEL         DO CALCULATION
         SHLD      XDELTA         STORE DIFFERANCE
         LHLD      YREG           LOAD CURRENT Y COORDINATE 
* 
*        CALCULATE DELTA Y
* 
         XCHG 
         LHLD      YEND           LOAD END POINT
         MVI       B,#10          LOAD PLOTTING BIT 
         CALL      CALDEL         DO CALCULATION
         SHLD      YDELTA         STORE DIFFERANCE
* 
***************************************** 
* 
*        DETERMINE IF 45 DEGREE ANGLE AND IF DELTA X GREATER DELTA Y
* 
**********************************************
         MOV       A,L
         ORA       H              TEST FOR ZERO 
         JZ        VECT6
VECT4A   CALL      COMPHL 
         XCHG 
         LHLD      XDELTA              LOAD DELTA X 
         DAD       D                   DELTA Y MINUS DELTA X
         JC        VECT5               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 
         JMP       VECT7               JUMP TO OUT FUNCTION 
* 
*        DELTA Y IS EQUAL TO OR LESS THAN DELTA X 
* 
VECT5    MOV       A,L
         ORA       H              TEST FOR ZERO 
         JZ        VECT8               JUMP IF ANGLE IS 45
* 
VECT6    LHLD      XDELTA              LOAD DELTA X 
         CALL      COMPHL 
         XCHG                          PLACE DIVISOR
         LHLD      YDELTA              LOAD DELTA Y 
         MOV       A,C                 LOAD FLAG
         ADI       #20                 SET BIT TO INDICATE Y SHORT AXIS 
* 
VECT7    OUT       DISCHAN*32+DISCON1  OUTPUT CONTROL 1 
         STA       VECFLAG
* 
******************************************
* 
*        FRACTIONAL DIVIDE ROUTINE
* 
**************************************
* 
*                  DIVIDEND  REGISTER PAIR HL 
*                  DIVIDEND  REGISTER PAIR HL 
* 
*                  DIVISOR   REGISTER PAIR DE 
*                  QUOTIENT  REGISTER PAIR BC 
* 
************************************* 
ADIV0    LXI       B,#0040        SET COUNT TO 10 DIGIT ACC.
ADIV1    DAD       H              SHIFT DIVIDEND LEFT ONCE
         SHLD      SAVE           SAVE DIVIDEND VALUE 
         DAD       D              DIVIDEND-DIVISOR
         JC        ADIV2          JUMP IF CARRY SET 
* 
         LHLD      SAVE           RESTORE DIVIDEND
* 
*     THIS CODE SHIFTS QUOTIENT INTO REISTER PAIR BC
* 
ADIV2    EQU       $
         MOV       A,C
         RAL
         MOV       C,A
         MOV       A,B
         RAL
         MOV       B,A
* 
         JNC       ADIV1          REPEAT IF NOT COMPLETE
* 
*     LEFT JUSTIFY FRACTIONAL QUOTIENT
* 
         MOV       L,C            TRANSFER  BC TO  HL 
         MOV       H,B
* 
         DAD       H              SHIFT  HL LEFT SIX PLACES 
         DAD       H
         DAD       H
         DAD       H
         DAD       H
         DAD       H
* 
         XCHG                     SAVE FRACTIONAL ANSWER
         JMP       ACALPT1        GO TO CALCULATE POINTS
* 
* DIVIDE 16 BIT VALUE IN HL BY 2
DIVIDE   EQU       $
         MOV       A,H
         ORA       L
         RZ 
         MOV       A,H
         ANI       #7F
         RAR
         MOV       H,A
         MOV       A,L
         RAR
         MOV       L,A
         RET
* 
********************
* 
*                  INITIALIZE FOR A 45 DEGREE ANGLE 
* 
********************* 
VECT8    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
* 
ACALPT1  LDA       VECFLAG
         LHLD      XDELTA 
         ANI       #20            TEST FOR LARGEST DELTA
         JNZ       ACALPT2        DELTA X IS LONG AXIS
* 
         LHLD      YDELTA 
ACALPT2  EQU       $
         MOV       C,L
         MOV       B,H
         LXI       H,#8000             PARTIAL SUM RNDG FACT
WRITSEG  EQU       $
         PUSH      PSW            STORE ON STACK FOR LOOP 
W.SEG1   EQU       $
         POP       PSW            POP VALUE FROM STACK
         LDA       VECFLAG        OUTPUT TO DISPLAY 
         OUT       DISCHAN*32+DISCON1 
         LDA       WSEGLEN        LOAD UP WRITE SEG. LENGTH 
         PUSH      PSW            STORE UNTO STACK
         MOV       A,C            CHECK FOR VECTOR END
         CPI       0
         JZ        W.ENDCK
* 
* 
W.SEG2   EQU       $
         POP       PSW            LOOP ON WRITING A SEGMENT 
         DCR       A
         PUSH      PSW
         JZ        ERASEG         WRITE SEGMENT DONE,ERASE
         DAD       D              SEGMENT NOT COMPLETE, 
         RAR                      OUTPUT A POINT
         OUT       DISCHAN*32+DISDATA 
         DCR       C              CHECK FOR VECTOR END
         JNZ       W.SEG2         NOT COMPLETE, CONT. WRITE 
W.ENDCK  EQU       $
         DCR       C              SET C REGISTER TO FF COUNT
         DCR       B
         JP        W.SEG2 
         POP       PSW
         JMP       LASTPT         VECTOR DONE,OUTPUT LAST PT
* 
ERASEG   EQU       $
         POP       PSW            POP OFF WSEGLEN 
         LDA       VECFLAG        OUTPUT TO DISPLAY 
         ORI       #40               WITH INHIBIT BIT SET 
         OUT       DISCHAN*32+DISCON1 
         LDA       ESEGLEN        ERASE SEGMENT LENGTH COUNT
         PUSH      PSW            STORE UNTO STACK
         MOV       A,C            CHECK FOR VECTOR END
         CPI       0
         JZ        E.ENDCK
E.SEG    EQU       $
         POP       PSW            LOOP ON ERASING A SEGMENT 
         DCR       A
         PUSH      PSW
         JZ        W.SEG1         ERASE SEGMENT LENGTH DONE 
         DAD       D              SEGMENT NOT COMPLETE
         RAR                      OUTPUT A POINT
         OUT       DISCHAN*32+DISDATA 
         DCR       C              CHECK FOR VECTOR END
         JNZ       E.SEG          NOT COMPLETE, CONT. WRITE 
E.ENDCK  EQU       $
         DCR       C              SET C REGISTER TO FF COUNT
         DCR       B
         JP        E.SEG
         POP       PSW
* 
*        PLACE X AND Y END COORDINATES INTO X AND Y REGS. 
*           WHICH BECOME THE BEGINNING PT. OF NEXT VECTOR 
* 
LASTPT   EQU       $              VECTOR COMPLETE, LAST PT. 
         LHLD      YEND 
         XCHG 
         LHLD      XEND 
* 
         CALL      R.DOT          DISPLAY LAST POINT
         LDA       VECFLAG        TURN OFF INHIBIT BIT
         XRI       #40
         STA       VECFLAG
         RET
VECTAB   EQU       $
         DB        #3,#3          DOTTED VECTOR COUNTS
         DB        #8,#3          SHORT DASHED VECTOR COUNTS
         DB        #10,#4         LONG DASHED VECTOR COUNTS 
* 
********************
* 
*                          SUBROUTINE GRAPH 
* 
*        THIS SUBROUTINE IS CALLED UPON WHEN IN GRAPH MODE. 
*         X AND Y COORDS. ARE SET UP IN HERE PRIOR TO 
*         CALLING LINE1 OR OUTCOORD. IF IN DARK MODE, 
*         OUTCOORD IS CALLED UPON TO DO BASE POSITION.
*         OTHERWISE, LINE1 IS CALLED TO DISPLAY A VECTOR. 
*         FOUR INPUTS ARE NOT NECESSARY TO DRAW A VECTOR. 
*         THE USER MAY CHANGE FROM 1 TO 4 BYTES OF THE
*         COORDINATES.  IF A HIGH BYTE IS RECEIVED FIRST
*         IN A GIVEN SEQUENCE, IT MUST BE A HIGH Y BYTE.A HI
*         RECEIVED OTHER THAN FIRST IN SEQUENCE IS A HIGH 
*         X BYTE.  LOY AND LOX ARE DISTINGUISHABLE EACH 
*         FROM THE OTHER.  INPUT OF A LOW X BYTE TRIGGERS 
*         BASE POSITION OR DRAWS A VECTOR.
********************
GRAPH    EQU       $
         CALL      ESCCTL         CHECK ESC SEQ./CTL CODES
         CALL      GETXY
* 
         LDA       DARK 
         ANA       A              IF DARK VECTOR, 
         JZ        ALINE             BASE POSITION
         PUSH      D              SAVE Y COORDINATE 
         CALL      R.OUTX           AND OUTPUT X COORDINATE 
         POP       H              RELOAD Y COORDINATE 
         CALL      R.OUTY           AND OUTPUT
         XRA       A              TURN DARK VECTOR OFF
         STA       DARK 
         STA       BYPASS         CLEAR BYPASS CONDITION
         RET
ALINE    EQU       $
         LDA       DASH           LOAD FLAG FOR DASHED/SOLID
         RAR
         JC        G.LINE1        IF SET, USE DASHED VECTOR 
         CALL      R.LINE         OTHERWISE, USE R.LINE 
         RET
*                                    RETURN TO CALLER 
************************* 
* 
*                          SUBROUTINE ALPHMODE
* 
*        TESTS DATA FOR CTL CODE, ESCAPE, AND DISPLAY CODE
* 
************************* 
* 
CHARGEN  EQU       $
         PUSH      B              SAVE CHARACTER CODE ON STK
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
         POP       B              RESTORE CHAR. CODE TO C 
         LHLD      CHBASE 
         CALL      JMPHL
         CALL      LINENDCK 
         RET
* 
CHGEN.S1 EQU       $
         MOV       L,C            CHARACTER CODE IN HL
         MVI       H,00 
         MOV       D,H           CHARACTER CODE-20H IN DE 
         MOV       E,L
         DAD       H              'MULTIPLY' CODE BY 8. 
         DAD       H
         DAD       H
         XCHG                     STORE IN DE 
         DAD       H              'MULTIPLY' CODE BY 4
         DAD       H
         DAD       D              INDEX=4(CODE)+8(CODE).
         JMP       OUTCHAR
* 
CHGEN.S2 EQU       $
         MVI       A,#A1          TEST CHARACTER
         ADD       C                CODE FOR RUBOUT /CURSOR 
         JC        OUTCH.2
         MVI       H,00 
         MOV       L,C
         DAD       H
         DAD       H
         DAD       H
         DAD       H              INDEX=16(CODE)
* 
OUTCHAR  EQU       $
         XCHG 
         LHLD      G.MEMSEL       ADD INDEX TO BASE ADDRESS 
         DAD       D                 OF CHARACTER CODES.
* 
OUTCH.0  EQU       $
         XCHG                     SAVE CHARACTER ADDR. IN DE
         LDA       D.CNTL2              LOAD CTL 2 FOR CHAR.
         OUT       DISCHAN*32+DISCON2   AND OUT ORIENT./WE
         LHLD      XREG                 LOAD CURRENT X/Y
         SHLD      XSAVE                FOR CHARACTER PLOT
         LHLD      YREG 
         SHLD      YSAVE
         LDA       WIDTH
         MOV       B,A            LOAD B WITH CHAR. WIDTH 
* 
OUTCH.1  EQU       $
         CALL      CHGEN.2        OUTPUT 1ST COLUMN OF CODES
         LHLD      XREG           INCREMENT X COORDINATE
         INX       H                 AND OUTPUT.
         CALL      R.OUTX 
         LHLD      YSAVE
         CALL      R.OUTY            AND OUTPUT.
         DCR       B              DECREMENT CHARACTER WIDTH 
         JNZ       OUTCH.1
         RET
* 
* 
OUTCH.2  EQU       $
         LXI       H,M0CODE5F     LOAD ADDRESS OF RUBOUT
         ORA       A              TEST FOR  RUB-OUT 
         JZ        OUTCH.0        RUBOUT, DISPLAY IT
         LXI       H,M0CODE60     LOAD ADDRESS OF CURSOR
         DCR       A              TEST FOR RUB-OUT OR XHAIR 
         ORA       A
         JZ        OUTCH.0        CURSOR, DISPLAY IT
         LXI       H,M0CODE61     ELSE, ADDR. OF XHAIR
         JMP       OUTCH.0          AND DISPLAY IT
* 
DISCURS  EQU       $
         LDA       MODE 
         CPI       08 
         JZ        DISCURS1       GIN MODE, ALWAYS DISPLAY
         LDA       G.SUPCUR       IF SUPPRESS SET, RET
         ORA       A
         RNZ
DISCURS1 EQU       $
         LDA       D.CNTL2        SAVE DISPLAY CONTROL WORD 
         STA       D.CNTL2D 
         MOV       A,B
         STA       D.CNTL2
         LDA       MODE           TEST FOR GIN MODE 
         CPI       08 
         JNZ       DISCURS2 
         CALL      XHAIR
         JMP       DISCURS3 
DISCURS2 EQU       $
         MVI       C,#60          DISPLAY CURSOR
DISCURSX EQU       $
         LHLD      CHBASE 
         CALL      JMPHL
         CALL      R.INPX 
         LDA       WIDTH
         CMA
         INR       A
         MOV       E,A
         MVI       D,#FF
         DAD       D
         CALL      R.OUTX 
DISCURS3 EQU       $
         LDA       D.CNTL2D 
         STA       D.CNTL2
         RET
* 
CHGEN.2  EQU       $
         LDAX      D
         INX       D
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         LDAX      D
         INX       D
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         MOV       C,A            IF SIZE 1 RETURN
         LDA       G.SIZE 
         ORA       A
         RZ 
         MOV       A,C
         RAR
         OUT       DISCHAN*32+DISDATA 
         RAR
         OUT       DISCHAN*32+DISDATA 
         RET
* 
* 
ESCCTL   EQU       $
         LDA       G.ESC          IS ESCAPE FLAG, G.ESC, SET& 
         ANA       A
         JZ        VALCK          NO, CHECK FOR CTL CODE
         XRA       A
         STA       G.ESC          YES, CLEAR ESCAPE FG. 
         LHLD      ESCADR 
         CALL      SEARCH 
         JMP       POPRET 
* 
VALCK    EQU       $
         MOV       A,C            IS CURRENT CODE A CTL'/ 
         CPI       #20
         RNC                      NO, RETURN TO MODE
         CALL      ACONTROL 
* 
POPRET   EQU       $
         POP       H                 POP OFF ADDR. FROM STK 
         RET                         AND RETURN TO IDLE.
* 
ALPHMODE EQU       $
         CALL      ESCCTL         CHECK FOR ESC SEQ./CTL COD
          CPI    #7F
          RZ                 RETURN IF RUBOUT DEL CHAR
         SUI       #20
         MOV       C,A            CHARACTER CODE IN C.
         CALL      SCROLLCL       CLEAR SCROLL FGS
         CALL      CHARGEN        INDEX INTO CHARACTER CODE 
         RET                      VIA CHARGEN.
* 
ACONTROL EQU       $
         LHLD      CTLADR         BEGIN SEARCH FOR MATCH
SEARCH   MOV       A,M            IF CODE IN JUMP TABLE FF
         CPI       #FF               END OF TABLE REACHED 
         JNZ       SEARCH.1 
         CALL      SCROLLCL       CLEAR SCROLL FGS. 
         RET
SEARCH.1 EQU       $
         CMP       C              ELSE, COMPARE HEX ENTRY W/
         JZ        MATCH             CONTROL CODE FOR MATCH 
         INX       H              NO MATCH,GET NEXT ENTRY 
         INX       H                 AND CONTINUE SEARCHING.
         INX       H
         JMP       SEARCH 
MATCH    EQU       $
         CPI       #0D            TEST FOR 'C'R 
         JNZ       MATCH.1        NOT A 'C'R
         STA       CRLFFG         'C'R, SO SET CRLF FLAG
         JMP       MATCH.2
MATCH.1  EQU       $
         CPI       #0A            TEST IF 'L'F
         JZ        MATCH.2
         CALL      SCROLLCL 
MATCH.2  EQU       $
         INX       H              MATCH FOUND. GET ADDR. CTL
         MOV       E,M               CODE ROUTINE AND DO IT.
         INX       H
         MOV       D,M
         XCHG 
         LXI       D,HOR          HOR FLAG FOR PLATO CHAR.
         CALL      JMPHL
         RET
* 
* 
*                          ESCAPE SEQUENCES 
* 
*        THE FOLLOWING IS A LIST OF ESCAPE SEQUENCES WHICH
*        WHEN ENTERED FROM KEYBOARD OR RECEIVED FROM HOST,
*        ILLICIT THE ACTIVITIES DESCRIBED AFTER EACH SEQ. 
* 
*                  CODE SEQUENCE  DESCRIPTION 
* 
*                  1B 07          ESC BEL- CLEAR BYPASS,RING
*                                      BELL 
*                  1B 08          ESC BS- BACK SPACE
*                  1B 0D          ESC CR- SET ESCAPE FLAG 
*                  1B 02          ESC STX SELECTS PLATO OP. 
*                  1B 18          ESC CAN- SELECTS BYPASS 
*                                  *VECTOR ESCAPE SEQUENCES*
*                  1B 60          ESC REVERSE SLASH SEQUENCE
*                                    SETS NORMAL VECTORS
*                  1B 61          ESC SMALL A SEQUENCE
*                                    SETS DOTTED VECTORS
*                  1B 63          ESC SMALL C SEQUENCE
*                                    SETS SHORT DASHED VECT.
*                  1B 64          ESC SMALL D SEQUENCE
*                                    SETS LONG DASHED VECTOR
*                  1B 11          ESC DC1 SEQUENCE SELECTS
*                                    INVERSE VIDEO
*                  1B 12          ESC DC2 SEQUENCE SELECTS
*                                    OVERSTRIKE WRITE.
*                  1B 13          ESC DC3 SEQUENCE SELECTS
*                                    OVERSTRIKE ERASE.
*                  1B 14          ESC DC4 SEQUENCE SELECTS
*                                    CLEAR WRITE
*                  1B 05          ESC ENQ SEQUENCE- 
*                                    SELECTS BYPASS, SENDS
*                                    TERMINAL STATUS AND 4
*                                    BYTES OF CURRENT X/Y 
*                  1B 0C          ESC FF SEQUENCE-
*                                    ERASES SCREEN, SELECTS 
*                                    ALPHA,HOMES,CLEARS BYP.
*                  1B 1D          ESC GS- SET GRAPH MODE, 
*                                      DARK VECTOR
*                  1B 09          ESC HTAB- HORIZONTAL TAB
*                                      AUTO CRLF IF NEEDED
*                  1B 0A          ESC LF- SET ESCAPE FLAG 
*                  1B 3B          ESC ; SEQUENCE -SIZE1 
*                  1B 3A          ESC '; SEQUENCE -SIZE1
*                  1B 39          ESC 9 SEQUENCE -SIZE1 
*                  1B 38          ESC 8 SEQUENCE -SIZE1 
*                                    6 X 14 
*                                    SETS APPROPRIATE LINEND
*                                    PAGEND,HEIGHT, WIDTH 
*                  1B 37          ESC 7 SEQUENCE -SIZE2 
*                                    8 X 16 
*                                    SETS APPROPRIATE LINEND
*                                    PAGEND,HEIGHT, WIDTH 
*                  1B 1A          ESC SUB SEQUENCE -SELECTS 
*                                      GIN MODE,BYPASS,CROSS
*                                      HAIR CURSOR
*                  1B 1F          ESC US- RESETS TO ALPHA 
*                                      FROM ALL MODES BUT 
*                                      GIN,CLEAR BYPASS 
*                  1B 0B          ESC VT- VERTICAL TAB
********************
********************
*                          ESCAPE SEQUENCE LIST 
********************* 
* 
ESCADR.A EQU       $
         DB        #07
         DW        BEL
         DB        #08
         DW        BS 
         DB        #0D
         DW        ESC
         DB        #02
         DW        PLATO
         DB        #18
         DW        CAN
         DB        #60
         DW        VECTNORM 
         DB        #61
         DW        VECTDOT
         DB        #63
         DW        VECTSDSH 
         DB        #64
         DW        VECTLDSH 
         DB        #11
         DW        DC1
         DB        #12
         DW        DC2
         DB        #13
         DW        DC3
         DB        #14
         DW        DC4
         DB        #05
         DW        ENQ
         DB        #0C
         DW        AFF
         DB        #1D
         DW        GS 
         DB        #09
         DW        HTAB 
         DB        #0A
         DW        ESC
         DB        #3B
         DW        SIZE1
         DB        #3A
         DW        SIZE1
         DB        #39
         DW        SIZE1
         DB        #38
         DW        SIZE1
         DB        #37
         DW        SIZE2
         DB        #1A
         DW        ASUB 
         DB        #1F
         DW        US 
         DB        #0B
         DW        VT 
          DB     #1B
          DW     ESC
          DB     #00
          DW     ESC
         DB        #FF
********************
*                     CONTROL CODE SUBROUTINE 
* 
*        THIS SUBROUTINE EXECUTES CONTROL CODE FUNCTIONS
*        (I.E.'C'R,'B'S,ETC.)  IT WILL BE ENTERED FROM THE KB 
*        AFTER THE CONTROL KEY IS RECEIVED OR FROM THE HOST 
*        WHEN A CTL CODE IS RECEIVED.  HEX VALUE RANGE 00-1F
* 
*                  CODE           DESCRIPTION 
* 
*                  07             BEL-CLEARS BYPASS 
*                  08             BS-BACK SPACE 
*                  0D             CR-CARRIAGE RETURN
*                                    RESET FROM GRAPH 
*                                    TO ALPHA MODE, 
*                                    CLEAR BYPASS 
*                  1B             ESC-SET G.ESC, ESCAPE FLAG
*                  1C             FS-CTL FS SELECT
*                                    POINT PLOT MODE
*                  1D             GS-SETS GRAPH MODE, 
*                                    DARK VECTOR
*                  09             HTAB-HORIZONTAL TAB 
*                                    AUTO. CR/LF IF NEEDED
*                  0A             LF-LINE FEED; WRAP TO 
*                                    DISPLAY TOP IF NEEDED, 
*                                    CLEAR BYPASS 
*                  19             EM-SELECT BLOCK W/E MODE
*                  1F             US-RESETS TERM GRAPH TO 
*                                    ALPHA; CLEARS BYPASS 
*                  0B             VT-VERTICAL TAB 
* 
**********************
**********************
*                   CONTROL CODE JUMP TABLE 
* 
********************
* 
CTLADR.A EQU       $
         DB        #07
         DW        BEL
         DB        #08
         DW        BS 
         DB        #0D
         DW        CR 
         DB        #1B
         DW        ESC
         DB        #1C
         DW        FS 
         DB        #1D
         DW        GS 
         DB        #09
         DW        HTAB 
         DB        #0A
         DW        LF 
         DB        #19
         DW        EM 
         DB        #1F
         DW        US 
         DB        #0B
         DW        VT 
         DB        #FF
* 
* 
BEL      EQU       $
         IN        TPCHAN*32+TOUCHD  SOUND ALERT
         MVI       A,00 
         STA       BYPASS         CLEAR BYPASS
         RET
* 
BS       EQU       $
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
         XRA       A              CLEAR BYPASS
         STA       BYPASS 
BS.1     EQU       $
         CALL      R.INPX 
         LDA       WIDTH
         CMA                      MOVE X  BACK A CHAR. WIDTH
         INR       A
         MOV       E,A
         MVI       D,#FF
         DAD       D
         MOV       A,H
         ANI       #80
         JNZ       BS.SCK         X COORD. NEGATIVE 
*                                    GO CHECK CHAR. SIZE
BS.END   EQU       $              X COORD. DID NOT BACK OFF 
         CALL      R.OUTX            SET CURRENT X COORD. 
         RET
* 
BS.SCK   EQU       $
         LDA       G.SIZE 
         ORA       A
         JNZ       BS.VT          X COORD NEG AND SIZE 2
*                                 CHECK IF FFF8 
         DCX       H              SUBTRACT 2 FROM X AS SIZE 
         DCX       H                 1 USES ONLY 510 DOTS.
* 
BS.VT    EQU       $
         MOV       A,L            LOWER 8 BITS OF X MUST
         CPI       #F8            BE F8 IF SIZE 2,X NEG 
         JNZ       BS.END            BEFORE 'V'T IS REQUIRED. 
         CALL      R.OUTX 
         CALL      VT.1 
         RET
* 
CAN      EQU       $
         LXI       H,BYPASS       SELECTS BYPASS
         MVI       M,1
         RET
* 
CR       EQU       $
         LDA       ECURSOR
         MOV       B,A
         CALL      DISCURS
         XRA       A
         STA       BYPASS         CLEARS BYPASS.
         LDA       MODE 
         CPI       08 
         JNZ       CR.A 
         LDA       GIN.KEY        GIN MODE, SEND LAST CHAR. 
         MOV       C,A               AND RETURN TO GIN XMIT 
         CALL      GIN.XMT
         CALL      CR.1           DO CARRIAGE RETURN
         RET
CR.A     EQU       $
         CALL      CR.1           DO CARRIAGE RETURN
         MVI       A,03 
         STA       MODE           SET ALPHA MODE. 
         LHLD      STRAP          TEST FOR AUTO. CR/LF
         MOV       A,L
         ANI       #08
         RZ                       RETURN IF NOT SET 
         LDA       KBDATA 
         ORA       A
         RZ 
         STA       CRLFFG         SET SCROLL FLAG 
         CALL      LF.1A          OTHERWISE, 'L'F 
         CALL      SCROLLCK 
         CALL      SCROLLCL       CLEAR SCROLL FLAG 
         RET
* 
CR.1     EQU       $
         LXI       H,00           SET TO LEFT MARGIN. 
         CALL      R.OUTX 
         RET
* 
* 
DC1      EQU       $
         MVI       L,00           SELECT INVERSE VIDEO
         CALL      R.MODE 
         MVI       A,6            CURSOR NEEDS OPPOS. W/E 
         STA       ECURSOR           BITS OF ALL OTHER WRITE
         MVI       A,4               MODES. 
         STA       WCURSOR
         RET
* 
DC2      EQU       $
         MVI       L,6            SELECT OVERSTRIKE WRITE 
         CALL      R.MODE 
DC2.1    EQU       $
         MVI       A,4            RESET W/E MODES SO CURSOR 
         STA       ECURSOR           OVERSTRIKE WRITE AND 
         MVI       A,6               OVERSTRIKE ERASE 
         STA       WCURSOR
         RET
* 
DC3      EQU       $
         MVI       L,4            SELECT OVERSTRIKE ERASE 
         CALL      R.MODE 
         CALL      DC2.1          SELECT W/E CURSOR WORDS 
         RET
* 
DC4      EQU       $
         MVI       L,02 
         CALL      R.MODE         SELECT CLEAR WRITE
         CALL      DC2.1          SELECT W/E CURSOR WORDS 
         RET
* 
ENQ      EQU       $
         LDA       MODE 
         CPI       #08
         JZ        ENQ.1          IF GIN, DON'7T SEND TSTAT 
         LDA       TSTAT          LOAD TERMINAL STATUS
         MOV       C,A
         CALL      XMIT.1 
ENQ.1    EQU       $
         CALL      R.INPX 
         CALL      HILO           SEND X IN 2 BYTES 
         LHLD      BIAS 
         CALL      COMPHL 
         PUSH      H              SAVE -BIAS ON STACK 
         CALL      R.INPY 
         POP       D
         DAD       D              HL _ Y - BIAS 
         CALL      HILO           SEND Y IN 2 BYTES 
         LDA       MODE           IF GIN, DO AUTOMATIC
         CPI       #08               TRANSMISSION CHECKS
         JNZ       ENQ.2
         LHLD      STRAP          TEST 'G'I'N TRANSMISSION
         MOV       A,L
         ANI       06 
         CPI       04 
         MOV       L,A
         JZ        ENQ.2          SEND NOTHING AUTO.
         PUSH      H              SAVE STRAP
         MVI       C,#0D          SEND CR 
         CALL      XMIT.1 
         POP       H              RESTORE STRAP 
         MOV       A,L
         CPI       02 
         JZ        ENQ.2          SEND 'C'R ONLY. 
         MVI       C,#04          SEND EOT
         CALL      XMIT.1 
* 
ENQ.2    EQU       $
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
         MVI       A,03           SELECT ALPHA MODE 
         STA       MODE 
         STA       BYPASS         SET BYPASS
         MVI       H,04           LOAD INTERRUPT
         LDA       M.ENAB 
         ANI       #D8
         MOV       L,A            DISABLE TOUCH PANEL 
         CALL      R.SSF            MASK AND OUTPUT.
         RET
* 
* 
HILO     EQU       $
         LDA       SCALEFG        TEST SCALE FLAG 
         ORA       A
         JNZ       HILO.1         NOT SCALING, SEND AS IS 
         DAD       H              OTHERWISE, MULT. BY 2 
HILO.1   EQU       $
         MVI       A,#1F
         ANA       L              MASK LOWER FIVE BITS
         PUSH      A
         DAD       H              SHIFT UPPER 
         DAD       H                FIVE BITS INTO
         DAD       H                  H REGISTER. 
         MOV       A,H
         ANI       #1F            MASK FOR FIVE BITS
         ORI       #20
         MOV       C,A
         CALL      XMIT.1         TRANSMIT UPPER 5 BITS 
         POP       A
         ORI       #20
         MOV       C,A
         CALL      XMIT.1 
         RET
* 
ESC      EQU       $
         LXI       H,G.ESC
         MVI       M,01 
         RET
* 
AFF      EQU       $              PAGE GETS YOU HERE
         LDA       M.MODE 
         RLC
         ORI       01 
         MOV       L,A
         CALL      R.MODE 
* 
AFF.1    EQU       $              RESET KEY GETS YOU HERE 
         MVI       A,03           SELECT ALPHA MODE 
         STA       MODE           SELECTS ALPHA.
         XRA       A
         STA       BYPASS         CLEARS BYPASS.
         LXI       H,00 
         CALL      R.OUTX 
         MVI       H,#FF
         LDA       HEIGHT 
         CMA
         INR       A              A HAS -(HEIGHT) 
         MOV       L,A
         LXI       D,#200 
         DAD       D
         CALL      R.OUTY 
         RET
* 
FS       EQU       $
         LDA       MODE 
         CPI       03 
         JNZ       FS.1 
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
FS.1     EQU       $
         LDA       MODE 
         ANI       #80
         JZ        FS.2 
         ORI       #40            SET PLATO DATA MODE 
FS.2     EQU       $
         STA       MODE           SELECT POINT PLOT MODE
         XRA       A              CLEAR NUMBER INPUTS 
         STA       NINPUT            TO GET COORDINATE
         RET
* 
GS       EQU       $
         LDA       MODE 
         CPI       03 
         JNZ       GS.1 
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
* 
* 
GS.1     EQU       $
         LDA       MODE 
         ANI       #80
         JZ        GS.2 
         ORI       #40            SELECT PLATO DATA MODE
GS.2     EQU       $
         ORI       #01            SELECT GRAPH MODE 
         STA       MODE 
         STA       DARK           SETS DARK VECTOR. 
         XRA       A              CLEAR NUMBER OF INPUTS TO 
         STA       NINPUT            GET COORDINATE ROUTINE 
         LDA       TSTAT          UPDATE TERMINAL STATUS
         ANI       #B1
         STA       TSTAT
         RET
* 
HTAB     EQU       $
         LDA       D.CNTL2
         STA       D.CNTL2P       SAVE DISPLAY CONTROL WORD 
         LDA       ECURSOR
         MOV       B,A
         STA       D.CNTL2
         MVI       C,#60          ERASE CURSOR
         LHLD      CHBASE 
         CALL      JMPHL
         CALL      LINENDCK 
         LDA       D.CNTL2P       RESTORE DISPLAY CONTROL 
         STA       D.CNTL2
         XRA       A              CLEAR BYPASS
         STA       BYPASS 
         RET
* 
LF       EQU       $
         LDA       ECURSOR
         MOV       B,A
         CALL      DISCURS
         LXI       H,BYPASS       CLEAR BYPASS. 
         MVI       M,00 
         CALL      LF.1A          DO A LINE FEED. 
         LDA       KBDATA 
         ORA       A
         JZ        LFSCROL
         LHLD      STRAP          TEST FOR AUTO. LF/CR
         MOV       A,L
         ANI       #10
         CNZ       CR.1           AUTO. SO DO 'C'R
LFSCROL  EQU       *
         CALL      SCROLLCK 
         CALL      SCROLLCL 
         RET
LF.1A    EQU       $
         CALL      R.INPY         GET CURRENT Y 
         XCHG                     STORE Y IN DE.
         LHLD      PAGEND         CHECK FOR PAGEND
         MOV       A,D
         ORA       A
         JNZ       CHANGEY        NOT PG BOTTOM,
         MOV       A,E              CHANGE Y ONLY.
         CMP       L
         JC        LF.2           PAGE BOTTOM REACHED,
* 
CHANGEY  EQU       $
         XCHG                     JUST CHANGE Y COORD 
         JMP       LF.3 
         RET
* 
LF.2     EQU       $
         LXI       H,#200         SET Y TO PAGE TOP- HEIGHT 
* 
LF.3     EQU       $
         LDA       HEIGHT 
         CMA
         INR       A              A HAS -(HEIGHT).
         MOV       E,A
         MVI       D,#FF
         DAD       D
         CALL      R.OUTY 
         RET
* 
LINENDCK EQU       $
         CALL      R.INPX 
         XCHG                     CURRENT X IN DE 
         LDA       G.SIZE         CHECK CHARACTER SIZE
         ORA       A
         JZ        LEND.S1
         MOV       A,E            SIZE 2 SO CHECK X COORD.
         ORA       D                 IF ZERO, IT HAS WRAPPED
         JZ        PGCHK             SO DO CR LF. 
         RET
* 
* 
LEND.S1  EQU       $              SIZE 1, X AT LINEND 
         LHLD      LINEND         DE HAS CURRENT X
         MOV       A,D
         CMP       H
         RC 
         JNZ       PGCHK          IF LINEND DO 'C'R/'L'F
         MOV       A,E               RETURN, LINE FEED. 
         CMP       L              OTHERWISE SIMPLY RETURN.
         RC 
         RZ 
         LXI       H,00 
         CALL      R.OUTX 
PGCHK    EQU       $
         CALL      CR.1 
         CALL      LF.1A
         LDA       G.SUPCUR       TEST IF CURSOR ON 
         ORA       A
         CZ        SCROLL         ON, SO SCROLL 
         CALL      SCROLLCL 
         RET
* 
EM       EQU       $
         LDA       MODE 
         CPI       03 
         JNZ       EM.1 
         LDA       ECURSOR        ERASE CURSOR
         MOV       B,A
         CALL      DISCURS
EM.1     EQU       $
         LDA       MODE 
         ANI       #80
         JZ        EM.2 
         ORI       #40            SELECT PLATO DATA MODE
EM.2     EQU       $
         ORI       #04            SELECT BLOCK MODE 
         STA       MODE 
         XRA       A              CLEAR TWICE FLAG
         STA       BTWICE 
         STA       NINPUT         CLEAR NINPUT TO GET COORDS
         RET
* 
PLATO    EQU       $
         CALL      BULKER         ERASE SCREEN
PLATO0    EQU    *
          MVI    A,0
          STA    M.JOBS 
          MVI    A,12 
          STA    M.TYPE 
          MVI    A,03 
          STA    M.SBTYPE 
         MVI       A,#83          SELECT PLATO COMMAND MODE3
         STA       MODE 
         LXI       H,ISTASC       SELECT IST ASCII KEYBOARD 
         SHLD      KBAADR 
         LXI       H,SELECT.P     SELECT PLATO DATAMODE TBL 
         SHLD      SELECT.M 
         LXI       H,CTLADR.P     SELECT PLATO CTL CODE TBL 
         SHLD      CTLADR 
         LXI       H,ESCADR.P     SELECT PLATO ESC SEQ TBL
         SHLD      ESCADR 
         LXI       H,#0000        NO GRAPH MODE SCREEN BIAS 
         SHLD      BIAS 
         MVI       A,01           DO NOT SCALE
         STA       SCALEFG
         LXI       D,00 
         LXI       H,184
         CALL      OUTCOORD 
         MVI       L,#1A
         CALL      R.MODE 
         MVI       L,00 
         CALL      R.CCR
         LXI       H,MSG
         CALL      R.CHARS
         MVI       A,#01
         STA       EREG 
         MVI       A,#14
         STA       E.CNTR 
         MVI       A,01 
         OUT       KEYCHAN*32+KYBDCON 
         XRI       #09
         CALL      ENAB 
* 
          LDA    PMC.FLG     TEST FOR PLATO 
          ORA    A             MODE MASTER CLEAR. 
          JNZ    PI.3        JUMP IF M.C. 
         MVI       C,#06
PI.1     CALL      XMIT.1 
         JC        PI.1 
         MVI       C,#20
PI.2     CALL      XMIT.1 
         JC        PI.2 
          LXI    H,#0382     SEND MASTER CLEAR
          CALL   P.XMIT        STATUS TO PLATO. 
         RET
PI.3      XRA    A
          STA    PMC.FLG     CLEAR MC FLAG
          MVI    C,#95
PI.4      CALL   XMIT.1      SEND NAK 
          JC     PI.4        NOT SENT, TRY AGAIN
          LDA    MREG 
          ADI    #20         ADJUST FOR ASCII 
          MOV    C,A
PI.5      CALL   XMIT.1      SEND M 
          JC     PI.5        NOT SENT.
          LXI    H,#0382     SEND MASTER CLEAR
          CALL   P.XMIT        STATUS TO PLATO. 
          RET 
MSG      DB        #50,#4C,#41,#54
         DB        #4F,#1B,#30
* 
SCROLLCK EQU       $
         LDA       G.SUPCUR       TEST SUPPRESS CURSOR
         ORA       A
         RNZ
         LDA       CRLFFG         TEST CR/LF SEQUENCE 
         ORA       A
         CNZ       SCROLL 
* 
SCROLLCL EQU       $
         XRA       A              CLEAR SCROLL FLAGS
         STA       CRLFFG 
         RET
* 
SCROLL   EQU       *
         LXI       H,0000         SET UP X1,Y1,X2,Y2
         SHLD      X1             FOR ERASING A LINE
         LHLD      LINEND 
         SHLD      X2 
         CALL      R.INPY 
         SHLD      Y2 
         XCHG 
         LHLD      HEIGHT 
         DCX       H
         DAD       D
         SHLD      Y1 
         LDA       D.CNTL2
         STA       D.CNTL2P 
         LDA       M.MODE 
         STA       M.MODEP
         MVI       L,00           SET ERASE BITS
         CALL      R.MODE 
         LXI       H,X1 
         CALL      R.BLOCK
         LDA       D.CNTL2P 
         STA       D.CNTL2
         LDA       M.MODEP
         STA       M.MODE 
         LDA       G.SIZE 
         ORA       A
         RNZ                      RET IF SIZE 2 
         CALL      R.INPY         GET Y COORD.
         INX       H              ADD 2 AND OUT 
         INX       H              NEW Y.
         CALL      R.OUTY 
         RET
* 
* 
SIZE1    EQU       $
         LXI       H,S1CODE00     SELECT SIZE 1 
         SHLD      G.MEMSEL 
         LXI       H,CHGEN.S1 
         SHLD      CHBASE 
         LXI       H,LINEND       85 CHARACTERS PER LINE
         MVI       M,#FD
         INX       H
         MVI       M,1            36 LINES PER PAGE 
         LXI       H,PAGEND       SET LINEND,PAGEND,HEIGHT
         MVI       M,#16             ACCORDINGLY. 
         LXI       H,HEIGHT 
         MVI       M,#0E
         LXI       H,WIDTH
         MVI       M,06 
         XRA       A              SIZE SET TO ZERO
         STA       G.SIZE            INDICATES SIZE1. 
         RET
* 
SIZE2    EQU       $
          LHLD   M0ADR       LOAD IST CHAR. SET ADDRESS 
         SHLD      G.MEMSEL 
         LXI       H,CHGEN.S2 
         SHLD      CHBASE 
         LXI       H,LINEND       64 CHARACTERS PER LINE
         MVI       M,#FF
         INX       H
         MVI       M,1            32 LINES PER PAGE 
         LXI       H,PAGEND       SET LINEND, PAGEND, HEIGHT
         MVI       M,0               ACCORDINGLY. 
         LXI       H,HEIGHT 
         MVI       M,#10
         LXI       H,WIDTH
         MVI       M,08 
         MVI       A,1            BIT 1 SET IN SIZE 
         STA       G.SIZE            INDICATES SIZE2. 
         RET
* 
ASUB     EQU       $
         MVI       H,04           LOAD INTERRUPT
         LDA       M.ENAB 
         ORI       #20            ENABLE
         MOV       L,A            TOUCH PANEL 
         CALL      R.SSF
         LDA       MODE 
         CPI       03 
         JNZ       ASUB.1 
         LDA       ECURSOR
         MOV       B,A
         CALL      DISCURS
ASUB.1   EQU       $
         MVI       A,08           SELECT GIN MODE 
         STA       MODE 
         STA       BYPASS         SET BYPASS CONDITION
         RET
* 
US       EQU       $
         MVI       A,0
         STA       BYPASS         CLEAR BYPASS. 
         MVI       A,#BD
         STA       TSTAT
         LDA       MODE 
         CPI       #08
         RZ 
         ANI       #80
         JZ        US.1 
         ORI       #40            SELECT PLATO DATA MODE
US.1     EQU       $
         ORI       #03            SELECT ALPHA MODE 
         STA       MODE 
         RET
* 
VECTNORM EQU       $
         LXI       H,DASH 
         MVI       M,00 
         RET
* 
* 
VECTDOT  EQU       $
         LXI       H,DASH 
         MVI       M,1
         LXI       H,VECTAB 
         MOV       A,M
         STA       WSEGLEN
         INX       H
         MOV       A,M
         STA       ESEGLEN
         RET
* 
VECTSDSH EQU       $
         LXI       H,DASH 
         MVI       M,1
         LXI       H,VECTAB+2 
         MOV       A,M
         STA       WSEGLEN
         INX       H
         MOV       A,M
         STA       ESEGLEN
         RET
* 
VECTLDSH EQU       $
         LXI       H,DASH 
         MVI       M,1
         LXI       H,VECTAB+4 
         MOV       A,M
         STA       WSEGLEN
         INX       H
         MOV       A,M
         STA       ESEGLEN
         RET
* 
VT       EQU       $
         LDA       ECURSOR
         MOV       B,A
         CALL      DISCURS        OVERSTRIKE ERASE CURSOR 
         XRA       A              CLEAR BYPASS
         STA       BYPASS 
VT.1     EQU       $
         CALL      R.INPY 
         LDA       HEIGHT 
         MOV       E,A
         MVI       D,0
         DAD       D
         LDA       G.SIZE         IF SIZE 2, WRAPS AUTO.
         ORA       A
         JNZ       VT.2 
         MOV       A,H            SIZE 1, CHECK FOR PAGE TOP
         CPI       2              IF Y DOES NOT EXCEED 512
         JC        VT.2              DO A SIMPLE 'V'T 
         LHLD      PAGEND         OTHERWISE,WRAP TO PG END
         LDA       HEIGHT         PAGEND MINUS HEIGHT 
         CMA
         INR       A
         MOV       E,A
         MVI       D,#FF
         DAD       D
* 
VT.2     EQU       $
         CALL      R.OUTY 
         LDA       WCURSOR
         MOV       B,A
         CALL      DISCURS
         RET
* 
*        COMPLIMENT HL REGISTERS FOR 2'7S COMP. ARITH.
* 
COMPHL   EQU       $
         MOV       A,L
         CMA
         MOV       L,A
         MOV       A,H
         CMA
         MOV       H,A
         INX       H
         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 
* 
         CALL      COMPHL         SET DELTA POSITIVE
         MOV       A,C            LOAD PLOTTING 
         ORA       B                BIT FOR NEGATIVE
         MOV       C,A                DIRECTION.
         RET                      EXIT
* 
********************
* 
*                         SIZE 1 CHARACTER CODE SET 
* 
********************
S1CODE00 DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
         DB        #00,#00,#00,#00
                                       EXCLAMATION MARK 
S1CODE01 DB        #00,#00,#00,#00
         DB        #20,#3F,#00,#00
         DB        #00,#00,#00,#00
                                       DOUBLE QUOTATION MARK
S1CODE02 DB        #00,#00,#00,#38
         DB        #00,#00,#00,#38
         DB        #00,#00,#00,#00
                                       NUMBER SIGN
S1CODE03 DB        #00,#0A,#80,#3F
         DB        #00,#0A,#80,#3F
         DB        #00,#0A,#00,#00
                                       DOLLAR SIGN
S1CODE04 DB        #80,#0C,#40,#12
         DB        #E0,#3F,#40,#12
         DB        #80,#09,#00,#00
                                       PERCENT SIGN 
S1CODE05 DB        #40,#0C,#80,#0C
         DB        #00,#01,#60,#02
         DB        #60,#04,#00,#00
                                       AMPER SIGN 
S1CODE06 DB        #C0,#01,#20,#1A
         DB        #20,#26,#C0,#19
         DB        #20,#02,#00,#00
                                       SINGLE QUOTATION 
S1CODE07 DB        #00,#00,#00,#00
         DB        #00,#38,#00,#00
         DB        #00,#00,#00,#00
                                       LEFT PARENTHESIS ( 
S1CODE08 DB        #00,#00,#00,#00
         DB        #C0,#0F,#20,#10
         DB        #10,#20,#00,#00
                                       RIGHT PARENTHESIS )
S1CODE09 DB        #10,#20,#20,#10
         DB        #C0,#0F,#00,#00
         DB        #00,#00,#00,#00
                                       ASTERISK 
S1CODE0A DB        #80,#04,#00,#03
         DB        #C0,#0C,#00,#03
         DB        #80,#04,#00,#00
                                       PLUS 
S1CODE0B DB        #00,#01,#00,#01
         DB        #C0,#07,#00,#01
         DB        #00,#01,#00,#00
                                       COMMA
S1CODE0C DB        #00,#00,#68,#00
         DB        #70,#00,#00,#00
         DB        #00,#00,#00,#00
                                       MINUS
S1CODE0D DB        #00,#01,#00,#01
         DB        #00,#01,#00,#01
         DB        #00,#01,#00,#00
                                       PERIOD 
S1CODE0E DB        #00,#00,#60,#00
         DB        #60,#00,#00,#00
         DB        #00,#00,#00,#00
                                       SLASH
S1CODE0F DB        #20,#00,#40,#00
         DB        #80,#00,#00,#01
         DB        #00,#02,#00,#00
                                       NUMERAL ZERO 
S1CODE10 DB        #C0,#0F,#A0,#10
         DB        #20,#11,#20,#12
         DB        #C0,#0F,#00,#00
                                       NUMERAL ONE
S1CODE11 DB        #00,#00,#20,#08
         DB        #E0,#1F,#20,#00
         DB        #00,#00,#00,#00
                                       NUMERAL TWO
S1CODE12 DB        #60,#08,#A0,#10
         DB        #20,#11,#20,#12
         DB        #20,#0C,#00,#00
                                       NUMERAL THREE
S1CODE13 DB        #40,#08,#20,#10
         DB        #20,#12,#20,#12
         DB        #C0,#0D,#00,#00
                                       NUMERAL FOUR 
S1CODE14 DB        #00,#01,#00,#03
         DB        #00,#05,#00,#09
         DB        #E0,#1F,#00,#00
                                       NUMERAL FIVE 
S1CODE15 DB        #20,#1E,#20,#12
         DB        #20,#12,#20,#12
         DB        #C0,#11,#00,#00
                                       NUMERAL SIX
S1CODE16 DB        #C0,#07,#20,#0A
         DB        #20,#12,#20,#12
         DB        #C0,#01,#00,#00
                                       NUMERAL SEVEN
S1CODE17 DB        #00,#10,#60,#10
         DB        #80,#11,#00,#16
         DB        #00,#18,#00,#00
                                       NUMERAL EIGHT
S1CODE18 DB        #C0,#0D,#20,#12
         DB        #20,#12,#20,#12
         DB        #C0,#0D,#00,#00
                                       NUMERAL NINE 
S1CODE19 DB        #00,#0E,#20,#11
         DB        #20,#11,#40,#11
         DB        #80,#0F,#00,#00
                                       COLON
S1CODE1A DB        #00,#00,#60,#06
         DB        #60,#06,#00,#00
         DB        #00,#00,#00,#00
                                       SEMICOLON
S1CODE1B DB        #08,#00,#70,#06
         DB        #60,#06,#00,#00
         DB        #00,#00,#00,#00
                                       LESS THAN
S1CODE1C DB        #00,#01,#80,#02
         DB        #40,#04,#20,#08
         DB        #00,#00,#00,#00
                                       EQUAL
S1CODE1D DB        #80,#02,#80,#02
         DB        #80,#02,#80,#02
         DB        #80,#02,#00,#00
                                       GREATER THAN 
S1CODE1E DB        #00,#00,#20,#08
         DB        #40,#04,#80,#02
         DB        #00,#01,#00,#00
                                       QUESTION MARK
S1CODE1F DB        #00,#18,#00,#20
         DB        #A0,#23,#00,#24
         DB        #00,#18,#00,#00
                                       COMMERICAL AT
S1CODE20 DB        #C0,#03,#20,#04
         DB        #90,#05,#D0,#05
         DB        #90,#03,#00,#00
                                       CAPITAL A
S1CODE21 DB        #E0,#0F,#00,#12
         DB        #00,#22,#00,#12
         DB        #E0,#0F,#00,#00
                                       CAPITAL B
S1CODE22 DB        #E0,#3F,#20,#24
         DB        #20,#24,#20,#24
         DB        #C0,#1B,#00,#00
                                       CAPITAL C
S1CODE23 DB        #C0,#1F,#20,#20
         DB        #20,#20,#20,#20
         DB        #40,#10,#00,#00
                                       CAPITAL D
S1CODE24 DB        #E0,#3F,#20,#20
         DB        #20,#20,#40,#10
         DB        #80,#0F,#00,#00
                                       CAPITAL E
S1CODE25 DB        #E0,#3F,#20,#22
         DB        #20,#22,#20,#22
         DB        #20,#20,#00,#00
                                       CAPITAL F
S1CODE26 DB        #E0,#3F,#00,#22
         DB        #00,#22,#00,#22
         DB        #00,#20,#00,#00
                                       CAPITAL G
S1CODE27 DB        #C0,#1F,#20,#20
         DB        #20,#21,#20,#21
         DB        #C0,#19,#00,#00
                                       CAPITAL H
S1CODE28 DB        #E0,#3F,#00,#02
         DB        #00,#02,#00,#02
         DB        #E0,#3F,#00,#00
                                       CAPITAL I
S1CODE29 DB        #20,#20,#20,#20
         DB        #E0,#3F,#20,#20
         DB        #20,#20,#00,#00
                                       CAPITAL J
S1CODE2A DB        #40,#00,#20,#00
         DB        #20,#20,#C0,#3F
         DB        #00,#20,#00,#00
                                       CAPITAL K
S1CODE2B DB        #E0,#3F,#00,#03
         DB        #80,#04,#40,#08
         DB        #20,#30,#00,#00
                                       CAPITAL L
S1CODE2C DB        #E0,#3F,#20,#00
         DB        #20,#00,#20,#00
         DB        #20,#00,#00,#00
                                       CAPITAL M
S1CODE2D DB        #E0,#3F,#00,#10
         DB        #00,#08,#00,#10
         DB        #E0,#3F,#00,#00
                                       CAPITAL N
S1CODE2E DB        #E0,#3F,#00,#18
         DB        #00,#06,#C0,#01
         DB        #E0,#3F,#00,#00
                                       CAPITAL O
S1CODE2F DB        #C0,#1F,#20,#20
         DB        #20,#20,#20,#20
         DB        #C0,#1F,#00,#00
                                       CAPITAL P
S1CODE30 DB        #E0,#3F,#00,#22
         DB        #00,#22,#00,#22
         DB        #00,#1C,#00,#00
                                       CAPITAL Q
S1CODE31 DB        #C0,#1F,#20,#20
         DB        #20,#20,#30,#20
         DB        #C8,#1F,#00,#00
                                       CAPITAL R
S1CODE32 DB        #E0,#3F,#00,#23
         DB        #80,#22,#40,#22
         DB        #20,#1C,#00,#00
                                       CAPITAL S
S1CODE33 DB        #40,#1C,#20,#22
         DB        #20,#22,#20,#22
         DB        #C0,#11,#00,#00
                                       CAPITAL T
S1CODE34 DB        #00,#20,#00,#20
         DB        #E0,#3F,#00,#20
         DB        #00,#20,#00,#00
                                       CAPITAL U
S1CODE35 DB        #C0,#3F,#20,#00
         DB        #20,#00,#20,#00
         DB        #C0,#3F,#00,#00
                                       CAPITAL V
S1CODE36 DB        #00,#3C,#80,#03
         DB        #60,#00,#80,#03
         DB        #00,#3C,#00,#00
                                       CAPITAL W
S1CODE37 DB        #E0,#3F,#40,#00
         DB        #80,#00,#40,#00
         DB        #E0,#3F,#00,#00
                                       CAPITAL X
S1CODE38 DB        #60,#30,#80,#09
         DB        #00,#06,#80,#09
         DB        #60,#30,#00,#00
                                       CAPITAL Y
S1CODE39 DB        #00,#38,#00,#04
         DB        #E0,#07,#00,#04
         DB        #00,#38,#00,#00
                                       CAPITAL Z
S1CODE3A DB        #E0,#30,#20,#21
         DB        #20,#22,#20,#24
         DB        #60,#38,#00,#00
                                       LEFT CLOSURE [ 
S1CODE3B DB        #00,#00,#00,#00
         DB        #F0,#3F,#10,#20
         DB        #10,#20,#00,#00
                                       REVERSE SLASH
S1CODE3C DB        #00,#04,#00,#02
         DB        #00,#01,#80,#00
         DB        #40,#00,#00,#00
                                       RIGHT CLOSURE
S1CODE3D DB        #10,#20,#10,#20
         DB        #F0,#3F,#00,#00
         DB        #00,#00,#00,#00
                                       'HAT 
S1CODE3E DB        #00,#04,#00,#08
         DB        #00,#10,#00,#08
         DB        #00,#04,#00,#00
                                       UNDERLINE
S1CODE3F DB        #08,#00,#08,#00
         DB        #08,#00,#08,#00
         DB        #08,#00,#00,#00
                                       SMALL REVERSE SLASH
S1CODE40 DB        #00,#00,#00,#00
         DB        #00,#20,#00,#10
         DB        #00,#00,#00,#00
                                       SMALL LETTER A 
S1CODE41 DB        #C0,#00,#20,#05
         DB        #20,#05,#20,#05
         DB        #E0,#03,#00,#00
                                       SMALL LETTER B 
S1CODE42 DB        #E0,#3F,#40,#02
         DB        #20,#04,#20,#04
         DB        #C0,#03,#00,#00
                                       SMALL LETTER C 
S1CODE43 DB        #C0,#03,#20,#04
         DB        #20,#04,#20,#04
         DB        #40,#02,#00,#00
                                       SMALL LETTER D 
S1CODE44 DB        #C0,#03,#20,#04
         DB        #20,#04,#20,#04
         DB        #E0,#3F,#00,#00
                                       SMALL LETTER E 
S1CODE45 DB        #C0,#03,#20,#05
         DB        #20,#05,#20,#05
         DB        #20,#03,#00,#00
                                       SMALL LETTER F 
S1CODE46 DB        #20,#04,#E0,#1F
         DB        #20,#24,#00,#20
         DB        #00,#10,#00,#00
                                       SMALL LETTER G 
S1CODE47 DB        #50,#03,#A8,#04
         DB        #A8,#04,#A8,#04
         DB        #10,#0B,#00,#00
                                       SMALL LETTER H 
S1CODE48 DB        #E0,#3F,#00,#02
         DB        #00,#04,#00,#04
         DB        #E0,#03,#00,#00
                                       SMALL LETTER I 
S1CODE49 DB        #20,#04,#E0,#27
         DB        #20,#00,#00,#00
         DB        #00,#00,#00,#00
                                       SMALL LETTER J 
S1CODE4A DB        #00,#00,#04,#00
         DB        #04,#04,#F8,#27
         DB        #00,#00,#00,#00
                                       SMALL LETTER K 
S1CODE4B DB        #E0,#3F,#00,#01
         DB        #80,#01,#40,#02
         DB        #20,#04,#00,#00
                                       SMALL LETTER L 
S1CODE4C DB        #00,#00,#00,#00
         DB        #20,#20,#E0,#3F
         DB        #20,#00,#00,#00
                                       SMALL LETTER M 
S1CODE4D DB        #E0,#07,#00,#04
         DB        #E0,#03,#00,#04
         DB        #E0,#07,#00,#00
                                       SMALL LETTER N 
S1CODE4E DB        #E0,#07,#00,#02
         DB        #00,#04,#00,#04
         DB        #E0,#03,#00,#00
                                       SMALL LETTER O 
S1CODE4F DB        #C0,#03,#20,#04
         DB        #20,#04,#20,#04
         DB        #C0,#03,#00,#00
                                       SMALL LETTER P 
S1CODE50 DB        #FC,#07,#20,#04
         DB        #20,#04,#20,#04
         DB        #C0,#03,#00,#00
                                       SMALL LETTER Q 
S1CODE51 DB        #C0,#03,#20,#04
         DB        #20,#04,#20,#04
         DB        #FC,#07,#00,#00
                                       SMALL LETTER R 
S1CODE52 DB        #E0,#07,#00,#02
         DB        #00,#04,#00,#04
         DB        #00,#02,#00,#00
                                       SMALL LETTER S 
S1CODE53 DB        #40,#02,#20,#05
         DB        #20,#05,#20,#05
         DB        #C0,#04,#00,#00
                                       SMALL LETTER T 
S1CODE54 DB        #00,#04,#00,#04
         DB        #C0,#3F,#20,#04
         DB        #20,#04,#00,#00
                                       SMALL LETTER U 
S1CODE55 DB        #C0,#07,#20,#00
         DB        #20,#00,#20,#00
         DB        #C0,#07,#00,#00
                                       SMALL LETTER V 
S1CODE56 DB        #00,#06,#80,#01
         DB        #60,#00,#80,#01
         DB        #00,#06,#00,#00
                                       SMALL LETTER W 
S1CODE57 DB        #C0,#07,#20,#00
         DB        #C0,#00,#20,#00
         DB        #C0,#07,#00,#00
                                       SMALL LETTER X 
S1CODE58 DB        #20,#04,#40,#02
         DB        #80,#01,#40,#02
         DB        #20,#04,#00,#00
                                       SMALL LETTER Y 
S1CODE59 DB        #04,#07,#88,#00
         DB        #50,#00,#60,#00
         DB        #80,#07,#00,#00
                                       SMALL LETTER Z 
S1CODE5A DB        #20,#06,#60,#04
         DB        #A0,#04,#20,#05
         DB        #60,#06,#00,#00
                                       LEFT BRACKET [ 
S1CODE5B DB        #00,#00,#00,#01
         DB        #F0,#1E,#08,#20
         DB        #08,#20,#00,#00
                                       ELONGATED COLON
S1CODE5C DB        #00,#00,#E0,#3D
         DB        #E0,#3D,#00,#00
         DB        #00,#00,#00,#00
                                       RIGHT BRACKET ]
S1CODE5D DB        #08,#20,#08,#20
         DB        #F0,#1E,#00,#01
         DB        #00,#00,#00,#00
                                       APPROXIMATE
S1CODE5E DB        #00,#10,#00,#20
         DB        #00,#10,#00,#10
         DB        #00,#20,#00,#00
                                       RUB OUT
S1CODE5F DB        #C0,#1F,#C0,#1F
         DB        #C0,#1F,#C0,#1F
         DB        #C0,#1F,#00,#00
                                        CURSOR
S1CODE60 DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
                                        CHCURSOR
S1CODE61 DB        #00,#00,#00,#00
         DB        #80,#00,#C0,#01
         DB        #80,#00,#00,#00
M0CODE5F DB        #F0,#1F,#F0,#1F     RUBOUT 
         DB        #F0,#1F,#F0,#1F
         DB        #F0,#1F,#F0,#1F
         DB        #F0,#1F,#F0,#1F
M0CODE60 DB        #01,#00,#01,#00     CURSOR 
         DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
         DB        #01,#00,#01,#00
M0CODE61 DB        #00,#00,#00,#00     CHCURSOR 
         DB        #00,#00,#00,#01
         DB        #80,#03,#00,#01
         DB        #00,#00,#00,#00
LWA       EQU    *
          EJECT 
IST.STK   EQU    LWA+45      PROCESSOR STACK
G.BEGIN   EQU    LWA+45 
********************
* 
*               TERMINAL VARIABLES AND SCRATCH AREA 
* 
********************
KBAADR    EQU    LWA+45      KB TO ASCII CONVERT
BIAS      EQU    KBAADR+2    BIAS OF Y COORDINATE 
BYPASS    EQU    BIAS+2      BY PASS CONDITION FLAG 
CHBASE    EQU    BYPASS+1 
CLK.1     EQU    CHBASE+2 
CLK.2     EQU    CLK.1+1
CLOCK     EQU    CLK.2+1     BLINK CURSOR CLOCK 
CMODE     EQU    CLOCK+2     COMMAND MODE 
CRLFFG    EQU    CMODE+1     CR/LF FLAG 
CTLADR    EQU    CRLFFG+1    CONTROL CODES BASE ADR.
DASH      EQU    CTLADR+2    DASH/SOLID VECTOR FLAG 
DARK      EQU    DASH+1      DARK VECTOR FLAG 
D.CNTL2P  EQU    DARK+1      TEMP DISPLAY CONTROL WORD
D.CNTL2D  EQU    D.CNTL2P+1  TEMP DISPLAY CONTROL WORD
DOTS      EQU    D.CNTL2D+1  DOT MOVEMENT FOR GIN MODE
ECURSOR   EQU    DOTS+1      ERASE BITS FOR CURSOR
ESCADR    EQU    ECURSOR+1   ESCAPE SEQUENCE BASE ADR.
E.CNTR    EQU    ESCADR+2 
EREG      EQU    E.CNTR+1 
ESEGLEN   EQU    EREG+1      ERASE SEGMENT LENGTH 
G.CNTL2   EQU    ESEGLEN+1
G.CTLFLG  EQU    G.CNTL2+1   CTL MODE FLAG
G.DDIR    EQU    G.CTLFLG+1 
G.ESC     EQU    G.DDIR+1 
G.MEMSEL  EQU    G.ESC+1
G.MODE    EQU    G.MEMSEL+2 
G.SIZE    EQU    G.MODE+1 
G.SUPCUR  EQU    G.SIZE+1 
G.TTYFLG  EQU    G.SUPCUR+1 
G.XPOS    EQU    G.TTYFLG+1 
G.YPOS    EQU    G.XPOS+2 
GIN.KEY   EQU    G.YPOS+2 
HEIGHT    EQU    GIN.KEY+1
HIX       EQU    HEIGHT+1 
HIY       EQU    HIX+2
KBDATA    EQU    HIY+2
LINEND    EQU    KBDATA+1 
LOC.RMT   EQU    LINEND+2 
LOX       EQU    LOC.RMT+1
LOY       EQU    LOX+1
MREG      EQU    LOY+1
NBYTES    EQU    MREG+1 
NREG      EQU    NBYTES+1 
M.MODEP   EQU    NREG+1 
NINPUT    EQU    M.MODEP+1
PAGEND    EQU    NINPUT+1 
PAGEFULL  EQU    PAGEND+2 
PMC.FLG   EQU    PAGEFULL+1 
SAVE      EQU    PMC.FLG+1
SCALEFG   EQU    SAVE+2 
SELECT.M  EQU    SCALEFG+1
SH.SUP    EQU    SELECT.M+2 
TSTAT     EQU    SH.SUP+1 
BTWICE    EQU    TSTAT+1
VECFLAG   EQU    BTWICE+1 
WCURSOR   EQU    VECFLAG+1    WRITE BITS FOR CURSOR 
WEFLAG    EQU    WCURSOR+1
WIDTH     EQU    WEFLAG+1 
WSEGLEN   EQU    WIDTH+1     WRITE SEGMENT LENGTH 
X1        EQU    WSEGLEN+1
Y1        EQU    X1+2 
X2        EQU    Y1+2 
Y2        EQU    X2+2 
* 
*        TRANSMIT BUFFER
* 
TXBUF     EQU    Y2+2 
* 
*        RECEIVE BUFFER 
* 
RXBUF     EQU    TXBUF+11 
BC.REG    EQU    RXBUF+258
*        PLATO OPERATIONS CHARACTER FLAGS NOTE ORDER
BLOCKX    EQU    BC.REG+1 
BLOCKY    EQU    BLOCKX+2 
XEND      EQU    BLOCKY+2 
YEND      EQU    XEND+2 
XDELTA    EQU    YEND+2 
YDELTA    EQU    XDELTA+2 
BLOCKF    EQU    YDELTA+2 
MEMREG    EQU    BLOCKF+1 
* 
IN.BUF    EQU    MEMREG+2    KB/TP INPUT BUFFER 
* 
US.FIFO   EQU    IN.BUF+19
COMMAND   EQU    US.FIFO+19 
*        EXTERNAL DEVICE OUTPUT INSTRUCTION 
EXT.OUT   EQU    COMMAND+5
*        EXTERNAL DEVICE INPUT INSTRUCTION
EXT.IN    EQU    EXT.OUT+6
MODEADR   EQU    EXT.IN+3 
G.END     EQU    MODEADR+2
         END       START
