          IDENT  CTMVAC,#C000
        MACHINE  Z80
          TITLE  VAC - VIKING-X AUGMENTED CONTROLWARE
          SPACE  4
*  VAC - Viking-X Augmented Controlware
*
*     R.A.ANDERSON 3/84
*     J.C.BOHNHOFF (feasiblity version) 2/83.
*
*  This program resides in the Viking-X (CDC 721-X0)
*  terminal.  It is loaded by the CYBER host through
*  the 2-port multiplexer.
*
*  The load sequence begins with :  [RS][HT](77)(32)
*  (ASCII control codes are in brackets ,  hex bytes
*  are in parens).  This is followed by the LDA(load
*  address,C000),and the code itself. Each byte sent
*  (load address or code) is encoded as described in
*  the Viking-X Vers. 4.x  E.R.S.  The code sequence
*  terminates with a carriage return.  The VAC pack-
*  age is is now installed in RAM. The resident mon-
*  itor still has control of all terminal functions.
*  The VAC package is activated by the "Host Execute
*  Loaded Controlware" code sequence: [RS][DC2](77).
*  VAC now controls all terminal function.  Resident
*  interrupt routines are used for UART printer, and
*  keyboard control.
          TITLE  RESIDENT DEFINITIONS
**      Viking X Resident Definitions.
          SPACE  2
*       Resident Subroutine Entry Points.

INIT02    EQU    #09         INITIALIZATION 02
CRT80     EQU    #0C         SET CRT TO 80 CHARACTERS PER LINE
CRT132    EQU    #0F         SET CRT TO 132 CHARACTERS PER LINE
ALARM     EQU    #33         SOUND ALARM
BFTB      EQU    #3C         COMMUNICATIONS BUFFER TO B
BLDADD    EQU    #3F         BUILD ADDRESS
DSTRNG    EQU    #63         DATA STRING
KINPUT    EQU    #6F         KEYBOARD INPUT
SEND      EQU    #84         SEND NEXT CODE FROM COMMUNICATIONS BUFFER
SENDB     EQU    #87         STORE B IN COMMUNICATIONS SEND BUFFER
SETDE     EQU    #8A         SET CURSOR TO DE
KBDUNL    EQU    #C9         UNLOCK KEYBOARD
PILSR     EQU    #CC         INPUT PRINTER LSR
PRINTC    EQU    #CF         PRINT NEXT CHARACTER
PTTRAP    EQU    #D2         PRINTER INPUT TRAP
          SPACE  3
*         RAM / EQUates.

BFCNT     EQU    #E083       NUMBER OF CHARACTERS IN COMM BUFFER
KBCNT     EQU    #E089       NUMBER OF CHARACTERS IN KEYBOARD BUFFER
TXCNT     EQU    #E08E       NUMBER OF CHARACTERS IN TRANSMIT BUFFER
CNTRL     EQU    #E0B5       CONTROL KEY ACTIVE ODD=TRUE
FLAG1     EQU    #E0BE       FIELD ID SENT
PTXOFF    EQU    #10         2**4 PRINTER X-OFF RECIEVED
HMSGA     EQU    #E0C2       HOST MESSAGE ACTIVE
KBINP     EQU    #E0C9       1=KEYBOARD INPUT ACTIVE
LNSIZE    EQU    #E0D4       LINE SIZE, 79 OR 131 STANDARD
PRINTA    EQU    #E0DD       1=PRINT ALL ACTIVE, 3=PRINT NORMAL ACTIVE
RXOFF     EQU    #E0E1       RECEIVED XOFF
SXOFF     EQU    #E0EB       SENT XOFF
NOPTR     EQU    #E0F8       NO PRINTER ASSIGNED
          TITLE  CONTROLWARE CONSTANTS
**        Symbol Definitions.

LDA       EQU    #C000       LOAD ADDRESS
          SPACE  3
**        Function Codes

NUL       EQU    #00         ADVANCE CURSOR                         (NU)
SOH       EQU    #01         START INVERSE 1 CHAR. BEFORE NEXT TEXT (SH)
STX       EQU    #02         POSITION ON SCREEN (STX,x,y)           (SX)
ETX       EQU    #03         END INVERSE AT NEXT CHARACTER          (EX)
EOT       EQU    #04         TRANSFER HIDDEN TO VISIBLE-CLEAR HIDDEN(ET)
ACK       EQU    #06         START UNDERSCORE                       (AK)
SO        EQU    #0E         START BLINK                            (SO)
SI        EQU    #0F         END BLINK                              (SI)
DLE       EQU    #10         START INVERSE                          (DL)
DC4       EQU    #14         END INVERSE                            (D4)
NAK       EQU    #15         END UNDERSCORE                         (NK)
ETB       EQU    #17         TRANSFER HIDDEN TO VISIBLE             (EB)
CLR       EQU    #18         INITIALIZE HIDDEN SCREEN $ PARAMETERS  (CN)
RSET      EQU    #19         INITIALIZE DISPLAY PAGE SELECTION      (EH)
SUB       EQU    #1A         ACTIVATE NON-PRIORITY PARAMETERS       (SB)
ESC       EQU    #1B         ERASE TO END OF LINE                   (EC)
FS        EQU    #1C         START DIM                              (FS)
GS        EQU    #1D         END DIM                                (GS)
RS        EQU    #1E         EXTENDED SEQUENCE FOLLOWS              (RS)
US        EQU    #1F         ACTIVATE PRIORITY PARAMETERS           (US)
          SPACE  3
**        Attribute Constants
*         Only inverse is changed from the resident values.

UNDLN     EQU    #02         UNDERSCORE
INV       EQU    #06         INVERSE
BLINK     EQU    #08         BLINK
DIM       EQU    #10         DIM
PROTD     EQU    #80         PROTECT
          SPACE  3
**        Hidden Screen Mode Bank Selection.
*                BLOCK 0 = BANK 0 (RESIDENT ROM)
*                      4 =      6 (NVM)
*                      8 =      3 (RAM)
*                      C =      4 (DISPLAY RAM)

HSB       EQU    #1C         BANK SELECTIONS FOR HIDDEN SCREEN MODE
BSP       EQU    #70         BANK SELECT PORT
          EJECT
**        Hidden Screen Addressed and Equates

CWSP      EQU    #4FF0       STACK FRAME AREA
HSCM      EQU    #50         MASK TO COMPUTE RAM ADDR. IN HIDDEN SCREEN
HSCF      EQU    #5000       FIRST ADDRESS OF HIDDEN SCREEN
HSCL      EQU    #838F       LAST ADDRESS OF LINE 49
ERLB      EQU    #8498       ERROR LINE BUFFER
CMLB      EQU    #85A0       COMMAND LINE BUFFER
ENHB      EQU    #36A8       LENGTH OF ALL HIDDEN BUFFERS
          SPACE  2
**        Visible Screen Addresses

VIS28     EQU    #FCE8       VISIBLE LINE # 28 (MESSAGE LINE)
LFTRGT    EQU    VIS28+90    TOGGLE MESSAGE AREA
RHTRGT    EQU    VIS28+224   TOGGLE MESSAGE AREA
VIS29     EQU    #FDF0       VISIBLE LINE # 29 (ERROR LINE)
VIS30     EQU    #FEF8       VISIBLE LINE # 30 (COMMAND LINE)
          SPACE  2
**        ASCII Codes

DC1       EQU    #11         X-ON
DC2       EQU    #12
BL        EQU    #20         SPACE
ONE       EQU    #31
FIVE      EQU    #35
AA        EQU    #41
BB        EQU    #42
CC        EQU    #43
DD        EQU    #44
EE        EQU    #45
FF        EQU    #46
GG        EQU    #47
HH        EQU    #48
II        EQU    #49
JJ        EQU    #4A
KK        EQU    #4B
LL        EQU    #4C
MM        EQU    #4D
NN        EQU    #4E
OO        EQU    #4F
PP        EQU    #50
RR        EQU    #52
SS        EQU    #53
TT        EQU    #54
UU        EQU    #55
VV        EQU    #56
WW        EQU    #57
XX        EQU    #58
YY        EQU    #59
ZZ        EQU    #5A

          LIST   -L
          PURGMAC SET
