/55 OS/8 SUPPORT TASK FOR RTS-8 V3 / /EDIT HISTORY: /CHANGES SINCE SHAWN'S EDIT: / (SR) ADDED LINCTAPE AND FLOPPY SUPPORT / SET BIT 2 OF LOC 07777 IN OS/8 / (RL) FIXED MEMORY FIELD ALLOCATION BUG CAUSING CRASH / WHEN RTS8 IS EXITED AFTER RUNNING WITH OS8SUP USING / ALL BUT 4K OF A 16K OR LARGER MACHINE. / (RL) ADDED KL8A SUPPORT, FIXED LPT BUG, / MADE OSFILL OPTIONAL / (SR) CHANGED KL8A SUPPORT / SET BIT 2 IN FAKE FIELD ONLY / RUN DDCMP WHEN THROUGH WITH INITIALIZATION / NO LONGER USE OS/8 / SYSTEM HANDLER DURING INITIALIZATION / #10 V2B CONVERSION TO MACREL / #11 FIX V2B BUGS INTERLOCK; DOUBLE KRB / #12 XLSF BUG; FURTHER FIXES ON #11 / #13 MERGE IN KT8A SUPPORT / #14 FURTHER KT8A WORK / #15 REMOVE .EX, .GL !!, AVOID / , BUG / #16 PUT IN CODE TO WIRE OS8 FIELDS;PUT IN OMNI / #17 PUT IN BF CONDITIONALS / #18 FIX VARIOUS FIELD REFERENCES / #19 BF NEEDS ANOTHER FLAG / #20 START ON KM SWITCH TEST, ^R REBOOT / #21 CONTINUATION OF #20 / #22 CONTINUATION OF #20 / #23 MORE OF #20 / #24 CHANGE B/F CONDITIONAL TO BKTCDV / #25 OFF BY ONE PROBLEM IN XTLSUB / #26 REBOOT BUG, CHANGE TO CONTROL Y / #27 FIX OS8 CIF,TCF HERE! / #28 DCA .+1 ERROR / #29 MISSING ISZ, FIX CORE CONTROL WORD / #30 PROBABLE ISZ SKIP BUG / #31 REMOVE PAGE STATEMENT FROM END OF .DSECT OSD / #32 RIPPLES FROM NAMING CHANGE / #33 ALL MAPPING LINEAR; READ HEADS FROM DISK / #34 FIXES FOR 33 / #35 DON'T MOVE BATCH WORDS BACK TO 0 OR 1 / #36 ELIMINATE .FSECT LITERALS / #38 LITERALS BACK IN, PAGE FIX FOR KT8A, LEVEL=0 / #39 NON-KT8A, FORCE MAPPING TO WRAP ON TOO BIG / $40 STILL SOME LITERALS! / #41 GLITCH IN #40, STRIP OUT EDF, CUR / #42 PUT IN DATE TRANSFER FROM RTS8 / #43 JR 27-SEP-78 ALLOW 5 BIT UNIT NUMBERS AND INSERT RL01 IN HTBL / #44 SPLIT OUT OS8F / #45 GETTING REBOOT FIELD 1 FROM WRONG BLOCK / #46 FIX DATE TRANSFER, CHANGE INTERLOCK / #47 10 NULLS, RF-DF, INDIRECT FIELDS / #48 FIX 47 / #49 MODIFY MAPPING / #50 REMOVE DOUBLE BATCH PROBLEM / #51 FIX STRADDLE 2-3 / #52 KL8A FIX / #53 PAGE OVERFLOW FIX / #54 SECOND FLOPPY NAME FIX / #55 LPT INIT VERS=55. / / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977,1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / .GLOBAL HNDTAB /MAKE TABLE GENERALLY AVAILABLE / / LINKAGES FOR OS8F, WHEN PRESENT / IFDEF OS8F < .GLOBAL INTLOK,LOKTAB > / IFZERO KT8A < OS8F0= 1-OSFLDS^10+HGHFLD /FAKE FIELD 0 GOES AT BOTTOM OS8F1= OS8F0+10 /NEXT UP IN ORDER XF0=OS8F0 /EQUATES FOR MASS STORAGE CALLS VFNCDF=NFLDS^10+6201 /'CDF' TO FIRST ILLEGAL FIELD MAXVIR=OSFLDS^10 /MAXIMUM VIRTUAL FIELD XF1=OS8F1 > IFNZRO KT8A < / / VARIOUS EQUATES FOR KT8A MANIPULATIONS / ASSUME OSBASE, OSFLDS, AND HGHFLD ARE AVAILABLE FROM PARAM FILE AS / RIGHT JUSTIFIED VALUES / / OSREG=OSBASE&7 /FIELD BITS FOR LESS THAN 32K OSEX=OSBASE&30 /AND EXTENDED FIELD BITS OSZZ=OSEX+160&210%2 /EXTENDED FIELD BITS IN 104 POSITIONS OS8F0=OSREG^10+OSZZ /FIELD BITS IN CDF POSITION (VIRTUAL FIELD 0) OS8F1=OS8F0+10 /SAME FOR VIRTUAL FIELD 1 IFZERO OS8F1-100 /CORRECT FOR STRADDLES IFZERO OS8F1-104 IFZERO OS8F1-200 DFORM=OSEX^20+OSREG /FIELD 0 IN FORM OF DATA FIELD FROM GTS WORD IFORM=OSEX^10+OSREG^10 /AND IN INSTRUCTION FIELD FORM OSTART=IFORM+DFORM+100 /SET DF AND IF TO VIRTUAL 0; AND USER MODE LIMIT=OSBASE+OSFLDS /FIRST ILLEGAL FIELD LIMREG=LIMIT&7 /CONSTRUCT CDF TO FIRST ILLEGAL FIELD! LIMEX=LIMIT&30 /FOR USE IN CHECKING FOR CDF OFF FIELD LIMZZ=LIMEX+160&210%2 /WHEN OS IS CORE SIZING OSILL=LIMREG^10+LIMZZ VFNCDF=6201+OSILL /THIS IS CDF TO FIRST ILLEGAL FIELD VF1CDF=6201+OS8F1 /THIS IS CDF TO VIRTUAL FIELD 1 MAXVIR=OSFLDS^10 /FIRST ILLEGAL VIRTUAL FIELD CNV0=OSEX%2 /EQUATES FOR CONVERSION OF FIELD TO RTS8 HANDLER /FORM, WHICH IS CDEBA0. CNV0 IS THE B+A BITS. IFNZRO CNV0&10 IFNZRO OSREG-1+OSFLDS&10 < CNV1=OSEX+10%2 /SAME FOR BLOCK ABOVE THE FIRST REAL OS8 FIELD IFNZRO CNV1&10 CONV1=OSREG^10+CNV1+7700+MAXVIR /SEE CODE AFTER ZOT, CONV2=CNV0-CNV1+100 > IFZERO OSREG-1+OSFLDS&10 < CONV1=0 CONV2=OSREG+OSFLDS^10+CNV0 > / / MAKE CDEBA0 BITS FOR VIRTUAL FIELDS 0 AND 1 / XF0=+ XF1=+ / / IOT EQUATES FOR KT8A / RTS=6220 GTS=6210 LUSR=6260 LRR=6240 RACA=6175 RACB=6176 RACC=6177 / EQUATES FOR DECIPHERING USER'S IOT'S KS=KSF&770^4 /NEED CODE TIMES FOUR, THE WAY IT WORKS OUT TS=TSF&770^4 LS=PSLS&770^4 > IFZERO OS8F0 IFNZRO OSFLDS-2&4000 IFNZRO NFLDS-OSBASE-OSFLDS&4000 .EXTERNAL TSTABL .ZTERNAL TASKX,TSWFLG / / SET UP EQUATES TO REFERENCE OUR STORAGE AREA IN TSTABL / TKFLDS=TSTABL+OS8+OS8+OS8+OS8 IFNZRO EAESV TKPC=TKFLDS+1 TKAC=TKPC+1 / OS8DCB= 7760 /ADDRESS OF OS/8 DCB TABLE IN FIELD 1 OS8HND= 7647 /ADDRESS OF OS/8 RESIDENT HANDLER TABLE IN FIELD 1 JSBITS= 7746 / OS/8 JOB STATUS BITS IN FIELD 0 OSKBML= 7671 /LOCATION IN FIELD 1 WHICH READS THE KEYBOARD MONITOR OSUSRL= 7723 /LOCATION IN FIELD 1 WHICH READS IN THE USR OSCDLD= 271 /LOCATION IN USR IN FIELD 1 WHICH READS IN CD TS8LOC= 200 /LOCATION IN RTS-8 CINT= 6204 SUF= 6274 IFNDEF OSFILL IFNZRO OSTTDV&6000 IFNZRO OSTTDV-4&4000 IFNDEF OSKBDV IFZERO OSTTDV&100 < KSFX= OSKBDV^10+6001 KCCX= OSKBDV^10+6002 KRSX= OSKBDV^10+6004 KRBX= OSKBDV^10+6006 TSFX= OSTTDV^10+6001 TCFX= OSTTDV^10+6002 TSKX= OSTTDV^10+6005 TLSX= OSTTDV^10+6006 > IFNZRO OSTTDV&100 < IFNDEF KL8ADV KLNUM=OSTTDV&77%4 /KL8A NUMBER IFNZRO KL8A-KLNUM-1&4000 /MUST BE .LE. 'KL8A' KLNUM=KLNUM^2 /DEVICE CODES COME IN PAIRS TLSX= KL8ADV+KLNUM^10+6004 > PSKF= 6661 /LINE PRINTER IOT'S PSIE= 6665 PSLS= 6666 PCIE= 6667 / FIELD ZERO LOCATIONS FOR OS8SUP IFZERO KT8A < .ASECT OS8ZA, LEVEL=0 > IFNZRO KT8A < .ZSECT OS8Z, LEVEL=0 > FIELD RTFLD IFZERO KT8A < *166 > AC, 0 /OS/8 AC PC, 0 /OS/8 PC IFZERO KT8A < LINK, 0 UCDF, 0 HLT /CDF TO MAPPED OS/8 DF JMP I UCDF UCIF, 0 HLT /CDF TO MAPPED OS/8 IF JMP I UCIF UIF, 0 > IFNZRO KT8A < LINK, /ALSO CALL LINK FOR CONDITIONAL CONVENIENCE GTSWRD, 0 /STORE RESULT OF GTS INSTRUCTION UCDF, 0 /PAGE 0 TEMPORARY FOR CONVENIENCE UCIF, 0 /AND ANOTHER ONE > /INITIALIZATION CODE - OVERWRITTEN BY RING BUFFERS .RSECT OS8T, LEVEL=0 FIELD RTFLD .TASK OS8 LPTCNT=44 .EXTERNAL DATE,YEAR /TO PULL DATE TO OS8 FROM RTS8 IFNZRO BKTCDV < .GLOBAL KBEX,TTEX /ENTRY POINTS FOR BF TT HANDLER .EXTERNAL BKGSET /FLAG IN TTY, WHO NOW HAS TERMINAL > START, IFZERO BKTCDV < /INIT ONLY IF NO BF HANDLER IFZERO OSTTDV&100 < CAL SKPINS TTINT /LINK IN OS/8 TELETYPE IFZERO OMNI < CAL SKPINS KBINT > > IFNZRO OSTTDV&100 < .EXTERNAL KL8ACT IOF /INTERRUPTS OFF FOR JMS TAD OSLN /LOAD NUMBER OF KL8A LINE WE ARE CONNECTING TO JMS I KLCNCT /CONNECT TO INTERRUPT FOR THAT LINE KBINT /KEYBOARD INTERRUPTS HERE TTINT /PRINTER INTERRUPTS HERE > > OWBASE= START OWLEN= 20 IRBASE= OWBASE+OWLEN IRLEN= 10 IREND= IRBASE+IRLEN IFDEF EXIT < /SET UP LINK TO EXIT IF PRESENT CAL SEND EXIT EXTBLK /SEND OUR ADDR FOR EXIT CLEAN-UP ROUTINE > IFZERO KT8A < TAD LLLOK /POINTER TO OK DCA I LTSLOC /TO EXEC POINTER SUF /GO TO JMP .+1 /USER MODE OSR /READ SWITCHES, SHOULD CAUSE TRAP SKP CLA /AC=0 FOR ERROR ON STARTUP > OK, STA /AC=-1, GOT TRAP CINT /CLEAR (POSSIBLE) USER INTERRUPT ION /AND RELEASE SYSTEM CDF CIF OS8F0 /OS/8 INITIALIZATION CODE LOADS JMP I OSINIT /INTO OS/8 FAKE FIELD 0 OSINIT, INITOS IFZERO KT8A < LLLOK, OK /LITERALS LTSLOC, TS8LOC /EXEC SKIP POINTER TO US > IFZERO BKTCDV < IFNZRO OSTTDV&100 < OSLN, OSTTDV&77^4 /LINE NUMBER, SHIFTED FOR USE BY KL8ACT KLCNCT, KL8ACT /KL8A CONNECT ROUTINE > > IFNZRO IRBASE&IRLEN IFNZRO OWBASE&OWLEN IFNZRO .-IREND&4000 / TSS/8 INTERRUPT HANDLER IFZERO KT8A < /THIS PAGE OF CODE TOTALLY DIFFERENT TSINT, DCA AC RAR DCA LINK STA TAD 0 DCA PC /SAVE PC , AC, LINK FROM INTERRUPT CINT /CLEAR USER INTERRUPT FLAG ION /RESTORE INTERRUPTS JMS EXECUT /EXECUTE ONE IOT GOBACK, TAD LINK /GENERAL OS8 STARTUP CLL RAL CLA IAC TAD UCIF+1 DCA .+2 JMS UCDF OP, HLT TAD AC SUF JMP I PC /GO TO OS/8 IN USER MODE PT, 0 /EXECUTE A TRAPPED IOT /CALLED FROM TRAP ROUTINE AND FROM CIF INTERPRETER ("RECURIVELY") EXECUT, 0 UCIFX, HLT /CDF TO USERS INSTRUCTION FIELD TAD I PC CLL RTR RTR TAD (-1310 /CHECK FOR CDF 0 OR CDF 10 SZA CLA /SINCE THEY ARE THE MOST COMMON THINGS JMP NCDF01 SNL /LINK HAS COMPLEMENT OF FIELD BIT TAD (OS8F1-OS8F0 TAD (CDF OS8F0 /LOAD PROPER CDF BASED ON LINK DCA UCDF+1 XNOP, ISZ PC XERET, JMP I EXECUT /LEAVE EXECUT WITH PC BUMPED NCDF01, AC2000 TAD I PC /GET TRAP INSTRUCTION SNL /IF ITS NOT IOT OR OPR, THE PREVIOUS JMP I (ILLIOT /INST WAS SKP HLT - ERROR TAD (7000 SNL /TEST IOT OR OPR JMP MBHALT /OPR AND (704 TAD (-200 /CHECK FOR CDF OR CIF (OR BOTH) SNA CLA JMP I (DFSTUF /YES - SPECIAL ROUTINES FOR THESE TAD (IOTLST-1 DCA PT TAD I PC DCA OP /SEARCH LEGAL OPCODE LIST CDF .FLD SROPLP, ISZ PT TAD I PT ISZ PT SNA JMP I (XNOP /UNDEFINED IOT'S ARE NOP'S TAD OP SZA CLA JMP SROPLP TAD I PT DCA PT JMP I PT /GO PROCESS OPCODE MBHALT, AND (407 TAD (-404 /OSR ONLY LEGAL OPR SZA CLA JMP I (ILLIOT CLA OSR SKP XRIF, TAD UIF XOR, DCA PT /GENERAL OR WITH AC TAD AC CMA AND PT TAD AC XACSTO, DCA AC JMP XNOP XRDF, TAD UCDF+1 /CDF TO REAL FIELD TAD (-CDF-OS8F0 /SUBTRACT OFFSET TO GIVE VIRTUAL FIELD JMP XOR PAGE > /END OF PAGE OF CONDITIONAL / IFNZRO KT8A < / / PAGE OF CODE FOR KT8A IMPLEMENTATION / TSINT, DCA AC /SAVE AC AS USUAL GTS /GET LINK, USER MODE, DF AND IF (5 BITS) DCA GTSWRD /SAVE THOSE GTF /GET FATAL BIT FOR LATER TESTING RTL /PUT IT INTO LINK RTL STA /BACK UP PC TO FETCH OFFENDING INSTRUCTION TAD 0 /ASSUMES WE'RE IN FIELD 0 !!!! (FLIPS LINK) DCA PC /SAVE THIS POINTER, ALSO FOR EXITTING CINT /CLEAR USER INTERRUPT FLAG ION /!!IF ANOTHER INTERRUPT MAKES US NON-RUNNABLE / /ALL WILL BE CORRECTLY SAVED (MQ AND EAE BY / /SYSTEM CONTEXT ROUTINES) WE HAVE REST HERE TAD GTSWRD /WHAT WAS INSTRUCTION FIELD ? RACC /PUT BITS IN FORM OF CDF INSTRUCTION TO ACCESS FIELD! TAD (CDF /MAKING THE CDF DCA FETINS /PUT IT IN LINE FETINS, HLT /SWITCH TO DATA FIELD OF OFFENDING INSTRUCTION SNL /SKIP IF NOT FATAL (TAD 0 FLIPPED LINK) JMP OSBUG /FATAL, CHECK TO SEE IF OS8 BUG CAUSED IT AC4000 /FLOP TOP BIT OF OFFENDING INSTRUCTION TAD I PC /FETCH SAID INSTRUCTION CLL RTL /AC0 NOW SEPARATES IOT AND OPR INSRUCTIONS SNA /SKIP UNLESS WE HAD A 6000 ORIGINALLY JMP I (HCALL /YES, THAT IS HANDLER CALL IOT! SPA /SKIP IF IT WAS SOME IOT JMP OPERAT /IT WAS AN OPERATE CLASS INSTRUCTION AND (7740 /KEEP ONLY 6 BITS OF DEVICE TYPE (SHIFTED TWO) TAD (-LS /WAS IT A LINE PRINTER CLASS IOT? SNA /SKIPPING IF NOT JMP GOTLP /YES TAD (LS-TS /WAS IT A TELEPRINTER CLASS IOT? SNA /SKIPPING IF NOT JMP GOTELE /YES TAD (TS-KS /WAS IT A KEYBOARD CLASS IOT? SZA CLA /SKIPPING IF YES JMP CHKCDF /CHECK ON OS8 SIZING CDF! IAC /MAKE DISPATCH CODE GOTELE, CLL IAC RTL /KT8A MACHINES MUST DO IAC RTL !! GOTLP, DCA UCIF /LP=0; TELE=4; KEYB=10 FOR IOT GROUPS TAD I PC /NOW SORT WHICH IOT OF GROUP WE HAD AND (7 /KEEPING ONLY THOSE THREE BITS CLL RAR /LEGAL CODES 1,2,4,6 MAPPED TO 0,1,2,3 CIA /DIRTY!! COMPLEMENTS LINK ONLY IN 0-1 CASE SZL /SO LINK IS 0 FOR IOTS ENDING IN OCTAL 1,2,4,6 JMP I (ILLIOT /MISSED, ENDED IN 0,3,5,7 ILLEGAL! TAD UCIF /BRING IN REST OF INDEX JMP I (OSDISP /GO TO FSECT TO DISPATCH OSBUG, TAD FETINS /DID WE HIT CIF,TCF BUG IN OS8?? TAD (-CDF-OS8F0 /CHECK FIELD FIRST; VIRTUAL 0? SNA CLA /SKIP IF MISSED, GO OUT THRU ILLIOT TAD PC /CHECK IF PC 7773, LOCATION OF PROBLEM TAD (5 / SZA CLA /SKIP IF MET BOTH CONDITIONS JMP I (ILLIOT /DIDN'T, JUST PRINT ERROR MESSAGE DCA I PC /CLEAR OUT OFFENDING TCF TAD (-6 /BACK UP PC TO RE-EXECUTE THE CIF (LOST IN INTERRUPT) DCA PC JMP GOBACK /EXIT / OPERAT, AND (2034 /CHECK TO SEE IF IT WAS AN OSR INSTRUCTION TAD (-2020 /THROW OUT HLT'S, AND OTHER CLASSES SZA CLA /SKIP IF IT WAS AN OSR JMP I (ILLIOT /GO TO ILLEGAL ACTION ROUTINE TAD I PC /FETCH BACK WHOLE INSTRUCTION DCA OSXXX /STORE TO EXECUTE IT LATER AC4000 /SET UP TO RESTORE LINK (RTS DOESN'T!) TAD GTSWRD /RESTORES THE LINK BY CARRY! RTS /RESTORE DF NOW, IF AND USER AT NEXT JUMP TAD AC /AC AND LINK NOW SET FOR OSR INSTRUCTION OSXXX, HLT /WHICH MAY HAVE VARIOUS SKIPS AS WELL! SKP /ONLY ISZ ONCE IF NO SKIP ISZ PC /ISZ PC TWICE IF A SKIP ISZ PC JMP I PC /RETURN TO BACKGROUND / / XOR, DCA UCIF /GENERAL OR WITH AC TAD AC CMA AND UCIF TAD AC DCA AC XNOP, ISZ PC /MOVE BEYOND IOT TO EXECUTE NEXT XERET, GOBACK, AC4000 /RESTORE LINK BY CARRY TAD GTSWRD RTS TAD AC JMP I PC / / PAGE / > /END OF KT8A CONDITIONAL PAGE /KEYBOARD HANDLER / XXXX=(-IRLEN-1 /FORCE CORRECT LITERAL TO SAVE LOCATION /TO HOLD PAGE IN WORST CASE L177, 177 /FORCE FABRICATION OF LITERAL 200 / EQUATE FOR CONTROL CHARACTER TO CAUSE REBOOT / REBCHR=31 /CURRENTLY A CONTROL Y / XKSF, IOF TAD IRCNT SNA CLA /INPUT BUFFER EMPTY? JMP I (XKSFWT /YES - WAIT IFDEF LPT < XLSF, > XTSF, XSKP, ION /PAIRED WITH IOF AT XKSF ISZ PC JMP I (XNOP /SKIP AND RETURN XKRB, TAD I IRGET /GET SOMETHING OUT OF THE BUFFER XKCC, DCA AC /INTO THE ACCUMULATOR TAD IRCNT SNA CLA /DON'T EMPTY FROM AN EMPTY BUFFER JMP I (XNOP ISZ IRCNT L26, REBCHR-3 /LITERAL FOR CONTROL C TEST TAD IRGET IAC FIX377, AND (-IRLEN-1 /THIS IS A LITERAL 377 DCA IRGET JMP I (XNOP XKRS, TAD IRCNT /CHECK IF BUFFER EMPTY SNA CLA /IF NOT EMPTY, SKIP TO DO REGULAR THING TAD (IRLEN-1 /EMPTY! BACK UP TO LAST CHARACTER! TAD IRGET /POINTER VALUE TO MAKE ADDRESS AND (-IRLEN-1 /KILL ANY CARRY FROM 'SUBTRACT' DCA UCIF /TEMPORARY FOR INDIRECT TAD I UCIF /THIS MAKES SUCCESSIVE KRB'S WORK JMP I (XOR /OR CHAR INTO AC IFZERO BKTCDV < KBINT, IFZERO OSTTDV&100 < IFZERO OMNI < 0;0 /LINKAGE INTO SKIP CHAIN KSFX JMP I KBINT CDF CIF .FLD > KRBX > AND FIX377 /STRIP OFF ERROR BITS (AND LINE # IF KL8A) > IFNZRO BKTCDV < KBEX, > DCA I IRPUT TAD I IRPUT L200, AND L177 /LITERAL 200, TAD (-REBCHR /CHECK FOR CONTROL Y RESTART SNA JMP RSTART /GO RESTART TAD L26 /CHECK CONTROL C (-3+31 SZA /SKIP IF YES TAD (3-17 /MAKE O=0, Q=2, S=4, U=6 AND (7771 /CONTROL C,O,Q,S,U NOW 0! SZA CLA JMP NOCTRC CTLCHR, TAD IRPUT /MAKE IT THE ONLY CHAR IN THE BUFFER DCA IRGET DCA IRCNT NOCTRC, TAD IRPUT /UPDATE PUT POINTER IAC AND (-IRLEN-1 DCA IRPUT TAD IRCNT CIA CLL CML /XTRA CML TO CANCELL EXTRA CML LATER AND (-IRLEN-1 /BUMP CHAR COUNT MOD IRLEN L7060, CMA CML /RESTORE LINK, MAKE A USEFULL LITERAL DCA IRCNT SZL TAD (KSFEF /IF FIRST CHAR IN BUFFER SET EVENT FLAG POSTDS /OTHERWISE JUST DISMISS IRGET, IRBASE IRPUT, IRBASE IRCNT, 0 /ILLEGAL IOT HANDLER - PRINT MESSAGE AND RETURN TO KEYBOARD MONITOR ILLIOT, 7600 /LITERAL 7600, CLEAR AC SINCE IT IS RANDOM CDF .FLD TAD (ILIOMS DCA LINK ILIOLP, TAD I LINK /PRINT ERROR MESSAGE ON OS/8 TTY SPA /LIST ENDS WITH 4600 JMP PRNTPC JMS I (XTLSUB ISZ LINK JMP ILIOLP IFZERO KT8A < PRNTPC, TAD UIF /4600 IN AC HERE CLL RTR RAR JMS I (XTLSUB /PRINT FIELD > IFNZRO KT8A < PRNTPC, TAD I (FETINS /GRAB INSTRUCTION FIELD RACA /BITS IN 000AB0000CDE DCA UCIF /SAVE TAD UCIF BSW /MUST! EXIST ON KT8A MACHINE RAR JMS PROCT /PRINT AN OCTAL TAD UCIF JMS PROCT > TAD (-4 DCA LINK TAD PC PCPTLP, CLL RTL RAL DCA UCIF TAD UCIF RAL IFZERO KT8A < AND (7 TAD L7060 /NEED ONLY THE 60, XTLSUB ANDS WITH 177 JMS I (XTLSUB /PRINT THE PC IN OCTAL > IFNZRO KT8A < JMS PROCT > TAD UCIF ISZ LINK JMP PCPTLP /4 DIGITS WORTH CLL CLA /CLEAR AC TAD PC TAD L200 /CHECK IF ERROR IN RESIDENT SZL CLA /IF SO, DON'T SAVE CORE ON RELOAD TAD (5 /SINCE SYS: IS PROBABLY WRITE PROTECTED. /** FALL INTO NEXT LISTING PAGE ** /START KEYBOARD MONITOR AT 07600 STKBMN, TAD ILLIOT /LITERAL 7600 FOR REBOOT ADDR DCA PC DCA AC /AND AC CLEAR IFZERO KT8A < TAD (CDF OS8F0 DCA UCDF+1 HNDRET, DCA UIF TAD UCDF+1 DCA UCIF+1 GOBCKX, TAD UCIF+1 CDF .FLD DCA I (UCIFX > IFNZRO KT8A < TAD (OSTART /PROPER GTSWORD TO START OS8 HNDRET, DCA GTSWRD /SAVE IT FOR OS STARTUP > JMP I (GOBACK /START INTERPRETING IFNZRO KT8A < PROCT, 0 /PRINT AN OCTAL DIGIT AND (7 TAD L7060 /XTLSUB ANDS WITH 177, MAKE NUMBER ASCII JMS I (XTLSUB JMP I PROCT > PAGE /TELETYPE OUTPUT HANDLER XKSFWT, CLA IAC /SET EV NON0 DCA I LKSFEF ION IFNZRO KT8A < TAD I (FETINS /SET DATA FIELD TO TRAPPING INSTRUCTION DCA FETNXT FETNXT, HLT /BY COPYING CDF INSTRUCTION HERE > TAD PC ISZ PC AND (177 /CHECK IF NEXT LOCATION IS A "JMP .-1" - TAD (5200 CIA IFZERO KT8A < JMS UCIF > TAD I PC /IF IT IS WE SHOULD HANG SZA CLA /OTHERWISE DO A NON-SKIP RETURN JMP I (XERET CAL WAITE LKSFEF, KSFEF /WAIT FOR ANY INPUT JMP I (XNOP /DO A SKIP RETURN AFTER WAITING XTCF= XNOP /?? XTLS, TAD AC JMS XTLSUB /CALL SUBROUTINE USED TO PRINT ERRORS IFNZRO OSFILL < IFNZRO OSFILL&7770 TAD (-OSFILL /LOOP CONTROL DCA UCIF FILLOO, TAD UCDF /UCDF = CHAR&177 FROM XTLSUB TAD (-12 SNA CLA /SKIP UNLESS LINE FEED JMS XTLSUB ISZ UCIF /MORE? JMP FILLOO /YES > JMP I (XNOP /KEEP ON TRUCKING XTLSUB, 0 /ROUTINE TO OUTPUT CHAR IN AC AND (177 /STRIP PARITY AND GARBAGE DCA UCDF /SAVE CHAR RDF /WHAT FIELD WERE WE CALLED FROM TAD (CDF CIF 0 /MAKE CDF CIF TO EXIT FROM SUBROUTINE DCA XTEXIT /PLACE TO EXIT CDF CIF .FLD /BACK TO THIS FIELD, LOCK OUT INTERRUPTS TAD OWCNT /IS BUFFER FULL? TAD (OWLEN SZA CLA /WAIT FOR BUFFER TO HAVE SPACE JMP XTROOM /IT HAS ROOM, GO PLACE CHAR ISZ I LTSFEF /MAKE EVENT FLAG NON-0 CAL WAITE /WAIT FOR INTERRUPT SIDE TO POST ROOM IN BUFFER LTSFEF, TSFEF XTROOM, TAD UCDF CDF CIF .FLD /DATA FIELD HERE, HOLD OFF ACTION DCA I OWPUT TAD OWPUT /STORE CHAR IN BUFFER AND BUMP POINTER IAC AND (-OWLEN-1 DCA OWPUT STA CLL TAD OWCNT DCA OWCNT /BUMP BUFFER COUNT IFNZRO BKTCDV < SZL /SKIP IF BUFFER EMPTY, MORE CHECKING JMP XTEXIT /BUFFER HAS SOME, JUST GO AWAY CDF BKGSET /DON'T TLSX IF BACKGROUND DOESN'T OWN TERMINAL TAD I (BKGSET /FLAG 0 IF FOREGROUND HAS IT SNA CLA /SKIP IF BACKGROUND JMP XTROOM /AWFUL!! BUFFER EMPTY WHILE FOREGROUND OWNS / /TERMINAL. THE CHAR WE JUST PUT IN THE BUFFER / /IS 'LOST' BECAUSE WE CAN'T TLS IT. GO BACK AND / /PUT IT IN THE BUFFER AGAIN! ONLY THE SECOND ONE / /IN THE BUFFER WILL ACTUALLY PRINT. > XTOK, TAD UCDF IFNZRO OSTTDV&100 /ADD LINE # IFZERO BKTCDV < SNL /ONLY PRINT IF BUFFER EMPTY > TLSX /PRINT IF FIRST CHAR IN BUFFER CLA XTEXIT, 0 /PLACE CDF CIF TO CALLER HERE JMP I XTLSUB /TELETYPE OUTPUT INTERRUPT ROUTINE IFZERO BKTCDV < TTINT, IFZERO OSTTDV&100 < ZBLOCK 2 IFZERO OMNI IFNZRO OMNI JMP I TTINT CDF CIF .FLD IFNZRO OMNI < TSFX /KEYBOARD OR PRINTER? JMP I (KBINT /KEYBOARD > > IFZERO OSTTDV&100 /CLEAR PRINTER FLAG > IFNZRO BKTCDV < TTEX, > TAD OWCNT SMA CLA /IGNORE UNSOLICITED INTERRUPTS (LA30) POSTDS TAD OWGET IAC AND (-OWLEN-1 DCA OWGET ISZ OWCNT SKP POSTDS /BUFFER NOW EMPTY - LEAVE TAD I OWGET IFNZRO OSTTDV&100 /ADD LINE # TLSX /PRINT NEXT CHAR FROM BUFFER STA TAD OWCNT TAD (OWLEN SNA CLA /IF BUFFER JUST BECAME UNFULL, TAD LTSFEF /SET EVENT FLAG POSTDS /ELSE JUST DISMISS OWCNT, 0 OWGET, OWBASE OWPUT, OWBASE /LINE PRINTER OUTPUT ROUTINE - USES RTS-8 LPT DRIVER IFDEF LPT < XLLS, TAD AC DCA I LPBUF /STORE CHAR IN LPT MESSAGE BUFFER ISZ LPBUF TAD AC AND (177 TAD (-15 /CHECK TO SEE IF THE CHARACTER CLL TAD (3 /IS A FORMS MOVEMENT CHARACTER ISZ LPBUFC /(I.E. LF,VT,OR FF) SZL CLA /OR IF THE MESSAGE BUFFER IS FULL SKP CLA JMP I (XNOP /NEITHER - RETURN TO OS/8 JOB DCA I LPBUF /ZERO IS THE BUFFER END CODE CAL SENDW /MOVE THE BUFFER TO THE LINE PRINTER LPT LPMESG TAD (LPTBUF DCA LPBUF /RE-INITIALIZE THE BUFFER PPOINTER TAD (-LPTCNT DCA LPBUFC /AND COUNTER JMP I (XNOP /AND CONTINUE LPBUF, LPTBUF LPBUFC, -LPTCNT > IFNDEF LPT < XLLS, ISZ LPFST SKP JMP .+3 PSKF JMP .-1 /OH, HOW CRUDE! TAD AC PSLS DCA LPFST /CLEAR FIRST-TIME FLAG JMP I (XNOP LPFST, -1 XLSF, PSKF /IF THE FLAG IS NOT UP, JMP I (XNOP /BE A NOP JMP I (XSKP /OTHERWISE BE A SKIP > PAGE IFZERO KT8A < / /CODE TO HANDLE CDF'S AND CIF'S DFSTUF, TAD I PC DCA WD CLA IAC AND WD /CHECK CDF BIT SNA CLA JMP NOCDF TAD WD AND (70 JMS I (GETFLD /GO GET CDF TO REAL FIELD DCA UCDF+1 /SAVE IN CDF SUBR NOCDF, AC0002 AND WD SNA CLA JMP I (XNOP /WHEW! TAD WD /UNLUCKY US - A CIF AND (70 DCA IBR /SAVE IF BACKUP ISZ PC TAD IBR CIA TAD UIF /IF ITS A CIF TO CURRENT FIELD, SNA CLA /EXIT IMMEDIATELY BYPASSING EXECUT RETURN JMP I (GOBACK /AND POSSIBLE SUBSEQUENT USELESS SIMULATION CIFLP, JMS UCIF TAD I PC DCA WD /GET WORD TO INTERPRET TAD WD SPA CLA JMP NONSTD JMS GEFADR /GET EFFECTIVE ADDRESS TAD WD AND T7000 /ISOLATE OPCODE TAD (AND I WT /FORM EQUIVALENT INSTRUCTION DCA WD JMP XINLIN /AND EXECUTE IT IN LINE /SUBROUTINE TO COMPUTE EFFECTIVE ADDRESSES GEFADR, 0 TAD WD AND (177 DCA WT TAD WD AND (200 CIA AND PC TAD WT DCA WT /ADD PAGE BITS TO DISPLACEMENT JMS UCIF TAD WD AND (400 SNA CLA /IF NO INDIRECT ADDRESS, JMP I GEFADR /OPERAND FIELD = IF TAD WT AND (7770 TAD (7770 SNA CLA /TEST FOR AUTO-XRS ISZ I WT TAD I WT DCA WT JMS UCDF /IF INDIRECT ADDRESSING, JMP I GEFADR /OPERAND FIELD = DF NONSTD, TAD WD CLL RTL SNL /CHECK FOR JMP OR JMS JMP JMPJMS /YES - NOT LONG NOW SPA JMP XOPR /SEPARATE THE IOTS FROM THE OPRS CLA JMS I (EXECUT /WE CAN CALL EXECUT "RECURSIVELY" HERE SINCE JMP CIFLP /WE DON'T PLAN ON RETURNING FROM THIS LEVEL XOPR, AND (6014 /7403 ROTATED LEFT 2 TAD (-6010 /7402 ROTATED LEFT 2 SNA CLA JMP I (ILLIOT XINLIN, TAD LINK CLL RAL TAD AC WD, 0 SKP /WATCH FOR SKIPS AND ISZ'S ISZ PC NOP ISZ PC T7000, NOP /JUST IN CASE DCA AC RAR DCA LINK JMP CIFLP /INTERPRET JMP OR JMS JMPJMS, CLA JMS GEFADR /GET EFFECTIVE ADDRESS TAD IBR JMS I (GETFLD /GO GET CDF TO REAL FIELD DCA UCIF+1 TAD IBR DCA UIF JMS UCIF TAD WD RTL /CHECK FOR JMS SPA CLA JMP XJMP /NO CLA IAC TAD PC DCA I WT /SAVE RETURN ADDRESS CLA IAC /AND BUMP JUMP ADDRESS XJMP, TAD WT DCA PC JMP I (GOBCKX WT, 0 IBR, 0 PAGE > /ROUTINE TO HANDLE SPECIAL OS/8 HANDLER IOT /FORMAT OF SPECIAL IOT USAGE IS AS FOLLOWS: / TAD (INTERNAL DEVICE CODE / 6000 /DATA FIELD IS FIELD OF HANDLER ARGUMENTS / POINTER TO OS/8 HANDLER ENTRY POINT / RETURN IS TO THE ERROR OR NORMAL RETURN OF THE HANDLER HCALL, IFZERO KT8A < JMS UCIF > ISZ PC /GO TO NEXT WD / /REMOVE EXTRA INDIRECT HERE TAD I PC DCA PC /PC CONTAINS ARGUMENT LIST ADDR IFDEF OS8F < IFZERO KT8A < TAD UCDF+1 TAD (-CDF-OS8F1 > IFNZRO KT8A < RDF /WHAT FIELD? TAD (-OS8F1 /FIRST VIRTUAL? > SNA CLA /IF WE ARE CALLING THE TAD PC /KEYBOARD MONITOR, TAD (-OSKBML SZA TAD (OSKBML-OSUSRL /USR, SZA TAD (OSUSRL-OSCDLD /OR COMMAND DECODER INTO CORE, SZA CLA /RELEASE THE OS8F INTERLOCK JMP NOPOST /SINCE THE USR DIRECTORY BUFFER IS CLEAR. CDF .FLD /SET UP TO CLEAR INTERLOCK TABLE TAD (LOKTAB DCA ARGS+1 /SAFE TEMPORARY TAD (-15 DCA ARGS+2 CLLLP, DCA I ARGS+1 ISZ ARGS+1 ISZ ARGS+2 JMP CLLLP TAD (INTLOK CAL POST /OS8F INTERLOCK IS A STANDARD EVENT FLAG CDF .FLD NOPOST, > TAD AC AND (7760 /CHECK UNIT NUMBER LT 16. SZA CLA JMP I (ILLIOT /IF NOT, ILLEGAL IOT TAD (HNDTAB TAD AC DCA AC IFZERO KT8A < JMS UCDF /ARG LIST IN DATA FIELD > IFNZRO KT8A < TAD GTSWRD /FABRICATE CDF TO USER'S DATA FIELD RACB /BITS TO IF FORM RACC /BITS TO CDF FORMAT TAD (CDF DCA ZOT /PLACE TO EXECUTE ZOT, HLT > TAD I PC IFNZRO KT8A < AND (7701 /VERSION 3 HANDLERS HAVE 5 CDF BITS DCA ARGS+1 /GET FIRST WORD EXCEPT FOR FIELD TAD I PC AND (70 TAD (-MAXVIR /CHECK I/O TRANSFER OUT OF RANGE SMA /SKIPPING IF OK JMP I (ILLIOT /OUT OF RANGE, PUT OUT ILLEGAL IOT MESSAGE TAD (CONV1 /CONVERT TO RTS8 HANDLER FIELD BIT FORMAT SPA /CARRIED TO NEXT BBLOCK, IS ALREADY CORRECT TAD (CONV2 /STILL IN SAME 32K CORE BLOCK, CORRECT IT TAD ARGS+1 DCA ARGS+1 > IFZERO KT8A < AND (7771 /DELETE POSSIBLE SPURIOUS SPECIAL I/O BITS TAD (OS8F0 /CONVERT VIRTUAL FIELD TO REAL DCA ARGS+1 /PLACE IN I/O CALL TAD I PC /DID FIELD GO OUT OF RANGE AND (70 /KEEPING FIELD BITS TAD (-MAXVIR / SMA CLA /SKIP IF OK JMP I (ILLIOT /ERROR IF TO TOO HIGH A FIELD > / /SKIP FALLS TO NEXT PAGE OF LISTING!!! ISZ PC TAD I PC DCA ARGS+2 ISZ PC TAD I PC CDF .FLD DCA ARGS+3 IFDEF OS8F < TAD ARGS+3 /WHICH BLOCK ARE WE GOOING TO CLL SZA /SKIP IF ZERO, THAT'S OK TAD (7771 /CHECK FOR 1-6 SZL SNA CLA /SKIP IF 1-6 JMP NOTDIR /NOT DIRECTORY TAD LVAR9 /COMPUTE ADDR OF TABLE ENTRY TAD AC /FROM HNDTAB ENTRY ADDR DCA HTASK /SAFE TEMPORARY CLA IAC /SET TO NON-0 DCA I HTASK TAD INTLOK /AND SET EVENT FLAG IF NOT ALREADY SNA CLA ISZ INTLOK > NOTDIR, ISZ PC L37, 37 /PROTECT AGIANTS SKIP TAD I AC /GET HANDLER TASK NUMBER SNA JMP I (ILLIOT /ILLEGAL HANDLER IOT AND (7760 /KEEP TASK NUMBER CLL RTR RTR RAR DCA HTASK TAD I AC /GET UNIT NUMBER AND L37 /IN BITS 7-11 DCA ARGS CAL SENDW /SEND THE I/O REQUEST TO THE APPROPRIATE TASK HTASK, 0 IOMESS /AND WAIT FOR COMPLETION MASWAT, TAD IOSTS /USE RETURN STATUS TO DETERMINE SNA /WHETHER WE FAKE A NORMAL OR ERROR RETURN JMP OKRET /MAKE OK ONE CLL RAL STL RAR /FORCE ON 4000 BUT LEAVE REST ALONE SKP OKRET, ISZ PC DCA AC IFZERO KT8A < TAD UCDF+1 /GET REAL FIELD TAD (-CDF-OS8F0 /SUBTRACT OFFSET TO GIVE VIRTUAL FIELD JMP HNDRET > IFNZRO KT8A < IFNDEF OS8F < TAD GTSWRD /FOR RETURN FIELD, FORCE IF TO BE EQUAL TO DF! AND (4707 /TAKE OUT THE OLD IF DCA UCIF /HOLD THAT TAD GTSWRD /NOW EXTRACT DF RACB /ALSO STRIPPING EXTRA BITS TAD UCIF /MERGING TOGETHER, NEW GTSWRD IN AC JMP HNDRET > IFDEF OS8F < JMP OVRFLW /OVERFLOWED CODE TO FSECT > > IOMESS, ZBLOCK 3 /HANDLER MESSAGE ARGS, ZBLOCK 4 IOSTS, 0 INTLOK, 0 /OS8-OS8F INTERLOCK - 0 MEANS DIR FREE IFDEF OS8F < LVAR9, LOKTAB-1-HNDTAB > / REARRANGE CODE TO FIT PAGES, / IFNDEF OS8F < /FITS HERE IF NO OS8F IFZERO KT8A < /TABLE OF LEGAL IOT'S IOTLST, -RDF; XRDF -RIF; XRIF -KSF; XKSF -KCC; XKCC -KRS; XKRS -KRB; XKRB -TSF; XTSF -TCF; XTCF -TLS; XTLS -PSLS; XLLS -PSKF; XLSF /USED TO BE XSKP, WRONG -6000; HCALL 0 > IFNZRO KT8A < CHKCDF, TAD I PC /DOING A CDF TO FIRST ILLEGAL FIELD? TAD (-VFNCDF SZA CLA /SKIP IF YES JMP XNOP /ILLEGAL IOT IS NOP TAD GTSWRD /FORCE CDF BACK TO VIRTUAL FIELD 0 AND (7170 /ON EXIT FROM USER INTERRUPT TAD (DFORM /PUTTING VIRTUAL FIELD 0 DCA GTSWRD JMP XNOP > > PAGE TSFEF, 0 /KEEP THESE PESKY FELLOWS HERE KSFEF, 1 /THEY MUST BE IN THIS ORDER, AND ADJAACENT!! / / LOGIC TO START REBOOT OF REAL OS8 / IFDEF EXIT < /IF EXIT, POINT TO OUR ROUTINE EXTBLK, ZBLOCK 3 OSBOOT > / .ENTRY OSBOOT / OSBOOT, /CALLED BY EXIT-EXIT OR MCR EXIT RSTFLG, 0 /ALSO REBOOT IN PROGRESS FLAG RDF /OK, WHAT FIELD TAD (CDF CIF 0 /USE FIELD SETTING AS FLAG DCA REALOS /TO SHOW REAL OS8 BOOT TAD RBLOCK /HAS INIT CODE RUN YET SNA CLA /SKIP IF YES JMP REALOS /NO, HEADS THEN ARE ALREADY OK, JUST RETURN TAD (OS8 CAL /BLOCK OS8 SUPPORT TO PREVENT REENTRANCY CLASH BLKARG RUNWT /CHOICE OF BLOCK ARBITRARY JMP REINIT /READ BOOTING CODE OFF DISK / REALOS, 0 /CIF CDF CALLER IF REBOOTING REAL OS8, OTHERWISE 0 JMP I OSBOOT /GO BACK / RESTART LOGIC / IFZERO KT8A < .GLOBAL RSTFLD RSTFLD=.FLD%10+.FLD /OUR DATA AND INST FIELD > IFNZRO KT8A < .GLOBAL RSTFLD,TMFLD TMFLD=.FLD&30%10 RSTFLD=TMFLD^4+TMFLD^2+.FLD^10+.FLD > / / READ INIT CODE BACK FROM DISK, / THEN GO TO INIT CODE TO REBUILD VIRTUAL MONITOR HEADS / RSTART, TAD RSTFLG /ALREADY REBOOTING? SZA CLA /SKIP IF NOT POSTDS /YES, JUST GO AWAY TAD (-OS8 /DID WE INTTERUPT OURSELVES? TAD TASKX /ASSUMES WE'RE IN MONITOR FIELD SNA CLA /SKIP IF INTERRUPTED ANOTHER JOB JMP GOTSLF /INTERRUPTED SELF, FURTHER TESTING ISZ RSTFLG /SET FLAG, WE'RE ABOUT TO REBOOT TAD (OS8+4000 /DEFAULT SETTING FOR EVENT FLAG DCA MASST /IN CASE HAVE TO PULL OUT OF EVENT FLAG WAIT TAD I (TKPC /COULD WE BE WAITING FOR NON-SYS MASS STOR? CIA TAD (MASWAT /IF SO, CANNOT FORCE OUT OF EVENT FLAG WAIT!! SNA CLA /SKIP IF NO, TO POST EVENT FLAG DCA MASST /MASS STORAGE WAIT, LEAVE IT ALONE! DCA I (OWCNT /TURN OFF TTY OUTPUT TAD I (OWPUT DCA I (OWGET TAD (REINIT /SOMEONE ELSE, PUT CORRECT STUFF IN STATE TABLE DCA I (TKPC /THE PC DCA I (TKAC /CLEAR THE AC TAD (RSTFLD /MAKE GTS OR GTF WORD! DCA I (TKFLDS TAD LMASST /POST MASST, PULL FROM EVENT FLAG WAIT UNLESS / /WE ARE WAITING ON MASS STORAGE DEVICE HANDLER POSTDS /RELEASE INTERRUPT. WHEN WE GET RESCHED, WE GO TO REINIT / GOTSLF, TAD TSWFLG /DID WE INTTERUPT OURSELVES IN THE EXEC! SNA SPA CLA /SKIP IF NO, JUST PROCEED WITH REBOOT POSTDS /CAN'T REBOOT NOW, HAVE HIM TRY AGAIN ISZ RSTFLG /SET FLAG, WE'RE ABOUT TO REBOOT REINIT, CAL /READ INIT CODE BACK INTO OS8F0 SENDW OSSYSD RELOAD TAD RBSTAT /READ OK? SZA CLA /SKIP IF YES JMP SYOOPS /PRINT MESSAGE TAD (200 /CHECK SPECIAL WORDS IN IMAGE JUST READ IN DCA RBSTAT /OK AS TEMPOERARY TAD (-4601 /200,201 HAVE 4601,7777 CDF OS8F0 /GET DATA FROM INIT FIELD TAD I RBSTAT SZA CLA /SKIP ONLY IF MADE 0 JMP SYOOPS /GO TRY AGAIN ISZ RBSTAT /CHECK NEXT ISZ I RBSTAT /MUST SKIP TO BE OK JMP SYOOPS CDF CIF OS8F0 TAD REALOS /SEND AC TO SAY WHICH BOOT! JMP I (BSTART /START BOOT RELOAD, ZBLOCK 3 0 RPAGES, 0 /FILLED BY INIT CODE 0 RBLOCK, 0 /FILLED BY INIT CODE RBSTAT, 0 MASST, 0 / / / PRINT REBOOT. MESSAGE / SYOOPS, CDF .FLD TAD (SYMSG DCA MASST SYLOOP, TAD I MASST SPA JMP ERRWAT /WAIT UNTIL A BOOT RETRY JMS I (XTLSUB ISZ MASST /NEXT WORD JMP SYLOOP / ERRWAT, CLA IAC /AC GARBAGE COMING IN DCA MASST /SET UP EVENT FLAG FOR WAIT TAD REALOS /OUCH, SET RSTFLG TO MATCH REALOS, DOES BOTH DCA RSTFLG /CASES CORRECTLY, REALOS ERROR IS FATAL. CAL WAITE LMASST, MASST JMP ERRWAT /CONTROL Y TAKES US DIRECTLY TO REINIT; IF WE FELL / /TO THIS JUMP, WE HAVE A PROBLEM / / REINSTALL GETFLD ROUTINE / IFZERO KT8A < / GETFLD, 0 /ENTER WITH VIRTUAL FIELD, MAKE CDF TO REAL ONE TAD (-MAXVIR /CHECK VERSUS FIRST ILLEGAL FIELD SPA /SKIP MUST WRAP IT BACK TO ZERO JMP NOWRAP /WITHIN LEGAL SPACE, JUST DELIVER CDF IN AC CLA /FORCE ALL ILLEGALS TO CDF 0 TAD (-MAXVIR /MAKE NEXT TAD GIVE CDF 0 NOWRAP, TAD (NFLDS^10+6201 /CANCEL -MAXVIR; ADD IN CDF OS8F0 JMP I GETFLD > IFNZRO KT8A < .FSECT OSXYZ, LEVEL=0 FIELD OS8T IFDEF OS8F < /HAS TO FIT HERE WHEN FILES PRESENT CHKCDF, TAD I PC /ARE WE DOING A CDF TO FIRST ILLEGAL FIELD? TAD (-VFNCDF /THE VALUE OF THE CDF SZA CLA /SKIP IF YES JMP XNOP /FUNNY IOT IS TREATED AS A NOP TAD GTSWRD /FORCE DF BACK TO VIRTUAL 0, TO BE DISCUVERED AND (7170 /BY SIZING ROUTINE !! TAKE AWAY DATA FIELD TAD (DFORM /PUT IN DATA FIELD TO VIRTUAL 0 DCA GTSWRD /ON EXIT THE RTS FORCES IN DATA FIELD JMP XNOP / OVRFLW, TAD GTSWRD /FOR RETURN FIELD, FORCE IF TO BE EQUAL TO DF! AND (4707 /TAKE OUT THE OLD IF DCA UCIF /HOLD THAT TAD GTSWRD /NOW EXTRACT DF RACB /ALSO STRIPPING EXTRA BITS TAD UCIF /MERGING TOGETHER, NEW GTSWRD IN AC JMP HNDRET > / OSDISP, TAD LITXX /JUMP CODE IN AC CDF .FLD /ROUTINES WANT OUR FIELD IN GENERAL DCA .+1 HLT /DISPATCH LITXX, JMP I OSVECT / / DISPATCH TABLE / / EACH OF THE IOT GROUPS LINE PRINTER, TELEPRINTER, KEYBOARD HAS A GROUP / OF FOUR DISPATCH ADDRESSES. ADDITIONAL GROUPS OF FOUR CAN BE ADDED / FOR ADDITIONAL DEVICES. WITHIN EACH GROUP, DISPATCHES ON THE LAST / OCTAL DIGIT OF THE IOT ARE IN THE ORDER 6,4,2,1! THE FACT THAT / OSVECT IS AT TABLE+3 IS A COMPUTATIONAL ARTIFACT. / XLLS /LINE PRINTER GROUP ILLIOT /CODES 4 AND 2 NOT SUPPORTED ILLIOT OSVECT, XLSF /LINE PRINTER SKIP XTLS /TELEPRINTER GROUP ILLIOT XTCF XTSF XKRB /KEYBOARD GROUP XKRS XKCC XKSF > .DSECT OSD, LEVEL=0 FIELD OS8T / / /TABLE OF CORRESPONDENCES BETWEEN OS/8 CODE NUMBER AND TASK NUMBER HNDTAB, ZBLOCK 20 /FIRST WORD IS UNUSED - MUST BE 0 IFDEF OS8F < IFZERO KT8A < IOTLST, -RDF; XRDF /FITS HERE WHEN OS8F -RIF; XRIF -KSF; XKSF -KCC; XKCC -KRS; XKRS -KRB; XKRB -TSF; XTSF -TCF; XTCF -TLS; XTLS -PSLS; XLLS -PSKF; XLSF /USED TO BE XSKP, WRONG -6000; HCALL 0 > LOKTAB, ZBLOCK 15 > IFDEF LPT < LPMESG, ZBLOCK 3 6000 /UNPACKED ASCII, NO CRLF 0 /DUMMY INPUT BUFFER WORD LPTBUF, ZBLOCK LPTCNT+1 /ASSURE A ZERO AT THE END > ILIOMS, 15;12 ZBLOCK OSFILL /WATCH GARBLING! "H;"A;"L;"T;" ;"A;"T;" ;4600 SYMSG, "B;"O;"O;"T;" ;"E;"R;"R;15;12; ZBLOCK OSFILL 4000 / OS/8 INITIALIZATION CODE - CREATES FAKE SYSTEM HEAD /AND ESTABLISHES RELATIONSHIP BETWEEN OS/8 DEVICE HANDLER NAMES /AND RTS-8 DRIVERS .ASECT OS8EXT, LEVEL=0 FIELD OSBASE *0 0 *17 0 .ASECT OS8INI, LEVEL=0 FIELD OSBASE *26 /MAKE LINKER THINK IT'S FULL 0 *7577 0 IFZERO OSBASE-3&4000 < /KEEP LINKER OUT OF TOP PAGE *7777 0 > *200 /KEEP CONTIGUOUS DISK LOAD FOR THIS FIELD / / FIRST TIME ONLY CODE / / CHECK TIMESHARE TRAP, ERROR MESSAGE IF MISSED / FIND OUT WHERE THIS CODE LIVES ON DISK, ALSO A CONTROL Y / RELOADS IT, SO WE CAN REINIT THE VIRTUAL MONITOR HEADS. / 4601 /CHECKSUM WORDS FOR READIN CODE 7777 /LEAVE THEM ALONE / INITOS, SMA CLA /SKIP ON MINUS, TRAP CHECK OK JMP NOTRAP /TIMESHARE TRAP NOT ENABLED, ERROR MESSAGE IFNDEF LPT < IOF PSIE /DISABLE LS8E INTS, ENABLE LE8 INTS PCIE /DISABLE LE8 INTS, NOP ON LS8E (I HOPE) ION > IFNZRO KT8A < TAD (OSFLDS /INIT BASE AND LIMIT REGISTERS LUSR TAD (OSBASE LRR > CDF 0 /GET DISK BLOCK OF IMAGE FROM REAL HEAD TAD I (7747 CDF OS8F0 /POINT BACK HERE DCA IRBLOK /SAVE TO READ HEADER BLOK CAL SENDW OSSYSD IRSCAN TAD IRSTAT SZA CLA JMP DEAD /AN ERROR HERE IS 99.8% FATAL, MAKE IT FATAL AC4000 /POINT TO BLOCK JUST READ DCA NOTT TAD I NOTT /GET COUNT OF LOAD SEGMENTS CLL RAL /FORCE TOP BIT TO ONE, FOUND A 0 THERE!! CLL CML RAR DCA NOTC /SAVE FOR CONTROL TAD (4 /MOVE POINTER TO ACTUAL CONTROL PAIRS TAD NOTT DCA NOTT ISZ IRBLOK /MOVE DISK BLOCK POINTER TO FIRST DATA SCANL, TAD I NOTT /CORE ADDR FOR LOAD ISZ NOTT /MOVE POINTER TO NEXT OF PAIR SZA CLA /SKIP IF 0, WHICH OURS IS JMP MISSED /NON0, NOT US TAD (-XF0 /CHECK IF IT IS OUR FIELD TAD I NOTT /BRING UP PAGES-FIELD WORD AND (77 /CHECK IS ONLY ON LOW HALF SNA CLA /SKIP IF MISSED JMP SCORE /GOT IT, GO REMEMBER IT MISSED, TAD I NOTT /PUDATE DISK POINTER BY AMOUNT CLL RTR /FOR THIS LOAD RTR RTR AND (37 SNA /CHECK FOR 0 PAGES=40 CASE TAD (37 IAC /ROUND UP FOR HALF PAGES CLL RAR TAD IRBLOK /UPDATE DISK POINTER DCA IRBLOK ISZ NOTT /MOVE POINTER TO FIRST OF NEXT PAIR ISZ NOTC JMP SCANL JMP DEAD /IMPOSSIBLE SCORE, TAD I NOTT /GET DISK CONTROL WORD CDF OS8T /PLACE IN ^R CODE DCA I (RPAGES TAD IRBLOK DCA I (RBLOCK /AND ALSO BLOCK # CDF OS8F0 /POINT BACK HERE JMP BSTART /GO DO REST OF INIT / MSGSUB, 0 /PRINT AN ERROR MESSAGE DCA NOTT /PLACE ADDR OF MESSAGE MSGL, AC4000 /MESSAGE MUST TERMINATE WITH 4000 TAD I NOTT /BRING IN NEXT CHAR SNA JMP I MSGSUB /DONE CIF OS8T /FIELD FOR XTLSUB JMS XTLSUB ISZ NOTT /NEXT JMP MSGL IFNZRO KT8A < NOTT, 0 /STILL NEED THESE TEMPORARIES NOTC, 0 NOTRAP, JMP DEAD /IMPOSSIBLE ERROR > IFZERO KT8A < NOTRAP, TAD (TRPMSG /GET MESSAGE POINTER JMS MSGSUB /GO TO MESSAGE PRINTER CAL SUSPND JMP NOTRAP / NOTT, 0 NOTC, 0 > / IRSCAN, ZBLOCK 3 0 XF0+200 /TWO PAGES TO VIRTUAL FOELD 0 4000 IRBLOK, 0 IRSTAT, 0 / PAGE / / / READ SYSTEM HEADS FROM DISK / BSTART, DCA BEXIT /REAL OR VIRTUAL? TAD BEXIT /IF VIRTUAL READ HEAD 0, IF REAL NOT NECESSARY SZA CLA /SKIP IF VIRTUAL JMP BRNG1 /REAL, SO JUST GO TO SECOND READ CAL SENDW OSSYSD RDHD0 /HEAD 0 DIRECTLY TO PLACE TAD RDHD0S /CHECK IF OK SZA CLA /SKIP IF OOK JMP BOTERR /ERROR, MESSAGE OUT / / GET HEAD FOR FIELD 1 / BRNG1, AC7775 /ONE OR TWO PAGE SYSTEM HANDLER CDF 0 /REAL HEAD TAD I (7612 /MAGIC HANDLER LOCATION 3 FOR TWO PAGER CDF .FLD /BACK HERE (NECESSARY?) SNA CLA /SKIP IF ONE PAGER TAD L66 /TWO PAGE READS FIELD 1 FROM BLK 66 DCA BLK1 /STUFF INTO CAL BLOCK TAD BEXIT /NOW, REAL OR VIRTUAL SNA CLA /SKIP ON REAL TAD (XF1-10 /VIRTUAL FIELD DESIGNATOR TAD (110 /READ ONE PAGE TO REAL FIELD 1 DCA FLD1 /AGAIN TO CAL CAL SENDW OSSYSD RDHD1 TAD RDHD1S /ERROR? SZA CLA JMP BOTERR /YES / / VIRTUAL BOOT LEAVES ON NEXT TEST / TAD BEXIT SNA CLA /SKIP IF REAL BOOT JMP BSTRT1 AC7775 /ONE OR TWO PAGE SYSTEM HANDLER CDF 0 /REAL HEAD TAD I (7612 /MAGIC HANDLER LOCATION 3 FOR TWO PAGER CDF .FLD /BACK HERE (NECESSARY?) SZA CLA /SKIP IF NEED TWO PAGER JMP NOBAT /DON'T CAL /READ TO TOP OF FIELD 2 SENDW OSSYSD RDHD2 TAD RDHD2S /ERROR? SZA CLA JMP BOTERR NOBAT, CDF RTS8 /GO FETCH EXIT POINT TAD I (OSBOOT DCA BCOUNT /SAVE HERE FOR INDIRECT TAD I (DATE /GRAB DATE WORD FROM RTS8 CDF 10 /TO REAL HEAD 1 DCA I (7666 CDF RTS8 /EXTENDED WORD TAD I (YEAR AND (30 CLL RTL RTL DCA BPOINT /SAFE TEMP CDF 0 /ACCESS HIGH ORDER DATE AND BATCH TAD I (7777 AND (5177 /CLEAR OLD DATE, ZAP BATCH!! TAD BPOINT DCA I (7777 BEXIT, 0 /CDF CIF TO OS REBOOT CALLER JMP I BCOUNT / / / CAL BLOCKS / RDHD0, ZBLOCK 3 0 200+XF0 /TWO PAGES TO PLACE LAST PAGE VIRTUAL FIELD 0 7400 /TO LOCATION 7600 0 /BLK #0 BCOUNT, RDHD0S, 0 /STATUS WORD RDHD1, ZBLOCK 3 0 FLD1, 0 7600 BLK1, 0 BPOINT, RDHD1S, 0 /STATUS RDHD2, ZBLOCK 3 0 220 7400 L66, 66 RDHD2S, 0 / PAGE / / / BOOT AND REBOOT CODE ON THIS PAGE / FKHND1, FAKHND FKHND2, 7607 FKHNDC, FAKHND-FAKEND IPOINT, 0 IPOIN1, 0 ICOUNT, 0 L7600, 7600 FAKHND, /FAKE SYSTEM HANDLER, MUST START ASSEMBLY AT 7 OF PAGE .REPT 17 /17 (8) ENTRIES AND ONE MORE JMS ZZ .ENDR Z20, JMS ZZ /EXECUTE THIS IF BLAST LAST ENTRY (ALSO LITERAL) ZZ, 0 /POINT TO ENTRY +2, AFTER JMS CLA /JUST IN CASE TAD ZZ /WARNING, CAN'T DO INDIRECTS HERE, DF TO ARG. FIELD! TAD L1376 /MAKE TAD ENTRY POINT DCA ZXX /PLACE IN LINE AC2000 /MAKE DCA ENTRY POINT TAD ZXX DCA ZXY /PLACE IN LINE ZXX, 0 /TAD ENTRY POINT DCA KPOINT /PLACE ARG. ADDR IN CALL TO HCALL TAD Z20 /REFURBISH BLASTED ENTRY ZXY, 0 /DCA ENTRY POINT TAD ZZ /MAKE HANDLER NUMBER +1 !!!! IN AC TAD L170 /FOR CALL 6000 /THIS IOT GOES TO HCALL KPOINT, 0 /POINTER TO ARG LIST HERE L1376, 1376 /LITERALS L170, 170 FAKEND=. / / PUT SPECIAL BITS IN HEADS, WIRE IN SPECIAL HANDLER / / BSTRT1, CDF RTS8 /BRING DATE FROM RTS8 TO HERE TAD I (DATE CDF OS8F1 /REGULAR DATE WORD DCA I (7666 CDF RTS8 /NOW GET EXTENDED DATE TAD I (YEAR /YEAR CONTAINS YEAR-1970 AND (30 /OS8 CAN ONLY TAKE 2 BITS ABOVE 1978 CLL RTL RTL /PUT IN POSITION TO MERGE WITH OTHER STUFF DCA IPOINT /SAVE IT FOR NOW CDF OS8F0 TAD I (7777 /CLEAR OUT THE OS/8 AND (4107 /BATCH IN PROGRESS FLAG TAD (OSFLDS-1^10+1000 /BIT 2 ON TELLS OS/8 THAT RTS-8 IS RUNNING TAD IPOINT /IN GOES THE DATE DCA I (7777 /AND SOFTWARE CORE SIZE CDF RTS8 TAD (TSINT DCA I (TS8LOC /SET UP TSS/8 "TRAP VECTOR" IN RTS-8 EXEC DCA JSBITS /MAKE SURE CORE IS SAVED WHEN WE CALL THE USR CDF OS8F0 TAD FKHND1 /INIT POINTERS AND COUNTER DCA IPOINT TAD FKHND2 DCA IPOIN1 TAD FKHNDC DCA ICOUNT IMLOOP, TAD I IPOINT DCA I IPOIN1 /MOVE THE RTS-8 FAKE SYSTEM HANDLER INTO PLACE ISZ IPOINT ISZ IPOIN1 ISZ ICOUNT JMP IMLOOP RDUSR, CAL /READ IN USR TO VIRTUAL FIELD SENDW OSSYSD RDUSRM TAD RDUSST SZA CLA JMP BOTERR /BOOTING ERROR, TYPE MESSAGE IFDEF LPT < CDF OS8T /IF A LINE PRINTER, INIT IT DCA I (LPMESG /EVENT FLAG TAD (LPTBUF /POINTER DCA I (LPBUF TAD (-LPTCNT DCA I (LPBUFC CDF OS8F0 /POINT BACK HERE > JMP INIHNL / / RDUSRM, ZBLOCK 3 0 600+XF1 /READ 6 PAGES TO VIRTUAL FIELD 1 0 13 /FROM BLOCK 13 RDUSST, 0 / / ERROR MESSAGE FOR DISK ERROR AT INIT TIME / BOTERR, CDF CIF OS8T /GO TO ERROR, RETRY IN BASE CODE JMP SYOOPS / PAGE /LOOP WHICH RELATES OS/8 AND RTS HANDLERS ASTBPT= 36 INIHNL, TAD (HTBL-1 /INIT POINTER DCA HPTR INIHN2, CDF OS8F0 ISZ HPTR TAD I HPTR /GET NEXT HANDLER NAME SNA JMP ASDONE /NO MORE ISZ HPTR TAD I HPTR /ADD IN SECOND WORD DCA ASNAM1 /SAVE SUM TAD I HPTR /LOOK AT SECOND WORD AGAIN SNA CLA /IS IT ZERO? JMP .+5 /YES TAD ASNAM1 /NO RAL /FORCE BIT 0 TO A 1 STL RAR DCA ASNAM1 /TO GET INTERNAL FORM OF NAME ISZ HPTR CDF OS8F1 /DF TO FAKE FIELD 1 TAD I (ASTBPT /GET POINTER INTO NAME TABLE DCA OSPTR TAD (-17 DCA OSCNT /17 ITEMS IN TABLE OSHNLP, TAD ASNAM1 CIA TAD I OSPTR SNA CLA /FOUND IT? JMP OSHNFD /YES ISZ OSPTR /NO, POINT TO NEXT ITEM ISZ OSCNT /DONE? JMP OSHNLP /NO, KEEP SEARCHING JMP INIHN2 /YES, TRY NEXT NAME OSHNFD, TAD OSCNT TAD (20 DCA ASNAM2 TAD ASNAM2 TAD (OS8HND-1 DCA HNDPTR /GET POINTER INTO RESIDENT HANDLER TABLE TAD ASNAM2 TAD (HNDTAB DCA HTBPTR /AND EQUIVALENT PTR INTO RTS-8 TABLE CDF OS8F1 TAD (7606 TAD ASNAM2 /ASSIGN ONE OF THE 17 ENTRY POINTS IN THE DCA I HNDPTR /FAKE SYSTEM HANDLER TO THIS DEVICE CDF OS8F0 TAD I HPTR /GET THE RTS-8 TASK AND UNIT NUMBER CDF OS8T DCA I HTBPTR /MAKE THE CORRESPONDING ENTRY IN THE /OS8 SUPPORT TASK TABLE JMP INIHN2 /GET THE NEXT HANDLER ASDONE, CDF OS8T /INIT TELETYPE CONTROLLING REGISTERS DCA I (OWCNT DCA I (IRCNT TAD (IRBASE DCA I (IRGET TAD (IRBASE DCA I (IRPUT TAD (OWBASE DCA I (OWGET TAD (OWBASE DCA I (OWPUT DCA I (TSFEF CLA IAC DCA I (KSFEF CDF OS8F0 IFDEF DDCMP < TAD (DDCMP CAL RUN /RUN DDCMP AFTER INITIALIZATION > CIF CDF OS8T DCA I (RSTFLG /CLEAR REBOOTING FLAG! JMP STKBMN /JMP, JMS NOT NECESSARY / DEAD, TAD (DEDMSG /IMPOSSIBLE ERROR JMS MSGSUB /GO DO ERROR MESSAGE DEDEND, CAL SUSPND JMP DEDEND /DON'T LET GO!! / HTBPTR, 0 HNDPTR, 0 ASNAM1, 0 ASNAM2, 0 OSCNT, 0 OSPTR, 0 HPTR, 0 / / MESSAGE FOR KILLING ERROR / DEDMSG, "F;"A;"T;"A;"L;" ;"B;"K;"G;" ;"E;"R;"R;15;12; ZBLOCK OSFILL 4000 PAGE /DEVICE CORRESPONDENCE TABLE HTBL, DEVICE SYS OSSYSD^40 DEVICE DSK OSSYSD^40 IFDEF DF32 < DEVICE DF DF32^40 > IFDEF RF08 < DEVICE RF RF08^40 > IFDEF DTA < DEVICE DTA0 DTA^40+0 DEVICE DTA1 DTA^40+1 DEVICE DTA2 DTA^40+2 DEVICE DTA3 DTA^40+3 DEVICE DTA4 DTA^40+4 DEVICE DTA5 DTA^40+5 DEVICE DTA6 DTA^40+6 DEVICE DTA7 DTA^40+7 > IFDEF RK8 < DEVICE RKA0 RK8^40+0 DEVICE RKB0 RK8^40+4 DEVICE RKA1 RK8^40+1 DEVICE RKB1 RK8^40+5 DEVICE RKA2 RK8^40+2 DEVICE RKB2 RK8^40+6 DEVICE RKA3 RK8^40+3 DEVICE RKB3 RK8^40+7 > IFDEF RK8E < /ALTERNATE NAME! DEVICE RKA0 RK8E^40+0 DEVICE RKB0 RK8E^40+4 DEVICE RKA1 RK8E^40+1 DEVICE RKB1 RK8E^40+5 DEVICE RKA2 RK8E^40+2 DEVICE RKB2 RK8E^40+6 DEVICE RKA3 RK8E^40+3 DEVICE RKB3 RK8E^40+7 > IFDEF LTA < DEVICE LTA0 LTA^40+0 DEVICE LTA1 LTA^40+1 DEVICE LTA2 LTA^40+2 DEVICE LTA3 LTA^40+3 DEVICE LTA4 LTA^40+4 DEVICE LTA5 LTA^40+5 DEVICE LTA6 LTA^40+6 DEVICE LTA7 LTA^40+7 > IFDEF RX8A < DEVICE RXA0 RX8A^40+0 DEVICE RXA1 RX8A^40+1 > IFDEF RX8B < DEVICE RXA2 RX8B^40+0 DEVICE RXA3 RX8B^40+1 > IFDEF RX8C < // DEVICE RXC0 /OS/8 DOESN'T KNOW ABOUT 3RD CONTROLLER // RX8C^40+0 // DEVICE RXC1 // RX8C^40+1 > IFDEF RX8D < // DEVICE RXD0 /OS/8 DOESN'T KNOW ABOUT 4TH EITHER // RX8D^40+0 // DEVICE RXD1 // RX8D^40+1 > IFDEF OS8COM < DEVICE RTS8 OS8COM^40 > IFDEF RL01 < DEVICE RL0A RL01^40+0 DEVICE RL0B RL01^40+10 DEVICE RL0C RL01^40+20 DEVICE RL1A RL01^40+1 DEVICE RL1B RL01^40+11 DEVICE RL1C RL01^40+21 DEVICE RL2A RL01^40+2 DEVICE RL2B RL01^40+12 DEVICE RL2C RL01^40+22 DEVICE RL3A RL01^40+3 DEVICE RL3B RL01^40+13 DEVICE RL3C RL01^40+23 > 0 TRPMSG, "U /PLACE HERE FOR PAGE FIT "S "E "R " "M "O "D "E " "T "R "A "P " "N "O "T " "E "N "A "B "L "E "D 15 12 ZBLOCK OSFILL 4000 /MESSAGE TERMINATOR