diff --git a/build/misc.tcl b/build/misc.tcl index 4b928627..5c08c744 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -64,6 +64,15 @@ respond "*" ":midas sys1;ts salv_system;salv\r" respond "time-sharing?" "y\r" expect ":KILL" +# macdmp, PDP-10 hardware read in, with 340 support. +respond "*" ":midas;77\r" +respond "MIDAS.77" ".;MACDMP RIM10_SYSENG; MACDMP MOBY1\r" +expect ":KILL" +# macdmp, PDP-6 read in hack. +respond "*" ":midas;77\r" +respond "MIDAS.77" ".;MACDMP RIM2_SYSENG; MACDMP 6U32\r" +expect ":KILL" + # system gen respond "*" ":midas;324 dsk0:.;@ sysgen_syseng; system gen\r" expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index c3c953d0..bdb25f04 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -199,6 +199,7 @@ - LSRPRT, print information about user groups. - LUSER, request help from registered list of logged-in users. - MBXLOC, lock a mailbox. +- MACDMP, standalone program loader/dumper for DECtape. - MACN80, Z80 cross assembler. - MACRO-10, DEC assembler. - MACSYMA, symbolic manipulation system. diff --git a/src/syseng/macdmp.6u32 b/src/syseng/macdmp.6u32 new file mode 100644 index 00000000..cf55bdce --- /dev/null +++ b/src/syseng/macdmp.6u32 @@ -0,0 +1,451 @@ + +RLC==40000 +TD10==0 +PDP10==0 +SHADOW==0 +IFE PDP10,TITLE RIM2 +IFN PDP10,TITLE RIM10 + RIM + NOSYMS +DEFINE WHOLE A +IF2,[ + REDEF + IRPC X,,[A] + INFO REDEF,[X] + IFSE [X][ ][ + INFO OUT + REDEF +] +TERMIN] +TERMIN +DEFINE REDEF %B +DEFINE INFO %Y,%A +%Y [%B!!%A] +TERMIN +TERMIN +DEFINE OUT Q + WORD Q +TERMIN + +IFE PDP10,[ +WHOLE [ HRLZI 2,(JRST) + HRLI 17,(CONO PTR,) + HRRI 17,60 + MOVEM 17,20 + HRLI 17,(CONSO PTR,) + HRRI 17,10 + MOVEM 17,21 + MOVEM 17,24 + HRLI 17,(JRST) + HRRI 17,21 + MOVEM 17,22 + MOVEM 17,27 + HRRI 17,24 + MOVEM 17,25 + HRLI 17,(DATAI PTR,) + HRRI 17,26 + MOVEM 17,23 + HRLI 17,(XCT) + MOVEM 17,26 + MOVEI 17,37176 + MOVEM 17,37 + HRLI 10,(CONO) + HRRI 10,1000 + HRLI 11,(JFCL) + HRLI 12,(JFCL) + HRLI 13,(JFCL) + HRLI 14,(JFCL) + HRLI 15,(CONSZ) + HRRI 15,1000 + HRLI 16,(JRST) + HRRI 16,10 + MOVSI 17,(SKIPA) + JRST 10 +] + +IFN SHADOW,[ + LODBEG=0 ;FIRST LOCATION IN SHADOW FOR SHADOW LOADER + REL=RLC+36000 ;RELOCATION WHILE IN USER MODE + +LOC 1 +BAR: -1,,REL ;DATAO TO PROCESSOR (RELOCATION & PROTECTION WHILE IN USER MODE) +LOSS: LOADER,,SHAD ;BLT POINTER INTO SHADOW +FBLT: FOOF,,FOOF+1 ;BLT POINTER TO CLEAR OUT FILE DIRECTORY +SBL: .BYTE 5 + REPEAT 7,36 ;TO MAKE INITIAL DIRECTORY A VALID EMPTY ONE + 33 ;" " " + .WALGN + .BYTE + DBL=.-1 + + LOC 41 + JSR 16 ;EXIT FROM USER HACK + +LOC RLC+37176 +FOOF: 0 ;INITIALIZE FOR CLEARING DIRECTORY + OFFSET -REL +FOO: BLT LOSS,SHAD+LODEND-LODBEG-1 + 0 + +LOADER: OFFSET LODBEG-2*REL-. +SHAD: OFFSET 0 + OFFSET LODBEG-. + JFCL + MOVSI (JFCL) + CONO 635550 + CONO PI,11577 + CONO UTC,223110 + CONO DC,4010 +LUP%: CONSO DC,1000 + JRST .-1 + DATAI DC,A% + AOJGE A%,LUP% + TRNE A%,-1 +A%: 0 + JRST LUP% + +LODEND: OFFSET 0 + +WHOLE [DATAO BAR + JRST 1,FOO + BLT FBLT,TAB+176 + MOVEM SBL,TAB+56 + MOVEM DBL,TAB+67 + SETOM TAB+177 +]]] + +IF2,[ +IFE PDP10,[ +DEFINE OUT Q + Q +TERMIN +] + +LOC 1 +IFN PDP10,WORD <-27,,> +WHOLE [ MOVE 1,15 + JSP 17,30-10*PDP10 + DATAI PTR,16 + MOVE 15,16 + JUMPG 16,16 + JSP 17,30-10*PDP10 + DATAI PTR,(16) + ROT 15,1 + ADD 15,(16) + AOBJN 16,6 + MOVEI 17,33-10*PDP10 + JRST 30-10*PDP10 + CONO PTR,60 +] +IFN PDP10,[ +WHOLE [ 0 + 0 +]] + +LOC 30 +WHOLE [ CONSO PTR,10 + JRST 30-10*PDP10 + JRST (17) + DATAI PTR,16 + CAMN 15,16 + JRST 2 + JRST 4,1 +] + WORD +SBLK +] + TITLE MACDMP +DTC=320 +DTS=324 +IFN TD10,[DC=DTC +UTC=DTC +UTS=DTS +]F=0 +A=2 +B=1 +C=3 +D=4 +E=5 +P=6 +CKS=7 +FILN=10 +BLKNO=11 +WRITE=12 +PNTR=13 +CH=14 +Q=15 +G=16 +DDT=34000+RLC +COMPTR=37777+RLC + LOC 37176+RLC + LOZAD=.-1 + LOW=20 + HIGH=.-1 +FOOF: BLOCK 1 +TAB: BLOCK 200 ;FILE DIRECTORY +TAPENO: BLOCK 1 +BEGR: CLEARM COMPTR + CONO 635550 +BEG: JSP P,CRR + MOVEI D,SPNT-1 +BEG1: CLEARB A,FOOF + EXCH A,1(D) ;REMOVE HEADER LIST + AOBJN A,. + MOVEI D,-1(A) + JUMPN D,BEG1 + CLEARB CH,F + MOVNI WRITE,1 +TYI: MOVSI B,400000 ;INIT FILE NAME TO @ @ +SPACE: EXCH C,B + MOVSI B,400000 + MOVSI E,20600 ;FAKE OUT END-TEST AND CLEAR 'EXCH' + CAIN CH,'F + JRST LISTF + CONO UTC,400000*TD10 +NEXT: ILDB A,COMPTR + JUMPN A,RCH + CONSO TTY,40 + JRST .-1 + DATAI TTY,A + JSP P,TYO + +RCH: ORCMI A,177 + AOJE A,BEGR +BELL: AOJ A,7 + AOJGE A,ALTTST + ADDI A,135 ;200-40-3 + JUMPL A,CARRET + JUMPE A,SPACE +NEXT1: TLNE E,770000 ;NO MORE THAN SIX CHARS + IDPB A,E + JRST NEXT +JBLK: CAILE CH,'M ;SKIP IF SYMS NOT NEEDED + JRA CH,LOAD ;F=0 C(CH)LT=0 C(F)=-1 + CONO UTC,400000*TD10 + JUMPL CH,DDTG ;IF SYMS JUST READ + HRRM D,SADR +IFE .&1,[ JUMPN CH,BEG ;IF NOT LOADGO COMMAND +SADR: JRST BEG ;CURRENT S.A. +] +IFN .&1,[SADR: JUMPE CH,BEG + JRST BEG +] +DDTG: HRROS DDT-1 ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + JRST DDT + +LOADS: MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO + CLEARM 40 + MOVE C,[(40)41] + CAIN CH,'T + MOVE D,@DDT-1 ;GET FIRST LOC OF DDT SYMS + TRNN CH,3 ;SKIP ON M,N,I NOT ON L,T,@ + BLT C,-1(D) ;ZERO CORE +LOAD: JSP Q,LODUMP + JSP P,UWAIT + CAMN CKS,D ;CHECK CHECKSUM + JRST LOAD +DELE: JUMPE C,BEG + JUMPE WRITE,[AOJA WRITE,CLSTP] +ERR: SKIPA P,RBLK2A +CRR: SKIPA A,C15 + SKIPA A,BELL +TYO: SKIPN COMPTR + DATAO TTY,A + CONSZ TTY,20 + JRST .-1 + JUMPGE A,(P) + MOVEI A,12 + JRST TYO + + +CR3: TDNN A,1(E) + AOJA E,.-1 + JSP P,CRR + CAIN F,-TAB-55(E) + JRST BEG + MOVEI G,3-TAB(E) + LSH G,-1 + LDB A,[(100+G)TAB+104 + MOVE B,TAB+55(G) + DPB B,[(10100)A + JSP P,LISTF3 + JRA A,LISTF2-1 + +ALTTST: TLNN B,4040 + LDB CH,E + JUMPN CH,ALTMD +CARRET: AOJE A,NEXT1 + MOVE PNTR,[(500)TAB+55] + MOVSI FILN,-30 +LUP: AOJ FILN,DMP3A + SKIPN TAB-1(FILN) ;SEARCH FOR FREE FILE + SKIPE TAB(FILN) +C15: TRNA 15 + HRRM FILN,FREE ;SAVE + CAMN C,TAB-1(FILN) ;SEARCH FOR TYPED-IN FILE + CAME B,TAB(FILN) + AOBJN FILN,LUP + JUMPL FILN,BEG69 ;IF FILE FOUND + JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP +FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE + SKIPE TAB(FILN) + JRST ERR + +BEG69: SKIPN WRITE ;DELETE? + CLEARB B,C ;YES, KILL FILE + MOVEM C,TAB-1(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP + MOVEM B,TAB(FILN) + MOVEI FILN,1(FILN) + LSH FILN,-1 ;FORM DIR NO + JUMPLE WRITE,BEG69A + ANDCAM WRITE,TAB+55(FILN) + IORM WRITE,TAB+104(FILN) + +BEG69A: CLEARB BLKNO,E ;START AT BEG OF TAPE + TRNE WRITE,4 + JRST LOADS + + DUMP: MOVE A,[(,LOW-HIGH)LOW] + MOVEI CKS,SPNT +DMP1: SKIPN (A) ;FIND SOME NON-ZERO CORE + AOBJN A,.-1 + MOVEM A,D ;SAVE ADR + SKIPN (A) ;FIND SOME ZERO CORE + SKIPE 1(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + AOBJN A,.-2 + SUB D,A ;GET COUNT + ADDI D,(A) ;GET F.A. + MOVEM D,(CKS) ;SAVE HEADER + MOVE CKS,A ;F.A.+W.C.IS ADR OF NEXT HEADER + JUMPL A,DMP1 ;GET NEXT BLOCK +DMP2: MOVE CKS,[JRST 1] + MOVEI D,SPNT +DMP3A: JSP P,UWAIT + JFCL CKS ;FIRST WORD TO LOOK LIKE END OF LOADER +DMP3: MOVE D,(D) ;GET HEADER + JUMPGE D,THRU ;IF NULL HEADER FOUND + SKIPA Q,LUP +LODUMP: CAMN D,[JRST 1] + TLO BLKNO,400000 ;JRST 1 DUMPED OR READ + JSP P,UWAIT + MOVE CKS,D ;OUTPUT HEADER + JUMPGE BLKNO,LODUMP + JUMPGE D,JBLK ;IF JRST BLOCK READ + JUMPGE CH,DMP5 ;IF NOT LOADING SYMS + HLRO P,D + ADD P,D + ADDB P,@DDT-1 ;COMPUTE LOAD ADR FOR SYMS AND UPDATE POINTER + HRR D,P +DMP5: ROT CKS,1 ;TRANSFER A DATA BLOCK + JSP P,UWAIT + ADD CKS,(D) ;OUTPUT DATA WORD + AOBJN D,DMP5 + JRST (Q) + +;WRITE: 1=D 0=K -5=I -1=ELSE + +THRU: JUMPL WRITE,BEG + JSP P,UWAIT + TRZA WRITE,SADR ;OUTPUT JRST BLOCK +UWAIT: SOJG E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P) + ;E IS WD COUNT IN BLOCK +MNLUP: AOSA BLKNO +MNLUP1: DPB B,PNTR ;FOR DELETE + ILDB A,PNTR ;SEARCH FILE DIR + CAIN A,37 + JRST DELE ;END OF TAB MARKER + TLO A,-1(WRITE) + CAIE FILN,(A) + JUMPN A,MNLUP + DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK + JUMPE WRITE,MNLUP1 +RBLK: MOVE C,TAPENO ;CURRENT TAPE NO. +IFE TD10,[ CONSZ UTS,40 ;WRITING ON + JRST .-1 + CONSO UTC,200000 ;SEL ENABLE +]IFN TD10,[ CONSO DTC,300000 + TRO C,10000 +]RBLK3:IFE TD10, TRO C,2000 ;DELAY 160 MS +RBLK1: SETOB F,A ;F IS DIR +RBLK4: CONO UTC,220200(C) ;SEL ENBL, GO, READ B.N. +IFE TD10, CONO DC,4010 ;BUF AC MOVE, IN, DEVICE 1 +UWAIT1: CONSZ UTS,6+672672*TD10 ;ERRORS? + JRST ERR +IFE TD10, CONSO DC,1000 ;DATA BF RQ +IFN TD10, CONSO DTS,1 + JRST .-3 + JUMPGE A,INOUT(WRITE) ;W.C. >0: TRANSFER DATA, EXIT + HRRO C,TAPENO + DATAI DC,B ;BLOCK # + SUBI B,(BLKNO) + JUMPGE F,RBLK2A + JUMPE B,RBLE ;RIGHT BLOCK + JUMPL B,RBLK1 ;NOT YET +IFE TD10, TROA C,2000 ;OVERSHOT, SET 160 MS DELAY +IFN TD10, JRST .+2 +RBLK2A: AOJ B,BEGR +RBLK2: AOJL B,RBLK3 ;IF PASSED BLOCK IN REVERSE + TRO C,10000+670000*TD10 ;REVERSE + AOJA F,RBLK4 +RBLE: SKIPL WRITE + TRO C,400 ;CHANGES "RD DATA" TO "WR DATA" + CONO UTC,220300(C) ;SEL ENBL, GO, READ DATA +IFE TD10,[ SKIPL WRITE + CONO DC,3410 ;DATA AC RQ, DATA BF RQ, OUT, DEV 1 +] MOVEI E,200 + AOJA A,UWAIT1 + + DATAI DC,G + CAME G,@(P) + JRST ERR + JRST UWAIT2 + DATAI DC,@(P) +INOUT: JRST UWAIT2 + DATAO DC,@(P) +UWAIT2:IFE TD10, JRST (P) +IFN TD10,[ SOJN E,UWAIT3 + CONO DTS,1 + CONSO DTS,100000 + JRST .-1 +UWAIT3: AOJA E,(P) +] + +ALTMD: MOVEI A,"$ + JSP P,TYO + CAIE CH,'K + CAIN CH,'D + AOJLE WRITE,.-1 + CAIN CH,'G + JRST @SADR + CAIN CH,'I + MOVNI WRITE,5 + CAILE CH,31 ;SKIP IF NUMBER + JRST TYI + LSH B,3 ;CONVERT SIXBIT TO OCTAL + LSHC F,3 + JUMPN B,.-2 + CAILE F,7 ;SKIP IF NOT ONE DIGIT + JRA D,JBLK +OPNTP: LSH F,3+6*TD10 + MOVEM F,TAPENO +CLSTP: MOVEI BLKNO,100 ;BLK NO OF FILE DIR + JSP P,RBLK + AOJ A,TAB(A) ;READ OR WRITE DIR TAB AND GUNCH + SOJG E,UWAIT1 + JRST BEG + + +LISTF: HRRI E,TAB-1 + MOVSI A,770000 + TDNN E,SPACE + JRST CR3 + TLNN E,770000 + JSP P,LISTF3 +LISTF2: MOVEI P,LISTF+1 + ILDB A,E +LISTF3: MOVEI A,40(A) + JRST TYO + +SPNT: 0 +END BEGRî +  \ No newline at end of file diff --git a/src/syseng/macdmp.moby1 b/src/syseng/macdmp.moby1 new file mode 100644 index 00000000..49b89fa2 --- /dev/null +++ b/src/syseng/macdmp.moby1 @@ -0,0 +1,311 @@ +TITLE MACDMP + +RIM10 +RLC=740000 +NOSYMS +F=0 +A=2 +B=1 +C=3 +D=4 +E=5 +P=6 +CKS=7 +FILN=10 +BLKNO=11 +WRITE=12 +PNTR=13 +CH=14 +Q=15 +G=16 +DDT=RLC+34000 +COMPTR=RLC+37777 + +DEFINE INFORM A,B +IF1 [PRINTX \A = B +\] +TERMIN + +LOC RLC+37176 +FOOF: + ;RLC+37176 + LOZAD=.-1 + LOW=20 + HIGH=.-1 + + BLOCK 1 +TAB: BLOCK 200 ;FILE DIRECTORY +TAPENO: BLOCK 1 +BEGR: CLEARM COMPTR + CONO 635550 +BEG: JSP P,CRR + MOVEI D,SPNT-1 +BEG1: CLEARB A,FOOF + EXCH A,1(D) ;REMOVE HEADER LIST + AOBJN A,. + MOVEI D,-1(A) + JUMPN D,BEG1 + MOVE PNTR,[500,,TAB+55] + CLEARB CH,F + MOVNI WRITE,1 +TYI: MOVSI B,400000 ;INIT FILE NAME TO @ @ +SPACE: EXCH C,B + MOVSI B,400000 + MOVSI E,20600 ;FAKE OUT END-TEST AND CLEAR 'EXCH' + CONO UTC,0 +NEXT: ILDB A,@BEGR + JUMPN A,RCH + MOVSI CKS,770000 + MOVEI Q,1 + MOVNI P,24. + MOVNI FILN,1 + MOVE G,[34156261770] + CONO DIS,100 + CONSO TTY,40 + JRST GODIS + DATAI TTY,A + JSP P,TYO +RCH: CAIN A,33 + JRST ALTTST + ORCMI A,177 ;SET REST OF A TO -1 + AOJE A,BEGR ;IF IT WAS RUBOUT THEN CLEAR POINTER AND GO BACK TO BEGINNING +BELL: AOJ A,7 ;ADD ONE AGAIN + AOJGE A,ALTTST ;ADD ANOTHER, IF >=0 THEN ALTMODE + ADDI A,135 ;MUNG INTO SIXBIT + JUMPL A,CARRET ;TREAT ALL CONTROL CHARS AS CR. + JUMPE A,SPACE +NEXT1: TLNE E,770015 ;NO MORE THAN SIX CHARS + IDPB A,E + JRST NEXT +DLUP: MOVSI G,747375 + TDNE Q,TAB+54+25.(P) + ADDI G,200 + TDNE Q,TAB+103+25.(P) + ADDI G,100 + MOVNI A,4 + CONSZ DIS,2000 + JRST BEG70 + JUMPE P,NEXT +DL1: ADDI FILN,2 +DL: TDC G,[404040404040] + TDNE CKS,TAB-1(FILN) +GODIS: DATAO DIS,G + MOVEI BLKNO,34 + SOJG BLKNO,. + XCT STB(A) ;A INITIALLY CONTAINS 0, CLOBBERED TO -4 AT DLUP + AOJA A,DL + MOVE G,TAB-1(FILN) + MOVEI G,757575 + MOVE G,TAB(FILN) + MOVEI G,757575 +STB: AOJA P,DLUP + +JBLK: CAILE CH,'M ;SKIP IF SYMS NOT NEEDED + JRA CH,LOAD ;F=0 C(CH)LT=0 C(F)=-1 + CONO UTC,0 + JUMPL CH,DDTG ;IF SYMS JUST READ + HRRM D,SADR +IFE .&1,[ JUMPN CH,BEG ;IF NOT LOADGO COMMAND +SADR: JRST BEG ;CURRENT S.A. +] +IFN .&1,[SADR: JUMPE CH,BEG + JRST BEG +] +DDTG: HRROS DDT-1 ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + JRST DDT + +LOADS: MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO + CLEARM 40 + MOVE C,[(40)41] + CAIN CH,'T + MOVE D,@DDT-1 ;GET FIRST LOC OF DDT SYMS + TRNN CH,3 ;SKIP ON M,N,I NOT ON L,T,@ + BLT C,-1(D) ;ZERO CORE +LOAD: JSP Q,LODUMP + JSP P,UWAIT + CAMN CKS,D ;CHECK CHECKSUM + JRST LOAD +DELE: JUMPE C,BEG + SKIPN E,WRITE + AOJA WRITE,CLSTP +ERR: SKIPA P,NEXT +CRR: SKIPA A,NEXT1 + SKIPA A,BELL +TYO: SKIPN COMPTR + DATAO TTY,A + CONSZ TTY,20 + JRST .-1 + JUMPGE A,(P) + MOVEI A,12 + JRST TYO + + ALTTST: TLNN B,4040 + LDB CH,E + JUMPN CH,ALTMD +CARRET: AOJE A,NEXT1 + MOVSI FILN,-30 +LUP: AOJ FILN,DMP3A + SKIPN TAB-1(FILN) ;SEARCH FOR FREE FILE + SKIPE BLKNO,TAB(FILN) + TDZA BLKNO,BLKNO + HRRM FILN,FREE ;SAVE + CAMN C,TAB-1(FILN) ;SEARCH FOR TYPED-IN FILE + CAME B,TAB(FILN) + AOBJN FILN,LUP + JUMPL FILN,BEG69 ;IF FILE FOUND + JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP +FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE + SKIPE TAB(FILN) + JRST ERR + +BEG69: SKIPN WRITE ;DELETE? + CLEARB B,C ;YES, KILL FILE + MOVEM C,TAB-1(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP + MOVEM B,TAB(FILN) +BEG70: MOVEI FILN,1(FILN) + LSH FILN,-1 ;FORM DIR NO + JUMPLE WRITE,BEG69A + ANDCAM WRITE,TAB+55(FILN) + IORM WRITE,TAB+104(FILN) + +BEG69A: TRNE WRITE,4 + SOJA F,LOADS + + DUMP: MOVE A,[(,LOW-HIGH)LOW] + MOVEI CKS,SPNT +DMP1: SKIPE (A) ;FIND SOME NON-ZERO CORE + JRST DMP1C + AOBJN A,DMP1 + TLNE A,-2 + JRST DMP1 +DMP1C: MOVEM A,D ;SAVE ADR +DMP1B: SKIPN (A) ;FIND SOME ZERO CORE + SKIPE 1(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + SKIPA + JRST DMP1A + AOBJN A,DMP1B + TLNE A,-2 + JRST DMP1B +DMP1A: SUB D,A ;GET COUNT + ADDI D,(A) ;GET F.A. + MOVEM D,(CKS) ;SAVE HEADER + MOVE CKS,A ;F.A.+W.C.IS ADR OF NEXT HEADER + TLNE A,-1 + JRST DMP1 ;GET NEXT BLOCK +DMP2: MOVE CKS,[JRST 1] + MOVEI D,SPNT +DMP3A: JSP P,UWAIT + JFCL CKS ;FIRST WORD TO LOOK LIKE END OF LOADER +DMP3: MOVE D,(D) ;GET HEADER + JUMPGE D,THRU ;IF NULL HEADER FOUND + SKIPA Q,LUP +LODUMP: CAMN D,[JRST 1] + TLO BLKNO,400000 ;JRST 1 DUMPED OR READ + JSP P,UWAIT + MOVE CKS,D ;OUTPUT HEADER + JUMPGE BLKNO,LODUMP + JUMPGE D,JBLK ;IF JRST BLOCK READ + JUMPGE CH,DMP5 ;IF NOT LOADING SYMS + HLRO P,D + ADD P,D + ADDB P,@DDT-1 ;COMPUTE LOAD ADR FOR SYMS AND UPDATE POINTER + HRR D,P +DMP5: ROT CKS,1 ;TRANSFER A DATA BLOCK + JSP P,UWAIT + ADD CKS,(D) ;OUTPUT DATA WORD + AOBJN D,DMP5 + TLNE D,-2 + JRST DMP5 + JRST (Q) + ;WRITE: 1=D 0=K -5=I -1=ELSE + +THRU: JUMPL WRITE,BEG + JSP P,UWAIT + TRZA WRITE,SADR ;OUTPUT JRST BLOCK +UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P) + ;E IS -WD COUNT IN BLOCK +MNLUP: AOSA BLKNO +MNLUP1: DPB B,PNTR ;FOR DELETE + ILDB A,PNTR ;SEARCH FILE DIR + CAIN A,37 + JRST DELE ;END OF TAB MARKER + TLO A,-1(WRITE) + CAIE FILN,(A) + JUMPN A,MNLUP + DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK + JUMPE WRITE,MNLUP1 +RBLK: HRRO C,TAPENO ;CURRENT TAPE NO. + CONSZ UTS,40 ;WRITING ON + JRST .-1 + SETOB A,B +RB1: TRNN B,400001 + TRCA C,10000 + CONSO UTC,200000 + TRO C,2000 +RBG: CONO UTC,220200(C) + CONO DC,4011(A) +UWAIT1: CONSZ UTS,6 + JRST ERR + CONSO DC,1000 + JRST .-3 + JUMPL E,INOUT(WRITE) + DATAI DC,B + TRZ C,2000 + SUBI B,(BLKNO) + TRNE C,10000 + TRC B,-2 + JUMPN B,RB1 + MOVNI E,200 + TRO C,100 + JUMPLE WRITE,RBG + MOVNI A,401 + TRO C,400 + JRST RBG + + DATAI DC,G + CAME G,@(P) + JRST ERR + JRST (P) + DATAI DC,@(P) +INOUT: JRST (P) + DATAO DC,@(P) + JRST (P) + +ALTMD: MOVEI A,"$ + JSP P,TYO + CAIE CH,'K + CAIN CH,'D + AOJLE WRITE,.-1 + CAIN CH,'G + JRST @SADR + CAIN CH,'R ;R ALTMODE + JRST 20 ;TO READ IN PAPER TAPE + CAIN CH,'I + MOVNI WRITE,5 + CAILE CH,31 ;SKIP IF NUMBER + JRST TYI + LSH B,3 ;CONVERT SIXBIT TO OCTAL + LSHC F,3 + JUMPN B,.-2 + CAILE F,7 ;SKIP IF NOT ONE DIGIT + JRA D,JBLK +OPNTP: LSH F,3 + MOVEM F,TAPENO +CLSTP: MOVEI BLKNO,100 ;BLK NO OF FILE DIR + JSP P,RBLK + JFCL TAB+200(E) ;READ OR WRITE DIR TAB + AOJL E,UWAIT1 + JRST BEG + +SPNT: 0 +CONST: CONSTANTS + VARIABLES + +INFORM TAPE SELECTION LOCATION,\OPNTP + +IFN .&400,INFORM EXTRA REGISTERS,\37777-<.&37777> + +IFE .&400,INFORM EXCESS CRUD,\<.&377>+1 + +END BEGRî +  \ No newline at end of file