SET       MACRO  BIT         SET     BIT,(IY)
          IFEQ   BIT,1
          DATA   #FD,#CB,0,#CE
          ENDIF
          IFEQ   BIT,2
          DATA   #FD,#CB,0,#D6
          ENDIF
          IFEQ   BIT,3
          DATA   #FD,#CB,0,#DE
          ENDIF
          IFEQ   BIT,4
          DATA   #FD,#CB,0,#E6
          ENDIF
          ENDM
          LIST   L
          ORG    LDA
INIT      TITLE  INITIALIZATION
**        INIT - INITIALIZE
*
*         INITIALIALIZE THE VIKING-X FOR PROPER MODES

INIT      LD     A,HSB       SELECT HIDDEN SCREEN BANKS
          OUT    (BSP),A

          LD     (SPSA),SP   SAVE CURRENT STACK POINTER
          LD     SP,CWSP     RESET STACK POINTER

          LD     HL,LINE30   SET TO 30 LINE MODE
          CALL   DSTRNG

          XOR    A           CLEAR RECIEVED X-OFF
          LD     (RXOFF),A

          INC    A           SET KBINP TO 1 FOR KEYBOARD ACTIVE
          LD     (KBINP),A

          LD     IY,ATT      SET IY TO CONTAIN ATTRIBUTE

          LD     HL,HSCF     ERASE ENTIRE BUFFER
          LD     (HL),BL     PRIME WITH A BLANK
          INC    HL
          LD     (HL),PROTD  AND THE PROTECT ATTRIBUTE
          DEC    HL
          LD     DE,HSCF+2
          LD     BC,ENHB
          LDIR

          CALL   KBDUNL      UNLOCK THE KEYBOARD

          CALL   MVH         SO OPERATOR SEES BLANK SCREEN

          LD     HL,FRSTMSG  PLACE MESSAGE ON SCREEN
          CALL   DSTRNG
HSM       TITLE  MONITORS
**        HSM - HIDDEN SCREEN MONITOR.

HSM       CALL   MTR         PROCESS MAIN TERMINAL FUNCTIONS
          JR     Z,HSM       LOOP IF NO DOWNLINE DATA

          CALL   BFTB        GET THE DOWNLINE BYTE
          EI                 ENABLE INTERRUPTS

*         TEST FOR A FUNCTION CODE

          LD     A,B         COPY BYTE INTO A
          CP     BL          IF NOT FUNCTION
          JP     P,HSM1      THEN VALID DATA BYTE

*         PROCESS A FUNCTION CODE.

          PUSH   AF          SAVE BYTE
          CALL   PFC         PROCESS FUNCTION CODE
          POP    AF          GET BYTE BACK
          LD     (PREV),A    AND SAVE FOR POSTERITY
          JP     HSM         LOOP FOR MORE DOWNLINE DATA

*         MOVE A DOWNLINE BYTE TO THE HIDDEN PAGE.

HSM1      LD     (PREV),A    SAVE BYTE
          LD     HL,(HSADD)  GET HIDDEN SCREEN CURSOR ADDRESS
          LD     (HL),B      STORE THE DATA BYTE

          LD     A,(INVPS)   TEST IF INVERSE PRIME IS ACTIVE
          AND    A
          CALL   NZ,SIP      IF SO SET PREVIOUS ATTRIBUTE

          INC    HL          STORE THE ATTRIBUTE BYTE
          LD     A,(IY)
          LD     (HL),A

          LD     A,(HSL)     IF BYTE WENT INTO PRIORITY LINE 50 OR 51
          CP     50
          CALL   P,DPB       THEN DISPLAY PRIORITY BYTE

          CALL   ADC         ADVANCE THE CURSOR

          JP     HSM         LOOP FOR MORE DOWNLINE DATA
MTR       EJECT
**        MTR - PROCESS MAIN TERMINAL FUNCTIONS.
*
*         ENTRY    NONE.
*
*         EXIT     'Z' IF NO DOWNLINE DATA IN THE COMMUNICATIONS BUFFER.

MTR       LD     A,(KBCNT)   CHECK KEYBOARD INPUT AVAILABLE
          AND    A
          CALL   NZ,PKB      IF SO, PROCESS INPUT

          LD     A,(TXCNT)   CHECK UPLINE DATA AVAILABLE
          AND    A
          CALL   NZ,SEND     IF SO SEND ONE UPLINE BYTE

          LD     A,(NOPTR)   CHECK SERIAL PRINTER ASSIGNED
          AND    A
          JP     NZ,MTR1     IF NOT

          CALL   PILSR       CHECK PRINTER DATA READY
          AND    1
          CALL   NZ,PTTRAP   IF SO

MTR1      LD     A,(PRINTA)  CHECK PRINT ALL IS ACTIVE
          AND    A
          JP     Z,MTR3      IF NOT

          CALL   PRINTC      PRINT CHARACTER
MTR2      XOR    A
          RET

MTR3      LD     A,(FLAG1)   CHECK PRINTER XOFF RECEIVED
          AND    PTXOFF
          JR     NZ,MTR2     IF SO

          LD     HL,(BFCNT)  CHECK DOWNLINE DATA AVAILABLE
          LD     A,L
          OR     H
          RET
MVH       TITLE  TRANSFER FROM BUFFERS TO DISPLAY
**        MVH - MOVE THE SELECTED PAGE(S) TO THE VISIBLE SCREEN
*
*         RETURNS VIA DPL (DISPLAY PRIORITY LINES)

MVH       LD     HL,(HSC)    SAVE THE HIDDEN CURSOR POSITION
          PUSH   HL
          LD     HL,#0300    SET FOR 4 LINES AT TOP OF SCREEN
          LD     (VSL),HL
          LD     HL,0        ASSUME LEFT SCREEN IS DISPLAYED
          LD     (HSC),HL
          LD     A,(SCREEN)  IF SCREEN NOT DUAL
          AND    A
          JR     NZ,MVH4     THEN

          LD     A,(LNSIZE)  ELSE IF VIDEO CHANGED
          CP     131
          CALL   NZ,CRT132   THEN CHANGE TO 132 COLUMN

          CALL   TDL         TRANSFER THE LEFT HEADER
          LD     HL,#0044    RESET HSC = 68,HSL = 0
          LD     (HSC),HL
          CALL   TDL         TRANSFER THE RIGHT HEADER

          LD     HL,#1604    SET FOR 23 LINES BEGINNING AT FIFTH
          LD     (VSL),HL
          LD     HL,#0400    RESET HSL AND HSC ASSUME TOP PAGE
          LD     (HSC),HL
          LD     A,(LPAGE)   IF LEFT NOT TOP
          AND    A
          JR     NZ,MVH2     THEN BOTTOM
          LD     A,(RPAGE)   ELSE IF RIGHT NOT TOP
          AND    A
          JR     NZ,MVH3     THEN TRANSFER LEFT-TOP RIGHT-BOTTOM

MVH1      CALL   TDL         AND TRANSFER A LEFT SCREEN
          LD     HL,#0444    RESET HSC = 68,HSL = 4
          LD     (HSC),HL
MVH1.1    CALL   TDL         TRANSFER LAST SCREEN
          JP     DTM

MVH2      LD     A,27        SET TO LINE 28 OF HIDDEN BUFFER
          LD     (HSL),A
          LD     A,(RPAGE)   IF RIGHT NOT TOP
          AND    A
          JR     Z,MVH1      THEN TRANSFER LEFT-BOTTOM RIGHT-TOP

MVH3      CALL   TDL         TRANSFER A LEFT SCREEN
          LD     HL,#1B44    RESET HSC = 68,HSL = 27
          LD     (HSC),HL
          JR     MVH1.1      TRANSFER RIGHT-BOTTOM SCREEN
          EJECT
