/ P?S/8 FOCAL I/O REDIRECTION / LAST EDIT: 08-APR-1987 23:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 FOCAL OVERLAY FOR REDIRECTION OF FOCAL INPUT AND OUTPUT OPERATIONS. / THIS OVERLAY PROVIDES VARIOUS "O" COMMANDS TO ALLOW FOCAL TO COMMUNICATE / WITH VARIOUS STANDARD DEVICES. THE CONSOLE OVERLAY IS SUPPORTED AS THREE / ADDITIONAL DEVICES (LOGICAL KEYBOARD INPUT, LOGICAL TERMINAL OUTPUT, AND / LOGICAL LINEPRINTER OUTPUT) AS WELL AS THE STANDARD HARDWARE PHYSICAL DEVICES / (03 KEYBOARD, 04 TERMINAL OUTPUT, AND 66 LINEPRINTER OUTPUT). / ALL COMMANDS REPRESENT A PROPER SUBSET OF THOSE FOUND IN "VT8PCH" WITH ALL / VT-8/E DEPENDENT FEATURES REMOVED (VT-8/E CONSOLE OVERLAY SUPPORT IS, OF / COURSE, IMPLICITLY AVAILABLE IF THE VT-8/E CONSOLE OVERLAY IS PRESENT; THE / COMMANDS MUST REFER TO THE OVERLAY, NOT TO THE VT-8/E HARDWARE-SPECIFIC / OPTIONS). / OPTION COMMANDS. / O(PTION) G(ENERIC) GENERIC CONSOLE INPUT DEVICE; DEVICE 03 IF NO OVERLAY / 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) P(RINTER) LOGICAL PRINTER OUTPUT (DEVICE 66 IF NO OVERLAY) / O(UTPUT) T(ERMINAL) DEVICE 04 (CONSOLE TERMINAL) TERMINAL OUTPUT / O(UTPUT) U(NIVERSAL) OUTPUT TO CONSOLE (DEVICE 04 IF NO OVERLAY) / ALL "O" COMMAND ERRORS REPORT ?30.00. / ALL FOCAL "?" REPORTS (INCLUDING <^P>-CAUSED ?01.00) REVERT INPUT TO O(PTION) / G(ENERIC) AND OUTPUT TO O(UTPUT) U(NIVERSAL). / FUNCTIONS AVAILABLE: / FIO(NEGATIVE) RETURNS NUMERICAL VALUE (MODULO 128) OF NEXT ASCII / CHARACTER TYPED; P?S/8 FOCAL WILL WAIT FOR INPUT / IF NECESSARY. 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. 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 000-255 / MOD 256 ALLOWING ANY COMBINATION OF ASCII CHARACTER / OUTPUT WITH OR WITHOUT PARITY SET. / THE UNBUFFERED FDIS FUNCTION IS DELETED BY USING THIS OVERLAY; A BUFFERED / FDIS FUNCTION MAY BE RESTORED ONLY BY USE OF A COMPATIBLE DISPLAY OVERLAY / (SUCH AS "DPATCH"). / ASSEMBLY PARAMETERS. / SET THE OPTION FIELD. / OFIELD= 40 /OPTION CODE FIELD / CONDITIONAL ASSEMBLY PARAMETERS. IFNDEF CI /CONSOLE KEYBOARD IS DEVICE 03 IFNDEF CO /CONSOLE PRINTER IS DEVICE 04 IFNDEF LP /LINE PRINTER IS DEVICE 66 IFNDEF OFIELD /USE FIELD FOUR FOR OPTION CODE / IOT DEFINITIONS. 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 KTIIOT= CI^10+6003 /KEYBOARD TEST INSTRUCTION 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 TIEIOT= CO^10+6005 /OUTPUT INTERRUPT ENABLE PER AC[11] FOR 6120 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 EFUN3I= 0136 /FUNCTION RETURN ERROR5= 2725 /ERROR FUNCTION FLAC= 0044 /FLOATING AC FNTABF= 0374 /FUNCTION ADDRESS TABLE FNTABL= 2165 /FUNCTION NAME TABLE GETC= JMS I 145 /UNPACK A CHARACTER INDEV= 0064 /INPUT ROUTINE POINTER INTEGER=0053 /FIXING ROUTINE FOR FLAC OUTDEV= 0063 /OUTPUT ROUTINE POINTER POPA= TAD I 13 /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 /RETURN FROM A FUNCTION SORTC= JMS I 150 /SORT CHAR AGAINST LIST SORTCN= 0054 /SORTC INDEX NUMBER SPNOR= JMS I 160 /IGNORE LEADING ZEROES AND SPACES TELSW= 0016 /TERMINAL I/O IN PROGRESS SWITCH TERMS= 1770 /TERMINATOR TABLE XDYS= 1142 /FDIS FUNCTION ADDRESS XINT= 1160 /INTEGER PART ROUTINE / DEFINITIONS FROM P?S/8 AND THE P?S/8 FOCAL AND CONSOLE OVERLAYS. BEOFZAP=7505 /BINARY LOADER ZAP WORD 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 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 LINFLAG=0030 /LPT: INPUT EVENT FLAG IN CONSOLE OVERLAY MONSTRT=0353 /KEYBOARD MONITOR STARTUP ADDRESS 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 SYSIO= 7640 /SYSTEM I/O ENTRY POINT TRYOUT= 2673 /OUTPUT INTERRUPT LOCATION / MISCELLANEOUS DEFINITIONS. BCLI= 1560 /BIT CLEAR IMMEDIATE COM= 0017 /COMPLEMENT AC ESF= 0004 /LOAD SPECIAL FUNCTIONS REGISTER JMPC= JMP . /CURRENT PAGE JUMP INSTRUCTION JMPIC= JMP I . /CURRENT PAGE JUMP INDIRECT INSTRUCTION LINC= 6141 /GOTO LINC MODE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0010= CLA IAC RAL RAR /LOAD AC WITH 0010 **** ON 6120 ONLY **** NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 OSTART= 4124 /"O" COMMAND PATCH STARTING ADDRESS PDP= 0002 /GOTO PDP-8 MODE SFA= 0024 /READ SPECIAL FUNCTIONS REGISTER FIELD 0 /ENSURE FIELD ZERO *FNTABF+3 /OVER FDIS ADDRESS ERROR5 /DELETE FDIS 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 CIF OFIELD /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 ZBLOCK XINT-. /EMPTY SPACE XINT= . /UPPER LIMIT FOR SUPPORT CODE *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 FIELD OFIELD%10 /OPTION CODE FIELD *0 /START AT THE BEGINNING / EXTENDED INTERRUPT HANDLER. OURINT, JMP I [MORINT] /CONTINUE THERE ODEV, TTY /**** CONSOLE **** CON OGENABL,KFLAG /**** 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, TTY /**** CONSOLE **** CON *10 /GET TO AUTO-INDEX AREA ISTAT, 0 /INTERRUPT STATUS WORD KCHAR, .-. /DEVICE 03 KEYBOARD CHARACTER BUFFER KFLAG, 0 /DEVICE 03 KEYBOARD INTERRUPT WAKEUP FLAG OCHAR, .-. /LATEST "O" COMMAND CHARACTER OVCHAR, .-. /OVERLAY KEYBOARD CHARACTER BUFFER OVFLAG, 0 /OVERLAY INPUT INTERRUPT WAKEUP FLAG O66MSK, 0 /DEVICE 66 INTERRUPT MASK FOR OVERLAY TFLAG, 0 /DEVICE 04 DONE FLAG *20 /GET PAST AUTO-INDEX AREA I03MSK, 4000 /DEVICE 03'S INTERRUPT STATUS BIT MASK O04MSK, 4000 /DEVICE 04 INTERRUPT MASK FOR OVERLAY TMP1, .-. /TEMPORARY (FOR ONCE-ONLY) TMP2, .-. /TEMPORARY (FOR ONCE-ONLY) / COMES HERE TO FINISH THE "FIO" FUNCTION. XIOMORE,AND [177] /JUST SEVEN-BIT 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 CIF CDF 00 /GOING TO FIELD ZERO JMP I [XRET] /FINISH IT THERE *4000 /MAKE ALL FURTHER ADDRESSES NEGATIVE! / 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 ILPTR1, 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 TMP1 /STASH IT CDF OFIELD /GOTO OUR FIELD TAD TMP1 /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 TMP1 /GET CDF MCS+10 DCA I (KEYCDF) /STORE IN INTERRUPT HANDLER FOR LPT: INPUT NL7777 /INDICATE CONSOLE OVERLAY PRESENT NOCONSO,DCA TMP2 /STORE CONSOLE INDICATOR AS NECESSARY CZAPLUP,CDF OFIELD /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 TMP2 /GET CONSOLE INDICATOR SNA CLA /SKIP IF CONSOLE PRESENT JMP NOCONENTRY /JUMP IF NO CONSOLE PRESENT TAD (CON) /POINT O(UTPUT U(NIVERSAL AT DCA OUNPTR /CONSOLE ROUTINE TAD TMP1 /GET CDF MCS+10 DCA INLIN1 /STORE IN-LINE TAD TMP1 /GET IT AGAIN DCA DEVLUP /STORE IN-LINE INLIN1, .-. /WILL BE CDF MCS+10 TAD I (INTLST) /GET INTERRUPT ELEMENT LIST POINTER DCA ILPTR1 /STASH THE POINTER DEVLUP, .-. /WILL BE CDF MCS+10 TAD I ILPTR1 /GET AN ELEMENT CDF OFIELD /BACK TO OUR FIELD SNA /END OF LIST? JMP DEVEND /YES TAD (-KSFIOT) /COMPARE TO POSSIBLE VALUE SZA CLA /SKIP IF IT MATCHES JMP NXTEST /JUMP IF NOT TAD IMASK /GET CURRENT INTERRUPT MASK DCA ALLOW03 /STORE OVER CODE NXTEST, ISZ ILPTR1 /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 NOCONEN,ISZ I OGENABLE /ENABLE OVERLAY INPUT BY DEFAULT (KEYBOARD IF NONE) ALLOW03,JMS I (ENAB03) /**** 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 DCA I (KEYINT) /ENABLE DEVICE 03 INTERRUPT HANDLER TAD I03MSK /GET MASK VALUE TAD (-4) /COMPARE TO LPT: INPUT VALUE SZA CLA /SKIP IF IT MATCHES JMP NORM03 /JUMP IF NOT TAD (SKP) /SETUP THE SPECIAL LPT: INPUT DCA I (KLIENABLE) /CHARACTER INTERRUPT HANDLER NORM03, CLA /CLEAN UP JMP I (NXT) /CONTINUE THERE CZAPTR, COUTPUT+3 /WHERE OUTPUT CODE GOES CZTPTR, CZTABLE /POINTER TO OUTPUT REPLACEMENT CODE IMASK, 1 /INTERRUPT LIST ELEMENT MASK VALUE PAGE NXT, TAD TMP2 /GET CONSOLE INDICATOR ILPTR2, 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 TMP1 /GET CDF MCS+10 DCA INLIN2 /STORE IN-LINE INLIN2, .-. /WILL BE CDF MCS+10 TAD I (INTLST) /GET INTERRUPT LIST POINTER DCA ILPTR2 /STASH IT OUTLUP, TAD I ILPTR2 /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 ILPTR2 /BUMP TO NEXT ELEMENT TAD OMASK /GET THE MASK CLL RAL /MOVE UP DCA OMASK /STORE BACK JMP OUTLUP /KEEP GOING OUTEND, CDF OFIELD /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 SPA /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,NL7777 /SETUP TEST VALUE KTIIOT /DO TEST INSTRUCTION SNA CLA /SKIP IF PDP-8/E INTERFACE OR BETTER JMP PREOMNIBUS /JUMP IF OLDER INTERFACE METHOD PREOCOM,JMS I (ENAB03) /ENABLE DEVICE 03 INTERRUPTS JMS I (ENABLE) /ENABLE THE DEVICE 04 INTERRUPTS TIEIOT /DECMATE IOT ONLY TTYTST /ENABLE ADDRESS / TAD (SKP) /RESET THE ENABLE ROUTINE / DCA I (ENABSW) /FOR POSSIBLE OTHER DEVICES NL0010 /SETUP MAGIC DECMATE INSTRUCTION TAD (-10) /CHECK IF IT WORKED SNA CLA /SKIP IF NOT 6120 JMP NOLCOM /JUMP IF 6120 DCA I (INCTEST) /PREVENT CIF IN FLAG CLEAR ROUTINE DCA I (INTEST) /PREVENT CIF IN STATUS CLEAR ROUTINE NOLCOM, JMS I (OSUB) /SETUP DEFAULT INPUT AND OUTPUT CIF CDF 00 /GOING TO FIELD ZERO JMP I (BONCE3) /REJOIN FIELD ZERO ONCE-ONLY CODE / PRE-OMNIBUS INTERFACES TREAT 6XX3 AS 6XX1 THEN 6XX2; SINCE 6XX2 CLEARED / THE AC, WE KNOW THERE IS NO EXPLICIT INTERRUPT ENABLE INSTRUCTION AS THERE / EXISTS ON PDP-8/E, ETC. / IF THIS IS A PDP-12, THE INTERRUPT ENABLE FOR DEVICES 03, 04, 40, 41 MAY / BE AFFECTED BY THE SPECIAL FUNCTIONS REGISTER. PREOMNI,CLA /CLEAN UP (JUST IN CASE) DCA I (ENABSW) /PREVENT 6XX5 INTERRUPT ENABLE OPERATIONS LINC /BECOME A LINC COM /COMPLEMENT AC PDP /BECOME A PDP-8 SNA CLA /SKIP IF AC DID CHANGE JMP PREOCOMMON /JUST KEEP GOING LINC /BACK TO LINC MODE SFA /GET CURRENT SPECIAL FUNCTIONS BCLI; 40 /TURN OFF INTERRUPT INHIBIT BIT ESF /WRITE NEW VALUE PDP /BACK TO PDP-8 MODE CLA /CLEAN UP JMP PREOCOMMON /CONTINUE THERE 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 ENABLE, .-. /DEVICE ENABLE ROUTINE CDF OFIELD /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 DCA I ENAPTR /ENABLE INTERRUPT ROUTINE ENABSW, SKP /**** PRE-OMNIBUS INTERFACE **** 0000 JMP I ENABLE /RETURN NOW NL7777 /SET INTERRUPT ENABLE BITS ENABIOT,.-. /WILL BE PASSED IOT NOP /JUST IN CASE CLA /CLEAN UP 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 OFIELD /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 / 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 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 KLIENAB,KRBIOT /**** CONSOLE AND LPT: INPUT HANDLER **** SKP JMP KEYCONT /CONTINUE THERE / IF CHARACTER IS LPT: INPUT, IT WILL BE AVAILABLE HERE. KEYCDF, .-. /WILL BE CDF MCS+10 TAD I (LINFLAG) /GET LPT: INPUT CHARACTER KEYCONT,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 OFIELD /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 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 OENTRY, DCA I (INCHAR) /STORE IN INPUT BUFFER CIF 00 /GOING TO FIELD ZERO JMP I (CHKKCC+1) /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 OENTRY /CONTINUE THERE / INTERRUPT CLEAR ROUTINE. INTCLR, .-. /CLEAR INTERRUPT ROUTINE CDF 00 /ENSURE FIELD ZERO CMA /INVERT TO FORM MASK DCA INTEMP /SAVE FOR NOW INTEST, SKP /**** NOT 6120 **** 0000 JMP INTCIF /CONTINUE THERE IF NOT 6120 SKON /TURN INTERRUPTS OFF AND MAYBE SKIP IAC/TAD (IOF-ION) /SET INCREMENT IF IOF TAD [ION] /NOW HAVE ION OR IOF DCA INTBARE /STORE IN-LINE SKP /DON'T DO CIF! INTCIF, CIF OFIELD /SET OUR FIELD TO INHIBIT INTERRUPTS TAD INTEMP /GET PASSED VALUE AND ISTAT /SAVE OTHER BITS DCA ISTAT /STORE BACK INTBARE,NOP /**** 6120 **** ION OR IOF JMP I INTCLR /RETURN INTEMP, .-. /TEMPORARY PAGE / O(PTION) G(ENERIC). IFZERO .&4000 OG, JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS ISZ I OGENABLE /ENABLE GENERIC INPUT FLAG JMP OEXIT /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, TAD OLPT /GET OUR ROUTINE POINTER JMP OLENTRY /CONTINUE THERE / O(PTION) M(ONITOR). OM, IOF /PREVENT PROBLEMS CIF CDF 00 /GOING TO FIELD ZERO JMP I (SBOOT) /GOODBYE! / O(UTPUT) P(RINTER). OP, TAD OPRINT /GET OUR ROUTINE POINTER OLENTRY,DCA ODEV /STASH THE POINTER JMP OEXIT /CONTINUE THERE / O(UTPUT) T(ERMINAL). OT, TAD OTTY /GET OUR OUTPUT POINTER JMP OLENTRY /CONTINUE THERE / O(UTPUT) U(NIVERSAL. OU, TAD OUNPTR /GET OUR POINTER JMP OLENTRY /CONTINUE THERE / 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 / RECOVERY FIXUP ROUTINE. RECFIX, JMS OSUB /RESET INPUT AND OUTPUT CIF CDF 00 /GOING TO FIELD ZERO JMP I (RECOVR+20) /CONTINUE THERE / I/O RESET ROUTINE. OSUB, .-. /I/O RESET SUBROUTINE JMS I (INCLEAR) /CLEAR ALL INPUT FLAGS CDF OFIELD /ENSURE OUR FIELD ISZ I OGENABLE /ENABLE GENERIC INPUT FLAG TAD OUNPTR /GET O(UTPUT) U(NIVERSAL) POINTER DCA ODEV /SETUP DEFAULT DEVICE JMP I OSUB /RETURN 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 OFIELD /INDICATE OUR FIELD AS NEEDED FOR SOME ROUTINES JMP I ODEV /GOTO CURRENT ROUTINE / 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 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 / COMES HERE IF CONSOLE OVERLAY HANDLES DEVICE 04 INTERRUPTS ONLY AS SECONDARY / DEVICE. 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 / INPUT ENABLE FLAG CLEAR ROUTINE. INCLEAR,.-. /INPUT FLAG CLEAR ROUTINE INCTEST,SKP /**** NOT 6120 **** 0000 JMP INCIF /CONTINUE THERE IF NOT 6120 SKON /TURN INTERRUPTS OFF AND SKIP IF SO IAC/TAD (IOF-ION) /NOW HAVE IOF INCREMENT TAD [ION] /NOW HAVE ION OR IOF DCA INCBARE /STORE IN-LINE SKP /DON'T EXECUTE CIF! INCIF, CIF OFIELD /INHIBIT INTERRUPTS DCA KFLAG /DISABLE 03 KEYBOARD DCA OVFLAG /DISABLE OVERLAY KEYBOARD INCBARE,NOP /**** 6120 **** ION OR IOF JMP I INCLEAR /RETURN OUTEMP, .-. /OUTPUT TEMPORARY PAGE / <^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 CDF OFIELD /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 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 OFIELD /GOTO CODE FIELD JMP I (BONCE2) /CONTINUE ONCE-ONLY CODE THERE / COMES BACK HERE AFTER ONCE-ONLY CODE IN FIELD OFIELD IS FINISHED. BONCE3, 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 TELSW /CANCEL ANY I/O IN PROGRESS TAD (CIF OFIELD) /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 OFIELD) /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 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 OFIELD /GOTO CODE FIELD TAD PBASE /GET BASE TAD I (POCOMAGN) /POINT TO RELOCATED "O" COMMAND REENTRY DCA I (POCOMAGN) /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 // DCA I (BEOFZAP) /REPAIR LOADER JMP I (BEOFZAP) /RESUME LOADING 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 OFIELD /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 OFIELD /GOTO CODE FIELD JMP I ODISP+.-. /GOTO PROPER ROUTINE / "O" COMMAND CHARACTER LIST. OLIST, "G /O(PTION) G(ENERIC) (INPUT) "K /O(PTION) K(EYBOARD) (INPUT) "L /O(UTPUT) L(PT) "M /O(PTION) M(ONITOR): RETURN (TO P?S/8) "P /O(UTPUT) P(RINTER) "T /O(UTPUT) T(ERMINAL) DEVICE 04 "U /O(UTPUT) U(NIVERSAL) TO CONSOLE OVERLAY / NEGATIVE ADDRESS IN ODISP TERMINATES THE LIST. / "O" COMMAND DISPATCH ADDRESS LIST. ODISP, OG /CONSOLE OVERLAY INPUT OK /KEYBOARD INPUT OL /LPT: OUTPUT OM /RETURN TO MONITOR OP /LOGICAL LPT: OUTPUT OT /TERMINAL OUTPUT OU /CONSOLE OVERLAY OUTPUT PAGE OEND= . /END OF RELOCATABLE CODE *BEOFZAP /OVER LOADER SKP /MAKE IT COME TO US $ /THAT'S ALL FOLK!