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

/	PAL8 VCM52 (AUTO-CONVERSION FROM PAGE8 TO PAL8)
/       TITLE   VERSION 01.29  --  COPYRIGHT NOTICE
/
/
/               ******************************************
/               **                                      **
/               **              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.EQ,VCM
/
/       WHERE FOR PAL8, 'VISTA.EQ' IS THE PAGE8 SYMBOL DIRECTORY CONVERTED
/       INTO PAL8 COMPATIBLE FORMAT.
/
XT3=XT2+1           /PAGE ZERO EQUATES
XT4=XT3+1           /...
XT5=XT4+1           /...
XT6=XT5+1           /...
/
        *     KIO             /KEYBOARD I/O
/       DSEC
/       AFIELD  BUF             /        MAIN DATA FIELD WHILE RUNNING
/
/       ALL FOLLOWING ADDRESSES ARE ABSOLUTELY REFERENCED BY VISTA
/       AND CANNOT BE CHANGED UNLESS VISTA ITSELF IS ALTERED.
/
KIO,        0               /KEYBOARD I/O ENTRY
        JMP I   PXIN            /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,      30              /NUMBER OF ROWS ON VIDEO SCREEN 20 DECIMAL
VCOLS,      120             /NUMBER OF COLUMNS ON VIDEO SCREEN 80 DECIMAL
VAUCOL,     110             /STARTING COLUMN FOR AUDIT TRAIL (72)
VSTAT,      2000           /NO XON/XOFF, CTRL/O ALLOWED
/
/       ### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ###
/
XKIO,   JMP I   KIO             /HERE TO EXIT FROM "KIO"
XSIO,   JMP I   SIO             /HERE TO EXIT FROM "SIO"
PXIN,       XIN             /POINTER TO "XIN"
PXOUT,      XOUT            /POINTER TO "XOUT"
/
/       VISTA INTERNAL CODE FOR ALL ESCAPED CHARACTERS POSSIBLE ON THE
/       KEYBOARD.
/
ABCD,       YCUP           /A       CURSOR UP
            YCDOWN         /B       CURSOR DOWN
            YCRIGHT        /C       CURSOR RIGHT
            YCLEFT         /D       CURSOR LEFT
/
/ VT52- THREE BLANK KEYS ON AUXILIARY KEYPAD
/
PQR,        YSCRLUP        /P       SCROLL UP
            YSCRLDN        /Q       SCROLL DONW
            YSEARCH        /R       SEARCH
/
/ MANUAL ESCAPE SEQUENCES ENTERED WITH ESCAPE KEY AND A DIGIT
/
ESCDIG,		YINSBLK		/1 - INSERT BLOCK
		YDELSCR		/2 - DELETE SCREEN
		YTRUNCF		/3 - TRUNCATE FILE
/
/ THE FOLLOWING CHARACTERS ARE IN LOWER CASE AND ARE PREFIXED WITH BOTH
/ THE ESCAPE CHARACTER AND A QUESTION MARK.
/
NY,	YHOME		/N	HOME CURSOR		
	0		/O	(NOT GENERATED)
	YROWINS		/P	INSERT LINE	
	YWLEFT		/Q	WORD LEFT	
	YPAGEDN		/R	PAGE DOWN	
	YWRIGHT		/S	WORD RIGHT	
	YMKROW		/T	MARK LINE	
	YPICKUP		/U	PICKUP TEXT	
	YPUTDN		/V	PUT DOWN TEXT	
	YTOFC		/W	FIRST PAGE	
	YPAGEUP		/X	PAGE UP		
	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
            YRCONT         /CTRL/R  CONTINUOUS REPLACE
            0               /CTRL/S
            YRSTEP         /CTRL/T
            YDLETLN        /CTRL/U  DELETE LINE
            0               /CTRL/V
            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/[
            0               /CTRL/\
            0               /CTRL/]
            0               /CTRL/^
            0               /CTRL/_
/
/       DISPATCH TABLE FOR EXTERPRETER FUNCTION CODES
/
XTABLE,     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 RETURNING TO OS/8
            ZCTRL          /15 CONTROL CODE-NON-DISPLAYABLE