MVH4      LD     A,(LNSIZE)  IF VIDEO CHANGED
          CP     79
          CALL   NZ,CRT80    THEN CHANGE VIDEO TO 80 COLUMN

          LD     A,(SCREEN)  IF NOT LEFT SCREEN ONLY
          CP     1
          JR     NZ,MVH7     THEN RIGHT ONLY

          CALL   TDL         TRANSFER THE HEADER FOR THE LEFT SCREEN
          LD     HL,#1604    SET FOR 23 LINES BEGINNING AT LINE 5
          LD     (VSL),HL
          LD     A,(LPAGE)   IF NOT TOP HALF OF LEFT SCREEN
          AND    A
          JR     NZ,MVH6     THEN BOTTOM

MVH5      LD     A,4         SET HIDDEN TO LINE 4
          LD     (HSL),A
          JR     MVH1.1      TRANSFER THE TOP OF PAGE TO VISIBLE

MVH6      LD     A,27        SET FOR THE BOTTOM HALF OF DISPLAY
          LD     (HSL),A
          JR     MVH1.1      TRANSFER THE BOTTOM 1/2 OF SCREEN

MVH7      LD     A,68        SET FOR RIGHT SCREEN HEADER
          LD     (HSC),A
          CALL   TDL         AND TRANSFER IT
          LD     HL,#1604    SET FOR 23 LINES BEGINNING AT LINE 5
          LD     (VSL),HL
          LD     A,(RPAGE)   IF TOP HALF OF RIGHT SCREEN
          AND    A
          JR     Z,MVH5      THEN

          JR     MVH6        ELSE BOTTOM
TDL       EJECT
**        TDL - TRANSFER THE DESIRED LINES
*
*         ENTRY - LINC,HSL,HSC,AND VSL ARE SET
*
*         EXIT - RETURNS VIA MTR

TDL       CALL   HSA         GET THE HIDDEN SCREEN POSITION
          PUSH   HL          AND SAVE IT

          LD     A,(VSL)     PUT VIS. SCREEN LINE # IN A
          LD     L,A
          LD     H,#E0
          CALL   BLDADD      TO SET DE AS A POINTER TO VISUAL BUFFER
          LD     A,(SCREEN)  IS IT A RIGHT SCREEN ONLY
          CP     2
          JR     Z,TDL1      IF SO

          LD     A,(HSC)
          AND    A
          JR     Z,TDL1      IF NEED TO SHIFT VIS. PNTR FOR DUAL SCREEN

          LD     BC,136      ADD OFFSET INTO VISUAL LINE
          EX     DE,HL
          ADD    HL,BC
          EX     DE,HL       DE POINTS TO VISIBLE ADDRESS

TDL1      POP    HL          HL POINTS TO HIDDEN ADDRESS
          LD     A,(LINC)    GET THE LINE COUNTER

TDL2      LD     BC,128
          LDIR               TRANSFER THE LINE
          LD     BC,136      RESET FOR NEXT LINE
          EX     DE,HL
          ADD    HL,BC
          EX     DE,HL       DE POINTS TO THE NEXT VISUAL LINE
          ADD    HL,BC       HL POINTS TO THE NEXT HIDDEN LINE
          DEC    A           DECRIMENT THE LINE COUNTER
          JP     NZ,TDL2     GO FOR MORE
          LD     BC,128      NUMBER OF CHARACTERS IN LAST LINE

*         UNDERSCORE LAST LINE EACH TRANSFER (LINE 4 OR 27)

TDL3      LDI                TRANSFER A CHARACHTER
          LD     A,(HL)      GET THE ATTRIBUTE
          OR     UNDLN       ADD THE UNDERLINE ATTRIBUTE
          LD     (HL),A      REPLACE IT
          LDI                TRANSFER THE ATTRIBUTE
          LD     A,B         AND TEST FOR LAST BYTE
          OR     C
          JP     NZ,TDL3

          JP     MTR         PROCESS MONITOR FUNCTIONS AND RETURN
MMS       EJECT
**        MMS - MOVES THE MESSAGE TO THE SCREEN

MMS       LD     A,(HL)      IS THERE A MESSAGE?
          AND    A
          JR     Z,MMS3      IF NOT

          INC    HL          GET PAGE SELECTION
          LD     A,(HL)      IS PAGE AT TOP?
          AND    A
          LD     A,B         COPY NUMERAL INTO A
          JR     NZ,MMS2     IF NOT

          LD     HL,LOWER    TRANSFER 'FOR LOWER ' MESSAGE
MMS1      LD     BC,24       SET BYTE COUNTER
          LDIR
          LD     (IX+2),A    PLACE THE NO. IN THE MESSAGE
          RET                RETURN

MMS2      LD     HL,UPPER    TRANSFER 'FOR UPPER' MESSAGE
          JR     MMS1

MMS3      LD     HL,VIS28    ERASE MESSAGE ON SCREEN
          LD     BC,24       SET BYTE COUNTER
          LDIR
          RET                RETURN
          SPACE  3
**        DTM - DISPLAY TOGGLE MESSAGE
*
*         EXIT - VIA DPL

DTM       POP    HL          RESTORE HIDDEN SCREEN ADDRESS
          LD     (HSC),HL

          LD     DE,LFTRGT   DE POINTS TO LEFT/SINGLE DISPLAY TARGET
          LD     IX,LFTRGT   AS DOES IX

          LD     A,(SCREEN)  RIGHT SCREEN ONLY DISPLAYED?
          CP     2
          JR     Z,DTM1      IF SO

          LD     B,ONE       PUT NUMERAL 1 INTO B
          LD     HL,LPTGL    HL = LPTGL
          CALL   MMS         MOVE MESSAGE TO SCREEN
          LD     A,(SCREEN)  IF LEFT SCREEN ONLY DISPLAYED
          AND    A
          JR     NZ,DPL      DISPLAY PRIORITY LINES

          LD     DE,RHTRGT   RE-AIM DESTINATION OF MESSAGE
          LD     IX,RHTRGT   AND IX

DTM1      LD     B,FIVE      PLACE NUMERAL 2 INTO B
          LD     HL,RPTGL    (HL) = IF THERE IS A RIGHT MESSAGE
          CALL   MMS         DISPLAY IT
*         JR     DPL         DISPLAY PRIORITY
DPL       EJECT
**        DPL - DISPLAY PRIORITY LINES
*
*         RETURNS VIA SETTING THE CURSOR ON COMMAND LINE

DPL       LD     HL,ERLB     SET UP BLOCK MOVE FROM PRIORITY BUFFER
          LD     DE,VIS29    TO DISPLAY RAM
          LD     BC,160
          LDIR               TRANSFER THE ERROR LINE

          LD     HL,CMLB     NOW MOVE THE COMMAND LINE
          LD     DE,VIS30    TO DISPLAY RAM
          LD     BC,160
          LDIR

          LD     A,(PRCUR)   GET COMMAND LINE CURSOR POSITION
          LD     D,A         SET UP DE AS A POINTER
          LD     E,29        LINE 29
          JP     SETDE       PUT CURSOR ON COMMAND LINE (RETURN)
          SPACE  3
**        DPB - DISPLAY ONE PRIORITY BYTE
*

DPB       LD     A,(HSL)     GET LINE NUMBER
          CP     51          IF IT IS THE ERROR LINE
          JR     Z,DPB2      THEN

          LD     DE,VIS30    COPY COMMAND LINE ADDRESS INTO DE

DPB1      LD     A,(HSC)     GET CURSOR OFFSET INTO LINE
          RLCA               DOUBLE FOR ATTRIBUTE
          LD     L,A
          LD     H,0
          ADC    HL,DE       GET VISIBLE SCREEN POSITION
          LD     (HL),B      PUT BYTE ON SCREEN
          INC    HL
          LD     A,(IY)      AND ITS ATTRIBUTE
          LD     (HL),A
          RET                RETURN

