[LINC-8 PROGRAM OF OPERATION [3|72 - RAL [ [FEATURES: [ OPR 10 = SET UP USER I|O DEVICE [ OPR 11 = DO USER I|O [ OPR 12 = LINC MBS TO LINC Z 1-10 [ OPR 14 = TYPE LINC ]<100* OR ASCII ]>77* CODE [ CLEAR = RESTART LAP6W ]400-403 -> LMB, STRT 17* [ ST RS = START AT LOCATION SPECIFIED IN LEFT SWITCHES [ TTY OUTPUT WAITS WITH INTERRUPT ACTIVE [ INTERRUPT OFF WHILE TAPE IS "ON BLOCK" [ TAPE UNITS 4 AND 5 ARE ON DECK 1 ]CAN BE PATCHED FOR ONLY 1 DECK*, [ ]CAN BE PATCHED TO TREAT 4 AND 5 AS BLOCKS 1000-1777 ON DECK 0* [ [SYSTEM DEFINITIONS: NWBLK=400 [#WORDS|TAPE BLOCK SYS=400 [LINC SYSTEM SYSU=0 [ "" "" UNIT $0 JMPiLGOREAD [LOAD W| PDP-8 STOPPED JMPip+1 [PROCESS INTERRUPT PROCESS [GOGO WHEN LOADING [VARIABLES #LMEMRF 400 [LINC MEMORY REFERENCE, CONTAINS THE 12 BIT ADDRESS OF THE LINC ADDRESS OF CURRENT INTEREST #DESIRED 1 [BLOCK NUMBER FOR TAPE SEARCHING #HOWMANY -4 [BLOCK COUNTER FOR GROUP INSTRUCTIONS #CHARCTR 0 [. # CHARS IN BUFFER #INTSAVE 0 [LINC INTERRUPT STATUS #FFIM 0 [LINC FF IMAGE ]BIT 8 IS "EXAM FF"* #TTBUSY 0 [TTY PRINTER FLAG. #0 WHEN TTY BUSY #MTOPIN 0 [PAUSE FLAG. 4000 FOR MTP, 20 FOR KBD, 1 FOR TYP #STBUF BUFFER-1 [BEGINNING OF KBD BUFFER - 1 #ENDBUF -1777 [ - END OF KBD BUFFER #PUTPTR BUFFER-1 [+ PUT CHAR POINTER ]MUST BE AUTO-INDEX REGISTER* #GETPTR BUFFER-1 [+ GET CHAR POINTER ]MUST BE AUTO-INDEX* #NCNTR  [COUNTER USED DURING TAPE TRANSFERS #DATASUM  [CHECKSUM ACCUMULATOR FOR TAPE OPERATIONS #MTPT1 0 [COUNTERS FOR MTP TIMEOUT LOOP #MTPT2  #LSSAVE  [ADDRESS FOR EXAM AND FILL #WPHIND 0 [WRITE PHASE INDICATOR, NON ZERO WHILE WRITING, ZERO WHEN READING BACK TO CHECK, ONLY CHECKED DURING WRC WCG INSTS. #QNBN  [QN|BN DURING MTP OPERATION #DOUBLE  [1000 IF MTT AND ONLY 1 DECK, 0 OTHERWISE #LNCODE  [CURRENT CHARACTER READ FROM KBD #GP 0 [GROUP COUNTER, SET TO ZERO AT BEGINNING OF MTP INST. INCREMENTED FOR EACH BLOCK DONE IN THE GROUP #TEMP 0 [MISC. REGISTER USED FROM MANY PLACES #TEMP1  [2ND TEMPORARY #PSAVE 0 [HOLDS THE CONTENTS OF THE LINC P REGISTER DURING DO TOG. INSTRUCTIONS . #LINSTR 0 [HOLDS THE LINC INSTRUCTION CURRENTLY BEING EXECUTED DURING MTP, OPR, AND EXC #SAVMBS  [LINC MEMORY BANKS #SAVEZ  [SAVES THE LINC Z REGISTER DURING MTP OPERATIONS #T1  [LOC 20 SAVED DURING DO TOGGLE #T2  [LOC 21 SAVED DURING DO TOGGLE #PEST  [NONZERO IF ADDRESS MATCH ON EXECUTE-CLASS INST #TYPECH  [CHARACTER TO TYPE [USER I|O DEVICE ENTRY POINTS: #IOCLR 0 [MASTER CLEAR ]0 IF NO USER I|O DRIVER* #IOINT  [INTERRUPT #IOOPR  [OPR 11 [ENTRY POINT FOR USER OPR INTERPRETER #USROPR GOBACK [pppppIGNORE OPR 0-7 ]MAY BE PATCHED* #C1000 1000 [CONSTANT #RCGSYS 0701+SYSU [pppppRCG SYSU [ $200:400 [ENTER HERE TO CLEAR AND RESTART SYSTEM #PRESET DCA FFIM [CLEAR OUT PROG. INDICATORS ]0 AC* TAD MRSTX [CLEAR DO FLAG DCA MRESET+1 TAD ]RESTART [DISABLE MARK SWITCH DCA MARK DCA MTOPIN [CLEAR PAUSE FLAG JMS INTSUB [CLEAR USER I|O DEVICE KCC1 [CLEAR TTY KBD TAD STBUF [RESET CHARACTER POINTERS DCA PUTPTR TAD STBUF DCA GETPTR DCA CHARCTR [CLR #CHARS TCF1 [CLEAR TTY PRINTER DCA TTBUSY [CLEAR TTY PRINTER BUSY FLAG TAD ]11 [DESELECT LINC, GIVES ICON [PWR CLEAR IN LINC TAD ]17 [THAT WILL CLEAN THINGS UP ICON [NOW SELECT LINC AGAIN <10 IN AC> JMP RENINT [WAIT FOR INTERRUPT [WAIT FOR TAPE INTERRUPT #TPWAIT  CLA [INITIALIZE COUNTER FOR TIMEOUT TAD ]-24 DCA MTPT2 JMP RENINT [ENTER HERE ON INTERRUPT #PROCESS CLA INTS [LINC INTERRUPT FLAGS TO AC DCA INTSAVE [SAVE THEM TAD ]7 ICON [CLEAR INTERRUPTS TAD INTSAVE SPA CLA [INTSAVE BIT 0, TAPE JMPiTPWAIT [YES A TAPE INTERRUPT #PROCNT TAD INTSAVE RTL SPA [INTSAVE BIT 2, EXC. JMP EXCGO SZL JMP CONSL [INTSAVE BIT 1: CONSOLE RTL SPA CLA JMP DELRST [INTSAVE BIT 4, RESTART SZL JMP MATCH [INTSAVE BIT 3, MATCH TAD IOCLR SZA CLA JMSiIOINT [CALL USER I|O INTERRUPT SUBROUTINE IF USER I|O DEVICE KSF1 [TTY KEY STRUCK JMP TTTD [NO: GO TEST TTY OUTPUT DONE [READ TTY KEYBOARD KRB1 [READ TTY BUFFER TAD ]4000-77 DCA LNCODE TAD LNCODE TAD ]77-174 RAR [CONVERT TO LINC CHARACTER IF POSSIBLE AND ]77 TAD ]TTABLE DCA TEMP JMS HTABLE [GET LEFT OR RIGHT HALF OF TABLE ENTRY TAD ]-77 SNA [IS IT A LINC CHAR TAD LNCODE [NO: SEND ASCII + 4000 TAD ]77 [YES: SEND LINC CODE JMS PUTCHAR [PUT IT IN KBD BUFFER #TTTD TSF1 [TTY PRINTER DONE JMP TTKC [NO, CLR TTY-KBD, RESTART LINC TAD MTOPIN [YES: TYP PAUSE RAR SZL CLA JMP TYPE1 [YES: TYPE NEXT CHAR TCF1 [NO: CLEAR FLAG DCA TTBUSY [CLEAR TTY BUSY FLAG [RESTART LINC IF IT WAS RUNNING #RESTART TAD INTSAVE AND ]10 SNA CLA [LINC WAS RUNNING WHEN INTERRUPT OCCURRED JMP RENINT #GO TAD ]12 [YES: RESTART LINC ICON #RENINT ION [NO: ENABLE INTERRUPT NOP ISZ MTPT1 [TIME EXPIRED JMP RENINT+1 [NO: CONTINUE WAITING ISZ MTPT2 JMP RENINT+1 [NO: CONTINUE WAITING IOF [YES: DISABLE INTERRUPT TAD MTOPIN SPA [MTP PAUSE JMP FAIL [YES: TAPE FAILURE, TRY AGAIN JMP RENINT [NO: RE-ENABLE INTERRUPT TO CONTINUE WAITING [CLR TTY-KBD INTERRUPT FLAGS #TTKC IOT 402 IOT 422 IOT 442 IOT 462 NOP [pppppPATCH FOR EXTRA TTY JMP RESTART [LINC [CONSOLE SWITCH INTERRUPT #CONSL CLA TAD ]JMPiSWTAB DCA THISONE+1 [SET UP POINTER FOR TABLE ICS1 [GET SWITCHES I #REPEAT CLL RAL [NEXT ONE SNL [WAS IT PRESSED JMP THISONE [YES, GO EXECUTE PRG. ISZ THISONE+1 [NO, INCREMENT POINTER JMP REPEAT [NO, TRY AGAIN #THISONE CLA CLL JMPiSWTAB+ [USED FOR JMP TO TABLE [DISPATCH TABLE TO GO DO VARIOUS SWITCH FUNCTIONS [ ]WATCH FOR PAGE BOUNDRIESu* #SWTAB PRESET [STOP FILL FILLST EXAM EXAMST IBI STEP RESUME DOTOG START [START RS START+2 [START 20 START+4 [START 400 SW2 [NOT SWITCHES I: GO TO SWITCHES II #MARK RESTART [pppppIGNORE MARK SWITCH AUTO FSTOP ESTOP LAP6W [CLEAR: RESTART LAP6W RESTART [NO SWITCH ON: RESTART LINC IF NECESSARY #SW2 ICS2 [GET SWITCHES II AND ]7600 JMP REPEAT+3 [CONTINUE SEARCH [IBI OR MATCH INTERRUPT #MATCH JMS MRESET [RESET AFTER DO IF NECESSARY ICS2 [TEST FOR AUTOFF AND ]100 SNA CLA [AUTO FF ON JMP RENINT [NO: JUST RE-ENABLE INTERRUPT TAD ]13 [YES: ICON [FIRE RESTART DELAY JMP RENINT [GO ENABLE INTERRUPT [AUTO RESTART #AUTO TAD ]40 JMS SETFF [SET AUTOFF #DELRST TAD FFIM [COME HERE AFTER DELAY AND ]10 SZA CLA [EXAM JMP EXAMST+2 [YES: DO STEP EXAM JMS TPAUSE [NO: NO GO IF PAUSE TAD FFIM [IS IBI, ESTOP,OR FSTOP AND ]700 [SET SZA CLA JMP GO [YES, START LINC JMP RENINT [NO, JUST INT. ON [ESTOP #ESTOP TAD ]1250 JMS CLFF [CLEAR CLEAR, FSTOP, AUTO, EXAM TAD ]100 JMS SETFF [SET ESTOP JMP RESTART [START LINC IF APPROPRIATE [FSTOP #FSTOP TAD ]1150 JMS CLFF [CLEAR CLEAR, ESTOP, AUTO, EXAM TAD ]200 JMP ESTOP+3 [SET FSTOP [FILL #FILL JMS TPAUSE [NO GO IF PAUSE ILES DCA LSSAVE [LS FOR ADDRESS CMA [7777 TO TEMP IF FILL SKP [FILL STEP #FILLST JMS TPAUSE [NO GO IF PAUSE DCA TEMP [0000 TO TEMP IF FILLST TAD LSSAVE [GET LINC ADDRESS IACS [TO LINC iSi REGISTER DCA LMEMRF [SET UP FOR WRITE JMS RMEXT [CHECK MEM. EXT. LAS [RS FOR CONTENTS IACB [TO LINC iBi REGISTER JMS WRITE [STORE IN LINC MEM TAD TEMP SZA JMP EXAM ICS1 [FILL STEP RELEASED YET RTL SMA CLA [CSW1 BIT 2 RELEASED JMP p-3 [NO, JUST WAIT [YES, NOW DO STEP EXAM [STEP EXAM #EXAMST TAD ]1444 [CLEAR CLEAR, IBI, AUTO, MARK JMS CLFF CLA IAC [1 TO AC TAD LSSAVE [INCREMENT RSSAVE DCA LSSAVE JMS TPAUSE [NO GO IF PAUSE TAD ]10 [SET EXAM JMS SETFF TAD LSSAVE IACS [ADDRESS TO LINC S DCA LMEMRF [SET UP LINC ADDRESS JMS RMEXT [CHECK MEM. EXT SETUP JMS READ [LINC WORD TO AC IACB [NOW TO LINC B CLA JMP MATCH [ENABLE INTERRUPT, FIRE DELAY IF AUTO FF IS ON [EXAM #EXAM TAD ]1444 [CLEAR CLEAR, IBI, AUTO, MARK JMS CLFF ILES [LS TO AC JMP EXAMST+4 [STEP #STEP CMA [INST X INST #IBI DCA LSSAVE [SAVE SWITCH INDICATOR TAD ]400 [SET IBI FF JMS SETFF TAD ]1054 [CLEAR CLEAR, AUTO, EXAM, MARK JMS CLFF TAD MTOPIN SZA JMP STPAUSE [PAUSED: SET TO STOP AT END OF PAUSE TAD LSSAVE SNA CLA JMP RENINT [INST X INST: STOP LINC JMP GO [STEP: START LINC [ [START LEFT SWITCHES #START ILES [LEFT SW TO AC JMP RESUME-2 [START LINC AT ]AC* [START 20 TAD ]20 [20 TO AC JMP RESUME-2 [START LINC AT ]AC* [START 400 TAD ]400 [400 TO AC JMP RESUME-2 [START LINC AT ]AC* [ [CLEAR = RELOAD AND START LAP6W ON UNIT SYSU #LAP6W JMS TPAUSE [NO GO IF PAUSED TAD ]15 [SET POINTER TO LINC LOC 15 DCA LMEMRF JMS RMEXT TAD RCGSYS [PUT RCG SYSU,3|SYS AT 15 JMS WRITE ISZ LMEMRF TAD ]3|SYS JMS WRITE TAD ]15 [15 TO AC ISSP [START LINC AT ]AC* CLA [ENTER HERE ON RESUME #RESUME TAD ]1454 [CLEAR CLEAR, IBI, AUTO, EXAM, MARK JMS CLFF TAD MTOPIN SNA CLA [PAUSED JMP GO [NO: START LINC #STPAUSE DCA PEST [YES: START AT NEW ADDRESS AFTER PAUSE JMP RENINT [ [SUBROUTINE TO GET THE LEFT OR RIGHT HALF OF TABLE ENTRY #HTABLE  TADiTEMP [GET ENTRY SZL [WHICH HALF JMP p+4 [RIGHT RTR [LEFT RTR RTR AND ]77 [NOW HAVE LINC CODE KEYBOARD CODE JMP i HTABLE [ [DO TOGGLE #DOTOG JMS TPAUSE [NO GO IF PAUSED TAD ]20 DCA LMEMRF [SET LMEMRF TO 20 JMS RMEXT [SET UP LINC MEM JMS READ [GO SAVE LOCATION 20 DCA T1 ILES [LEFT SW TO AC JMS WRITE [TO LINC LOC. 20 ISZ LMEMRF [SET TO 21 JMS READ DCA T2 [SAVE LOCATION 21 LAS [RSW TO AC JMS WRITE [RSW TO LINC LOC. 21 TAD ]20 [20 TO LINC "P" REG. ISSP [LINC iPi REG. TO LINC iBi CLA IBAC [NOW TO AC DCA PSAVE TAD ]400 JMS SETFF [SET IBI FF TAD ]NOP [SET DO FLAG DCA MRESET+1 JMP GO [START LINC [SUBROUTINE TO CLEAN UP AFTER DOTOG #MRESET  JMPiMRESET [NOP IF "DO"ING INSTRUCTION TAD MRSTX [RESET DO FLAG DCA p-2 TAD ]400 [CLEAR IBI JMS CLFF TAD ]20 DCA LMEMRF JMS FIXADD TAD T1 [RESET LOCATION 20 JMS WRITE ISZ LMEMRF TAD T2 [RESET LOCATION 21 JMS WRITE ILES [CHECK FOR JMP INST. CMA RAL SZL SPA CLA [SKIP IF JMP JMP MRST1 ILES [JMP INST: CHECK FOR JMP 0 TAD ]-6000 SNA CLA JMPiMRESET [JMP 0: GO BACK DCA LMEMRF [JMP #0: FIX LINC LOCC LOC 0 IN NEW BANK JMS RMEXT TAD PSAVE TAD ]6000 JMS WRITE #MRSTX JMP i MRESET [GO BACK #MRST1 TAD PSAVE [NOT JMP INST: RESTORE LINC P REGISTER ISSP CLA JMPiMRESET [GO BACK [SUBROUTINE TO STOP EXECUTION OF CONSOLE FUNCTIONS IF LINC PAUSED #TPAUSE  TAD MTOPIN SZA CLA JMP RENINT [PAUSED: DON"T CONTINUE JMPiTPAUSE [NOT PAUSED: RETURN [SUBROUTINE TO SET FF #SETFF  DCA TEMP [CORRESPONDING TO BITS TAD TEMP [SET IN AC CMA AND FFIM [CLEAR DESIRED BITS TAD TEMP [THEN SET THEM IACF [SET FF DCA FFIM [SAVE IMAGE JMP i SETFF [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