          CTEXT  SCI SCD VE ROUTINES
          OVERLAY (SCI SCD/VE ROUTINES)
 NVESI    SPACE  4,10
**        SCD/VE ROUTINE LIST.


 NVESI    ROUTINE

          LOC    0
 S.LCW    CON    VES         SCD/VE INITIALIZATION
 S.WFK    CON    VED
 S.NIO    CON    VED
 S.PIO    CON    VED
          LOC    *O
 VED      SPACE  4,10
**        VED - NOS/VE DRIVER.
*
*         *VED* CALLS THE PROCESSING ROUTINES FOR THE NOS/VE
*         CONSOLE DRIVER.  IT EITHER PROCESSES A COMMAND OR
*         ATTEMPTS TO OUTPUT LINES TO THE CONSOLE.
*
*         EXIT   TO *SMPX* IF NO COMMAND PROCESSED.
*                TO PROPER COMMAND IF ONE RECEIVED.
*
*         USES   T1.
*
*         CALLS  CEL, COA, GCB, GET, OUT, RKI, UDB.


 VED      BSS    0           ENTRY
          LDML   SCMT+PTDB.
          ZJN    VED1        IF MODE UNDEFINED
          RJM    RKI         RETURN KEYBOARD INPUT
          LDM    SCMT+CHRC.
          ZJN    VED2        IF LAST OUTPUT ALL SENT
 VED1     LJM    SMPX        RETURN

 VED2     RJM    GCB         GET COMMUNICATION BLOCK
          LDML   SCMT+COMM.+4
          SHN    -8D
          STD    T1
          SBN    CRJTL       TEST IF BEYOND RANGE
          PJN    VED2.5      IF BEYOND END OF JUMP TABLE
          LDM    CRJT,T1     LOAD JUMP ADDRESS OF COMMAND
          STM    VEDA
          PSN                NEED ON AN S0/S0E
          LJM    **          PROCESS COMMAND
 VEDA     EQU    *-1         RETURN TO SMPX

 VED2.5   LDN    0           INFORM COMMAND ACCEPTED
          STML   SCMT+COMM.+4
          LDN    2
          RJM    UDB
 VED3     RJM    CEL         CHECK ERROR LINE
          LDM    SCMT+OPSF.
          NJN    VED1        IF OUTPUT ON HOLD
          RJM    GET         GET NEXT LINE TO OUTPUT
          NJP    OUT         SET UP OUTPUT LINE FOR MUX
          RJM    COA         CHECK DUAL-STATE OS OPERATOR ATTENTION FLAG
          LJM    VED1        RETURN

 CRJT     BSS    0           COMMAND ROUTINE JUMP TABLE
          LOC    0
          CON    VED3        ** (NO COMMAND)
          CON    ABT         ** ABORT OUTPUT
          CON    BNL         ** BEGIN NEW LIST
          CON    ECI         ** ECHO COMMAND INPUT
          CON    RES         ** RESUME OUTPUT
 CRJTL    BSS    0           MAXIMUM REQUEST + 1
          LOC    *O
 ABT      SPACE  4,10
**        ABT - PROCESS THE ABORT COMMAND.
*
*         NOTIFIES NOS/VE COMMAND ACCEPTED AND RESETS LINE LIST.
*
*         EXIT   TO *SMPX*.
*
*         CALLS  UDB.


 ABT      BSS    0           ENTRY
          LDN    0
          STM    SCMT+GOTL.  CLEAR GOT LAST LINE FLAG
          STM    SCMT+OPSF.  CLEAR HOLD FLAG
          STML   SCMT+COMM.+2  END OF OUTPUT LIST
          STML   SCMT+COMM.+3
          STML   SCMT+COMM.+4  COMMAND ACCCEPTED
          LDN    2
          RJM    UDB         UPDATED COMMUNICATION BLOCK
          LJM    SMPX        RETURN
 BNL      SPACE  4,10
**        BNL - BEGIN NEW LIST OF OUTPUT.
*
*         NOTIFIES NOS/VE COMMAND ACCEPTED AND RESETS LINE LIST POINTER.
*         THIS ROUTINE ASSUMES THAT THE PREVIOUS LIST IS COMPLETE.
*
*         EXIT   TO *SMPX*.
*
*         CALLS  UDB.


 BNL      BSS    0           ENTRY
          LDN    0           RESET TO LIST COMPLETE
          STM    SCMT+GOTL.  CLEAR GOT LAST LINE FLAG
          STM    SCMT+COMM.+4  NOTIFY COMMAND ACCEPTED
          LDML   SCMT+COMM.+6  PROCESS RMA FOR NEW OUTPUT LIST
          STML   SCMT+COMM.+2
          LDML   SCMT+COMM.+7
          STML   SCMT+COMM.+3
          LDN    2
          RJM    UDB         UPDATE COMMUNICATIONS BLOCK
          LJM    SMPX        RETURN
 ECI      SPACE  4,10
