File: VCM52.PG of Tape: Sources/Other/new-22-vista-2
(Source file text)
FILE VCM52 - DEC VT52 TERMINAL /01.11 / TITLE VERSION 01.15 -- 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 EJECT / / 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 TITLE SCREEN LAYOUT FORMAT / / 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. / TITLE IMPORTANT GLOBAL CELLS / / 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') / / GLEN RETURNS LENGTH OF CURRENT LINE IN THE AC (0=NULL / LINE) TITLE ASSEMBLY INSTRUCTIONS / / 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. / XT3 EQU XT2+1 PAGE ZERO EQUATES XT4 EQU XT3+1 ... XT5 EQU XT4+1 ... XT6 EQU XT5+1 ... / ORG 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 DC 0 KEYBOARD I/O ENTRY JMPI PXIN CONTINUE NOW / SIO DC 0 SCREEN I/O ENTRY POINT JMPI PXOUT CONTINUE / VMCMNT DC -'/ MINUS ASCII CODE OF COMMENT FIELD CHARACTER VMTAG DC -', MINUS ASCII CODE OF TAG FIELD DELIMITER VROWS DC 24 NUMBER OF ROWS ON VIDEO SCREEN VCOLS DC 80 NUMBER OF COLUMNS ON VIDEO SCREEN VAUCOL DC 72 STARTING COLUMN FOR AUDIT TRAIL OF VERSION #'S VSTAT DC 02000 NO XON/XOFF, CTRL/O ALLOWED / / ### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ### / XKIO JMPI KIO HERE TO EXIT FROM 'KIO' XSIO JMPI SIO HERE TO EXIT FROM 'SIO' PXIN DC XIN POINTER TO 'XIN' PXOUT DC XOUT POINTER TO 'XOUT' TITLE KEYBOARD ESCAPE TRANSLATION TABLE / / VISTA INTERNAL CODE FOR ALL ESCAPED CHARACTERS POSSIBLE ON THE / KEYBOARD. / ABCD DC Y:CUP A CURSOR UP DC Y:CDOWN B CURSOR DOWN DC Y:CRIGHT C CURSOR RIGHT DC Y:CLEFT D CURSOR LEFT / PQR DC Y:SCRLUP P SCROLL UP /01.11 DC Y:SCRLDN Q SCROLL DOWN /01.11 DC Y:SEARCH R SEARCH /01.11 / /01.11 / ALL OF THE FOLLOWING CHARACTERS ARE IN LOWER CASE AND PRECEDED /01.11 / WITH AN ESCAPE AND THEN A QUESTION MARK /01.11 / NY DC Y:HOME N HOME CURSOR /01.11 DC 0 O (NOT GENERATED) /01.11 DC Y:ROWINS P INSERT LINE /01.11 DC Y:WLEFT Q WORD LEFT /01.11 DC Y:PAGEDN R PAGE DOWN /01.11 DC Y:WRIGHT S WORD RIGHT /01.11 DC Y:MKROW T MARK LINE /01.11 DC Y:PICKUP U PICKUP TEXT /01.11 DC Y:PUTDN V PUT DOWN TEXT /01.11 DC Y:TOFC W FIRST PAGE /01.11 DC Y:PAGEUP X PAGE UP /01.11 DC Y:BOFC Y LAST PAGE /01.11 / /01.11 / THE FOLLOWING TABLE ENTRIES ARE PRECEDED WITH THE ESCAPE KEY (AND /01.11 / USUALLY GENERATED MANUALLY) /01.11 / /01.11 ESCDIG DC Y:INSBLK 1 INSERT BLOCK /01.11 DC Y:DELSCR 2 DELETE SCREEN /01.11 DC Y:TRUNCF 3 TRUNCATE FILE /01.11 / / ASCII CONTROL CODE TABLE / ITRAN DC 0 CTRL/NULL DC Y:TRANSP CTRL/A TRANSPARENT MODE DC Y:DISMOD CTRL/B DISPLAY MODIFIED LINES DC Y:QUIT CTRL/C ABORT TO OS/8 DC Y:CSTART CTRL/D CURSOR TO START OF LINE DC Y:TABL CTRL/E TAB LEFT DC Y:CEOL CTRL/F CURSOR TO END OF CURRENT LINE DC Y:UNMKROW CTRL/G UNMARK ROW DC Y:BKDEL CTRL/H BACKSPACE DELETE DC Y:TABR CTRL/I TAB RIGHT DC Y:INSTOG CTRL/J INSERT CHARACTER TOGGLE DC Y:DELWD CTRL/K DELETE WORD DC Y:DELEWD CTRL/L DELETE TO END OF WORD DC Y:RETURN CTRL/M RETURN CODE DC Y:DOSCRN CTRL/N RESTORE SCREEN DC 0 CTRL/O DC Y:CASE CTRL/P INVERT CASE OF WORD DC 0 CTRL/Q DC Y:RCONT CTRL/R CONTINUOUS REPLACE DC 0 CTRL/S DC Y:RSTEP CTRL/T STEP REPLACE /01.11 DC Y:DLETLN CTRL/U DELETE LINE DC 0 CTRL/V DC Y:AWAY CTRL/W CURSOR TO AWAY POSITION DC 0 CTRL/X DC Y:CNEXTL CTRL/Y CURSOR TO START OF NEXT LINE DC Y:XEDIT CTRL/Z CLOSE FILE DC 0 CTRL/[ DC 0 CTRL/\ DC 0 CTRL/] DC 0 CTRL/^ DC 0 CTRL/_ TITLE SCREEN TRANSLATION TABLE / / DISPATCH TABLE FOR EXTERPRETER FUNCTION CODES / XTAB DC Z:POS 0 POSITION CURSOR DC Z:INIT 1 INITIALIZE SCREEN DC Z:SPAC 2 PAD CODE FOR TABS DC Z:CRLF 3 CR/LF TYPE SEQUENCE DC Z:EOL 4 ERASE TO END OF LINE DC Z:CLSC 5 CLEAR SCREEN AND HOME CURSOR DC Z:INS 6 INSERT LINE DC Z:DEL 7 DELETE LINE DC Z:BEL 8 RING BELL DC Z:BKSP 9 BACKSPACE DC Z:SPV1 10 SPECIAL VIDEO MODE 1 DC Z:SPV2 11 SPECIAL VIDEO MODE 2 DC Z:NMV 12 NORMAL VIDEO MODE DC Z:END 13 NO-CRLF AT END OF LINE GRAPHIC DC Z:RTN 14 RETURNING TO OS/8 DC Z:CTRL 15 CONTROL CODE-NON-DISPLAYABLE TITLE TRANSLATION ROUTINES / 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 JMSI PKBD GET CHARACTER FROM KEYBOARD TAD =-0233 TEST FOR ESCAPE CODE SNA SKIP IF NOT JMP 1F HANDLE ESCAPE CODE TAD =0233-0240 TEST FOR CONTROL CODE SPA SKIP IF NOT CONTROL CODE JMP 0F ELSE HANDLE CONTROL CODE TAD =0240 RESTORE NORMAL CHARACTER JMP XKIO RETURN DIRECTLY TO VISTA / / HERE ON CONTROL CODE. / /01.14 0H TAD =ITRAN+040 BIAS CODE TO RANGE 0-37 JMP 2F MERGE BELOW TO GET ASSOCIATED CODE / / HERE ON ESCAPE CODE. / NEXT CHARACTER MUST BE QUESTION MARK OR A-D/M-S / 1H JMSI 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 /01.11 CLL ... /01.11 TAD ='3-'1+1 ... /01.11 SZL DIGIT 1-3 HERE? /01.11 JMP DO123 YES: HANDLE THIS /01.11 / / HERE TO CHECK FOR A-D FOR CURSOR MOVEMENT / ADCK TAD ='1-'D-1 TEST FOR A-D /01.11 CLL ... TAD ='D-'A+1 ... SZL SKIP IF NOT A-D JMP DOABCD ELSE HANDLE A-D HERE TAD ='A-'R-1 P,Q,R? /01.11 CLL ... TAD ='R-'P+1 ... /01.11 SZL JMP DOPQR P-R /01.11 JMP BADESC ELSE HANDLE BAD ESCAPE SEQUENCE NOW / THRCHR JMSI PKBD READ THIRD CHARACTER OF SEQUENCE TAD =-'M ESC ? M SEQUENCE HERE? /01.11 SNA ... /01.11 JMP 4F YES: HANDLE THIS /01.11 TAD ='M-('Y+040)-1 N-Y LOWER CASE? /01.11 CLL ... TAD ='Y-'N+1 ... /01.11 SZL JMP DONY N-Y LOWER CASE /01.11 BADESC CLA JMP XIN SOMETHING ELSE: IGNORE IT / DO123 TAD =ESCDIG-ABCD INDEX TABLE /01.11 DOABCD TAD =ABCD-PQR ... /01.11 DOPQR TAD =PQR-NY ... /01.11 /01.11 DONY TAD =NY ... /01.11 / 2H DCA XT ... CDF %* TADI XT LOAD VISTA INTERNAL CODE 3H CDF BUF RESET TO MAIN BUFFER FIELD /01.11 SZA IS THIS AN UNDEFINED CODE? JMP XKIO NO: SO RETURN IT IN THE AC JMP XIN YES: SO STRIP COMPLETELY / /01.11 / HERE ON <ESCAPE ? M> WHICH IS USED FOR THE ENTER COMMAND MODE FUNCTION/01.11 / /01.11 4H TAD =Y:NEWCMD GET VISTA FUNCTION CODE /01.11 JMP 3B LOOP BACK NOW /01.11 TITLE OUTPUT PROCESSING / / 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 1F ELSE OFF FOR FUNCTION CODE TAD =0200 NORMAL CODE: RESTORE IT CHOUT JMSI 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 / Z:NMV JMP XSIO NORMAL VIDEO: DO NOTHING / Z:SPV1 TAD ='H-'K GENERATE GRAPHIC Z:SPV2 TAD ='K-'I USE APPROPRIATE GRAPHIC CHARACTER / / HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC / ON SCREEN. / Z:END TAD ='I-'A GRAPHIC FOR END OF LINE Z:CTRL 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 JMSI PSCR ... TAD ='G RE-SET GRAPHICS MODE JMP ESCX ALL DONE HERE / / HERE ON FUNCTION CODE: INDEX DISPATCH TABLE / 1H TAD =XTAB+0200 INDEX DISPATCH TABLE DCA XT2 ... CDF %* TO CURRENT FIELD TADI XT2 GET ADDRESS CDF BUF BACK TO BUFFER FIELD DCA XT2 ... JMPI XT2 PASS CONTROL NOW / / HERE ON TAB/PAD CODE: SEND AS SPACE / Z:SPAC TAD =' RETURN SPACE INSTEAD JMP CHOUT ... EJECT / / HERE FOR BACKSPACE FUNCTION / Z:BEL LDI -1 CONTROL/G DOES BELL FUNCTION Z:BKSP TAD =0210 CONTROL/H DOES BACKSPACE FUNCTION JMP CHOUT ... / / HERE FOR SIMPLE TWO-CHARACTER ESCAPE FUNCTIONS / Z:RTN TAD ='>-'= EXIT FROM ALTERNATE KEYPAD MODE Z:INIT TAD ='=-'K ESCAPE/= SETS ALTERNATE KEYPAD MODE Z:EOL TAD ='K-'C DO ESCAPE/K FOR ERASE TO EOL Z:CRI 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 Z:DEL 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. / LDI -1 LINE WE WANT TO MOVE TO TAD ROWSIZ ... JMS MOVEC MOVE CURSOR TO THAT LINE TAD =LF LINE FEED JMSI 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 SUB TAD ='H HOME CURSOR JMS DOESC ... TAD ROWTAB SET POINTER TO START OF TABLE JMS PRCALL CALL ROUTINE TO DISPLAY THE LINES RET TOPHLF ALL DONE HERE / / SET UP TO CALL 'PRLINE' TO PRINT OUT ALL LINES UP TO LINE BEING /01.14 / DELETED. / PRCALL SUB DCA XT3 ... 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) / / 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 RET PRCALL ALL DONE HERE / / 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. / DOROWS SUB ENTRY POINT DCA XT4 SET LOOP COUNT CDF %* TO CURRENT FIELD FOR A MOMENT AFIELD %* ... TAD SIO PROTECT AGAINST RECURSIVE CALL DCA XT5 SAVE FOR EXIT TAD XTER ... DCA XT6 ... CDF BUF AFIELD BUF JMP 2F START AT END OF LOOP IN CASE DONE / / LOOP BACK HERE TO PRINT OUT THE NEXT ROW / 1H TADI XT3 NEXT ROW TABLE POINTER JMS PRLINE PRINT OUT THAT ROW TAD ='K FOLLOW WITH ERASE TO END OF LINE /01.14 JMS DOESC ... /01.14 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 3F YES: SO ALL DONE HERE / INC XT3 NOT LAST ROW: STEP POINTER TAD =X:CRLF RECURSIVE CALL FOR CR/LF JMS SIO ...(SAFE SINCE ADDRESS WAS SAVED) 2H ISZ XT4 TEST LOOP COUNTER JMP 1B MORE ROWS TO DO / / HERE WHEN ALL DONE / 3H TAD XT5 RESTORE ADDRESS SAVED FOR RECURSE CDF %* BACK TO CURRENT FIELD FOR A MOMENT AFIELD %* ... DCA SIO ... TAD XT6 ... DCA XTER ... CDF BUF AFIELD BUF ... RET DOROWS ALL DONE HERE / / HERE TO TEST TO SEE W HICH 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 INC HALFCK TAKE SECOND RETURN HALFCK SUB 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? RET HALFCK SECOND HALF: TAKE FIRST RETURN JMP HALFCK-2 FIRST HALF: 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 Z:INS 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 TADI XT2 GET ADDRESS OF LENGTH/STATUS WORD FOR THAT ROW DCA XT2 SAVE THAT POINTER TADI XT2 GET ACTUAL LENGTH/STATUS WORD SPA CLA SKIP IF THE FOLLOWING ROW EXISTS JMP Z:EOL DOES NOT EXIST: 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 JMSI PSCR ... TAD ='K NOW ERASE TO END OF LINE JMS DOESC ... JMP BOTHLF RECOPY BOTTOM HALF OF SCREEN NOW / / CLEAR SCREEN. / Z:CLSC 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 SUB DCA XT SAVE CHARACTER TAD =0233 OUTPUT ESCAPE CODE JMSI PSCR ... TAD XT REGET CHARACTER JMSI PSCR ... RET DOESC ALL DONE HERE / / HERE FOR CR/LF ON SCREEN. / Z:CRLF TAD =CR JUST DO A CR JMSI PSCR ... TAD =LF FOLLOWED BY A LINE FEED JMP CHOUT ... EJECT / / 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 / Z:POS 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 SUB 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 JMSI PSCR OUTPUT THAT TAD COL GET THE BINARY COLUMN POSITION TAD =' BUILD ASCII CODE FOR COLUMN JMSI PSCR OUTPUT THAT RET MOVEC ALL DONE HERE