/IMP SUPERVISOR .LOC 0 JMP TB+2000 /->INITIALISATION JMP INT WT JMP Q5 /(WT) WAIT = JMP 2 RET 0 /(3) GUARD = JMS RET IOF DAC* ACAD JMP* RET 0 /(7) TIMER 0 /(10) NP 0 0 .IM 0 /(13) KB INT MESSAGE .NF 0 /(14) NEW FILE 0 /(15) DITTO 0 /(16) DITTO 0 /(17) DITTO /CAL ENTRY 0 /(20) CLC /(OR HLT!CLC) TAD 20; DAC 20 /DECREMENT AD LAC* 20 /PICK UP CAL INSTR SNA; JMP .LE /LOAD EXEC IF ZERO JMP ERR WC /(30) CA /(31) .SS .SIZE /(32) SUPER SIZE .MA 17777 /(33) MAX ADDRESS .SD 12000 /(34) SYS DEV (READ) .DG GAP /(35) DECTAPE GAP .LR 0 /(36) LINK R FLAG .LT 0 /(37) LINK T FLAG .TI TB /(40) TP INSERT POINTER .TE TB /(41) TP EXTRACT POINTER .TL 0 /(42) TP LIMIT POINTER .TK 0 /(43) TP CHAR .KE TB /(44) KB EXTRACT POINTER .KI TB /(45) KB INSERT POINTER .KL 0 /(46) KB LIMIT POINTER .KK 0 /(47) KB CHAR ESC 33 /(50) ESCAPE CHAR .FN 0 /(51) FAULT NUM .CS 0 /(52) CONTROL (INPUT) 0 /(53) CONTROL (OUTPUT) 0 /(54) CONTROL LIM .LO .SIZE /(55) LOW LIM .UL 0 /(56) USER LIBRARY .NL 12 /(57) NEWLINE /INTERRUPT INT EEM DAC* ACAD LAC 0; DAC* PCAD /STORE RETURN AD AND (77770; SNA; JMP Q5 /CAUGHT OFF GUARD -> JMS PCAD /SET UP PC POINTER PC1 6000; Q9; Q9 PCAD PC1 JMS ACAD /SET UP AC POINTER AC1 0; 0; 0 ACAD AC1 LAC PC1; DAC RET /PREPARE FOR RETURN /DEVICE CASCADE JMP* .DT .DT .+3; JMP Q0; JMS .DT /DECTAPE JMP* .CR .CR .+3; JMP Q0; JMS .CR /CARD-READER RSF1; JMP C1 /LINK RECEIVER RCF1; ISZ .LR /SET DONE JMP Q0 C1 TSF1; JMP* .LP /LINK TRANSMITTER TCF1; DZM .LT /CLEAR BUSY JMP Q0 .LP .+3; JMP Q0; JMS .LP /LINE-PRINTER JMP* .PR .PR .+3; JMP Q0; JMS .PR /PAPER-TAPE READER JMP* .PP .PP .+3; JMP Q0; JMS .PP /PAPER-TAPE PUNCH KSF; JMP C4 /KB FLAG LAC BUSY; SZA /IF TP ACTIVE LAW -6000; DAC BUSY /SET DELAY LAC RET; SNA!CLL; CML /SET LINK IF RET 0 KRB; AND (177 DAC .KK SAD ESC; JMP C3 /ESCAPE -> SNL; JMP* .KB /NOT AFTER ESC => DAC .IM /INTERRUPT MESSAGE SAD (15; JMP K26 /ESC CR -> LAC PC1; DAC RET /RESTORE RET CLA JMP* .KB C3 SZL; JMP K25 /DOUBLE ESC -> DZM RET LAC .TK; JMS TYPE /LF? LAW 77; JMS TYPE /'?' JMP Q0-1 C4 CLSF; SKP; CLSF!CLON /CLOCK TSF; JMP Q0 /TELEPRINTER ISZ BUSY; JMP Q0 TCF JMP* .TT .TT .+4; JMP Q0 /TELEPRINTER .KB K21; JMS .TT /KEYBOARD /RETURN AFTER INTERRUPT OR HANDLER CALL Q0 LAC RET Q3 SNA!RAL /RESTORE LINK JMP* .DT /HOWL AFTER ESC LAC* ACAD /RESTORE AC ION JMP* RET /WAIT Q5 CLC; TAD RET; DAC* PCAD /SET RETURN AD ISZ PCAD; ISZ ACAD /BUMP TO NEXT Q7 LAC* PCAD; DAC RET JMP Q3 Q9 JMP Q9 /LAST PROCESS /SYSTEM LOAD PROCEDURES .LS JMS SYSLD /LOAD SYSTEM 0; 4; -15000; 2000 JMP 2000 ERR DAC .FN /SET FAULT NUM .LL JMS SYSLD /LOAD LOADER FOR DIAG 0; 10; -2000; 4000 JMP 4000 .LE JMS SYSLD /LOAD EXECUTIVE (AND LOADER) 0; 10; -13000; 4000 JMP 6000 .LC JMS SYSLD /LOAD COMPILER 0; 40; -14345; 3400 JMP* .-1 SYSLD S1 LAC .SD; DAC* SYSLD /SYS DEV (READ) LAC SYSLD /PARAMETER AD JMS RET; JMP .DH /CALL DT HANDLER LAC* SYSLD /FINISHED? SMA!SZA; JMP .-2 /NO -> SMA!CMA; JMP S2 /OK -> JMS RET; JMP .MH /REPORT ERROR JMP S1 S2 LAC SYSLD; TAD (4 /BUMP PAST DAC SYSLD /PARAMETERS JMP* SYSLD /TELETYPE BUFFER [+INITIALISATION] TB CAF; EEM; IOF; EBA LAC 2000; DAC 0 /COPY DOWN SUPER ISZ TB+2004; ISZ TB+2005 ISZ TB+2013; JMP TB+2004 JMP V1 -2000 V1 NOP; NOP; NOP; NOP LAW 15; JMS OUT /CR LAW 12; JMS OUT /LF LAW 12; JMS OUT /LF LAW 12; JMS OUT /LF LAW 111; JMS OUT /'I' LAW 115; JMS OUT /'M' LAW 120; JMS OUT /'P' CLL!CLA /PDP9(7) OR PDP15? RAL!RAR; SZA; JMP .+4 /15 (HAS IAC) -> .IFUND PDP7 LAW 71; JMS OUT /'9' .ENDC .IFDEF PDP7 LAW 67; JMS OUT /'7' .ENDC JMP .+5 LAW 61; JMS OUT /'1' LAW 65; JMS OUT /'5' LAW 15; JMS OUT /CR LAW 12; JMS OUT /LF NOP; NOP; NOP; NOP JMP Q7 OUT TLS; TSF; JMP .-1; TCF JMP* OUT .LOC TB+122 /82 [10] /TYPE CHAR .TS TB-1;.TM TB+121 POS;BUSY;TWL;KE1;LAST TYPE SNA; JMP* TYPE DZM .TK; DAC TWL LAC BUSY; SPA; JMS .TT /WAIT IF BUSY LAC TWL; TLS /SEND CHAR SAD (15; DZM POS /ZERO POS IF CR AND (140 /CONTROL? SZA!CLC; ISZ POS /INC POS IF NO DAC BUSY /SET BUSY JMP* TYPE NL LAC (15; JMS TYPE /CR LAC (12; DAC .TK /LF JMP* NL /KEYBOARD HANDLER .KH SZA; JMP .TH /PROMPT OR ENABLE -> LAC .KE /UP TO LIMIT? SAD .KL; JMP Q5 /YES => WAIT ACC ISZ RET /ACCEPT SAD .KI; JMP K2 /BUFF EMPTY & KB IDLE -> SAD .TM; LAC .TS /WRAP IF NECESSARY TAD (1; DAC .KE /INCREMENT LAC* .KE; DAC* ACAD /PUT CHAR IN 'AC' JMP Q0 /=> K1 DZM .TK; DZM LAST K2 DZM .TI; DZM .TL /LOCK TP K3 LAC .KI; DAC .KL /SET KB LIMIT K4 LAC .KI SAD .TM; LAC .TS /WRAP IF NECESSARY TAD (1 SAD .KE; JMP K18 /BUFF FULL -> DAC .KI LAC .TK /PENDING CHAR? K5 JMS TYPE K6 JMS .KB SAD (177; JMP K10 /RUBOUT -> SAD (25; JMP K11 /CONTROL+U -> SAD (15; JMP K12 /CR -> DAC* .KI SAD (12; JMP K1 /LF -> AND (140 /CONTROL? SNA; JMP K18 /YES -> ISZ POS JMP K4 K10 CLC; TAD .KI /CANCEL LAST CHAR SAD .TS; LAC .TM SAD .KL; JMP K6 /IF ANY DAC .KI LAW 134 /BACK-SLASH JMP K5 /-> ECHO K11 LAW 100; JMS TYPE /AT-SIGN JMS NL; JMS TYPE /NEWLINE LAC LAST; SPA; DAC .TK /PROMPT? LAC .KL; DAC .KI JMP K4 K12 LAC .NL; DAC* .KI SKP K15 ISZ MESS /JOG MH (IF RELEVANT) LAC (12; DAC .TK /PENDING LF DZM POS K18 DZM .KK; DZM LAST K19 LAC .KI; DAC .TI /RESET TP POINTERS DAC .TE LAC .KE; DAC KE1 DZM .KL; DZM .TL /UNLOCK KB AND TP /KB IDLE K20 JMS .KB K21 SAD (12; JMP K1 /LF -> SAD (15; JMP K15 /CR -> JMS NL /NEWLINE LAC .TL /TP ACTIVE? SZA; JMP T4 /YES -> JMP K20 /DOUBLE ESCAPE AND ESC CR K25 DZM ESC LAC (.LS; JMP K27 /FORCE SYSTEM RELOAD K26 DAC .FN /FAULT 13[10] LAC PC1; DAC 20 /SIMULATE CAL AND (74000; SZA; LAW -6 TAD (.LE K27 DAC RET CLC; DAC TRY /NO RETRY IF DT ACTIVE LAC ACC; DAC .MH /UNLOCK (ISZ RET) DAC POS /DELAY ISZ POS; JMP .-1 JMP K15 /TELEPRINTER HANDLER .TH LAC .TI SAD KE1; LAC .KI /HOP OVER KB PART SAD .TL; JMP Q5 /LOCKED => WAIT ISZ RET /ACCEPT SAD .TM; LAC .TS /WRAP ROUND TAD (1; DAC .TI LAC* ACAD; DAC* .TI T1 LAC .KI /HANDLER ACTIVE? SAD .KL; JMP Q0 /YES => DAC .KL /SET ACTIVE AND LOCK KB T3 LAC .TE /BUFF EMPTY? SAD .TI; JMP K19 /YES -> SAD KE1; LAC .KI /HOP OVER KB PART DAC .TL /SET LIMIT SAD .TM; LAC .TS /WRAP ROUND TAD (1; DAC .TE T4 LAC .KK /IGNORE OUTPUT? SNA; JMP T5 /NO -> SAD (40; LAC .NL /NL FOR SP XOR* .TE; SMA!SZA; JMP T3 /NO MATCH -> DZM .KK LAC* .TE; SAD .NL; JMP T3 /NL -> T5 LAC* .TE; AND (140 /CONTROL? SNA; JMP T6 /YES -> LAW -110; TAD POS /72 CHARS? SMA; JMS NL /NEWLINE T6 LAC .TK; JMS TYPE /PENDING LF? LAC* .TE SAD (400000; JMP K2 /INPUT ENABLE -> DAC LAST AND (177 SAD .NL; JMP T8 /NL -> JMS TYPE JMP T3 T8 JMS NL JMP T3 /MESSAGE OUTPUT SR MI;MJ;MK .MH ISZ RET /OR WAIT DAC M1+1 /DEVICE LAC WT; DAC .MH /LOCK LAC RET; DAC MI /SET EXIT AD JMS MESS M1 .SIXBT '@@?*** NOT READY ;' JMP* MESS /WAIT FOR CR LAC ACC /(ISZ RET) IOF; DAC .MH; ION /UNLOCK JMP* MI MESS M5 LAC* MESS; DAC MJ ISZ MESS LAW -3; DAC MK /3 6-BIT CHARS M6 LAC MJ; SMA!CLL; STL /RESTORE 7TH BIT RTL; RTL; RTL; DAC MJ RAL; AND (177 SAD (100; JMP M7 /'@' -> SAD (73; JMP* MESS /';' => SAD (77; LAW 40 /ENSURE PRINTING JMS RET; JMP .TH /TYPE CHAR M7 ISZ MK; JMP M6 JMP M5 /BUFFER GET AND PUT .BL;BJ .BU SZA; JMP B5 /AD IN AC -> RELEASE LAC .BL /BUFFER LIST EMPTY? SZA; JMP B3 /NO -> LAC .LO; DAC BJ /BUFFER AD = LOW TAD (400; DAC .LO /UPDATED LOW CMA; TAD 10 /LESS THAN NEST P? SMA; JMP B4 /YES -> ISZ 0; JMP .-1 /LET I/O STOP CAL 4 /BUFF AREA FULL B3 DAC BJ /BUFFER AD LAC* .BL; DAC .BL /UPDATE LIST B4 LAC BJ /EXIT WITH AD JMP* .BU B5 DAC BJ /ADD AD TO LIST LAC .BL; DAC* BJ LAC BJ B8 DAC .BL LAW -400; TAD .LO /RECLAIMABLE? SAD .BL; SKP; JMP* .BU /NO => DAC .LO /ADJUST LOW LAC* .BL JMP B8 /DECTAPE HANDLER U0 0; 0; 0; 0; 0; 0; 0; 0 DA;DB;U;SEEK;TRY .DH ISZ RET /OR WAIT DAC DA /*1ST OF 4 PARAMETERS LAC WT; DAC .DH /LOCK LAW -2; DAC TRY /TRY TWICE D1 LAC DA; TAD (1; DAC DB /*REQD BLOCK LAC* DA; AND (16007 /FUNCTION+UNIT SAD* DA; SNA; JMP D9 /INVALID -> AND (7; DAC U /UNIT .IFDEF DISK RCR; SNL; LAS /EVEN UNIT & SW0 SET? SPA; JMP DK1 /YES -> DISK LAC U .ENDC TAD (U0; DAC CA /*UNIT SLOT LAC (CLL; DAC Q /CLL IF REV LAC* DB SMA!RAL; ISZ Q /CLL!CMA IF FWD .IFUND PDP7 REVBIT=40000;MINGAP=3;GAP=5 LAC U; RTR; RTR /UNIT+DIRECTION XOR (21600; DAC SEEK /GO+SEARCH+ENABLE+CLEAR EF DTCA /CLEAR DT CONTROL .ENDC .IFDEF PDP7 REVBIT=20;MINGAP=10;GAP=10 LAC (41 /SEARCH FWD SZL!CLL; XOR (REVBIT DAC SEEK LAC U; SNA!RTR; TAD (2 /ZERO TO EIGHT RTR; RTR; RAR MMSE; DZM DTCON LAC* DB; DAC DTBLK# .ENDC LAC* CA /CURRENT POSN (APPROX) Q CLL!CMA; TAD* DB /REL TO REQD BLOCK LAC SEEK D2 SZL; JMP D6 /DIRECTION OK -> D3 XOR (REVBIT D4 JMS ACT /BACK OFF SZL; JMP D5 /EOT -> LAC* CA; XCT Q; TAD* DB /DIFFERENCE - 1 SPA!SNA!CLA; JMP D4 /-> KEEP GOING D5 XOR (REVBIT D6 JMS ACT /HOME IN SZL; JMP D3 /EOT -> LAC* CA; XCT Q; TAD* DB TAD (1 SZA!CLA; JMP D2 /-> KEEP GOING LAW -MINGAP-1; XCT Q /THIS IS IT ADD* CA; DAC* CA /POSN FOR NEXT TIME ISZ DB /*WORD COUNT LAC* DB; DAC WC SMA!CLC; JMP D7 /SEARCH ONLY -> ISZ DB /*BUFF START TAD* DB; DAC CA /CA = BUFF-1 .IFUND PDP7 LAC* DA; XOR (1000 /CHANGE FROM SEARCH JMS ACT /PERFORM TRANSFER D7 DZM* DA /ZERO TO SIGNAL DONE D8 DTRA; AND (20400; DTXA /STOP UNIT .ENDC .IFDEF PDP7 JMS DTTFER D7 DZM* DA /ZERO TO SIGNAL DONE D8 MMLC+10 /STOP UNIT .ENDC D9 LAC ACC; DAC .DH /UNLOCK (ISZ RET) JMP .DT+2 /==> SYSTEM D10 LAC U; XOR (735317 /COMP(DTU) DAC* DA /TO INDICATE ERROR XCT 21 /HALT? JMP D8 .IFDEF DISK /DISK HANDLER DK0 1000; 2000; 3000; 0000 /FOR DT0,DT2,DT4,DT6 DK1 LAC U; RCR TAD (DK0; DAC CA LAC* DB; SPA; JMP D10 /REVERSE => ERROR TAD* CA /DISK BLOCK AD CLL; RTL; RTL /CONVERT TO WORD AD RTL; RTL; DLAL GLK; DLAH ISZ DB LAC* DB; DAC 36 SMA!CLC; JMP D7 ISZ DB TAD* DB; DAC 37 LAC* DA; AND (4000 SZA; LAC (2 TAD (3 DETC JMS .DT DSSF; JMP .DT+3 CLA; DSRS; DSCD SMA; JMP D7 JMP D10 .ENDC ACT .IFUND PDP7 XOR (200; DTXA /LEAVE EF (USUALLY) JMS .DT /WAIT FOR DEVICE DTRB SNA!RCL; JMP .DT+3 /NOT DT ==> SNL!RTL; JMP* ACT /OK (LINK CLEAR) => ISZ TRY; SKP; JMP D10 /NOT FIRST ERROR => SNL; JMP D1 /NOT EOT => RESTART LAC (20200 /GO+CLEAR EF JMP* ACT /(LINK SET) => .ENDC .IFDEF PDP7 /MODIFIED J.V.O. PDP7 DT HANDLER XOR DTCON; DAC DTCON MMLC /LOAD CONTROL JMS .DT /WAIT FOR DEVICE JMS DTFLAG; JMP .DT+3 /NOT DT => JMP A1 /DATA -> JMP DTEROR /BLOCK END -> ISZ TRY /ERROR SKP; JMP D10 /NOT FIRST -> MMRS; AND (40000 /EOT? SNA!STL!CLA; JMP D1 /NO -> JMP* ACT /=> (LINK SET) A1 MMRD; DAC* CA CLL JMP* ACT DTFLAG MMRS; AND (700000 SNA!RCL; JMP* DTFLAG ISZ DTFLAG JMP .-3 DTTFER /DATA TRANSFER NEXT ISZ DTCON /CONTROL WORD BECOMES READ LAC WC; DAC DTCNT# /WORD COUNT LAC* DA; AND (4000 /READ OR WRITE SZA; JMP DTW /WRITE LAC (DAC* CA; DAC DTRX LAC DTCON MMLC /LOAD CONTROL - READ JMS DTFLAG; JMP .-1 JMP .+3 /DATA -> JMP DTEROR /BLOCK END -> JMP DTEROR /ERROR -> MMRD; AND (77 /REV PARITY DAC DTCHK# DTRW JMS DTFLAG; JMP .-1 JMP DTTRD /DATA -> JMP DTTRB /BLOCK END -> JMP DTEROR /ERROR -> DTTRD MMRD /DATA FLAG ISZ CA DTRX DAC* CA /OR NOP XOR DTCHK; DAC DTCHK ISZ WC; JMP DTRW LAC (NOP; DAC DTRX JMP DTRW DTTRB JMS DTBCHK /BLOCK END FLAG MMRD /DATA WORD XOR DTCHK; LRS 6 /WITH FORWARD PARITY CHECK XOR DTCHK; LRS 6 XOR DTCHK; CMA AND (77 SZA; JMP DTEROR JMP BLKEND /BLOCK READ O.K. DTW CLC; DAC DTCHK /INITIALISE PARITY CHECK LAC (LAC* CA; DAC DTWX ISZ DTCON /CONTROL WORD BECOMES WRITE LAC DTCON MMLC /LOAD CONTROL - WRITE DTWW JMS DTFLAG; JMP .-1 JMP DTTWD /DATA -> JMP DTTWB; /BLOCK -> JMP DTEROR /ERROR -> DTTWD ISZ CA DTWX LAC* CA /OR CLA MMWR XCT DTWX XOR DTCHK; DAC DTCHK ISZ WC; JMP DTWW LAC (CLA; DAC DTWX JMP DTWW DTTWB JMS DTBCHK /CHECK FOR PREMATURE END LAC DTCHK; ALS 6 XOR DTCHK; ALS 6 XOR DTCHK; CMA AND (770000 MMWR /WRITE PARITY CHECK .DEC LAW -500 /500 MICROSEC DELAY .OCT TAD (7; SPA; JMP .-2 BLKEND LAC WC /MORE? ISZ DTBLK SMA; JMP* DTTFER /NO => LAC SEEK; DAC DTCON MMLC /FIND NEXT BLOCK JMS DTFLAG; JMP .-1 JMP .+3 /DATA -> JMP DTEROR /BLOCK END -> JMP DTEROR /ERROR -> MMRD; CMA; XCT Q SAD DTBLK; JMP NEXT JMP DTEROR DTBCHK 0 /CHECK FOR PREMATURE BLOCK END LAW -400; TAD WC SAD DTCNT; JMP* DTBCHK DTEROR NOP /CAN BE PATCHED TO HLT ISZ TRY JMP D1 JMP D10 .ENDC /IOT DEFINITIONS DTCA=707541;DTRA=707552;DTXA=707544 DTLA=707545;DTRB=707572 DLAL=707024;DLAH=707064;DETC=707047 DSSF=707001;DSRS=707262;DSCD=707242 MMRD=707512;MMWR=707504;MMSE=707644 MMLC=707604;MMRS=707612;MMDF=707501 MMBF=707601;MMEF=707541 RSF1=704101;RCF1=704104 TSF1=704001;TCF1=704002 TSF=700401;TCF=700402;TLS=700406 KSF=700301;KRB=700312 EBA=707764;EEM=707702 CLSF=700001;CLON=700044 .END