.TITLE FILE -- ROUTINE TO DUMP A FILE .IDENT /1/ .MCALL IF,WHILE,GET$,ERR$S,ERR$P,END,STRMACS,READ$,WAIT$ .MCALL IFB,ELSE,.USE STRMACS ; ; THIS ROUTINE IS CALLED TO PRINT ALL RECORDS IN THE ; FILE. EACH RECORD IS PRECEEDED WITH IT'S RECORD NUMBER ; (AND SIZE) THEN DUMPED IN OCTAL, ASCII AND RAD50 ; FILE:: CALL NEWPAG ;ADVANCE TO A NEW PAGE IF ,CS ;IF ERROR BR ERREXT ;EXIT END MOV #1,RCNO ;WE ARE AT RECORD 1 WHILE RCNO,LT,FROM ;SKIP MERRILY DOWN THE FILE TO THE ;SPECIFIED RECORD SKIP: IF #SW.BL,SETON,OPTION ;IF IN BLOCK MODE IF #SW.PH,SETOFF,OPTION ;IF NOT DOING PHYSICAL I/O READ$ #IN ;READ A BLOCK IF ,CC ;IF OK WAIT$ ;WAIT FOR I/O TO FINISH END ELSE MOV #IN,R0 ;NOT A DIRECTORY DEVICE, DO LOGICAL I/O MOV #IO.RLB,R1 ;READ A BLOCK MOV #5,R2 ;5 PARAMETERS MOV #QIOP,R3 ;PARAMETER ADDRESS CALL .XQIO ;DO THE QIO END ELSE GET$ #IN ;GET A RECORD END IF ,CS ;IF ERROR IFB #IE.EOF,EQ,F.ERR(R0) ;END OF FILE? DEC FILES ;YES. IS IT AN EXPECTED ONE? IF ,GT ;... BR SKIP ;YES. JUST KEEP ON READING END END ERRGE: MOVB F.ERR(R0),R1 ;GET NEG R1 ;ERROR CODE ERR$P #ERR,<%ERROR READING FILE : >,R1 ERR$P #ERR,<%%> ERREXT: SEC EXIT: RETURN END INC RCNO ;ADVANCE A RECORD END .USE JUMPS WHILE COUNT,GT,#0 ;WHILE WE ARE'NT DONE .USE BRANCHES READP: IF #SW.BL,SETON,OPTION ;IF IN BLOCK MODE IF #SW.PH,SETOFF,OPTIONS ;IF NOT DOING PHYSICAL I/O READ$ #IN ;READ A BLOCK IF ,CC ;IF OK WAIT$ ;WAIT FOR I/O TO FINISH END ELSE MOV #IN,R0 ;NOT A DIRECTORY DEVICE, DO LOGICAL I/O MOV #IO.RLB,R1 ;READ A BLOCK MOV #5,R2 ;5 PARAMETERS MOV #QIOP,R3 ;PARAMETER ADDRESS CALL .XQIO ;DO THE QIO MOV .FSRPT,R1 ;POINT TO FSR MOV A.IOST+2(R1),IOST+2 ;AND GET BYTE COUNT END ELSE GET$ #IN ;GET A RECORD END IF ,CS IFB F.ERR(R0),EQ,#IE.EOF ;IF AT END OF FILE MOV OUT+F.NRBD+2,R0 ;GET ADDRESS OF BUFFER MOVE <0***END OF FILE***> ;NORMAL END CALL PUT ;DUMP RECORD IF ,CC ;IF OK DEC FILES ;HAVE WE EXHAUSTED THE END OF FILE ;COUNT? IF ,LE ;YES BR EXIT ;EXIT ELSE BR READP ;NO, GO READ ANOTHER BLOCK/RECORD END END ELSE BR ERRGE ;GO HANDLE ERROR GETTING RECORD END END MOV OUT+F.NRBD+2,R0 ;POINT AT OUTPUT BUFFER IF #SW.BL,SETON,OPTION ;IF IN BLOCK MODE MOVE <0BLOCK NUMBER > MOV IOST+2,R4 ;RECORD LENGTH MOV #BUF1,R5 ;AND BUFFER ADDRESS ELSE MOVE <0RECORD NUMBER > MOV IN+F.NRBD,R4 ;GET FILE RECORD LENGTH MOV IN+F.NRBD+2,R5 ;AND BUFFER ADDRESS END MOV RCNO,R1 ;GET CURRENT RECORD NUMBER CLR R2 ;CLEAR FLAGS CALL $CBDMG ;CONVERT TO TEXT MOVB #'.,(R0)+ ;DECIMAL MOVB #'(,(R0)+ ;AND OCTAL MOV RCNO,R1 ;RECORD NUMBER CLR R2 ;SUPPRESS LEADING ZEROS CALL $CBOMG ;... MOVE <) SIZE > MOV R4,R1 ;GET SIZE CALL $CBDMG ;CONVERT TO BINARY MOVB #'.,(R0)+ ;DECIMAL MOVB #'(,(R0)+ ;AND OCTAL MOV R4,R1 ;SIZE CLR R2 ;SUPPRESS LEADING ZEROS CALL $CBOMG ;... MOVB #'),(R0)+ ;CLOSING BRACKET CALL PUT ;GO DUMP LINE IF ,CS ;IF ERROR JMP ERREXT ;EXIT END CLR R3 ;START AT OFFSET 0 MOVB #'0,@OUT+F.NRBD+2 ;CARRIAGE CONTROL='0' CALL FORMAT ;FORMAT A RECORD DUMP IF ,CS ;IF ERROR JMP ERREXT ;EXIT END DEC COUNT ;DECREMENT RECORD COUNT INC RCNO ;INCREMENT RECORD NUMBER END CLC ;SHOW OK JMP EXIT .END