**        ECI - ECHO COMMAND INPUT.
*
*         THIS ROUTINE PROCESSES THE ECHO INPUT COMMAND.
*
*         ENTRY  COMMAND BLOCK READ IN.
*
*         EXIT   TO *SMPX* IF CHARACTER STILL TO BE OUTPUT.
*                TO *CKQ* IF KEYBOARD IS ECHOED.
*
*         USES   T1, W2, W3.
*
*         CALLS  NVS, STA, UDB.


 ECI      BSS    0           ENTRY
          LDN    11D         SET WORD COUNT
          STD    T1
          LDML   SCMT+COMM.+6  GET READ ADDRESS
          STDL   W2
          LDML   SCMT+COMM.+7
          STDL   W3
          RJM    STA         CONVERT TO R-REGISTER VALUE
          LMC    RR          ACTIVATE R-REGISTER
          CRML   BUFF,T1
          LDML   BUFF        GET LOCATION TO PLACE CURSOR
          LPC    0#FF
          ADN    31D
          STM    SCMT+XPOS.  X-POSITION
          LDML   BUFF
          SHN    -10
          ADN    31D
          STM    SCMT+YPOS.  Y-POSITION
          LDN    0
          RJM    UPK         UNPACK LINE
          LDD    T2
          RAD    BP          OUTPUT THE TRAILING SPACES
          LDM    SCMT+COMM.+4
          LPN    1
          STM    SCMT+OPSF.  WAIT FOR NEXT COMMAND
          LDN    0
          STML   SCMT+COMM.+4  NOTIFY COMMAND ACCEPTED
          STM    SCMT+RKIA.
          LDN    2
          RJM    UDB         NOTIFY COMMAND ACCEPTED

*         CHECK IF NOS/VE SHOULD BE NOTIFIED.

          LDM    SCMT+OPSF.
          NJN    ECI1        IF WAIT FOR COMMAND SET
          LDML   SCMT+COMM.+2
          ADML   SCMT+COMM.+3
          NJN    ECI1        IF LINES REMAIN TO BE SEND
          RJM    NVS         NOTIFY VIRTUAL SYSTEM
 ECI1     LJM    CKQ         RESET POINTERS AND RETURN TO *SMPX*
 RES      SPACE  4,10
**        RES - RESUME OUTPUT.
*
*         NOTIFIES NOS/VE COMMAND ACCEPTED AND ALLOWS OUTPUT.
*
*         EXIT   TO *SMPX*.
*
*         CALLS  UDB.


 RES      BSS    0           ENTRY
          LDN    0
          STM    SCMT+OPSF.  RESUME OUTPUT TO CONSOLE
          STML   SCMT+COMM.+4
          LDN    2
          RJM    UDB         NOTIFY COMMAND ACCEPTED
          LJM    SMPX        RETURN
          EJECT
 CDL      SPACE  4,10
**        CDL - CHECK DFT ERROR LINE.
*
*         ENTRY NONE.
*
*         USES   T1.


 CDL      SUBR               ENTRY/EXIT
          LRD    IB+1        ADDRESS OF DFT ERROR MESSAGE
          LDD    IB
          ADC    DFCM+RR     USE R-REGISTER
          CRML   BUFF,ON     GET LINE
          LDML   BUFF+3      CHECK TO SEE IF A NEW MESSAGE
          SBML   CDLA
          ZJN    CDLX        IF SAME MESSAGE
          LDML   BUFF+3      SAVE MESSAGE ID
          STML   CDLA
          LDML   BUFF+1      CHANGE MESSAGE_LENGTH
          SHN    8D
          STML   BUFF+1
          LDN    3B
          STD    T1
          LDD    IB
          ADC    RR+DFCM+1   USE R-REGISTER
          CRML   BUFF+4,T1   GET LINE
          LDML   BUFF+10B    CHECK MESSAGE (HH:MM:SS MAY BE BLANKS)
          LMC    2R
          ZJP    CDLX        IF BLANK
          LDN    24D         CHARACTERS TO OUTPUT
          LJM    OEL         OUTPUT THE ERROR LINE
 CEL      SPACE  4,10
