1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-29 05:11:14 +00:00

Add MAGDMP - standalone program loader/dumper for magtape.

It's built for read-in mode, and a TM10A drive.
This commit is contained in:
Lars Brinkhoff
2017-01-19 11:17:52 +01:00
committed by Eric Swenson
parent c4df86d2b2
commit 06c2387bf5
3 changed files with 650 additions and 0 deletions

641
src/syseng/magdmp.27 Executable file
View File

@@ -0,0 +1,641 @@
TITLE MAGDMP
;MAGDMP is a standalone program loader/dumper for magtape.
;The format of binary programs is the same as the ITS "SBLK"
;format, as popularized by Midas. The tapes are normally
;created under timesharing with the MAGFRM program.
;
;MAGDMP filenames are:
; name1 <space> name2 <space> version_number
; name1 <space> name2
; version_number defaults to the equivalent of ">"
; name2
; name1 defaults to "@"
;
;MAGDMP commands are:
; <filename> <cr>
; clear core, load and start program
; L <filename> <cr>
; clear core, load program, leave control in MAGDMP
; M <filename> <cr>
; load program without clearing core ("merge"), leave control in MACDMP
; T <filename> <cr>
; clear core except DDT, load program, give symbol table
; to DDT, and start DDT. 777400G returns to MAGDMP
; F
; list directory (if you have a 340, the directory
; is displayed on the 340 and this command doesn't exist.
; 
; get the directory off the tape again
; D <filename> <cr>
; dump all non-zero core onto tape and give it the specified name
; G
; start program at its starting address
; The nnn command of DSKDMP does not work in MAGDMP.
;On non-KL10, load via hardware read-in.
;On KL10, load with a J MAGDMP command to KLDCP,
;which does the following:
;
;Reset KL10 and start microcode
;Set EPT location to ITS standard (currently 2000)
;Turn OFF the cache
;Load the following into memory:
;100/ 763760777176 ;DF10-C command for locs 777177-777777
;101/ 0
;102/ 734540000107 ;DATAO MTS,107 ;SET ICWA
;103/ 734200072200 ;CONO MTC,072200 ;READ CONTIN, ODD PAR, 800 BPI, CORE DUMP
;104/ 734740000100 ;CONSO MTS,100 ;AWAIT JOB DONE
;105/ 254000000104 ;JRST .-1
;106/ 254000777200 ;JRST 777200 ;JUMP TO MAGDMP
;107/ 100 ;ICWA
;START AT 102
.MLLIT==1
DEFINE SETF TEXT,FLG
IFDEF FLG,.STOP
.TAG FOOBAR
PRINTC "TEXT
FLG="
.TTYMAC FLAG
.TTYFLG==.TTYFLG+1
PRINTX/FLAG
/
.TTYFLG==.TTYFLG-1
IFSE FLAG,YES,FLG==1
IFSE FLAG,NO,FLG==0
IFSE FLAG,Y,FLG==1
IFSE FLAG,N,FLG==0
IFNDEF FLG,FLG==FLAG
TERMIN
IFNDEF FLG,.GO FOOBAR
TERMIN
SETF Paper Tape HRI?,PTRHRI
SETF KL10?,KL10P
SETF TM10B?,TM10BP
SETF 340?,340P
IFN PTRHRI,[
NOSYMS
RIM10
]
BUFFER=176000 ;THIS IS ABOUT THE LEAST DANGEROUS PLACE IN MEMORY TO PUT IT
IFN TM10BP, ICWA=20
IFN KL10P, PAG==10
IFN KL10P, .INSRT SYSTEM;EPT
CM=0
A=1
B=2
C=3
D=4
E=5
TT=6
I=7 .SEE DING
Q=10
J=11
R=12
W=13
H=14
P=17
T=16
U=15
MTC=340 ;MAG TAPE CHANNEL FOR FUNCTIONS
MTS=344 ;MAG TAPE CHANNEL FOR STOPPING AND STATUS
;SHIFTS FOR FIELDS IN CONO MTC,
UNITNO==15.
PARITY==14.
CDUMP==13.
FUNC==9.
DENSTY==6.
800BPI==2
556BPI==1
MAGCOM=0_<UNITNO>+1_<PARITY>+800BPI_<DENSTY>+1_<CDUMP>
;FUNCTIONS
NOOP1=0_<FUNC>+MAGCOM ;CLEAR INTERRUPT FLAGS
NOOP2=10_<FUNC>+MAGCOM ;INTERRUPT WHEN TRANSPORT IDLE
REWIND=1_<FUNC>+MAGCOM ;REWIND
READ=2_<FUNC>+MAGCOM ;READ
READAB=12_<FUNC>+MAGCOM ;READ ACROSS RECORD BOUNDARIES
READC=3_<FUNC>+MAGCOM ;READ/COMPARE
RDCAB=13_<FUNC>+MAGCOM ;READ/COMPARE ACROSS RECORD BOUNDARIES
WRITE=4_<FUNC>+MAGCOM ;WRITE
WRLEOR=14_<FUNC>+MAGCOM ;WRITE WITH LONG EOR GAP
WEOF=5_<FUNC>+MAGCOM ;WRITE EOF
SKIPF=6_<FUNC>+MAGCOM ;SPACE FOWARD ONE OR MORE RECORDS
SKFEOF=16_<FUNC>+MAGCOM ;SPACE TO EOF
SKIPB=7_<FUNC>+MAGCOM ;SPACE REVERSE ONE OR MORE RECORDS
SKBEOF=17_<FUNC>+MAGCOM ;SPACE REVERSE TO EOF
;FLAGS
JOBDON==100
DATREQ==1
EOF==10000
EOT==4000
RELOC=740000
DDT=RELOC+34000
LOC RELOC+37200
LOZAD=.-1
LOW=20
HIGH=.
DIRL==3 ;# WORDS PER DIRECTORY ENTRY
DEFINE INFORM A,B
IF2 [PRINTX \A = B
\]
TERMIN
GO:
IFE KL10P, CONO 635550
IFN KL10P,[
CONO APR,267760 ;I/O RESET, CLEAR AND DISABLE ALL APR FLAGS
CONO PI,010000 ;CLEAR P.I. SYSTEM
CONSZ PAG,620000 ;THE CACHE BETTER BE OFF & TRAPS DISABLED
JRST 4,.
]
MOVEI P,PDL-1
MOVE B,['MAGDMP]
GO00: MOVEI A,0
LSHC A,6
ADDI A,40
PUSHJ P,TYP
JUMPN B,GO00
CONO MTS,1 ;STOP ANY HRI HACKERY
GODIR: PUSHJ P,REW ;REWIND TAPE
PUSHJ P,MTWAIT
PUSHJ P,SKPFE ;SKIP OVER HRI FILE
MOVEI A,DIR-1 ;POINTER TO READ INTO
DIRLP: PUSHJ P,RREC ;READ HEADER RECORD
AOJA A,DIREOF ;GOT EOF
CAIGE R,3 ;SKIP IF RECORD ADEQUATELY LONG
JRST DING
PUSH A,BUFFER ;STORE 3 WORDS IN DIR
PUSH A,BUFFER+1 ;..
PUSH A,BUFFER+2 ;..
PUSHJ P,SKPFE ;SKIP OVER REST OF HEADER FILE
PUSHJ P,SKPFE ;SKIP OVER PROGRAM FILE
JRST DIRLP
DIREOF: HRRZM A,DIREND ;ADDRESS OF FIRST WORD AFTER DIRECTORY
DIRIN: MOVEI P,PDL-1
PUSHJ P,REW
GOR: PUSHJ P,CRR
SETZ CM,
SETZB U,RDWR
CMD1: SETZM J ;J = VERS #, U = # CHARS TYPED
MOVNI E,3
MOVSI H,(SETZ) ;FN1
SPACE: AOJE E,TYVER
EXCH W,H ;FN1
MOVSI H,(SETZ) ;FN2
SKIPA R,[440600,,H]
TYVER: MOVE R,[220600,,J]
DOVR:
IFN 340P,[
CONO DIS,100
CONSZ TTY,40
JRST TTY1
MOVEI A,DIR
MOVNI C,1
DNEXT: SUBI C,DTBL
DLUP: XCT DTB+DTBL(C)
DLUP2: TDC B,[404040,,404040]
DATAO DIS,B
MOVEI TT,200
SOJG TT,.
AOJL C,DLUP
ADDI A,DIRL
CAME A,DIREND
JRST DNEXT
JRST DOVR
SKIPA B,[020156,,261743]
DTB: MOVE B,(A) ;FN1
MOVEI B,757575 ;3 SPACES AND 3 SHIFT INS
MOVE B,1(A) ;FN2
HRRZ B,2(A) ;VERSION #
MOVEI B,747375 ;CR LF
DTBL==.-DTB
];END IFN 340P
TTY1:
IFE KL10P+340P,[
CONSO TTY,40
JRST .-1
]
IFE KL10P, DATAI TTY,A
IFN KL10P, MOVEI A,3400
.ALSO PUSHJ P,DTEXIO
.ALSO JUMPE A,.-2
PUSHJ P,TYP ;ECHO CHAR JUST READ
ORCMI A,177 ;SAME AS ANDI A,177 ? SUBI A,200
AOJE A,GOR ;RUBOUT. RESET (A-177)
AOJ A, ;(A-176)
AOJGE A,ALTTST ;(A-175 .GE. 0, I.E. A=175,176) ALTMODE
ADDI A,135 ;(A-40) SIXBIT
JUMPL A,[TRNE A,10
JRST ALTTST ;33 ALTMODE
JRST CARRET] ;15 OR 12
CAIL A,100
SUBI A,40 ;MIGHT BE LOWER CASE TTY
JUMPE A,SPACE
TLNE R,770000
IDPB A,R
AOJA U,DOVR
ALTTST: SOJLE U,ALTMD ;0 OR 1 CHARS BEFORE ALT
CARRET: JUMPE J,VEROK ;NO VER #
VERADJ: TRNE J,77
JRST VEROK1
LSH J,-6
JRST VERADJ
VEROK1: IORI J,202020
VEROK: PUSHJ P,MTWAIT
SETOB B,D ;B= HIGHEST VER # FOUND, D = INDEX
MOVEI A,DIR
LOOKL: CAMN W,(A)
CAME H,1(A)
JRST LOOKE
HRRZ C,2(A)
JUMPE J,LOOK1
CAMN C,J
JRST LOOK2
LOOKE: ADDI A,DIRL
CAME A,DIREND
JRST LOOKL
JUMPL CM,LOOKW ;WRITE
JUMPL D,ERR ;NOT FOUND FOR READ
LOOK2: JUMPL CM,ERR ;WRITE & FILE ALREADY EXISTS
SKIPE J
MOVE D,A
MOVEI A,LOZAD+1 ;FIRST LOCATION NOT TO ZERO
IFE KL10P,[
SETZM 40
MOVE C,[40,,41]
]
IFN KL10P,[
SETZM 3000 ;DEPENDS ON WHERE EPT IS, ETC.
MOVE C,[3000,,3001]
]
CAIN CM,'T
MOVE A,@DDT-1 ;ZERO ONLY UP TO DDT SYMS
CAIE CM,'M
BLT C,-1(A) ;ZERO CORE UNLESS MERGING
MOVEI A,-DIR+DIRL(D)
IDIVI A,DIRL
LSH A,1 ;# FILES TO SKIP
LOOKF1: PUSHJ P,SKPFE ;SKIP A FILE
SOJG A,LOOKF1
MOVEI R,-1 ;SO CRD WILL READ A RECORD
SETOB E,RDWR
LOADJ1: PUSHJ P,CRD ;READ UP TO 'JRST 1'
CAME A,[JRST 1]
JRST LOADJ1
LOAD: PUSHJ P,LODUMP
CAMN Q,A ;COMPARE CHECKSUM
JRST LOAD ;CHECKS, LOOP
;DROP THROUGH IF ERROR
;DROPS IN
DING:
ERR: PUSH P,ERRX ;DIRIN'S BANE, RESET PDL.
SKIPA A,GCTL ;= ^G
CRR: HRROI A,^M
TYP:
IFE KL10P,[
CONSZ TTY,20
JRST .-1
DATAO TTY,A
JUMPGE A,CPOPJ
MOVEI A,12
JRST TYP
]
IFN KL10P,[
PUSH P,A ;DON'T CLOBBER A
PUSHJ P,DTEXIO
POP P,A
JUMPGE A,CPOPJ
MOVEI A,12
DTEXIO: SETZM DTEFLG
HRRZM A,DTECMD
SETZM DTEF11
CONO DTE,%DBL11
SKIPN DTEFLG
JRST .-1
MOVE A,DTEF11
SETZM DTEFLG
POPJ P,
]
IFE 340P,[ ;REST OF LISTF COMMAND
LISTF1: MOVSI C,440600+D ;ON KL10, WON'T FIT EITHER ABOVE OR BELOW -400
LISTF2: ILDB A,C
ADDI A,40
PUSHJ P,TYP
MOVEI A,40
TLNN C,770000
XCT LISTFB(C) ;END OF WORD, DO SPECIAL FROB
JRST LISTF2
];340P
IFG .-<RELOC+37400>, .ERR BARF AT -400
LOC RELOC+37400
JRST DIRIN
IFE 340P,[ ;F COMMAND
LISTF: MOVEI D,DIR-DIRL
LISTF0: PUSHJ P,CRR
ADDI D,DIRL
CAME D,DIREND
JRST LISTF1
JRST GOR
LISTFB: PUSHJ P,TYP ;SPACE AFTER FN1
PUSHJ P,TYP ;SPACE AFTER FN2
JRST LISTF0 ;AFTER LENGTH, VERSION, LOOP BACK FOR NEXT FILE
]
JBLK: CAILE CM,'M ;SKIP IF SYMS NOT NEEDED
AOJE E,LOAD ;E = 0 => LOADING SYMS
PUSHJ P,REW
JUMPG E,DDTG ;JUMP IF SYMS JUST READ
HRRM A,SADR
JUMPN CM,GOR
SADR: JRST GOR
DDTG: HRROS DDT-1
JRST DDT
LOOK1: CAMG C,B
JRST LOOKE
MOVE B,C
MOVE D,A
JRST LOOKE
ALTMD: MOVEI A,"$
PUSHJ P,TYP
JUMPL U,GODIR ;GET NEW DIR
LDB CM,R ;CMD
IFE 340P,[
CAIN CM,'F
JRST LISTF
]
CAIN CM,'D
MOVNI CM,1
CAIN CM,'G
JRST SADR
JRST CMD1
LOOKW: JUMPN J,LOOKW2 ;USE VER # IN J
SKIPGE B
MOVEI B,202020
SUBI B,9_6+9
TRNN B,20
JRST LOOKW1
TRNE B,20_6
ADDI B,1_12.-10._6
ADDI B,10._6-<9_6+10.>
LOOKW1: HRRZI J,<9_6+10.>(B)
LOOKW2: MOVE B,DIREND
CAIN B,DIRF
JRST ERR ;DIRFULL
ADDI B,DIRL
EXCH B,DIREND
MOVEM W,(B)
MOVEM H,1(B)
HRRZM J,2(B)
SETO E, ;FLAG FOR WHETHER CODE OR SYMBOLS
LOOKWL: PUSHJ P,SKPFE
IFE TM10BP, PUSHJ P,SKPREC
IFN TM10BP,[ SETZM ICWA ;MTWAIT CLEARS EOF FLAG
CONO MTC,SKIPF
CONSO MTS,JOBDON
JRST .-1
]
CONSO MTS,EOF ;2 EOFS?
JRST LOOKWL
CONO MTC,SKBEOF ;SKIP BACK OVER LAST EOF
PUSHJ P,MTWAIT
MOVEI R,0 ;WRITE HEADER
HRLI B,-3
MOVE A,(B)
PUSHJ P,CWD
AOBJN B,.-2
PUSHJ P,CWDEOR
PUSHJ P,WREOF
MOVE A,[JRST 1] ;PUT PROGRAM HEADER
MOVEM A,BUFFER ;NOTE - R NOW CONTAINS 1
MOVEI I,LOW
DMP1: CAIL I,BUFFER ;DON'T DUMP THE BUFFER!!
CAILE I,BUFFER+2000
SKIPN (I) ;FIND SOME NON-ZERO CORE
AOJA I,DMP1 ;SINCE LOC(HIGH) IS NON-ZERO, DON'T HAVE TO CAIE I,HIGH
MOVEM I,Q ;SAVE BEGINNING POINTER
HRRZI A,200(I) ;MAX BLOCK SIZE
DMP1B: SKIPN (I) ;FIND SOME ZERO CORE
SKIPE 1(I) ;DON'T MAKE NEW BLOCK FOR 1 ZERO
CAMLE I,A ;DON'T MAKE BLOCK TOO BIG, EITHER
JRST DMP1A
CAIE I,HIGH ;STOP WHEN BEGINNING OF MAGDMP REACHED
AOJA I,DMP1B
DMP1A: MOVE A,Q ;CONSTRUCT AOBJN POINTER
GCTL: SUB Q,I .SEE DING ;RH GETS - # WDS IN BLK
HRL A,Q
JUMPGE A,DMPEND ;EITHER BLOCK > 128K OR REACHED END OF CORE
PUSHJ P,LODUMP
JRST DMP1
DMPEND: MOVE A,SADR ;END OF PROG, PUT STARTING ADDRESS
PUSHJ P,CWD ;WRITE JUMP BLOCK
PUSHJ P,CWD ;TWICE (NO SYMBOLS)
PUSHJ P,CWDEOR
PUSHJ P,WREOF ;THEN PUT TWO EOFS FOR LOGICAL EOT
PUSHJ P,WREOF
ERRX: JRST DIRIN
LODUMP: PUSHJ P,CWD ;READ OR WRITE HEADER
MOVE Q,A ;BEGIN CHECKSUM
JUMPGE A,JBLK ;JUMP IF NOT AOBJN POINTER
JUMPL E,DMP5 ;IF NOT LOADING SYMS
MOVS U,A
HRLI U,-1(U)
ADDB U,@DDT-1
HRR A,U
DMP5: MOVE B,A ;READ OR WRITE BLOCK OF WORDS
DMP6: ROT Q,1
HRRZ J,B
CAIL J,20
CAIL J,LOZAD
MOVEI J,H
MOVE A,(J)
PUSHJ P,CWD
MOVEM A,(J)
ADD Q,A
AOBJN B,DMP6
TLNE B,-2
JRST DMP6
MOVE A,Q
JRST CWD ;READ OR WRITE THE CHECKSUM
IFN TM10BP,[
; READ NEXT RECORD INTO BUFFER
; RETURNS RECORD LENGTH IN R, DISTURBS T,W ALSO.
; SKIP RETURN UNLESS EOF
RREC: MOVEI T,READ
MOVSI R,-2000_<0+IFN KL10P,[4]>
MTOPR: HRRI R,BUFFER-1
MOVEM R,ICWA
SETZM ICWA+1
DATAO MTS,[ICWA]
CONO MTC,(T)
CONSO MTS,JOBDON
JRST .-1
SKIPN R,ICWA+1 ;LAST DATA ADDRESS
JRST .-1 ;CONTROL WORD NOT WRITTEN YET, WAIT
MOVEI R,1-BUFFER(R) ;CONVERT TO # WORDS XFERRED
CONSO MTS,EOF+EOT ;SKIP RETURN UNLESS EOF
AOS (P)
POPJ P,
; WRITE RECORD FROM BUFFER
; TAKES RECORD LENGTH IN R, RETURNS # WORDS ACTUALLY
; WRITTEN IN R, WHICH I ASSUME WOULD BE THE SAME
; DISTURBS T,W. SKIP RETURN UNLESS EOT.
WREC: MOVEI T,WRITE
MOVN R,R
LSH R,18.+IFN KL10P,4
JRST MTOPR
]
IFE TM10BP,[
; READ NEXT RECORD INTO BUFFER
; RETURNS RECORD LENGTH IN R, DISTURBS T,W ALSO.
; SKIP RETURN UNLESS EOF
RREC: MOVEI T,READ
MOVSI R,(DATAI MTC,)
MOVEI W,2000
MTOPR: HRRI R,BUFFER-1
CONO MTC,(T)
MTOPRL: CONSO MTS,JOBDON+DATREQ
JRST .-1
CONSZ MTS,DATREQ
AOJA R,[ XCT R ? SOJG W,MTOPRL ? JRST .+1 ]
CONO MTS,1 ;END RECORD HERE
MOVEI R,1-BUFFER(R) ;CONVERT TO # WORDS XFERRED
CONSO MTS,EOF+EOT ;SKIP RETURN UNLESS EOF
AOS (P)
JRST MTWAIT ;WAIT FOR JOBDON TO COME ON BEFORE RETURNING
; WRITE RECORD FROM BUFFER
; TAKES RECORD LENGTH IN R, RETURNS # WORDS ACTUALLY
; WRITTEN IN R, WHICH I ASSUME WOULD BE THE SAME
; DISTURBS T, W. SKIP RETURN UNLESS EOT.
WREC: MOVEI T,WRITE
MOVSI W,(DATAO MTC,)
EXCH W,R
JRST MTOPR
]
CWD: SKIPGE RDWR ;PROCESS WORD IN OR OUT OF A
JRST CRD
CAIGE R,2000
JRST CWD1
CWDEOR: PUSHJ P,WREC
JRST DING
MOVEI R,0
CWD1: MOVEM A,BUFFER(R)
AOJA R,CPOPJ
CRD: MOVE A,BUFFER(R) ;READ NEXT WORD INTO A
CAMGE R,RECLEN
AOJA R,CPOPJ ;RETURN IF THAT WAS A VALID WORD
PUSHJ P,RREC ;NEED NEW RECORD
JRST DING ;SHOULDN'T HAVE RANDOM EOF
MOVEM R,RECLEN
MOVEI R,0
JRST CRD
WREOF: CONO MTC,WEOF ;WRITE EOF, FALL INTO MTWAIT
MTWAIT: CONSO MTS,JOBDON
JRST .-1
CONO MTC,NOOP1 ;CLEAR FLAGS
POPJ P,
REW: CONO MTC,REWIND ;BEGIN REWIND
CONSO MTS,JOBDON ;WAIT TILL REWIND BEGINS
JRST .-1
CONO MTC,NOOP2 ;CAUSE JOBDON WHEN REWIND DONE
CPOPJ: POPJ P,
IFN TM10BP,[
SKPFE: SETZM ICWA ;SPACE FILE
CONO MTC,SKFEOF
JRST MTWAIT
]
IFE TM10BP,[
SKPREC: JSP T,SKP ;SPACE RECORD
CONO MTS,1
SKPFE: JSP T,SKP ;SPACE FILE
DATAO MTC,0
SKP: CONO MTC,SKIPF
SKPL: CONSZ MTS,JOBDON
POPJ P,
CONSZ MTS,DATREQ
XCT (T)
JRST SKPL
]
PDL: BLOCK 6
DIREND: DIR
RECLEN: 0
RDWR: 0 ;-1 => READ
CONSTANTS
VARIABLES
DIR: BLOCK 20.*DIRL ;DIRECTORY AREA FOR 20. FILES
DIRF:
;DIRECTORY FORMAT
;WD1: FN1
;WD2: FN2
;WD3: LH => LENGTH IN 2000 WD BLOCKS IN SIXBIT
; RH => VERSION NUMBER IN SIXBIT
INFORM HIGH,\.
IFN .,[
IFL .-RELOC, .ERR BLOAT
IFG .-<RELOC+37777>, .ERR BLOAT
]
END GO