DPB2      LD     DE,VIS29    ELSE COPY ERROR LINE ADDRESS INTO DE
          JP     DPB1
PFC       TITLE  PROCESS FUNCION CODES
**        PFC - PROCESS A FUNCTION CODE.
*
*         ENTRY    A = FUNCTION CODE.

PFC       RLCA               DOUBLE FUNCTION CODE
          LD     E,A         AND PLACE IT IN DE
          LD     D,0
          LD     HL,FUNT     SET HL AS POINTER TO FUNCTION TABLE
          ADC    HL,DE       HL POINTS TO JUMP ADDRESS
          LD     D,(HL)      GET JUMP ADDRESS IN HL
          INC    HL
          LD     E,(HL)
          EX     DE,HL
          JP     (HL)        GO DO FUNCTION
          SPACE  2
**        INP - INVERSE PRIME

INP       LD     (INVPS),A   SET VALUE NON-ZERO
SIN       SET    2,(IY)      START INVERSE VIDEO
SUN       SET    1,(IY)      START UNDERLINE
          RET

**        EIP - END INVERSE PRIME

EIP       LD     HL,(HSADD)  GET THE CURSOR POSITION
          INC    HL          ADVANCE FOR THE ATTRIBUTE
          LD     A,(IY)      PLACE THE CURRENT ATTRIBUTE INTO PLACE
          LD     (HL),A
EIN       RES    2,(IY)      END INVERSE VIDEO
EUN       RES    1,(IY)      END UNDERLINE
          RET

SBL       SET    3,(IY)      START BLINK
          RET

EBL       RES    3,(IY)      END BLINK
          RET

SDI       SET    4,(IY)      START DIM
          RET

EDI       RES    4,(IY)      END DIM
          RET

BES       CALL   GNB         BEGIN EXTENDED SEQUENCE
          LD     A,B
          CP     #33
          JR     Z,DIE       IF NEXT BYTE IS A '3'

          CP     DC2
          JR     Z,LIT       TO TEST FOR TURN ON LIGHT
          CP     DC4
          RET    NZ          IF NOT A DC4
          LD     B,STX       SEND ACKNOWLEDGEMENT
          JP     SENDB       RETURN
          EJECT
DIE       XOR    A           RESET ACTIVE FUNCTION TO OFF
          LD     (HMSGA),A
          POP    HL          CLEAR STACK FOR RETURN TO RESIDENT MONITOR
          POP    HL
          LD     SP,(SPSA)   RESTORE STACK POINTER

NOOP      RET                RETURN
          SPACE  3
**        SIP - SET INVERSE PRIME

SIP       DEC    HL          BACK UP TO PREVIOUS ATTRIBUTE
          LD     A,(IY)      AND STORE THE INVERSE VIDEO ATTRIBUTE
          LD     (HL),A
          INC    HL          RESET HL
          XOR    A           RESET INVPS
          LD     (INVPS),A
          RET                RETURN
          SPACE  3


LIT       CALL   GNB
          LD     HL,LITE+2   (HL) = TURN LIGHT ON OR OFF
          LD     A,B
          CP     EE+#20
          JR     Z,LIT1      IF TURN ON LIGHT
          CP     FF+#20
          RET    NZ          IF NOT TURN OFF LIGHT
LIT1      LD     (HL),B
          CALL   GNB
          LD     HL,LITE+3   (HL) = WHICH LIGHT TO AFFECT
          LD     (HL),B
          LD     HL,LITE
          JP     DSTRNG      TURN ON/OFF LIGHT
          EJECT
**        ADC - ADVANCE CURSOR.
*
*         ENTRY    HSC, HSL = COLUMN, LINE.
*
*         EXIT     HSC, HSL & HSADD ADVANCED.

ADC       LD     A,(HSL)     IF IT IS A VISIBLE LINE
          CP     50
          LD     A,(HSC)     GET READY FOR NEXT TEST
          JP     P,ADC2      THEN TEST FOR END OF LINE

          CP     63          IF CURSOR = 63
          JR     Z,ADC3      THEN RESET TO 0
          CP     131         ELSE IF CURSOR = 131
          JR     Z,ADC4      THEN RESET TO 68

ADC1      INC    A           ELSE ADVANCE CURSOR
          LD     (HSC),A
          LD     HL,(HSADD)  GET HSADD
          INC    HL          ADVANCE IT
          INC    HL
          LD     (HSADD),HL  RESET HSADD
          RET                RETURN

ADC2      CP     79          IF CURSOR < 79
          JP     M,ADC1      THEN JUST ADVANCE IT

ADC3      XOR    A           SET COLUMN 1
          LD     (HSC),A
          JP     HAC         RESET HSADD (RETURN)

ADC4      LD     A,68
          LD     (HSC),A
          JP     HAC         RESET HSADD (RETURN)
MVC       EJECT
**        MVC - MOVE CURSOR.
*
*         RETURNS VIA HAC

MVC       CALL   GNB         GET COLUMN NUMBER
          LD     A,B         COPY BYTE INTO A
          CP     64          IF ON LEFT SCREEN
          JP     M,MVC1      THEN JUMP
          ADD    A,4         ELSE ADD 4 BLANKS FOR CENTER OF SCREEN

MVC1      LD     (HSC),A     SAVE CURSOR COLUMN
          CALL   GNB         GET LINE NUMBER
          LD     A,(PRIOR)   IF IN PRIORITY MODE
          AND    A
          JR     NZ,MVC5     THEN TEST FOR LAST TWO LINES

MVC2      LD     A,49        ELSE IF BEYOND SCREEN
          CP     B
          JP     M,HAC       THEN IGNORE BYTE & RESET HSADD (RETURN)

          LD     A,26        IF UPPER PAGE
          CP     B
          JP     P,MVC4      THEN GO SAVE LINE NUMBER

          LD     A,(HSC)     ELSE CHECK WHICH SCREEN
          CP     64
          LD     A,1         TO SET TOGGLE POSSIBLE
          JP     M,MVC3

          LD     (RPTGL),A   FOR RIGHT SCREEN
          JR     MVC4

MVC3      LD     (LPTGL),A   FOR LEFT SCREEN

MVC4      LD     A,B
          LD     (HSL),A     SAVE NEW CURSOR LINE
          JP     HAC         RESET HSADD (RETURN)

MVC5      LD     A,48        IF NOT ONE OF VISIBLE LINES
          CP     B
          JP     P,MVC2      THEN DO REGULAR TESTS

          INC    B           OTHERWISE JUMP OVER MESSAGE LINE
          INC    B
          JR     MVC4        AND SAVE LINE NUMBER
IPS       EJECT
**        IPS - INITIALIZE PAGE SELECTION
*
*         RESETS PRESENTLY SELECTED SCREEN TO TOP ONLY

IPS       LD     A,(HSC)     IF RIGHT PAGE
          CP     63
          JP     P,IPS1      THEN RESET RIGHT

          XOR    A
          LD     (LPAGE),A   ELSE SET LEFT TO TOP
          LD     (LPTGL),A   TURN TOGGLE OFF
          RET

IPS1      XOR    A
          LD     (RPAGE),A   SET TO TOP
          LD     (RPTGL),A   TURN TOGGLE OFF
          RET
          SPACE  3
**        TRC - TRANSFER AND CLEAR HIDDEN SCREEN
*

TRC       CALL   MVH         TRANSFER THE HIDDEN TO VISIBLE
*         JP     ERP         ERASE THE HIDDEN SCREEN (RET)
          SPACE  3
**        ERP - ERASE PAGE.
*
*         SETS ALL DATA TO SPACE, ALL ATTRIBUTES TO PROTECTED.