**        CEL - CHECK ERROR LINE.
*
*         EXIT   TO *EOL* IF NEW ERROR MESSAGE TO DISPLAY.
*
*         USES   T1.
*
*         CALLS  CDL, OEL.


 CEL      SUBR               ENTRY/EXIT
          RJM    CDL         CHECK DFT ERROR LINE
          LDM    SCMT+ELRU.
          STD    T2
          LDM    SCMT+ELRL.
          STD    T3
          LRD    T2          ADDRESS OF ERROR MESSAGE
          LDML   SCMT+ELAO.
          LMC    RR          USE R-REGISTER
          CRML   BUFF,ON     GET LINE
          LDML   BUFF+3      CHECK TO SEE IF A NEW MESSAGE
          SBML   CELA
          ZJN    CELX        IF SAME MESSAGE
          LDML   BUFF+3      SAVE MESSAGE ID
          STML   CELA
          LDN    10D
          STD    T1
          LDML   SCMT+ELAO.
          ADC    RR+1        USE R-REGISTER
          CRML   BUFF+4,T1   GET THE REST OF THE LINE
          SOML   CDLA        ENSURE THAT DFT MESSAGE WILL APPEAR
          LDC    77D         CHARACTERS TO OUTPUT
          LJM    OEL         OUTPUT THE ERROR LINE
 COA      SPACE  4,10
**        COA - CHECK DUAL-STATE OS OPERATOR ATTENTION FLAG.
*
*         EXIT   TO *CKQ* IF FLASHING *170* POSTED OR CLEARED.
*
*         USES   CM - CM+3.
*
*         CALLS  IIB.


 COA      SUBR               ENTRY/EXIT
          LDN    D7ST        CHECK IF C170 OS NEEDS ATTENTION
          RJM    IIB
          CRDL   CM
          LDD    CM          COMPARE PRESENT AND PREVIOUS STATUS
          LPC    400
          STD    CM
          LMM    COAA
          ZJN    COAX        IF NO CHANGE IN BIT STATUS
          LDD    CM
          STM    COAA
          ZJN    COA3        IF BIT HAS CLEARED SINCE LAST CALL

*         POST FLASHING *170* AT UPPER RIGHT CORNER OF CONSOLE DISPLAY.

          LDD    SB
          ADD    SB+1
          ZJN    COA1        IF NO *SCI* PARAMETER TABLE
          LRD    SB          READ *SCI* PARAMETER TABLE FOR BELL STATUS
          LDM    SBAO
          LMC    RR
          CRDL   CM
          LDDL   CM+2
          SHN    21-15
          MJN    COA1        IF BELL ENABLED
          LDC    COAD        SET UP OUTPUT POINTERS
          STD    BA
          ADN    COADL
          UJN    COA2        CONTINUE

 COA1     LDC    COAB        SET UP OUTPUT POINTERS
          STD    BA
          ADN    COABL
 COA2     STD    BP
          UJN    COA4        EXIT TO *CKQ*

*         CLEAR FLASHING *170* SINCE DUAL-STATE OS NO LONGER NEEDS OPERATOR.

 COA3     LDC    COAC        SET UP OUTPUT POINTERS
          STD    BA
          ADN    COACL
          STD    BP
 COA4     LJM    CKQ         RETURN

 COAA     BSS    1           PREVIOUS STATUS OF *D7ST* BIT 56

 COAB     BSS    0           DISPLAY FLASHING *170* AND SOUND BELL
          CON    0#07        SOUND BELL
 COAD     BSS    0           DISPLAY WITHOUT BELL
          CON    0#1E,0#44   TURN ON INVERSE VIDEO
          CON    0#06,0#0E   SET UNDERLINE AND BLINK
          CON    0#02,0#6D   POSITION CURSOR
          CON    0#20
          CON    1R1,1R7     170
          CON    1R0
          CON    0#1E,0#45   TURN OFF INVERSE VIDEO
          CON    0#15,0#0F   END UNDERLINE AND BLINK
 COABL    EQU    *-COAB
 COADL    EQU    *-COAD

 COAC     BSS    0           CLEAR FLASHING *170*
          CON    0#02,0#6D   POSITION CURSOR
          CON    0#20
          CON    0#20,0#20   THREE BLANKS
          CON    0#20
 COACL    EQU    *-COAC
 GCB      SPACE  4,10
**        GCB - GET COMMUNICATIONS BLOCK.
*
*         READS THE NOS/VE COMMUNICATION BLOCK IN CM.


 GCB      SUBR               ENTRY/EXIT
          LDK    COMM.+4     GET COMM. BLOCK ADDRESS
          ADD    PT
          STM    GCBM
          LRD    CB          GET DATA WORD ADDRESS
          LDML   SCMT+CBAO.
          ADC    RR+1        USE R-REGISTER
          CRML   **,ON       READ IN DATA WORD
 GCBM     EQU    *-1
          UJN    GCBX        RETURN
 GET      SPACE  4,10
