.TITLE VALHDR VALIDATES FILE HEADER .SBTTL SUBROUTINE DESCRIPTION ; ; CHECK IF CURRENT FILE HEADER POINTED TO BY R2 IS ALLOCATED ; TO THE INDEX FILE BY CHECKING BITMAP OF INDEXF FILE ; R2 = VBN OF THE INDEX FILE (THE CURRENT FILE HEADER) ; ; CLEARS THE CARRY BIT IF FILE HEADER IS VALID ; SETS THE CARRY BIT IF INVALID ; .PAGE .SBTTL DATA DEFINITIONS .SBTTL D LOCAL DATA SECTIONS .PSECT HDATA,RW,D,REL,LCL BITTBL: .BYTE 1,2,4,10,20,40,100,200 .PAGE .SBTTL D GLOBAL DATA SECTIONS .PSECT FILHDR,RW,D,GBL,REL,OVR FILHDR: .BLKB 512. ; FILE HEADER DATA FROM INDEX FILE .PSECT BITMAP,RW,D,GBL,REL,OVR BITMAP: .BLKB 512.*4 ; BITMAP FOR FILE HEADERS .PSECT HDRCNT,RW,D,GBL,REL,OVR GHDRS: .WORD 0 ; NUMBER OF GOOD HEADERS BHDRS: .WORD 0 ; NUMBER OF BAD HEADERS BMSIZ: .BLKW 1 ; BITMAP SIZE AS STORED IN HOME BLOCK FMAX: .BLKW 1 ; MAXIMUM FILES FROM HOME BLOCK ; ; .PAGE .SBTTL MAIN LINE CODE .EVEN .ENABLE LSB .PSECT VALHDR,I,REL VALHDR:: MOV R0,-(SP) ; SAVE REGS MOV R1,-(SP) ; FOR WORK MOV R2,-(SP) ; ; NOW ADJUST THE VBN TO REFLECT THE FILE ID SUB BMSIZ,R2 ; SUBTRACT THE BITMAP BLOCKS SUB #2,R2 ; NOW THE BOOT AND HOME BLOCKS SUB #1,R2 ; ADJUST FOR OFFSET INTO TABLE MOV R2,R1 ; FIRST CALCULATE THE BIT OFFSET BIC #177770,R1 ; LEAVE ONLY LOW 3 BITS ADD #BITTBL,R1 ; R1 NOW POINTS AT BIT TABLE OFFSET MOV R2,R0 ; NOW GET THE BYTE OFFSET ASH #-3,R0 ; BYTE OFFSET INTO TBL ADD #BITMAP,R0 ; ADD BEGINNING OF TABLE BITB (R1),(R0) ; NOW SEE IF THE BIT IS SET BEQ BADHDR ; IF ITS CLEAR THEN NOT A LEGAL FILE HEADER .SBTTL I GOOD FILE HEADER GOOD: INC GHDRS MOV (SP)+,R2 ; RESTORE THE STACK MOV (SP)+,R1 MOV (SP)+,R0 CLC ; CLEAR THE CARRY BIT TO LET CALLER KNOW RETURN ; IT'S A VALID HEADER .SBTTL I BAD FILE HEADER BADHDR: INC BHDRS MOV (SP)+,R2 ; RESTORE THE STACK MOV (SP)+,R1 ; MOV (SP)+,R0 ; SEC ; SET THE CARRY BIT TO LET CALLER KNOW RETURN ; HEADER IS INVALID .END