ERP       LD     A,BL        PRIME THE MOVE WITH A SPACE CHARACTER
          LD     (HSCF),A
          LD     A,PROTD     AND A PROTECT ATTRIBUTE
          LD     (HSCF+1),A

          LD     HL,HSCF     MOVE FROM HSCF
          LD     DE,HSCF+2   AND PROPOGATE FOR ALL OF THE BUFFER
          LD     BC,HSCL-HSCF
          LDIR

          LD     (ATT),A     RESET TO PROTECT
          LD     (PATT),A
          RET                RETURN
ERL       EJECT
**        ERL - ERASE TO END OF LINE
*
*         ERASES UP THROUGH COLUMN 64 OR 132 IN HIDDEN SCREEN
*         OR COLUMN 80 ON COMMAND LINE.  IF THE PREVIOUS BYTE
*         WAS A SKIP FUNCTION THE CUSOR IS BACKSPACED BEFORE
*         ERASING.  ALSO IF ON THE COMMAND LINE THE VISIBLE
*         CURSOR IS PLACED AT THIS LOCATION.

ERL       LD     A,(PREV)    TEST IF PREVIOUS BYTE WAS A NUL
          AND    A
          JR     NZ,ERL2     IF NOT

          LD     A,(HSL)     TEST IF COMMAND OR ERROR LINE
          CP     50
          LD     A,(HSC)     GET A READY FOR NEXT TEST
          JP     P,ERL1.4    IF SO

          AND    A           TEST IF NOW FIRST COLUMN LEFT SCREEN
          JR     Z,ERL1.2    IF SO

          CP     68          TEST IF NOW FIRST COLUMN RIGHT SCREEN
          JR     Z,ERL1.1    IF SO

ERL1      DEC    A           OTHERWISE JUST BACKSPACE ONE
          LD     (HSC),A
          LD     HL,(HSADD)  BACKUP THE CURSOR ADDRESS ALSO
          DEC    HL
          DEC    HL
          LD     (HSADD),HL  RESET HSADD
          JR     ERL2

ERL1.1    LD     A,131       RESET TO END OF LINE
          JR     ERL1.3

ERL1.2    LD     A,63        RESET TO END OF LINE
ERL1.3    LD     (HSC),A
          CALL   HAC         RESET HSADD
          JR     ERL2.4      GO ERASE LAST POSITION IN LINE

ERL1.4    AND    A           TEST IF NOW FIRST COLUMN PRIORITY LINE
          JR     NZ,ERL1     IF NOT

          LD     A,79        ELSE RESET TO END OF LONG LINE
          LD     (HSC),A
          CALL   HAC         RESET HSADD
          JR     ERL2.5      GO ERASE LAST POSITION IN LINE
          EJECT
ERL2      LD     A,(HSL)     TEST FOR PRIORITY LINE
          CP     50
          JP     P,ERL2.5    IF SO

ERL2.1    LD     A,(HSC)     TEST IF LEFT HIDDEN SCREEN
          CP     63
          JR     Z,ERL2.4    IF LAST CHARACHTER IN LINE
          JP     M,ERL2.3    IF SO
          CP     131         LAST CHARACTER IN RIGHT SCREEN LINE?
          JR     Z,ERL2.4    IF SO
          LD     A,131

ERL2.2    LD     HL,HSC
          SUB    (HL)        NUMBER OF CHARACTERS TO END OF LINE
          LD     C,A
          LD     B,0
          SLA    C           BC IS A BYTE COUNTER
          LD     HL,(HSADD)  HL POINTS TO (HSC,HSL) IN HIDDEN BUFFER
          LD     (HL),BL     CHANGE TO A BLANK
          INC    HL
          LD     (HL),PROTD  RESET ATTRIBUTE
          LD     D,H         COPY HL INTO DE
          LD     E,L
          INC    DE          TO POINT TO NEXT BYTE
          DEC    HL          TO POINT TO BLANK
          LDIR               COPY TO END OF LINE
          RET                RETURN

ERL2.3    LD     A,63        LAST BYTE NUMBER IN LINE
          JP     ERL2.2

ERL2.4    LD     HL,(HSADD)  (HL) =  CURSOR POSITION IN HIDDEN SCREEN
          LD     (HL),BL     ERASE LAST CHARACTER
          INC    HL
          LD     (HL),PROTD  AND RESET ATTRIBUTE
          RET

ERL2.5    LD     A,(HSL)     ERROR OR COMMAND LINE?
          CP     51
          LD     A,(HSC)     GET READY FOR NEXT TEST
          JR     Z,ERL2.6    IF ERROR LINE

          LD     (PRCUR),A   SAVE CURSOR POSITION

ERL2.6    CP     79
          JR     Z,ERL2.7    IF SO

          LD     A,79        ELSE COMPUTE # OF BYTES LEFT IN LINE
          CALL   ERL2.2
          JP     DPL         DISPLAY THE PRIORITY  LINES (RET)

ERL2.7    CALL   ERL2.4
          JP     DPL         DISPLAY THE PRIORITY LINES (RET)
BPR       TITLE  TOGGLE PRIORITY & NON-PRIORITY
**        BPR - BEGIN PRIORITY OUTPUT
*
*         THIS PROCEDURE SETS THE CURSOR, CHARACTER ATTRIBUTE
*         AND FLAGS FOR PRIORITY MODE.

BPR       LD     A,(PRIOR)   TEST IF ALREADY IN PRIORITY MODE
          AND    A
          RET    NZ          IF SO

          INC    A           ELSE SET TO PRIORITY MODE
          LD     (PRIOR),A

          LD     HL,(INVPS)  EXCHANGE INVPS AND PINVPS
          LD     A,L
          LD     L,H
          LD     H,A
          LD     (INVPS),HL

          LD     HL,(HSC)    SAVE HSC & HSL
          LD     (SAVEC),HL
          LD     HL,(PHSC)   REPLACE WITH PRIORITY CURSOR
          LD     (HSC),HL

          LD     IY,PATT     USE PRIORITY ATTRIBUTE

          JR     HAC         RESET HSADD (RETURN-HSM NOW PRIORITY MODE)
          SPACE  3
**        EPR - END PRIORITY OUTPUT

EPR       LD     A,(PRIOR)   TEST IF IN PRIORITY MODE
          AND    A
          RET    Z           IF NOT

          XOR    A           ELSE RESET PRIORITY MODE FALSE
          LD     (PRIOR),A

          LD     HL,(INVPS)  EXCHANGE INVPS AND PINVPS
          LD     A,L
          LD     L,H
          LD     H,A
          LD     (INVPS),HL

          LD     HL,(HSC)    SAVE THE PRIORITY CURSOR
          LD     (PHSC),HL
          LD     HL,(SAVEC)  RESET TO NON-PRIORITY VALUE
          LD     (HSC),HL

          LD     IY,ATT      USE NON-PRIORITY ATTRIBUTE

*         JR     HAC         RESET HSADD (RETURN-NOW NON-PRIORITY MODE)
HAC       TITLE  INTERNAL ROUTINES
**        HAC - HIDDEN SCREEN ADDRESS CHANGED
*
*         ENTRY    HSC, HSL = COLUMN, LINE.
*         EXIT     HSADD ADJUSTED = HL
*         HSA      CALLED TO NOT ALTER HSADD

HAC       CALL   HSA         GET HIDDEN SCREEN ADDRESS
          LD     (HSADD),HL  AND SAVE IT
          RET                RETURN

HSA       LD     A,(HSL)     GET LINE NUMBER
          LD     L,A         COPY INTO HL
          LD     H,0         COMPUTE LINE BIAS (8 BYTES PER LINE)
          SLA    L           TIMES 2
          SLA    L           TIMES 4
          SLA    L           TIMES 8
          RL     H           CARRY INTO H

          ADD    A,HSCM      BIAS FOR HIDDEN BUFFER ADDRESS
          LD     D,A
          LD     E,0         DE POINTS TO THE FIRST BYTE IN LINE HSL
          ADD    HL,DE       AFTER THE BIAS IS ADDED
          EX     DE,HL
          LD     A,(HSC)     GET CURSOR POSITION NUMBER
          LD     L,A         AND PLACE IT IN HL
          LD     H,0
          ADD    HL,HL       DOUBLE IT FOR BYTE OFFSET INTO LINE
          ADD    HL,DE       ADD FIRST BYTE ADDRESS
          RET                RETURN HL SET TO BYTE ADDRESS
          SPACE  3