**        GET - GET OUTPUT LINE.
*
*         GETS THE NEXT LINE IN THE LIST TO BE OUTPUT.
*
*         ENTRY  (COMM.+2 COMM.+3) ADDRESS OF NEXT LINE.
*
*         EXIT   RETURN IF A LINE IS PICKED UP.
*                TO *CKQ* IF LAST LINE OUT AND NEED TO SET CURSOR.
*
*         USES   T1, T2, T3.
*
*         CALLS  NVS, SCP, STA, UDB.


 GET2     LDN    0           SET TO END OF LIST
          STML   SCMT+COMM.+2
          STML   SCMT+COMM.+3
          LDN    1
          RJM    UDB         REPORT LAST RMA PICKED UP
          RJM    NVS         NOTIFY VIRTUAL SYSTEM
          RJM    SCP         GOTO CURSOR POSITION
          ZJN    GET3        IF CURSOR NOT MOVED
          LJM    CKQ         POSITION CURSOR AND RETURN FROM SCD

 GET3     STM    SCMT+GOTL.  SET/CLEAR FLAG FOR END OF LIST NOT SENT

 GET      SUBR               ENTRY/EXIT
          LDM    SCMT+GOTL.
          NJN    GET2        IF LAST RMA PICKED UP BUT NOT REPORTED
          LDML   SCMT+COMM.+2
          STDL   W2
          LDML   SCMT+COMM.+3  SECOND HALF
          STDL   W3
          ADDL   W2
          ZJN    GETX        IF OUT OF RMA'S
          LDN    11D
          STD    T1
          RJM    STA         TRANSLATE RMA INTO AN R-REGISTER VALUE
          LMC    RR          ACTIVATE R-REGISTER
          CRML   BUFF,T1     GET LINE
          LDML   BUFF+2
          ADML   BUFF+3      TEST FOR END OF LIST
          ZJN    GET1        IF END OF LIST
          LDML   BUFF+2
          STML   SCMT+COMM.+2
          LDML   BUFF+3
          STML   SCMT+COMM.+3
          LDN    1
          RJM    UDB         REPORT RMA PICKED UP
          LJM    GETX        RETURN

 GET1     LDN    1
          LJM    GET3        SET FLAG FOR END OF LIST NOT SENT
 MBC      SPACE  4,10
**        MBC - MOVE BLOCK OF CHARACTERS.
*
*         ENTRY  (A) = ADDRESS OF BLOCK TO MOVE.
*                (BP) = BUFFER POINTER.
*
*         USES   BP, T3.


 MBC      SUBR               ENTRY/EXIT
          STD    T3
 MBC1     LDI    T3          GET NEXT CHARACTER TO MOVE
          ZJN    MBCX        IF NO MORE TO MOVE
          STIAO  BP
          AOD    T3
          UJN    MBC1        ADVANCE TO NEXT CHARACTER
 NVS      SPACE  4,10
**        NVS - NOTIFY VIRTUAL SYSTEM.
*
*         SENDS A CPU INTERRUPT TO THE NOS/VE OPERATING SYSTEM.
*
*         USES   T1 - T4.


 NVS      SUBR               ENTRY/EXIT
          LRD    SB
          LDM    SBAO
          ADC    RR+1
          CRDL   T1          GET *SCD/VE* INTERFACE POINTER ADDRESS
          LDD    T2
          LPN    77          MASK OFF PROCESSOR INTERRUPT MASK
          LMC    INPNI       FORM INTERRUPT INSTRUCTION
          STML   NVSA

*         THE FOLLOWING CM READ IS REQUIRED FOR TWO REASONS:
*           1)  ON AN S1CR MAINFRAME, IT IS NEEDED IN ORDER TO RELEASE THE ADU TO
*               THE PARTNER PP.  THE READ MUST INVOLVE THE USE OF THE R-REGISTER
*               TO SUCCESSFULLY RELEASE THE ADU.
*           2)  ON AN S0 MAINFRAME, MEMORY BANK ZERO MUST BE ACCESSED BEFORE THE
*               INTERRUPT INSTRUCTION WILL TAKE AFFECT.  THE LOAD OF THE
*               R-REGISTER ALSO SATISFIES THE REQUIREMENT THAT AT LEAST ONE
*               INSTRUCTION BE EXECUTED BETWEEN AN INSTRUCTION MODIFICATION AND
*               THE USE OF THAT MODIFIED INSTRUCTION ON AN S0 MAINFRAME.

          LDC    RR          READ FROM MEMORY BANK FOR S0 MAINFRAME
 NVSA     INPN   **          ** MODIFIED WITH PORT TO INTERRUPT **
          CRDL   T1          RELEASE THE ADU TO PARTNER PP ON S1CR MAINFRAME
          UJN    NVSX        RETURN
 OEL      SPACE  4,15