/
/       ISEC    0
/
/       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.
/
XIN,    JMS I   PKBD            /GET CHARACTER FROM KEYBOARD
        TAD     (-0233          /TEST FOR ESCAPE CODE
        SNA                     /SKIP IF NOT
        JMP     X1H             /HANDLE ESCAPE CODE
        TAD     (0233-0240      /TEST FOR CONTROL CODE
        SPA                     /SKIP IF NOT CONTROL CODE
        JMP     X0H             /ELSE HANDLE CONTROL CODE
        TAD     (0240           /RESTORE NORMAL CHARACTER
        JMP     XKIO            /RETURN DIRECTLY TO VISTA
/
/       HERE ON CONTROL CODE.
/
X0H,    TAD     (ITRAN+040      /BIAS CODE TO RANGE 0-37
        JMP     X2H             /MERGE BELOW TO GET ASSOCIATED CODE
/
/       HERE ON ESCAPE CODE.
/       NEXT CHARACTER MUST BE QUESTION MARK OR A-D/M-S
/
X1H,    JMS I   PKBD            /READ CHARACTER AFTER ESCAPE CODE
        TAD     (-"?            /3-CHAR ESCAPE SEQUENCE?
        SNA                     /SKIP IF NOT
        JMP     THRCHR          /HANDLE THREE CHARACTER SEQUENCE
/ 									/01.11
/ CHECK FOR 1-3 FOR ESCAPE/DIGIT TYPE SEQUENCES				/01.11
/ 									/01.11
	TAD	("?-"3-1	/TEST FOR 1-3	
	CLL			/...		
	TAD	("3-"1+1	/...		
	SZL			/DIGIT 1-3 HERE?	
	JMP	DO123		/YES: HANDLE THIS
/
/       HERE TO CHECK FOR A-D FOR CURSOR MOVEMENT
/
ADCK,   TAD     ("1-"D-1        /TEST FOR A-D
        CLL                     /...
        TAD     ("D-"A+1        /...
        SZL                     /SKIP IF NOT A-D
        JMP     DOABCD          /ELSE HANDLE A-D HERE
        JMP     .&7600+200
	PAGE
        TAD     ("A-"R-1        /P,Q,R?
        CLL                     /...
        TAD     ("R-"P+1        /...
        SZL
        JMP     DOPQR           /P,Q,R
        JMP     BADESC          /ELSE HANDLE BAD ESCAPE SEQUENCE NOW
/
THRCHR, JMS I   PKBD            /READ THIRD CHARACTER OF SEQUENCE
/
/ CHECK FOR <ESC ? M> FOR ENTER COMMAND MODE
/
	TAD	(-"M		/M FOR ENTER COMMAND MODE?
	SNA			/...?
	JMP	X4H		/YES: HANDLE THIS NOW
/
        TAD     ("M-"Y-040-1    /N-Y LOWER CASE?
        CLL                     /...
        TAD     ("Y-"N+1        /...
        SZL                     /
        JMP     DONY            /N-Y LOWER CASE
BADESC, CLA
        JMP     XIN             /SOMETHING ELSE IGNORE IT
/
DO123,	TAD	(ESCDIG-ABCD	/INDEX TABLE
DOABCD, TAD     (ABCD-PQR       /...
DOPQR,	TAD     (PQR-NY         /...
DONY,	TAD     (NY             /...
X2H,	DCA     XT              /...
        CDF     00
        TAD I   XT              /LOAD VISTA INTERNAL CODE
X3H,    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
/
/ HERE ON <ESC ? M> ENTER COMMAND MODE
/
X4H,	TAD	(YNEWCMD	/GET FUNCTION CODE
	JMP	X3H		/LOOP BACK WITH CODE
/
/       ENTER HERE WITH CHARACTER TO BE OUTPUT TO THE SCREEN
/
XOUT,   DCA     XT              /SAVE CHARACTER FOR A MOMENT
        TAD     XT              /REGET CHARACTER
        TAD     (-0200          /LOWEST ASCII CODE
        SPA                     /SKIP IF DISPLAYABLE CODE
        JMP     XFUNCT          /ELSE OFF FOR FUNCTION CODE
        TAD     (0200           /NORMAL CODEZ RESTORE IT
CHOUT,  JMS I   PSCR            /OUTPUT BACK TO SCREEN
/
/       COME HERE TO IGNORE CHARACTER
/
XNULL,  JMP     XSIO            /ALL DONE HERE
/
/       HERE FOR VIDEO MODES. CAN'T REALLY DO ANYTHING SINCE VT52 HAS NO
/       VIDEO ENHANCEMENTS. BEST BET IS JUST TO USE A SPECIAL GRAPHIC CODE
/
ZNMV,  JMP     XSIO            /NORMAL VIDEOZ DO NOTHING
/
ZSPV1, TAD     ("H-"K          /GENERATE GRAPHIC
ZSPV2, TAD     ("K-"I          /USE APPROPRIATE GRAPHIC
/
/       HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC
/       ON SCREEN.
/
ZEND,  TAD     ("I-"A          /GRAPHIC FOR END OF LINE
ZCTRL, TAD     ("A+040         /GRAPHIC FOR CONTROL CHARACTER
        DCA     XT2             /SAVE FOR A MOMENT
        TAD     ("F             /ENTER GRAPHICS MODE
        JMS     DOESC           /...
        TAD     XT2             /GENERATES NICE GRAPHIC
        JMS I   PSCR            /...
        TAD     ("G             /RE-SET GRAPHICS MODE
        JMP     ESCX            /ALL DONE HERE
/
/       HERE ON FUNCTION CODE: INDEX DISPATCH TABLE
/
XFUNCT, TAD     (XTABLE+200     /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 FOR SIMPLE TWO-CHARACTER ESCAPE FUNCTIONS
/
ZRTN,  TAD     (">-"=          /EXIT FROM ALTERNATE KEYPAD MODE
ZINIT, TAD     ("=-"K          /ESCAPE/= SETS ALTERNATE KEYPAD MODE
ZEOL,  TAD     ("K-"C          /DO ESCAPE/K FOR ERASE TO EOL
ZCRI,  TAD     ("C             /ESCAPE/C IS CURSOR RIGHT
ESCX,   JMS     DOESC           /DO ESCAPE SEQUENCE
        JMP     XSIO            /ALL DONE HERE
/
/       DELETE LINE FUNCTION. SINCE VT52 HAS NO DELETE LINE FUNCTION, WE
/       HAVE TO IMPROVISE HERE:
/
/               IF ON TOP HALF OF SCREEN, ISSUE LINE FEED ON BOTTOM LINE TO
/               SCROLL UP, THEN COPY ALL LINES FROM TOP OF SCREEN UP TO BUT
/               NOT INCLUDING THE LINE TO BE DELETED.
/
/               IF ON BOTTOM HALF OF SCREEN, COPY LINES FROM DELETED LINE
/               TO END OF SCREEN.
/
/       WITH THIS ALGORITHM, ARE WORST CASE IS THAT WE HAVE TO COPY HALF
/       OF THE SCREEN BACK OUT
/
/       ROOM    4
ZDEL,  JMS     HALFCK          /CHECK FOR WHICH HALF OF SCREEN
        JMP     BOTHLF          /<1> SECOND HALF OF SCREEN
/
/       <2> HERE WE ARE IN THE TOP HALF OF THE SCREEN, SO ISSUE LINE FEED
/       ON BOTTOM LINE TO SCROLL UP, THEN COPY LINES OUT.
/
        CLA CMA                 /LINE WE WANT TO MOVE TO
        TAD     ROWSIZ          /...
        JMS     MOVEC           /MOVE CURSOR TO THAT LINE
        TAD     (LF             /LINE FEED
        JMS I   PSCR            /...
        JMS     TOPHLF          /RESTORE TOP HALF OF SCREEN
        JMP     XSIO            /ALL SET <CURSOR AT START OF LINE BELOW>
/
/       SUBROUTINE TO RESTORE THE TOP HALF OF THE SCREEN. USED BY INSERT
/       AND DELETE LINE COMMANDS
/
TOPHLF, .-.
        TAD     ("H             /HOME CURSOR
        JMS     DOESC           /...
        TAD     ROWTAB          /SET POINTER TO START OF TABLE
        JMS     PRCALL          /CALL ROUTINE TO DISPLAY THE LINES
        JMP I    TOPHLF          /ALL DONE HERE
/
/       NOW CALL 'PRLINE' TO PRINT OUT ALL LINES UP TO LINE BEING
/       DELETED.
/
        JMP I    PRCALL          /ALL DONE HERE
PRCALL, .-.
        DCA     XT3             /SAVE POINTER TO STARAT OF TABLE
        TAD     ROW             /CURRENT ROW ADDRESS
        CMA                     /NEGATE AND SUBTRACT FROM
        TAD     ROWTAB          /START OF ROW TABLE
        JMS     DOROWS          /DO THAT SET OF ROWS <MAY BE NULL>
	JMP	.&7600+200	/ONTO NEXT PAGE
	PAGE
/
/       RE-POSITION CURSOR NOW IN CASE WE WERE COPYING THE BOTTOM HALF
/       OF THE SCREEN. VISTA ASSUMES THAT CURSOR IS POSITIONED PROPERLY
/       AFTER AN INSERT LINE COMMAND IS EXECUTED.
/
        TAD     ROWTAB          /START OF ROW TABLE
        CMA IAC                 /SUBTRACT FROM CURRENT ROW
        TAD     ROW             /TO GET OFFSET INTO SCREEN
        JMS     MOVEC           /MOVE CURSOR NOW
	JMP	PRCALL-1	/EXIT NOW
/
/       HERE ON BOTTOM HALF OF SCREEN. JUST COPY LINES FROM CURRENT
/       LINE UP TO END OF SCREEN.
/
BOTHLF, TAD     ROW             /START AT CURRENT ROW
        JMS     PRCALL          /USE "PRLINE" NOW TO RE-DISPLAY THE LINES
        JMP     XSIO            /ALL SET
/       PART
/
/       SUBROUTINE TO PRINT OUT A SET OF ROWS. COUNT IS IN AC ON ENTRY.
/       XT3 SHOULD HAVE BEEN SET WITH INITIAL ROW POINTER.
/
/       NOTE: MUST SAVE CALLING ADDRESSES TO 'SIO' AND TO 'XTER' BECAUSE
/       OUR CALL TO 'PRLINE' HERE WILL DESTROY THEM.
/
DOROWX,	JMP I   DOROWS		/OFF-PAGE EXIT FROM 'DOROWS'
DOROWS, .-.                     /ENTRY POINT
        DCA     XT4             /SET LOOP COUNT
        CDF     00              /TO CURRENT FIELD FOR A MOMENT
/       AFIELD  %*              /...
        TAD     SIO             /PROTECT AGAINST RECURSIVE CALL
        DCA     XT5             /SAVE FOR EXIT
        TAD     XTER            /...
        DCA     XT6             /...
        CDF     10
/       AFIELD  BUF
        JMP     D2H             /START AT END OF LOOP IN CASE DONE
/
/       LOOP BACK HERE TO PRINT OUT THE NEXT ROW
/
D1H,    TAD I   XT3             /NEXT ROW TABLE POINTER
        JMS     PRLINE          /PRINT OUT THAT ROW
	TAD	("K		/ERASE TO END OF THAT LINE
	JMS	DOESC		/...
        TAD     XT3             /GET ADDRESS OF THAT ROW
        CMA IAC                 /NEGATE AND SUBTRACT FROM
        TAD     LASTROW         /LAST ROW ADDRESS
        SNA CLA                 /WAS THAT THE VERY LAST ROW?
        JMP     D3H             /YESZ SO ALL DONE HERE
/
        ISZ     XT3             /NOT LAST ROWZ STEP POINTER
        TAD     (XCRLF          /RECURSIVE CALL FOR CR/LF
        JMS     SIO             /...<SAFE SINCE ADDRESS WAS SAVED>
D2H,    ISZ     XT4             /TEST LOOP COUNTER
        JMP     D1H             /MORE ROWS TO DO
/
/       HERE WHEN ALL DONE
/
D3H,    TAD     XT5             /RESTORE ADDRESS SAVED FOR RECURSE
        CDF     00              /BACK TO CURRENT FIELD FOR A MOMENT
/       AFIELD  %*              /...
        DCA     SIO             /...
        TAD     XT6             /...
        DCA     XTER            /...
        CDF     10
/       AFIELD  BUF             /...
        JMP      DOROWX          /ALL DONE HERE
/
/       HERE TO TEST TO SEE WHICH HALF OF THE SCREEN WE ARE IN. FIRST
/       RETURN INDICATES WE ARE IN SECOND HALF OF SCREEN. SECOND RETURN
/       INDICATES WE ARE IN FIRST HALF OF SCREEN.
/
/       ROOM    5
        ISZ     HALFCK          /TAKE SECOND RETURN
	JMP I	HALFCK		/...
HALFCK, .-.                     /ENTRY AND EXIT POINT
        TAD     ROW             /CURRENT ROW NUMBER
        CMA                     /SUBTRACT FROM START OF ROW TABLE
        TAD     ROWTAB          /...
        CLL RAL                 /MULTIPLY BY TWO <IT"S NEGATIVE>
        TAD     ROWSIZ          /AND SUBTRACT FROM NUMBER OF ROWS
        SPA CLA                 /WHICH HALF OF THE SCREEN ARE WE IN?
        JMP I    HALFCK          /SECOND HALFZ TAKE FIRST RETURN
        JMP     HALFCK-2        /FIRST HALFZ TAKE SECOND RETURN
/
/       HERE FOR INSERT LINE FUNCTION. AS WITH DELETE LINE WE HAVE TO
/       IMPROVISE ON THE VT52 SINCE THERE IS NO NATIVE CRT FUNCTION.
/
/       IN THIS CASE WE ALSO OPTIMIZE:
/
/               INSERTION IN TOP HALF OF SCREEN:
/                       ISSUE REVERSE LINE FEED ON TOP LINE, COPY ALL
/                       ROWS FROM TOP ROW UP TO BUT NOT INCLUDING ROW
/                       WE ARE ON. EXCEPTION: IF FOLLOWING LINE DOES NOT EXIST
/                       ALL WE NEED TO DO IS ERASE THAT LINE (NO NEED TO COPY)
/
/               INSERTION IN BOTTOM HALF OF SCREEN. COPY ROWS FROM CURRENT
/               POSITION TO END OF SCREEN.
/
/       ROOM    4
ZINS,  JMS     HALFCK          /WHICH HALF OF SCREEN ARE WE IN?
        JMP     ZINS2           /SECOND HALF OF SCREEN
        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 EXISTZ HANDLE WITH END OF LINE ERASE
        JMS     MOVEC           /AC=0 TO MOVE CURSOR TO TOP ROW
        TAD     ("I             /ISSUE REVERSE INDEX COMMAND
        JMS     DOESC           /...
        JMS     TOPHLF          /NOW RECOPY TOP HALF OF SCREEN
        TAD     ("K             /ERASE TO END OF LINE NOW
        JMP     ESCX            /ALL DONE HERE
/
ZINS2,  TAD     (CR             /RETURN TO START OF CURRENT LINE
        JMS I   PSCR            /...
        TAD     ("K             /NOW ERASE TO END OF LINE
        JMS     DOESC           /...
        JMP     BOTHLF          /RECOPY BOTTOM HALF OF SCREEN NOW
/
/       CLEAR SCREEN.
/
ZCLSC, TAD     ("H             /HOME CURSOR FIRST
        JMS     DOESC           /...
        TAD     ("J             /NOW DO ERASE TO END OF MEMORY
        JMP     ESCX            /...
/
/       OUTPUT ESCAPE SEQUENCE, CHAR IN AC
/
DOESC,  .-.
        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     (CR             /JUST DO A CR
        JMS I   PSCR            /...
        TAD     (LF             /FOLLOWED BY A LINE FEED
        JMP     CHOUT           /...
/
/       HERE FOR POSITION CURSOR COMMAND. IN THIS CASE, WE POSITION
/       TO THE ROW AND COLUMN SPECIFIED BY 'ROW' AND 'COL'
/
/       VT52 REQUIRES:
/
/               ESC     Y       L       C
/
/       WHERE X IS THE LINE NUMBER, AND Y IS THE COLUMN POSITION
/
ZPOS,  TAD     ROWTAB          /START OF ROW TABLE
        CMA IAC                 /NEGATE AND SUBTRACT FROM
        TAD     ROW             /CURRENT ROW POSITION
        JMS     MOVEC           /MOVE CURSOR TO THAT ROW NOW
        JMP     XSIO            /ALL DONE HERE
/
/       SUBROUTINE TO MOVE TO A PARTICULAR ROW AND COLUMN. ON ENTRY
/       'COL' HAS THE DESIRED COLUMN, AND THE AC HAS THE BINARY ROW
/       POSITION THAT WE WANT.
/
MOVEC,  .-.
        TAD     ("              /BUILD ASCII CODE FOR LINE POSITION
        DCA     XT3             /SAVE FOR A MOMENT
        TAD     ("Y             /START OF POSITIONING SEQUENCE
        JMS     DOESC           /START THE SEQUENCE
        TAD     XT3             /GET ROW POSITION
        JMS I   PSCR            /OUTPUT THAT
        TAD     COL             /GET THE BINARY COLUMN POSITION
        TAD     ("              /BUILD ASCII CODE FOR COLUMN
        JMS I   PSCR            /OUTPUT THAT
        JMP I    MOVEC           /ALL DONE HERE