-2,2 ; .IDENT /V02.00/ .IDENT /CDA..0/ -39 ; 030 06-AUG-84 ADDED DISK I/O CAPABILITIES ; -47,48 .MCALL OPEN$R,CLOSE$ ;+++029 ; -55 .BINSZ: .WORD 384.*4 ;+++029 384. BLOCKS*4 = 384K WORDS OPNER: ERRMSG ;+++029 .EVEN ;+++029 -61,71 TEMP: .WORD 0 ;+++029 TEMPORARY STORAGE FOR THE STACK POINTER .XFR:: ; ; .RANDM = 0, READ FROM TAPE ; .RANDM = 2, READ FROM BINARY FILE ; ; IF BINARY FILE OPEN, .RANDM = 2 AND WE EXIT QUICKLY ; IF WRITING BINARY FILE, WRTBIN <> 0 AND WE CREATE FILE HERE. ; IF DOING TAPE I/O ONLY, .RANDM = 0 AND WRTBIN = 0, SO RETURN. ; MOV SP,TEMP TST .RANDM ;+++029 UNLESS A DISK FILE WAS BEQ 10$ ;+++029 IF 0, READ FROM MM0: MOV TEMP,SP RETURN ;ELSE RETURN 10$: TST WRTBIN ;+++030 BNE 20$ ;+++030 RETURN ;+++030 20$: MOV #0,R3 ;+++029 START DUMP FILE AT BLOCK LBN 0 MOV .BINSZ,R5 ;GET SIZE OF DUMP FILE (BLOCKS) MOV #BINFDB,R0 ;FDB ADDRESS IN R0 HERE: MOV #.BLKBF,R4 ;+++029 ADDED #USE BLOCK BUFFER FOR I/O ;+++029 MOV .NBLKS,R2 ;SIZE OF BUFFER (BLOCKS) MOV #NBLKS,R2 ;+++029 (IT'S A SYMBOL) SIZE OF BUFFER (BLOCKS) -85,92 ;+++029 IF .RANDM <> 0, WOULDN'T HAVE GOTTEN THIS FAR. ;+++029 TST .RANDM ;INPUT FROM DISK OR DECTAPE? ;+++029 BEQ 40$ ;BR IF NO, CANNOT DO MULTI-BLOCK READS ;+++029 SWAB R2 ;ELSE READ IN MULTIPLE BLOCKS ;+++029 ASL R2 ;R2 = NUMBER OF BYTES TO READ ;+++029 MOV R2,.INQIO+Q.IOBS ;SET SIZE IN QIO DPB ;+++029 MOV R2,R1 ;SAVE BYTE COUNT FOR FCS WRITE ;+++029 CLR R2 ;ZERO INDICATES ALL BLOCKS READ ;+++029 CALL .QIO ;DO THE READ -98,101 ;+++029 ADD (SP),R3 ;ADVANCE BLOCK POINTER ;+++029 BR 50$ ;THEN GO DO THE WRITES 40$: CALL .QIO ;ISSUE QIO, R3=BLK NUM, R4=BUFF ADDR -112,131 MOV #.BLKBF,R4 ;+++029 (ADDED #)GET START OF BUFFER ADDRESS SUB R4,R1 ;CALCULATE LENGTH OF BUFFER 60$: WRITE$ R0,R4,R1 ;WRITE BLOCK, AUTO-SEQUENCING BLK I/O BCC 61$ ;+++029 120$ ;ERROR IF CARRY SET JMP L120 ;+++029 61$: TSTB IOST ;CHECK IF I/O ERROR BGE 62$ ;+++029 120$ ;YES IF MINUS JMP L120 ;+++029 62$: WAIT$ R0 ;ELSE WAIT FOR I/O TO FINISH BCC 63$ ;+++029 120$ ;ERROR IF CARRY SET JMP L120 ;+++029 63$: TSTB IOST ;CHECK IF I/O ERROR BGE 64$ ;+++029 120$ ;YES IF MINUS JMP L120 ;+++029 64$: SUB (SP)+,R5 ;UPDATE NUMBER OF BLOCKS LEFT TST R2 ;END OF DUMP FOUND? BNE 70$ ;YES IF COUNTER DIDN'T EXPIRE TST R5 ;MORE BLOCKS TO DO? BEQ 70$ JMP HERE ;+++029 ;YES IF NE 0 -- GO AGAIN 70$: TST R5 ;FILE COMPLETELY FILLED? BEQ 100$ ;YES IF EQ 0 MOV #.BLKBF,R3 ;+++029 (ADDED #)ELSE FILL WITH ZEROS -139,139 ;+++029 TYPE$ #MSG1,R0 ;PRINT MESSAGE -144,171 BCC 91$ ;+++029 120$ ;ERROR IF CARRY SET JMP L120 ;+++029 91$: TSTB IOST ;CHECK IF I/O ERROR BGE 92$ ;+++029 120$ ;YES IF MINUS JMP L120 ;+++029 92$: WAIT$ R0 ;ELSE WAIT FOR I/O TO FINISH BCC 93$ ;+++029 120$ ;ERROR IF CARRY SET JMP L120 ;+++029 93$: TSTB IOST ;CHECK IF I/O ERROR BGE 94$ ;+++029 120$ ;YES IF MINUS JMP L120 ;+++029 94$: SOB R5,90$ ;WRITE NEXT BLOCK 100$: ;+++029 TST .RANDM ;INPUT FROM MAGTAPE? QIO$S #IO.RWD,#INLUN,,,,, ;ELSE REWIND TAPE -- DON'T WAIT ;+++029 BNE 110$ ;NO IF NE 0 ;+++029 QIO$S #IO.RWD,#LN.CDI,,,,, ;ELSE REWIND TAPE -- DON'T WAIT ;+++029110$: ;+++029BIC #CL.CDD,.CLFLG ;READ INPUT FROM FILE FROM NOW ON ;+++029 BIS #CL.CDI,.CLFLG ;SET FLAG FOR FILE INPUT ;+++029 MOV BINDEV+2,-(SP) ;GET ADDRESS OF DEVICE STRING ;+++029 MOV BINDEV,-(SP) ;GET LENGTH +++029 WAS +D.BIND ;+++029 TYPE$ #MSG2,SP ;TELL HIM HE CAN UNLOAD DUMP MEDIUM ;+++029 BIT #CL.LST,.CLFLG ;WAS A LISTING REQUESTED? ; ;+++029 CLOSE EXISTING FILE & OPEN FOR READ ; OUTLIN TST WRTBIN ;+++029 OPENED FOR DELETE IF = 0 BEQ 114$ ;+++029 DON'T CLOSE CLOSE$ #BINFDB ;+++029 OPEN$R #BINFDB,#INLUN,#CSIBLK+C.DSDS ;+++029 OPEN FOR READ ;+++029 CSIBLK+C.DSDS SHOULD STILL ;+++029 CONTAIN THE SPECS... BCS 116$ ;+++029 BR 117$ ;+++029 114$: MOV #BINFDB,R0 ;+++029 CALL .MRKDL ;+++029 MARK FOR DELETE 117$: MOV #2,.RANDM ;+++029 READ FROM DISK FILE FROM NOW ON MOV TEMP,SP ;+++029 RETURN ;+++029 RTN$ ;RETURN TO ROOT SEGMENT 116$: MOV #OPNER,R2 ;+++029 JMP .MSG ;+++029 COMPLAIN AND LEAVE ; ; ERROR ; L120: -176,177 ;+++029 FATAL$ #MSG3,R0 ;THEN EXIT MOV #MSG3,R2 ;+++029 JMP .MSG ;+++029 OUTPUT MESSAGE AND EXIT /