**        OEL - OUTPUT ERROR LINE.
*
*         ENTRY  (A) = CHARACTERS TO OUTPUT.
*                    = 24 FOR *DFCM* MESSAGES.
*                    = 77 FOR SYSTEM ERROR MESSAGES.
*
*         EXIT   TO *CKQ*.
*
*         USES   T5, T6, T7, BP.
*
*         CALLS  MBC, UPK.


 OEL      BSS    0           ENTRY
          STD    T7          SAVE LENGTH
          STM    OELA
          LDD    BP          GET BUFFER POINTER
          STD    T5
          LDC    80D         CLEAR 80 CHARACTERS FOR WORST CASE
          STD    T6
 OEL1     LDN    0#20
          STI    T5
          AOD    T5
          SOD    T6
          PJN    OEL1        IF MORE CHARACTERS TO CLEAR
          LDD    T7
          SBN    24D
          NJN    OEL2        IF NOT DFT ERROR MESSAGE
          LDC    OELB        POST DFT MESSAGE
          UJN    OEL3        CONTINUE PROCESSING

 OEL2     LDC    OELC        POST SYSTEM MESSSAGE
 OEL3     RJM    MBC         MOVE BLOCK OF CHARACTERS
          LDD    BP
          RAD    T7          ADD IN CHARACTER COUNT
          LDN    0#20        NOTHING SMALLER THAN A BLANK
          RJM    UPK
          LDD    T7          RESET ENDING VALUE OF BP
          STD    BP
          LDC    **
 OELA     EQU    *-1         (CHARACTER COUNT)
          SBN    24D
          NJN    OEL4        IF NOT DFT MESSAGE
          LDC    OELD        TERMINATE DFT MESSAGE
          RJM    MBC
 OEL4     LJM    CKQ         RETURN

 OELB     BSS    0           DISPLAY DFT MESSAGE
          CON    0#1E,0#44   TURN ON INVERSE VIDEO
          CON    0#06,0#0E   SET UNDERLINE AND BLINK
          CON    0#07,0#07   SOUND BELL
          CON    0#07
          CON    0#02,0#55   POSITION CURSOR
          CON    0#20
          CON    0           END OF BLOCK

 OELC     BSS    0           DISPLAY SYSTEM MESSAGE
          CON    0#02,0#20   POSITION CURSOR
          CON    0#20
          CON    0           END OF BLOCK

 OELD     BSS    0           TERMINATE DFT MESSAGE
          CON    0#1E,0#45   TURN OFF INVERSE VIDEO
          CON    0#15,0#0F   END UNDERLINE AND BLINK
          CON    0           END OF BLOCK
 OUT      SPACE  4,10
