File: VCM100.PG of Tape: Sources/Other/new-22-vista-2
(Source file text)
FILE VCM100 - VT100 V.C.M. FILE / TITLE VERSION 01.21 -- 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 / / / 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') 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. / / 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. TITLE FIXED SECTION / XT3 EQU XT2+1 TEMPORARY LOCATION ON PAGE 0 FOR VCM FILE / ORG KIO KEYBOARD I/O DSEC / / ALL FOLLOWING ADDRESSES ARE ABSOLUTELY REFERENCED BY VISTA / AND CANNOT BE CHANGED UNLESS VISTA ITSELF IS ALTERED. / KIO DC 0 KEYBOARD I/O ENTRY JMP XIN 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 030 24 ROWS ON VIDEO SCREEN VCOLS DC 0120 80 COLUMNS ON VIDEO SCREEN VAUCOL DC 0110 COLUMN 72 FOR AUDIT TRAIL OF VERSION #'S VSTAT DC 06000 XON/XOFF PROCESSED, CTRL/O ALLOWED / / ### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ### / XSIO JMPI SIO HERE TO EXIT FROM 'SIO' PXOUT DC XOUT POINTER TO 'XOUT' TITLE KEYBOARD ESCAPE TRANSLATION TABLE / / 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 DC Y:NEWCMD M ENTER COMMAND MODE DC Y:DELSCR N DELETE SCREEN (GENERATED MANUALLY) DC Y:TRUNCF O TRUNCATE FILE (GENERATED MANUALLY) DC Y:PAGEUP P PAGE UP DC Y:PAGEDN Q PAGE DOWN DC Y:SCRLUP R SCROLL UP DC Y:SCRLDN S SCROLL DOWN / / LOWER CASE TABLE, PREFIXED WITH ESCAPE AND 'O' / THIS IS THE AUXILIARY KEYPAD, WHEN IN ANSI MODE. / LMN DC Y:CNEXTL L NEXT LINE DC Y:CEOL M CURSOR TO END OF LINE DC Y:HOME N HOME CURSOR DC 0 O (NOT GENERATED) DC Y:ROWINS P INSERT LINE DC Y:WLEFT Q WORD LEFT DC Y:SEARCH R START OF LINE DC Y:WRIGHT S WORD RIGHT DC Y:MKROW T MARK LINE DC Y:PICKUP U PICKUP LINES DC Y:PUTDN V PUT DOWN LINES DC Y:TOFC W FIRST PAGE DC Y:DOSCRN X RESTORE SCREEN DC Y:BOFC Y LAST PAGE / / 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 (RESERVED FOR XON/XOFF) DC Y:RCONT CTRL/R CONTINUOUS REPLACE DC 0 CTRL/S (RESERVED FOR XON/XOFF) DC Y:RSTEP CTRL/T STEP REPLACEMENT DC Y:DLETLN CTRL/U DELETE LINE DC Y:INSBLK CTRL/V INSERT BLOCK 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/[ / / 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 DC Y:CUP A CURSOR UP CTRL/\ DC Y:CDOWN B CURSOR DOWN CTRL/] DC Y:CRIGHT C CURSOR RIGHT CTRL/^ DC Y:CLEFT D CURSOR LEFT 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 RETURN VDT TO ORIGINAL STATE DC Z:CTRL 15 CONTROL CODE-NON-DISPLAYABLE / TITLE TRANSLATION ROUTINES / 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 JMSI 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 JMPI KIO RETURN DIRECTLY TO VISTA / / HERE ON ESCAPE CODE. / NEXT CHARACTER WILL BE LETTER O, SO FLUSH IT OUT / ESCODE JMSI PKBD READ CHARACTER AFTER ESCAPE CODE CLA IGNORE IT / / WE ARE HANDLING A 3-CHAR ESCAPE SEQUENCE. GET THE THIRD CHAR NOW / JMSI 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 ... CTRCOD TAD =ITRAN+040 BIAS CODE TO RANGE 0-37 / DCA XT ... CDF %* TADI XT LOAD VISTA INTERNAL CODE CDF BUF 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 TITLE OUTPUT SECTION / / 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 JMSI 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 / Z:END TAD ='H-'A 'H' IN GRAPHICS FOR END OF LINE GRAPHIC Z:CTRL TAD ='A+040 'A' IN GRAPHICS FOR CONTROL CHARACTER DOGRAF DCA XT2 SAVE GRAPHIC CHARACTER CLA CMA SET FLAG: NOT IN 'Z:RTN' FUNCTION / / MERGE HERE TO END UP FROM 'Z:RTN' FUNCTION / Z:RTN2 DCA XT3 CLEAR FLAG HERE TAD ='? PRIVATE MODE JMS ESCBRA ... TAD ='2 ENTER VT52 MODE JMSI PSCR ... TAD ='L+040 END OF ESCAPE SEQUENCE--RESET MODE JMSI PSCR ... ISZ XT3 WERE WE IN THE 'Z:RTN' FUNCTION? JMP XSIO YES: SO ALL DONE HERE NOW TAD ='F ENTER GRAPHICS MODE JMS DOESC ... TAD XT2 GRAPHIC CHAR JMSI 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 / Z:RTN TAD ='> EXIT ALTERNATE KEYPAD MODE JMS DOESC ... JMP Z:RTN2 ALL DONE HERE / / HERE ON FUNCTION CODE: INDEX DISPATCH TABLE / FUNCOD 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 CLA CMA CONTROL/G DOES BELL FUNCTION Z:BKSP TAD =0210 CONTROL/H DOES BACKSPACE FUNCTION JMP CHOUT ... / / HERE TO INITIALIZE VDT. RUN VDT IN ANSI MODE. / Z:INIT 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 JMSI PSCR ... TAD ='; SEPARATOR ON SEQUENCE JMSI PSCR ... TAD ='8 TURN AUTO-REPEAT TO ON CONDITION JMSI PSCR ... TAD ='H+040 END OF SET MODE JMP CHOUT DONE HERE / / ERASE TO END OF LINE / Z:EOL 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 DC 0 DCA XT SAVE CHARACTER TO GO OUT TAD =0233 SEND ESCAPE JMSI PSCR ... TAD ='[ BRACKET JMSI PSCR ... TAD XT LAST CHARACTER SZA SKIP IF ZERO ON ENTRY HERE JMSI PSCR ... JMPI 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 / Z:DEL 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 JMSI 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 / Z:CLSC TAD ='2 ERASE ENTIRE SCREEN JMS ESCBRA DO ESCAPE AND [ AHEAD OF IT TAD ='J END OF CLEAR SEQUENCE JMSI 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 DC 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 JMPI CROW ALL DONE HERE / / MOVE LINE ADDRESS SPECIFIED IN AC ON ENTRY / MOVEC DC 0 DCA XT2 SAVE FOR A MOMENT JMS ESCBRA ESCAPE [ AGAIN TAD XT2 ADDRESS OF SPECIFIED LINE JMS TWOUT ... TAD ='; SEPARATOR JMSI PSCR ... TAD ='0 COLUMN ZERO JMSI PSCR ... TAD ='F+040 END SEQUENCE JMSI PSCR ... JMPI MOVEC DONE HERE / / HERE TO SET WINDOW. BINARY LINE ADDRESS IN AC ON ENTRY / WINDOW DC 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 JMSI PSCR ... TAD ROWSIZ FINAL COLUMN JMS TWOUT ... TAD ='R+040 END OF SEQUENCE JMSI PSCR ... JMPI 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. / Z:INS 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 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 DC 0 DCA XT SAVE CHARACTER TAD =0233 OUTPUT ESCAPE CODE JMSI PSCR ... TAD XT REGET CHARACTER JMSI PSCR ... JMPI DOESC ALL DONE HERE / / HERE FOR CR/LF ON SCREEN. / Z:CRLF TAD =0215 CR JMSI 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 / Z:NMV CLA CMA TURN OFF ATTRIBUTES / Z:SPV1 TAD ='1-'4 SET FOR BOLD Z:SPV2 TAD ='4 SET FOR UNDERLINE JMS ESCBRA DO ESC[DIGIT TAD ='M+040 END OF SEQUENCE JMP CHOUT ... EJECT / / 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 / Z:POS JMS ESCBRA START WITH ESCAPE AND BRACKET JMS CROW ADDRESS OF CURRENT ROW JMS TWOUT OUTPUT LINE ADDRESS TAD ='; SEPARATOR JMSI 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 DC 0 DCA XT SAVE RESULT TAD ='0-1 INITIALIZE HIGH DIGIT DCA XT2 ACCUMULATE RESULT TAD XT GET THE NUMBER / TW1 INC 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 JMSI PSCR ... TAD XT OUTPUT SECOND DIGIT JMSI PSCR ... JMPI TWOUT ALL DONE HERE / ORG 06600