/ VCM100 - PAL8 COMPATIBLE VCM FILE / 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 / / 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 / / / 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 / / / 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 (-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, 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 (-"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 /... JMP .&7600+200 PAGE CTRCOD, TAD (ITRAN+040 /BIAS CODE TO RANGE 0-37 / 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 XKIO /NO SO RETURN IT IN THE AC JMP XIN /YES SO STRIP COMPLETELY / / 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, JMS I 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 / ZEND, TAD ("H-"A /"H" IN GRAPHICS FOR END OF LINE GRAPHIC ZCTRL, TAD ("A+040 /"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 ("? /PRIVATE MODE JMS ESCBRA /... TAD ("2 /ENTER VT52 MODE JMS I PSCR /... TAD ("L+040 /END OF ESCAPE SEQUENCE--RESET MODE JMS I PSCR /... ISZ XT3 /WERE WE IN THE "ZRTN" FUNCTION? JMP XSIO /YES SO ALL DONE HERE NOW TAD ("F /ENTER GRAPHICS MODE JMS DOESC /... TAD XT2 /GRAPHIC CHAR JMS I 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 / ZRTN, TAD ("> /EXIT ALTERNATE KEYPAD MODE JMS DOESC /... JMP ZRTN2 /ALL DONE HERE / / HERE ON FUNCTION CODE: INDEX DISPATCH TABLE / FUNCOD, TAD (XTAB+0200 /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 TO INITIALIZE VDT. RUN VDT IN ANSI MODE. / ZINIT, 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 JMS I PSCR /... TAD ("; /SEPARATOR ON SEQUENCE JMS I PSCR /... TAD ("8 /TURN AUTO-REPEAT TO ON CONDITION JMS I PSCR /... TAD ("H+040 /END OF SET MODE JMP CHOUT /DONE HERE / / ERASE TO END OF LINE / ZEOL, 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, 0 DCA XT /SAVE CHARACTER TO GO OUT TAD (0233 /SEND ESCAPE JMS I PSCR /... TAD ("[ /BRACKET JMS I PSCR /... TAD XT /LAST CHARACTER SZA /SKIP IF ZERO ON ENTRY HERE JMS I PSCR /... JMP I 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 / ZDEL, 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 JMS I 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 / ZCLSC, TAD ("2 /ERASE ENTIRE SCREEN JMP .&7600+200 PAGE 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+040 /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+040 /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 (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 (0215 /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 / ZNMV, CLA CMA /TURN OFF ATTRIBUTES / ZSPV1, TAD ("1-"4 /SET FOR BOLD ZSPV2, TAD ("4 /SET FOR UNDERLINE JMS ESCBRA /DO ESC[DIGIT TAD ("M+040 /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+040 /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 (-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 JMS I PSCR /... TAD XT /OUTPUT SECOND DIGIT JMS I PSCR /... JMP I TWOUT /ALL DONE HERE / JMP .&7600+200 PAGE * 06600