/ VCM100 - PAL8 COMPATIBLE VCM FILE / VERSION 01.50 -- VISTA INTRODUCTION / IMPROVED OVER VERSION VCM100 VERSION 01.20 / (CNTL/C WILL CLEAR THE SCREEN UPON EXITING) / ****************************************** / ** ** / ** 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 SOFTWARE described in this document is in public domain / / / 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: YTRUNCF /O TRUNCATE FILE YPAGEUP /P PAGE UP YPAGEDN /Q PAGE DOWN YSCRLUP /R SCROLL UP YSCRLDN /S SCROLL DOWN / / LOWER CASE TABLE, PREFIXED WITH ESCAPE AND 'O' / THIS IS THE AUXILIARY KEYPAD, WHEN IN ANSI MODE. / LMN, YCNEXTL /L NEXT LINE YCEOL /M CURSOR TO END OF LINE YHOME /N HOME CURSOR 0 /O YROWINS /P INSERT LINE YWLEFT /Q WORD LEFT YSEARCH /R START OF LINE YWRIGHT /S WORD RIGHT YMKROW /T MARK LINE YPICKUP /U PICKUP LINES YPUTDN /V PUT DOWN LINES YTOFC /W FIRST PAGE YDOSCRN /X RESTORE SCREEN 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 STEP REPLACEMENT YDLETLN /CTRL/U DELETE LINE YINSBLK /CTRL/V INSERT BLOCK 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/[ / / 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, YCUP /A CURSOR UP CTRL/\ YCDOWN /B CURSOR DOWN CTRL/] YCRIGHT /C CURSOR RIGHT CTRL/^ YCLEFT /D CURSOR LEFT CTRL/_ / / DISPATCH TABLE FOR EXTERPRETER FUNCTION CODES / XTAB, 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 RETURN VDT TO ORIGINAL STATE ZCTRL /15 CONTROL CODE-NON-DISPLAYABLE / / Literal constants here to save the page escape JMP instruction, / and allow us to fall through to the next page, to save space / for the code to erase screen on control C. / MESC, -233 ESCMSP, 233-240 SPACE, " MDM1, -"D-1 DMAP1, "D-"A+1 AMSM1, "A-"S-1 SMMP1, "S-"M+1 MMLYM1, "M-"Y-040-1 YMLP1, "Y-"L+1 LMNABC, LMN-ABCD ABCMPQ, ABCD-MPQRS MPQITR, MPQRS-ITRAN-040 K35, 35 / / 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 / XIN, JMS I PKBD /GET CHARACTER FROM KEYBOARD TAD MESC /TEST FOR ESCAPE CODE SNA /SKIP IF NOT JMP ESCODE /HANDLE ESCAPE CODE TAD ESCMSP /TEST FOR CONTROL CODE SPA /SKIP IF NOT CONTROL CODE JMP CTRCOD /ELSE HANDLE CONTROL CODE TAD SPACE /RESTORE NORMAL CHARACTER / / MERGE FROM SEVERAL PLACES TO EXIT / XKIO, JMP I KIO /RETURN DIRECTLY TO VISTA / / HERE ON ESCAPE CODE. / NEXT CHARACTER WILL BE LETTER O, SO FLUSH IT OUT / ESCODE, JMS I PKBD /READ CHARACTER AFTER ESCAPE CODE CLA /IGNORE IT / / WE ARE HANDLING A 3-CHAR ESCAPE SEQUENCE. GET THE THIRD CHAR NOW / JMS I PKBD /READ 3RD CHAR OF SEQUENCE TAD MDM1 /TEST FOR A-D CLL /... TAD DMAP1 /... SZL JMP DOABCD /A-D / TAD AMSM1 /M-S? CLL /... TAD SMMP1 /... SZL JMP DOMPQRS /M-S / TAD MMLYM1 /L-Y LOWER CASE? CLL /... TAD YMLP1 /... SNL / JMP IGCHAR /SOMETHING ELSE IGNORE IT / TAD LMNABC /INDEX TABLE DOABCD, TAD ABCMPQ /... DOMPQRS,TAD MPQITR CTRCOD, TAD K35 NOP SZA JMP DOCODE TAD K5 JMS I PSIO DOCODE, TAD ITRAN3 DCA XT /... CDF 00 TAD I XT /LOAD VISTA INTERNAL CODE CDF 10 /RESET TO MAIN BUFFER FIELD SZA /IS THIS AN UNDEFINED CODE? JMP I PXKIO /NO SO RETURN IT IN THE AC JMP I PXIN /YES SO STRIP COMPLETELY / PSIO, SIO PXKIO, XKIO PXIN, XIN ITRAN3, ITRAN+3 K5, 5 / / ENTER HERE WITH CHARACTER TO BE OUTPUT TO THE SCREEN / XOUT, TAD M200 /LOWEST ASCII CODE SPA /SKIP IF DISPLAYABLE CODE JMP FUNCOD /ELSE OFF FOR FUNCTION CODE TAD K200 /NORMAL CODE RESTORE IT CHOUT, JMS I PSCR /OUTPUT BACK TO SCREEN / / COME HERE TO IGNORE CHARACTER / XNULL, JMP I PXSIO /ALL DONE HERE / M200, -200 K200, 200 PXSIO, XSIO HMA, "H-"A AP40, "A+40 QUESMK, "? TWO, "2 LP40, "L+40 EFFF, "F GEE, "G LANGLE, "< / / HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC / ON SCREEN. ENTER VT52 MODE TEMPORARILY AND ISSUE GRAPHIC CODE / ZEND, TAD HMA /"H" IN GRAPHICS FOR END OF LINE GRAPHIC ZCTRL, TAD AP40 /"A" IN GRAPHICS FOR CONTROL CHARACTER DOGRAF, DCA XT2 /SAVE GRAPHIC CHARACTER CLA CMA /SET FLAG NOT IN "ZRTN" FUNCTION / / MERGE HERE TO END UP FROM 'Z:RTN' FUNCTION / ZRTN2, DCA XT3 /CLEAR FLAG HERE TAD QUESMK /PRIVATE MODE JMS ESCBRA /... TAD TWO /ENTER VT52 MODE JMS I PSCR /... TAD LP40 /END OF ESCAPE SEQUENCE--RESET MODE JMS I PSCR /... ISZ XT3 /WERE WE IN THE "ZRTN" FUNCTION? JMP I PXSIO /YES SO ALL DONE HERE NOW TAD EFFF /ENTER GRAPHICS MODE JMS I PDOESC /... TAD XT2 /GRAPHIC CHAR JMS I PSCR /... TAD GEE /EXIT GRAPHICS MODE JMS I PDOESC /... TAD LANGLE /RETURN TO ANSCII MODE JMS I PDOESC /... JMP I PXSIO /DONE HERE / PDOESC, DOESC RANGLE, "> / / 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 / ZRTN, TAD RANGLE /EXIT ALTERNATE KEYPAD MODE JMS I PDOESC /... JMP I PXSIO /DONE HERE / JMP ZRTN2 /ALL DONE HERE / XTABP2, XTAB+200 / / HERE ON FUNCTION CODE: INDEX DISPATCH TABLE / FUNCOD, TAD XTABP2 /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 / BSMSP, 210-" SPACE2, " / / HERE FOR BACKSPACE FUNCTION / ZBEL, CLA CMA /CONTROL/G DOES BELL FUNCTION ZBKSP, TAD BSMSP /CONTROL/H DOES BACKSPACE FUNCTION / / HERE ON TAB/PAD CODE: SEND AS SPACE / ZSPAC, TAD SPACE2 /RETURN SPACE INSTEAD JMP CHOUT /... / EQUAL, "= ONE, "1 SEMIC, "; EIGHT, "8 LCH, "H+40 PWINDO, WINDOW / / HERE TO INITIALIZE VDT. RUN VDT IN ANSI MODE. / ZINIT, TAD LANGLE /ENTER ANSI MODE JMS I PDOESC /... JMS I PWINDO /ENSURE WINDOW RESET PROPERLY TAD EQUAL /SET ALTERNATE KEYPAD MODE JMS I PDOESC /... TAD QUESMK /DEC PRIVATE FLAG JMS ESCBRA /SEND ESC[?1 TAD ONE /SET CURSOR KEYS TO APPLIC. KEYPAD MODE JMS I PSCR /... TAD SEMIC /SEPARATOR ON SEQUENCE JMS I PSCR /... TAD EIGHT /TURN AUTO-REPEAT TO ON CONDITION JMS I PSCR /... TAD LCH /END OF SET MODE JMP CHOUT /DONE HERE / ZERO, "0 KAY, "K / / ERASE TO END OF LINE / ZEOL, TAD ZERO /END OF LINE FUNCTION JMS ESCBRA /... TAD KAY /END WITH CAP "K" JMP CHOUT /... / ESCAPE, 233 LBRACK, "[ / / HERE TO DO FUNCTION PREFIXED BY ESCAPE AND BRACKET. / ESCBRA, 0 DCA XT /SAVE CHARACTER TO GO OUT TAD ESCAPE /SEND ESCAPE JMS I PSCR /... TAD LBRACK /BRACKET JMS I PSCR /... TAD XT /LAST CHARACTER SZA /SKIP IF ZERO ON ENTRY HERE JMS I PSCR /... JMP I ESCBRA /DONE HERE LINEF, LF PCROW, CROW PMOVEC, MOVEC / / 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 / ZDEL, JMS I PCROW /GET ADDRESS OF CURRENT ROW SZA /AVOID WINDOW IF LINE 0 JMS I PWINDO /SET NEW WINDOW VALUE / / NOW WE HAVE SET THE WINDOW. CURSOR ADDRESS TO BOTTOM OF SCREEN. / TAD ROWSIZ /ROW TO ADDRESS TO JMS I PMOVEC /MOVE CURSOR THERE TAD LINEF /LINE FEED AT BOTTOM NOW JMS I PSCR /... JMS I PCROW /WHAT ROW ARE WE ON? SZA CLA /DON"T RESET WINDOW IF ON TOP ROW JMS I PWINDO /RESET WINDOW NOW TO TOP LINE JMS I PCROW /ADDRESS OF CURRENT ROW JMS I PMOVEC /MOVE CURSOR TO COL 0, CURRENT LINE JMP XSIO /ALL DONE HERE / / CLEAR SCREEN COMMAND / ZCLSC, TAD ("2 /ERASE ENTIRE SCREEN JMS ESCBRA /DO ESCAPE AND [ AHEAD OF IT TAD ("J /END OF CLEAR SEQUENCE JMS I 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, 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 JMP I CROW /ALL DONE HERE / / MOVE LINE ADDRESS SPECIFIED IN AC ON ENTRY / MOVEC, 0 DCA XT2 /SAVE FOR A MOMENT JMS ESCBRA /ESCAPE [ AGAIN TAD XT2 /ADDRESS OF SPECIFIED LINE JMS TWOUT /... TAD ("; /SEPARATOR JMS I PSCR /... TAD ("0 /COLUMN ZERO JMS I PSCR /... TAD ("F+40 /END SEQUENCE JMS I PSCR /... JMP I MOVEC /DONE HERE / / HERE TO SET WINDOW. BINARY LINE ADDRESS IN AC ON ENTRY / WINDOW, 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 JMS I PSCR /... TAD ROWSIZ /FINAL COLUMN JMS TWOUT /... TAD ("R+40 /END OF SEQUENCE JMS I PSCR /... JMP I 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. / ZINS, 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 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 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, 0 DCA XT /SAVE CHARACTER TAD (233 /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 /CR JMS I 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 / / / ZSPV2, STL CLA IAC RAL /NL3 / FOR REVERSE VIDEO --- ZSPV1, STL RAL /*2 +1 =1 OR =7 / FOR UNDERLINE /ZSPV1, IAC /+1 (EITHER 1 OR 4) ZNMV, TAD ("0 /TURN OFF ATTRIBUTES IF ENTER HERE JMS ESCBRA /DO ESC[DIGIT TAD ("M+40 /END OF SEQUENCE JMP CHOUT /... / / 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 / ZPOS, JMS ESCBRA /START WITH ESCAPE AND BRACKET JMS CROW /ADDRESS OF CURRENT ROW JMS TWOUT /OUTPUT LINE ADDRESS TAD ("; /SEPARATOR JMS I PSCR /... TAD COL /COLUMN POSITION IAC /ADJUST TO RANGE 1-N JMS TWOUT /OUTPUT THAT TAD ("F+40 /END OF SEQUENCE JMP CHOUT /ALL DONE HERE / / OUTPUT BINARY NUMBER IN AC AS TWO ASCII DIGITS / TWOUT, 0 DCA XT /SAVE RESULT TAD ("0-1 /INITIALIZE HIGH DIGIT DCA XT2 /ACCUMULATE RESULT TAD XT /GET THE NUMBER / TW1, ISZ XT2 /COUNT THE DIGIT TAD (-12 /COUNT TENS POSITION SMA /ALL DONE? JMP TW1 /NO SO LOOP BACK NOW / TAD ("0+12 /MAKE A DIGIT DCA XT /AND SAVE IT TAD XT2 /OUTPUT FIRST DIGIT JMS I PSCR /... TAD XT /OUTPUT SECOND DIGIT JMS I PSCR /... JMP I TWOUT /ALL DONE HERE / $