/ VT-8/E OVERLAY FOR P?S/8 FOCAL / LAST EDIT: 04-FEB-1988 15:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 FOCAL OVERLAY FOR DISPLAY OF X-Y POINTS ON THE VT-8/E. / THIS OVERLAY PROVIDES A DISPLAY FUNCTION TO P?S/8 FOCAL SIMILAR TO FOCAL-12 / OR BASIC-RT. / FUNCTIONS AVAILABLE: / FDIS(X,Y) INSERT POINT AT (X,Y) (POINT NEED NOT BE CLEAR). / FDIS(X,Y,0) CLEAR POINT AT (X,Y) (POINT NEED NOT BE PRESENT). / FDIS(X,Y,NON-ZERO) TEST POINT AT (X,Y); RETURN 0 IF NOT PRESENT, -1 / IF PRESENT. / FDIS(0) CLEAR ALL POINTS FROM DISPLAY. / FDIS(NON-ZERO) SET ALL POINTS ON DISPLAY. / FIO(NEGATIVE) RETURNS NUMERICAL VALUE (MODULO 128) OF NEXT ASCII / CHARACTER TYPED; P?S/8 FOCAL WILL WAIT FOR INPUT / IF NECESSARY (WHILE BUFFERING THE DISPLAY). SINCE / INTEGER CONVERSION IS USED FOR EVALUATION, THE / ARGUMENT MUST BE NEGATIVE OR WITHIN THE RANGE / 2048-4095 MOD 4096. / FIO(CHAR<2048) OUTPUT ASCII CHARACTER; P?S/8 FOCAL WILL BUFFER / THE DISPLAY IF IT MUST WAIT TO OUTPUT THE CHARACTER. / SINCE INTEGER CONVERSION IS USED FOR EVALUATION, / THE ARGUMENT MUST BE POSITIVE AND BETWEEN 0000-2047 / MOD 2048. NORMAL OUTPUT DEVICES GENERALLY REDUCE / THE CHARACTER VALUE RANGE TO 0000-0255 MOD 256 / ALLOWING ANY COMBINATION OF ASCII CHARACTER OUTPUT / WITH OR WITHOUT PARITY SET. / DOMAIN FOR X: [-94,+94] / RANGE FOR Y: [-100,+99] / OPTIONS (FOCAL/O): / O(UTPUT) A(LTERNATING) OUTPUT BLINKING CHARACTERS (TO VT-8/E) / O(UTPUT) B(OLD) OUTPUT BOLD CHARACTERS (TO VT-8/E) (DEFAULT) / O(UTPUT) C(LEAR) CLEAR ALL OUTPUT, OUTPUT SCOPE, DISPLAY CHARACTERS-ONLY / O(UTPUT) D(ELETE) DELETE POINTS, OUTPUT SCOPE, DISPLAY CHARACTERS-ONLY / O(UTPUT) E(RASE) ERASE CHARACTERS, OUTPUT SCOPE, DISPLAY GRAPHICS-ONLY / O(UTPUT) F(REE) OUTPUT IS FREE OF CURSOR / O(PTION) G(ENERIC) GENERIC CONSOLE INPUT DEVICE; VT-8/E IF NO OVERLAY / O(UTPUT) I(NVERTING) OUTPUT CURSOR CHARACTERS (TO VT-8/E) / O(PTION) K(EYBOARD) DEVICE 03 (CONSOLE TERMINAL) KEYBOARD INPUT / O(UTPUT) L(PT) DEVICE 66 (LINEPRINTER) OUTPUT / O(PTION) M(ONITOR) RETURN TO P?S/8 KEYBOARD MONITOR. / O(UTPUT) N(ORMAL) OUTPUT NORMAL CHARACTERS (TO VT-8/E) / O(UTPUT) O(N) OUTPUT CURSOR IS ON / O(UTPUT) P(RINTER) LOGICAL PRINTER OUTPUT (DEVICE 66 IF NO OVERLAY) / O(UTPUT) S(COPE) OUTPUT TO VT-8/E (CONSOLE OVERLAY OR INTERNAL ROUTINES) / O(UTPUT) T(ERMINAL) DEVICE 04 (CONSOLE TERMINAL) TERMINAL OUTPUT / O(UTPUT) U(NIVERSAL) OUTPUT TO CONSOLE (VT-8/E IF NO OVERLAY) / O(PTION) V(T-8/E) INPUT FROM VT-8/E KEYBOARD / O(UTPUT) W(AIT) DISPLAY GRAPHICS-ONLY UNTIL NEXT INPUT, SET FORMER MODE / ALL "O" COMMAND ERRORS REPORT ?30.00. / ALL FOCAL "?" REPORTS (INCLUDING <^P>-CAUSED ?01.00) REVERT / INPUT TO O(PTION) V(T-8/E) AND OUTPUT TO O(UTPUT) S(COPE). / ASSEMBLY PARAMETERS. / SET THE DISPLAY FIELD(S): / DFIELD= 40 /DISPLAY FIELD(S) / CONDITIONAL ASSEMBLY PARAMETERS. IFNDEF DFIELD /USE FIELD FOUR (AND FIVE) FOR DISPLAY IFNDEF CI /CONSOLE KEYBOARD IS DEVICE 03 IFNDEF CO /CONSOLE PRINTER IS DEVICE 04 IFNDEF KEY /VT-8/E KEYBOARD IS DEVICE 43 IFNDEF LP /LINE PRINTER IS DEVICE 66 IFNDEF VT /VT-8/E VIDEO IS DEVICE 45 / IOT DEFINITIONS. DKIEIOT=KEY^10+6005 /KEYBOARD INTERRUPT ENABLE PER AC[11] DKRBIOT=KEY^10+6006 /READ KEYBOARD BUFFER, CLEAR KEYBOARD FLAG DKSFIOT=KEY^10+6001 /SKIP ON KEYBOARD FLAG DPBLIOT=VT^10+6007 /GENERATE BELL TONE DPCLIOT=VT^10+6006 /SKIP ON, CLEAR VIDEO RETRACE FLAG DPGOIOT=VT^10+6001 /LOAD INTERRUPT ENABLE, VIDEO MODE, GO DPLAIOT=VT^10+6000 /LOAD VIDEO DISPLAY ADDRESS DPMSIOT=VT^10+6005 /READ SENSE REGISTER DPSMIOT=VT^10+6002 /STOP DISPLAY KIEIOT= CI^10+6005 /KEYBOARD INTERRUPT ENABLE PER AC[11] KRBIOT= CI^10+6006 /READ KEYBOARD BUFFER, CLEAR FLAG KSFIOT= CI^10+6001 /SKIP ON KEYBOARD FLAG LLSIOT= LP^10+6006 /OUTPUT LPT: CHARACTER, CLEAR FLAG LSFIOT= LP^10+6001 /SKIP ON (CLEAR IF 6120) LPT: FLAG TCFIOT= CO^10+6002 /CLEAR TTY: FLAG TLSIOT= CO^10+6006 /OUTPUT CHARACTER, CLEAR FLAG TSFIOT= CO^10+6001 /SKIP ON (CLEAR IF 6120) OUTPUT FLAG / DEFINITIONS FROM FOCAL, 1969 (ORIGINAL PAPER-TAPE VERSION). BOTTOM= 0035 /END OF PUSHDOWN AREA CHAR= 0066 /FOCAL'S CHARACTER BUFFER COMGO= 1163 /COMMAND DISPATCH TABLE ADDRESS COMLST= 0774 /COMMAND DECODING LIST CSTAR= 0225 /ACKNOWLEDGE CHARACTER EFUN3I= 0136 /FUNCTION RETURN POINTER ERROR5= 2725 /ERROR FUNCTION EVAL= 1613 /EVALUATOR ROUTINE FIX= 6724 /INTEGER ROUTINE FLAC= 0044 /FLOATING AC FNTABF= 0374 /FUNCTION ADDRESS TABLE FNTABL= 2165 /HASHED FUNCTION NAME TABLE GETC= JMS I 145 /UNPACK A CHARACTER INDEV= 0064 /INPUT ROUTINE POINTER INTEGER=0053 /FLOATING TO FIXED CONVERSION POINTER KEYHND= 3200 /KEYBOARD HANDLING ROUTINE OUTDEV= 0063 /OUTPUT ROUTINE POINTER PDLXR= 0013 /PUSHDOWN AUTO-INDEX REGISTER POPA= TAD I PDLXR /REMOVE WORD FROM STACK PROC= 0611 /FOCAL PROCESSING ADDRESS PUSHA= JMS I 142 /PUSH WORD ONTO STACK P7600= 0104 /CONSTANT 7600 RECOVR= 2740 /RECOVERY ADDRESS RECOVX= 2761 /RECOVERY ADDRESS RETURN= JMP I EFUN3I /FUNCTION RETURN INSTRUCTION SORTC= JMS I 150 /SORT CHAR AGAINST LIST SORTCN= 0054 /SORTC INDEX NUMBER SPLAT= 3051 / LOCATION SPNOR= JMS I 160 /IGNORE LEADING ZEROES AND SPACES TELSW= 0016 /TERMINAL I/O IN PROGRESS SWITCH TERMS= 1770 /TERMINATOR TABLE XADC= 1343 /FADC FUNCTION ADDRESS XDYS= 1142 /FDIS FUNCTION ADDRESS XINT= 1160 /INTEGER PART ROUTINE / DEFINITIONS FROM P?S/8 AND THE P?S/8 FOCAL AND VT-8/E OVERLAYS. BEOFZAP=7505 /BINARY LOADER ZAP WORD BLINK= 200-200 /BLINK MODE BITS BOLD= 400-200 /BOLD MODE BITS BONCE= 3600 /OVERLAY ONCE-ONLY ADDRESS BUMPIT= 2613 /INTERRUPT LOCATION CHKKCC= 3207 /KEYBOARD INTERRUPT LOCATION CHKKSF= 2657 /KEYBOARD INTERRUPT LOCATION CINPUT= 2600 /FOCAL INPUT ROUTINE CONPAT= 2742 /RESTART PATCH LOCATION COUTPUT=2630 /FOCAL OUTPUT ROUTINE CSCQSW= 0037 /<^S>/<^Q> SWITCH CURSOR= 600-200 /CURSOR MODE BITS CURSW= 0075 /CURSOR ON SWITCH DFINT= 2641 /DF32 INTERRUPT POINTER INCHAR= 0126 /INPUT BUFFER INCON= 0031 /CONSOLE INPUT ROUTINE INTLST= 0003 /INTERRUPT LIST POINTER IN CONSOLE OVERLAY INTXIT= 2711 /INTERRUPT EXIT ROUTINE IN P?S/8 FOCAL LCOMZAP=7427 /"L" COMMAND ADDRESS LIBZAP= 7500 /"L" COMMAND ADDRESS (/L) MONSTRT=0353 /KEYBOARD MONITOR STARTUP ADDRESS NORMAL= 000-200 /NORMAL MODE BITS OUTCON= 0033 /CONSOLE OUTPUT ROUTINE OUTLPT= 0035 /LOGICAL LPT: SBOOT= 7600 /SYSTEM BOOTSTRAP ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION SCRSIZE=7611 /SYSTEM CORE SIZE WORD SWAPBLK=2417 /SWAP BLOCK SWAL= 7604 /PASSED SWITCHES: A-L SWMX= 7605 /PASSED SWITCHES: M-X SYSIO= 7640 /SYSTEM I/O ENTRY POINT TABCNT= 0054 /TAB-IN COUNT LOCATION TRYOUT= 2673 /OUTPUT INTERRUPT LOCATION VMODE= 0074 /VT-8/E OUTPUT AUGMENTATION WORD VTBFEND=4600 /END OF VT-8/E CHARACTER BUFFER VTBUFFE=2200 /VT-8/E CHARACTER BUFFER VTMODE= 0005 /VT-8/E MODE WORD IN OVERLAY VTOFFSE=0200 /BUFFER OFFSET / MISCELLANEOUS DEFINITIONS. JMPC= JMP . /CURRENT PAGE JUMP INSTRUCTION JMPIC= JMP I . /CURRENT PAGE JUMP INDIRECT INSTRUCTION NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0004= CLA CLL IAC RTL /LOAD AC WITH 00004 NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 NL0100= CLA IAC BSW /LOAD AC WITH 0100 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 OSTART= 4070 /"O" COMMAND PATCH STARTING ADDRESS VTWORDS=6200 /LENGTH OF VT-8/E GRAPHICS BUFFER FIELD 0 /ENSURE FIELD ZERO *174 /OVER AVAILABLE LOCATION PCTCXIT,CTCXIT /<^C> EXIT ROUTINE POINTER *FNTABF+3 /OVER FDIS ADDRESS XDIS /POINT TO DISPLAY FUNCTION *FNTABF+14 /OVER FNEW ADDRESS XIO /POINT TO INPUT/OUTPUT FUNCTION *XDYS /OVER EXISTING FDIS CODE / FIO FUNCTION. XIO, JMS I INTEGER /GET LOW-ORDER FROM FIXED FLAC SMA CLA /SKIP IF INPUT REQUESTED JMP XOUT /JUMP IF OUTPUT REQUESTED JMS I INDEV /GET A CHARACTER / AC WILL BE NON-ZERO IF FIO(NEGATIVE), ZERO IF FDIS(XX). / FDIS FUNCTION ENTERS HERE WITH CLEAR AC. XDIS, CIF DFIELD /GOTO CODE FIELD JMP XIOMORE /CONTINUE THERE / COMES HERE IF FIO(POSITIVE). XOUT, TAD FLAC+2 /GET LOW-ORDER AGAIN JMS I OUTDEV /OUTPUT IT XRET, RETURN / FLAC FIX FINISHES HERE. INTRET, CIF DFIELD /GOTO CODE FIELD JMP INTMORE /CONTINUE THERE / FIELD ZERO EVALUATOR RETURN. EVALRET,CIF DFIELD /GOTO CODE FIELD JMP EVALMORE /CONTINUE THERE ZBLOCK XINT-. /EMPTY SPACE XINT= . /UPPER LIMIT FOR SUPPORT CODE *COMGO+10 /OVER "L" ENTRY LRET /USE OUR "L" COMMAND FOR NOW *XADC+14 /OVER END OF FADC FUNCTION CTCXIT= . /LOCATION WHICH WILL BE CLOBBERED TO A POSITIVE /VALUE IF <^C> (OR LESS) IS HIT CTCXIT, RETURN /RETURN FROM FADC FUNCTION; THIS WILL ENSURE A /NORMAL (NEGATIVE) INSTRUCTION VALUE / "L" COMMAND COMES HERE. LRET, CIF DFIELD /GOTO CODE FIELD JMP LMORE /CONTINUE THERE *FNTABL+3 /OVER HASHED NAME TABLE ENTRY FOR FDIS "D^2+"I^2+"S /MAKE SURE FDIS FUNCTION IS PRESENT *FNTABL+14 /OVER HASHED NAME TABLE ENTRY FOR FNEW "I^2+"O /ENTER FIO FUNCTION HASHED NAME VALUE *SWAPBLK+3 /OVER EMPTY SPACE PAST SWAPPER / PUSH ROUTINE COMES HERE. DOPUSHA,PUSHA /SAVE AC ON STACK CIF DFIELD /GOTO CODE FIELD JMP PUSHMORE /CONTINUE THERE *SPLAT /OVER CHARACTER "\&37 /USE SPECIAL CHARACTER *KEYHND+6 /OVER JMP I P7600/[SBOOT] JMS I PCTCXIT/[CTCXIT]/CLOBBER CODE AND EXIT FIELD DFIELD%10 /IN (FIRST) BUFFER FIELD *0 /START AT THE BEGINNING / EXTENDED INTERRUPT HANDLER. OURINT, JMP I [MORINT] /CONTINUE THERE ODEV, VTCON /**** NOT VT-8/E CONSOLE **** INTVT8E OSCOPE, VTCON /**** NOT VT-8/E CONSOLE **** INTVT8E POPTEM, .-. /POPAC TEMPORARY REM, .-. /BIT COUNT STORFLG,.-. /SET/CLEAR SWITCH WORD, .-. /WORD ADDRESS Y, .-. /LINE BASE *10 /GET TO AUTO-INDEX AREA XR1, .-. /AUTO-INDEX FOR DISPLAY CHNGFLG,.-. /CHANGE POSSIBLE (NO-TEST) SWITCH DBLALPH,DFIELD+10+2^101 /**** VT-8/E CONSOLE **** MCS+10+2^101 DCHAR, .-. /VT-8/E KEYBOARD CHARACTER BUFFER KCHAR, .-. /DEVICE 03 KEYBOARD CHARACTER BUFFER LOFOLD, -BOLD+BOLD /LOWER-CASE COMPENSATION OCHAR, .-. /LATEST "O" COMMAND CHARACTER UPFOLD, BOLD-BOLD /UPPER-CASE COMPENSATION FOR BOLD OUTPUT *20 /GET PAST AUTO-INDEX AREA DFLAG, 0 /VT-8/E KEYBOARD INTERRUPT WAKEUP FLAG ISTAT, 0 /INTERRUPT STATUS WORD I03MSK, 0 /DEVICE 03'S INTERRUPT STATUS BIT MASK I43MSK, 0 /DEVICE 43'S INTERRUPT STATUS BIT MASK KFLAG, 0 /DEVICE 03 KEYBOARD INTERRUPT WAKEUP FLAG LSAVE, SBOOT /WILL BE ADDRESS OF PRIOR "L" COMMAND OGENABL,DFLAG /**** CONSOLE **** OVFLAG OKENABL,KFLAG /**** DEVICE 03 CONSOLE **** OVFLAG OLPT, LPT /**** DEVICE 66 LPT: OVERLAY **** LLPT OR CON OPRINT, LPT /**** CONSOLE **** LLPT OTTY, TTY /**** DEVICE 04 OVERLAY **** CON OR LLPT OUNPTR, INTVT8E /**** (VT-8/E) CONSOLE **** (VTCON OR) CON OVCHAR, .-. /OVERLAY KEYBOARD CHARACTER BUFFER OVENABL,DFLAG /**** VT-8/E CONSOLE **** OVFLAG OVFLAG, 0 /OVERLAY INPUT INTERRUPT WAKEUP FLAG O04MSK, 0 /DEVICE 04 INTERRUPT MASK FOR OVERLAY O66MSK, 0 /DEVICE 66 INTERRUPT MASK FOR OVERLAY TFLAG, 0 /DEVICE 04 DONE FLAG / POP AC ROUTINE. POPAC, .-. /POP THE AC ROUTINE CDF 00 /GOTO FIELD ZERO ISZ I [PDLXR] /BUMP LIST POINTER TAD I [PDLXR] /GET THE LATEST VALUE DCA POPTEM /STASH THE POINTER TAD I POPTEM /GET THE VALUE FROM THE STACK INTO THE AC JMP I POPAC /RETURN / PUSH AC ONTO STACK ROUTINE. PUSHAC, .-. /PUSH THE AC ROUTINE CIF CDF 00 /GOING TO FIELD ZERO JMP I [DOPUSHAC] /CONTINUE THERE / COMES BACK HERE WHEN THROUGH. PUSHMOR,JMP I PUSHAC /RETURN TO CALLER / FIX THE FLAC ROUTINE. INTAC, .-. /FIX THE FLAC ROUTINE TAD [INTRET] /GET OUR RETURN ADDRESS CIF CDF 00 /GOING TO FIELD ZERO DCA I [FIX] /SETUP RETURN JMP I [FIX+1] /GO EXECUTE ROUTINE THEN COME BACK / COMES BACK HERE WHEN THROUGH. INTMORE,JMP I INTAC /RETURN TO CALLER / THE "L" COMMAND CONTINUES HERE. LMORE, JMP I [LMORE2] /CONTINUE THERE / RECURSIVE ARGUMENT EVALUATOR ROUTINE. ARG, .-. /ARGUMENT ROUTINE TAD I [CHAR] /GET LATEST CHARACTER TAD [-",] /COMPARE TO "," SZA CLA /SKIP IF IT MATCHES JMP I ARG /ELSE JUST RETURN TAD ARG /GET OUR CALLER IAC /MAKE IT SKIP ULTIMATELY JMS PUSHAC /SAVE ON STACK TAD [EVALRETURN] /SETUP OUR RETURN ADDRESS JMS PUSHAC /SAVE ON STACK ALSO CIF CDF 00 /GOING TO FIELD ZERO JMP I [EVAL-1] /GO EVALUATE ARGUMENT AND COME BACK / COMES HERE AFTER EVALUATING OUR ARGUMENT. EVALMOR,JMS POPAC /GET OUR RETURN ADDRESS DCA ARG /RESTORE IT JMP I ARG /RETURN TO CALLER (SKIP RETURN) / COMES HERE TO FINISH THE "FIO", "FDIS" FUNCTIONS. XIOMORE,SNA /I/O FUNCTION? JMP I [DODISP] /NO, MUST BE DISPLAY AND [177] /JUST SEVEN-BIT VTSTRET,DCA I [FLAC+1] /STORE IN HIGH-ORDER DCA I [FLAC+2] /CLEAR LOW-ORDER TAD [13] /GET SHIFT FACTOR DCA I [FLAC] /SET EXPONENT DISPRET,CIF CDF 00 /GOING TO FIELD ZERO JMP I [XRET] /FINISH IT THERE PAGE IFNZRO .&1777-VTOFFSET VTGBUFFER=. /VT-8/E GRAPHICS BUFFER HERE / ONCE-ONLY CODE (FROM BONCE) CONTINUES HERE. / AC CONTAINS POTENTIAL "C" BIT FROM SOFTWARE CORE-SIZE WORD. BONCE2, SNA CLA /SKIP IF "C" BIT SET ILPTR, JMP NOCONSOLE /JUMP IF NOT SET TAD I (SCRSIZE) /GET THE CORE SIZE WORD RTR;RAR /MOVE OVER AND AND (70) /ISOLATE MCS BITS TAD (CDF 10) /FORM CDF MCS+10 DCA WORD /STASH IT CDF DFIELD /GOTO OUR FIELD TAD WORD /GET CDF MCS+10 IAC/TAD (CIF-CDF) /MAKE IT CIF MCS+10 DCA I (CON) /STORE IN VT-8/E CONSOLE OUTPUT ROUTINE TAD I (CON) /GET IT BACK DCA I (LPTCIF) /STORE IN LOGICAL LPT: ROUTINE TAD I (LPTCIF) /GET IT BACK DCA I (OVICIF) /STORE IN CONSOLE OVERLAY INPUT INTERRUPT HANDLER TAD WORD /GET CDF MCS+10 DCA INLIN1 /STORE IN-LINE INLIN1, .-. /WILL BE CDF MCS+10 NL0004 /SET OFFSET TO POTENTIAL INSTRUCTION TAD I (INTLST) /POINT TO POTENTIAL DPCLIOT INSTRUCTION DCA ILPTR /STASH THE POINTER TAD I (VTMODE) /GET CURRENT VT-8/E MODE WORD DCA Y /SAVE IN CASE WE NEED IT TAD I ILPTR /GET THE INTERRUPT ELEMENT TAD (-DPCLIOT) /COMPARE TO EXPECTED VALUE SZA CLA /SKIP IF IT MATCHES JMP OCONSOLE /JUMP IF OTHER OVERLAY CDF DFIELD /BACK TO OUR FIELD TAD WORD /GET CDF MCS+10 DCA I (CONFOLD) /STORE IN OUTPUT FOLD ROUTINE TAD WORD /GET IT AGAIN DCA I (FRCACDF) /STORE IN ALPHA FORCE ROUTINE TAD WORD /GET IT AGAIN DCA I (GRPHCDF) /STORE IN GRAPHICS CHECK ROUTINE TAD WORD /GET IT AGAIN DCA I (OO) /STORE OVER CURSOR OFF ROUTINE TAD WORD /GET IT AGAIN DCA I (OW) /STORE OVER OUTPUT WAIT ROUTINE TAD WORD /GET IT AGAIN DCA I (VTRCDF) /STORE OVER "L" COMMAND CONTINUATION DCA I (OVTENABLE) /ENABLE PREVIOUS MODE RESTORATION IN "L" COMMAND NL3777 /INDICATE VT-8/E OVERLAY OCONSOL,IAC /SET CORRECT CONSOLE TYPE NOCONSO,DCA REM /STORE CONSOLE TYPE INDICATOR AS NECESSARY CZAPLUP,CDF DFIELD /GOTO OUR FIELD TAD I CZTPTR /GET AN OUTPUT ROUTINE ZAP WORD SNA /END OF LIST? JMP CZAPEND /YES CDF 00 /GOTO FIELD ZERO DCA I CZAPTR /ZAP IT IN ISZ CZTPTR /BUMP TO NEXT ELEMENT ISZ CZAPTR /BUMP TO NEXT ADDRESS JMP CZAPLUP /KEEP GOING CZAPEND,TAD REM /GET CONSOLE TYPE SPA CLA /SKIP IF NON-VT-8/E CONSOLE OR NO CONSOLE AT ALL JMP I (USEVT8EOVERLAY)/JUMP IF VT-8/E CONSOLE TAD (INTVT8E) /POINT OUTPUT ROUTINE DCA ODEV /AT OUR VT-8/E HANDLER TAD (INTVT8E) /POINT THE O(UTPUT) S(COPE) ROUTINE DCA OSCOPE /AT OUR VT-8/E HANDLER CIF DFIELD+10 /GOTO OUR HANDLER FIELD JMS I (CLEAR) /CLEAR OUR BUFFER DPCLIOT /WAIT FOR JMP .-1 /DISPLAY FLAG DPCLIOT /WAIT FOR JMP .-1 /A FRESH FLAG TAD (VTBUFFER) /POINT AT DISPLAY BUFFER DPLAIOT /LOAD DISPLAY ADDRESS TAD (DFIELD+10+1) /GET FIELD, MODE, INTERRUPT ENABLE DPGOIOT /START UP THE DISPLAY JMP I (OCOMN) /CONTINUE THERE CZAPTR, COUTPUT+3 /WHERE OUTPUT CODE GOES CZTPTR, CZTABLE /POINTER TO OUTPUT REPLACEMENT CODE PAGE USEVT8E,TAD Y /GET CURRENT DOUBLE-MODE WORD FROM OVERLAY ILPTR2, DCA DBLALPHA /USE INSTEAD OF INTERNAL VALUE DCA I (VT8LEAVE) /PREVENT DISPLAY LOSS IN "L" COMMAND TAD (SKP) /PREVENT THE DCA I (IVTINT) /OTHER VT-8/E INTERRUPT HANDLING OCOMN, TAD REM /GET CONSOLE TYPE VALUE SNA /SKIP IF SOME CONSOLE PRESENT JMP NOCONENTRY /JUMP IF NO CONSOLE AT ALL SPA CLA /SKIP IF NON-VT-8/E CONSOLE JMP VCON /JUMP IF VT-8/E CONSOLE DCA I (OUSPLAT) /MAKE SPLAT CHARACTER HARDCOPY-ORIENTED TAD (CON-VTCON) /GET NORMAL CONSOLE OFFSET VCON, TAD (VTCON) /GET VT-8/E CONSOLE ROUTINE ADDRESS DCA OUNPTR /SETUP O(UTPUT) U(NIVERSAL) POINTER TAD WORD /GET CDF MCS+10 DCA INLIN2 /STORE IN-LINE TAD WORD /GET IT AGAIN DCA DEVLUP /STORE IN-LINE INLIN2, .-. /WILL BE CDF MCS+10 TAD I (INTLST) /GET INTERRUPT ELEMENT LIST POINTER DCA ILPTR2 /STASH THE POINTER DEVLUP, .-. /WILL BE CDF MCS+10 TAD I ILPTR2 /GET AN ELEMENT CDF DFIELD /BACK TO OUR FIELD SNA /END OF LIST? JMP DEVEND /YES TAD (-KSFIOT) /COMPARE TO POSSIBLE VALUE SZA /SKIP IF IT MATCHES JMP TEST43 /ELSE TRY OTHER VALUE TAD IMASK /GET CURRENT INTERRUPT MASK DCA ALLOW03 /STORE OVER CODE TEST43, TAD (-DKSFIOT+KSFIOT) /COMPARE TO OTHER POSSIBLE VALUE SZA CLA /SKIP IF IT MATCHES JMP NXTEST /ELSE GO TRY NEXT ELEMENT TAD IMASK /GET CURRENT INTERRUPT MASK DCA ALLOW43 /STORE OVER CODE NXTEST, ISZ ILPTR2 /BUMP TO NEXT ELEMENT TAD IMASK /GET CURRENT MASK CLL RAL /MOVE LEFT ONE BIT DCA IMASK /STORE BACK JMP DEVLUP /KEEP GOING DEVEND, TAD (OVFLAG) /POINT THE O(PTION) G(ENERIC) COMMAND DCA OGENABLE /AT THE CONSOLE OVERLAY DCA I (OVINT) /ENABLE OVERLAY INPUT INTERRUPT HANDLER TAD ALLOW43 /GET ENABLE INSTRUCTION SPA /SKIP IF ZAPPED JMP NOCONENTRY /ELSE FORGET IT DCA I43MSK /SAVE AS INTERRUPT MASK (IF NEEDED) NL7777 /SET PRIMARY COMPARE VALUE TAD I43MSK /COMPARE TO ACTUAL VALUE SZA CLA /SKIP IF PRIMARY INTERRUPT JMP SEC43 /GO HANDLE AS SECONDARY DEVICE ISZ OVFLAG /ENABLE OVERLAY INPUT BY DEFAULT (O(PTION) V(T8E)) TAD (OVFLAG) /POINT THE O(PTION) V(T-8/E) COMMAND DCA OVENABLE /AT THE CONSOLE OVERLAY JMP ALLOW03 /CONTINUE THERE / IF THE DEVICE 43 KEYBOARD IS NOT THE PRIMARY INPUT DEVICE WITHIN THIS / OVERLAY, WE MUST HANDLE INTERRUPTS FROM IT DIFFERENTLY. SEC43, TAD (TAD I43MSK) /GET MASK INSTRUCTION DCA I (INT43) /ZAP DEVICE 43 INTERRUPT HANDLER TAD (AND ISTAT) /GET "AND ISTAT" INSTRUCTION DCA I (INT43+1) /ZAP THE INTERRUPT HANDLER TAD (SNA CLA) /GET "SNA CLA" INSTRUCTION DCA I (INT43+2) /ZAP THE INTERRUPT HANDLER JMS I (ENAB43) /ENABLE DEVICE 43 INTERRUPTS NOCONEN,ISZ DFLAG /ENABLE DEVICE 43 FOR INPUT CLA /CLEAN UP ALLOW03,JMS I (ENAB03) /**** ZAPPED **** C(IMASK) ALLOW43,JMS I (ENAB43) /**** ZAPPED **** C(IMASK) TAD ALLOW03 /GET INSTRUCTION SPA /SKIP IF ZAPPED JMP NORM03 /JUMP IF NOT DCA I03MSK /SAVE AS INTERRUPT MASK (IF NEEDED) NL7777 /SET PRIMARY COMPARE VALUE TAD I03MSK /COMPARE TO ACTUAL VALUE SZA CLA /SKIP IF PRIMARY INTERRUPT JMP SEC03 /GO HANDLE AS SECONDARY DEVICE TAD (OVFLAG) /POINT THE O(PTION) K(EYBOARD) COMMAND DCA OKENABLE /AT OUR ROUTINE JMP NORM03 /CONTINUE THERE SEC03, TAD (TAD I03MSK) /GET MASK INSTRUCTION DCA I (INT03) /ZAP DEVICE 03 INTERRUPT HANDLER TAD (AND ISTAT) /GET "AND ISTAT" INSTRUCTION DCA I (INT03+1) /STORE OVER INTERRUPT HANDLER TAD (SNA CLA) /GET "SNA CLA" INSTRUCTION DCA I (INT03+2) /STORE OVER INTERRUPT HANDLER JMS I (ENAB03) /ENABLE DEVICE 03 INTERRUPTS NORM03, CLA /CLEAN UP TAD REM /GET CONSOLE TYPE SPA CLA /SKIP IF NOT VT-8/E CONSOLE JMP I (NOSTAR) /ELSE DON'T REPEAT PROMPT CDF 00 /GOTO FIELD ZERO TAD I (CSTAR) /GET PREVAILING PROMPT CHARACTER CDF DFIELD /BACK TO OUR FIELD JMS I (OUT) /SEND THE CHARACTER JMP I (NOSTAR) /CONTINUE THERE IMASK, 1 /INTERRUPT LIST ELEMENT MASK VALUE PAGE NOSTAR, TAD REM /GET CONSOLE TYPE ILPTR3, SNA CLA /SKIP IF OVERLAY PRESENT JMP NOLOVER /JUMP IF NOT TAD (LLPT) /SETUP FOR LOGICAL PRINTER DCA OPRINT /IN O(UTPUT) P(RINTER) COMMAND TAD WORD /GET CDF MCS+10 DCA INLIN3 /STORE IN-LINE INLIN3, .-. /WILL BE CDF MCS+10 TAD I (INTLST) /GET INTERRUPT LIST POINTER DCA ILPTR3 /STASH IT OUTLUP, TAD I ILPTR3 /GET AN ELEMENT SNA /END OF LIST? JMP OUTEND /YES TAD (-TSFIOT) /COMPARE TO DEVICE 04 VALUE SZA /SKIP IF IT MATCHES JMP TEST66 /ELSE TRY LPT: TAD OMASK /GET CURRENT MASK DCA O04MSK /USE FOR DEVICE 04 TEST66, TAD (-LSFIOT+TSFIOT)/COMPARE TO DEVICE 66 VALUE SZA CLA /SKIP IF IT MATCHES JMP NXTTEST /JUMP IF NOT TAD OMASK /GET CURRENT MASK DCA O66MSK /USE FOR DEVICE 66 NXTTEST,ISZ ILPTR3 /BUMP TO NEXT ELEMENT TAD OMASK /GET THE MASK CLL RAL /MOVE UP DCA OMASK /STORE BACK JMP OUTLUP /KEEP GOING OUTEND, CDF DFIELD /BACK TO OUR FIELD TAD O66MSK /GET THE DEVICE 66 MASK VALUE SNA /SKIP IF FOUND JMP TEST04 /JUMP IF NOT TAD (-2) /COMPARE TO CONSOLE OUTPUT VALUE SNA /SKIP IF OTHER JMP USECON /JUMP IF CONSOLE VALUE TAD (-10+2) /COMPARE TO LOGICAL PRINTER VALUE SNA CLA /SKIP IF OTHER JMP USELLPT /JUMP IF LOGICAL PRINTER VALUE TAD (SECLPT) /SETUP FOR DCA I (LPTR) /SECONDARY HANDLING JMP TEST04 /CONTINUE THERE USECON, TAD (CON-LLPT) /USE CON VALUE USELLPT,TAD (LLPT) /USE LOGICAL LPT: VALUE DCA OLPT /STASH THE ROUTINE POINTER TEST04, TAD O04MSK /GET DEVICE 04 MASK VALUE SNA /SKIP IF FOUND JMP NOLOVER /JUMP IF NOT TAD (-2) /COMPARE TO CONSOLE VALUE SNA /SKIP IF OTHER JMP USETCON /JUMP IF CONSOLE VALUE TAD (-10+2) /COMPARE TO LOGICAL PRINTER VALUE SNA CLA /SKIP IF OTHER JMP USETLPT /JUMP IF LOGICAL PRINTER VALUE TAD (SECTTY) /GET SECONDARY HANDLER VALUE DCA I (TPTR) /STASH THE POINTER JMP NOLCOM /CONTINUE THERE USETCON,TAD (CON-LLPT) /USE CON VALUE USETLPT,TAD (LLPT) /USE LPT VALUE DCA OTTY /STASH THE POINTER JMP NOLCOM /CONTINUE THERE NOLOVER,JMS I (ENABLE) /ENABLE DEVICE 04 KIEIOT /WITH THIS FOR INTERRUPT ENABLE TTYTST /ENABLE THIS INTERRUPT HANDLER NOLCOM, CIF CDF 00 /GOING TO FIELD ZERO TAD (INTXIT&177+JMPC) /GET INTERRUPT BYPASS INSTRUCTION DCA I (CHKKSF) /PREVENT NORMAL HANDLING TAD (INTXIT+4&177+JMPC) /GET INTERRUPT BYPASS INSTRUCTION DCA I (TRYOUT) /PREVENT NORMAL HANDLING TAD (CLA!400) /GET CLEARING INSTRUCTION DCA I (CONPAT) /PREVENT IN-PROGRESS SWITCH SET DCA I (TELSW) /CANCEL ANY I/O IN PROGRESS TAD (CIF DFIELD) /GET FIELD INSTRUCTION DCA I (INTXIT+2) /ZAP IT IN TAD (JMP OURINT) /GET INTERRUPT JUMP INSTRUCTION DCA I (INTXIT+3) /ZAP IT IN TAD (CIF DFIELD) /GET FIELD INSTRUCTION DCA I (RECOVR+15) /ZAP IT IN TAD (RECOVR+17&177+JMPIC) /GET JUMP INSTRUCTION DCA I (RECOVR+16) /ZAP IT IN TAD (RECFIX) /GET POINTER DCA I (RECOVR+17) /ZAP IT IN DCA I (RECOVR+20) /PREVENT POINTER UPDATE DCA I (RECOVX+1) /PREVENT RECOVERY PROBLEMS JMP I (BONCE3) /REJOIN FIELD ZERO ONCE-ONLY CODE OMASK, 1 /OUTPUT INTERRUPT MASK VARIABLE PAGE ENAB03, .-. /DEVICE 03 ENABLE ROUTINE JMS ENABLE /CALL ENABLE ROUTINE KIEIOT /OUR INTERRUPT ENABLE IOT KEYINT /WHERE TO ZAP THE ROUTINE JMP I ENAB03 /RETURN ENAB43, .-. /DEVICE 43 ENABLE ROUTINE JMS ENABLE /CALL ENABLE ROUTINE DKIEIOT /OUR INTERRUPT ENABLE IOT MORBACK /WHERE TO ZAP THE ROUTINE JMP I ENAB43 /RETURN ENABLE, .-. /DEVICE ENABLE ROUTINE CDF DFIELD /ENSURE OUR FIELD TAD I ENABLE /GET ENABLE IOT DCA ENABIOT /STORE IN-LINE ISZ ENABLE /BUMP TO NEXT TAD I ENABLE /GET ROUTINE ADDRESS DCA ENAPTR /STASH THE POINTER ISZ ENABLE /BUMP PAST ARGUMENT NL7777 /SET INTERRUPT ENABLE BITS ENABIOT,.-. /WILL BE PASSED IOT NOP /JUST IN CASE CLA /CLEAN UP DCA I ENAPTR /ENABLE THE ROUTINE ALSO JMP I ENABLE /RETURN ENAPTR, .-. /ENABLE POINTER CZTABLE,RELOC COUTPUT+3 /WHERE NEW OUTPUT CODE GOES TAD CSCQSW /GET <^S>/<^Q> SWITCH SZA CLA /SKIP IF CLEAR JMP .-2 /ELSE WAIT FOR IT TAD CINPUT /GET THE VALUE CIF DFIELD /GOTO CODE FIELD JMS I POUT/(OUT) /CALL CURRENT OUTPUT ROUTINE DFINT, SNA CLA /THIS WILL NEVER SKIP DCA TELSW /CLEAR IN-PROGRESS SWITCH ION /MAKE SURE INTERRUPT IS ON JMP I COUTPUT /RETURN POUT, OUT /POINTER TO OUTPUT ROUTINE 0 /THIS ENDS THE LIST RELOC /BACK TO NORMAL PAGE NOPUNCH /FOOL THE ASSEMBLER ZBLOCK VTGBUF+VTWORDS-./REST OF GRAPHICS BUFFER ENPUNCH /UN-FOOL THE ASSEMBLER *. /ESTABLISH ORIGIN / COMES HERE TO FINISH "FDIS" FUNCTION. DODISP, JMS INTAC /TAKE INTEGER PART OF FIRST ARGUMENT JMS PUSHAC /PUSH IT JMS ARG /IS THERE A SECOND ARGUMENT? JMP DWIPE /NO, CLEAR (OR SET) THE ENTIRE SCREEN JMS INTAC /TAKE INTEGER PART OF SECOND ARGUMENT JMS PUSHAC /PUSH IT JMS ARG /IS THERE A THIRD ARGUMENT? NL7777 /NO, SET STORE SWITCH DCA STORFLG /SAVE EITHER WAY TAD STORFLG /GET THE SWITCH BACK SNA CLA /SKIP IF NO THIRD ARGUMENT JMS INTAC /ELSE TAKE INTEGER PART OF THIRD ARGUMENT SNA CLA /SKIP IF THIRD ARGUMENT PRESENT AND NON-ZERO NL7777 /ELSE SET NO-TEST FLAG DCA CHNGFLG /STORE EITHER WAY JMS POPAC /GET SECOND ARGUMENT BACK CMA /FLIP IT AND TAD (144-310) /ADJUST FOR SYMMETRY AND TEST CLL /CLEAR LINK FOR LIMIT TEST TAD (310) /ADD ON RANGE SNL /SKIP IF OK JMP DISBAD /ELSE COMPLAIN CLL RTL;RTL /*20 WORDS/LINE DCA Y /SAVE LINE BASE DCA WORD /CLEAR WORD QUOTIENT JMS POPAC /GET FIRST ARGUMENT TAD (136-275) /CENTER IT AND ADD ON TEST VALUE CLL /CLEAR LINK FOR LIMIT TEST TAD (275) /ADD ON RANGE SNL /SKIP IF OK JMP DISBAD /ELSE COMPLAIN SKP /DON'T BUMP FIRST TIME DIVLUP, ISZ WORD /BUMP WORD QUOTIENT CLL /CLEAR LINK FOR TEST TAD (-14) /SUBTRACT 12 BITS WORTH SZL /SKIP IF TOO FAR JMP DIVLUP /ELSE KEEP GOING DCA REM /SAVE BIT COUNT TAD Y /GET LINE BASE TAD WORD /ADD ON RELATIVE WORD COUNT TAD [VTGBUFFER] /MAKE IT ABSOLUTE DCA WORD /STORE WORD POINTER TAD REM /GET BIT COUNT DCA Y /SETUP SECOND COUNTER CDF DFIELD /GOTO OUR FIELD TAD I WORD /GET THE CURRENT VALUE RAR /MOVE DOWN ISZ REM /ENOUGH? JMP .-2 /NO, KEEP GOING ISZ CHNGFLG /SHOULD WE TEST IT? JMP VTEST /YES STL /NO, ASSUME WE SET IT ISZ STORFLG /IS THAT RIGHT? CLL /NO, CLEAR IT INSTEAD RAL /MOVE BACK ISZ Y /ENOUGH? JMP .-2 /NO, KEEP GOING DCA I WORD /STORE BACK JMS I [LCHECK] /CHECK FOR "L" COMMAND LOCATION CHKGRAP,JMS I [GRPHCHK] /ENSURE AT LEAST HALF-TIME GRAPHICS JMP DISPRETURN /EXIT THERE / COMES HERE IF EITHER X OR Y IS OUT OF RANGE. DISBAD, CLA /CLEAN UP TAD [XDYS+6] /GET ERROR ADDRESS CIF 00 /GOING TO FIELD ZERO JMP I (ERROR5) /GO COMPLAIN THERE / COMES HERE TO TEST THE POINT AT (X,Y). VTEST, CDF 00 /BACK TO FIELD ZERO SZL CLA /POINT CURRENTLY SET OR CLEAR? NL7777 /INDICATE SET JMP VTSTRETURN /CONTINUE THERE / COMES HERE TO CLEAR (OR SET) THE ENTIRE SCREEN. DWIPE, JMS POPAC /GET ARGUMENT BACK DCA Y /STORE IT TAD Y /GET VALUE SZA CLA /SKIP IF ZERO NL7777 /ELSE SET ALL BITS JMS I [GRCLEAR] /CLEAR (OR SET) ALL POINTS IN THE BUFFER TAD Y /GET THE VALUE AGAIN SZA CLA /SKIP IF ZERO JMP CHKGRAPHICS /JUMP IF NON-ZERO JMS FRCALPHA /FORCE DOUBLE-ALPHA MODE JMP DISPRETURN /FINISH IT THERE / COMES HERE TO CONTINUE "L" COMMAND OR FINISH FROM <^C>. LMORE2, TAD I (CTCXIT) /GET CLOBBERABLE LOCATION SMA CLA /SKIP IF NOT CLOBBERED JMP I (OM) /JUMP IF CLOBBERED OVTENAB,JMP NOVTRESTORE /**** VT-8/E CONSOLE **** 0000 CIF DFIELD /INHIBIT INTERRUPTS FOR NOW VTRCDF, .-. /WILL BE CDF MCS+10 TAD DBLALPHA /GET PRIOR MODE WORD DCA I (VTMODE) /RESTORE IT SKP /DON'T STOP VT-8/E! NOVTRES,DPSMIOT /STOP THE DISPLAY CLA /CLEAN UP CIF CDF 00 /GOING TO FIELD ZERO JMP I LSAVE /CONTINUE FORMER "L" COMMAND / DOUBLE-ALPHA FORCE ROUTINE. FRCALPH,.-. /FORCE ALPHA ROUTINE FRCACDF,CDF DFIELD+10 /**** VT-8/E CONSOLE **** CDF MCS+10 TAD DBLALPHA /GET DOUBLE-ALPHA VALUE ION /PROTECT NEXT INSTRUCTION DCA I [VTMODE] /STORE NEW MODE CDF DFIELD /BACK TO OUR FIELD JMP I FRCALPHA /RETURN / DOUBLE-GRAPHICS FORCE ROUTINE. FRCGRAP,.-. /FORCE GRAPHICS ROUTINE TAD DBLALPHA /GET DOUBLE-ALPHA VALUE CIA /COUNTERACT IT TAD (DFIELD+1^101) /GET DOUBLE-GRAPHICS VALUE JMS FRCALPHA /FORCE GRAPHICS ON JMP I FRCGRAPHICS /RETURN PAGE / INTERRUPT HANDLER CONTINUES HERE. MORINT, TAD I (BUMPIT) /GET CONSOLE INTERRUPT STATUS CMA /INVERT IT AND ISTAT /KEEP NON-CONFLICTING BITS TAD I (BUMPIT) /ADD ON NEW ONES DCA ISTAT /STORE COMPOSITE IVTINT, CIF DFIELD+10 /**** VT-8/E CONSOLE **** SKP JMP VT8INT /CALL VT-8/E INTERRUPT ROUTINE / COMES BACK HERE FROM VT-8/E INTERRUPT ROUTINE. MORBACK,SKP /**** DEVICE 43 NOT HANDLED ELSEWHERE **** 0000 INT43, DKSFIOT /**** CONSOLE SECONDARY **** TAD I43MSK JMP KEYINT /**** CONSOLE SECONDARY **** AND ISTAT SKP /**** CONSOLE SECONDARY **** SNA CLA JMP KEYINT /FORGET IT DKRBIOT /READ IT IN AND [177] /JUST SEVEN-BIT DCA DCHAR /SAVE IT TAD I43MSK /GET INTERRUPT BIT JMS INTCLR /CLEAR IT TAD DCHAR /GET IT BACK JMS I (CSCQ) /CHECK FOR <^S>/<^Q> JMP DCHECK /WAS SOMETHING ELSE DIGNORE,DCA DCHAR /OBLITERATE THE CHARACTER KEYINT, SKP /**** DEVICE 03 NOT HANDLED ELSEWHERE **** 0000 INT03, KSFIOT /**** CONSOLE SECONDARY **** TAD I03MSK JMP OVINT /**** CONSOLE SECONDARY **** AND ISTAT SKP /**** CONSOLE SECONDARY **** SNA CLA JMP OVINT /FORGET IT KRBIOT /READ IT IN AND [177] /JUST SEVEN BITS DCA KCHAR /SAVE IT TAD I03MSK /GET INTERRUPT BIT JMS INTCLR /CLEAR IT TAD KCHAR /GET IT BACK JMS I (CSCQ) /CHECK FOR <^S>/<^Q> JMP KCHECK /WAS SOMETHING ELSE KIGNORE,DCA KCHAR /OBLITERATE THE CHARACTER OVINT, SKP /**** CONSOLE **** 0000 NL0001 /SET INPUT FLAG MASK AND ISTAT /GET THE STATUS BIT SNA CLA /SKIP IF SET JMP TTYTST /ELSE FORGET IT CDF DFIELD /INDICATE OUR FIELD OVICIF, .-. /WILL BE CIF MCS+10 JMS INCON /GET THE INPUT JMP TTYTST /WASN'T ANY! AND [177] /JUST SEVEN BITS DCA OVCHAR /SAVE IT NL0001 /GET INTERRUPT BIT JMS INTCLR /CLEAR IT TAD OVCHAR /GET IT BACK JMS I (CSCQ) /CHECK FOR <^S>/<^Q> JMP OCHECK /WAS SOMETHING ELSE OVIGNOR,DCA OVCHAR /OBLITERATE THE CHARACTER TTYTST, SKP /**** DEVICE 04 NOT HANDLED ELSEWHERE **** 0000 TSFIOT /FLAG UP? JMP MOREXIT /NO TCFIOT /YES, CLEAR IT NL7777 /SET THE DCA TFLAG /DONE FLAG MOREXIT,CIF CDF 00 /GOING TO FIELD ZERO JMP I (INTXIT+4) /REJOIN MAIN INTERRUPT HANDLER DCHECK, TAD DFLAG /GET ENABLE FLAG SNA CLA /SKIP IF CURRENT KEYBOARD JMP DIGNORE /ELSE IGNORE FURTHER INPUT TAD DCHAR /GET THE CHARACTER JMS I (CHKC) /CHECK FOR <^C>, ETC. TAD DCHAR /GET THE CHARACTER KENTRY, DCA I (INCHAR) /STORE IN INPUT BUFFER CIF 00 /GOING TO FIELD ZERO JMP I (CHKKCC+1) /CONTINUE THERE KCHECK, TAD KFLAG /GET ENABLE FLAG SNA CLA /SKIP IF CURRENT KEYBOARD JMP KIGNORE /ELSE IGNORE FURTHER INPUT TAD KCHAR /GET THE CHARACTER JMS I (CHKC) /CHECK FOR <^C>, ETC. TAD KCHAR /GET THE CHARACTER JMP KENTRY /CONTINUE THERE OCHECK, TAD OVFLAG /GET ENABLE FLAG SNA CLA /SKIP IF CURRENT KEYBOARD JMP OVIGNORE /ELSE IGNORE FURTHER INPUT TAD OVCHAR /GET THE CHARACTER JMS I (CHKC) /CHECK FOR <^C>, ETC. TAD OVCHAR /GET THE CHARACTER JMP KENTRY /CONTINUE THERE / INTERRUPT CLEAR ROUTINE. INTCLR, .-. /CLEAR INTERRUPT ROUTINE CDF 00 /ENSURE FIELD ZERO CMA /INVERT TO FORM MASK CIF DFIELD /SET OUR FIELD TO INHIBIT INTERRUPTS AND ISTAT /SAVE OTHER BITS DCA ISTAT /STORE BACK JMP I INTCLR /RETURN / GRAPHICS BUFFER CLEAR ROUTINE. GRCLEAR,.-. /GRAPHICS CLEAR ROUTINE DCA GRTEMP /SAVE PASSED VALUE TAD [VTGBUFFER-1] /SETUP THE DCA XR1 /BUFFER POINTER TAD (-VTWORDS) /SETUP THE DCA WORD /BUFFER COUNT CDF DFIELD /GOTO BUFFER FIELD GRCLUP, TAD GRTEMP /GET PASSED VALUE DCA I XR1 /SET OR CLEAR A WORD ISZ WORD /DONE YET? JMP GRCLUP /NO, KEEP GOING JMP I GRCLEAR /YES, RETURN GRTEMP, .-. /TEMPORARY PAGE / O(UTPUT) A(LTERNATING). OA, TAD (BLINK-BOLD) /GET BLINK COMPENSATION DCA UPFOLD /STORE IT TAD (-BLINK+BOLD+BLINK+200) /GET LOWER-CASE COMPENSATION JMP OBENTRY /CONTINUE THERE / O(OUTPUT) B(OLD). OB, /TAD (BOLD-BOLD) /GET BOLD COMPENSATION DCA UPFOLD /STORE IT /TAD (-BOLD+BOLD) /GET LOWER-CASE COMPENSATION JMP OBENTRY /CONTINUE THERE / O(UTPUT) C(LEAR). OC, JMS OSUB /SETUP SCOPE MODE JMS I [GRCLEAR] /CLEAR GRAPHICS BUFFER TAD (35) /GET A CHARACTER JMS I (OUT) /SEND IT TAD (37) /GET AN CHARACTER JMS I (OUT) /SEND IT JMS I (FRCALPHA) /FORCE ALPHA-ONLY MODE JMP OEXIT /CONTINUE THERE / O(UTPUT) D(ELETE). OD, JMS OSUB /SETUP SCOPE MODE JMS I [GRCLEAR] /CLEAR GRAPHICS BUFFER JMS I (FRCALPHA) /FORCE ALPHA-ONLY MODE JMP OEXIT /CONTINUE THERE / O(UTPUT) E(RASE). OE, JMS OSUB /SETUP SCOPE MODE TAD (35) /GET A CHARACTER JMS I (OUT) /SEND IT TAD (37) /GET AN CHARACTER JMS I (OUT) /SEND IT JMS I (FRCGRAPHICS) /FORCE GRAPHICS-ONLY MODE JMP OEXIT /CONTINUE THERE / O(UTPUT) F(REE) (OF CURSOR). OF, NL0001 /INDICATE CURSOR REMOVAL / O(UTPUT) O(N) (CURSOR). OO, CDF DFIELD+10 /**** VT-8/E CONSOLE **** CDF MCS+10 DCA I (CURSW) /SET CURSOR SWITCH EITHER WAY / O(UTPUT) S(COPE). OS, JMS OSUB /SETUP SCOPE MODE JMP OEXIT /CONTINUE THERE / O(PTION) G(ENERIC). OG, JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS ISZ I OGENABLE /ENABLE GENERIC INPUT FLAG JMP OEXIT /CONTINUE THERE / O(UTPUT) I(NVERTING). OI, TAD [CURSOR-BOLD] /GET CURSOR COMPENSATION DCA UPFOLD /STORE IT TAD (-CURSOR+BOLD+CURSOR+200) /GET LOWER-CASE COMPENSATION JMP OBENTRY /CONTINUE THERE / O(PTION) K(EYBOARD). OK, JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS ISZ I OKENABLE /SET KEYBOARD INPUT FLAG JMP OEXIT /CONTINUE THERE / O(UTPUT) L(PT). OL, JMS SETSPLAT /SET HARDCOPY TAD OLPT /GET OUR ROUTINE POINTER JMP OLENTRY /CONTINUE THERE / O(PTION) M(ONITOR). OM, DPSMIOT /STOP THE DISPLAY IOF /PREVENT PROBLEMS CIF CDF 00 /GOING TO FIELD ZERO JMP I (SBOOT) /GOODBYE! / O(UTPUT) N(ORMAL). ON, TAD (NORMAL-BOLD) /GET NORMAL COMPENSATION DCA UPFOLD /STORE IT TAD (-NORMAL+BOLD) /GET LOWER-CASE COMPENSATION OBENTRY,DCA LOFOLD /STORE LOWER-CASE VALUE JMP OEXIT /CONTINUE THERE / O(UTPUT) P(RINTER). OP, JMS SETSPLAT /SET HARDCOPY TAD OPRINT /GET OUR ROUTINE POINTER OLENTRY,DCA ODEV /STASH THE POINTER JMP OEXIT /CONTINUE THERE / O(UTPUT) T(ERMINAL). OT, JMS SETSPLAT /SETUP HARDCOPY TAD OTTY /GET OUR OUTPUT POINTER JMP OLENTRY /CONTINUE THERE / O(UTPUT) U(NIVERSAL. OU, TAD OUSPLAT /GET OUR SPLAT AUGMENTATION JMS SETSPLAT /SET PROPER TAD OUNPTR /GET OUR POINTER JMP OLENTRY /CONTINUE THERE / O(PTION) V(T-8/E). OV, JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS ISZ I OVENABLE /SET VT-8/E KEYBOARD INPUT FLAG JMP OEXIT /CONTINUE THERE / O(UTPUT) W(AIT). OW, CDF DFIELD+10 /**** VT-8/E CONSOLE **** CDF MCS+10 TAD I [VTMODE] /GET CURRENT MODE DCA OWTEMP /SAVE IT JMS I (FRCGRAPHICS) /FORCE GRAPHICS MODE FOR NOW CIF CDF 00 /GOING TO FIELD ZERO JMS I PDOWAIT /WAIT FOR A CHARACTER CLA /THROW IT AWAY TAD DBLALPHA /GET DOUBLE ALPHA WORD CIA /COUNTERACT IT TAD OWTEMP /ADD ON PREVIOUS VALUE JMS I (FRCALPHA) /RESTORE FORMER MODE / COMMON EXIT ROUTINE. OEXIT, CIF CDF 00 /GOING TO FIELD ZERO TAD OCHAR /GET THE DELIMITER DCA I (CHAR) /RESTORE IT TAD OCHAR /GET IT AGAIN TAD (-" ) /COMPARE TO SZA /SKIP IF IT MATCHES TAD (-",+" ) /ELSE COMPARE TO "," SZA CLA /SKIP IF EITHER JMP I (PROC) /ELSE CONTINUE PROCESSING THERE JMP I POCOMAGN /PROCESS ADDITIONAL "O" SUB-COMMANDS THERE / SCOPE MODE SETUP ROUTINE. OSUB, .-. /SCOPE MODE ROUTINE TAD OSCOPE /GET SCOPE ROUTINE POINTER DCA ODEV /SET IT UP CDF 00 /GOTO FIELD ZERO TAD ("\&37) /GET SPECIAL CHARACTER DCA I (SPLAT) /STORE IN ROUTINE CDF DFIELD /BACK TO OUR FIELD JMP I OSUB /RETURN / SET HARDCOPY ROUTINE. SETSPLA,.-. /SET SPLAT CHARACTER ROUTINE CDF 00 /GOTO FIELD ZERO TAD ("\) /GET NORMAL CHARACTER DCA I (SPLAT) /STORE IN ROUTINE JMP I SETSPLAT /RETURN / RECOVERY FIXUP ROUTINE. RECFIX, JMS OSUB /SETUP O(UTPUT) S(COPE) JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS ISZ I OVENABLE /SET VT-8/E KEYBOARD INPUT FLAG CIF CDF 00 /GOING TO FIELD ZERO JMP I (RECOVR+20) /CONTINUE THERE OUSPLAT,-300 /**** NON-VT-8/E CONSOLE **** 0000 OWTEMP, .-. /O(UTPUT) W(AIT) ROUTINE TEMPORARY PDOWAIT,DOWAIT&177 /**** RELOCATE **** POCOMAG,OCOMAGN&177 /**** RELOCATE **** PAGE / GENERALIZED OUTPUT ROUTINE. OUT, .-. /OUTPUT ROUTINE DCA OUTEMP /SAVE PASSED VALUE NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD (CDF) /MAKE IT CIF CDF RETURN FIELD DCA OUTCIDF /STORE IN-LINE TAD OUTEMP /GET PASSED VALUE CDF DFIELD /INDICATE OUR FIELD AS NEEDED FOR SOME ROUTINES JMP I ODEV /GOTO CURRENT ROUTINE / VT-8/E CONSOLE OUTPUT ROUTINE. VTCON, JMS VTFOLD /DO SELECTIVE FOLD / CONSOLE OUTPUT ROUTINE. CON, .-. /WILL BE CIF MCS+10 JMS OUTCON /CALL OVERLAY ROUTINE JMP CON /TRY AGAIN IF NECESSARY / RETURNS HERE AFTER OUTPUTTING. OUTEXIT,CLA /CLEAN UP JMS I [LCHECK] /CHECK IF "L" HAS BEEN LOCATED OUTCIDF,.-. /WILL BE CIF CDF RETURN FIELD JMP I OUT /RETURN TO CALLER / DEVICE 66 LPT: OUTPUT ROUTINE. LPT, DCA OUTEMP /SAVE THE CHARACTER TAD LINIT /GET INITIALIZE VARIABLE SZA /SKIP IF ALREADY INITIALIZED LLSIOT /ELSE OUTPUT NOW CLA /CLEAN UP DCA LINIT /PREVENT FURTHER INITIALIZATION JMP I LPTR /GO TO PROPER ROUTINE LINIT, -1 /LPT: INITIALIZE SWITCH LPTR, LPTNORMAL /**** SECONDARY DEVICE 66 OVERLAY HANDLING **** SECLPT / COMES HERE FOR NORMAL DEVICE 66 LPT: HANDLING. LPTNORM,LSFIOT /FLAG UP? JMP LPTNORMAL /NO, WAIT FOR IT JMP LNORMENTRY /YES, CONTINUE THERE / COMES HERE IF DEVICE 66 IS HANDLED BY CONSOLE OVERLAY. SECLPT, TAD O66MSK /GET INTERRUPT BIT AND ISTAT /GET THE FLAG BIT SNA CLA /FLAG UP? JMP SECLPT /NO, WAIT FOR IT TAD O66MSK /GET THE FLAG BIT JMS I (INTCLR) /CLEAR IT LNORMEN,TAD OUTEMP /GET THE CHARACTER LLSIOT /OUTPUT IT JMP OUTEXIT /FINISH THERE / LOGICAL LPT: OUTPUT ROUTINE. LLPT, DCA OUTEMP /SAVE THE CHARACTER TAD LLINIT /GET INITIALIZE SWITCH SZA /SKIP IF ALREADY INITIALIZED JMS LLPTOUT /ELSE OUTPUT IT DCA LLINIT /CLEAR INITIALIZE SWITCH TAD OUTEMP /GET THE CHARACTER JMS LLPTOUT /OUTPUT IT JMP OUTEXIT /FINISH THERE LLINIT, -1 /LOGICAL LPT: INITIALIZE SWITCH / LOGICAL LPT: OUTPUT SUBROUTINE. LLPTOUT,.-. /LLPT: OUTPUT LPTCIF, .-. /WILL BE CIF MCS+10 JMS OUTLPT /OUTPUT THE CHARACTER JMP LPTCIF /WAIT FOR IT CLA /CLEAN UP JMP I LLPTOUT /RETURN / DEVICE 04 OUTPUT ROUTINE. TTY, DCA OUTEMP /SAVE THE CHARACTER TAD TTINIT /GET INITIALIZE SWITCH SZA /SKIP IF CLEAR TLSIOT /ELSE OUTPUT NOW CLA /CLEAN UP DCA TTINIT /CLEAR INITIALIZE SWITCH JMP I TPTR /GOTO PROPER ROUTINE TPTR, TTYNORMAL /**** SECONDARY CONSOLE HANDLING **** SECTTY TTINIT, -1 /TTY: INITIALIZE SWITCH TTYNORM,TAD TFLAG /DONE YET? SNA CLA /SKIP IF SO JMP TTYNORMAL /NO, WAIT FOR IT DCA TFLAG /YES, CLEAR THE FLAG JMP TNORMENTRY /CONTINUE THERE SECTTY, TAD O04MSK /GET INTERRUPT MASK VALUE AND ISTAT /GET THE FLAG BIT SNA CLA /SKIP IF SET JMP SECTTY /JUMP IF NOT TAD O04MSK /GET THE BIT AGAIN JMS I (INTCLR) /CLEAR IT TNORMEN,TAD OUTEMP /GET THE CHARACTER TLSIOT /OUTPUT IT JMP OUTEXIT /CONTINUE THERE / INTERNAL VT-8/E OUTPUT ROUTINE. INTVT8E,JMS VTFOLD /DO SELECTIVE FOLD CIF DFIELD+10 /GOTO ROUTINE FIELD JMS IVTOUT /CALL OUR INTERNAL ROUTINE JMP OUTEXIT /FINISH IT THERE / VT-8/E FOLDING ROUTINE. VTFOLD, .-. /FOLD ROUTINE DCA FOLDTMP /SAVE PASSED VALUE TAD FOLDTMP /GET IT BACK AND [177] /JUST SEVEN-BIT TAD (-" !200) /COMPARE TO CONTROL CHARACTER SPA CLA /SKIP IF GREATER JMP CONFOLD /ELSE FORGET IT TAD FOLDTMP /GET IT AGAIN AND [177] /JUST SEVEN-BIT TAD (-140) /COMPARE TO LOWER-CASE SMA CLA /SKIP IF UPPER-CASE TAD LOFOLD /ELSE ADD ON LOWER-CASE COMPENSATION TAD UPFOLD /AT LEAST USE UPPER-CASE VALUE CONFOLD,CDF DFIELD+10 /**** VT-8/E CONSOLE **** CDF MCS+10 DCA I (VMODE) /STORE AUGMENTATION VALUE TAD DBLALPHA /GET ALPHA VALUE JMS I [GRPHCHK] /ENSURE AT LAST HALF-TIME ALPHA MODE TAD FOLDTMP /GET ORIGINAL VALUE JMP I VTFOLD /RETURN / INPUT ENABLE FLAG CLEAR ROUTINE. INCLEAR,.-. /INPUT FLAG CLEAR ROUTINE CIF DFIELD /INHIBIT INTERRUPTS DCA DFLAG /DISABLE 43 KEYBOARD DCA KFLAG /DISABLE 03 KEYBOARD DCA OVFLAG /DISABLE OVERLAY KEYBOARD JMP I INCLEAR /RETURN FOLDTMP,.-. /TEMPORARY FOR FOLD ROUTINE OUTEMP, .-. /OUTPUT TEMPORARY PAGE / GRAPHICS MODE CHECK ROUTINE. GRPHCHK,.-. /GRAPHICS (OR ALPHA) CHECK ROUTINE SNA /ALPHA MODE PASSED? TAD (DFIELD+1) /NO, USE GRAPHICS VALUE AND (77) /JUST SIX-BIT EITHER WAY DCA GRPHCOMPARE /SAVE IT GRPHCDF,CDF DFIELD+10 /**** VT-8/E CONSOLE **** CDF MCS+10 TAD I [VTMODE] /GET CURRENT MODE WORD DCA GRPHTMP /SAVE IT TAD GRPHTMP /GET IT BACK AND (77) /JUST SIX-BIT CIA /INVERT FOR TESTING TAD GRPHCOMPARE /COMPARE TO DESIRED VALUE SNA CLA /SKIP IF DIFFERENT JMP GRPHEXIT /JUMP IF IT MATCHES TAD GRPHTMP /GET IT AGAIN BSW /CHECK LEFT HALF AND (77) /REMOVE OTHER HALF CIA /INVERT FOR TESTING TAD GRPHCOMPARE /COMPARE TO DESIRED VALUE SNA CLA /SKIP IF DIFFERENT JMP GRPHEXIT /JUMP IF IT MATCHES TAD GRPHTMP /GET CURRENT VALUE AND (7700) /KEEP UPPER HALF TAD GRPHCOMPARE /ADD ON DESIRED VALUE AS LOWER HALF ION /PROTECT NEXT INSTRUCTION DCA I [VTMODE] /STORE NEW COMPOSITE VALUE GRPHEXI,CDF DFIELD /BACK TO OUR FIELD JMP I GRPHCHK /RETURN GRPHCOM,.-. /TEMPORARY GRPHTMP,.-. /TEMPORARY / <^C> CHECK ROUTINE. CHKC, .-. /<^C> CHECK ROUTINE SNA / PASSED? JMP I CHKC /YES, FORGET IT TAD (-3) /COMPARE TO <^C> SNA /SKIP IF DIFFERENT ISZ I (SCRSIZE) /ELSE SET <^C> INDICATOR SMA SZA CLA /SKIP IF <^C> OR LESS JMP I CHKC /RETURN IF NOT TAD I (SBTFUN) /GET BOOTSTRAP UNIT AND (7) /JUST UNIT BITS TAD BTFUN/(17^100) /ADD ON FUNCTION BITS DCA BTFUN /STORE IN-LINE DPSMIOT /STOP THE DISPLAY CDF DFIELD /INDICATE OUR FIELD CIF 00 /GOING TO FIELD ZERO JMS I (SYSIO) /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS BTFUN, 17^100+.-. /UNIT BITS WILL BE FILLED IN 1 /BLOCK NUMBER CIF CDF 00 /GOING TO FIELD ZERO JMP I (MONSTRT) /GO START IT UP / <^S>/<^Q> CHECK ROUTINE. CSCQ, .-. /<^S>/<^Q> CHECK ROUTINE TAD (-"S!300) /COMPARE PASSED TO <^S> SNA /SKIP IF DIFFERENT JMP GOTCS /JUMP IF IT MATCHES TAD (-"Q+"S) /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP I CSCQ /RETURN IF NEITHER SKP /DON'T SET IF <^Q> GOTCS, NL4000 /SET <^S> VALUE DCA I (CSCQSW) /STORE IN SWITCH ISZ CSCQ /BUMP RETURN ADDRESS JMP I CSCQ /TAKE SKIP RETURN / "L" COMMAND LOCATION ROUTINE. LCHECK, .-. /CHECK IF "L" IS LOCATED ROUTINE DESTRUC,SKP /**** "L" COMMAND LOCATED **** 0000 JMP I LCHECK /JUST RETURN CDF 00 /GOTO FIELD ZERO TAD I (COMGO+10) /GET CURRENT "L" COMMAND ADDRESS TAD [-7600] /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD [7600-7400] /ADD ON RANGE SNL CLA /SKIP IF COMMAND DEFINED IN RANGE JMP I LCHECK /ELSE JUST RETURN TAD I (COMGO+10) /GET CURRENT COMMAND ADDRESS DCA LSAVE /SAVE IT TAD (LRET) /GET OUR "L" COMMAND ADDRESS DCA I (COMGO+10) /STORE IT IN TABLE DCA DESTRUCT /PREVENT OUR CHECK VT8LEAV,SKP /**** VT-8/E CONSOLE **** 0000 JMP I LCHECK /RETURN NOW IF VT-8/E CONSOLE NL0001 /SET /L BIT MASK AND I (SWAL) /GET THE BIT SNA CLA /SKIP IF SET JMP NOEL /JUMP IF NOT TAD (DPSMIOT) /GET DISPLAY STOP INSTRUCTION DCA I (LIBZAP) /ZAP IT IN JMP I LCHECK /RETURN NOEL, TAD (DPSMIOT) /GET DISPLAY STOP INSTRUCTION DCA I (LCOMZAP) /ZAP IT IN JMP I LCHECK /RETURN PAGE FIELD DFIELD+10%10 /ON TO NEXT FIELD *0 /START AT THE BEGINNING CADDRES,CADNORMAL /CURSOR ADDRESSING <^N> ROUTINE ADDRESS OUTAC, .-. /OUTPUT AC TEMPORARY OUTCHR, .-. /OUTPUT TEMPORARY SCAPADD,SCAPNORMAL / SEQUENCE ROUTINE ADDRESS VT8TMP, .-. /TEMPORARY FOR INTERRUPT HANDLER VTMODE, DFIELD+10+2^101 /INTERRUPT LEVEL MODE SWITCHING WORD VTEMP1, .-. /OUTPUT TEMPORARY VTEMP2, .-. /OUTPUT TEMPORARY *10 /GET TO AUTO-INDEX AREA CXR1, .-. /AUTO-INDEX NUMBER ONE CXR2, .-. /AUTO-INDEX NUMBER TWO *20 /GET PAST AUTO-INDEX AREA OLDCHR, .-. /PREVIOUS CONTENTS OF LOCATION WHERE CURSOR IS OLDPTR, OLDPTR /ADDRESS OF CURSED LOCATION VTLNPTR,.-. /POINTER TO BEGINNING OF CURRENT LINE IN DISPLAY BUFFER VTPTR, .-. /POINTER TO CURRENT CHARACTER IN DISPLAY BUFFER / VT-8/E INTERRUPT HANDLING ROUTINE. VT8INT, DPCLIOT /VIDEO RETRACE FLAG UP? JMP VTINTXT /NO, FORGET IT TAD VTMODE /YES, GET CURRENT MODE BSW /FLIP IT DCA VTMODE /STORE BACK TAD VTMODE /GET IT AGAIN AND [70] /JUST FIELD BITS DCA VT8TMP /STORE FOR NOW NL0006 /SETUP QUARTER MASK AND VTMODE /GET THE MEMORY QUARTER CLL RTR;RTR /MOVE UP TAD [VTOFFSET] /ADD ON IMPLIED OFFSET DPLAIOT /LOAD DISPLAY ADDRESS NL0001 /SET MODE MASK AND VTMODE /GET THE MODE BIT STL RAL /MOVE UP AND SET INTERRUPT ENABLE TAD VT8TMP /ADD ON FIELD BITS DPGOIOT /START IT UP VTINTXT,CIF DFIELD /GOING TO OTHER CODE FIELD JMP I [MORBACK] /CONTINUE THERE *54 /FOR COMPATIBILITY / THE FOLLOWING LOCATION CONTROLS THE TAB-IN FOR A CONTINUED LINE AFTER / A BLINKING "+" CHARACTER IS INSERTED AT THE BEGINNING OF THE LINE. TABCNT, -50 /TAB-IN COUNT IVTOUT, .-. /OUTPUT ROUTINE DCA OUTAC /SAVE PASSED VALUE CDF DFIELD+10 /ENSURE OUR FIELD TAD OUTAC /GET PASSED VALUE BACK AND [177] /JUST SEVEN-BIT DCA OUTCHR /STASH THE CHARACTER JMP I SCAPADDRESS /GO TO HANDLING ROUTINE *74 /FOR COMPATIBILITY VMODE, 0 /OUTPUT AUGMENTATION BITS CURSW, 0 /CURSOR ON SWITCH PAGE / WHEN HANDLING IS DISABLED, IT COMES HERE. SCAPNOR,JMP I CADDRESS /GO TO CURSOR ADDRESSING ROUTINE / WHEN CURSOR ADDRESSING IS DISABLED, IT COMES HERE. CADNORM,TAD OUTCHR /GET THE LATEST CHARACTER TAD (-" !200) /COMPARE TO SPA /SKIP IF NOT CONTROL CHARACTER JMP I (CONTROL) /JUMP IF CONTROL CHARACTER TAD [-100] /COMPARE TO LOWER-CASE SPA /SKIP IF LOWER-CASE TAD (BOLD+200+" -200) /MAKE IT UPPER-CASE TAD (NORMAL+200+100) /ADD ON RESTORATION BITS TAD VMODE /ADD ON AUGMENTATION BITS DCA VTEMP1 /SAVE FOR NOW JMS I [PUTBACK] /RESTORE OLD CURSOR POSITION TAD VTEMP1 /GET THE CHARACTER JMS I [PRTCHR] /OUTPUT IT VTEXIT, JMS I (ROLCHK) /CHECK IF IT FITS TAD VTPTR /GET CURRENT POINTER DCA OLDPTR /SAVE IT TAD I OLDPTR /GET CURRENT CHARACTER DCA OLDCHR /SAVE IT TAD CURSW /GET CURSOR SWITCH SZA CLA /SKIP IF CLEAR JMP VSNSTST /JUMP IF SET TAD OLDCHR /GET CURRENT CHARACTER AND (7177) /REMOVE MODE BITS TAD [CURSOR+200] /MAKE IT CURSOR INSTEAD DCA I OLDPTR /STORE IT BACK VSNSTST,DPMSIOT /GET THE SENSE SWITCH SPA CLA /SKIP IF NOT SET JMP VEXIT /EXIT NOW IF SET LAS /GET SWITCH REGISTER DCA I (WASTE) /SETUP WASTE COUNTER TAD [-4] /GET INNER WASTE VALUE DCA VTEMP1 /SETUP COUNTER ISZ VTEMP1 /WASTE JMP .-1 /SOME TIME ISZ I (WASTE) /WASTED ENOUGH TIME? JMP .-5 /NO, KEEP WASTING AWAY VEXIT, CIF CDF DFIELD /BACK TO CALLING FIELD JMP I IVTOUT /RETURN TO CALLER / COMES HERE. VTCR, TAD VTLNPTR /GET LINE POINTER CIA /INVERT TAD VTPTR /ADD ON CURRENT POINTER TAD TABCNT /NOW HAVE LINE DIFFERENCE SNA /SKIP IF NOT ON FIRST LINE JMP BACKIN /JUMP IF JUST THE TRIVIAL CASE AND [77] /CHECK FOR JUST-CONTINUED LINE SNA CLA /SKIP IF OTHER JMP BACKUP /JUST BACKUP A WHOLE LINE BACKIN, TAD VTPTR /GET CURRENT POINTER AND [7700] /JUST LINE BITS CUPIN, DCA VTPTR /NOW AT BEGINNING OF LINE JMP I (COMMON) /CONTINUE THERE BACKUP, TAD VTPTR /GET THE POINTER AND [7700] /JUST LINE BITS DCA VTPTR /STORE BACK TAD [" &177+4000] /GET A DCA I VTPTR /PUT IT IN BUFFER TAD [-100] /GET BACKUP FACTOR JMP BACKIN /CONTINUE THERE / ARROW MODE (^) CONTROL CHARACTERS COME HERE. PRCONT, TAD ("^+BOLD) /GET AN "^" JMS I [PRTCHR] /INSERT IT TAD OUTCHR /GET THE CHARACTER TAD (BOLD+300+4000) /MAKE IT BOLD JMS I [PRTCHR] /INSERT IT JMP I (COMMON) /CONTINUE THERE / SPECIAL HANDLING CHARACTER COMES HERE. VTRUB, TAD VTPTR /GET CURRENT POINTER TAD (-VTBUFFER) /COMPARE TO LOWER LIMIT SPA SNA CLA /SKIP IF NOT AT BEGINNING JMP VTHOME /ELSE FORGET IT NL7777 /\ TAD VTPTR / >BACKUP THE POINTER DCA VTPTR // TAD I VTPTR /GET THE PREVIOUS CHARACTER RAL /EXPENDABLE BIT TO LINK CLA /CLEAN UP TAD [" &177+4000] /GET A DCA I VTPTR /PUT IT IN BUFFER SZL /SKIP IF IT WAS A REGULAR CHARACTER JMP VTRUB /ELSE RUBOUT PREVIOUS ALSO / COMES HERE. VTEOS, TAD VTPTR /GET CURRENT POINTER TAD (-VTBFEND) /ESTABLISH CLEAR COUNT JMP EOSENTRY /CONTINUE THERE / COMES HERE. VTEOL, TAD VTPTR /GET THE POINTER AND [77] /JUST ON-LINE BITS TAD [-100] /FORM ON-LINE CLEAR COUNT EOSENTR,DCA VTEMP1 /STORE CLEAR COUNT NL7777 /BACKUP TAD VTPTR /GET THE POINTER DCA CXR1 /STORE FOR CLEARING TAD [" &177+4000] /GET A DCA I CXR1 /CLEAR THE CHARACTER ISZ VTEMP1 /DONE YET? JMP .-3 /NO, KEEP GOING JMP I (COMMON) /CONTINUE THERE / COMES HERE. VTFF, JMS I (CLEAR) /CLEAR THE BUFFER / COMES HERE. VTHOME, TAD [VTBUFFER] /POINT TO BEGINNING OF BUFFER JMP CUPIN /CONTINUE THERE / HANDLING COMES HERE. ESCAPE, TAD (ESCAP2) /SETUP NEXT ADDRESS POINTER DCA SCAPADDRESS /STASH THE NEW POINTER JMP I (COMMON) /CONTINUE THERE / HANDLING CONTINUES HERE. ESCAP2, TAD [SCAPNORMAL] /RESET THE DCA SCAPADDRESS / ADDRESS JMS I [PUTBACK] /RESTORE THE PREVIOUS CHARACTER TAD OUTAC /GET THE VALUE / DO SOMETHING HERE. CLA /CLEAN UP JMP I (COMMON) /CONTINUE THERE PAGE / CURSOR ADDRESSING INITIALLY COMES HERE. VTCAD, TAD (CADY) /GET NEXT ADDRESS DCA CADDRESS /SET IT UP JMP COMMON /CONTINUE THERE / COMES HERE UPON FIRST CHARACTER AFTER <^N>. CADY, TAD OUTCHR /GET LATEST CHARACTER SNA CLA /SKIP IF NOT JMP COMMON /IGNORE IN <^N> SEQUENCE TAD (CADX) /GET NEXT ADDRESS DCA CADDRESS /SET IT UP JMS I [PUTBACK] /RESTORE THE CHARACTER TAD OUTCHR /GET THE CHARACTER TAD (-40-24) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (24) /ADD ON RANGE SNL /SKIP IF IN RANGE CLA /ELSE USE 0000 TAD (VTBUFFER%100) /ADD ON SHIFTED BUFFER BASE BSW /MOVE UP DCA VTPTR /SAVE AS NEW POINTER TAD OUTCHR /GET THE CHARACTER AGAIN TAD (-16) /COMPARE TO <^N> SNA /SKIP IF OTHER JMP COMMON /DON'T DO IT AGAIN IN MIDDLE! TAD (-40+16) /COMPARE TO OTHER CONTROL CHARACTERS SMA /SKIP IF CONTROL CHARACTER JMP COMMON /ELSE NO FURTHER ACTION CONTROL,TAD (CTABLE+40) /POINT AT TABLE ELEMENT DCA VTEMP1 /STASH THE POINTER JMS I [PUTBACK] /PUT THE CHARACTER BACK NOW TAD I VTEMP1 /GET THE ADDRESS DCA VTEMP1 /STASH IT JMP I VTEMP1 /GO TO ROUTINE ADDRESS / COMES HERE UPON SECOND CHARACTER AFTER <^N>. CADX, TAD OUTCHR /GET LATEST CHARACTER SNA CLA /SKIP IF NOT JMP COMMON /IGNORE IN <^N> SEQUENCE TAD (CADNORMAL) /RESET THE DCA CADDRESS /NORMAL ADDRESS JMS I [PUTBACK] /PUT THE CHARACTER BACK NOW TAD OUTCHR /GET THE CHARACTER TAD (-40-110) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (110) /ADD ON RANGE SNL /SKIP IF LEGAL CLA /ELSE USE 0000 TAD [-100] /COMPARE TO OUR LIMIT SMA /SKIP IF OK NL7777 /ELSE TRUNCATE ON RIGHT TAD (100) /RESTORE THE VALUE TAD VTPTR /ADD ON CURRENT POINTER DCA VTPTR /STORE NEW VALUE TAD OUTCHR /GET THE CHARACTER AGAIN TAD (-16) /COMPARE TO <^N> SNA /SKIP IF OTHER JMP COMMON /JUMP IF <^N> TAD (-40+16) /COMPARE TO CONTROL CHARACTER SPA /SKIP IF NOT CONTROL CHARACTER JMP CONTROL /ELSE ALSO DO ITS FUNCTION COMMON, SKP CLA /CLEAN UP AND DON'T RING THE VTBELL, DPBLIOT /BANG A GONG AND GET IT ON TAD VTPTR /GET THE POINTER AND [7700] /JUST LINE BITS DCA VTLNPTR /STORE BEGINNING POINTER JMP I (VTEXIT) /CONTINUE THERE / COMES HERE. VTTAB, NL3777 /SETUP MASK AND I VTPTR /GET THE WORD JMS I [PRTCHR] /PUT IT BACK WITHOUT WASTE BIT TAD VTPTR /GET THE POINTER AND (7) /JUST BITS SNA /SKIP IF NOT AT A STOP JMP COMMON /JUMP IF IT IS TAD (7770) /FORM CHARACTER COUNT DCA VTEMP2 /STASH THE COUNTER TAD I VTPTR /GET THE CHARACTER JMS I [PRTCHR] /PUT IT RIGHT BACK ISZ VTEMP2 /DONE YET? JMP .-3 /NO, KEEP GOING JMP COMMON /YES, FINISH IT THERE / COMES HERE. CLEFT, TAD VTPTR /GET THE CURRENT POINTER AND [77] /JUST ON-LINE BITS SZA CLA /SKIP IF AT BEGINNING NL7777 /ELSE GENERATE BACKUP FACTOR CRITENT,TAD VTPTR /UPDATE POINTER DCA VTPTR /STORE BACK JMP COMMON /CONTINUE THERE / COMES HERE. CRIGHT, TAD VTPTR /GET THE POINTER IAC /ADD ONE AND [77] /WILL BE AT BEGINNING OF LINE? SZA CLA /SKIP IF SO NL0001 /ELSE ALLOW UPDATE JMP CRITENTRY /CONTINUE THERE / COMES HERE. CUP, TAD VTPTR /GET THE POINTER TAD [-VTBUFFER-100] /COMPARE TO BEGINNING LIMIT SMA CLA /SKIP IF AT TOP ALREADY TAD [-100] /ELSE ALLOW BACKUP FACTOR JMP CRITENTRY /CONTINUE THERE / COMES HERE. CDOWN, TAD VTPTR /GET THE POINTER TAD (100-VTBFEND) /COMPARE TO UPPER LIMIT SPA CLA /SKIP IF TOO FAR VTLF, NL0100 /ELSE ALLOW UPDATE JMP CRITENTRY /CONTINUE THERE PAGE PRTCHR, .-. /INSERT PRINTABLE CHARACTER ROUTINE JMS INSERT /INSERT IT AT FIRST TAD VTPTR /GET THE NEW POINTER VALUE AND [77] /JUST LINE BITS SZA CLA /SKIP IF AT BEGINNING OF LINE JMP I PRTCHR /ELSE JUST RETURN JMS ROLCHK /CHECK IF WE STILL FIT TAD ("++BLINK+4000) /GET A BLINKING "+" JMS INSERT /PUT AT BEGINNING OF LINE TAD TABCNT /GET COUNT DCA VTEMP1 /SETUP THE COUNTER VTABLP, ISZ VTEMP1 /DONE YET? SKP /SKIP IF NOT JMP I PRTCHR /RETURN IF SO TAD [" &177+4000] /GET A JMS INSERT /PUT IN THE BUFFER JMP VTABLP /TRY AGAIN ROLCHK, .-. /CHECK IF BUFFER ROLL NEEDED ROUTINE CLA /JUST IN CASE TAD VTPTR /GET CURRENT POINTER TAD (-VTBFEND) /COMPARE TO UPPER LIMIT SPA CLA /SKIP IF TOO FAR JMP I ROLCHK /RETURN IF NOT TAD VTPTR /GET THE POINTER DCA ROLTMP /SAVE IT FOR NOW TAD (VTBUFFER+100-1) /SETUP DCA CXR1 /THE TAD (VTBUFFER-1) /ROLLING DCA CXR2 /POINTERS TAD [VTBUFFER-VTBFEND+100] /SETUP THE DCA VTEMP1 /ROLL COUNT TAD I CXR1 /GET A WORD DCA I CXR2 /PUT A WORD ISZ VTEMP1 /DONE YET? JMP .-3 /NO, KEEP GOING TAD [-100] /SETUP THE DCA VTEMP1 /EXTRA LINE COUNT TAD [" &177+4000] /GET A DCA I CXR2 /PUT IN BUFFER ISZ VTEMP1 /DONE YET? JMP .-3 /NO, KEEP GOING TAD ROLTMP /GET SAVED BUFFER POINTER TAD [-100] /BACKUP ONE LINE DCA VTPTR /POINT TO CORRECTED ADDRESS TAD VTLNPTR /GET LINE POINTER TAD [-100] /BACK IT UP ALSO DCA VTLNPTR /STORE BACK JMP I ROLCHK /RETURN INSERT, .-. /INSERT A CHARACTER ROUTINE DCA I VTPTR /STORE THE PASSED CHARACTER ISZ VTPTR /BUMP TO NEXT JMP I INSERT /RETURN PUTBACK,.-. /PREVIOUS CHARACTER UNDER CURSOR RESTORE ROUTINE TAD OLDCHR /GET PREVIOUS CHARACTER DCA I OLDPTR /PUT IT BACK JMP I PUTBACK /RETURN CLEAR, .-. /CLEAR ROUTINE NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD (CDF) /MAKE IT CIF CDF RETURN FIELD DCA CLRXIT /STORE IN-LINE CDF DFIELD+10 /GOTO OUR FIELD TAD [VTBUFFER] /SETUP DCA VTPTR /BUFFER POINTER TAD [VTBUFFER] /SETUP DCA VTLNPTR /LINE POINTER TAD (VTBUFFER-VTBFEND) /SETUP THE DCA CLEARTMP /CLEAR COUNT TAD (VTBUFFER-1) /SETUP THE DCA CXR1 /CLEAR POINTER TAD [" &177+4000] /GET CLEAR CHARACTER DCA I CXR1 /CLEAR A WORD ISZ CLEARTMP /DONE ALL YET? JMP .-3 /NO, GO BACK CLRXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I CLEAR /RETURN / CONTROL CHARACTER TABLE. CTABLE, COMMON/PRCONT /000 <^> PRCONT /001 <^A> PRCONT /002 <^B> PRCONT /003 <^C> PRCONT /004 <^D> PRCONT /005 <^E> PRCONT /006 <^F> VTBELL /007 <^G> CLEFT /010 <^H> VTTAB /011 <^I> VTLF /012 <^J> CDOWN /013 <^K> VTFF /014 <^L> VTCR /015 <^M> VTCAD /016 <^N> PRCONT /017 <^O> PRCONT /020 <^P> PRCONT /021 <^Q> PRCONT /022 <^R> PRCONT /023 <^S> PRCONT /024 <^T> PRCONT /025 <^U> PRCONT /026 <^V> PRCONT /027 <^W> CRIGHT /030 <^X> PRCONT /031 <^Y> CUP /032 <^Z> ESCAPE /033 <^[> VTRUB /034 <^\> > VTHOME /035 <^]> VTEOL /036 <^^> VTEOS /037 <^ CLEARTM,.-. /TEMPORARY ROLTMP, .-. /TEMPORARY WASTE, .-. /TIME WASTE LOCATION PAGE FIELD 0 /BACK TO FIELD ZERO / ONCE-ONLY CODE STARTS HERE. *BONCE /OVER DEFAULT ONCE-ONLY AREA BONCE, NL0002 /SETUP "C" BIT MASK PBASE, AND I (SCRSIZE) /GET THE "C" BIT CIF DFIELD /GOTO CODE FIELD JMP I (BONCE2) /CONTINUE ONCE-ONLY CODE THERE / COMES BACK HERE AFTER ONCE-ONLY CODE IN FIELD DFIELD IS FINISHED. BONCE3, CDF DFIELD /GOTO DISPLAY FIELD DCA I CLRPTR /CLEAR A WORD ISZ CLRPTR /BUMP TO NEXT ISZ CLRCNT /DONE YET? JMP .-3 /NO, KEEP GOING CDF 00 /BACK TO OUR FIELD TAD I (SWMX) /GET /M-/X SWITCHES AND (1000) /JUST /O BIT SNA CLA /SKIP IF SET JMP ONO /JUMP IF NOT TAD ("O) /GET "O" DCA I (COMLST+16) /STORE IN COMMAND CHARACTER TABLE TAD BOTTOM /\ TAD (-200+1) / \ESTABLISH AND P7600/[7600] / /BASE ADDRESS DCA PBASE // TAD PBASE /\ TAD (OSTART&177-1) / >ESTABLISH NEW LIMIT DCA BOTTOM // TAD PBASE /GET BASE TAD I (OLISTP) /RELOCATE "O" LIST POINTER DCA I (OLISTP) /STORE ADJUSTED POINTER TAD PBASE /GET BASE TAD (OCOM&177) /POINT TO RELOCATED "O" COMMAND DCA I (COMGO+16) /STORE IN COMMAND DISPATCH TABLE CDF DFIELD /GOTO CODE FIELD TAD PBASE /GET BASE TAD I (POCOMAGN) /POINT TO RELOCATED "O" COMMAND REENTRY DCA I (POCOMAGN) /STORE ADJUSTED POINTER TAD PBASE /GET BASE TAD I (PDOWAIT) /POINT TO RELOCATED WAIT ROUTINE DCA I (PDOWAIT) /STORE ADJUSTED POINTER CDF 00 /BACK TO FIELD ZERO TAD BOTTOM /\ IAC / >SETUP MOVE BASE DCA PBASE // OMVLUP, TAD I LOSTART /\ DCA I PBASE / \ ISZ LOSTART / \MOVE DOWN THE "O" ISZ PBASE / /COMMAND CODE ISZ MOVCNT / / JMP OMVLUP // ONO, DCA I (BEOFZAP) /REPAIR LOADER JMP I (BEOFZAP) /RESUME LOADING CLRCNT, -VTWORDS /CLEAR COUNTER CLRPTR, VTGBUFFER /CLEAR POINTER LOSTART,OSTART /"O" COMMAND CURRENTLY HERE MOVCNT, OSTART-OEND /LENGTH OF "O" COMMAND CODE TO MOVE PAGE *OSTART /"O" COMMAND CODE STARTS HERE / "O" COMMAND REENTERS HERE. OCOMAGN,GETC /GET PAST DELIMITER / "O" COMMAND ENTRY. OCOM, SPNOR /IGNORE ANY SPACES TAD CHAR /GET COMMAND CHARACTER PUSHA /SAVE IT ON STACK SKP /MAY ALREADY BE A TERMINATIOR OCOMLP, GETC /GET NEXT CHARACTER SORTC /COMPARE TO TERMS-1 /TERMINATORS IN LIST SKP /SKIP IF IT MATCHES JMP OCOMLP /ELSE THROW AWAY AND TRY AGAIN TAD CHAR /GET THE TERMINATOR CDF DFIELD /GOTO CODE FIELD DCA I (OCHAR) /SAVE IT CDF 00 /BACK TO FIELD ZERO POPA /GET COMMAND CHARACTER BACK DCA CHAR /RESTORE IT SORTC /COMPARE TO OUR LIST OLISTP, OLIST-1&177 /**** RELOCATE **** JMP NOERROR /JUMP IF FOUND TAD (7401) /GET ERROR ADDRESS JMP I (ERROR5) /FINISH IT THERE NOERROR,TAD SORTCN /GET INDEX TAD (JMP I ODISP) /MAKE INTO INSTRUCTION DCA .+2 /STORE IN-LINE CIF CDF DFIELD /GOTO CODE FIELD JMP I ODISP+.-. /GOTO PROPER ROUTINE / INPUT WAIT ROUTINE FOR "O(UTPUT) W(AIT)". DOWAIT, .-. /INPUT WAIT ROUTINE JMS I INDEV /GET NEXT INPUT CHARACTER CIF DFIELD /GOTO CODE FIELD JMP I DOWAIT /RETURN TO CALLER / "O" COMMAND CHARACTER LIST. OLIST, "A /O(UTPUT) A(LTERNATING): USE BLINKING OUTPUT "B /O(UTPUT) B(OLD): USE BOLD OUTPUT "C /O(UTPUT) C(LEAR): CLEAR ALL POINTS, CHARACTERS "D /O(UTPUT) D(ELETE): DELETE ALL POINTS "E /O(UTPUT) E(RASE): ERASE ALL CHARACTERS "F /O(UTPUT) F(REE) (OF CURSOR) "G /O(PTION) G(ENERIC) (INPUT) "I /O(UTPUT) I(NVERTING): USE CURSOR OUTPUT "K /O(PTION) K(EYBOARD) (INPUT) "L /O(UTPUT) L(PT) "M /O(PTION) M(ONITOR): RETURN (TO P?S/8) "N /O(UTPUT) N(ORMAL): USE NORMAL OUTPUT "O /O(UTPUT) O(N) (CURSOR) "P /O(UTPUT) P(RINTER) "S /O(UTPUT) S(COPE): USE VT-8/E FOR OUTPUT "T /O(UTPUT) T(ERMINAL) DEVICE 04 "U /O(UTPUT) U(NIVERSAL) TO CONSOLE OVERLAY "V /O(PTION) V(T-8/E) (INPUT) "W /O(UTPUT) W(AIT): WAIT FOR A CHARACTER IN GRAPHICS MODE / NEGATIVE VALUE (IN ODISP) TERMINATES THE LIST. / "O" COMMAND DISPATCH ADDRESS LIST. ODISP, OA /BLINKING OUTPUT OB /BOLD OUTPUT OC /CLEAR OUTPUT OD /DELETE OUTPUT OE /ERASE OUTPUT OF /CURSOR OFF OG /CONSOLE OVERLAY INPUT OI /CURSOR OUTPUT OK /KEYBOARD INPUT OL /LPT: OUTPUT OM /RETURN TO MONITOR ON /NORMAL OUTPUT OO /CURSOR ON OP /LOGICAL LPT: OUTPUT OS /VT-8/E OUTPUT OT /TERMINAL OUTPUT OU /CONSOLE OVERLAY OUTPUT OV /VT-8/E INPUT OW /OUTPUT WAIT PAGE OEND= . /END OF RELOCATABLE CODE *BEOFZAP /OVER LOADER SKP /MAKE IT COME TO US $ /THAT'S ALL FOLK!