TITLE RIMIO ;CONVERTS RIM10B PAPER TAPES TO DMP FILES AND VICE-VERSA EXTERN JOBSA,JOBREL,JOBSYM,JOBS41 A=1 B=2 C=3 D=4 CHK=13 BLK=14 LNG=15 R=16 P=17 PDLEN==40 PDLIST: BLOCK PDLEN OFILE: BLOCK 5 ;OFILE+4 IS THE DEVICE. IFILE: BLOCK 5 ;IFILE+4 IS THE DEVICE OBUF: BLOCK 3 IBUF: BLOCK 3 DMPBUF: BLOCK 200 ;RANDOM ACCESS DUMP IO BUFFER. HILOC: 0 ;ERRORS: NOENT: OUTSTR [ASCIZ/Enter to create output file failed. /] JRST BEGIN NOLALT: OUTSTR [ASCIZ/Lookup to read-alter the output file failed. /] JRST BEGIN NOALT: OUTSTR [ASCIZ/Enter to read-alter the output file failed. /] JRST BEGIN NOPTR: OUTSTR [ASCIZ/OPEN of device PTR: failed. /] JRST BEGIN NOOPEN: OUTSTR [ASCIZ/OPEN failed /] JRST BEGIN ;INITIALIZATION, DISPATCH BEGIN: RESET MOVE P,[IOWD PDLEN,PDLIST] RORP: OUTSTR [ASCIZ/Read tape or Punch tape? (Type R or P) /] INCHWL A PUSHJ P,CLRIN TRZ A,40 ;MAKE SURE IT'S UPPERCASE CAIN A,"R" JRST RTAPE CAIN A,"P" JRST PTAPE OUTSTR [ASCIZ/? /] JRST RORP CLRIN: PUSH P,A CLRIN1: CAIE A,175 CAIN A,12 JRST APOPJ INCHWL A JRST CLRIN1 ;HERE'S HOW THE RIM10B LOADER LOOKS ON THE TAPE: PTR??104 ;AC 10 CONTAINS (WHEN 5 IS EXECUTED): ; SOJA 10,4 - INITIAL POINTER OR JRST WORD ; SOJA 10,3 - MIDDLE OF DATA BLOCK ; SOJA 10,2 - WHEN READING THE CHECKSUM WORD ; RIM10B: -16,,0 ; 0 INITIAL BLKI WORD CONO PTR,60 ; 1 START PTR IN BINARY MODE HRRI 10,4 ; 2 INITIALIZE 10 (FOR INDEX AND JUMP ADDR) CONSO PTR,10 ; 3 SKIP IF DONE JRST 3 ; 4 WAIT FOR DONE DATAI PTR,@7(10) ; 5 STORE DATA INDIRECT (13 OR 12 OR 11) XCT 7(10) ; 6 EXECUTES 13 OR 12 OR 11 XCT 12(10) ; 7 EXECUTES 16 OR 15 OR 14 SOJA 10,0 ;10 RH IS CLOBBERED TO 4 OR 3 OR 1 CAME 17,16 ;11 XCTED TO CHECK CHECKSUM ADD 17,1(16) ;12 XCTED TO COMPUTE CHECKSUM SKIPL 17,16 ;13 XCT TO INITIALIZE CHECKSUM AND ; SKIP IF THIS IS AN AOBJN WORD JRST 4,1 ;14 XCT TO HALT IF CHECKSUM FAILS AOBJN 16,3 ;15 XCT WHILE READING MIDDLE OF DATA BLOCK JRST 2 ;16 XCTED BY READIN MODE. XCT TO START PRGM ;17 CHECKSUM IS STORED HERE. RIMPTR: RIM10B-.,,RIM10B-1 ;IOWD POINTER TO THE RIM10B LOADER ;RTAPE RTAPE: OUTSTR [ASCIZ/Output file name: /] MOVEI R,OFILE MOVE A,[OFILE,,OFILE+1] SETZM OFILE BLT A,OFILE+4 MOVSI A,'DMP' MOVEM A,OFILE+1 PUSHJ P,GETFIL ;READ FILE NAME FROM USER. MOVEI A,17 ;OPEN CHANNEL SKIPN B,OFILE+4 MOVSI B,'DSK' MOVEI C,0 OPEN 1,A JRST NOOPEN MOVE D,[OFILE,,A] BLT D,D ENTER 1,A ;SELECT OUTPUT FILE. JRST NOENT CLOSE 1, ;WRITE 0 LENGTH FILE. RELEAS 1, MOVEI A,17 ;RE-OPEN CHANNEL SKIPN B,OFILE+4 MOVSI B,'DSK' MOVEI C,0 OPEN 1,A JRST NOOPEN MOVE D,[OFILE,,A] BLT D,D LOOKUP 1,A ;SEEK FILE WE JUST WROTE JRST NOLALT ;I JUST WROTE ONE. WHERE IS IT? MOVE D,[OFILE,,A] BLT D,D ENTER 1,A ;ENTER READ-ALTER MODE JRST NOALT INIT 0,13 ;PTR IN BINARY MODE. 'PTR ' IBUF JRST NOPTR OUTSTR [ASCIZ/Mount paper tape and type return when ready: /] MOVEI A,0 PUSHJ P,CLRIN MOVE B,RIMPTR PUSHJ P,TREAD ;READ IOWD FOR TAPE'S LOADER CAMLE A,1(B) ;OK IF TAPE'S LOADER IS LONGER JRST BADRIM ;BUT NOT IF SHORTER. MOVE C,A ;IOWD FOR TAPE'S LOADER ADD B,[1,,1] RIMCHK: PUSHJ P,TREAD ; CAME A,1(B) JRST BADRIM ;TAPE ISN'T IN RIM FORMAT. ADD C,[1,,1] AOBJN B,RIMCHK ;LOOP, GOBBLING THE RIM10B LOADER. JUMPG C,RIMOK ;JUMP IF TAPE'S IOWD IS COUNTED OUT PUSHJ P,TREAD ;READ AND THROW OUT EXTRA WORDS AOBJN C,.-1 ;FROM THE TAPE'S LOADER. RIMOK: PUSHJ P,FILINI GETBLK: PUSHJ P,TREAD SKIPL B,A ;SKIP IF THIS IS A POINTER WORD JRST SSTART ;SET STARTING ADDRESS MOVE CHK,B ;INITIALIZE CHECKSUM RIMLP: PUSHJ P,TREAD ADD CHK,A PUSHJ P,FILSTR ;STORE IN FILE. DATA A IN LOC 1(B) AOBJN B,RIMLP ;LOOP PUSHJ P,TREAD ;READ CHECKSUM WORD CAMN A,CHK JRST GETBLK ;GET ANOTHER IOWD. OUTSTR [ASCIZ/Checksum failure. /] HALT GETBLK UNEOF: OUTSTR [ASCIZ/Unexpected End of File from PTR: /] MOVEI A,0 ;STORE ZERO FOR THE STARTING ADDRE. SSTART: MOVE B,HILOC ;GET HIGHEST LOC LOADED. HRLI A,1(B) ;ONE BEYOND IS INITIAL JOBFF MOVEI B,JOBSA-1 PUSHJ P,FILSTR PUSHJ P,FILFRC CLOSE 1, RELEAS 1, RELEAS 0, JRST BEGIN BADRIM: OUTSTR [ASCIZ/Bad format RIM10B loader at the front of the tape? /] JRST BEGIN PTRERR: OUTSTR [ASCIZ/PTR input error /] GETSTS 0,A HALT .+1 SETSTS 0,10 TREAD: SOSLE IBUF+2 JRST TRED1 INPUT 0, STATZ 0,20000 JRST [POP P,(P) JRST UNEOF] STATZ 0,740000 JRST PTRERR TRED1: ILDB A,IBUF+1 POPJ P, FILSTR: MOVEI C,1(B) ;C?ABSOLUTE ADDRESS. CAIN C,36 ;EXEC MODE JOBSYM? MOVEI C,JOBSYM CAIN C,41 ;UUO TRAP? MOVEI C,JOBS41 ;YES. HERE'S WHERE IT BELONGS IN DMP FORMAT CAMLE C,HILOC ;IS THIS HIGHEST LOC LOADED THUS FAR? MOVEM C,HILOC ;YES. SAVE HIGHEST LOC LOADED. SUBI C,74 ;OFFSET TO DMP FILE ORIGIN=WORD # IN FILE. JUMPL C,CPOPJ ;RETURN IF OFF THE FRONT. IDIVI C,200 ;BLOCK NUMBER-1 IN C, WORD NUMBER IN D. ADDI C,1 ;THIS IS THE USET POINTER CAIN C,(BLK) ;SAME AS WHAT'S IN CORE? JRST FILST2 ;YES. - THIS IS THE EASY CASE. FILST0: PUSHJ P,FILFRC ;FORCE CURRENT RECORD OUT. ADVANCE TO NEXT CAIG C,(LNG) ;IS DESIRED RECORD WITHIN EXISTING FILE? JRST FILST1 ;YES. READ IT (UNLESS THE LAST RECORD) MOVEI BLK,(LNG) ;SET TO APPEND A ZERO RECORD TO THE FILE. JRST FILST0 FILST1: MOVEI BLK,(C) ;MAKE DESIRED RECORD THE CURRENT RECORD CAIL BLK,(LNG) ;IS THIS THE NON-EX RECORD AT END OF FILE? JRST FILST2 ;YES. WE CAN'T (AND DON'T NEED TO) READ IT. USETI 1,(BLK) INPUT 1,[-200,,DMPBUF-1 0] FILST2: MOVEM A,DMPBUF(D) ;STORE DATA POPJ P, FILINI: MOVEI BLK,1 ;REC # THAT IS "IN CORE". MOVEI LNG,1 ;RECORD NUMBER OF EOF SETZM HILOC ;HIGHEST LOCATION LOADED FILCLR: SETZM DMPBUF PUSH P,A MOVE A,[DMPBUF,,DMPBUF+1] BLT A,DMPBUF+177 APOPJ: POP P,A CPOPJ: POPJ P, FILFRC: USETO 1,(BLK) ;SELECT OUTPUT RECORD ALWAYS OUTPUT 1,[-200,,DMPBUF-1 ;WRITE CURRENT RECORD. 0] ADDI BLK,1 CAMGE LNG,BLK MOVE LNG,BLK ;INCREASE LNG IF INCREASING FILE. JRST FILCLR ;NEXT RECORD NUMBER ;THINGS TO WRITE LATER: GETFIL: MOVE A,['RIMOUT'] MOVEM A,(R) OUTSTR [ASCIZ/RIMOUT.DMP /] POPJ P, PTAPE: OUTSTR [ASCIZ/Not ready. /] jrst begin END BEGIN