**        OUT - SET UP OUTPUT LINE.
*
*         PLACES NEXT LINE INTO BUFFER IF NOT IN USE.
*
*         EXIT   TO *CKQ* IF NEW LINE OUTPUT.
*                TO *SMPX* IF NOT A VALID LINE.
*
*         USES   BP.
*
*         CALLS  SLP, UPK.


 OUT      BSS    0
          LDML   BUFF        PRINT COORDINATES
          NJN    OUT0        IF VALID LINE
          LJM    SMPX        RETURN

 OUT0     RJM    SLP         SET LINE POSITION
          LDML   BUFF+1
          LPC    377B
          STM    OUTA        STORE DISPLAY ATRIBUTE
          NJN    OUT1        IF SPECIAL ATTRIBUTES
          LJM    OUT5        ELSE PRINT LINE

 OUT1     SBN    1
          ZJN    OUT4        IF INVERSE VIDEO
          SBN    2-1
          NJN    OUT2        IF NOT INPUT LINE
          LDML   BUFF+1
          SHN    -8D
          NJN    OUT5        IF LINE LENGTH <> 0
          LDC    0#40        '@' FOR COMMAND PROMPT
          STIAO  BP
          UJN    OUT5        PRINT LINE

 OUT2     SBN    3-2
          NJN    OUT3        IF NOT BLINKING
          LDN    0#0E        SET BLINK
          STIAO  BP
          UJN    OUT5        CONTINUE

 OUT3     SBN    4-3
          NJN    OUT5        IF NOT BOTH BLINK AND INVERSE
          LDN    7           RING BELL
          STIAO  BP
          LDN    0#0E        SET BLINK
          STIAO  BP
 OUT4     LDN    0#1E        SEND 1E(16),44(16)
          STIAO  BP
          LDC    0#44
          STIAO  BP
          LDN    6           UNDERLINE FIELD
          STIAO  BP
 OUT5     LDN    0#20        REPLACE ALL CHARACTERS LESS THEN 20(16)
          RJM    UPK         UNPACK OUTPUT LINE
          LDML   BUFF+1
          SHN    -8D
          SBD    T2          SUBTRACT BLANKS REMOVED
          ADC    -80D
          PJN    OUT6        IF 80 BYTES OR MORE (BLINK CODES FOUND)
          LDN    0#1E        ERASE TO END OF LINE EXTEND ATTRIBUTE
          STIAO  BP
          LDN    0#2A
          STIAO  BP
 OUT6     LDM    OUTA
          SBN    1
          ZJN    OUT8        IF INVERSE VIDEO
          SBN    3-1
          NJN    OUT7        IF BLINK NOT SET
          LDN    0#F         TURN OFF BLINK
          STIAO  BP
          UJN    OUT9        RESET POINTERS FOR MUX

 OUT7     SBN    4-3
          NJN    OUT9        IF BLINKING INVERSE NOT SET
          LDN    0#F         TURN OFF BLINK
          STIAO  BP
 OUT8     LDN    0#1E        TURN OFF INVERSE VIDEO
          STIAO  BP
          LDC    0#45
          STIAO  BP
          LDN    0#15        END UNDERLINE
          STIAO  BP
 OUT9     AOM    SCMT+CMOV.
          LJM    CKQ         RESET POINTERS FOR MUX

 OUTA     BSS    1
 RKI      SPACE  4,10
**        RKI - RETURN KEYBOARD INPUT.
*
*         IF RKIA. FLAG ALLOWS NEW KEYBOARD INPUT TO BE SENT THEN
*         ID COUNTER IS UPDATED FOR NOS/VE AND UP TO THREE CHARACTERS
*         ARE SENT TO NOS/VE.
*
*         CALLS  GKC, NVS, UDB.
*
*         USES   T1.


 RKI      SUBR               ENTRY/EXIT
          LDM    SCMT+RKIA.
          NJN    RKIX        IF KEYBOARD INPUT CANNOT BE SENT
          RJM    GKC         GET A CHARACTER
          ZJN    RKIX        IF NO NEW INPUT
          STD    T1
          LDML   SCMT+COMM.
          SHN    -8D
          ADN    1           INCREMENT ID COUNTER
          SHN    8D
          STML   SCMT+COMM.
          LDD    T1          PUT FIRST CHARACTER IN
          RAML   SCMT+COMM.
          RJM    GKC
          SHN    8D
          STML   SCMT+COMM.+1
          RJM    GKC
          RAML   SCMT+COMM.+1
          LDN    1
          STM    SCMT+RKIA.
          RJM    UDB         STORE NUMBER OF WORDS TO WRITE
          RJM    NVS         NOTIFY VIRTUAL SYSTEM
          LJM    RKIX        RETURN
 SLP      SPACE  4,10
**        SLP - SET LINE POSITION.
*
*         SCROLLS A FIELD (IF NECESSARY) AND POSITIONS
*         THE CURSOR FOR THE NEXT LINE TO BE OUTPUT.
*
*         ENTRY  (A) = DISPLAY COORDINATES.
*
*         USES   T1, BP.


 SLP      SUBR               ENTRY/EXIT
          STDL   T1
          SHN    -8D
          ZJN    SLP1        IF NOT A SCROLLED LINE
          ADN    31D         BIAS
          STM    2,BP        SET UPPER LINE OF SCROLL FIELD
          LDN    0#1E        TELL 721 TO SCROLL
          STI    BP
          STM    4,BP        ISSUE SCROLL FUNCTION TO 721
          LDC    0#57
          STM    1,BP
          LDDL   T1
          LPC    0#FF
          ADN    31D
          STM    3,BP        SET LOWER LINE OF SCROLL FIELD
          LDC    0#55
          STM    5,BP
          LDN    6
          RAD    BP          BRING POINTER UP TO DATE
 SLP1     LDN    2           POSITION TO COLUMN 1 OF NEW LINE
          STIAO  BP
          LDN    31D+1       SET COLUMN 1
          STIAO  BP
          LDD    T1
          LPN    37          LINE NUMBER 0 - 29
          ADN    31D
          STIAO  BP          SET DESIRED LINE
          LJM    SLPX        RETURN
 UPK      SPACE  4,13
