mirror of
https://github.com/PDP-10/its.git
synced 2026-02-06 16:44:44 +00:00
644 lines
13 KiB
Plaintext
644 lines
13 KiB
Plaintext
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
|
||
|