.TITLE TAN -- TAPE ANALYZER .IDENT /V02.01/ $USRTO =: 50 ;USER TOP ADDRESS $ERRBY =: 52 ;USER ERROR BYTE $USRRB =: 53 ;USER ERROR BYTE FATAL$ =: 10 ;FATAL ERROR STATUS $JSX =: 4 ;EXTENDED JOB STATUS WORD VBGEX$ =: 200 ;ALLOW VBGEXE BIT ALL64$ =: 20 ;ALLOW 64KB USER SPACE SF.MRD =: 370 ;READ PHYSICAL BLOCK FUNCTION MAXEOF =: 3. ;MAX EOF COUNT MAXERR =: 3. ;MAX ERR COUNT CR =: 15 ;CARRIAGE RETURN EOL =: 200 ;END OF LINE (NO CRLF) .MCALL .EXIT,.FETCH,.LOOKUP,.PRINT,.SETTOP,.SPFUN .ASECT .=$JSX .WORD VBGEX$!ALL64$ ;ALLOW VBGEXE .PSECT CODE,I,RO START:: MOV @#$USRTO,R5 ;GET TOP ADDRESS TST (R5)+ ;POINT TO HANDLER/BUFFER SPACE MOV #DBLK,R2 ;POINT TO DEVICE NAME BLOCK .FETCH R5,R2 ;FETCH HANDLER BCC 20$ ;IF CC OK MOV #FLOAD,R1 ;SET ERROR MESSAGE 10$: CALL PRINT ;PRINT MESSAGE BISB #FATAL$,@#$USRRB ;SET FATAL ERROR STATUS 15$: .SETTOP #0 ;WE DON'T WANT SWAPPING ON EXIT CLR R0 ;ENFORCE HARD RESET .EXIT ;EXIT 20$: MOV R0,R5 ;POINT TO I/O BUFFER .LOOKUP #AREA,#0,#DBLK,#0 ;LOOKUP THE TAPE BCC 25$ ;IF CC OK MOV #FLOOK,R1 ;SET ERROR MESSAGE BR 10$ ;PRINT MESSAGE AND EXIT 25$: .SETTOP #-2 SUB R5,R0 ;R0=BUFFER SIZE IN BYTES TST (R0)+ ; MOV R0,MTST ;SAVE IT FOR PRINTING ROR R0 ;R4=BUFFER SIZE IN WORDS MOV R0,R4 ; MOV #FBUFF,R1 ;PRINT BUFFER SIZE CALL PRINT ; ;R4 = MAX BLOCK SIZE (W0RDS) ;R5 = BUFFER ADDRESS CLR R3 ;INITIALIZE EOF COUNT 30$: CLR BLKC ;INITIALIZE BLOCK COUNT CLR BLKS ;INITIALIZE BLOCK SIZE 35$: MOV R4,R1 ;COPY BLOCK COUNT .SPFUN #AREA,#0,#SF.MRD,R5,R4,#MTST ;READ THE BLOCK BCC 55$ ;IF CS OK TSTB @#$ERRBY ;EOF DETECTED? BNE 50$ ;IF NE NO CALL PCRLF ;PRINT CRLF IF NEEDED MOV MTST,R0 ;SAVE STATUS MOV #EOF,MTST ;ASSUME EOF ONLY DEC R0 ; BEQ 45$ ;IF EQ YES MOV #EOM,MTST ;ASSUME END OF MEDIA DEC R0 ; BEQ 40$ ; MOV #EOT,MTST ;END OF TAPE DETECTED 40$: MOV #MAXEOF-1,R3 ;WE'RE DONE 45$: MOV #FEOFC,R1 ;PRINT EOF CONDITION CALL PRINT ; INC R3 ;UPDATE EOF COUNT CMP #MAXEOF,R3 ;MAX EOF COUNT REACHED? BGT 30$ ;IF GT NO - TO NEXT BLOCK BR 15$ ;EXIT 50$: CMP #6,MTST ;SHORT BLOCK READ? BNE 70$ ;IF NE NO -- READ ERROR SUB MTST+2,R1 ;CALCULATE BLOCK SIZE 55$: ASL R1 ;CONVERT TO BYTES CLR R3 ;RESET EOF COUNT CMP R1,BLKS ;BLOCK OF THE SAME SIZE? BEQ 60$ ;IF EQ YES CALL PCRLF ;PRINT CRLF IF NEEDED CLR BLKC ;INITIALIZE BLOCK COUNT MOV R1,BLKS ;UPDATE BLOCK SIZE 60$: INC BLKC ;UPDATE BLOCK COUNT MOV #FREAD,R1 ;PRINT READING STATUS MOV BLKC,MTST ; MOV BLKS,MTST+2 ; CALL PRINT ; BR 35$ ;TO NEXT BLOCK 70$: CALL PCRLF ;PRINT CRLF IF NEEDED MOV #FRDER,R1 ;PRINT ERROR STATUS CALL PRINT ; DEC ERRC ;ERROR LIMIT REACHED? BNE 30$ ;IF NE NO BR 15$ ;EXIT PRINT:: JSR R2,$SAVVR ;SAVE R0-R2 MOV #LNBUF,R0 ;POINT TO LINE BUFFER CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ .PRINT #LNBUF ;PRINT IT RETURN ;RETURN PCRLF:: TST BLKC ;NEED CRLF? BEQ 10$ ;IF EQ NO .PRINT #CRLF ;PRINT CRLF 10$: RETURN ;RETURN .PSECT DATA,D,RW DBLK: .RAD50 /TAP / ;DEVICE SPECIFICATION .BLKW ;PAD MTST: .BLKW 4 ;MAGTAPE STATUS AREA: .BLKW 6 ;EMT AREA BLKC: .BLKW ;BLOCK COUNT BLKS: .BLKW ;BLOCK SIZE ERRC: .WORD MAXERR ;MAX ERROR COUNT LNBUF: .BLKB 81. ;LINE BUFFER FLOAD: .ASCIZ /?TAN-F-Unable to fetch handler - %X/ FLOOK: .ASCIZ /?TAN-F-Failed to lookup device - %X/ FBUFF: .ASCIZ /?TAN-I-Analyzing %X max block size %M bytes/ FREAD: .ASCIZ /?TAN-I-Reading %X %M block(s) of %M bytes/ FEOFC: .ASCIZ /?TAN-I-Reading %X end of %I/ FRDER: .ASCIZ /?TAN-F-Reading %X error code %D/ EOF: .ASCIZ /file/ EOM: .ASCIZ /media/ EOT: .ASCIZ /tape/ CRLF =: .-1 .END START