.TITLE FHX .IDENT /MRHV01/ .SBTTL INTRO PAGE ; ; THIS PROGRAM IS DESIGNED TO LIST OUT THE FILE HEADER BLOCK OF ; ANY FILE THAT HAS EXTENSION HEADERS, TO AID IN FINDING PROBLEMS ; THAT CAUSE DSC TO BOMB WITH "ID,SEQUENCE NUMBER CHECK" ERRORS ; ;CALLING PROCEEDURE ; ; ;MCR>FHD ; ; ; ; ; ; .MCALL QIOW$,DIR$,EXIT$S,GMCR$,FHDOF$ .MCALL FDBDF$,CLOSE$,FSRSZ$,NMBLK$,FDRC$A,FDBK$A .MCALL READ$,OPNS$R,WAIT$,FDOP$A,HMBOF$ FHDOF$ DEF$L HMBOF$ DEF$L ; ;DEFINE BOGUS OFFSET TO FILENAME FROM DISK SINCE ITS A LOT OF CRANKING ;OTHERWISE F.FNAM=56 .PAGE .SBTTL THE CODE ; ;FIRST SET THINGS UP ; START: DIR$ #GETMCR ;GET MCR COMMAND LINE FIRST: OPNS$R #FDB ;OPEN FILE (SHARED ACCESS, READ-ONLY) BCC 5$ ;BR IF OK BR REAERR ;REPORT READ ERROR 5$: MOV #2,BLOCKL ;SET UP BLOCK NUMBER OF HOME BLOCK MOV #10000.,FDB+F.HIBK+2 ;FAKE A BLOCK NUMBER MOV #10000.,FDB+F.EFBK+2 ;AND AN ENDFILE BLOCK NUMBER ;CAUSE INDEX FILE HEADER HAS 0'S AND READ WILL BOMB READ$ #FDB,,,#BLOCKH ;READ HOME BLOCK BCS ROPERR ;BRANCH IF FAILURE WAIT$ ;WAIT FOR READ TO FINISH BCS ROPERR ;BR IF FAILED ADD READBF+H.IBSZ,BLOCKL ;ADD NUMBER OF BITMAP BLOCKS MOV BLOCKL,OFFSET ;SAVE THIS OFFSET IF WE NEED IT INC BLOCKL ;GET INDEX FILE HEADER BLOCK READ$ #FDB,,,#BLOCKH ;READ INDEX FILE HEADER BLOCK BCS ROPERR ;BRANCH IF FAILURE WAIT$ ;WAIT FOR READ TO FINISH BCS ROPERR ;BR IF FAILED 10$: CMP READBF+F.FNAM,INDRAD ;IS THIS THE INDEX FILE BNE ROPERR ;NO CMP READBF+F.FNAM+2,EXFRAD ;FILE HEADER BNE ROPERR ;NO ; MOV FID,BLOCKL ;FIRST FILE ID IS BLOCK # IN INDEX FILE CLR BLOCKL ;START AT BLOCK 0 ADD OFFSET,BLOCKL ;ADD OFFSET PREVIOUSLY FOUND 33$: READ$ #FDB,,,#BLOCKH ;READ BLOCK N OF INDEX FILE BCS ROPERR WAIT$ ;WAIT FOR READ BCS ROPERR TST READBF+136 ;EXTENSION FILE HEADER BEQ 34$ ;DONT PRINT IF NOT JSR PC,PRINT ;IF OK, PRINT FILE HEADER BLOCK 34$: INC BLOCKL ;GET NEXT BLOCK BR 33$ ; ; .PAGE .SBTTL ERROR CONDITIONS ; ; ROPERR: ;READ ERROR WITH INDEX FILE OPEN ;JUST END OF FILE CLOSE$ #FDB ;CLOSE IT OUT ; ; ;FAILURE WITH INDEX FILE NOT OPEN REAERR: ;FAILED TO READ INDEX FILE MOV #READOV,ERRQIO+Q.IOPL MOV #READLN,ERRQIO+Q.IOPL+2 DIR$ #ERRQIO ;SEND ERROR MESSAGE TO TI JMP EXIT SYNTER: ;SYNTAX OR BLOCK # ERROR MOV #SYNERR,ERRQIO+Q.IOPL ;REPORT ERROR MOV #SYNELN,ERRQIO+Q.IOPL+2 DIR$ #ERRQIO EXIT: EXIT$S ;QUIT .PAGE .SBTTL PRINT THE FILE HEADER BLOCK ; PRINT: MOV #READBF,R5 ;R5 ALWAYS POINTS TO START OF BLOCK MOV #ARGBLK,R0 ;POINT R0 TO ARGUMENT BLOCK TO FILL IN MOV H.FNUM(R5),(R0)+ ;PUT IN FILE ID NUMBERS MOV H.FSEQ(R5),(R0)+ MOVB H.IDOF(R5),R1 ;WORD OFFSET TO FILE ID AREA ASL R1 ;MAKE IT BYTE OFFSET ADD R5,R1 ;NOW POINTING AT ID AREA MOV (R1)+,(R0)+ ;FILL IN NAME MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ ;TYPE MOV (R1)+,(R0)+ ;AND VERSION MOV #READBF,R4 ;START OF BUFFER IN R4 ADD #H.PROJ,R4 ;BUMP TO GROUP CODE ADDRESS MOV R4,(R0)+ ;FILL IN ADDRESS OF UIC BYTE VALUE DEC R4 ;BACK UP TO USER CODE MOV R4,(R0)+ ;AND FILL IN MOV (R1)+,-(SP) ;SAVE REVISION NUMBER FOR NOW MOV #2.,R2 ;SET COUNT ADD #13.,R1 ;BUMP R1 TO CREATION DATE 11$: MOV R1,(R0)+ ;SAVE POINTER TO DAY ADD #2,R1 MOV R1,(R0)+ ;AND MONTH ADD #3,R1 MOV R1,(R0)+ ;AND YEAR ADD #2,R1 MOV R1,(R0)+ ;AND HOUR ADD #2,R1 MOV R1,(R0)+ ;AND MINUTE ADD #2,R1 MOV R1,(R0)+ ;AND SECOND ADD #2,R1 SUB #26.,R1 ;BUMP BACK TO REVISION DATE SOB R2,11$ MOV (SP)+,(R0)+ ;AND PUT IN REVISION NUMBER MOV #OUTBLK,R0 ;SET UP CALL MOV #MESS1,R1 ;TO EDSMG MOV #ARGBLK,R2 JSR PC,$EDMSG MOV R1,ERRQIO+Q.IOPL+2 ;FILL IN LENGTH OF QIO MOV #OUTBLK,ERRQIO+Q.IOPL ;AND START DIR$ #ERRQIO ;WRITE LINE MOV #OUTBLK,R0 ;SET UP AGAIN MOV #MESS2,R1 MOV #ARGBL1,R2 JSR PC,$EDMSG MOV R1,ERRQIO+Q.IOPL+2 MOV #OUTBLK,ERRQIO+Q.IOPL DIR$ #ERRQIO RTS PC .PAGE .SBTTL DATA AREAS ; ;GET MCR DPB ; GETMCR: GMCR$ ; ; ;QIO FOR MESSAGES TO TI ; ERRQIO: QIOW$ IO.WVB,5,1,,,,<0,0,40> ; ;NOW POSSIBLE MESSAGES ; SYNERR: .ASCII /*** FHD SYNTAX ERROR ***/ SYNELN=.-SYNERR .EVEN ; ; READOV: .ASCII /*** FHX END OF INDEX FILE ***/ READLN=.-READOV .EVEN ; FINMES: .BYTE 12,12 FINLEN=.-FINMES ; ;MISC VARIABLES ; INDRAD: .RAD50 /IND/ EXFRAD: .RAD50 /EXF/ ; READBF: .BLKB 1000 ;ONE BLOCK READ BUFFER ; OFFSET: .WORD 0 ;OFFSET TO INDEX FILE HEADER OF INDEX FILE ; FID: .WORD 0,0 ;SAVE FILE ID'S HERE ; EFID: .WORD 0,0 ;EXTENSION FILE ID'S HERE .PAGE .SBTTL FCS DATA AREAS ; ;DATASET DESCRIPTOR ; DSPT: .WORD DEVLEN,DEV ;DEVICE DESCRIPTOR .WORD UICLEN,UIC ;DIRECTORY DESCRIPTOR .WORD NAMELN,NAME ;NAME DESCRIPTOR ; DEV: .ASCII /SY0:/ DEVLEN=.-DEV .EVEN ; UIC: .ASCII /[0,0]/ UICLEN=.-UIC .EVEN ; NAME: .ASCII /INDEXF.SYS;1/ NAMELN=.-NAME .EVEN ; ; ;FCS STATUS BLOCK ; STATUS: .WORD 0,0 ; ;2-WORD BLOCK DESTRIPTOR ; BLOCKH: .WORD 0 BLOCKL: .WORD 0 ; ; FSRSZ$ 1 ;ROOM FOR 1 FILE FDB: FDBDF$ ;DEFINE FDB FDRC$A FD.RWM!FD.RAN ;USE BLOCK READS FDOP$A 2,DSPT ;USE LUN 2, DSPT DESCRIBES FILE FDBK$A READBF,1000,,,STATUS ;DEFINE BUFFER, SIZE AND STATUS AREA .PAGE .SBTTL EDMSG DATA AREAS ; MESS1: .ASCII /%2NFILE HEADER BLOCK FOR (%P,%P) / .ASCIZ /%X OWNED BY [%B,%B]%2N/ .EVEN MESS2: .ASCII /CREATED ON %2A-%3A-%2A AT %2A:%2A:%2A%N/ .ASCII /REVISED ON %2A-%3A-%2A AT %2A:%2A:%2A REV. %P%2N/ .ASCIZ / / .EVEN DOTTAB: .ASCII /./ TAB: .ASCII / / .EVEN ARGBLK: .BLKW 9. ;ROOM FOR FID,UIC,NAME,TYPE,VERS & OWNER UIC ARGBL1: .BLKW 30. ;ROOM FOR REST ; OUTBLK: .BLKB 1000 ;OUTPUT BUFFER FOR EDMSG ; .END START