**        UPK - UNPACK STRING.
*
*         *UPK* UNPACKS THE CURRENT STRING IN *BUFF* AND
*         PUTS IT IN *CHRB.*, ONE CHARACTER PER PP WORD.
*
*         ENTRY  (A) = SMALLEST VALID CHARACTER.
*
*         EXIT   (T2) = NUMBER OF BLANKS AT THE END OF LINE.
*
*         USES   T1, T2, T3, T4, T5, T6, BP.


 UPK      SUBR               ENTRY/EXIT
          STD    T3          SAVE SMALLEST VALID CHARACTER
          LDC    BUFF+4
          STD    T4          SAVE ADDRESS OF BUFFER TO UNPACK
          LDML   BUFF+1
          SHN    -8D
          STD    T2          GET LENGTH OF LINE
          ZJN    UPKX        IF LINE LENGTH IS ZERO
          ADC    -81D        TEST FOR LINE TOO LONG
          MJN    UPK0        IF NOT
          LDC    80D
          STD    T2          RESET FOR JUST 80 CHARACTERS
 UPK0     LDD    BP          SAVE BEGINNING ADDRESS
          STD    T5

*         IF THE LINE IS NOT ALREADY DESIGNATED AS A FLASHING LINE,
*         THEN IT IS ALLOWED TO CONTAIN TWO CONTROL CODES TO TURN
*         BLINK MODE ON AND OFF FOR A FIELD WITHIN THE LINE. WHEN
*         THE FIRST CODE TO ENABLE BLINKING AND THE FIRST CODE TO
*         DISABLE BLINKING ARE EACH ENCOUNTERED, A BLANK CHARACTER
*         IS INSERTED IN THE OUTPUT BUFFER FOLLOWING THE CONTROL
*         CODE SO THAT A BLANK APPEARS AT THAT POSITION ON THE
*         CONSOLE DISPLAY LINE.

          LDML   BUFF+1
          LPC    377B
          STM    OUTA        RESET OUTA IN CASE CALL WAS NOT FROM -OUT-
          SBN    3
          ZJN    UPK1        IF LINE IS IN BLINK MODE
          LDN    0#0E        SET TO SEARCH FOR -BLINK ON- CODE
 UPK1     STD    T6
 UPK2     LDIL   T4          GET TWO CHARACTERS FROM BUFF
          SHN    -8D
          LPC    0#7F        TRIM TO SEVEN BIT ASCII
          STD    T1
          STIAO  BP          PUT FIRST CHARACTER IN BUFFER
          LDD    T6
          ZJN    UPK4        IF NOT CHECKING FOR BLINK ON/OFF CODES
          SBD    T1
          NJN    UPK4        IF NOT THE CODE BEING SOUGHT
          LDD    T6
          SBN    0#0F
          ZJN    UPK3        IF -BLINK OFF- CODE SOUGHT AND FOUND
          LDN    0#07        -BLINK ON- FOUND, SOUND A BELL
          STIAO  BP
          LDN    0#0F        SET TO SEARCH FOR -BLINK OFF-
 UPK3     STD    T6
          LDN    0#20
          STIAO  BP          STORE A BLANK AFTER THE CONTROL CODE
 UPK4     SOD    T2
          ZJN    UPK9        IF DONE WITH LINE
          LDI    T4
          LPC    0#7F        TRIM TO SEVEN BIT ASCII
          STD    T1
          STIAO  BP          PUT SECOND CHARACTER IN BUFFER
          LDD    T6
          ZJN    UPK6        IF NOT CHECKING FOR BLINK ON/OFF CODES
          SBD    T1
          NJN    UPK6        IF NOT THE CODE BEING SOUGHT
          LDD    T6
          SBN    0#0F
          ZJN    UPK5        IF -BLINK OFF- BEING SOUGHT AND FOUND
          LDN    0#0F        SET TO SEARCH FOR -BLINK OFF- CODE
 UPK5     STD    T6
          LDN    0#20
          STIAO  BP          STORE A BLANK AFTER THE CONTROL CODE
 UPK6     AOD    T4
          SOD    T2
          ZJN    UPK7        IF FINISHED UNPACKING LINE
          LJM    UPK2        NOT FINISHED UNPACKING LINE

 UPK7     LDM    OUTA
          SBN    3
          ZJN    UPK8        IF LINE IS ALREADY IN BLINK MODE
          LDN    0#0E        SET TO SEARCH FOR -BLINK ON- CODE
 UPK8     STD    T6
 UPK9     LDI    T5          TEST FOR ILLEGAL CHARACTERS
          SBD    T3
          PJN    UPK12       IF PRINTABLE CHARACTER
          LDD    T6
          ZJN    UPK11       IF NOT CHECKING FOR BLINK CONTROL CODES
          LDI    T5
          SBD    T6
          NJN    UPK11       IF NOT THE BLINK CODE BEING SOUGHT
          LDD    T6
          SBN    0#0F
          ZJN    UPK10       IF -BLINK OFF- SOUGHT AND FOUND
          AOD    T5          SKIP THE BELL INSERTED AFTER -BLINK ON-
          LDN    0#0F        SET TO SEARCH FOR -BLINK OFF- CODE
 UPK10    STD    T6
          UJN    UPK13       GO CHECK TO SEE IF WE ARE FINISHED

 UPK11    LDN    0#3F        REPLACE UNPRINTABLE CHARACTER WITH *?*
          STI    T5
 UPK12    LDI    T5          TEST FOR PAGE CLEAR
          SBN    0#0C
          NJN    UPK13       IF NOT PAGE CLEAR
          STM    CDLA        RESET TO DISPLAY DFT LINE
          STM    CELA        RESET TO DISPLAY ERROR LINE
          STM    COAA        RESET TO DISPLAY FLASHING *170* IF NECESSARY
 UPK13    AOD    T5
          SBD    BP
          NJN    UPK9        IF NOT DONE WITH LINE
          LDD    T6
          SBN    0#0F        CHECK FOR -BLINK OFF- BEING SOUGHT
          NJN    UPK14       IF NOT SEARCHING FOR -BLINK OFF- CODE

