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 T O 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