**        GNB - GET NEXT BYTE FROM HOST.
*
*         EXIT     B = BYTE.

GNB       CALL   MTR         PROCESS MAIN TERMINAL FUNCTIONS
          JR     Z,GNB       IF NO DOWNLINE DATA

          CALL   BFTB        GET THE DATA BYTE
          EI                 ENABLE INTERRUPTS

          LD     A,H         TEST COUNT OF INPUT BUFFER
          AND    A
          RET    NZ          IF GREATER THAN 256

          LD     A,(SXOFF)   HAS AN X-OFF BEEN SENT?
          RRA
          RET    NC          IF NOT

          XOR    A           CLEAR X-OFF FLAG
          LD     (SXOFF),A
          PUSH   BC          SAVE B
          LD     B,DC1       SEND AN X-ON
          CALL   SENDB
          POP    BC          RESTORE B
          RET                RETURN
PKB       TITLE  KEYBOARD INPUT
**        PKB - PROCESS THE KEYBOARD ENTRY
*
*         IF VALID CODE TO SEND TO HOST - RETURN VIA SENDB

PKB       CALL   KINPUT      GET THE RAW KEY-CODE IN THE BUFFER
          LD     A,B         TEST IF KEY DOWN OR UP
          BIT    7,A
          JR     Z,PKB1      IF DOWN

          CP     #A5         TEST FOR CONTROL KEY UP
          JP     Z,PKB4
          CP     #9C         TEST FOR ALL POSSIBILITIES OF SHIFT KEY
          JP     Z,PKB6
          CP     #A4
          JR     Z,PKB6
          CP     #FC
          JR     Z,PKB6
          RET                OTHERWISE IGNORE KEY UP

PKB1      SUB    #10         SHIFT OFFSET INTO TABLE
          LD     HL,KBDT     GET FIRST ADDRESS OF TABLE IN HL
          LD     E,A         SET DE AS OFFSET INTO TABLE
          XOR    A
          LD     D,A
          ADC    HL,DE       HL POINTS TO KEY ENTRY
          LD     B,(HL)      COPY KEY VALUE INTO B
          CP     B           IS IT A NOOP KEY?
          JP     Z,ALARM     ALARM AND RETURN

          LD     A,#7F       TEST FOR A FUNCTION KEY
          CP     B
          JP     M,PKB3

          LD     A,(SHFT)    TEST IF SHIFT KEY IS ACTIVE
          AND    A
          JR     Z,PKB2      IF NOT

          LD     A,B
          CP     #30         TEST FOR )
          JR     Z,PKB9
          CP     #38         TEST FOR *
          JR     Z,PKB10
          CP     #39         TEST FOR (
          JR     Z,PKB11
          CP     #3D         TEST FOR +
          JR     Z,PKB12
          CP     AA          TEST FOR ALPHA
          JP     M,ALARM     IF NOT

PKB2      LD     A,(CNTRL)   TEST IF CONTROL IS ACTIVE
          AND    A
          JP     Z,SENDB     IF NOT SEND CHARACTER

          LD     A,B         COPY KEY VALUE INTO A
          SUB    #40         CONVERT TO CONTROL CHARACTER
          LD     B,A         COPY BACK INTO B

          CP     GG-#40      CONTROL G?
          JR     Z,PKB13
          CP     II-#40      CONTROL I?
          JR     Z,PKB15
          JP     ALARM       ALARM AND RETURN

PKB3      LD     A,B         COPY FUNCTION CODE INTO A
          SUB    #F1
          RLCA               DOUBLE FUNCTION CODE
          LD     E,A         AND PLACE IT IN DE
          LD     D,0
          LD     HL,FKJT     SET HL AS POINTER TO FUNCTION TABLE
          ADC    HL,DE       HL POINTS TO JUMP ADDRESS
          LD     D,(HL)      GET JUMP ADDRESS IN HL
          INC    HL
          LD     E,(HL)
          EX     DE,HL
          JP     (HL)        GO DO FUNCTION

PKB4      XOR    A           CLEAR
PKB5      RRCA               DIVIDE A BY TWO
          LD     (CNTRL),A   OR SET CONTROL FLAG
          RET                RETURN

PKB6      XOR    A           CLEAR
PKB7      LD     (SHFT),A    OR SET SHIFT FLAG
          RET                RETURN

PKB8      LD     HL,PRINTS   SET HL TO MESSAGE TO
          JP     DSTRNG      ACTIVATE PRINT ROUTINE (RETURN)
PKB9      LD     B,#29       SEND A )
          JP     SENDB
PKB10     LD     B,#2A       SEND A *
          JP     SENDB
PKB11     LD     B,#28       SEND A (
          JP     SENDB
PKB12     LD     B,#2B       SEND A +
          JP     SENDB

PKB13     CALL   INIT02      CLEAR INPUT AND OUTPUT BUFFERS
          JP     SENDB       SENT A CONTROL CHARACTER (RETURN)

PKB14     LD     A,(SHFT)
          AND    A
          JP     Z,ALARM     IF SHIFT NOT ACTIVE
          LD     B,II-#40

PKB15     CALL   PKB13
          JP     DIE
FUN       TITLE  PROCESS FUNCTION KEYS
**        FUN - PROCESS DEFINED KEYPRESS

FUN1      LD     A,(LPTGL)   IF NOT POSSIBLE TO TOGGLE TO OTHER PAGE
          AND    A
          RET    Z           THEN RETURN
          LD     HL,LPAGE    ELSE GET CURRENT SELECTION
          JR     FUN5.1
          SPACE  2
FUN2      LD     A,1         SET SCREEN CHOICE TO LEFT ONLY
          LD     (SCREEN),A
          LD     B,3         NOTIFY HOST F2 SELECTED
          JP     SENDB
          SPACE  2
FUN3      XOR    A           SET SCREEN CHOICE TO DUAL
          LD     (SCREEN),A
          LD     B,4         NOTIFY HOST F3 SELECTED
          JP     SENDB
          SPACE  2
FUN4      LD     A,2         SET SCREEN CHOICE TO RIGHT ONLY
          LD     (SCREEN),A
          LD     B,5         NOTIFY HOST F4 SELECTED
          JP     SENDB
          SPACE  2
FUN5      LD     A,(RPTGL)   IF NOT POSSIBLE TO TOGGLE RIGHT SCREEN
          AND    A
          RET    Z           THEN RETURN
          LD     HL,RPAGE    ELSE GET CURRENT SLECTION

FUN5.1    LD     A,(HL)
          CPL                TOGGLE IT
          LD     (HL),A      AND REPLACE IT
          LD     B,2         NOTIFY HOST REFRESH NEEDED
          JP     SENDB

FUN6      LD     B,RS        SEND MULTIPLE CODE SEQUENCE
          CALL   SENDB
          LD     A,(SHFT)    TEST IF SHIFT KEY IS ACTIVE
          AND    A
          JR     Z,FUN6.1    IF NOT
          LD     B,FF+#20    SEND A LOWER CASE F
          JR     FUN6.2      CONTINUE
FUN6.1    LD     B,VV+#20    SEND A LOWER CASE V
FUN6.2    JP     SENDB       REURN

FUN7      LD     B,RS        SEND MULTIPLE CODE SEQUENCE
          CALL   SENDB
          LD     B,WW+#20
          JP     SENDB