*         IF THE END OF LINE HAS BEEN REACHED AND A -BLINK OFF- IS
*         STILL NEEDED TO TERMINATE A BLINKING FIELD, THEN FORCE
*         ONE INTO THE OUTPUT CHARACTER BUFFER.

          LDN    0#0F
          STIAO  BP
 UPK14    SOD    BP          TEST FOR TRAILING BLANKS
          AOD    T2          COUNT BLANKS REMOVED
          LDI    BP
          SBN    0#20
          ZJN    UPK14       IF FOUND A BLANK
          SOD    T2
          AOD    BP
          LJM    UPKX        RETURN
 VES      SPACE  4,10
**        VES - NOS/VE STARTUP ROUTINE.
*
*         SETS UP THE CONSOLE FOR NOS/VE USE.
*
*         EXIT   (SCMT+RTNP.) = *VED*.
*
*         USES   T1.


 VES      ROUTINE            ENTRY

          LDC    VESA        MOVE NOS/VE CONSOLE SETUP TEXT
          STD    T1
 VES1     LDI    T1          GET NEXT CHARACTER
          ZJN    VES2        IF END OF TEXT
          STIAO  BP
          AOD    T1
          UJN    VES1        LOOP

 VES2     LDN    1
          STM    SCMT+CMOV.  RESET CURSOR
          STM    SCMT+KBIP.
          LDN    0#0C        NOTIFY HOST TO REFRESH DISPLAYS
          STM    SCMT+CHARS.
          LDN    0
          STM    SCMT+RKIA.  ALLOW INPUT TO BE RETURNED
          STM    SCMT+KBOP.  RESET KEYBOARD BUFFER
          STM    SCMT+CHARS.+1
          STM    SCMT+CHARS.+2
          STM    SCMT+CHARS.+3
          LDN    0+0#20
          STM    SCMT+XPOS.
          ADN    30D
          STM    SCMT+YPOS.
          LDC    VED
          STI    PT          PUT MAIN ROUTINE ADDRESS IN RTNP.
          LJM    CKQ         RETURN

 VESA     BSS    0           CONSOLE SETUP TEXT
          CODE   ASCII
          CON    0#0D,0#0D   TERMINATE POSSIBLE MULTIPLE CODE SEQUENCE
          CON    0#1E,0#33   DISABLE HOST LOADED CODE
          CON    0#1E,0#12   ENTER LARGE CYBER MODE
          CON    0#42
          CON    0#1E,0#12   SELECT 30 LINES
          CON    0#5E
          CON    0#1E,0#12   SET 80 CHARACTER LINE AND CLEAR SCREEN
          CON    0#48
          CON    0#1E,0#30   ENABLE CODE BIAS
          CON    0#1E,0#12   SHIFT NUMERIC PAD
          CON    0#6B
          CON    0#16        PAGE SCREEN
          CON    0#02,0#30   POSITION CURSOR
          CON    0#30
          CON    1RS+40,1RC+40  SCD/VE
          CON    1RD+40,1R/+40
          CON    1RV+40,1RE+40
          CON    0           TERMINATOR

          CODE   *

          OVERFLOW  SCMT     CHECK FOR OVERFLOW

          ENDX
