TFF [GO BACK [SUBROUTINE TO CLEAR FF BITS #CLFF ? [CORRESPONDING CMA [TO BITS IN AC WHEN ENTERING AND FFIM [THIS SUBROUTINE IACF [SET FF DCA FFIM JMP i CLFF [GO BACK [SUBROUTINE TO STORE DATA IN LINC MEM #WRITE ? CDF ? [ SET FROM FIXADD DCA i LMEMRF [STORE IT CDF 0 [BACK TO MEM BK. 0 JMP i WRITE [GO BACK [SUBROUTINE TO READ DATA FROM LINC MEM #READ ? CDF ? [ SET FROM FIXADD CLA TAD i LMEMRF [GET WORD CDF 0 [BACK TO MEM BANK 0 JMP i READ [GO BACK [SUBROUTINE TO FIX LMEMRF AND SET UP CHANGE MEMORY BANK INST. FOR 'READ' AND 'WRITE'. #FIXADD ? CLA TAD LMEMRF [LINC UPPER OR LOWER RAL [MEMORY SMA CLA JMP LOW TAD SAVMBS [GET UPPER MEM BK SEL. RTR [IN AC BITS6-10 RTR JMP LOW+2 #LOW TAD SAVMBS [GET LOWER MEM BK. SEL. RAL [IN AC BITS 6-10 DCA TEMP1 [SAVE IT TAD TEMP1 AND ]70 [SET UP CHANGE MEMORY TAD WRITE+3 [FIELD INST FOR DCA WRITE+1 [READ AND WRITE TAD WRITE+1 DCA READ+1 TAD TEMP1 [MODIFY BITS 0,1 OF RTR [LMEMRF TO CORRESPOND RTR [TO TWO LOWER BITS AND ]6000 [OF MEMORY BANK DCA TEMP1 [SELECTOR TAD LMEMRF AND ]1777 TAD TEMP1 DCA LMEMRF JMP i FIXADD [GEN SUB TO SET UP FOR OPERATING IN LINC MEM #RMEXT ? CLA IMBS [FIND OUT HOW LINC MBS DCA SAVMBS [ARE SET UP JMS FIXADD [GO FIX UP LMEMRF JMP i RMEXT [GO BACK [DO AN EXECUTE CLASS INST HERE #EXCGO DCA TEMP [SAVE INTSAVE ROTATED 2 LEFT IBAC [GET INST FROM LINC B DCA LINSTR [PUT IN LINSTR TAD INTSAVE [DO WE HAVE ADDRESS MATCH AND ]400 [IBI, IF YES THEN PEST=0 DCA PEST [EITHER IBI OR MATCH ON TAD TEMP [NOW LETS FIND OUT RTL [WHICH EXC CLASS INST RTL SPA CLA JMP p+5 SNL NOP [pppppMTT: PATCH TO 'JMP GOBACK' TO IGNORE, 'TAD C1000' FOR DOUBLE TAPES ON DECK 0 DCA DOUBLE [MTP JMP MTPGO TAD LINSTR [0PR: AND ]17 [WHICH ONE? TAD ]-10 [A DEFINED OPERATE? SPA JMPiUSROPR [NO: IGNORE OR GO TO USER'S OPR INTERPRETER TAD ]JMPiOPRTAB [YES DCA p+1 [SET UP FOR DISPATCH TABLE JMPiOPRTAB+? [WILL BE A JMP TO TABLE [ ]WATCH FOR PAGE BOUNDRIESu* #OPRTAB STINTS [OPR 10: SET UP USER I|O DEVICE UIO [OPR 11: DO USER I|O RDMBS [OPR 12: MBS TO LINC Z GOPDP8 [OPR 13: GO TO PDP-8 TYPEOUT [OPR 14: TYP DOKBD [OPR 15: KBD RSW [OPR 16: RSW LSW [OPR 17: LSW [ [OPR 10: SET UP USER I|O DEVICE #STINTS IAAC [GET ADDRESS FROM LINC A JMS INTSUB [GO TO SETUP SUBROUTINE JMP GOBACK [SUBROUTINE TO SET UP A USER I|O DEVICE [ENTER WITH ADDRESS IN AC: 0 = CLEAR I|O DEVICE #INTSUB ? DCA TEMP TAD IOCLR [WAS THERE A USER I|O DEVICE? SZA CLA JMSiIOCLR [YES: CLEAR IT CLA TAD TEMP DCA IOCLR [SAVE CLEAR ADDRESS ]0 IF CLEARING DEVICE* STL RTL TAD IOCLR DCA IOINT [INTERRUPT ADDRESS = CLEAR ADDRESS + 2 STL RTL TAD IOINT DCA IOOPR [OPR 11 ADDRESS = CLEAR ADDRESS + 4 JMPiINTSUB [ROUTINE TO CALL USER I|O DRIVER #UIO TAD IOCLR SZA CLA JMSiIOOPR [ONLY IF I|O DEVICE PRESENT JMP GOBACK [ROUTINE TO JMP TO PDP-8 PROGRAM #GOPDP8 IAAC SNA JMP GOBACK DCA TEMP JMS i TEMP [LOCATION IN JMP GOBACK [LINC A REG. [LINC MEMORY BANKS TO LINC Z #RDMBS IMBS [GET MBS CLL RAL JMS IACZ [PUT IN LINC Z 1-10 JMP GOBACK [GO PUT IN LINC A AND RESTART LINC [TYPE LINC OR ASCII CHARACTER IN LINC A #TYPEOUT IAAC TAD ]-12 [pppppPATCH TO 'JMP TYPO2+1' TO TYPE LINC A WITH NO CONVERSION SZA CLA [EOL? JMP p+5 [NO TAD ]215 [YES: CR JMS TYPEIT TAD ]212 [ +LF JMP TYPO2+1 IAAC DCA TYPECH TAD TYPECH AND ]7700 SZA CLA [ASCII CHAR? JMP TYPO2 [YES: TYPE IT TAD ]TTABLE+22-1 [CONVERT LINC CODE TO ASCII DCA TEMP TAD TYPECH CIA DCA TEMP1 [-]LINC CODE* -> TEMP1 TAD ]237 DCA TYPECH #TYPO1 ISZ TYPECH [BUMP ASCII VALUE TAD TYPECH RAR [SET LINC BIT TO EVEN|ODD BIT OF ASCII VALUE SNL CLA ISZ TEMP [BUMP TEMP IF EVEN-VALUED ASCII JMS HTABLE [GET LEFT OR RIGHT HALF OF TABLE ENTRY TAD TEMP1 [-]LINC CODE* SZA CLA [FOUND LINC CODE? JMP TYPO1 [NO: KEEP LOOKING #TYPO2 TAD TYPECH [YES JMS TYPEIT [TYPE ASCII JMP GOBACK [SUBROUTINE TO TYPE [ENTER WITH ASCII CHAR IN AC, EXIT WITH 0 AC #TYPEIT ? DCA TYPECH ISZ TTBUSY [TTY BUSY? JMP TYPE1+1 [NO: GO TYPE CHAR CLA STL RAL [YES: SET TYP PAUSE JMP DOPAUSE #TYPE1 DCA MTOPIN [CLEAR TTY PAUSE TAD TYPECH [PICK UP CHAR TLS1 [TYPE CHAR STA DCA TTBUSY [SET TTY BUSY FLAG JMP i TYPEIT [GO BACK [ [SUBROUTINE TO PUT CHARACTER ]IN AC* IN KBD BUFFER #PUTCHAR ? DCA LNCODE [SAVE CHARACTER TAD CHARCTR [SPACE IN BUFFER? TAD STBUF TAD ENDBUF SMA CLA JMPiPUTCHAR [NO: IGNORE CHARACTER TAD ]20 [OK LINC CHAR: SET KST JMS SETFF TAD LNCODE [MOVE CHAR TO BUFFER DCAiPUTPTR ISZ CHARCTR [INCR #CHARS TAD PUTPTR [END OF BUFFER? TAD ENDBUF SPA CLA JMP p+3 [NO TAD STBUF [YES: RESET PUT PTRS DCA PUTPTR TAD MTOPIN [ARE WE NOW IN KBD PAUSE? AND ]20 SNA CLA JMPiPUTCHAR [NO: RETURN DCA MTOPIN [YES: CLEAR PAUSE, [READ KBD ]I.E. GET CHAR FROM KBD BUFFER* #DOKBD STA TAD CHARCTR SPA [BUFFER EMPTY? JMP DOPAUSE-4 [YES SZA [ANY CHARS LEFT? JMP p+3 [YES TAD ]20 [NO: CLEAR KST JMS CLFF DCA CHARCTR TAD GETPTR [END OF BUFFER? TAD ENDBUF SPA CLA JMP p+3 [NO TAD STBUF [YES: RESET GET PTRS DCA GETPTR TADiGETPTR JMP GOBACK-1 [PUT IN LINC A AND RETURN TAD LINSTR [NO CHARACTER: IS I BIT UP? AND ]20 SNA JMP GOBACK-1 [NO I BIT, 0 TO LINC AC AND RESTART LINC #DOPAUSE DCA MTOPIN [I=1, KBD PAUSE, SET FLAG JMP RENINT [REENABLE INTERRUPT AND WAIT FOR KEYBOARD, OR CONSOLE ACTION [ [READ RIGHT SWITCHES #RSW LAS SKP [READ LEFT SWITCHES #LSW ILES IACA [PDP-8 AC TO LINC iAi #GOBACK CLA TAD LINSTR [GET LINC INSTRUCTION IACB [RESET LINC iBi REGISTER CLA TAD PEST [IBI OR MATCH UP? SNA CLA JMP GO [NO, GO RESTART LINC JMP MATCH [YES, TRY AUTO RESTART [ [START OF TAPE ROUTINES #MTPGO ISSP [GET LINC P REGISTER IBAC [LINC P REGISTER, LOCATION DCA LMEMRF [OF QN|BN IAC TAD LMEMRF [INCREMENT LINC P ISSP [RESET LINC P REGISTER JMS RMEXT [RESET MEM EXT INFORMATION JMS READ [GO TO LINC MEMORY FOR QNBN DCA QNBN [SET QNBN JMS MRESET [RESTORE AFTER DO IF NECESSARY JMS RMEXT [SAVE LINC MBS JMS LINCTAPE [CALL LINC TAPE SUBROUTINE JMP GOBACK-1 [PUT CHECKSUM IN LINC A AND RESTART LINC [LINC TAPE SUBROUTINE [ENTRY BY JMS AT LINCTAPE #FINMTN DCA MTOPIN [CLEAR MTP IN OPERATION FLAG TAD SAVEZ [RESTORE Z REGISTER JMS IACZ TAD LINSTR [IS 'I' BIT SET? AND ]20 SZA CLA [SKIP IF iIi BIT = 0 JMP p+7 [OTHERWISE RETURN CLL IAC [SET MOTION TO TURN AROUND ICON [SET MOTION 0 <1> RTR IAC ICON [SET MOTION 1 <1> CLA TAD DATASUM [RETURN WITH CHECKSUM IN AC JMPip+1 #LINCTAPE ? STA DCA WPHIND [SET WPHIND NOT = 0 DCA GP [SET GROUP CT TO 0 IZSA [SAVE Z REG IAAC DCA SAVEZ TAD QNBN RTL RTL AND ]7 [SET UP FOR GROUPS CIA DCA HOWMANY STL RAR DCA MTOPIN [4000 TO MTOPIN [CURRENT DECK = NEW DECK? TAD FFIM [pppppPATCH TO 'JMP DECK0' FOR ONLY 1 DECK RAR CLA TAD LINSTR AND ]40 SZA CLA CML SZL ICON [NO: 0 TO MOTION TAD LINSTR AND ]40 SZA CLA JMP p+5 #DECK0 STL IAC [MTP: SELECT TAPE DECK 0 RAL JMS CLFF JMP SEARCH IAC [MTT: SELECT TAPE DECK 1 JMS SETFF SKP #FAIL DCA WPHIND [CLEAR WPHIND IF END WRITE, SET IF FAILURE #SEARCH CLA CLL TAD LINSTR AND ]10 RTR RTR [GET UNIT BIT TO AC 00 TAD ]4 RAR [END UP WITH AC 10 SET ICON [SET SEARCH AND UNIT CLA CLL TAD QNBN [FORM DESIRED BLOCK THIS TAD GP [WAY BECAUSE OF GROUP AND ]777 [INSTRUCT CAN FAIL HALFWAY THRU CHECK OF WCG TAD DOUBLE [ADD EITHER 0 OR 1000 TO BN IACA DCA DESIRED [PUT DESIRED BLOCK IN AC INTS [INTS TO AC, GET MOTION RTR SMA CLA [SKIP IF MOTN 0 <1> JMP SETFWD SNL [SKIP IF MOTN 1 <1> JMP CKTYPE [BWD ICON [TURNAROUND: IAC [SET MOTION TO BACKWARD SKP #SETFWD TAD ]4001 [CNST. FOR ICON INST. ICON [SET MOTN TO FWD #CKTYPE STA DCA DATASUM [SET UP DATASUM TAD ]-NWBLK DCA NCNTR [-256 TO NCNTR DCA INTSAVE TAD LINSTR AND ]7 TAD ]JMPiMTPTBL DCA p+1 JMPiMTPTBL+? [ ]WATCH FOR PAGE BOUNDRIESu* #MTPTBL RDC RCG RDE MTB WRC WCG WRI CHK [INSTRUCTION SEQUENCES #RDC JMS NONGP SKP #RCG JMS GROUP TAD ]JMS WRITE SKP #WCHK TAD ]CLA JMS RDTAPE SZA JMP FAIL [CHECKSUM FAILED: AC # 0 JMS GPCHK [ALL DONE? NO: SEARCH FOR NEXT BLOCK JMP FINMTN [YES: FINAL MOTION #RDE JMS NONGP TAD ]JMS WRITE JMS RDTAPE JMP MTB+6 [CLA JMP FINMTN #MTB JMS SETMTN [SET MOTN TO DESIRED NOP [LEAVE MOTN AS IS IF ON DESIRED TAD TEMP [LEAVE DIFFERENCE IN LINC A ON RETURN DCA DATASUM TAD ]4 ICON [OFF SEARCH CLA [MTB+6 JMP FINMTN [GO SET FINAL MOTION #WRC JMS NONGP SKP #WCG JMS GROUP TAD WPHIND SNA CLA [WRITE PHASE? JMP WCHK [NO: CHECK BLOCK JMS WTAPE [YES: WRITE BLOCK JMS GPCHK [ALL DONE? NO: SEARCH FOR NEXT BLOCK DCA GP [YES: GO TO CHECK ALL BLOCKS JMP FAIL [CLEAR WRITE PHASE INDICATOR #WRI JMS NONGP JMS WTAPE JMP FINMTN #CHK JMS NONGP JMP WCHK [TAPE READING ROUTINE [ENTER WITH AC= JMS WRITE TO READ [ CLA TO CHECK #RDTAPE ? DCA RDF1 [SET READ|CHECK SWITCH JMS FINDBL [FIND CORRECT BLOCK JMS TPWT [WAIT FOR GUARD MARK #NXTWRD JMS TPWT IAAC [GET WORD FROM LINC A #RDF1 JMS WRITE [WRITE DATA IN LINC MEM ]CLA IF CHECKING* IAAC TAD DATASUM DCA DATASUM [FORM DATASUM ISZ LMEMRF [INCREMENT LINC ADDRESS NOP ISZ NCNTR [LAST WORD YET? JMP NXTWRD [NO JMS TPWT [WAIT FOR CHECKSUM IAAC [GET CHECKSUM TAD DATASUM [FORM FINAL DATASUM DCA DATASUM JMS RESTINT [OFF BLOCK AND PROCESS OTHER INTERRUPTS CLA IAC TAD DATASUM JMPiRDTAPE [EXIT WITH CHECKSUM IN AC [TAPE WRITING ROUTINE #WTAPE ? JMS FINDBL [FIND RIGHT BLOCK AND DIRECTION TAD ]5 ICON [ON WRITE #WRLOOP JMS READ [GET FIRST WORD FROM MEM IACB [PUT IN LINC iBi REGISTER TAD DATASUM DCA DATASUM [FORM DATASUM ISZ LMEMRF [INCREMEMT MEMORY POINTER NOP JMS TPWT [WAIT FOR NEXT TAPE INTERRUPT ISZ NCNTR [LAST WORD OF BLOCK YET? JMP WRLOOP TAD DATASUM CMA [FORM CHECKSUM FOR TAPE IACB [PUT IN LINC iBi REGISTER TO WRITE IT DCA DATASUM JMS TPWT [WAIT FOR FINAL MARK JMS TPWT [WAIT FOR CHECKSUM MARK JMS RESTINT [OFF BLOCK AND PROCESS OTHER INTERRUPTS JMPiWTAPE [SET UP MEMORY ADDRESSES FOR RCG AND WCG #GROUP ? TAD GROUP DCA NONGP TAD QNBN [SET LMEMRF TO 400 QN TAD GP [?" 77||'A' "BCDEFGHIJKLMNOPQRSTUVWXYZ[ _" ''||13 [ '<-' = DEL [ [SUBROUTINE TO SET CORRECT MOTION FOR TAPE TO HAVE #SETMTN ? JMS TPWAIT [WAIT FOR BLOCK# IAAC [BLK# FROM LINC iAi TAD DESIRED DCA TEMP [SAVE DIFFERENCE FOR MTB TAD TEMP CMA SNA [ON DESIRED BLOCK? JMPiSETMTN [YES: EXIT L+1 CMA RAL [NO: DESIRED DIR. TO L CLA INTS [MOTN TO AC BITS 10, 11 RAR SNL [SKIP IF BWD CMA SPA CLA [SKIP IF MTN TO CHANGE JMP p+6 ICON [0TO MOTN RAR [DIR. FROM L TO AC00 IAC ICON [AC TO MOTION CLA IAAC CMA DCA TEMP1 TAD DESIRED IACA [DESIRED BLK TO A CLA TAD TEMP1 IACB [CURRENT BLOCK TO B CLA ISZ SETMTN [EXIT L+2 JMP i SETMTN [WAIT FOR TAPE INTERRUPT WHILE 'ON BLOCK' [SAVE OTHER INTERRUPTS #TPWT ? CLA DCA MTPT1 INTS [LINC TAPE INTERRUPT? SPA JMP TPWT1 [YES CLA [NO: CONTINUE WAITING ISZ MTPT1 JMP TPWT+3 JMS RESTINT [30 MS. PASSED: TAPE MUST HAVE STOPPED STA JMP FAIL [START BLOCK OVER #TPWT1 DCA MTPT2 [TAPE INTERRUPT: SAVE OTHER LINC INTERRUPTS TAD MTPT2 [INTSAVE=]INTS .IOR. INTSAVE* .AND. 3777 CMA AND INTSAVE TAD MTPT2 AND ]3777 DCA INTSAVE TAD ]7 [CLEAR LINC INTERRUPTS ICON CLA JMPiTPWT [OFF BLOCK AND PROCESS OTHER INTERRUPTS #RESTINT ? TAD ]6 [OFF BLOCK ICON CLA TAD ]JMPi]p+3 DCA RENINT JMP PROCNT [PROCESS INTERRUPTS CLA [OTHER INTERRUPTS PROCESSED TAD ]ION DCA RENINT JMPiRESTINT [ [SUBROUTINE TO SET LINC Z FROM PDP-8 AC #IACZ ? IACB [AC TO LINC B CLA TAD ]14 ICON [CLEAR LINC Z IAC ICON [LINC B TO LINC Z CLA JMPiIACZ [ #BUFFER ? [KBD BUFFER [KBD BUFFER ENDS AT 1777 [ [LOADER. THE FOLLOWING IS PRESENT ONLY DURING THE LOADING OF PROGOFOP FROM TAPE $2 #INTADD GOGO [ENTRY FOR PDP-8 RUNNING. CHANGED TO 'PROCESS' AFTER LOADING $20 [LINC INSTRUCTIONS FOR SETTING LMB TO 2 #LINCB 0600+2 [LINC LMB 2 6000+p [LINC JMP p [COPY PAGE 1 FROM PAGE 2 #LCOPY TADiFROM DCAiTO ISZ FROM ISZ TO ISZ COUNT1 JMP LCOPY JMPip+1 LAP6W [GO LOAD AND START LAP6W ON UNIT SYSU #FROM 400 #TO 200 #COUNT1 -1600 #LGOREAD GOREAD [ENTRY ADDRESS FOR PDP-8 STOPPED /CURRENT-PAGE LITERALS $200 AND ]0 [FAKE LITERAL BECAUSE LOC 377 NOT READ BY LOAD SEQUENCE #GOGO CLA [ENTER HERE ON LOAD INTERRUPT TAD ]LINCB ISSP [SET LINC P TO LMB 2, JMP p SEQUENCE CLA CLL TAD ]400 IACF [SET IBI FF TAD ]7 [CLEAR LINC INTERRUPTS ICON IAC [SELECT LINC ICON IAC [START LINC TWICE IAC ICON NOP ICON #GOREAD CLA [ENTER HERE ON LOAD START TAD ]PROCESS [RESET INTERRUPT ENTRY ADDRESS FOR PROGOFOP DCA INTADD IACF [CLEAR LINC FLIP-FLOPS TAD ]10 [SELECT LINC ICON #LREAD CLA STL RTL [SET SEARCH UNIT 0 ICON CLA INTS RAR SZL CLA [TAPE MOTION? ICON [BWD OR TURNAROUND: STOP TAPE TAD ]4001 [SET FWD ICON #LSEARCH JMS LWAIT [WAIT FOR BN IAAC IAC TAD DESIRED SZA [CURRENT = DESIRED? JMP LSETMTN [NO: GO SET DESIRED DIRECTION INTS [YES: RAR SZL CLA [MOTION FWD? JMP LSEARCH [NO: TRY AGAIN STL IAC [YES: ON BLOCK RAL ICON JMS LWAIT [WAIT FOR GUARD WORD TAD ]-NWBLK-1 [INITIALIZE WORD COUNTER DCA NCNTR STA [INITIALIZE CHECKSUM DCA DATASUM JMP p+4 #LSTWRD IAAC [STORE DATA WORD DCAiLMEMRF ISZ LMEMRF [INCREMENT WORD POINTER JMS LWAIT [WAIT FOR NEXT WORD IAAC [ACCUMULATE CHECKSUM TAD DATASUM DCA DATASUM ISZ NCNTR [END OF BLOCK? JMP LSTWRD [NO: CONTINUE STL IAC [YES: OFF BLOCK RTL ICON CLA IAC TAD DATASUM SZA CLA [CHECKSUM OK? JMP REREAD [NO: REREAD BLOCK ISZ DESIRED [YES: INCREMENT BN ISZ HOWMANY [DONE READING PROGOFOP? JMP LREAD [NO: CONTINUE JMP LCOPY [YES: GO COPY PAGE 1 TO PROPER PLACE #LSETMTN RAL CLA INTS [SET TAPE MOTION TOWARD DESIRED BLOCK RAR SZL CMA SMA CLA JMP LSEARCH [MOTION ALREADY CORRECT: GO WAIT FOR BN ICON [MOTION WRONG: STOP TAPE RAR IAC ICON [SET DESIRED MOTION JMP LSEARCH [GO WAIT FOR BN #LWAIT ? [WAIT FOR TAPE INTERRUPT CLA TAD ]-15. DCA LCTR1 #LWAIT1 INTS SMA CLA [TAPE INTERRUPT OCCURRED? JMP LWAIT2 [NO: CONTINUE WAITING TAD ]7 [YES: CLEAR LINC INTERRUPTS ICON CLA JMPiLWAIT [AND RETURN #LWAIT2 ISZ LCTR [INCR TIMEOUT COUNTER JMP LWAIT1 ISZ LCTR1 JMP LWAIT1 #REREAD TAD LMEMRF [TIMEOUT OR CHECKSUM ERROR: REREAD BLOCK TAD ]-NWBLK [DECREMENT WORD POINTER BY NWBLK DCA LMEMRF JMP LREAD [GO READ BLOCK AGAIN [TAPE TIMEOUT COUNTER #LCTR ? #LCTR1 ? [TELETYPE I|O INSTRUCTIONS ]MAY BE [ CHANGED FOR OTHER THAN CONSOLE TTY*: [ IF CHANGED, ALSO CHANGE APPROPRIATE INSTRUCTION [ IN CLEAR INTERRUPT FLAG SECTION ]TTKC* TSF1=TSF TCF1=TCF TLS1=TLS KSF1=KSF KCC1=KCC KRB1=KRB [END PROGOFOP [3|72 - RAL