/ VT-8/E CONSOLE OVERLAY FILE / LAST EDIT: 04-FEB-1988 17:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / THIS IS THE CONSOLE OVERLAY FILE FOR VT-8/E TYPE CONSOLE SUPPORT WITH / STANDARD BUFFERED LPT: AND I/O ERROR HANDLING CAPABILITIES. / ASSEMBLY PARAMETERS. / SETTING OVTYPE=40 GENERATES A STANDARD OVERLAY (DEVICE 43, 45 CONSOLE AND / DEVICE 65, 66 LPT:). / SETTING OVTYPE=41 GENERATES A NON-STANDARD OVERLAY (DEVICE 43, 45 CONSOLE / AND DEVICE 40, 41 LPT:). / ADDITIONAL TYPES CAN BE DEFINED FOR OTHER DEVICE CODES. / SETTING LPBUFF=1 GENERATES AN OVERLAY WITH LPT: BUFFERING ENABLED. / SETTING LPBUFF=0 GENERATES AN OVERLAY WITH LPT: BUFFERING DISABLED. / SETTING VT8LPT=1 GENERATES INTERRUPT ENABLE FOR DEVICE 66. THIS IS TO BE / SET WHEN THE LPT: IS NOT DEVICE 66, BUT DEVICE 66 SHARES INTERRUPT CONTROL / WITH THE VT-8/E KEYBOARD (DEVICE 43). / SETTING VT8LPT=0 DISREGARDS DEVICE 66 INTERRUPTS AND IS THE DEFAULT SETTING / WHEN THE LPT: IS DEVICE 66 (THERE IS NO "EXTRA" DEVICE 66). / SETTING ONEWAY=1 ASSUMES A HARDWARE HANDSHAKING (CENTRONICS, ETC.) TYPE / INTERFACE TO THE LPT: WHICH HAS NO INPUT HANDLING. / SETTING ONEWAY=0 ASSUMES A SOFTWARE HANDSHAKING (<^S>/<^Q>) TYPE INTERFACE / WITH SUITABLE INPUT HANDLING. / SET PARAMETERS HERE. / KEY= 43 /KEYBOARD CODE / LIN= 65 /LPT: INPUT CODE / LPBUFF= 1 /ENABLE LPT: BUFFERING / LPT= 66 /LPT: OUTPUT CODE / NMCH1= "V^100+"T-300 /FIRST NAME PAIR / NMCH2= "8^100+"E-300 /SECOND NAME PAIR / NMCH3= 0000 /THIRD NAME PAIR / ONEWAY= 1 /LPT: OUTPUT ONLY / OUT= 45 /VT-8/E VIDEO CODE / OVTYPE= 40 /GENERATE STANDARD OVERLAY / VT8LPT= 0 /DON'T ENABLE SEPARATE INTERRUPT HANDLER FOR /DORMANT DEVICE 66 (DEVICE 66 IS THE LPT:) / CONDITIONAL ASSEMBLY PARAMETERS. IFNDEF OVTYPE /DEFAULT TO STANDARD OVERLAY TYPE IFZERO OVTYPE-40 < IFNDEF KEY /DEFAULT KEYBOARD CODE IFNDEF LIN /DEFAULT LPT: INPUT CODE IFNDEF LPT /DEFAULT LPT: OUTPUT CODE IFNDEF NMCH1 /DEFAULT FIRST NAME PAIR IFNDEF NMCH2 /DEFAULT SECOND NAME PAIR IFNDEF NMCH3 /DEFAULT THIRD NAME PAIR IFNDEF ONEWAY /DEFAULT IS ONE-WAY LPT: HANDLING IFNDEF OUT /DEFAULT VT-8/E VIDEO CODE IFNDEF VT8LPT /DEFAULT IS NO SHARED INTERRUPTS > IFZERO OVTYPE-41 < IFNDEF KEY /KEYBOARD CODE IFNDEF LIN /LPT: INPUT CODE IFNDEF LPT /LPT: OUTPUT CODE IFNDEF NMCH1 /DEFAULT FIRST NAME PAIR IFNDEF NMCH2 /DEFAULT SECOND NAME PAIR IFNDEF NMCH3 /DEFAULT THIRD NAME PAIR IFNDEF ONEWAY /DEFAULT IS TWO-WAY LPT: HANDLING IFNDEF OUT /VT-8/E VIDEO CODE IFNDEF VT8LPT /GENERATE SHARED INTERRUPTS > IFNDEF KEY /DEFAULT KEYBOARD CODE IFNDEF LIN /DEFAULT LPT: INPUT CODE IFNDEF LPBUFF /DEFAULTS TO LPT: BUFFERING IFNDEF LPT /DEFAULT LPT: OUTPUT CODE IFNDEF NMCH1 /DEFAULT FIRST NAME PAIR IFNDEF NMCH2 /DEFAULT SECOND NAME PAIR IFNDEF NMCH3 /DEFAULT THIRD NAME PAIR IFNDEF ONEWAY /DEFAULT IS TWO-WAY LPT: HANDLING IFNDEF OUT /DEFAULT VT-8/E VIDEO CODE IFZERO LPT-66 < IFNDEF VT8LPT /NO SHARED INTERRUPT HANDLING > IFNDEF VT8LPT /HANDLE SHARED INTERRUPTS // P?S/8 DEFINITIONS. ADRLST= 7603 /ZAP ADDRESS LIST CALADR= 0020 /CALLING ADDRESS CALFLD= 0021 /CALLING FIELD CCHECK= 2343 /<^C> CHECK ROUTINE CHKCNT= 0043 /CHECKSUM COUNT CHKPTR= 0044 /CHECKSUM POINTER CNTLST= 7615 /ZAP CONTENTS LIST CONINT= 0000 /CONSOLE INTERRUPT LOCATION CONOFF= 0100 /CONSOLE OFF DEVWRD= 0104 /DEVICE WORD DSPBLB= 0024 /BLURB DISPLAY ERRTRP= 0046 /ERROR TRAP ESTATUS=0077 /ERROR STATUS FILBLB= 0023 /BLURB FILL FUDWRD= 0105 /FUDGE WORD INCON= 0031 /CONSOLE INPUT INFLAG= 0025 /CONSOLE INPUT EVENT FLAG INTFLGS=0002 /INTERRUPT FLAGS INTLST= 0003 /INTERRUPT LIST POINTER IOTRAP= 0045 /I/O TRAP IOWAIT= 0047 /I/O WAIT LCMODE= 0006 /LPT: CASE LINFLAG=0030 /LPT: INPUT EVENT FLAG LPMODE= 0004 /LPT: BUFFERING MODE LPTFLAG=0027 /LPT: OUTPUT EVENT FLAG MOVBLB= 0022 /MOVE BLURB POINTER OUTCON= 0033 /CONSOLE OUTPUT OUTFLAG=0026 /CONSOLE OUTPUT EVENT FLAG OUTLPT= 0035 /LOGICAL LPT: OVID= 0106 /OVERLAY ID AREA OVRCOMM=2511 /MONITOR ONCE-ONLY REJOIN ADDRESS OVRWRD= 0111 /OVERLAY TYPE WORD P7JMP= 2337 /OUTPUT JUMP INSTRUCTION P7OUT= 2335 /OUTPUT WAITING ADDRESS P7TLS= 2340 /OUTPUT INSTRUCTION HERE P7TSF= 2336 /OUTPUT SKIP INSTRUCTION HERE SBOOT= 7600 /MONITOR RESTARTS HERE SBTFUN= 7602 /BOOTSTRAP FUNCTION WORD SCRSIZE=7611 /SYSTEM CORE SIZE WORD SYSIO= 7640 /SYSTEM I/O ADDRESS TRAPIO= 1041 /I/O TRAP TRPBLK= 0113 /TRAP BLOCKS ARE HERE TRPERR= 1200 /ERROR TRAP TTY= 0003 /TTY: BASE DEVICE CODE TTYTST= 2506 /TTY: TIME-OUT ROUTINE IN KEYBOARD MONITOR VTMODE= 0005 /VT-8/E MODE WORD WAITIO= 1110 /I/O WAIT TRAP XIOMON= 0102 /MONITOR STARTUP ADDRESS WITHIN OVERLAY ZAPLST= 7627 /I/O ZAP CONTENTS LIST // END OF P?S/8 DEFINITIONS. / OTHER DEFINITIONS. BLINK= 200-200 /BLINK MODE BITS BOLD= 400-200 /BOLD MODE BITS BUFSIZE=0400 /SIZE OF LPT: BUFFER CIF10= CIF 10 /CIF CONSTANT CURSOR= 600-200 /CURSOR MODE BITS EOS= 3000 /END OF SCREEN CODE JMPIC= JMP I . /CURRENT PAGE JMP INDIRECT INSTRUCTION JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0004= CLA CLL IAC RTL /LOAC AC WITH 0004 NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 NL0100= CLA IAC BSW /LOAD AC WITH 0100 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 NORMAL= 000-200 /NORMAL MODE BITS SYSINST=SYSIO&177+JMSC /I/O CALL INSTRUCTION DEFINITION VTOFFSE=0200 /BUFFER OFFSET / 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=OUT^10+6007 /GENERATE BELL TONE DPCLIOT=OUT^10+6006 /SKIP ON, CLEAR VIDEO RETRACE FLAG DPGOIOT=OUT^10+6001 /LOAD INTERRUPT ENABLE, VIDEO MODE, GO DPLAIOT=OUT^10+6000 /LOAD VIDEO DISPLAY ADDRESS DPMSIOT=OUT^10+6005 /READ SENSE REGISTER DPSMIOT=OUT^10+6002 /STOP DISPLAY LCFIOT= LPT^10+6002 /CLEAR LPT: FLAG LIEIOT= LIN^10+6005 /LPT: INPUT INTERRUPT ENABLE PER AC[11] LIRBIOT=LIN^10+6006 /READ LPT: INPUT, CLEAR FLAG LISFIOT=LIN^10+6001 /SKIP ON (CLEAR IF 6120) LPT: INPUT FLAG LLEIOT= LPT^10+6005 /LPT: INTERRUPT ENABLE PER AC[11] LLSIOT= LPT^10+6006 /OUTPUT LPT: CHARACTER, CLEAR FLAG LSFIOT= LPT^10+6001 /SKIP ON (CLEAR IF 6120) LPT: FLAG MONKCC= TTY^10+6002 /CLEAR KEYBOARD FLAG IN KEYBOARD MONITOR MONKRB= TTY^10+6006 /READ KEYBOARD BUFFER, CLEAR IN MONITOR MONKRS= TTY^10+6004 /READ KEYBOARD BUFFER IN KEYBOARD MONITOR MONKSF= TTY^10+6001 /SKIP ON KEYBOARD FLAG IN KEYBOARD MONITOR MONTLS= TTY+1^10+6006 /KEYBOARD MONITOR OUTPUT CHARACTER, CLEAR FLAG MONTSF= TTY+1^10+6001 /SKIP ON OUTPUT FLAG IN KEYBOARD MONITOR IFNZRO VT8LPT < IFNDEF PRT /DORMANT PRINTER CODE PRCFIOT=PRT^10+6002 /CLEAR DORMANT PRINTER FLAG PRIEIOT=PRT^10+6005 /INTERRUPT ENABLE PER AC[11] IN CASE /DORMANT PRINTER ISN'T REALLY SHARED! PRSFIOT=PRT^10+6001 /SKIP ON DORMANT PRINTER FLAG > / FILE HEADER FOR CONSOLE UTILITY VALIDATION. *NMCH1 /FIRST TWO DEVICE NAME CHARACTERS *NMCH2 /SECOND TWO DEVICE NAME CHARACTERS *NMCH3 /THIRD TWO DEVICE NAME CHARACTERS / THE CONSOLE OVERLAY IMAGE STARTS HERE. IT EXTENDS FROM 0000-5777 ON / THE SYSTEM DEVICE, BUT IS VIRTUALLY LOADED IN THREE PARTS: 0000-1777, / 2000-3777, 4000-5777. THE PORTION FROM 0000-1777 WILL BE INITIALLY / BROUGHT IN WITH THE CONSOLE UTILITY ITSELF FOR USE WITH /U LOADING OF / BINARY FILES. WHEN CALCULATING THE CHECKSUM, THE PORTION FROM 0000-2577 / WILL BE LOADED. *0 /START AT THE BEGINNING / THE CONSOLE INTERRUPT ROUTINE IS ENTERED HERE. EVENT FLAGS WILL BE SET / FOR THE BENEFIT OF THE NORMAL NON-INTERRUPT CONSOLE ROUTINES. THE SOLE / PURPOSE IS TO CLEAR THE INTERRUPT FOR THE BENEFIT OF THE USER. IT IS STILL / NECESSARY TO CALL THE I/O ROUTINES IN THE NORMAL MANNER TO DO THE ACTUAL / I/O. THOUGH IT NORMALLY CAUSES THE RESPECTIVE FLAGS TO CLEAR, THE / CONSOLE INTERRUPT HANDLER COULD CONCEIVABLY MISS AN INTERRUPT FLAG / BELONGING TO THE OVERLAY. THEREFORE THE USER PROGRAM SHOULD ATTEMPT TO / NOT DUPLICATE INTERRUPT HANDLING FOR THE DEVICES SUPPORTED BY THE OVERLAY, / AS THIS COULD LEAD TO ANOMALOUS RESULTS. IT IS SUGGESTED THAT THE USER'S / PROGRAM BE TAILORED TO THE SYSTEM AT HAND AND SHOULD "TIME-OUT" ANY / STRAY INTERRUPTS FROM OTHER DEVICES SUSPECTED OF POSSIBLY BEING SUPPORTED / BY THE OVERLAY. THE OVERLAY INTERRUPT HANDLER SHOULD ALWAYS BE CALLED / BEFORE TESTING ANY FLAG POSSIBLY ASSOCIATED WITH THE OVERLAY. THE OVERLAY / INTERRUPT ROUTINES WILL CHECK ALL OVERLAY ASSOCIATED FLAGS EACH TIME THE / OVERLAY INTERRUPT HANDLER IS CALLED, AND SET STATUS BITS IN THE AC UPON / INTERRUPT EXIT. CONINT, .-. /CONSOLE INTERRUPT ENTRY POINT JMP I [INTCON] /GO HANDLE IT THERE / THE FOLLOWING LOCATIONS ARE PROVIDED TO ALLOW INTERRUPT-DRIVEN PROGRAMS / THE ABILITY TO INTERACT WITH THE OVERLAY BETTER. INTFLGS,.-. /INTERRUPT FLAGS INTLST, INTDEV /INTERRUPT DEVICE LIST POINTER / THE FOLLOWING LOCATION CONTROLS WHETHER OR NOT LPT: BUFFERING OCCURS. / SETTING LPMODE=1 PREVENTS BUFFERING, SETTING LPMODE=0 ALLOWS BUFFERING TO / A CHARACTER. IF BUFFERING IS ALLOWED, LPMODE WILL BE NEGATIVE / IMMEDIATELY AFTER SENDING A 7777 TO THE LPT: ROUTINE. THIS WILL STILL / ALLOW BUFFERING, BUT WILL TEMPORARILY SUSPEND IT WHEN STARTING UP A NEW / PROGRAM, SO THAT THE PROGRAM CAN TIME OUT THE EXISTENCE OF THE LPT: / HARDWARE. THE LPMODE VALUE WILL BE THE TWO'S COMPLEMENT OF THE CURRENT / COUNT OF CHARACTERS STILL LEFT TO BE SENT UNTIL FULL BUFFERING TO A / IS TO BE REENABLED. IF LPMODE=1, THEN THIS WILL NOT OCCUR. LPMODE, 1-LPBUFF /LPT: BUFFERING MODE; 1=NO BUFFERING ALLOWED / THE FOLLOWING WORD IS RESERVED FOR VT-8/E, ETC. OVERLAY STRUCTURES WHICH / REQUIRE MODE SWITCHING ON INTERRUPT, ETC. IF THE USER PROGRAM DISCOVERS / THAT THE VT-8/E VIDEO INTERRUPT IS BEING HANDLED BY SEARCHING THE INTERRUPT / DEVICE LIST FOR AN EXTRA DEVICE, AND THAT DEVICE HAPPENS TO BE THE VT-8/E / VIDEO INTERFACE, THEN THIS WORD CAN BE MODIFIED TO ALLOW USER GRAPHICS / MODE, ETC. TO BE APPENDED TO THE INTERRUPT HANDLER. VTMODE, .-. /VT-8/E MODE WORD / THE FOLLOWING WORD CONTROLS THE DISPOSITION OF LOWER-CASE CHARACTERS TO / BE OUTPUT TO THE LOGICAL LPT: HANDLER. IF LCMODE=0 THEN THESE CHARACTERS / WILL BE OUTPUT AS IS; IF LCMODE=7740 THEN THEY WILL BE "FOLDED" TO THEIR / UPPER-CASE EQUIVALENTS. LCMODE, 0 /LOWER-CASE MODE; 7740=FOLD TO UPPER LINCHAR,.-. /LPT: INPUT CHARACTER *10 /GET TO AUTO-INDEX AREA CXR1, .-. /AUTO-INDEX NUMBER ONE CXR2, .-. /AUTO-INDEX NUMBER TWO INCHAR, .-. /LATEST INPUT CHARACTER KEYTMP, .-. /KEYBOARD INTERRUPT TEMPORARY LPTAC, .-. /LPT: AC TEMPORARY LPTCHAR,.-. /LPT: CHARACTER TEMPORARY OUTAC, .-. /OUTPUT ROUTINE AC TEMPORARY OUTCHR, .-. /OUTPUT CHARACTER TEMPORARY *20 /GET PAST AUTO-INDEX AREA / THE FOLLOW LOCATIONS ARE USED TO HOLD THE CALLER'S ADDRESS AND FIELD. THEY / ARE USED BOTH BY THE TRAP BLOCK ROUTINES AND THE ERROR BLURB HANDLING / ROUTINES OF THE OVERLAY. CALADR, .-. /CALLING ADDRESS CALFLD, .-. /CALLING FIELD / THE FOLLOWING ARE ROUTINE POINTERS FOR THE TRAP BLOCK ROUTINES. / THEY ARE EXPECTED TO HANDLE THEIR RESPECTIVE TASKS BY THE / ERROR RECOVERY ROUTINES CONTAINED IN THE PARTICULAR TRAP BLOCKS OF / THE CURRENTLY CONFIGURED SYSTEM. MOVBLB, BLBMOVE /POINTER TO ERROR BLURB MOVE ROUTINE FILBLB, BLBFILL /POINTER TO ERROR BLURB FILL ROUTINE DSPBLB, BLBDISPLAY /POINTER TO ERROR BLURB DISPLAY ROUTINE / THE FOLLOWING ARE EVENT FLAGS FOR THE INTERRUPT HANDLERS OF THE DEVICES / SUPPORTED BY THE OVERLAY. IT IS POSSIBLE TO REFERENCE THEM DIRECTLY FROM / A REAL-TIME PROGRAM, BUT IT IS RECOMMENDED THAT THEY BE CLEARED BY CALLING / THE APPROPRIATE OVERLAY ROUTINE ESPECIALLY THE LPT: INPUT FLAG. THIS FLAG / IS USED TO ARBITRATE OUTPUT FLOW WITHIN THE LPT: ROUTINE ITSELF. UNLESS / THE USER IS THOROUGHLY FAMILIAR WITH THE INNER STRUCTURE OF THE LPT: / ROUTINE, IT IS BEST LEFT TO ITSELF! INFLAG, 0 /CONSOLE INPUT INTERRUPT FLAG OUTFLAG,0 /CONSOLE OUTPUT INTERRUPT FLAG LPTFLAG,0 /LPT: OUTPUT INTERRUPT FLAG LINFLAG,0 /LPT: INPUT INTERRUPT FLAG / THE FOLLOWING ARE THE MAIN ENTRY POINTS FOR THE CONSOLE AND LPT: ROUTINES. INCON, .-. /CONSOLE INPUT ROUTINE JMP I [CONIN] /GO HANDLE IT THERE OUTCON, .-. /CONSOLE OUTPUT ROUTINE JMP I [CONOUT] /GO HANDLE IT THERE OUTLPT, .-. /LPT: OUTPUT ROUTINE JMP I [LPTOUT] /GO HANDLER IT THERE EMPTPTR,.-. /BUFFER EMPTYING POINTER EMPTR, .-. /TEMPORARY EMPTYING POINTER FILLPTR,.-. /BUFFER FILLING POINTER LSTATUS,0 /LPT: STATUS / THE FOLLOWING WORDS ARE USED BY THE CONSOLE UTILITY CODE TO DETERMINE THE / CHECKSUMMED REGION OF THE OVERLAY. DUE TO RESTRICTIONS OF THE UTILITY, / THIS REGION MUST BE LOCATED BETWEEN 0000 AND 2577. CHKCNT, CONOFF+1-ENDROM /CHECKSUM COUNT CHKPTR, CONOFF+1 /CHECKSUM POINTER / THE PREVIOUS LOCATIONS ARE AVAILABLE AS TEMPORARIES FOR THE OVERLAY CODE. VTEMP1= CHKCNT /TEMPORARY VTEMP2= CHKPTR /TEMPORARY / THE FOLLOWING ARE LINKAGE POINTERS PROVIDED FOR THE TRAP BLOCK ROUTINES. IOTRAP, JMP I [OURTRAP] /GO HANDLE I/O CALLS THERE ERRTRP, JMP I [TRPERR&177+TRPAG2] /GO HANDLE I/O ERRORS THERE IOWAIT, JMP I [WAITIO&177+TRPAGE] /GO WAIT FOR I/O TO COMPLETE THERE 0 /RESERVED FOR ADDITIONAL HANDLER INTERCEPT / THE FOLLOWING WORD IS USED TO INDICATE INITIAL RELOADING OF THE OVERLAY. / ANY CLEANUP CAUSED BY RELOADING OF THE OVERLAY IS GOVERNED BY THE / VALUE OF THIS WORD. THE TRAP BLOCKS WILL BE RELOADED IF THIS WORD IS -1. INITSW, -1 /FIRST TIME SINCE RELOAD SWITCH / THE FOLLOWING LOCATIONS CONTROL THE FLOW OF CURSOR ADDRESSING AND / SEQUENCE COMMANDS. CADDRES,CADNORMAL /CURSOR ADDRESSING <^N> ROUTINE ADDRESS SCAPADD,SCAPNORMAL / SEQUENCE ROUTINE ADDRESS / 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 / THE INTERRUPT ROUTINE EXITS HERE. INTRET, .-. /WILL BE CIF CDF RETURN FIELD JMP I CONINT /RETURN TO CALLER / THE CONSOLE TURNOFF ROUTINE EXITS HERE. OFFRET, .-. /WILL BE CIF CDF RETURN FIELD JMP I CONOFF /RETURN TO CALLER / THE LPT: ROUTINE EXITS HERE. LPTRET, .-. /WILL BE CIF CDF RETURN FIELD JMP I OUTLPT /RETURN TO CALLER / THE INPUT ROUTINE RETURNS HERE. INRET, .-. /WILL BE CIF CDF RETURN FIELD JMP I INCON /RETURN TO CALLER / THE OUTPUT ROUTINE RETURNS HERE. OUTRET, .-. /WILL BE CIF CDF RETURN FIELD JMP I OUTCON /RETURN TO CALLER VTIMAGE,.-. /COPY OF NORMAL VTMODE (INVERTED) FOR COMPARISONS 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 VMODE, .-. /AUGMENTATION MODE BITS CURSW, .-. /CURSOR ON SWITCH IOERSW, 0 /I/O ERROR RECOVERY SWITCH ZBLOCK 77-. /EMPTY SPACE ESTATUS,.-. /ERROR STATUS STORED HERE DURING ERROR RECOVERY / THE FOLLOWING ENTRY IS USED FOR ANY HOUSEKEEPING NEEDED BY / THE OVERLAY ROUTINES WHEN THE OVERLAY IS REQUESTED TO SHUT DOWN / BY VARIOUS PROGRAMS SUCH AS "BIN" ETC., WHICH CAN'T FUNCTION DURING / DMA, ETC. CAUSED BY VARIOUS VERSIONS OF THE OVERLAY. CONOFF, .-. /CONSOLE OFF ROUTINE JMP I [OFFCON] /HANDLE IT THERE / THE FOLLOWING IS THE SPECIAL ENTRY POINT FOR THE KEYBOARD MONITOR. IT IS / DELIBERATELY PLACED WITHIN THE "ROM" AREA (WHICH STARTED ONE WORD AGO) / AS A DELIBERATE MEASURE TO CAUSE RELOAD IN CASE THE OVERLAY IS PARTIALLY / CLOBBERED, BUT NOT WITHIN THE "ROM" AREA. SHOULD THE MONITOR INITIALIZATION / FAIL TO COMPLETE, THIS LOCATION WILL BE NON-ZERO, THUS FURTHER ATTEMPTS / TO REBOOT THE SYSTEM WILL RELOAD THE OVERLAY. THIS ENTRY WILL INITIALIZE / THE MONITOR'S CONSOLE ROUTINES TO CALL THE OVERLAY, AND WILL INTERCEPT / ALL SYSTEM READ/WRITE I/O ACCORDING TO THE DICTATES OF THE TRAP BLOCKS. XIOMON, 0 /KEYBOARD MONITOR INITIALIZATION ENTRY POINT JMP I [MONINIT] /GO HANDLE IT THERE / THE FOLLOWING WORD WILL EVENTUALLY CONTAIN THE ID VALUE FOR THE / PARTICULAR READ/WRITE I/O SYSTEM. THIS VALUE IS INCLUDED IN THE CHECKSUM / FOR THE "ROM" AREA AND SHOULD BE SET TO ZERO INITIALLY. DEVWRD, 0 /WILL BE HARDWARE ID NUMBER NOPUNCH /FOOL THE ASSEMBLER / THE FOLLOWING WORD IS PROVIDED TO "KLUDGE" THE CHECKSUM TO A UNIQUE VALUE / TO PREVENT INCORRECT MONITOR/OVERLAY LINKAGE WHEN BOOTING TO A NEW / SYSTEM DEVICE/OVERLAY COMBINATION. THE OVERLAY TYPE*100+HARDWARE ID# / SHOULD BE THE TOTAL CHECKSUM VALUE (INVERTED). FUDWRD, .-. /WILL BE CHANGED AS NECESSARY / OVERLAY ID NAME FIELD. / THE FOLLOWING WORDS WILL BE UPDATED FROM THE BINARY OVERLAY FILES' / SPECIAL ORIGIN SETTINGS IN THEIR HEADERS. OVID, NMCH1 /FIRST PAIR OF DEVICE NAME CHARACTERS NMCH2 /SECOND PAIR OF DEVICE NAME CHARACTERS NMCH3 /THIRD PAIR OF DEVICE NAME CHARACTERS ENPUNCH /UN-FOOL THE ASSEMBLER *. /ESTABLISH CURRENT ORIGIN AGAIN / THE FOLLOWING WORD WILL BE USED TO CALCULATE THE CHECKSUM FOR THE / OVERLAY AND WILL BE ITS FINAL CHECKSUM VALUE. IT SHOULD CONTAIN THE / UNIQUE OVERLAY TYPE NUMBER*100. OVRWRD, OVTYPE^100 /OVERLAY TYPE WORD PAGE / MONITOR INITIALIZATION STARTS HERE. MONINIT,TAD INITSW /GET FIRST TIME SWITCH SZA CLA /SKIP IF NOT FIRST TIME JMS I (TRPINIT) /ELSE RELOAD THE TRAP BLOCKS JMS I [SETFLD] /SET OUR DATA FIELD TAD (ADRLST&177+TRPAGE-1) /SETUP DCA CXR1 /ADDRESS POINTER TAD (ZAPLST&177+TRPAGE-1) /SETUP DCA CXR2 /REPLACEMENT POINTER NL7776 /SETUP THE DCA VMODE /ZAPPING COUNT IOZAPLP,TAD I CXR1 /GET AN ADDRESS TO ZAP SNA /END OF A LIST? JMP IOZAPEND /YES DCA OUTLPT /NO, STASH THE POINTER TAD I CXR2 /GET A REPLACEMENT VALUE DCA OUTCON /STASH IT TAD OUTCON /GET IT BACK TAD (-CIF10) /COMPARE TO MAGIC VALUE SZA CLA /SKIP IF IT MATCHES JMP IOZAPOK /JUMP IF NOT RIF /GET OUR FIELD TAD [CDF] /FORM CDF OUR FIELD IAC /MAKE IT CIF OUR FIELD DCA OUTCON /SAVE AS NEW REPLACEMENT VALUE IOZAPOK,CDF 00 /GO TO FIELD ZERO TAD OUTCON /GET REPLACEMENT VALUE DCA I OUTLPT /ZAP IT IN JMS I [SETFLD] /BACK TO OUR FIELD JMP IOZAPLP /KEEP GOING IOZAPEN,TAD (MONADR-1) /SETUP THE DCA CXR1 /MONITOR ZAP LIST TAD (MONZAP-1) /SETUP THE DCA CXR2 /MONITOR CONTENTS LIST ISZ VMODE /DONE BOTH LISTS? JMP IOZAPLP /NO, GO DO MONITOR ZAPS TAD [CADNORMAL] /SETUP THE DCA CADDRESS /DEFAULT CURSOR ADDRESSING ROUTINE TAD [SCAPNORMAL] /SETUP THE DCA SCAPADDRESS /DEFAULT ADDRESS ISZ INITSW /FIRST TIME? JMP INITNORM /NO, JUST KEEP GOING JMS I [INITEST] /GO PROVE THE CONSOLE HARDWARE EXISTS / CLEAR EVERYTHING UPON OVERLAY RELOAD HERE. JMS I [CLEAR] /DO CLEAR OPERATIONS NOW INITNOR,DCA INITSW /CLEAR THE SWITCH NL0002 /SET 2000 BIT RIF /GET OUR FIELD BITS DCA VTMODE /SAVE FOR NOW TAD VTMODE /GET IT BACK BSW /SET OTHER HALF TAD VTMODE /NOW HAVE BOTH HALVES DCA VTMODE /STORE BACK TAD VTMODE /GET IT AGAIN CIA /INVERT IT DCA VTIMAGE /SAVE FOR TESTS LATER DCA CURSW /ENABLE CURSOR JMS I (INTSET) /ENABLE DEVICE INTERRUPTS DCA XIOMON /RESET "ROM" LOCATION NL7775 /-3 TAD INCHAR /COMPARE TO LATEST INPUT AND [177] /JUST SEVEN BITS SNA CLA /SKIP IF NOT <^C> NL7777 /ELSE SET <^C> INDICATOR CIF CDF 00 /GOING TO FIELD 0 JMP I (OVRCOMMON) /RETURN TO THE MONITOR ONCE-ONLY CODE / CONSOLE OUTPUT ROUTINE. CONOUT, DCA OUTAC /SAVE PASSED VALUE NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD [CDF] /MAKE IT CIF CDF RETURN FIELD JMS I (OUTEXC) /GOTO OUR FIELD DCA OUTRET /STORE FOR EXIT LATER TAD OUTAC /GET IT AGAIN AND [177] /JUST SEVEN-BIT DCA OUTCHR /STASH THE CHARACTER JMP I SCAPADDRESS /GO TO HANDLING ROUTINE / 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 (TRPINIT) /SETUP WASTE COUNTER WASTLUP,TAD [-4] /GET INNER WASTE VALUE DCA VTEMP1 /SETUP COUNTER ISZ VTEMP1 /WASTE JMP .-1 /SOME TIME ISZ I (TRPINIT) /WASTED ENOUGH TIME? JMP WASTLUP /NO, KEEP WASTING AWAY VEXIT, DCA OUTFLAG /CLEAR EVENT FLAG ISZ OUTCON /BUMP TO GOOD RETURN TAD OUTAC /GET ORIGINAL AC VALUE JMP OUTRET /FINISH IT THERE PAGE / CONSOLE INPUT ROUTINES. CONIN, NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD [CDF] /TURN INTO CIF CDF CALLING FIELD DCA INRET /STORE IN-LINE FOR EXIT LATER JMS I [INTEST] /TEST FOR KEYBOARD INPUT ISZ INCON /BUMP RETURN ADDRESS ISZ I (DSTCNT) /ENOUGH TIMES? JMP INDONE /NO, JUST RETURN TAD VTMODE /GET CURRENT OPERATING MODE TAD VTIMAGE /COMPARE TO OUR NORMAL MODE SNA CLA /SKIP IF SOMEONE ELSE IN CONTROL DPCLIOT /ELSE TEST IF FLAG UP (VAGUELY) RECENTLY JMP INDONE /FLAG NOT UP NOW DPCLIOT /WAIT FOR A JMP .-1 /FRESH FLAG TAD [VTBUFFER] /GET DISPLAY ADDRESS DPLAIOT /LOAD IT NL0001 /SET INTERRUPT ENABLE BIT RIF /GET CURRENT FIELD BITS DPGOIOT /START IT UP INDONE, TAD INCHAR /GET THE CHARACTER JMP INRET /FINISH IT THERE / 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 <^ / LOGICAL LPT: HANDLER. / SETTING LPMODE TO 0000 ALLOWS BUFFERING TO A CHARACTER. / SETTING LPMODE TO 0001 DISABLES ALL BUFFERING. / DURING BUFFERING OPERATIONS, LPMODE WILL CHANGE FROM 0000 TO A / NEGATIVE COUNT FOR INITIALIZATION PURPOSES. LPTOUT, DCA LPTAC /SAVE PASSED AC NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD [CDF] /TURN INTO CIF CDF RETURN FIELD DCA LPTRET /STORE FOR EXIT LATER TAD LPTAC /GET PASSED AC VALUE CMA /INVERT FOR TEST SNA CLA /SKIP IF 7777 WAS NOT PASSED JMP LPINIT /JUMP IF 7777 WAS PASSED TAD LPTAC /GET ORIGINAL VALUE AND [177] /JUST SEVEN-BIT DCA LPTCHAR /SAVE THE CHARACTER TO BE OUTPUT TAD LPMODE /GET BUFFERING MODE SZA CLA /SKIP IF BUFFERING CURRENTLY ALLOWED JMP BUFOFF /JUMP IF NOT JMS I (BUFCHK) /CHECK CURRENT BUFFER STATUS JMP BUFULL /BUFFER CURRENTLY FULL JMP BUFACTIVE /BUFFER CURRENTLY PARTIALLY FULL BUFEMPT,TAD LPTCHAR /GET THE CHARACTER JMS I (LPOUT) /TRY TO OUTPUT IT SKP /SKIP IF UNSUCCESSFUL JMP LPEXIT /JUMP IF IT WORKED LPFFTST,TAD LPTCHAR /GET THE CHARACTER TAD (-14) /COMPARE TO SNA CLA /SKIP IF DIFFERENT JMP LPFXIT /ELSE TAKE NON-SKIP RETURN JMS I (LPFILL) /BUFFER THE CHARACTER JMP LPEXIT /TAKE SKIP RETURN BUFACTI,JMS I (LPEMPTY) /GET A CHARACTER FROM BUFFER JMS I (LPOUT) /TRY TO OUTPUT IT JMP LPFFTST /COULDN'T, TRY TO BUFFER LATEST CHARACTER BUFULEN,TAD EMPTR /GET TEMPORARY POINTER DCA EMPTPTR /PERMANENTLY EMPTY THE BUFFER POSITION JMS I (BUFCHK) /CHECK THE BUFFER AGAIN HLT /**** IMPOSSIBLE TO BE FULL WHEN JUST EMPTIED ONE **** JMP BUFACTIVE /BUFFER STILL ACTIVE, TRY AGAIN TO EMPTY IT JMP BUFEMPTY /BUFFER NOW EMPTY, GO DEAL WITH LATEST CHARACTER BUFULL, JMS I (LPEMPTY) /GET A CHARACTER FROM BUFFER JMS I (LPOUT) /TRY TO OUTPUT IT JMP LPFXIT /COULDN'T, FORGET IT JMP BUFULENTRY /DID, SO DOWNGRADE THE BUFFER TO ACTIVE AND KEEP GOING BUFOFF, TAD LPTCHAR /GET LATEST CHARACTER JMS I (LPOUT) /TRY TO OUTPUT IT JMP LPFXIT /FORGET IT TAD LPMODE /GET LATEST MODE SPA /SKIP IF BUFFERING NOT ALLOWED IAC /ELSE TRY TO END TEMPORARY PAUSE DCA LPMODE /STORE BACK JMP LPEXIT /TAKE SKIP RETURN FOR NOW LPINIT, TAD [LPTBUFFER] /SETUP THE DCA FILLPTR /FILL POINTER TAD [LPTBUFFER] /SETUP THE DCA EMPTPTR /EMPTYING POINTER TAD LPMODE /GET BUFFERING MODE SPA SNA CLA /SKIP IF BUFFERING NOT ALLOWED TAD [7600] /ELSE SETUP TEMPORARY PAUSE VALUE IAC /RESET NON-BUFFERING VALUE AT LEAST DCA LPMODE /STORE NEW MODE NL7777 /SET THE DCA LPTFLAG /OUTPUT FLAG NL7777 /GET A JMS I (LPOUT) /TRY TO OUTPUT IT SKP /SKIP IF UNSUCCESSFUL LPEXIT, ISZ OUTLPT /BUMP TO SKIP RETURN LPFXIT, TAD LPTAC /RESTORE ORIGINAL AC JMP LPTRET /FINISH IT THERE PAGE / INTERRUPT HANDLER. INTCON, DPCLIOT /VIDEO RETRACE FLAG UP? JMP KEYINT /NO, TRY VT-8/E KEYBOARD TAD VTMODE /YES, GET CURRENT MODE BSW /FLIP IT DCA VTMODE /STORE BACK TAD VTMODE /GET IT AGAIN AND (70) /JUST FIELD BITS DCA KEYTMP /STORE FOR NOW NL0001 /SET MODE MASK AND VTMODE /GET THE MODE BIT STL RAL /MOVE UP AND SET INTERRUPT ENABLE TAD KEYTMP /ADD ON FIELD BITS DPGOIOT /START IT UP 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 TAD (20) /SET EXTRA FLAG BIT KEYINT, DCA INTFLGS /STORE BACK NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD [CDF] /TURN INTO CIF CDF CALLING FIELD DCA INTRET /STORE IN-LINE FOR EXIT LATER DKSFIOT /KEYBOARD FLAG UP? JMP LPRINT /NO, TRY LPT: TAD INFLAG /GET CURRENT FLAG SZA CLA /SKIP IF CLEAR TAD (4400) /ELSE SET ERROR, OVERRUN ERROR BITS DCA INFLAG /STORE FOR NOW DKRBIOT /GET THE CHARACTER, CLEARING THE FLAG DCA KEYTMP /SAVE IT TAD INFLAG /GET THE FLAG CMA /INVERT IT AND KEYTMP /AND OFF NON-CONFLICTING BITS TAD INFLAG /OR IN THE FLAG SNA /SKIP IF SOMETHING SET TAD (5000) /ELSE SET ERROR, FRAMING ERROR BITS DCA INFLAG /STORE FINAL CHARACTER FLAG VALUE ISZ INTFLGS /SET KEYBOARD INTERRUPT FLAG BIT LPRINT, IFZERO ONEWAY < LISFIOT /LPT: INPUT FLAG UP? JMP OUTINT /NO, GO SET OUTPUT FLAG LIRBIOT /YES, READ IT IN SNA /SKIP IF SOMETHING THERE TAD (5000) /ELSE SET ERROR, FRAMING ERROR BITS DCA LINFLAG /STORE THE INPUT FLAG NL0004 /SET LPT: INPUT INTERRUPT BIT TAD INTFLGS /GET INTERRUPT FLAGS DCA INTFLGS /STORE BACK > OUTINT, NL7777 /SET THE DCA OUTFLAG /EVENT FLAG ISZ INTFLGS /SET ON THE ISZ INTFLGS /OUTPUT INTERRUPT BIT LPTINT, LSFIOT /LPT: FLAG UP? JMP VTLINT /NO, TRY DORMANT LPT: FLAG LCFIOT /CLEAR THE FLAG NL7777 /SET THE DCA LPTFLAG /EVENT FLAG TAD INTFLGS /GET INTERRUPT FLAGS TAD (10) /SET LPT: INTERRUPT BIT DCA INTFLGS /STORE BACK VTLINT, IFNZRO VT8LPT < PRSFIOT /DORMANT LPT: FLAG UP? JMP INTXIT /NO, FORGET IT PRCFIOT /YES, CLEAR THE FLAG TAD INTFLGS /GET INTERRUPT FLAGS TAD [40] /SET EXTRA FLAG BIT DCA INTFLGS /STORE BACK > INTXIT, TAD INTFLGS /GET INTERRUPT FLAGS JMP INTRET /FINISH IT THERE / CONSOLE TURNOFF ROUTINE. OFFCON, IOF /PREVENT PROBLEMS DPSMIOT /STOP THE DISPLAY NL0002 /SET CIF BIT RDF /GET CALLING FIELD TAD [CDF] /TURN INTO CIF CDF CALLING FIELD DCA OFFRET /STORE IN-LINE JMP OFFRET /FINISH IT THERE / KEYBOARD MONITOR REPLACEMENT ADDRESSES. MONADR, P7TSF /WAS TSFIOT P7JMP /WAS JMP I P7OUT P7TLS /WAS TLSIOT CCHECK+2 /WAS KSFIOT CCHECK+3 /WAS JMP I CCHECK CCHECK+4 /WAS KRBIOT 0 /THIS ENDS THE LIST / KEYBOARD MONITOR REPLACEMENT VALUES. MONZAP, CIF 10 /WILL BECOME CIF OUR FIELD JMS OUTCON /CALL OUTPUT ROUTINE P7OUT&177+JMPIC /JMP I P7OUT CIF 10 /WILL BECOME CIF OUR FIELD JMS INCON /CALL INPUT ROUTINE CCHECK&177+JMPIC /JMP I CCHECK / ERROR BLURBS. REDBLB, "R+BOLD /READ BLURB "E+NORMAL "A+NORMAL "D+NORMAL WRIBLB, "W+BOLD /WRITE BLURB "R+NORMAL "I+NORMAL "T+NORMAL FRMBLB, "F+NORMAL /FROM BLURB "R+NORMAL "O+NORMAL "M+NORMAL TOBLB, "I+NORMAL /TO BLURB "N+NORMAL "T+NORMAL "O+NORMAL PAGE / INTERRUPT DEVICE LIST. / FLAG SKIP INSTRUCTIONS FOR ALL DEVICES HANDLED BY THE OVERLAY. / POSITIONAL DESCRIPTION. / ENTRY 0: KEYBOARD SKIP / ENTRY 1: CONSOLE OUTPUT SKIP / ENTRY 2: LPT: INPUT SKIP / ENTRY 3: LPT: OUTPUT SKIP / ENTRY 4-N: EXTRA DEVICE SKIPS (VT-8/E, ETC.) / 0000 END OF LIST / ENTRIES 0-3 MUST BE PRESENT; 7777 MEANS DEVICE DOES NOT INTERRUPT FOR / THIS FUNCTION. ENTRIES 4-N ARE OPTIONAL. INTDEV, DKSFIOT /KEYBOARD SKIP 7777 /NO OUTPUT SKIP -ONEWAY!LISFIOT /LPT: INPUT SKIP LSFIOT /LPT: OUTPUT SKIP DPCLIOT /VIDEO RETRACE SKIP IFNZRO VT8LPT < PRSFIOT /DORMANT LPT: SKIP > 0000 /THIS ENDS THE LIST / 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 / 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 / I/O TRAPS COME HERE BEFORE GOING TO TRAP BLOCKS. OURTRAP,CLA /CLEAN UP TAD IOERSW /RECOVERY IN PROGRESS? SNA CLA /SKIP IF SO JMP I (TRAPIO&177+TRPAGE) /JUMP IF NOT TAD (-30) /SETUP THE DCA IOERSW /TIME-OUT COUNTER ISZ CALADR /WASTE JMP .-1 /SOME TIME ISZ IOERSW /WASTED ENOUGH TIME? JMP .-3 /NO, KEEP GOING DPCLIOT /FLAG BETTER BE UP JMP .-1 /ELSE WAIT FOR IT DPCLIOT /WAIT FOR A JMP .-1 /FRESH FLAG TAD [VTBUFFER] /YES, POINT TO DISPLAY BUFFER DPLAIOT /RELOAD DISPLAY ADDRESS NL0001 /SET INTERRUPT ENABLE BIT RIF /GET OUR FIELD DPGOIOT /START UP THE DISPLAY JMP I (TRAPIO&177+TRPAGE) /CONTINUE IN NORMAL TRAP CODE PAGE ENDROM= . /END OF "ROM" AREA OCTMOVE,.-. /FOUR DIGIT MOVE ROUTINE DCA BLBCHAR /SAVE PASSED VALUE TAD [-4] /SETUP THE DCA I MOVBLB /MOVE COUNT TAD I OCTMOVE /GET THE MESSAGE ADDRESS DCA CXR1 /SET IT UP ISZ OCTMOVE /BUMP PAST ARGUMENT OCTLUP, TAD BLBCHAR /GET THE VALUE CLL RTL;RAL /MOVE UP DCA BLBCHAR /STORE BACK TAD BLBCHAR /GET IT AGAIN RAL /MOVE UP AND [7] /JUST LATEST DIGIT TAD ["0+BOLD] /MAKE IT ASCII DCA I CXR1 /STORE IN MESSAGE ISZ I MOVBLB /DONE YET? JMP OCTLUP /NO, KEEP GOING JMP I OCTMOVE /YES, RETURN BLBCHAR,.-. /BLURB CHARACTER FILLING ROUTINE AND [77] /JUST SIX-BIT SNA /? TAD [" &77] /MAKE IT A TAD [40] /INVERT QUADRANT BIT AND [77] /REMOVE EXCESS TAD [40] /INVERT AGAIN DCA OCTMOVE /SAVE IT FOR NOW TAD OCTMOVE /GET IT BACK TAD [-" !200] /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMP BLBCHOK /JUMP IF NOT TAD CXR2 /GET FLAG SNA CLA /SKIP IF NON- SEEN TAD [12-40-BOLD-200] /ELSE MAKE IT SKP /DON'T CHANGE FLAG BLBCHOK,ISZ CXR2 /BUMP FLAG TAD OCTMOVE /GET THE CHARACTER TAD [BOLD+200] /MAKE IT BOLD DCA I CXR1 /STORE IN MESSAGE JMP I BLBCHAR /RETURN / MAIN ERROR MESSAGE. BLURB, "J&37 / "J&37 / " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE " +BOLD /ERROR GOES HERE ERRBLB, " +BOLD /ERROR BLURB STARTS HERE "E+BLINK "R+BLINK "R+BLINK "O+BLINK "R+BLINK " +BOLD "W+NORMAL "H+NORMAL "I+NORMAL "L+NORMAL "E+NORMAL " +BOLD FUNBLB, ZBLOCK 4 /WILL BE "READ" OR "WRIT" "I+NORMAL "N+NORMAL "G+NORMAL " +BOLD "S+BOLD "Y+BOLD "S+BOLD UNTBLB, .-. /UNIT DIGIT WILL GO HERE ":+NORMAL BLKBLB, ZBLOCK 4 /BLOCK NUMBER WILL GO HERE " +BOLD FTBLB, ZBLOCK 4 /"FROM" OR "INTO" WILL GO HERE " +BOLD FLDBLB, .-. /FIELD DIGIT WILL GO HERE ADDBLB, ZBLOCK 4 /TRANSFER ADDRESS DIGITS WILL GO HERE "J&37 / "J&37 / "S+BOLD "T+NORMAL "A+NORMAL "T+NORMAL "U+NORMAL "S+NORMAL ":+NORMAL " +BOLD STATBLB,ZBLOCK 4 /STATUS DIGITS WILL GO HERE BLBSTP, EOS /WILL BE TO EXPAND MESSAGE " +BOLD " +BOLD " +BOLD " +BOLD "*+CURSOR "R+BLINK "E+BLINK "T+BLINK "R+BLINK "Y+BLINK "I+BLINK "N+BLINK "G+BLINK "*+CURSOR EOS DSTCNT, .-. /DISPLAY TEST COUNTER / LPT: SUPPORT ROUTINES. LPOUT, .-. /LPT: OUTPUT ROUTINE DCA BUFCHK /SAVE PASSED VALUE TAD BUFCHK /GET IT BACK TAD (-177) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (37) /ADD ON RANGE SZL CLA /SKIP IF OUT OF RANGE TAD LCMODE /ELSE ADD ON FOLD VALUE TAD BUFCHK /GET ORIGINAL EITHER WAY DCA BUFCHK /STORE BACK TAD LSTATUS /GET CURRENT STATUS SMA CLA /SKIP IF IN <^S>/<^Q> WAIT JMP LOUTRY /JUMP IF NOT JMS LINPUT /TRY TO CHANGE STATUS SPA SNA CLA /SKIP IF <^Q> RECEIVED JMP I LPOUT /ELSE TAKE FAILURE RETURN LOUTRY,.-. /WILL BE CIF CDF OUR FIELD TAD LPTFLAG /GET OUTPUT FLAG LSFIOT /FLAG UP NOW? SKP /SKIP IF NOT NL7777 /ELSE SET FLAG VALUE SNA /SKIP IF EITHER FLAG IS OR WAS SET JMP LPSTRD /JUMP IF NEITHER AND BUFCHK /GET THE CHARACTER LLSIOT /OUTPUT IT NOW CLA /CLEAN UP DCA LPTFLAG /CLEAR EVENT FLAG ISZ LPOUT /BUMP TO SKIP RETURN LPSTRD, JMS LINPUT /GET NEW INPUT STATUS DCA LSTATUS /STORE IT JMP I LPOUT /RETURN BUFCHK, .-. /BUFFER STATUS ROUTINE NL0001 /SETUP INCREMENT TAD FILLPTR /GET FILL POINTER+1 CIA /INVERT FOR TESTING TAD EMPTPTR /COMPARE TO EMPTYING POINTER AND (BUFSIZE-1) /JUST RELATIVE BITS SNA /SKIP IF BUFFER IS NOT FULL JMP I BUFCHK /TAKE FIRST RETURN ISZ BUFCHK /BUMP TO SKIP RETURN IAC /CHECK IF EMPTY AND (BUFSIZE-1) /JUST RELATIVE BITS SNA CLA /SKIP IF PARTIALLY USED ISZ BUFCHK /ELSE TAKE DOUBLE-SKIP EMPTY RETURN JMP I BUFCHK /RETURN EITHER WAY LPFILL, .-. /BUFFER FILL ROUTINE NL0001 /SET INCREMENT TAD FILLPTR /GET THE POINTER AND (BUFSIZE-1) /JUST RELATIVE BITS TAD [LPTBUFFER] /ADD ON BUFFER BASE DCA FILLPTR /STORE UPDATED POINTER LPFCDF, .-. /WILL BE CDF OUR FIELD TAD LPTCHAR /GET THE CHARACTER DCA I FILLPTR /STORE IN THE BUFFER JMP I LPFILL /RETURN LPEMPTY,.-. /BUFFER EMPTY ROUTINE NL0001 /SET INCREMENT TAD EMPTPTR /GET THE POINTER AND (BUFSIZE-1) /JUST RELATIVE BITS TAD [LPTBUFFER] /ADD ON BUFFER BASE DCA EMPTR /STORE IN TEMPORARY POINTER LPECDF, .-. /WILL BE CDF OUR FIELD TAD I EMPTR /GET THE CHARACTER JMP I LPEMPTY /RETURN LINPUT, .-. /LPT: INPUT ROUTINE LPCIDF, .-. /WILL BE CIF CDF OUR FIELD TAD LINFLAG /GET INPUT FLAG SNA /SKIP IF SET JMP LINETST /JUMP IF NOT DCA LINCHAR /STORE FOR NOW DCA LINFLAG /CLEAR THE EVENT FLAG TAD LINCHAR /GET THE CHARACTER JMP GOTLINPUT /CONTINUE THERE LINETST,.-. /WILL BE CIF CDF OUR FIELD ONEWAY-1&LISFIOT /FLAG UP NOW? JMP I LINPUT /NO, JUST RETURN LIRBIOT /YES, GET THE CHARACTER GOTLINP,AND [177] /JUST SEVEN-BIT TAD (-"S!300) /IS IT <^S>? SNA /SKIP IF NOT JMP LPSETS /JUMP IF SO TAD (-"Q+"S) /IS IT <^Q>? SZA CLA /SKIP IF SO JMP I LINPUT /RETURN WITH CLEAR AC IF NOT NL2000 /SET <^Q> VALUE SKP /NOT <^S> VALUE LPSETS, NL4000 /SET <^S> VAUE JMP I LINPUT /RETURN / INTERRUPT SETUP ROUTINE. INTSET, .-. /INTERRUPT SETUP NL7777 /SET ALL BITS DKIEIOT /ENABLE INTERRUPTS ON KEYBOARD, LPT: NOP /JUST IN CASE CLA /CLEAN UP DPCLIOT /WAIT UNTIL JMP .-1 /FLAG IS UP DPCLIOT /WAIT FOR A JMP .-1 /FRESH FLAG TAD [VTBUFFER] /POINT AT DISPLAY BUFFER DPLAIOT /LOAD DISPLAY ADDRESS NL0001 /SET INTERRUPT BIT RIF /OR IN FIELD BITS DPGOIOT /START IT UP NL7777 /SET ALL BITS ONEWAY-1&LIEIOT /ENABLE INTERRUPTS, ERRORS ON KL-8JA NOP /JUST IN CASE NL7777 /SET ALL BITS LLEIOT /ENABLE INTERRUPTS ON INDEPENDENT INTERFACE NOP /JUST IN CASE IFNZRO VT8LPT < NL7777 /SET ALL BITS PRIEIOT /ENABLE DORMANT LPT: INTERRUPTS JUST IN CASE NOP /JUST IN CASE > CLA /CLEAN UP JMP I INTSET /RETURN / THE OUTPUT ROUTINE COMES HERE TO SET THE CURRENT DATA FIELD. OUTEXC, .-. /OUTPUT DATA FIELD SET ROUTINE OUTCDF, .-. /WILL BE CDF OUR FIELD JMP I OUTEXC /RETURN PAGE / ERROR BLURB HANDLING ROUTINES. BLBFILL,.-. /FORMAT ERROR BLURB ROUTINE CLA /CLEAN UP TAD CALFLD /GET CDF CALLING FIELD DCA EBLOCK /STORE IN-LINE EBLOCK, .-. /WILL BE CDF CALLING FIELD TAD CALADR /GET CALLING ADDRESS DCA EBLOCK /STASH IT TAD I EBLOCK /GET TRANSFER ADDRESS DCA EADDR /STASH IT ISZ EBLOCK /BUMP TO FUNCTION WORD TAD I EBLOCK /GET FUNCTION WORD DCA EFUN /STASH IT ISZ EBLOCK /BUMP TO BLOCK NUMBER TAD I EBLOCK /GET BLOCK NUMBER DCA EBLOCK /STASH IT JMS I [SETFLD] /SET OUR FIELD TAD EFUN /GET FUNCTION WORD SPA CLA /SKIP IF READING JMP EWRITE /JUMP IF WRITING JMS I (MOV4) /MOVE IN REDBLB-1 /THE READ FUNBLB-1 /BLURB JMS I (MOV4) /MOVE IN TOBLB-1 /THE "TO" FTBLB-1 /BLURB JMP ECOMMON /CONTINUE THERE EWRITE, JMS I (MOV4) /MOVE IN WRIBLB-1 /THE WRITE FUNBLB-1 /BLURB JMS I (MOV4) /MOVE IN FRMBLB-1 /THE "FROM" FTBLB-1 /BLURB ECOMMON,TAD EFUN /GET THE FUNCTION WORD AND [7] /JUST UNIT BITS TAD ["0+BOLD] /MAKE IT ASCII DCA I (UNTBLB) /STORE IN MESSAGE TAD EFUN /GET FUNCTION WORD AGAIN RTR;RAR /MOVE OVER AND [7] /ISOLATE FIELD BITS TAD ["0+BOLD] /MAKE IT ASCII DCA I (FLDBLB) /STORE IN MESSAGE TAD EBLOCK /GET BLOCK NUMBER JMS I (OCTMOVE) /PRINT IT BLKBLB-1 /IN MESSAGE TAD EADDR /GET TRANSFER ADDRESS JMS I (OCTMOVE) /PRINT IT ADDBLB-1 /IN MESSAGE TAD ESTATUS /GET ERROR STATUS JMS I (OCTMOVE) /PRINT IT STATBLB-1 /IN MESSAGE JMP I BLBFILL /RETURN BLBMOVE,.-. /BLURB MOVE ROUTINE DCA EFUN /SAVE BLURB ADDRESS IOF /PREVENT PROBLEMS! JMS I [SETFLD] /SETUP OUR FIELD TAD I BLBMOVE /GET MOVE LENGTH DCA EADDR /SAVE IT ISZ BLBMOVE /BUMP PAST ARGUMENT TAD EADDR /GET THE LENGTH CLL RAL /*2 TAD (ERRBLB-1-1) /POINT TO BEGINNING OF BLURB REGION DCA CXR1 /STASH THE POINTER DCA CXR2 /CLEAR FLAG JMS I (BLBCHAR) /OUTPUT INITIAL BLMVLUP,TAD I EFUN /GET A PAIR BSW /LEFT ONE FIRST JMS I (BLBCHAR) /PUT IT IN MESSAGE TAD I EFUN /GET PAIR AGAIN JMS I (BLBCHAR) /PUT IT IN MESSAGE ISZ EFUN /BUMP TO NEXT PAIR ISZ EADDR /DONE ALL PAIRS YET? JMP BLMVLUP /NO, KEEP GOING JMP I BLBMOVE /YES, RETURN BLBDISP,.-. /BLURB DISPLAY AND REPLY ROUTINE CLA /CLEAN UP TAD INCHAR /GET FORMER INPUT CHARACTER DCA EADDR /SAVE IT JMS I [SETFLD] /SETUP OUR FIELD TAD (EOS) /GET CHARACTER DCA I (BLBSTP) /SHORTEN BLURB FOR NOW DPCLIOT /WAIT FOR JMP .-1 /FLAG TO COME UP DPCLIOT /WAIT FOR A JMP .-1 /FRESH FLAG TAD (BLURB) /POINT AT BLURB DPLAIOT /LOAD ADDRESS RIF /GET OUR FIELD IAC /ADD INTERRUPT ENABLE BIT DPGOIOT /START IT UP JMS I [INTEST] /GET A CHARACTER SKP /SKIP IF WE GOT ONE JMP .-2 /ELSE WAIT FOR ONE TAD INCHAR /GET THE CHARACTER AND [177] /JUST SEVEN-BIT DCA EFUN /SAVE IT NL7775 /-3 TAD EFUN /COMPARE TO LATEST SMA SZA /SKIP IF <^C> OR LESS JMP NOTUPC /JUMP IF <^D> OR GREATER SMA CLA /SKIP IF LESS THAN <^C> JMP GOTUPC /JUMP IF <^C> TAD EADDR /GET PREVIOUS CHARACTER DCA INCHAR /RESTORE IT GOTUPC, DPSMIOT /STOP THE DISPLAY CIF CDF 00 /GOING TO FIELD 0 JMP I [SBOOT] /GOODBYE! NOTUPC, CLA /CLEAN UP TAD EADDR /GET PREVIOUS CHARACTER DCA INCHAR /RESTORE IT TAD (" +BOLD) /GET A DCA I (BLBSTP) /RESTORE EXTENDED BLURB ISZ IOERSW /INDICATE RECOVERY IN PROGRESS CDF 00 /SOME I/O ROUTINES MIGHT WANT THIS JMP I BLBDISPLAY /RETURN EADDR, .-. /ADDRESS TEMPORARY EFUN, .-. /FUNCTION TEMPORARY PAGE NOPUNCH /FOOL THE ASSEMBLER IFNZRO 2200-. VTBUFFE=. /VT-8/E DISPLAY BUFFER ZBLOCK 2600-. /END OF REGION AVAILABLE FOR CHECKSUM CALCULATION ZBLOCK VTBUFFER+2400-. /GET TO END OF VT-8/E BUFFER VTBFEND=. /END OF VT-8/E BUFFER HERE ENPUNCH /UN-FOOL THE ASSEMBLER *. /RESET OUTPUT ORIGIN / SUPPORT ROUTINES. TRPINIT,.-. /TRAP BLOCK INITIAL READIN ROUTINE TAD I (SBTFUN) /GET MONITOR'S UNIT AND [7] /JUST UNIT BITS TAD [2^100] /ADD ON READ BITS RIF /ADD ON FIELD BITS DCA TRDFUN /STORE IN-LINE JMS I [SETFLD] /SETUP OUR FIELD CIF 00 /GOTO MONITOR FIELD JMS I PSYSIO/(SYSIO) /CALL I/O ROUTINES TRP, TRPAGE /TRANSFER ADDRESS TRDFUN, 2^100+.-.+.-. /FIELD, UNIT BITS WILL BE FILLED IN TRPBLK /TRAP BLOCK NUMBER TAD I TRP/(HIDWRD&7600+TRPAGE)/GET ID NUMBER DCA DEVWRD /STORE IT JMP I TRPINIT /RETURN / INPUT FLAG TEST ROUTINE. INTEST, .-. /INPUT TEST ROUTINE INCIDF, .-. /WILL BE CIF CDF OUR FIELD TAD INFLAG /GET INPUT FLAG SNA /SKIP IF SET JMP INTST2 /JUMP IF NOT DCA INCHAR /SAVE IN INPUT BUFFER DCA INFLAG /CLEAR EVENT FLAG JMP I INTEST /RETURN TO INPUT ROUTINE INTST2, .-. /WILL BE CIF CDF OUR FIELD DKSFIOT /FLAG UP? JMP NOINPUT /NO, TAKE SKIP RETURN DKRBIOT /YES, GET THE CHARACTER AND CLEAR HARDWARE FLAG SKP /DON'T BUMP RETURN NOINPUT,ISZ INTEST /BUMP RETURN FOR NO INPUT DCA INCHAR /STORE LATEST (OR ZERO) IN INPUT BUFFER JMP I INTEST /RETURN TO INPUT ROUTINE SETFLD, .-. /DATA FIELD SETUP ROUTINE CLA /CLEAN UP RIF /GET OUR FIELD TAD [CDF] /TURN INTO CDF INSTRUCTION DCA SETCDF /STORE IN-LINE SETCDF, .-. /WILL BE CDF OUR FIELD JMP I SETFLD /RETURN / RELOAD CLEAR ROUTINE. CLEAR, .-. /CLEAR ROUTINE TAD [VTBUFFER] /SETUP DCA VTPTR /BUFFER POINTER TAD [VTBUFFER] /SETUP DCA VTLNPTR /LINE POINTER TAD [VTBUFFER-VTBFEND] /SETUP THE DCA TRPINIT /CLEAR COUNT TAD (VTBUFFER-1) /SETUP THE DCA CXR1 /CLEAR POINTER TAD [" &177+4000] /GET CLEAR CHARACTER DCA I CXR1 /CLEAR A WORD ISZ TRPINIT /DONE ALL YET? JMP .-3 /NO, GO BACK JMP I CLEAR /RETURN MOV4, .-. /MOVE FOUR CHARACTERS ROUTINE TAD [-4] /SETUP THE DCA CLEAR /MOVE COUNT TAD I MOV4 /GET THE "FROM" LOCATION DCA CXR1 /SET IT UP ISZ MOV4 /BUMP TO NEXT TAD I MOV4 /GET THE "TO" LOCATION DCA CXR2 /SET IT UP ISZ MOV4 /BUMP PAST ARGUMENT TAD I CXR1 /GET A WORD DCA I CXR2 /PUT A WORD ISZ CLEAR /DONE YET? JMP .-3 /NO, KEEP GOING JMP I MOV4 /YES, RETURN PRTCHR, .-. /INSERT PRINTABLE CHARACTER ROUTINE JMS INSERT /INSERT IT AT FIRST TAD VTPTR /GET THE NEW POINTER VALUE AND [77] /JUST LINE BITS PSYSIO, 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 MOV4 /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 MOV4 /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 PAGE LPTBUFF=. /LPT: BUFFER STARTS HERE NOPUNCH /FOOL THE ASSEMBLER *LPTBUFF+BUFSIZE /GET TO END OF LPT: BUFFER TRPAGE, ZBLOCK 200 /FIRST TRAP BLOCK PAGE TRPAG2, ZBLOCK 200 /SECOND TRAP BLOCK PAGE ENPUNCH /UN-FOOL THE ASSEMBLER *LPTBUFF /ESTABLIST CURRENT ORIGIN / ONCE-ONLY TEST FOR EXISTENCE CODE. THIS CAN BE LOCATED WITHIN A BUFFER / ETC., SINCE IT IS ONLY USED WHEN THE OVERLAY IS RELOADED. INITEST,.-. /EXISTENCE TEST ROUTINE NL7775 /SETUP THE DCA INCON /TIME-OUT COUNTER JMS I [SETFLD] /SETUP OUR DATA FIELD NL0002 /SETUP CIF BIT TAD I (SETCDF) /FORM CIF CDF OUR FIELD DCA I (INCIDF) /STORE IN-LINE TAD I (INCIDF) /GET IT BACK DCA I (INTST2) /STORE IN-LINE TAD I (INCIDF) /GET IT BACK DCA I (LPCIDF) /STORE IN-LINE TAD I (INCIDF) /GET IT BACK DCA I (LOUTRY) /STORE IN-LINE TAD I (INCIDF) /GET IT BACK DCA I (LINETST) /STORE IN-LINE TAD I (SETCDF) /GET CDF OUR FIELD DCA I (LPECDF) /STORE IN-LINE TAD I (SETCDF) /GET CDF OUR FIELD DCA I (LPFCDF) /STORE IN-LINE TAD I (SETCDF) /GET CDF OUR FIELD DCA I (OUTCDF) /STORE IN-LINE TIMTST, DPCLIOT /VIDEO FLAG UP? JMP TIMOUT /NO, GO TEST IT CLA CLL /YES, CLEAN UP JMP I INITEST /RETURN TIMOUT, ISZ OUTLPT /WASTE JMP TIMTST /SOME TIME ISZ INCON /WAITED TOO LONG? JMP TIMTST /NO, TRY AGAIN / SINCE THE VT-8/E HARDWARE IS NOT AVAILABLE, WE RESTORE THE ORIGINAL / KEYBOARD MONITOR AND LET IT FEND FOR ITSELF. NL7776 /SETUP THE DCA INCON /ZAP COUNT TAD (ADRLST&177+TRPAGE-1) /POINT AT DCA CXR1 /ADDRESS LIST TAD (CNTLST&177+TRPAGE-1) /POINT AT DCA CXR2 /NORMAL CONTENTS LIST PTBKLP, TAD I CXR1 /GET AN ADDRESS SNA /END OF LIST? JMP PTBKDONE /YES DCA OUTCON /NO, STASH IT TAD I CXR2 /GET A VALUE CDF 00 /GOTO MONITOR'S FIELD DCA I OUTCON /ZAP IT BACK JMS I [SETFLD] /BACK TO OUR FIELD JMP PTBKLP /KEEP GOING PTBKDON,TAD (MONADR-1) /POINT AT MONITOR'S DCA CXR1 /ADDRESS LIST TAD (MONCON-1) /POINT AT MONITOR'S DCA CXR2 /CONTENTS LIST ISZ INCON /DONE WITH BOTH YET? JMP PTBKLP /NO, KEEP GOING / NOW DETERMINE HOW WE SHOULD READ THE MONITOR'S KEYBOARD FOR <^S>/<^Q> / ETC. PURPOSES. CDF 00 /GOTO MONITOR'S FIELD TAD I (SBOOT) /GET THE BOOTSTRAP INSTRUCTION TAD (-SYSINST) /COMPARE TO POSSIBLE VALUE SZA CLA /SKIP IF IT MATCHES JMP EROK /JUMP IF OTHER ISZ CTZAP1 /CHANGE "MONKRS" ISZ CTZAP1 /TO "MONKRB" DCA CTZAP2 /ELIMINATE "MONKCC" EROK, JMS I [SETFLD] /RESTORE OUR FIELD MONTLS /SET THE OUTPUT FLAG NOW TAD (ERBLURB-1) /POINT TO DCA CXR1 /ERROR MESSAGE ERBLUP, TAD I CXR1 /GET A CHARACTER DCA CXR2 /SAVE IT PAGN, JMS CTLCTST /CHECK FOR INPUT TAD (-"S!300) /IS IT <^S>? SZA CLA /SKIP IF SO JMP PTRY /JUMP IF NOT JMS CTLCTST /CHECK AGAIN TAD (-"Q!300) /IS IT <^Q>? SZA CLA /SKIP IF SO JMP .-3 /ELSE WAIT FOR IT PTRY, TAD CXR2 /GET THE CHARACTER MONTSF /FLAG UP? JMP PAGN /NO, TRY INPUT WHILE WAITING MONTLS /YES, SEND IT NOW SMA CLA /END OF LIST? JMP ERBLUP /NO, KEEP GOING CIF CDF 00 /GOING TO FIELD 0 NL7775 /SETUP MASK AND I (SCRSIZE) /GET OTHER BITS DCA I (SCRSIZE) /STORE CORE WORD WITHOUT "C" BIT JMP I (TTYTST) /CONTINUE THERE CTLCTST,.-. /CONTROL CHARACTER INPUT ROUTINE CLA /CLEAN UP MONKSF /FLAG UP? JMP I CTLCTST /NO, FORGET IT CTZAP1, MONKRS/OR MONKRB /GET THE CHARACTER AND [177] /JUST SEVEN-BIT DCA INCHAR /SAVE IT CTZAP2, MONKCC/OR 0000 /CLEAR THE FLAG TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN / MONITOR LOCATIONS' NORMAL CONTENTS LIST. MONCON, MONTSF /FOR P7TSF P7OUT&177+JMPIC /FOR P7JMP MONTLS /FOR P7TLS MONKSF /FOR CCHECK+2 CCHECK&177+JMPIC /FOR CCHECK+3 MONKRB /FOR CCHECK+4 PAGE / ERROR BLURB. ERBLURB,"G&37 / "G&37 / "G&37 / "G&37 / "M&37 / "J&37 / "J&37 / "G&37 / "G&37 / "G&37 / "M&37 / "J&37 / "J&37!4000 / WHICH ENDS THE LIST FIELD 0 /HERE COME THE LITERALS! $ /THAT'S ALL FOLK!