HELP      EJECT
HELP      CALL   KINPUT      GET RID OF HELP KEY UP
          CALL   CRT80       SET TO 80 COL FORMAT AND CLEAR SCREEN
          LD     A,80        CHANGE LNSIZE
          LD     (LNSIZE),A
          LD     A,(LPAGE)   PLACE PROPER MESSAGE FOR LEFT SCREEN
          LD     DE,LPI
          CALL   DPM
          LD     A,(RPAGE)   PLACE PROPER MESSAGE FOR RIGHT SCREEN
          LD     DE,RPI
          CALL   DPM
          LD     A,(SCREEN)  IF SCREEN = DUAL
          AND    A
          JR     Z,HELPB     THEN

          CP     1           ELSE IF SCREEN = LEFT
          JR     Z,HELPA     THEN
          LD     DE,LPOI     PUT NO UNDER LEFT
          CALL   DNO
          LD     DE,DPOI     AND UNDER DUAL
          CALL   DNO
          LD     DE,RPOI     PUT YES UNDER RIGHT
          JR     HELPC

HELPA     LD     DE,DPOI     PUT NO UNDER DUAL
          CALL   DNO
          LD     DE,RPOI     AND UNDER RIGHT
          CALL   DNO
          LD     DE,LPOI     PUT YES UNDER LEFT
          JR     HELPC

HELPB     LD     DE,LPOI     PUT NO UNDER LEFT
          CALL   DNO
          LD     DE,RPOI     AND UNDER RIGHT
          CALL   DNO
          LD     DE,DPOI     PUT YES UNDER DUAL

HELPC     LD     C,4         BC = 4
          LDIR               HL = ' YES'
          LD     HL,HELPMSG  DISPLAY THE HELP MESSAGE
          CALL   DSTRNG
          CALL   DPL         DISPLAY THE PRIORITY LINES

HELPD     CALL   MTR         PROCESS MONITOR FUNCTIONS WHILE WAITING
          LD     A,(KBCNT)   IF NO KEYBOARD ENTRY
          AND    A
          JR     Z,HELPD     THEN LOOP
          LD     B,2         NOTIFY HOST TO REFRESH SCREEN
          JP     SENDB       AND RETURN
DPM       EJECT
**        DPM - PLACES PROPER MESSAGE IN HELP DISPLAY
*
*         ENTRY DE POINTS TO TARGET 'A' CONTAINS VALUE OF PAGE SELECTION

DPM       AND    A
          JR     NZ,DPM2     USE BOTTOM
          LD     HL,TOP
DPM1      LD     BC,5        BYTE COUNTER
          LDIR
          RET                RETURN

DPM2      LD     HL,BOTTOM
          JR     DPM1
          SPACE  3
**        DNO - PLACES A 'NO' IN THE HELP DISPLAY
*
*         ENTRY DE POINTS TO TARGET

DNO       LD     HL,NO       HL POINTS TO '  NO'
          LD     C,4         BC=4 AS BYTE COUNTER
          LDIR               TRANSFER
          RET                RETURN
VAR       TITLE  VARIABLES
**        VARIABLES
*
*         ORDER IS CRITICAL FOR SEVERAL PAIRS :
*            HSC/HSL, VSL/LINC, LPTGL/LPAGE, RPTGL/RPAGE, INVPS/PINVPS

HSC       CON    0           HIDDEN SCREEN CURSOR COLUMN (0..131)
HSL       CON    0           HIDDEN SCREEN CURSOR LINE (0..49,51,52)

VSL       CON    0           LINE NUMBER ON VISIBLE SCREEN
LINC      CON    0           NUMBER OF LINES TO TRANSFER TO VISIBLE

LPTGL     CON    0           LEFT PAGE TOGGLE POSSIBLE (BOOLEAN) 0=FALSE
LPAGE     CON    0           BOOLEAN FOR LEFT BOTTOM SELECTED 0=FALSE

RPTGL     CON    0           RIGHT PAGE TOGGLE POSSIBLE (BOOLEAN)0=FALSE
RPAGE     CON    0           BOOLEAN FOR RIGHT BOTTOM SELECTED 0=FALSE

INVPS     CON    0           BOOLEAN FOR NON-PRIORITY INVERSE PRIME
PINVPS    CON    0           BOOLEAN FOR PRIORITY INVERSE PRIME 0=FALSE

SCREEN    CON    0           CONTAINS SCREEN SELECTION   0 = DUAL
                             *                           1 = LEFT ONLY
                             *                           2 = RIGHT ONLY

PREV      CON    0           PREVIOUS DATA BYTE USED TO TEST FOR ADC

HSADD     CON    0,#50       STORAGE SPACE FOR HIDDEN SCREEN ADDRESS

SPSA      CON    0,0         STACK POINTER SAVE AREA

PHSC      CON    0           PRIORITY CURSOR COLUMN

PHSL      CON    52          PRIORITY LINE NUMBER PRESET TO COMMAND LINE

PRCUR     CON    0           PRIORITY CURSOR POSITION

PRIOR     CON    0           BOOLEAN FOR IN PRIORITY MODE 0 = FALSE

ATT       CON    PROTD       CURRENT ATTRIBUTE FOR STORING IN BUFFER

PATT      CON    PROTD       CURRENT PRIORITY ATTRIBUTES

SAVEC     CON    0,0         SPACE FOR SAVING CURSOR WHEN CHANGING MODE

SHFT      CON    0           BOOLEAN FOR SHIFT KEY ACTIVE 0=FALSE

*         Function Table

FUNT      VFD    16/ADC,16/INP,16/MVC      NUL,SOH,STX
          VFD    16/EIP,16/TRC,16/NOOP     ETX,EOT,ENQ
          VFD    16/SUN,16/ALARM,16/NOOP   ACK,BELL,BS
          VFD    16/NOOP,16/NOOP,16/NOOP   HT,LF,VT
          VFD    16/NOOP,16/NOOP,16/SBL    FF,CR,SO
          VFD    16/EBL,16/SIN,16/NOOP     SI,DLE,DC1
          VFD    16/NOOP,16/NOOP,16/EIN    DC2,DC3,DC4
          VFD    16/EUN,16/NOOP,16/MVH     NAK,SV,ETB
          VFD    16/ERP,16/IPS,16/EPR      CLR,RSET,SUB
          VFD    16/ERL,16/SDI,16/EDI      ESC,FS,GS
          VFD    16/BES,16/BPR             RS,US
          EJECT
*         Keyboard Table

KBDT      CON    #FD,#2B,#28,#2D,#29,#00    PRINT,(,',-,),
          CON    #37,#34,#00,#15,#00        7,4,SETUP,->:,LOCK
          CON    #15,#FB,#FA,#38,#35        ->:,SHIFT,BREAK,8,5
          CON    #F1,#31,#41,#51,#FB,#FC    F1,1,A,Q,SHIFT,CONTROL
          CON    #39,#36,#F2,#32,#53        9,6,F2,2,S
          CON    #57,#5A,#20,#00,#00        W,Z,SPACE,
          CON    #F3,#33,#44,#45,#58,#00    F3,3,D,E,X,
          CON    #00,#00,#F4,#34,#46        TERM ANS,ESC,F4,4,F
          CON    #52,#43,#0D,#2E,#33        R,C,NEXT,.,3
          CON    #F5,#35,#47,#54,#56,#00    F5,5,G,T,V,
          CON    #30,#32,#F6,#36,#48        0,2,F6,6,H
          CON    #59,#42,#00,#2C,#31        Y,B,STOP,,,1
          CON    #F7,#37,#4A,#55,#4E,#2A    F7,7,J,U,N,F15
          CON    #00,#00,#00,#38,#4B        LAB, ,F8,8,K
          CON    #49,#4D,#00,#00,#00        I,M,BACK, ,EDIT
          CON    #00,#39,#4C,#4F,#2C,#00    F9,9,L,O,,,
          CON    #0D,#0D,#00,#30,#00        NEXT,,F10,0,;
          CON    #50,#2E,#F9,#FE,#00        P,.,CLEAR,HELP,COPY
          CON    #00,#2D,#00,#00,#2F,#00    F11,-,',[,/,DLETE
          CON    #08,#19,#00,#3D,#00        BS,ERASE,F12,=,{
          CON    #00,#FB,#00,#00,#19         ,SHIFT, ,`,:<-

