/ PAL8 VCM52 (AUTO-CONVERSION FROM PAGE8 TO PAL8) / TITLE VERSION 01.31 -- / / / ****************************************** / ** ** / ** 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 ** / ** ** / ** ** / ****************************************** / / / / 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 in public domain / and can be copied. / / / 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: 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 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 / / 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 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 /... 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 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