1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-06 16:44:44 +00:00
Files
PDP-10.its/src/syseng/magdmp.29
2018-02-28 16:49:04 +01:00

644 lines
13 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
IFE KL10P, TTY==120
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
CAIGE A,40
CAIL A,175
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