*         Function Key Jump Table

FKJT      VFD    16/FUN1,16/FUN2,16/FUN3    F1,F2,F3
          VFD    16/FUN4,16/FUN5,16/FUN6    F4,F5,F6
          VFD    16/FUN7,16/ALARM,16/PKB14  F7,F8,CLEAR
          VFD    16/MVH,16/PKB7,16/PKB5     BREAK,SHIFT,CONTROL
          VFD    16/PKB8,16/HELP            PRINT,HELP

*         Toggle Messages

UPPER     CON    FF,#80,BL,#80,BL,#80
          CON    FF,#80,OO,#80,RR,#80
          CON    BL,#80,UU,#80,PP,#80
          CON    PP,#80,EE,#80,RR,#80

LOWER     CON    FF,#80,BL,#80,BL,#80
          CON    FF,#80,OO,#80,RR,#80
          CON    BL,#80,LL,#80,OO,#80
          CON    WW,#80,EE,#80,RR,#80

TOP       CON    UU,PP,PP,EE,RR
BOTTOM    CON    LL,OO,WW,EE,RR
NO        CON    BL,BL,BL,BL
YES       CON    BL,YY,EE,SS

*         Help Message

HELPMSG   CON    STX,60,33,RS,DD,BL,HH
          CON    EE,LL,PP,BL,BL,SS,CC
          CON    RR,EE,EE,NN,BL,RS,EE
          CON    STX,49,36,ACK,KK,EE,YY
          CON    STX,65,36,FF,UU
          CON    NN,CC,TT,II,OO,NN,NAK
          CON    STX,49,38,FF,49
          CON    STX,65,38,TT,OO,GG,GG
          CON    LL,EE,SS,BL,UU,PP,PP
          CON    EE,RR,47,LL,OO,WW,EE
          CON    RR,BL,LL,EE,FF,TT,BL
          CON    SS,CC,RR,EE,EE,NN
          CON    STX,49,39,FF,50
          CON    STX,65,39,VV,II,EE,WW
          CON    BL,LL,EE,FF,TT,BL
          CON    SS,CC,RR,EE,EE,NN,BL
          CON    OO,NN,LL,YY
          CON    STX,49,40,FF,51
          CON    STX,65,40,VV,II,EE,WW
          CON    BL,LL,EE,FF,TT,BL
          CON    AA,NN,DD,BL
          CON    RR,II,GG,HH,TT,BL
          CON    SS,CC,RR,EE,EE,NN,SS
          CON    STX,49,41,FF,52
          CON    STX,65,41,VV,II,EE,WW
          CON    BL,RR,II,GG,HH,TT,BL
          CON    SS,CC,RR,EE,EE,NN,BL
          CON    OO,NN,LL,YY
          CON    STX,49,42,FF,53
          CON    STX,65,42,TT,OO,GG,GG
          CON    LL,EE,SS,BL,UU,PP,PP
          CON    EE,RR,47,LL,OO,WW,EE
          CON    RR,BL,RR,II,GG,HH,TT
          CON    BL,SS,CC,RR,EE,EE,NN
          CON    STX,49,44,DD,OO,WW,NN
          CON    STX,65,44,VV,II,EE,WW
          CON    BL,NN,EE,XX,TT,BL
          CON    PP,AA,GG,EE,BL
          CON    LL,EE,FF,TT,BL
          CON    SS,CC,RR,EE,EE,NN
          CON    STX,49,45,UU,PP
          CON    STX,65,45,VV,II,EE,WW
          CON    BL,PP,RR,EE,VV,II,OO
          CON    UU,SS,BL,PP,AA,GG,EE
          CON    BL,LL,EE,FF,TT,BL
          CON    SS,CC,RR,EE,EE,NN
          CON    STX,49,46,FF,WW,DD
          CON    STX,65,46,VV,II,EE,WW
          CON    BL,NN,EE,XX,TT,BL
          CON    PP,AA,GG,EE,BL
          CON    RR,II,GG,HH,TT,BL
          CON    SS,CC,RR,EE,EE,NN
          CON    STX,49,47,BB,KK,WW,
          CON    STX,65,47,VV,II,EE,WW
          CON    BL,PP,RR,EE,VV,II,OO
          CON    UU,SS,BL,PP,AA,GG,EE
          CON    BL,RR,II,GG,HH,TT,BL
          CON    SS,CC,RR,EE,EE,NN
          CON    STX,49,49,45,45,62,#7C
          CON    STX,65,49,AA,DD,VV,AA
          CON    NN,CC,EE,BL,DD,SS,DD
          CON    47,DD,II,SS,BL
          CON    DD,II,SS,PP,LL,AA,YY
          CON    STX,49,50,FF,49,53
          CON    STX,65,50,TT
          CON    OO,GG,GG,LL,EE,BL,BB
          CON    EE,TT,WW,EE,EE,NN,BL
          CON    DD,SS,DD,45,DD,II,SS
          CON    STX,49,51,#7C,60,45,45
          CON    STX,65,51,CC,LL,EE,AA
          CON    RR,BL,II,NN,PP,UU,TT
          CON    BL,LL,II,NN,EE
          CON    STX,49,52
          CON    CC,TT,RR,LL,BL,II,
          CON    STX,65,52,RR,EE,45
          CON    II,NN,SS,TT,AA,LL,LL
          CON    BL,CC,OO,NN,TT,RR,OO
          CON    LL,WW,AA,RR,EE
          CON    STX,59,54,ACK
          CON    CC,UU,RR,RR,EE,NN,TT
          CON    BL,SS,CC,RR,EE,EE,NN
          CON    BL,SS,TT,AA,TT,UU,SS
          CON    NAK,STX,49,56,RS,DD
          CON    BL,LL,EE,FF,TT,BL
          CON    RS,EE,BL,BL,BL,RS,DD
          CON    BL,LL,EE,FF,TT,BL
          CON    RS,EE,BL,BL,BL,RS,DD
          CON    BL,DD,UU,AA,LL,BL
          CON    RS,EE,BL,BL,BL,RS,DD
          CON    RR,II,GG,HH,TT,BL
          CON    RS,EE,BL,BL,BL,RS,DD
          CON    RR,II,GG,HH,TT,BL
          CON    RS,EE
          CON    STX,47,57,FF,49,RS,DD
LPI       CON    BL,BL,BL,BL,BL,BL
          CON    RS,EE,BL,FF,50,RS,DD
LPOI      CON    BL,BL,BL,BL,BL,BL
          CON    RS,EE,BL,FF,51,RS,DD
DPOI      CON    BL,BL,BL,BL,BL,BL
          CON    RS,EE,BL,FF,52,RS,DD
RPOI      CON    BL,BL,BL,BL,BL,BL
          CON    RS,EE,BL,FF,53,RS,DD
RPI       CON    BL,BL,BL,BL,BL,BL
          CON    RS,EE
          CON    STX,53,59
          CON    PP,RR,EE,SS,SS,BL,AA
          CON    NN,YY,BL,KK,EE,YY,BL
          CON    TT,OO,BL,EE,XX,II,TT
          CON    BL,HH,EE,LL,PP,BL
          CON    SS,CC,RR,EE,EE,NN,#FF

*         Activates Print Routine

PRINTS    CON    RS,STX,#FF

*         Places a Message on First Blank Screen

FRSTMSG   CON    STX,60,46
          CON    RR,EE,CC,EE,II,VV,II
          CON    NN,GG,BL,
          CON    FF,II,RR,SS,TT,BL
          CON    SS,CC,RR,EE,EE,NN,#FF

*         Turn On/Off Program light 1-2

LITE      CON    RS,DC2,EE+#20,ONE,#FF

*         Sets Terminal to 30 Line Screen

LINE30    CON    RS,DC2,#5E,#FF

          END
/EOR
