3 ;CONVERTS RIM10B PAPER TAPES TO DMP FILES AND VICE-VERSA
\r
5 EXTERN JOBSA,JOBREL,JOBSYM,JOBS41
\r
21 OFILE: BLOCK 5 ;OFILE+4 IS THE DEVICE.
\r
22 IFILE: BLOCK 5 ;IFILE+4 IS THE DEVICE
\r
26 DMPBUF: BLOCK 200 ;RANDOM ACCESS DUMP IO BUFFER.
\r
30 NOENT: OUTSTR [ASCIZ/Enter to create output file failed.
\r
34 NOLALT: OUTSTR [ASCIZ/Lookup to read-alter the output file failed.
\r
38 NOALT: OUTSTR [ASCIZ/Enter to read-alter the output file failed.
\r
42 NOPTR: OUTSTR [ASCIZ/OPEN of device PTR: failed.
\r
46 NOOPEN: OUTSTR [ASCIZ/OPEN failed
\r
50 \f;INITIALIZATION, DISPATCH
\r
53 MOVE P,[IOWD PDLEN,PDLIST]
\r
54 RORP: OUTSTR [ASCIZ/Read tape or Punch tape? (Type R or P) /]
\r
57 TRZ A,40 ;MAKE SURE IT'S UPPERCASE
\r
73 ;HERE'S HOW THE RIM10B LOADER LOOKS ON THE TAPE:
\r
75 ;AC 10 CONTAINS (WHEN 5 IS EXECUTED):
\r
76 ; SOJA 10,4 - INITIAL POINTER OR JRST WORD
\r
77 ; SOJA 10,3 - MIDDLE OF DATA BLOCK
\r
78 ; SOJA 10,2 - WHEN READING THE CHECKSUM WORD
\r
80 RIM10B: -16,,0 ; 0 INITIAL BLKI WORD
\r
81 CONO PTR,60 ; 1 START PTR IN BINARY MODE
\r
82 HRRI 10,4 ; 2 INITIALIZE 10 (FOR INDEX AND JUMP ADDR)
\r
83 CONSO PTR,10 ; 3 SKIP IF DONE
\r
84 JRST 3 ; 4 WAIT FOR DONE
\r
85 DATAI PTR,@7(10) ; 5 STORE DATA INDIRECT (13 OR 12 OR 11)
\r
86 XCT 7(10) ; 6 EXECUTES 13 OR 12 OR 11
\r
87 XCT 12(10) ; 7 EXECUTES 16 OR 15 OR 14
\r
88 SOJA 10,0 ;10 RH IS CLOBBERED TO 4 OR 3 OR 1
\r
89 CAME 17,16 ;11 XCTED TO CHECK CHECKSUM
\r
90 ADD 17,1(16) ;12 XCTED TO COMPUTE CHECKSUM
\r
91 SKIPL 17,16 ;13 XCT TO INITIALIZE CHECKSUM AND
\r
92 ; SKIP IF THIS IS AN AOBJN WORD
\r
93 JRST 4,1 ;14 XCT TO HALT IF CHECKSUM FAILS
\r
94 AOBJN 16,3 ;15 XCT WHILE READING MIDDLE OF DATA BLOCK
\r
95 JRST 2 ;16 XCTED BY READIN MODE. XCT TO START PRGM
\r
96 ;17 CHECKSUM IS STORED HERE.
\r
98 RIMPTR: RIM10B-.,,RIM10B-1 ;IOWD POINTER TO THE RIM10B LOADER
\r
101 RTAPE: OUTSTR [ASCIZ/Output file name: /]
\r
103 MOVE A,[OFILE,,OFILE+1]
\r
108 PUSHJ P,GETFIL ;READ FILE NAME FROM USER.
\r
110 MOVEI A,17 ;OPEN CHANNEL
\r
118 ENTER 1,A ;SELECT OUTPUT FILE.
\r
120 CLOSE 1, ;WRITE 0 LENGTH FILE.
\r
122 MOVEI A,17 ;RE-OPEN CHANNEL
\r
130 LOOKUP 1,A ;SEEK FILE WE JUST WROTE
\r
131 JRST NOLALT ;I JUST WROTE ONE. WHERE IS IT?
\r
134 ENTER 1,A ;ENTER READ-ALTER MODE
\r
137 INIT 0,13 ;PTR IN BINARY MODE.
\r
142 OUTSTR [ASCIZ/Mount paper tape and type return when ready:
\r
148 PUSHJ P,TREAD ;READ IOWD FOR TAPE'S LOADER
\r
149 CAMLE A,1(B) ;OK IF TAPE'S LOADER IS LONGER
\r
150 JRST BADRIM ;BUT NOT IF SHORTER.
\r
151 MOVE C,A ;IOWD FOR TAPE'S LOADER
\r
153 RIMCHK: PUSHJ P,TREAD ;
\r
155 JRST BADRIM ;TAPE ISN'T IN RIM FORMAT.
\r
157 AOBJN B,RIMCHK ;LOOP, GOBBLING THE RIM10B LOADER.
\r
158 JUMPG C,RIMOK ;JUMP IF TAPE'S IOWD IS COUNTED OUT
\r
159 PUSHJ P,TREAD ;READ AND THROW OUT EXTRA WORDS
\r
160 AOBJN C,.-1 ;FROM THE TAPE'S LOADER.
\r
161 RIMOK: PUSHJ P,FILINI
\r
162 GETBLK: PUSHJ P,TREAD
\r
163 SKIPL B,A ;SKIP IF THIS IS A POINTER WORD
\r
164 JRST SSTART ;SET STARTING ADDRESS
\r
165 MOVE CHK,B ;INITIALIZE CHECKSUM
\r
166 RIMLP: PUSHJ P,TREAD
\r
168 PUSHJ P,FILSTR ;STORE IN FILE. DATA A IN LOC 1(B)
\r
169 AOBJN B,RIMLP ;LOOP
\r
170 PUSHJ P,TREAD ;READ CHECKSUM WORD
\r
172 JRST GETBLK ;GET ANOTHER IOWD.
\r
173 OUTSTR [ASCIZ/Checksum failure.
\r
177 UNEOF: OUTSTR [ASCIZ/Unexpected End of File from PTR:
\r
179 MOVEI A,0 ;STORE ZERO FOR THE STARTING ADDRE.
\r
180 SSTART: MOVE B,HILOC ;GET HIGHEST LOC LOADED.
\r
181 HRLI A,1(B) ;ONE BEYOND IS INITIAL JOBFF
\r
190 BADRIM: OUTSTR [ASCIZ/Bad format RIM10B loader at the front of the tape?
\r
194 PTRERR: OUTSTR [ASCIZ/PTR input error
\r
199 TREAD: SOSLE IBUF+2
\r
207 TRED1: ILDB A,IBUF+1
\r
210 FILSTR: MOVEI C,1(B) ;C?ABSOLUTE ADDRESS.
\r
211 CAIN C,36 ;EXEC MODE JOBSYM?
\r
213 CAIN C,41 ;UUO TRAP?
\r
214 MOVEI C,JOBS41 ;YES. HERE'S WHERE IT BELONGS IN DMP FORMAT
\r
215 CAMLE C,HILOC ;IS THIS HIGHEST LOC LOADED THUS FAR?
\r
216 MOVEM C,HILOC ;YES. SAVE HIGHEST LOC LOADED.
\r
217 SUBI C,74 ;OFFSET TO DMP FILE ORIGIN=WORD # IN FILE.
\r
218 JUMPL C,CPOPJ ;RETURN IF OFF THE FRONT.
\r
219 IDIVI C,200 ;BLOCK NUMBER-1 IN C, WORD NUMBER IN D.
\r
220 ADDI C,1 ;THIS IS THE USET POINTER
\r
221 CAIN C,(BLK) ;SAME AS WHAT'S IN CORE?
\r
222 JRST FILST2 ;YES. - THIS IS THE EASY CASE.
\r
223 FILST0: PUSHJ P,FILFRC ;FORCE CURRENT RECORD OUT. ADVANCE TO NEXT
\r
224 CAIG C,(LNG) ;IS DESIRED RECORD WITHIN EXISTING FILE?
\r
225 JRST FILST1 ;YES. READ IT (UNLESS THE LAST RECORD)
\r
226 MOVEI BLK,(LNG) ;SET TO APPEND A ZERO RECORD TO THE FILE.
\r
229 FILST1: MOVEI BLK,(C) ;MAKE DESIRED RECORD THE CURRENT RECORD
\r
230 CAIL BLK,(LNG) ;IS THIS THE NON-EX RECORD AT END OF FILE?
\r
231 JRST FILST2 ;YES. WE CAN'T (AND DON'T NEED TO) READ IT.
\r
233 INPUT 1,[-200,,DMPBUF-1
\r
235 FILST2: MOVEM A,DMPBUF(D) ;STORE DATA
\r
238 FILINI: MOVEI BLK,1 ;REC # THAT IS "IN CORE".
\r
239 MOVEI LNG,1 ;RECORD NUMBER OF EOF
\r
240 SETZM HILOC ;HIGHEST LOCATION LOADED
\r
241 FILCLR: SETZM DMPBUF
\r
243 MOVE A,[DMPBUF,,DMPBUF+1]
\r
248 FILFRC: USETO 1,(BLK) ;SELECT OUTPUT RECORD ALWAYS
\r
249 OUTPUT 1,[-200,,DMPBUF-1 ;WRITE CURRENT RECORD.
\r
253 MOVE LNG,BLK ;INCREASE LNG IF INCREASING FILE.
\r
254 JRST FILCLR ;NEXT RECORD NUMBER
\r
255 \f;THINGS TO WRITE LATER:
\r
257 GETFIL: MOVE A,['RIMOUT']
\r
259 OUTSTR [ASCIZ/RIMOUT.DMP
\r
263 PTAPE: OUTSTR [ASCIZ/Not ready.
\r