File: VCM100.PA of Tape: Sources/Other/new-22-vista-2
(Source file text) 

/       VCM100 - PAL8 COMPATIBLE VCM FILE
/       VERSION 01.20  --  VISTA INTRODUCTION
/
/
/               ******************************************
/               **                                      **
/               **              V I D E O               **
/               **     C H A R A C T E R I S T I C S    **
/               **             M O D U L E              **
/               **                                      **
/               **              CODED BY                **
/               **         C. E. STEUART DEWAR          **
/               **            MARCH, 1980               **
/               **                                      **
/               **                                      **
/               ******************************************
/
/
/       COPYRIGHT  (c) 1980 Under BERNE and UNIVERSAL COPYRIGHT LAW
/               By: DEWAR INFORMATION SYSTEMS CORPORATION
/
/       The information in this document  is subject to change without
/       notice  and  should  not be construed as a commitment by DEWAR
/       INFORMATION SYSTEMS  CORPORATION.   DEWAR  INFORMATION SYSTEMS
/       assumes no  responsibility  for  any errors that may appear in
/       this document  other  than providing  corrections for any such
/       errors when brought to the attention of DEWAR INFORMATION SYS-
/       TEMS CORPORATION.
/
/       The SOFTWARE  described  in  this document is furnished to the
/       purchaser under a license for use on a  single computer system
/       and can be copied  (with inclusion of DISC's copyright notice)
/       only for use in such system.
/
/       Licensees  of the  SOFTWARE  may make changes to the  software
/       with the understanding that the warranty for the SOFTWARE only
/       applies  to the original  unmodified version  delivered to the
/       licensee.  The fact that licensee may have modified or changed
/       the  SOFTWARE  in no way alters or detracts from the copyright
/       protection and proprietary rights due to DISC for the SOFTWARE
/
/       VISTA IS A SCREEN ORIENTED TEXT EDITOR FOR A VISUAL DISPLAY
/       TERMINAL.
/
/       FUNCTION KEYS ON A TERMINAL ARE HANDLED THROUGH THE USE OF
/       THIS VIDEO CHARACTERISTICS MODULE (VCM), THAT HANDLES ALL INPUT TO THE
/       MAIN PORTION OF THE VISTA PROGRAM. IN THE SAME WAY, ALL OUTPUT FROM
/       THE VISTA PROGRAM IS ENCODED AND IT IS THE FUNCTION OF THE
/       'VCM' MODULE TO RETRANSLATE THIS OUTPUT INTO A FORM
/       SUITABLE FOR THE SPECIFIC TERMINAL IN USE.
/
/       THE VCM PROVIDED STANDARDLY PROVIDED WITH
/       VISTA HAS BEEN DESIGNED AROUND THE VT52/VT100 TERMINALS SINCE
/       IT IS EXPECTED THAT THESE ARE THE MOST COMMON DISPLAY TERMINALS
/       TO BE FOUND ON PDP8 SYSTEMS.
/
/       IMPLEMENTATION OF OTHER VIDEO DISPLAY TERMINALS IS EXTREMELY
/       SIMPLE SINCE THE MAIN CORE OF THE VISTA PROGRAM IS NEVER
/       CHANGED.
/
/       CONSULT THE 'VISTA' PROGRAM MANUAL FOR DETAILS ON THE USE OF THIS
/                               EDITING PROGRAM.
/
/       VIDEO CHARACTERISTICS MODULE IS ALLOCATED 3 PDP8 PAGES FROM
/                               06000-06577
/
/       IN ORDER TO UNDERSTAND HOW VISTA WORKS IT IS ESSENTIAL TO
/       KNOW THE MEMORY LAYOUT.
/
/       A COPY OF EACH LINE ON THE VIDEO SCREEN IS MAINTAINED IN A
/       FIELD 1 BUFFER CALLED 'SCREEN'. EACH BYTE ON THE SCREEN OCCUPIES
/       ONE WORD IN THIS BUFFER.
/
/       A ROW TABLE IS MAINTAINED WHICH CONSISTS OF A ONE WORD ADDRESS
/       FOR EACH LINE ON THE SCREEN. THE ROW TABLE IS SIMPLY A SET OF
/       POINTERS TO THE FIRST WORD ON EACH LINE. THIS FIRST WORD IS
/       A STATUS/COUNT WORD FOR THE LINE WHICH IMMEDIATELY FOLLOWS.
/
/       THE FUNCTION OF THE ROW TABLE IS TO AVOID MOVING THE SCREEN MEMORY
/       AROUND DURING INSERTION AND DELETION OF LINES. IN THIS CASE, ONLY
/       THE ROW TABLE ITSELF HAS TO BE ADJUSTED. FOR THIS REASON, THE
/       POINTER ADDRESSES IN THE ROW TABLE ARE NOT NECESSARY IN ANY ORDER.
/
/       THE FORMAT OF THE STATUS/COUNT WORD FOR EACH LINE IS:
/
/               ABC DEE EEE EEE
/
/       A = 0   CURRENT LINE EXISTS
/           1   CURRENT LINE DOES NOT EXIST (AT END OF FILE OR UNESTABLISHED)
/
/       B = 0   LINE ENDS WITH CR/LF
/           1   LINE ENDS WITHOUT CR/LF
/
/       C = 0   LINE NOT MARKED
/           1   LINE MARKED AS PART OF BLOCK (FOR SAVE/DELETION)
/
/       D = 0   CURRENT LINE HAS NOT BEEN MODIFIED ON THIS EDIT
/           1   HAS BEEN MODIFIED ON THIS EDIT CYCLE
/
/       EEE..E  LINE LENGTH IN THE RANGE 0-255
/
/
/       END OF FILE IS INDICATED BY 'BOF' FLAG BEING SET AND BY ROWS
/       WITH A BIT 0 STATUS OF 1.
/
/       THERE ARE TWO ONE-BLOCK BUFFERS 'FEEDING' THE SCREEN WINDOW:
/       THE ABOVE SCREEN BUFFER (ABUF) AND THE BELOW SCREEN BUFFER
/       (BBUF). THESE BUFFERS ARE IN OS/8 FORMAT AND ARE READ AND
/       WRITTEN FROM THE OS/8 DEVICE AS NEEDED.
/
/
/       YOU MAY NEED TO BE AWARE OF THE FOLLOWING IMPORTANT CELLS AND
/       ENTRY POINTS IN VISTA:
/
/       NAME            FUNCTION
/
/       COL             CONTAINS BINARY COLUMN POSITION OF CURSOR IN RANGE
/                       0-(N-1). NOTE: POSITION IS NOT GUARANTEED FOR ALL
/                       POSSIBLE VCM FUNCTIONS (BUT IT IS FOR ALL IMPORTANT
/                       ONES).
/
/       ROW             CURRENT POINTER INTO THE ROW TABLE.
/
/       ROWTAB          ADDRESS OF FIRST ROW IN ROW TABLE
/       LASTROW         ADDRESS OF LAST ROW IN ROW TABLE
/       ROWSIZ          COUNT OF NUMBER OF ROWS IN ROW TABLE (1-N)
/       COLSIZ          COUNT OF NUMBER OF COLUMNS ON SCREEN
/       PKBD            POINTER TO CONSOLE INPUT ROUTINE
/       PSCR            POINTER TO CONSOLE OUTPUT ROUTINE
/       XT/XT2          TWO CELLS ON PAGE 0 RESERVED FOR USE BY 'VCM'
/                       MODULE. VCM CAN ALLOCATE MORE PAGE 0 STORAGE
/                       FROM THE ADDRESS XT2+1 UP TO 177 ON PAGE 0.
/                       CAUTION: SPR'S FOR VISTA MAY REQUIRE THE USE OF
/                       PAGE 0 CELLS (STARTING BACK FROM 177), SO USE
/                       PAGE 0 CELLS ONLY WHEN ABSOLUTELY NECESSARY.
/
/       PRLINE          SUBROUTINE TO OUTPUT A FULL ROW ON THE SCREEN.
/                       CAN ONLY BE CALLED FROM VCM IF VCM FILE ITSELF
/                       PROTECTS AGAINST A RECURSIVE CALL BY SAVING THE
/                       RETURN ADDRESSES IN 'PRLINE' AND 'XTER'.
/
/                       THIS ROUTINE WILL BE NEEDED FOR TERMINALS THAT ARE
/                       CAPABLE OF PERFORMING INSERT AND DELETE LINE IN LOCAL
/                       MODE (SEE VCM52 FOR AN EXAMPLE OF CALLING 'PRLINE')
/
/       THIS VCM FILE IS TO BE ASSEMBLED WITH THE GLOBAL SYMBOL
/       DICTIONARY FROM VISTA:
/
/       .R PAGE8
/       *VCM,LPT:<VISTA.SD,VCM/I
/
/       OR IF YOU HAVE TO USE PAL8
/
/       .R PAL8
/       *VCM,LPT:<VISTA.GL,VCM
/
/       WHERE FOR PAL8, 'VISTA.GL' IS THE PAGE8 SYMBOL DIRECTORY CONVERTED
/       INTO PAL8 COMPATIBLE FORMAT.
/
/
/       THEN SAVE VISTA WITH A STARTING ADDRESS OF 200, AND SAVE
/       VCM WITH A STARTING ADDRESS OF 7605 (I.E. IT SHOULD NEVER
/       BE RUN DIRECTLY.
/
XT3=XT2+1           	/TEMPORARY LOCATION ON PAGE 0 FOR VCM FILE
/
        *     KIO             /KEYBOARD I/O
/	DSEC
/
/       ALL FOLLOWING ADDRESSES ARE ABSOLUTELY REFERENCED BY VISTA
/       AND CANNOT BE CHANGED UNLESS VISTA ITSELF IS ALTERED.
/
KIO,        0               /KEYBOARD I/O ENTRY
        JMP     XIN             /CONTINUE NOW
/
SIO,        0               /SCREEN I/O ENTRY POINT
        JMP I   PXOUT           /CONTINUE
/
VMCMNT,     -"/             /MINUS ASCII CODE OF COMMENT FIELD CHARACTER
VMTAG,      -",             /MINUS ASCII CODE OF TAG FIELD DELIMITER
VROWS,      030             /24 ROWS ON VIDEO SCREEN
VCOLS,      0120            /80 COLUMNS ON VIDEO SCREEN
VAUCOL,     0110            /COLUMN 72 FOR AUDIT TRAIL OF VERSION #"S
VSTAT,      06000           /XON/XOFF PROCESSED, CTRL/O ALLOWED
/
/       ### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ###
/
XSIO,   JMP I   SIO             /HERE TO EXIT FROM "SIO"
PXOUT,      XOUT            /POINTER TO "XOUT"
/
/       VISTA INTERNAL CODE FOR ALL ESCAPED CHARACTERS POSSIBLE ON THE
/       KEYBOARD.
/
/ P,Q,R,S ARE THE 'PFX' KEYS ON THE VT100. 'M' IS GENERATED FROM THE ENTER
/ KEY
/
MPQRS,      YNEWCMD        /M       ENTER COMMAND MODE
            YDELSCR        /N       DELETE SCREEN <GENERATED MANUALLY>
            YTRUNCF        /O       TRUNCATE FILE <GENERATED MANUALLY>
            YPAGEUP        /P       PAGE UP
            YPAGEDN        /Q       PAGE DOWN
            YSCRLUP        /R       SCROLL UP
            YSCRLDN        /S       SCROLL DOWN
/
/ LOWER CASE TABLE, PREFIXED WITH ESCAPE AND 'O'
/ THIS IS THE AUXILIARY KEYPAD, WHEN IN ANSI MODE.
/
LMN,        YCNEXTL        /L       NEXT LINE
            YCEOL          /M       CURSOR TO END OF LINE
            YHOME          /N       HOME CURSOR
            0               /O       <NOT GENERATED>
            YROWINS        /P       INSERT LINE
            YWLEFT         /Q       WORD LEFT
            YSEARCH        /R       START OF LINE
            YWRIGHT        /S       WORD RIGHT
            YMKROW         /T       MARK LINE
            YPICKUP        /U       PICKUP LINES
            YPUTDN         /V       PUT DOWN LINES
            YTOFC          /W       FIRST PAGE
            YDOSCRN        /X       RESTORE SCREEN
            YBOFC          /Y       LAST PAGE
/
/       ASCII CONTROL CODE TABLE
/
ITRAN,      0               /CTRL/NULL
            YTRANSP        /CTRL/A  TRANSPARENT MODE
            YDISMOD        /CTRL/B  DISPLAY MODIFIED LINES
            YQUIT          /CTRL/C  ABORT TO OS/8 
            YCSTART        /CTRL/D  CURSOR TO START OF LINE
            YTABL          /CTRL/E  TAB LEFT
            YCEOL          /CTRL/F  CURSOR TO END OF CURRENT LINE
            YUNMKROW       /CTRL/G  UNMARK ROW
            YBKDEL         /CTRL/H  BACKSPACE DELETE
            YTABR          /CTRL/I  TAB RIGHT
            YINSTOG        /CTRL/J  INSERT CHARACTER TOGGLE
            YDELWD         /CTRL/K  DELETE WORD
            YDELEWD        /CTRL/L  DELETE TO END OF WORD
            YRETURN        /CTRL/M  RETURN CODE
            YDOSCRN        /CTRL/N  RESTORE SCREEN
            0               /CTRL/O
            YCASE          /CTRL/P  INVERT CASE OF WORD
            0               /CTRL/Q  <RESERVED FOR XON/XOFF>
            YRCONT         /CTRL/R  CONTINUOUS REPLACE
            0               /CTRL/S  <RESERVED FOR XON/XOFF>
            YRSTEP         /CTRL/T  STEP REPLACEMENT
            YDLETLN        /CTRL/U  DELETE LINE
            YINSBLK        /CTRL/V  INSERT BLOCK
            YAWAY          /CTRL/W  CURSOR TO AWAY POSITION
            0               /CTRL/X
            YCNEXTL        /CTRL/Y  CURSOR TO START OF NEXT LINE
            YXEDIT         /CTRL/Z  CLOSE FILE
            0               /CTRL/[
/
/ VT100 CURSOR CONTROL KEYS. OVERLAYS CONTROL KEYS FOR SPACE
/ SO IF CONTROL KEY IS HIT BY MISTAKE, NO HARM IS DONE, IT JUST
/ DOES A CURSOR MOVEMENT.
/
ABCD,       YCUP           /A       CURSOR UP       CTRL/\
            YCDOWN         /B       CURSOR DOWN     CTRL/]
            YCRIGHT        /C       CURSOR RIGHT    CTRL/^
            YCLEFT         /D       CURSOR LEFT     CTRL/_
/
/       DISPATCH TABLE FOR EXTERPRETER FUNCTION CODES
/
XTAB,       ZPOS           /0 POSITION CURSOR
            ZINIT          /1 INITIALIZE SCREEN
            ZSPAC          /2 PAD CODE FOR TABS
            ZCRLF          /3 CR/LF TYPE SEQUENCE
            ZEOL           /4 ERASE TO END OF LINE
            ZCLSC          /5 CLEAR SCREEN AND HOME CURSOR
            ZINS           /6 INSERT LINE
            ZDEL           /7 DELETE LINE
            ZBEL           /8 RING BELL
            ZBKSP          /9 BACKSPACE
            ZSPV1          /10 SPECIAL VIDEO MODE 1
            ZSPV2          /11 SPECIAL VIDEO MODE 2
            ZNMV           /12 NORMAL VIDEO MODE
            ZEND           /13 NO-CRLF AT END OF LINE GRAPHIC
            ZRTN           /14 RETURN VDT TO ORIGINAL STATE
            ZCTRL          /15 CONTROL CODE-NON-DISPLAYABLE
/
/
/       ISEC    0               /ENABLE PAGING
/
/       ENTER HERE TO GET NEXT CHARACTER FROM CONSOLE TERMINAL.
/       ALL CHARACTERS ARE RETURNED IMMEDIATELY AND DIRECTLY
/       EXCEPT FOR THE ESCAPE/CONTROL CODES WHICH ARE USED TO IMPLEMENT
/       ALL FUNCTIONS.
/
IGCHAR, CLA                     /<BACK HERE AFTER BAD SEQUENCE>
XIN,    JMS I   PKBD            /GET CHARACTER FROM KEYBOARD
        TAD     (-0233          /TEST FOR ESCAPE CODE
        SNA                     /SKIP IF NOT
        JMP     ESCODE          /HANDLE ESCAPE CODE
        TAD     (0233-0240      /TEST FOR CONTROL CODE
        SPA                     /SKIP IF NOT CONTROL CODE
        JMP     CTRCOD          /ELSE HANDLE CONTROL CODE
        TAD     (0240           /RESTORE NORMAL CHARACTER
/
/       MERGE FROM SEVERAL PLACES TO EXIT
/
XKIO,   JMP I   KIO             /RETURN DIRECTLY TO VISTA
/
/       HERE ON ESCAPE CODE.
/       NEXT CHARACTER WILL BE LETTER O, SO FLUSH IT OUT
/
ESCODE, JMS I   PKBD            /READ CHARACTER AFTER ESCAPE CODE
        CLA                     /IGNORE IT
/
/ WE ARE HANDLING A 3-CHAR ESCAPE SEQUENCE. GET THE THIRD CHAR NOW
/
        JMS I   PKBD            /READ 3RD CHAR OF SEQUENCE
        TAD     (-"D-1          /TEST FOR A-D
        CLL                     /...
        TAD     ("D-"A+1        /...
        SZL
        JMP     DOABCD          /A-D
/
        TAD     ("A-"S-1        /M-S?
        CLL                     /...
        TAD     ("S-"M+1        /...
        SZL
        JMP     DOMPQRS         /M-S
/
        TAD     ("M-"Y-040-1  /L-Y LOWER CASE?
        CLL                     /...
        TAD     ("Y-"L+1        /...
        SNL                     /
        JMP     IGCHAR          /SOMETHING ELSE IGNORE IT
/
        TAD     (LMN-ABCD       /INDEX TABLE
DOABCD, TAD     (ABCD-MPQRS     /...
DOMPQRS,TAD     (MPQRS-ITRAN-040 /...
        JMP     .&7600+200
        PAGE
CTRCOD, TAD     (ITRAN+040      /BIAS CODE TO RANGE 0-37
/
        DCA     XT              /...
        CDF     00
        TAD I   XT              /LOAD VISTA INTERNAL CODE
        CDF     10             /RESET TO MAIN BUFFER FIELD
        SZA                     /IS THIS AN UNDEFINED CODE?
        JMP     XKIO            /NO SO RETURN IT IN THE AC
        JMP     XIN             /YES SO STRIP COMPLETELY
/
/       ENTER HERE WITH CHARACTER TO BE OUTPUT TO THE SCREEN
/
XOUT,   TAD     (-0200          /LOWEST ASCII CODE
        SPA                     /SKIP IF DISPLAYABLE CODE
        JMP     FUNCOD          /ELSE OFF FOR FUNCTION CODE
        TAD     (0200           /NORMAL CODE RESTORE IT
CHOUT,  JMS I   PSCR            /OUTPUT BACK TO SCREEN
/
/       COME HERE TO IGNORE CHARACTER
/
XNULL,  JMP     XSIO            /ALL DONE HERE
/
/       HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC
/       ON SCREEN. ENTER VT52 MODE TEMPORARILY AND ISSUE GRAPHIC CODE
/
ZEND,  TAD     ("H-"A          /"H" IN GRAPHICS FOR END OF LINE GRAPHIC
ZCTRL, TAD     ("A+040         /"A" IN GRAPHICS FOR CONTROL CHARACTER
DOGRAF, DCA     XT2             /SAVE GRAPHIC CHARACTER
        CLA CMA                 /SET FLAG NOT IN "ZRTN" FUNCTION
/
/ MERGE HERE TO END UP FROM 'Z:RTN' FUNCTION
/
ZRTN2, DCA     XT3             /CLEAR FLAG HERE
        TAD     ("?             /PRIVATE MODE
        JMS     ESCBRA          /...
        TAD     ("2             /ENTER VT52 MODE
        JMS I   PSCR            /...
        TAD     ("L+040         /END OF ESCAPE SEQUENCE--RESET MODE
        JMS I   PSCR            /...
        ISZ     XT3             /WERE WE IN THE "ZRTN" FUNCTION?
        JMP     XSIO            /YES SO ALL DONE HERE NOW
        TAD     ("F             /ENTER GRAPHICS MODE
        JMS     DOESC           /...
        TAD     XT2             /GRAPHIC CHAR
        JMS I   PSCR            /...
        TAD     ("G             /EXIT GRAPHICS MODE
        JMS     DOESC           /...
        TAD     ("<             /RETURN TO ANSCII MODE
        JMS     DOESC           /...
        JMP     XSIO            /DONE HERE
/
/ HERE TO RETURN VDT TO ORIGINAL CONDITION. ASSUME THAT MOST PDP-8 USERS
/ OF THE VT100 WILL WANT TO RETURN TO VDT-52 MODE, TO BE COMPATIBLE WITH
/ MOST DEC SOFTWARE
/
ZRTN,  TAD     (">             /EXIT ALTERNATE KEYPAD MODE
        JMS     DOESC           /...
        JMP     ZRTN2          /ALL DONE HERE
/
/       HERE ON FUNCTION CODE: INDEX DISPATCH TABLE
/
FUNCOD, TAD     (XTAB+0200      /INDEX DISPATCH TABLE
        DCA     XT2             /...
        CDF     00              /TO CURRENT FIELD
        TAD I   XT2             /GET ADDRESS
        CDF     10             /BACK TO BUFFER FIELD
        DCA     XT2             /...
        JMP I   XT2             /PASS CONTROL NOW
/
/       HERE ON TAB/PAD CODE: SEND AS SPACE
/
ZSPAC, TAD     ("              /RETURN SPACE INSTEAD
        JMP     CHOUT           /...
/
/       HERE FOR BACKSPACE FUNCTION
/
ZBEL,  CLA CMA                 /CONTROL/G DOES BELL FUNCTION
ZBKSP, TAD     (0210           /CONTROL/H DOES BACKSPACE FUNCTION
        JMP     CHOUT           /...
/
/       HERE TO INITIALIZE VDT. RUN VDT IN ANSI MODE.
/
ZINIT, TAD     ("<             /ENTER ANSI MODE
        JMS     DOESC           /...
        JMS     WINDOW          /ENSURE WINDOW RESET PROPERLY
        TAD     ("=             /SET ALTERNATE KEYPAD MODE
        JMS     DOESC           /...
        TAD     ("?             /DEC PRIVATE FLAG
        JMS     ESCBRA          /SEND ESC[?1
        TAD     ("1             /SET CURSOR KEYS TO APPLIC. KEYPAD MODE
        JMS I   PSCR            /...
        TAD     (";             /SEPARATOR ON SEQUENCE
        JMS I   PSCR            /...
        TAD     ("8             /TURN AUTO-REPEAT TO ON CONDITION
        JMS I   PSCR            /...
        TAD     ("H+040         /END OF SET MODE
        JMP     CHOUT           /DONE HERE
/
/       ERASE TO END OF LINE
/
ZEOL,  TAD     ("0             /END OF LINE FUNCTION
        JMS     ESCBRA          /...
        TAD     ("K             /END WITH CAP "K"
        JMP     CHOUT           /...
/
/       HERE TO DO FUNCTION PREFIXED BY ESCAPE AND BRACKET.
/
ESCBRA,     0
        DCA     XT              /SAVE CHARACTER TO GO OUT
        TAD     (0233           /SEND ESCAPE
        JMS I   PSCR            /...
        TAD     ("[             /BRACKET
        JMS I   PSCR            /...
        TAD     XT              /LAST CHARACTER
        SZA                     /SKIP IF ZERO ON ENTRY HERE
        JMS I   PSCR            /...
        JMP I   ESCBRA          /DONE HERE
/
/       DELETE LINE FUNCTION
/       HERE WE SET SCROLL PARAMETERS SO THAT TOP WINDOW IS THE LINE
/       TO DELETE. THEN WE CURSOR ADDRESS TO BOTTOM OF SCREEN AND
/       ISSUE A LINE FEED TO FORCE UPWARDS SCROLL
/       OPTIMIZE, HOWEVER SO THAT IF WE ARE ON THE TOP LINE, THERE
/       IS NO NEED TO RESET THE WINDOW
/
ZDEL,  JMS     CROW            /GET ADDRESS OF CURRENT ROW
        SZA                     /AVOID WINDOW IF LINE 0
        JMS     WINDOW          /SET NEW WINDOW VALUE
/
/       NOW WE HAVE SET THE WINDOW. CURSOR ADDRESS TO BOTTOM OF SCREEN.
/
        TAD     ROWSIZ          /ROW TO ADDRESS TO
        JMS     MOVEC           /MOVE CURSOR THERE
        TAD     (LF             /LINE FEED AT BOTTOM NOW
        JMS I   PSCR            /...
        JMS     CROW            /WHAT ROW ARE WE ON?
        SZA CLA                 /DON"T RESET WINDOW IF ON TOP ROW
        JMS     WINDOW          /RESET WINDOW NOW TO TOP LINE
        JMS     CROW            /ADDRESS OF CURRENT ROW
        JMS     MOVEC           /MOVE CURSOR TO COL 0, CURRENT LINE
        JMP     XSIO            /ALL DONE HERE
/
/       CLEAR SCREEN COMMAND
/
ZCLSC, TAD     ("2             /ERASE ENTIRE SCREEN
        JMP     .&7600+200
        PAGE
        JMS     ESCBRA          /DO ESCAPE AND [ AHEAD OF IT
        TAD     ("J             /END OF CLEAR SEQUENCE
        JMS I   PSCR            /...
        JMS     MOVEC           /HOME THE CURSOR NOW
        JMP     XSIO            /ALL DONE HERE
/
/       SUBROUTINE TO GET ADDRESS OF CURRENT ROW
/       RETURNS VALUE OF 0 FOR ROW 1 TO MAKE IT EASY TO DETECT
/
CROW,       0
        TAD     ROWTAB          /FIRST LINE IN TABLE
        CMA IAC                 /NEGATE AND SUBTRACT
        TAD     ROW             /ADJUST TO RANGE 1-N
        SZA                     /IF ON ROW 0, LEAVE AT 0
        IAC                     /ELSE UPDATE TO ROW 1-N RANGE
        JMP I   CROW            /ALL DONE HERE
/
/       MOVE LINE ADDRESS SPECIFIED IN AC ON ENTRY
/
MOVEC,      0
        DCA     XT2             /SAVE FOR A MOMENT
        JMS     ESCBRA          /ESCAPE [ AGAIN
        TAD     XT2             /ADDRESS OF SPECIFIED LINE
        JMS     TWOUT           /...
        TAD     (";             /SEPARATOR
        JMS I   PSCR            /...
        TAD     ("0             /COLUMN ZERO
        JMS I   PSCR            /...
        TAD     ("F+040         /END SEQUENCE
        JMS I   PSCR            /...
        JMP I   MOVEC           /DONE HERE
/
/       HERE TO SET WINDOW. BINARY LINE ADDRESS IN AC ON ENTRY
/
WINDOW,     0
        DCA     XT2             /SAVE LINE NUMBER
        JMS     ESCBRA          /DO ESCAPE AND BRACKET
        TAD     XT2             /GET TOP LINE POSITION
        JMS     TWOUT           /SET TOP LINE POSITION
        TAD     (";             /SEPARATE PARAMETERS
        JMS I   PSCR            /...
        TAD     ROWSIZ          /FINAL COLUMN
        JMS     TWOUT           /...
        TAD     ("R+040         /END OF SEQUENCE
        JMS I   PSCR            /...
        JMP I   WINDOW          /DONE HERE
/
/       HERE FOR INSERT LINE. TO INSERT A LINE. SET TOP WINDOW
/       ON THAT LINE, CURSOR ADDRESS TO THAT LINE AND ISSUE
/       A REVERSE INDEX COMMAND.
/       OPTIMIZE IF ROW IS UNESTABLISHED, ALL WE HAVE TO DO IS ERASE
/       THE ROW.
/
ZINS,  TAD     ROW             /GET CURRENT ROW POINTER
        IAC                     /+1 TO LOOK AT NEXT ROW
        DCA     XT2             /SAVE POINTER TO THAT ROW
        TAD I   XT2             /GET ADDRESS OF LENGTH/STATUS WORD FOR THAT ROW
        DCA     XT2             /SAVE THAT POINTER
        TAD I   XT2             /GET ACTUAL LENGTH/STATUS WORD
        SPA CLA                 /SKIP IF THE FOLLOWING ROW EXISTS
        JMP     ZEOL           /DOES NOT EXIST HANDLE WITH END OF LINE ERASE
/
        JMS     CROW            /START OF SCREEN
        SZA                     /AVOID WINDOW IF INSERT ON ROW 0
        JMS     WINDOW          /ELSE SET TOP WINDOW
        JMS     CROW            /CURRENT LINE AGAIN
        JMS     MOVEC           /MOVE CURSOR TO THAT LINE
        TAD     ("M             /DO REVERSE INDEX
        JMS     DOESC           /...
        JMS     CROW            /GET POSITION AGAIN
        SNA CLA                 /SKIP IF WE WERE NOT ON TOP ROW
        JMP     XSIO            /ALL DONE <CURSOR IN POSITION>
        JMS     WINDOW          /RESET SCREEN WINDOW
        JMS     CROW            /CURRENT ROW ADDRESS AGAIN
        JMS     MOVEC           /MOVE CURSOR BACK THERE
        JMP     XSIO            /ALL DONE HERE
/
/       OUTPUT ESCAPE SEQUENCE, CHAR IN AC
/
DOESC,      0
        DCA     XT              /SAVE CHARACTER
        TAD     (0233           /OUTPUT ESCAPE CODE
        JMS I   PSCR            /...
        TAD     XT              /REGET CHARACTER
        JMS I   PSCR            /...
        JMP I   DOESC           /ALL DONE HERE
/
/       HERE FOR CR/LF ON SCREEN.
/
ZCRLF, TAD     (0215           /CR
        JMS I   PSCR            /...
        TAD     (LF             /LF CODE
        JMP     CHOUT           /DONE HERE
/
/       HERE FOR VIDEO MODES WITH ADVANCED VIDEO OPTION.
/       IF YOU DO NOT HAVE ADVANCED VIDEO, CHANGE THE
/       CODE BELOW TO:
/
/               Z:NMV   JMP     XNULL   / NOTHING FOR NORMAL
/               Z:SPV1  TAD     ZCHAR
/                       JMP     DOGRAF  / DO GRAPHIC INSTEAD
/               ZCHAR   DC      'O+040  / GRAPHIC CHARACTER
/
ZNMV,  CLA CMA                 /TURN OFF ATTRIBUTES
/
ZSPV1, TAD     ("1-"4          /SET FOR BOLD
ZSPV2, TAD     ("4             /SET FOR UNDERLINE
        JMS     ESCBRA          /DO ESC[DIGIT
        TAD     ("M+040         /END OF SEQUENCE
        JMP     CHOUT           /...
/
/       HERE FOR POSITION CURSOR COMMAND. IN THIS CASE, WE POSITION
/       TO THE ROW AND COLUMN SPECIFIED BY 'ROW' AND 'COL'
/
/       VT100 REQUIRES:
/
/               ESC     [       XXX     YYY     f
/
/       WHERE XXX IS THE LINE NUMBER, AND YYY IS THE COLUMN POSITION
/
ZPOS,  JMS     ESCBRA          /START WITH ESCAPE AND BRACKET
        JMS     CROW            /ADDRESS OF CURRENT ROW
        JMS     TWOUT           /OUTPUT LINE ADDRESS
        TAD     (";             /SEPARATOR
        JMS I   PSCR            /...
        TAD     COL             /COLUMN POSITION
        IAC                     /ADJUST TO RANGE 1-N
        JMS     TWOUT           /OUTPUT THAT
        TAD     ("F+040         /END OF SEQUENCE
        JMP     CHOUT           /ALL DONE HERE
/
/       OUTPUT BINARY NUMBER IN AC AS TWO ASCII DIGITS
/
TWOUT,      0
        DCA     XT              /SAVE RESULT
        TAD     ("0-1           /INITIALIZE HIGH DIGIT
        DCA     XT2             /ACCUMULATE RESULT
        TAD     XT              /GET THE NUMBER
/
TW1,    ISZ     XT2             /COUNT THE DIGIT
        TAD     (-012           /COUNT TENS POSITION
        SMA                     /ALL DONE?
        JMP     TW1             /NO SO LOOP BACK NOW
/
        TAD     (012+"0         /MAKE A DIGIT
        DCA     XT              /AND SAVE IT
        TAD     XT2             /OUTPUT FIRST DIGIT
        JMS I   PSCR            /...
        TAD     XT              /OUTPUT SECOND DIGIT
        JMS I   PSCR            /...
        JMP I   TWOUT           /ALL DONE HERE
/
        JMP     .&7600+200
        PAGE
        *     06600