File PROGOFOP

Directory of image this file is from
This file as a plain text file

[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 [<RIGHT MOST QNBN+GP
RTR
RTR
JMP NONGP+3
[SET UP MEMORY ADDRESSES FOR RDC, RDE, WRC, AND WRI
#NONGP  
DCA HOWMANY [SET TO TRANSMIT 1 BLOCK
TAD QNBN [SET LMEMRF TO
RAR [400 QN
AND ]3400
IACS
DCA LMEMRF
JMS FIXADD [SET UP FOR MEM EXT
JMP i NONGP
[GO DO NEXT BLOCK FOR GROUP INSTRUCTIONS
#GPCHK  
TAD GP [ENTER WITH AC=0
TAD HOWMANY
SNA CLA [ALL BLOCKS DONE
 JMPiGPCHK [YES: RETURN
ISZ GP [NO: INCREMENT BLOCK COUNT
JMP SEARCH [GO DO NEXT BLOCK
[ROUTINE TO WAIT FOR DESIRED BLK NO.
[EXIT: L+1 IF BWD
[      L+2 IF FWD
#FINDBL 
JMS SETMTN [SET MOTN TOWARD DESIRED BLOCK
 SKP [ON DESIRED BLOCK
  JMP p-2 [NO: TRY AGAIN
INTS [YES: CHECK DIRECTION
RAR
SZL CLA
 JMP FINDBL+1 [BWD: TRY AGAIN
TAD ]3 [FWD:
ICON [ON BLOCK
CLA
JMP i FINDBL
[
[TTY-LKC CONVERSION TABLE
[77 MEANS SEND ASCII CHARACTER + 4000
#TTABLE 7723 [              ALTMODE=CASE
2313 [35ALTMODE=CASE RUBOUT=DEL
7777
7777
7777
7777
7777
"
"||77 [LINEFEED=META
7712 [              RETURN=EOL
7777
7777
7777
7777
7777
7777
7777
7777
7777
" u"
""#"
"$"
7771 [              "
"]*p+,-.|0123456789:i<=>"
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



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search