1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-29 03:04:58 +00:00

MACDMP - DECtape file I/O.

This commit is contained in:
Lars Brinkhoff
2019-03-12 09:58:18 +01:00
parent 52240d6e48
commit 00f442df28

451
src/syseng/macdmp.6u64 Normal file
View File

@@ -0,0 +1,451 @@
RLC==140000
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 <JRST 1>
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î