.TITLE FILES .IDENT /V1.0B/ .ENABL LC .SBTTL INTRODUCTION ; VERSION 1.0B ; ; CREATED BY J. BRADLEY FLIPPIN ; RAYTHEON SERVICE COMPANY ; 2341 JEFFERSON DAVIS HIGHWAY ; ARLINGTON, VIRGINIA 22202 ; (703) 685-2200 ; ; 15-FEB-81 ; ; MODIFIED BY: ; ; JBF001 -- ADD DIAGNOSTIC AIDS AND FORM FEED (3-JUN-81) ; ; JBF002 -- CORRECT DP LBN VERIFICATION ; (OCCURED WHEN LOW WORD EQ ZERO)(10-JUN-81) ; ; JBF003 -- CORRECT DP ARITH, COUNT-1 SETUP, PHASE II COMP, ; AND DELETE RSX-11M PLUS HIGH BYTE VALUE IN CW2 ; (19-JUN-81) ; ; HWG001 -- PUT IN A CLOSE OUTPUT FILE TO ELIMINATE ANNOYING ; "TERMINATED WITH I/O IN PROGRESS" MESSAGE ; ; FRB001 -- UNDER IAS, NUMBER OF BLOCKS NOT IN CW2 AND CW3, SEARCH ; PUD TO FIND IN PUD EXTENSION ; ; Version V1.0B John Miller Sanders Associates, Inc. 22-Jul-82 ; MIP2-1 ; 95 Canal Street ; Nashua, NH 03061 ; (603) 424-5080 ext. 312 ; ; Remove device name, and add file id and sequence numbers to output ; display. ; ; Determine file header allocation status from index file bitmap ; rather than file number field in file header (which cannot be ; relied upon to be initialized to zero nor reset to zero when file ; header is released). ; ; Provide mixed-case output. ; ; THIS PROGRAM PERMITS THE USER TO IDENTIFY FILES WHICH UTILIZE ; SPECIFIC BLOCKS WITHIN A DISK DEVICE. ONCE THIS HAS BEEN DETERMINED, ; THE INFORMATION CAN THEN BE USED TO FREE UP CONTIGUOUS SPACE WITHOUT ; THE NECESSITY OF USING DSC OR OTHER SUCH TIME CONSUMING METHODS. ; ; FIRST THE USER DUMPS [0,0]BITMAP.SYS TO DETERMINE THE AREA OF ; INTEREST. THE RESULTS ARE THEN PASSED TO "FILES" THROUGH SWITCHES. ; ; THE PROGRAM DOES NOT UTILIZE A FULL INPUT FILESPEC, ONLY THE DEVICE. ; A FULL FILESPEC MAY BE USED IN THE OUTPUT FILE. ; .PAGE ;JBF001 .SBTTL ...SUPPORTED SWITCHES ;JBF001 ; ; THE PROGRAM SUPPORTS THE FOLLOWING SWITCHES: ; ; OUTPUT FILE: ; ; /SP = SPOOL OUTPUT (CAN BE NEGATED)(DEFAULT=/SP) ; /ID = DISPLAY PROGRAM VERSION NUMBER (IE: FILES /ID) ; ; INPUT FILE: ; ; /DA = DIAGNOSTIC AID (/-LI PLUS /DA:(SIZE):(SIZE+2)) ;JBF001 ; /LI = LIST FILESPECS (DEFAUAT = /LI) ; (USE /-LI TO SUPPRESS LISTING AND GET SUMMARY ONLY) ; /LBN = LOGICAL BLOCK NUMBER ON THE DEVICE ; /BLK = BITMAP.SYS BLOCK NUMBER ; (CANNOT BE USED WITH /LBN SWITCH) ; /WD = WORD NUMBER WITHIN THE SPECIFIED BITMAP.SYS BLOCK ; (CANNOT BE USED WITHOUT /BLK SWITCH) ; ; THE /BLK, /WD, AND /LBN MUST HAVE VALUES ASSOCIATED WITH THEM AS ; FOLLOWS (ALL VALUES DEFAULT TO OCTAL): ; ; /BLK:16 FROM BLOCK 16 TO END OF THE DEVICE ; /BLK:16:16 BLOCK 16 ONLY ; /BLK:16:17 FROM BLOCK 16 TO 17 (INCLUSIVE) ; ; THE /LBN SWITCH UTILIZES DOUBLE PRECISION VALUES AND THEREFORE ; HAS THE FOLLOWING FORMAT: ; ; /LBN:0:4200 FROM LBN 4200 TO END OF DEVICE ; /LBN:0:4200:0:4200 LBN 4200 ONLY ; /LBN:0:4200:0:4700 FROM LBN 4200-4700 INCLUSIVE .PAGE .SBTTL ...OPERATING NOTES ; SAMPLE COMMAND LINES (ALL VALUES ARE IN OCTAL): ; ; FILES OUTPUT.LST/-SP=SY:/BLK:16:16 ; ; (GENERATES A FILE "OUTPUT.LST" CONTAINING ALL THE ; FILESPECS OF FILES ON SY0: HAVING LBN'S IN OCTAL ; BLOCK NUMBER 16 OF THE "BITMAP.SYS" DUMP.) ; ; FILES =DM:/LBN:0:4200 ; ; (SPOOLS A FILE "FILES.LST" CONTAINING ALL THE FILESPECS ; OF THE FILES ON DM0: HAVING LBN'S OF 4200 OCTAL OR ; GREATER) ; ; FILES TI:=DL:/BLK:16:16/WD:100:100 ; ; (DISPLAYS ON THE ORIGINATING TERMINAL, ALL FILESPECS ; OF FILES ON DY0: HAVING LBN'S IN THE 16 BLOCKS ; PREPRESENTED BY THE BITS IN WORD 100 OF OCTAL BLOCK ; 16 OF THE "BITMAP.SYS" DUMP) ; ; FILES DL1:=DL:/BLK:16/WD:40 ; ; (GENERATES A FILE "FILES.LST" ON DL1: CONTAINING ; ALL THE FILSPECS OF THE FILES ON DL: HAVING BLOCKS ; REPRESENTED BY THE BITS STARTING WITH WORD 40 ; OF BLOCK 16 OF THE BITMAP.SYS TO THE END OF THE DEVICE.) ; ; FILES TI:=DY:/BLK:12:12/WD:4 ; ; (DISPLAYS ON THE ORIGINATING TERMINAL ALL FILESPECS ; OF FILES ON DY: HAVING DATA BLOCKS REPRESENTED BY ; BITS STARTING WITH WORD 4 OF BLOCK 12 AND RUNNING TO ; THE END OF BLOCK 12(OCTAL).) ; ; FILES TI:=DM:/BLK:6:7/WD:400:100 ; ; (DISPLAYS ON THE ORIGINATING TERMINAL ALL FILESPECS ; OF FILES ON DM: HAVING BLOCKS REPRESENTED BY THE ; BITS FROM WORD 400 OF BLOCK 6 TO WORD 100 OF BLOCK ; 7 ON BITMAP.SYS.) ; ; (THIS IS THE ONLY CASE IN WHICH THE STARTING WORD VALUE ; CAN BE GREATER THAN THE STOPPING VALUE) ; ; 5) USE THE /-LI SWITCH TO CONVERT THE /BLK AND /WD VALUES ONLY ; AND DISPLAY THE SUMMARY BLOCK. NO HEADERS ARE SEARCHED. .PAGE .SBTTL ...TECHNICAL NOTES ; MOVING THE FILES: ; ; ONCE THE FILES HAVE BEEN IDENTIFIED, THEY CAN BE MOVED BY "PIP". ; FOR EXAMPLE, ASSUME "OUTPUT.LST" CONTAINED THE FILESPEC ; "DM:[122,134]TEST.DAT;10." ; THE FILE CAN BE MOVED BY SIGNING ONTO THAT DIRECTORY OR ; SIGNING INTO A PRIVILIGED ACCOUNT AND SETTING IT TO THAT UIC. ; THE SIMPLE ENTRY "PIP /NV/CD=TEST.DAT;10" AND DELETING THE OLD FILE, ; WOULD FREE UP THE CONTIGUOUS SPACE AND SAVE THE CREATION DATE. ; (BE SURE TO BE SPECIFIC AND USE THE INDICATED VERSION NUMBERS) ; ; NOTES: ; ; 1) THIS TECHNIQUE ONLY WORKS IF THERE ARE SUFFICIENT BLOCKS ; AVAILABLE IN THE LOWER LBN'S, OTHERWISE F11ACP WILL SIMPLY ; ASSIGN THE NEW BLOCKS TO HIGHER LBN'S. ; ; 2) (NOT USED) ; ; 3) THE UIC IN THE LISTING FILESPEC IS THE OWNER'S UIC EXTRACTED ; FROM THE FILE'S HEADER. NORMALLY THIS COINCIDES WITH THE UFD ; BUT THIS MAY NOT BE TRUE IN SOME CASES. IF THE FILE NAME ; CANNOT BE FOUND UNDER THE LISTED UIC, THEN USE ; "PIP [*,*]TEST.DAT;10/LI" TO FIND IT. ; ; 4) EXTENSION HEADERS ARE NOT HANDLED SEPARATELY. THE ; SEQUENTIAL SEARCH OF HEADERS MAKES THIS UNNECESSARY. THUS, ; IF A FILESPEC IS LISTED MORE THAN ONCE, IT INDICATES IT'S ; HEADER (OR EXTENSION HEADER) HAD BLOCKS MAPPED TO THE ; AREA IN QUESTION. ; ; 5) IF BLOCKS ARE STILL ALLOCATED AFTER THE ABOVE MOVEMENT ; PROCESS, TRY THE FOLLOWING: ; ; A. ALL HEADERS MAY NOT BE LISTED IN A UFD ; (SOLUTION - RUN VFY WITH /LO SWITCH) ; ; B. ALL BLOCKS MAY NOT BE MAPPED TO A FILE. ; (SOLUTION - RUN VFY WITH /RE SWITCH) ; (ALSO SEE UTILITIES MANUAL PARAGRAPH 13.3.1.5) ; ; C. IT MAY BE A BAD BLOCK. THIS IS EVIDENCED BY THE FILESPEC ; "[1,1]BADBLK.SYS;1" APPEARING AS THE CULPRET. THIS MEANS ; THAT THE BLOCK HAS BEEN MARKED AS BAD. VERIFICATION CAN ; BE OBTAINED BY DUMPING [0,0]BADBLK.SYS AND CHECKING IT'S ; MAP POINTERS. ; (THERE IS NO SOLUTION TO THIS PROBLEM - BUY A NEW DISK) .PAGE ; 6) ERROR MESSAGES ARE OF TWO TYPES: ; ; A. DIRECT MESSAGES ARE PROVIDED FOR COMMON ERRORS. ; ; B. ERROR CODES ARE PROVIDED FOR INFREQUENT (FCS) ERRORS. ; (SEE "ERROR" SUBROUTINE FOR DETAILS) ; ; IE: "FIL - OI--IOER ERROR -16" INDICATES A "PRIVILEGE ; VIOLATION", BUT PROBABLY THE DEVICE WAS NOT MOUNTED. ; ;*********************************************************************** ; CAUTION: THIS PROGRAM HAS BEEN CHECKED OUT ON AN 11/34A WITH ; MEMORY MANAGEMENT RUNNING UNDER RSX-11M VERSION 3.2 ; USING RL01/RK07/RX02 DISK DRIVES ONLY. PROPER ; STEPS SHOULD BE TAKEN TO VERIFY RESULTS ON OTHER DEVICES ; BEFORE ACCEPTING THE OUTPUT AT "FACE VALUE". ;*********************************************************************** ; VERIFIED ON RP06 AND RSX11-M PLUS BY DAVE SYKES (AMS) 19-JUN-81 ;JBF002 ;**************************************************************** ;JBF002 ; ; ASSEMBLY/TASK BUILD NOTES: ; ; ASSEMBLY AND TASK BUILDING OF "FILES" IS STRAIGHT FORWARD WITH ; NO SPECIAL REQUIREMENTS. ; ; TO ASSEMBLE: MAC FILES[,FILES]=FILES ; ; TO TASK BUILD: TKB FILES=FILES ; ; IT IS SUGGESTED THAT "FILES" BE INSTALLED AS FOLLOWS: ; ; INS FILES/TASK=...FIL ; .PAGE .SBTTL ...BITMAP BLOCK/LBN REFERENCE TABLE ; THE FOLLOWING TABLE PROVIDES A REFERENCE BETWEEN THE FIRST BIT OF EACH ; BLOCK OF "BITMAP.SYS" AND THE MAPPED LOGICAL BLOCK NUMBER (LBN). ; (BLOCK NUMBERS ARE EXPRESSED IN OCTAL - LBN ARE IN OCTAL AND DECIMAL) ; ; ; VBN LBN ; ; 1 - (NOT USED) ; 2 - H:000 L:000000 = 0. ; 3 - H:000 L:010000 = 4,096. ; 4 - H:000 L:020000 = 8,192. ; 5 - H:000 L:030000 = 12,288. ; 6 - H:000 L:040000 = 16,384. ; 7 - H:000 L:050000 = 20,480. ; 10 - H:000 L:060000 = 24,576. ; 11 - H:000 L:070000 = 28,672. ; 12 - H:000 L:100000 = 32,768. ; 13 - H:000 L:110000 = 36,864. ; 14 - H:000 L:120000 = 40,960. ; 15 - H:000 L:130000 = 45,056. ; 16 - H:000 L:140000 = 49,152. ; 17 - H:000 L:150000 = 53,248. ; ; ; THUS, VIRTUAL BLOCK 15 (OCTAL) REPRESENTS ; LOGICAL BLOCK NUMBERS 45,056. TO 49,151., INCLUSIVELY. ; ; ; DEVICES: ; ; RP02 (DP:) = ; RP03 (DP:) = ; RP04 (DB:) = ;JBF002 ; RP05 (DB:) = ;JBF002 ; RP06 (DB:) = 340,670. ;JBF002 ; RP07 (DB:) = ;JBF002 ; RF (DF:) = ;**-3 ; RK05 (DK:) = ; RK06 (DM:) = ; RK07 (DM:) = 53,790. ; RL01 (DY:) = 10,240. ; RL02 (DR:) = 20,480. ; RL03 (DR:) = ; RM02 (DR:) = ; RM03 (DR:) = ; RS03 (DS:) = ; RS04 (DS:) = ; RX01 (DX:) = 494. ; RX02 (DY:) = 494./988. .PAGE .SBTTL INITIAL HOUSEKEEPING .SBTTL ...MACRO LIBRARY CALLS .MCALL GCMLB$,GCMLD$,CSI$,CSI$1,CSI$2,GCML$,CSI$SW,CSI$SV .MCALL CSI$ND .MCALL OPEN$R,OPEN$W,READ$,PUT$,CLOSE$,FSRSZ$,FINIT$ .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBK$A .MCALL QIOW$,QIOW$C,DIR$,EXIT$S,WAIT$,GTIM$C,GLUN$C,PRINT$ .MCALL FHDOF$,HMBOF$ HMBOF$ DEF$L ;DEFINE THE HOME BLOCK OFFSETS FHDOF$ DEF$L ;DEFINE THE HEADER OFFSETS GCMLD$ ;DEFINE COMMAND LINE OFFSETS CSI$ ;DEFINE CSIBLK OFFSETS .SBTTL ...EQUATED SYMBOLS FLAG=1 ;DESIGNATE EVENT FLAG #1 INLUN=1 ;INPUT LUN OUTLUN=2 ;OUTPUT LIN DISP=5 ;DISPLAY LUN (TI:) TERM=5 ;TERMINAL LUN IDMASK=1 ;/ID MASK VALUE BLMASK=2 ;DEFINE /BLK MASK WDMASK=4 ;DEFINE /WD MASK LBMASK=10 ;DEFINE /LBN MASK SPMASK=20 ;DEFINE /SP MASK LIMASK=40 ;DEFINE /LI MASK DAMASK=100 ;DEFINE /DA MASK ;JBF001 DV.F11=40000 ;FILES-11 MASK WORD CW1=ARGBLK+G.LUCW CW2=ARGBLK+G.LUCW+2 CW3=ARGBLK+G.LUCW+4 STAT=CSIBLK+C.STAT CDEV=CSIBLK+C.DEVD DSDS=CSIBLK+C.DSDS MKW1=CSIBLK+C.MKW1 MKW2=CSIBLK+C.MKW2 FNAM=HEADER+S.HDHD+I.FNAM MUSE=HEADER+S.HDHD+S.IDHD+M.USE MPTR=HEADER+S.HDHD+S.IDHD+M.RTRV HR1=TIME1+G.TIHR HR2=TIME2+G.TIHR MIN1=TIME1+G.TIMI MIN2=TIME2+G.TIMI SEC1=TIME1+G.TISC SEC2=TIME2+G.TISC .PAGE .SBTTL ...COMMAND LINE DEFINITIONS .EVEN .NLIST BEX ;DON'T LIST BINARY EXPANSION GCLBLK: GCMLB$ 0,,,TERM ;DEFINE CMD LINE DATA BLOCKS CSIBLK: .BLKB C.SIZE ;DEFINE SIZE OF CSI BLOCK OUTTBL: CSI$SW SP,SPMASK,,,NEG ;DEFINE /SP SWITCH CSI$SW ID,IDMASK ;DEFINE /ID SWITCH CSI$ND SWTBL: CSI$SW LI,LIMASK,,,NEG ;DEFINE /LI SWITCH CSI$SW DA,DAMASK,,,,DATBL ;DEFINE /DA SWITCH ;JBF001 CSI$SW LB,LBMASK,,,,LBNTBL ;DEFINE /LBN SWITCH CSI$SW BL,BLMASK,,,,BLKTBL ;DEFINE /BLK SWITCH CSI$SW WD,WDMASK,,,,WDTBL ;DEFINE /WD SWITCH CSI$ND BLKTBL: CSI$SV OCTAL,BLK1,2 ;DEFINE START BLOCK NUMBER CSI$SV OCTAL,BLK2,2 ;DEFINE STOP BLOCK NUMBER CSI$ND WDTBL: CSI$SV OCTAL,WD1,2 ;DEFINE START WORD NUMBER CSI$SV OCTAL,WD2,2 ;DEFINE STOP WORD NUMBER CSI$ND LBNTBL: CSI$SV OCTAL,LBN1,2 ;DEFINE START LBN CSI$SV OCTAL,LBN1+2,2 ; DP CSI$SV OCTAL,LBN2,2 ;DEFINE STOP LBN CSI$SV OCTAL,LBN2+2,2 ; DP CSI$ND ;JBF001 DATBL: CSI$SV OCTAL,DASIZE,2 ;DIAGNOSTIC SIZE (HI) ;JBF001 CSI$SV OCTAL,DASIZE+2,2; (DP) ;JBF001 CSI$ND ;JBF001 .PAGE .SBTTL ...DATA STORAGE AREAS ARGBLK: .BLKW 9. ;EDIT ARGUMENT BLOCK BLK1: .WORD 0 ;STARTING BLOCK NUMBER BLK2: .WORD 0 ;STOPPING BLOCK NUMBER BUFFER: .BLKB 50. ;OUTPUT BUFFER AREA DASIZE: .WORD 0,0 ;DIAGNOSTIC DEVICE SIZE (DP) ;JBF001 FCOUNT: .WORD 0 ;COUNT OF FILES SELECTED XBM: .BLKB 512. ;INDEX FILE BITMAP BLOCK BUFFER. HEADER: .BLKB 512. ;HEADER BUFFER AREA FMAX: .BLKW 1 ;MAXIMUM # OF FILES ON INPUT DEVICE. HIBSZ: .WORD 0 ;SAVED H.IBSZ (LENGTH OF HEADER BITMAP) HOLD: .WORD 0,0,0 ;TEMP HOLDING AREA FOR DIAG OCTAL VALUE IOSB: .WORD 0,0 ;I/O STATUS BLOCK FOR BLOCK I/O STBLK: .BLKW 5 ;STATISTICS BLOCK TIME1: .BLKW 8. ;START TIME TIME2: .BLKW 8. ;STOP TIME LBN1: .WORD 0,0 ;STARTING LBN VALUE LBN2: .WORD 0,0 ;STOPPING LBN VALUE LENGTH: .WORD 0 ;LENGTH OF EDITED OUTPUT STRING OUTDSD: .BLKW 6 ;OUTPUT DSD BLOCK SIZE: .WORD 0,0 ;SIZE OF DEVICE IN LOGICAL BLOCKS-1 SPOOL: .WORD 0 ;SPOOL SWITCH (0=/-SP, 1=/SP) TEXT: .WORD 0 ;ADDRESS OF OUTPUT MESSAGE STRING TOP: .WORD 0,0 ;TOP OF RETRIEVAL POINTER SPAN XBMVBN: .WORD 0,0 ;INDEX FILE BITMAP INPUT VBN. VBN: .WORD 0,0 ;INPUT VBN WD1: .WORD 0 ;STARTING WORD NUMBER WD2: .WORD 0 ;STOPPING WORD NUMBER .SBTTL ...EXECUTIVE DIRECTIVES OUT: QIOW$ IO.WVB,DISP,FLAG,,,,<0,0,0> ;TERMINAL DISPLAY .PAGE .SBTTL ...FILE DESCRIPTION BLOCKS (FDB) FSRSZ$ 2 ;INITIALIZE THE FCS REGIONS INFDB: FDBDF$ ;DEFINE THE INPUT FDB FDRC$A FD.RWM FDBK$A HEADER,512.,,,IOSB FDOP$A INLUN,DSD,,FO.RD,FA.DLK DSD: .WORD 0,0 .WORD 5,UIC .WORD 10.,HNAME UIC: .ASCII /[0,0]/ ;SYSTEM DIRECTORY HNAME: .ASCII /INDEXF.SYS/ ;INDEX FILENAME .EVEN OUTFDB: FDBDF$ FDAT$A R.VAR,FD.CR ;DEFINE FILE ATTRIBUTES FDRC$A ,BUFFER,50. ;DEFINE RECORD ATTRIBUTES FDOP$A OUTLUN,OUTDSD,IFNAM,FO.WRT ;ESTABLISH FILE OPEN DATA IFNAM: NMBLK$ FILES,LST,0,SY,0 ;ESTABLISH OUTPUT FILE DEFAULTS .PAGE .SBTTL ...ERROR MESSAGES .EVEN MSG1: .BYTE MSG1L .ASCII /Command line error/ MSG1L=.-MSG1-1 MSG2: .BYTE MSG2L .ASCII /CSI interpreter error/ MSG2L=.-MSG2-1 MSG3: .BYTE MSG3L .ASCII /No equal sign/ MSG3L=.-MSG3-1 MSG4: .BYTE MSG4L .ASCII /CSI output parser error/ MSG4L=.-MSG4-1 MSG5: .BYTE MSG5L .ASCII /Multiple output files not permitted/ MSG5L=.-MSG5-1 MSG6: .BYTE MSG6L .ASCII /Output parse error/ MSG6L=.-MSG6-1 MSG7: .BYTE MSG7L .ASCII /CSI input parser error/ MSG7L=.-MSG7-1 MSG8: .BYTE MSG8L .ASCII /Multiple input files not permitted/ MSG8L=.-MSG8-1 MSG9: .BYTE MSG9L .ASCII /No input switches/ MSG9L=.-MSG9-1 MSG10: .BYTE MSG10L .ASCII /Too many switches/ MSG10L=.-MSG10-1 MSG11: .BYTE MSG11L .ASCII /Block switch missing/ MSG11L=.-MSG11-1 MSG12: .BYTE MSG12L .ASCII /Input device must be specified/ MSG12L=.-MSG12-1 MSG13: .BYTE MSG13L .ASCII \Invalid /LBN value(s)\ MSG13L=.-MSG13-1 MSG14: .BYTE MSG14L .ASCII \Invalid /BLK value(s)\ MSG14L=.-MSG14-1 MSG15: .BYTE MSG15L .ASCII \Invalid /WD value(s)\ MSG15L=.-MSG15-1 MSG16: .BYTE MSG16L .ASCII /No wildcards permitted/ MSG16L=.-MSG16-1 MSG17: .BYTE MSG17L .ASCII /Input not FILES-11 device/ MSG17L=.-MSG17-1 MSG18: .BYTE MSG18L .ASCII /Start value out of range/ MSG18L=.-MSG18-1 .PAGE .SBTTL ...QIOE/IOER DIAGNOSTIC DISPLAY BUFFER .EVEN ERRBUF: .ASCII /FIL - / ;ERR MSG FROM: .WORD 0 ;HOLDS THE LOCATION OF ERROR .ASCII /--/ ERRTYP: .WORD 0,0 ;ERROR TYPE .ASCII / error -/ ERRNO: .WORD 0 ;SAVE FOR CONVERTED ERROR NUMBER ERRSZ=.-ERRBUF ;CALCULATE THE SIZE OF 'ERRBUF' .SBTTL ...EDIT STRINGS EDTSTR: .ASCIZ /(%P,%P) [%B,%B]%X/ ;OUTPUTTED FILESPEC EDIT STRING DEVSTR: .ASCIZ /%N%2A%M: = %T. blocks/ RNGSTR: .ASCIZ /Span: %T. blocks/ LOSTR: .ASCIZ /LO LBN: H:%B L:%P = %T./ HISTR: .ASCIZ /HI LBN: H:%B L:%P = %T./ FILSTR: .ASCIZ /%NFiles found: %M./ .EVEN TIMSTR: .ASCII /Elapsed time: / STRTIM: .BLKW 4 ;HOLDING AREA FOR ASCII ELAPSED TIME TLONG=.-TIMSTR ;LENGTH OF EDITED TIME STRING .SBTTL ...MISC ASCII STRINGS PREFIX: .ASCII /FILES error -- / ;ERROR CODE PREFIX FILES: .ASCII <15><12>/FILES>/ ;ALTERNATE PROMPT IDMSG: .BYTE IDMSGL .ASCII /FILES version 1.0B/ ;JBF003 IDMSGL=.-IDMSG-1 ;**-1 FFEED: .BYTE 14 ;(FORM FEED) ;JBF001 .SBTTL ...CONSTANTS BITMSK: .BYTE 1,2,4,10,20,40,100,200 .PAGE .SBTTL PROGRAM INITIALIZATION ;+ ; GET THE COMMAND LINE AND PARSE IT TO DETERMINE THE INPUT DEVICE. ; THEN DETERMINE THE SWITCHES AND THEIR VALUES ;- .EVEN START: FINIT$ ;INITIALIZE THE $$FSR2 REGION 10$: MOV #776,WD2 ;INITIALIZE STOP WORD GCML$ #GCLBLK,#FILES,#8. ;INITIALIZE THE COMMAND LINE REQUEST BCC 20$ ;SKIP IF NO ERROR CMPB GCLBLK+G.ERR,#IE.EOF ;CTL/Z CONDITION? BNE .+6 ;IF NOT, PASS JMP EXIT ;OTHERWISE, EXIT THE PROGRAM MOV #MSG1,TEXT ;SETUP "COMMAND LINE ERROR" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 20$: CMP GCLBLK+G.CMLD,#0 ;NULL COMMAND LINE? BEQ 10$ ;IF SO, THEN GET PROMPT AGAIN .PAGE .SBTTL ...PARSE COMMAND LINE GTIM$C TIME1 ;SAVE START TIME CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;ANALYZE CMD LINE BCC OPARSE ;WAS CSI$1 SUCCESSFUL? MOV #MSG2,TEXT ;SETUP "CSI INTER ERROR" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT .SBTTL ...PARSE OUTPUT FILESPEC/SW OPARSE: CSI$2 #CSIBLK,OUTPUT,#OUTTBL ;PARSE OUTPUT FILESPEC BCC 10$ ;IF OK, PASS MOV #MSG4,TEXT ;SETUP "CSI OUT PARSE ERROR" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 10$: BIT MKW1,#IDMASK ;/ID SWITCH PRESENT? BEQ 12$ ;IF NOT, PASS MOV #IDMSG,TEXT ;OTHERWISE, SETUP "VERSION" MSG CALL TYPE ; DISPLAY IT JMP EXIT ; AND EXIT 12$: BITB STAT,#CS.WLD ;WILDCARDS SPECIFIED? BEQ 15$ ;IF NOT, PASS MOV #MSG16,TEXT ;SETUP "NO WILDCARD" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 15$: BITB STAT,#CS.MOR ;COMMA PRESENT? BEQ 20$ ;IF NOT, CONTINUE MOV #MSG5,TEXT ;SETUP "MULTI-OUTPUT" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 20$: MOV DSDS+0, OUTDSD+0 ;SAVE OUTPUT DSD INFORMATION MOV DSDS+2, OUTDSD+2 ; (DEVICE) MOV DSDS+4, OUTDSD+4 ; (DIRECTORY) MOV DSDS+6, OUTDSD+6 ; MOV DSDS+8., OUTDSD+8. ; (FILEMANE) MOV DSDS+10.,OUTDSD+10. ; BITB STAT,#CS.EQU ;EQUAL SIGN PRESENT? BNE 35$ ;IF NOT, PARSE INPUT FILESPEC MOV #MSG3,TEXT ;SETUP "NO EQUAL SIGN" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 35$: CLR SPOOL ;RESET SPOOL SWTICH BIT MKW1,#SPMASK ;SPOOL (/SP) SWITCH PRESENT? BEQ 40$ ;IF NOT, SET "SPOOL" BIT MKW2,#SPMASK ;NEGATED (/-SP)? BEQ IPARSE ;IF NOT, ASSUME /-SP AND PASS 40$: MOV #1,SPOOL ;OTHERWISE, SET SPOOL SWITCH .PAGE .SBTTL ...PARSE INPUT FILESPEC/SW IPARSE: CSI$2 #CSIBLK,INPUT,#SWTBL ;PARSE INPUT FILESPEC BCC 10$ ;SUCCESSFUL? 5$: MOV #MSG7,TEXT ;SETUP "INPUT PARSE ERROR" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 10$: BITB STAT,#CS.MOR ;COMMA PRESENT? BEQ 20$ ;IF NOT, PASS MOV #MSG8,TEXT ;SETUP "MULTI-INPUT" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 20$: BITB STAT,#CS.DVF ;IS THERE A DEVICE? BNE 30$ ;IF SO, PASS MOV #MSG12,TEXT ;SETUP "DEVICE REQUIRED" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 30$: MOV #INFDB,R0 ;SETUP INPUT FDB MOV #INFDB+F.FNB,R1 ;SETUP INPUT FILENAME BLOCK MOV #DSDS,R2 ;SETUP INPUT DSD CALL .PRSDV ;PARSE THE DEVICE AND ASSIGN LUN BCS 5$ ;SUCCESSFUL? GLUN$C INLUN,ARGBLK ;GET LUN PARAMETERS (CW1) BCC .+6 ;SUCCESSFUL? JMP DIRERR ;IF NOT, DISPLAY ERROR CODE BIT CW1,#DV.F11 ;DO WE HAVE A FILES-11 DEVICE? BNE 40$ ;IF SO PASS, OTHERWISE MOV #MSG17,TEXT ;SETUP "NOT F11 DEV" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 40$: BIT MKW1,#DAMASK ;DIAGNOSTIC ACTIVE? ;JBF001 BEQ 50$ ;IF EQ (NO), THEN PASS ;JBF001 TST DASIZE ;DIAGNOSTIC VALUE PRESENT? ;JBF001 BNE 45$ ;IF SO (NE), THEN GET IT! ;JBF001 TST DASIZE+2 ; (DP) ;JBF001 BEQ 50$ ; ;JBF001 45$: MOV DASIZE,SIZE ;SETUP DIAGNOSTIC SIZE ;JBF001 MOV DASIZE+2,SIZE+2 ; (DP) ;JBF001 BR 60$ ;AND CONTINUE ;JBF001 50$: ;DO PUD SEARCH UNDER IAS, SIZE NOT HERE ;FRB001 MOV R0,-(SP) ;SAVE REGISTER ;FRB001 MOV .PUDBA,R0 ;FRB001 554$: CMP (R0),ARGBLK ;FOUND SAME DEVICE ? ;FRB001 BNE 555$ ;BR IF NOT ;FRB001 CMP 2(R0),ARGBLK+2 ;CHECK UNIT NUMBER ;FRB001 BEQ 556$ ;FOUND IT ;FRB001 555$: ADD #U.SZ,R0 ;BUMP TO NEXT UNIT ;FRB001 CMP R0,.PUDEA ;END OF PUD ;FRB001 BLT 554$ ;TRY AGAIN IF NOT ;FRB001 BR 559$ ;SKIP IF ERROR ;FRB001 556$: MOV U.LBH(R0),SIZE ;FILL IN SIZE ;FRB001 MOV U.LBN(R0),SIZE+2; ;FRB001 559$: MOV (SP)+,R0 ;RESTORE REGISTER ;FRB001 60$: BIC #177400,SIZE ;MASK OUT ANY HIGH BYTE GARBAGE ;JBF003 SUB #1,SIZE+2 ;SET SIZE TO HIGHEST BLK NO (N-1) ;JBF003 SBC SIZE ; DP ;**-1 MOV CDEV+0,DSD+0 ;FILL IN DEVICE SECTION OF DSD MOV CDEV+2,DSD+2 ; DP CALL VALID ;VALIDATE INPUT SWITCHES CALL VALUES ;VALIDATE INPUT SWITCH VALUES CALL GETLBN ;CONVERT BLK/WD TO LBN .PAGE .SBTTL ...RETRIEVE HOME BLOCK HOME: MOV #"OI,FROM ;DIAGNOSTIC TRACE MOV #STBLK,INFDB+F.STBK ;PROVIDE LOC OF STAT BLOCK OPEN$R #INFDB,,,,,,FCSERR ;OPEN THE INDEX FILE MOV STBLK+4,INFDB+F.HIBK ;SET FDB TO HIGHEST VBN ALLOCATED MOV STBLK+6,INFDB+F.HIBK+2 ; DP MOV STBLK+4,INFDB+F.EFBK ;SET EOF AT HIGHEST BLOCK MOV STBLK+6,INFDB+F.EFBK+2 ; DP ADD #1,INFDB+F.EFBK+2 ;SET EOF AT NEXT BLOCK ADC INFDB+F.EFBK ; DP MOV #2,VBN+2 ;POINT TO HOMEBLOCK MOV #"RH,FROM ;DIAGNOSTIC TRACE READ$ #INFDB,#HEADER,,#VBN,#FLAG,,,IOERR ;AND RETREIVE HOME BLK WAIT$ ,#FLAG ;WAIT FOR CYCLE TO COMPLETE MOV HEADER+H.FMAX,FMAX ;SAVE MAX # OF FILES. MOV HEADER+H.IBSZ,HIBSZ ;SAVE H.IBSZ VALUE ADD HIBSZ,VBN+2 ;INC VBN TO BLK BEFORE FIRST HEADER ; (VBN=3+N-1) .SBTTL ...OPEN OUTPUT FILE MOV #"OW,FROM ;DIAGNOSTIC TRACE OPEN$W #OUTFDB,,,,,,FCSERR ;OPEN OUTPUT FILE PUT$ #OUTFDB,#FFEED,#1,IOERR ;SKIP TO TOP OF PAGE ;JBF001 BIT MKW1,#DAMASK ;/DA SWITCH PRESENT? ;JBF001 BEQ .+6 ;IF EQ (NO), CONTINUE ;JBF001 JMP EOJ ;OTHERWISE, PRODUCE SUMMARY ONLY ;JBF001 BIT MKW1,#LIMASK ;/LI SWITCH PRESENT? BEQ NEXT ;IF NOT, DEFAULT IS TO LIST BIT MKW2,#LIMASK ;IF PRESENT, IS IT NEGATED? BNE NEXT ;IF NOT, BEGIN SEARCHING JMP EOJ ;OTHERWISE PRODUCE SUMMARY ONLY .PAGE .SBTTL RETRIEVE A HEADER BLOCK NEXT: MOV VBN,R1 ;PICK UP VBN OF LAST FILE HEADER. MOV VBN+2,R0 ADD #1,R0 ;INCREMENT TO VBN OF NEXT FILE HEADER. ADC R1 MOV R1,VBN ;SAVE NEW FILE HEADER VBN. MOV R0,VBN+2 SUB HIBSZ,R0 ;COMPUTE ID NUMBER (-1) SUB #3,R0 ; OF NEW FILE HEADER. CMP R0,FMAX ;VALID FILE ID? BLO 1$ ;YUP. JMP EOJ ;NOPE. ALL DONE. 1$: MOV #4096.,R1 ;4096. BITMAP BITS PER BLOCK. CALL $DIV ;COMPUTE BITMAP BLOCK # & BIT # IN BLOCK. ADD #3,R0 ;CONVERT TO INDEX FILE VBN. CMP R0,XBMVBN+2 ;IS THIS BITMAP BLOCK IN MEMORY? BEQ 3$ ;YUP. MOV R0,XBMVBN+2 ;NO, BUT IT WILL BE. REMEMBER IT. MOV #"BM,FROM ;DIAGNOSTIC TRACE. READ$ #INFDB,#XBM,,#XBMVBN,#FLAG ;READ IN BITMAP BLOCK. BCC 2$ ;CC = SUCCESS. JMP IOERR ;FAILURE - GO PITCH A BITCH. 2$: WAIT$ ,#FLAG ;WAIT FOR READ COMPLETION. 3$: MOV R1,R0 ;COPY BIT NUMBER IN BLOCK. ASR R0 ;COMPUTE ASR R0 ; INDEX TO ASR R0 ; BYTE IN BLOCK. BIC #177770,R1 ;MASK BIT NUMBER IN BYTE. BITB BITMSK(R1),XBM(R0) ;IS THIS HEADER ALLOCATED? BEQ NEXT ;NOPE. GO TRY NEXT ONE. MOV #"HD,FROM ;DIAGNOSTIC TRACE READ$ #INFDB,#HEADER,,#VBN,#FLAG ;RETRIEVE A HEADER BLOCK BCC 10$ ;SUCCESSFUL? CMPB F.ERR(R0),#IE.EOF ;WAS IT AN EOF CONDITION? BNE .+6 ;IF NOT, THEN FIND OUT THE PROBLEM JMP EOJ ;OTHERWISE, IT IS THE END-OF-JOB JMP IOERR ;FIND OUT THE PROBLEM 10$: WAIT$ ,#FLAG ;WAIT FOR INPUT READ TO COMPLETE CMP HEADER+H.FNUM,#0 ;A DELETED HEADER? BEQ NEXT ;IF SO, GET NEXT HEADER MOVB MUSE,R1 ;SETUP R1= NO PTRS IN USE (TIMES TWO) BIC #177400,R1 ;MASK OUT ANY HIGH BYTE GARBAGE ;JBF003 MOV #MPTR,R3 ;SETUP R3=ADD OF FIRST POINTER .SBTTL SEARCH MAP POINTERS ;+ ; SETUP REGISTERS TO DETERMINE IF A MATCH EXISTS IN THE POINTER GROUP. ; ; R1 = NO OF POINTERS (MUSE) (TIMES TWO) ; R2 = COUNT-1 FIELD ; R3 = ADDRESS OF TWO-WORD RETRIEVAL POINTER ; ; POINTER FORMAT: ; ; BYTE 1 = HIGH EIGHT LBN BITS ; BYTE 2 = COUNT FIELD ; BYTE 3/4 = LOW 16 LBN BITS ;- 15$: CMP R1,#0 ;NULL HEADER? BNE 20$ ;IF NOT, CONTINUE JMP NEXT ;OTHERWISE GET THE NEXT HEADER 20$: SWAB (R3) ;MOVE COUNT TO LOW BYTE MOVB (R3),R2 ;SETUP R2=COUNT-1 FIELD BIC #177400,R2 ;MASK OUT ANY HIGH BYTE GARBAGE ;JBF003 SUB R2,(R3) ;EXTRACT THE PURE DP LBN SWAB (R3) ;RESTORE POINTER'S HIGH LBN CALL SEARCH ;AND SEARCH THE POINTERS ADD #4,R3 ;SETUP NEXT POINTER LOCATION SUB #2,R1 ;DEC "NO-PTRS-IN-USE" BR 15$ ;AND CONTINUE .PAGE .SBTTL VALIDATE INPUT SWITCHES (SUBROUTINE) ;+ ; /LBN CANNOT HAVE /BLK OR /WD SWITCHES ; /BLK IS REQUIRED IF NO /LBN, BUT /WD IS OPTIONAL ; /WD MUST HAVE /BLK SWITCH ;- VALID: MOV CSIBLK+C.MKW1,R1 ;SETUP CSIBLK ADDRESS BITB R1,#LBMASK ;/LBN SWITCH PRESENT? BNE 10$ ;IF SO, CHECK FOR /BLK SW BITB R1,#BLMASK ;/BLK SWITCH PRESENT? BNE 60$ ;IF SO, EXIT BITB R1,#WDMASK ;/WD SWITCH PRESENT? BNE 40$ ;IF SO, CHECK FOR /BLK SWITCH MOV #MSG9,TEXT ;SETUP "NO INPUT SW" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 10$: BITB R1,#BLMASK ;/LBN & /BLK SWITCHES PRESENT? BEQ 30$ ;IF NOT, CHECK FOR /WD 20$: MOV #MSG10,TEXT ;SETUP "TOO MANY SW" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 30$: BITB R1,#WDMASK ;/WD SWITCH PRESENT? BEQ 60$ ;IF NOT, LTHEN EXIT BR 10$ ;OTHERWISE, TOO MANY SWITCHES 40$: BITB R1,#BLMASK ;/WD & /BLK SW PRESENT? BNE 60$ ;IF SOO, EXIT MOV #MSG11,TEXT ;SETUP "NO BLOCK SW" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 60$: RETURN .PAGE .SBTTL VALIDATE SWITCH VALUES (SUBROUTINE) ;+ ; /LBN START VALUE OF ZERO IS INVALID ; BLK VALUES MUST BE GREATER THAN ONE. ; WORD VALUES CANNOT EXCEED 1000 (OCTAL) AND MUST BE EVEN. ; STOP VALUES CANNOT BE LESS THAN THEIR START VALUES. ; A STOP VALUE OF ZERO MEANS GO TO THE END OF DEVICE (OR BLOCK). ; (THE ZERO VALUE IS REPLACED BY THE "SIZE" VALUE) ;- VALUES: BIT MKW1,#LBMASK ;/LBN SWITCH PRESENT? BEQ 30$ ;IF NOT, CHECK /BLK SWITCH .SBTTL ...CHECK /LBN VALUES MOV LBN2+2,R1 ;CHECK FOR ZERO STOP VALUE ADD LBN2,R1 ; DP BNE 10$ ;IF NOT ZERO, THEN PROCESS LBN2 MOV SIZE+0,LBN2+0 ;IF ZERO, SET STOP VALUE TO SIZE OF DEV MOV SIZE+2,LBN2+2 ; DP BR 100$ ;AND RETURN 10$: CMP LBN1,LBN2 ;CHECK HIGH LBN BLO 100$ ;IF LBN1 LT, THEN OK - CHECK /BLK BHI 20$ ;IF LBN1 GT, IT'S AN ERROR CMP LBN2+2,LBN1+2 ;IF EQ, CHECK LOW LBN VALLUES BHIS 100$ ;IF LBN2 GE LBN1, THEN GO CHECK /BLK 20$: MOV #MSG13,TEXT ;SETUP "INVALID /LBN VALUE" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT .SBTTL ...CHECK /BLK VALUES 30$: CMP BLK1,#1 ;IS BLK VALUE GT ONE? BHI 50$ ;IF SO, THEN CONTINUE 40$: MOV #MSG14,TEXT ;SETUP "INVALID /BLK VALUE" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 50$: CMP BLK2,#0 ;CHECK STOP VALUE BEQ 60$ ;IF ZERO, THEN CONTINUE CMP BLK2,BLK1 ;IS STOP LT START VALUE? BLO 40$ ;IF SO, THEN WE HAVE AN ERROR .PAGE .SBTTL ...CHECK /WD VALUES 60$: BIT MKW1,#WDMASK ;/WD SWITCH PRESENT? BEQ 100$ ;IF NOT, THEN EXIT CMP WD1,#10000 ;/WD VALUE TOO LARGE? BHIS 70$ ;IF SO, ERROR CONDITION MOV WD1,R0 ;SETUP TO CHECK FOR EVEN NUMBER MOV #2,R1 ;(DIVISOR) CALL $DIV ;DIVIDE CMP R1,#0 ;ANY REMAINDER? BEQ 75$ ;IF NOT, CONTINUE 70$: MOV #MSG15,TEXT ;SETUP "INVALID /WD VALUE" MSG CALL TYPEP ; DISPLAY IT AND THEN EXIT 75$: MOV WD2,R0 ;NOW CHECK THE STOP VALUE FOR EVEN MOV #2,R1 ;(DIVISOR) CALL $DIV ;DIVIDE CMP R1,#0 ;ANY REMAINDER? BNE 70$ ;IF SO, THEN WE HAVE AN ERROR CMP BLK1,BLK2 ;THE SEARCH SPAN MORE THAN ONE BLOCK? BNE 100$ ;IF NOT, THEN RETURN CMP WD1,WD2 ;IS STOP VALUE GT/EQ START? BHI 70$ ;IF NOT, THEN ERROR 100$: RETURN .PAGE .SBTTL GENERATE THE LBN VALUES (SUBROUTINE) ;+ ; IF /LBN, THEN THE LBN'S ALREADY EXIST ; IF /BLK, THEN START = (4096 * BLK1) - 4096 ; STOP = (4096 * BLK2) - 1 ; IF /WD, THEN START = LBN1 + (8 * WD1) ; STOP = LBN2 - (4096 - (8 * WD2) + 16) ;- GETLBN: BIT CSIBLK+C.MKW1,#LBMASK ;/LBN SW PRESENT? BNE 100$ ;IF SO, THEN EXIT .SBTTL ...CALCULATE /BLK VALUES MOV #4096.,R0 ;SETUP SP MULTIPLICAND CLR R2 ;SETUP DP HI-MULTIPLIER MOV BLK1,R3 ;SETUP DP LO-MULTIPLICAND SUB #1,R3 ;ADJUST FOR UNUSED FIRST BITMAP BLK CALL $DMUL ;PERFORM DP MULTIPLICATION MOV R0,LBN1 ;RETRIEVE THE RESULT MOV R1,LBN1+2 ; DP SUB #4096.,LBN1+2 ;SET THE START VALUE SBC LBN1 ; DP CMP BLK2,#0 ;SEARCH TO END INDICATOR? BNE 10$ ;IF NOT, THEN CALCULATE STOP VALUE MOV SIZE+0,LBN2+0 ;IF ZERO, SET STOP VALUE TO SIZE OF DEV MOV SIZE+2,LBN2+2 ; DP BR 20$ ;CHECK /WD AVLUES NEXT 10$: MOV #4096.,R0 ;SETUP TO GENERATE STOP LBN VALUE CLR R2 ;SETUP THE STOP VALUE MOV BLK2,R3 ; DP SUB #1,R3 ;ADJUST FOR UNUSED BITMAP.SYS BLOCK CALL $DMUL ;PERFORM DP MULTIPLICATION MOV R0,LBN2 ;RETRIEVE THE RESULTS MOV R1,LBN2+2 ; DP SUB #1,LBN2+2 ;STEP TO END OF BLOCK SBC LBN2 ; DP .PAGE .SBTTL ...CALCULATE /WD VALUES ;+ ; WD2 = 776 IF THERE WAS NO WD2 ENTRY ;- 20$: BIT MKW1,#WDMASK ;/WD SWITCH PRESENT? BEQ 100$ ;IF NOT, THEN EXIT MOV #8.,R0 ;SETUP MULTIPLIER MOV WD1,R1 ;SETUP MULTIPLICAND CALL $MUL ;PERFORM SP MULTIPLICATION ADD R1,LBN1+2 ;RETRIEVE THE RESULTS ADC LBN1 ; DP MOV #8.,R0 ;IF SO, THEN CALCULATE IT MOV WD2,R1 ;MULTIPLICAND CALL $MUL ;PERFORM SP MULTIPLICATION MOV #4096.,R0 ;SETUP SUB R1,R0 ; TO GENERATE OFFSET VALUE SUB R0,LBN2+2 ;RETRIEVE THE RESULTS SBC LBN2 ; DP ADD #16.,LBN2+2 ;STEP TO END OF WORD ADC LBN2 ; DP .SBTTL ...VALIDATE LBN VALUES ;JBF001 ;JBF001 100$: CMP LBN1,SIZE ;CHECK START VALUE BLO 105$ ; IS IT WITHIN RANGE? BHI 102$ ; IS IT OUT OF RANGE? ;JBF002 CMP LBN1+2,SIZE+2 ; (DP) BLOS 105$ ; (DP) 102$: ;JBF002 MOV #MSG18,TEXT ;SETUP "OUT OF RANGE" MSG CALL TYPEP ; DISPLAY IT AND EXIT 105$: CMP LBN2,SIZE ;CHECK STOP VALUE BLO 110$ ;IS IT WITHIN THE DEVICE? CMP LBN2+2,SIZE+2 ;(DP) BLOS 110$ ; (DP) MOV SIZE,LBN2 ;IF NOT, THEN SET TO DEVICE'S LIMIT MOV SIZE+2,LBN2+2 ; DP 110$: RETURN .PAGE .SBTTL SEARCH FOR A MATCH (SUBROUTINE) ;+ ; THE SPAN SEARCH CONSISTS OF: ; ; STEP I..CMP UPPER LIMIT TO BASE VALUE ; A) LT = NO MATCH ; B) EQ = MATCH ; C) GT = POSSIBLE MATCH ; STEP II.............CMP LOWER LIMIT TO BASE VALUE ; A) LT = MATCH ; B) EQ = MATCH ; C) GT = POSSIBLE MATCH ; STEP III........................TOP=BASE+COUNT ; CMP UPPER LIMIT TO TOP VALUE ; A) LT = MATCH ; B) EQ = MATCH ; C) GT = NO MATCH ;- SEARCH: CMP LBN2,(R3) ;(STEP I.) HI(DP) COMPARE BLO 200$ ;NO MATCH POSSIBLE CMP LBN2+2,2(R3) ;LOW (DP) COMPARE BLO 200$ ;NO MATCH POSSIBLE BEQ 100$ ;MATCH FOUND CMP LBN1,(R3) ;(STEP II.) HI (DP) COMPARE BLO 100$ ;MATCH FOUND BHI 200$ ;NO MATCH POSSIBLE ;JBF003 CMP LBN1+2,2(R3) ;LOW (DP) CMPARE BLOS 100$ ;MATCH FOUND ;JBF003 ;**-1 MOV (R3),TOP ;(STEP III.) MOV 2(R3),TOP+2 ;SETUP TO CALCULATE ADD R2,TOP+2 ; TOP OF RTRV POINTER SPAN ADC TOP ; DP CMP LBN1,TOP ;HIGH (DP) COMPARE BHI 200$ ;NO MATCH POSSIBLE BLO 100$ ;MATCH FOUND CMP LBN1+2,TOP+2 ;LOW (DP) COMPARE BHI 200$ ;NO MATCH POSSIBLE 100$: MOV (SP)+,HOLD ;DUMP LAST "JSR RET ADDRESS" FROM STACK JMP OUTPUT ;RESULTS POSITIVE - RECORD RESULTS 200$: RETURN ;RESULTS NEGATIVE - CONTINUE .PAGE .SBTTL ASSEMBLE OUTPUT FILESPEC ;+ ; THIS ROUTINE IS ENTERED WHENEVER A HEADER CONTAINS A POINTER ; WHICH INCLUDED THE LBN'S SPECIFIED IN THE INPUT FILESPEC SWITCHES. ; THE ARGUMENT BLOCK IS BUILT AND THEN PASSED TO THE SYSTEM EDITOR. ;- OUTPUT: MOV HEADER+H.FNUM, ARGBLK+0 ;SETUP FILE ID NUMBER. MOV HEADER+H.FSEQ, ARGBLK+2 ;SETUP FILE SEQUENCE NUMBER. MOV #HEADER+H.PROJ, ARGBLK+4 ;SETUP GROUP NUMBER MOV #HEADER+H.PROG, ARGBLK+6 ;SETUP MEMBER NUMBER MOV FNAM+0, ARGBLK+8. ;SETUP FILENAME MOV FNAM+2, ARGBLK+10. ; MOV FNAM+4, ARGBLK+12. ; MOV FNAM+6, ARGBLK+14. ;SETUP FILE TYPE MOV FNAM+8., ARGBLK+16. ;SETUP FILE VERSION MOV #EDTSTR,R1 ;SETUP EDIT STRING CALL WRITE ;OUTPUT THE RESULTS ADD #1,FCOUNT ;INCREMENT FILE COUNTER JMP NEXT ;AND GET NEXT HEADER .SBTTL WRITE (PUT) TO OUTPUT FILE (SUBROUTINE) ;+ ; THIS ROUTINE SETS UP AND EDITS THE OUTPUT STRING AND WRITES THE ; RESULTS TO THE OUTPUT FILE. ; ; R0 = OUTPUT BUFFER ; R1 = EDIT STRING (SUPPLIED PRIOR TO ENTERING ROUTINE) ; R2 = ADDRESS OF THE ARGUMENT BLOCK ;- WRITE: MOV #BUFFER,R0 ;SETUP OUTPUT BUFFER LOCATION MOV #ARGBLK,R2 ;SETUP ARGUMENT BLOCK CALL $EDMSG ;CALL THE EDITOR MOV R1,LENGTH ;SAVE THE EDITTED STRING LENGTH PUT$ #OUTFDB,#BUFFER,LENGTH,IOERR ;OUTPUT THE RESULTS RETURN .PAGE .SBTTL DISPLAY MESSAGES (SUBROUTINE) ;+ ; THESE ROUTINES DISPLAY INFORMATION AND ERROR MESSAGES ;- TYPEP: QIOW$C IO.WVB,DISP,FLAG,,,, ;DISPLAY PREFIX MOV #53,OUT+Q.IOPL+4 ;SET QIOW TO /MSG// BR TTT ;BYPASS Q.IOPL PARAMETER TYPE: MOV #40,OUT+Q.IOPL+4 ;RESET QIOW TO //MSG// TTT: MOV TEXT,OUT+Q.IOPL ;PROVIDE ADDRESS OF MESSAGE ADD #1,OUT+Q.IOPL ;STEP PAST MESSAGE COUNT BYTE MOVB @TEXT,OUT+Q.IOPL+2 ;PROVIDE LENGTH OF MESSAGE DIR$ #OUT,DIRERR ;AND OUTPUT THE MESSAGE CMP OUT+Q.IOPL+4,#53 ;WAS THIS AN ERROR MSG? BNE .+6 ;IF NOT, RETURN JMP EXIT ;OTHERWISE, EXIT RETURN .PAGE .SBTTL END OF JOB ROUTINE EOJ: MOV #INFDB+F.DVNM,ARGBLK ;SETUP ASCII DEVICE NAME MOV INFDB+F.UNIT,ARGBLK+2 ;SETUP UNIT NUMBER. MOV #SIZE,ARGBLK+4 ;SETUP NO OF BLOCKS ON DEVICE MOV #DEVSTR,R1 ;SETUP EDIT STRING ADD #1,SIZE+2 ;SET BACK TO MAX NO OF BLKS ADC SIZE ; DP CALL WRITE ;;OUTPUT THE RESULTS MOV LBN2+2,HOLD+2 ;SETUP TO FIND # BLOCKS IN SPAN MOV LBN2,HOLD ; DP SUB LBN1+2,HOLD+2 ;FIND THE DIFFERENCE SBC HOLD ; DP SUB LBN1,HOLD ; DP ;JBF003 ADD #1,HOLD+2 ;COMPENSATE FOR THE SUBTRACTION ADC HOLD ; DP MOV #HOLD,ARGBLK ;SETUP ADDRESS OF DP VALUE MOV #RNGSTR,R1 ;EDIT STRING CALL WRITE ;OUTPUT THE RESULTS MOV #LBN1,ARGBLK ;SETUP ADDRESS OF START LBN BYTE MOV LBN1+2,ARGBLK+2 ;SETUP START LBN(LO) VALUE MOV #LBN1,ARGBLK+4 ;SETUP ADDRESS OF START HIGH LBN (DEC) MOV #LOSTR,R1 ;EDIT STRING CALL WRITE ;OUTPUT THE RESULTS MOV #LBN2,ARGBLK ;SETUP ADDRESS OF STOP LBN HIGH BYTE MOV LBN2+2,ARGBLK+2 ;SETUP STOP LBN(LO) VALUE MOV #LBN2,ARGBLK+4 ;SETUP ADDRESS OF STOP HIGH LBN (DEC) MOV #HISTR,R1 ;EDIT STRING CALL WRITE ;OUTPUT THE RESULTS MOV FCOUNT,ARGBLK ;SETUP THE FILE COUNT MOV #FILSTR,R1 ;EDIT STRING CALL WRITE ;OUTPUT THE RESULTS CALL GETIME ;FIND ELAPSED TIME MOV #STRTIM,R0 ;SETUP FOR ELAPSED TIME LINE MOV #HR2,R1 ;OUTPUT STRING MOV #3,R2 ;REQUEST HH:MM:SS FORMAT CALL $TIM ;CONVERT THE TIME PUT$ #OUTFDB,#TIMSTR,#TLONG,IOERR ;OUTPUT ELASPSED TIME MOV CSIBLK+C.CMLD, OUTFDB+F.NRBD ;SETUP ADDRESS MOV CSIBLK+C.CMLD+2,OUTFDB+F.NRBD+2;SETUP LENGTH PUT$ #OUTFDB,,,IOERR ;OUTPUT COMMAND LINE CMP SPOOL,#0 ;SPOOL THE OUTPUT? BEQ EXIT ;IF NOT, PASS PRINT$ #OUTFDB,FCSERR ;SPOOL OUTPUT EXIT: CLOSE$ #OUTFDB,FCSERR ;CLOSE THE FILE BEFORE LEAVING ;HWG001 CLOSE$ #INFDB,FCSERR ;HWG001 EXIT$S ;EXIT THE PROGRAM ;HWG001 .PAGE .SBTTL CALCULATE ELAPSED TIME (SUBROUTINE) GETIME: GTIM$C TIME2 ;SAVE STOP TIME CMP SEC1,SEC2 ;PAST 60 SECONDS? BLE 10$ ;IF NOT PASS ADD #60.,SEC2 ; ADJUST ADD #1,MIN1 ; AND CARRY ONE 10$: SUB SEC1,SEC2 ; FIND DELTA SECONDS CMP MIN1,MIN2 ;OVER 60 MINUTES? BLE 20$ ;IF NOT, PASS ADD #60.,MIN2 ; ADJUST MINUTES ADD #1,HR1 ; AND CARRY ONE 20$: SUB MIN1,MIN2 ;FIND DELTA MINUTES CMP HR1,HR2 ;OVER 24 HOURS? BLE 30$ ;IF NOT, PASS ADD #24.,HR2 ; ADJUST HOURS 30$: SUB HR1,HR2 ;FIND DELTA HOURS RETURN .PAGE .SBTTL ERROR ROUTINE ;+ ; ERROR ROUTINES------------ ; ENTERED WHEN AN ERROR CONDITION IS DETECTED ; "FROM" CONTAINS A KEY TO WHERE THE ERROR OCCURRED ; (SEE "DIAGNOSTIC TRACE" STATEMENTS BEFORE EACH FCS MACRO) ; ; ; THE ERROR CODES ARE CONTAINED IN APPENDIX I OF THE ; I/O OPERATIONS REFERENCE MANUAL (AA-2515D-TC) ; ; THE PROGRAM EXITS AFTER INDICATING THE ERROR ; ; ...ENTER AT "DIRERR" FOR EXECUTIVE DIRECTIVE REJECTION ERROR ; ...ENTER AT "IOERR" FOR A READ/WRITE I/O ERROR ; ...ENTER AT "FCSERR" FOR FCS (OPEN/CLOSE) MACRO ERRORS ; ; R0=ADDRESS OF THE RESPECTIVE FDB ;- IOERR: MOV IOSB,F.ERR(R0) ;RETRIEVE DIR ERR # FOR DECODING BR FCSERR ;AND DECODE IT DIRERR: MOV $DSW,F.ERR(R0) ;RETRIEVE THE DSW FCSERR: CMPB F.ERR+1(R0),#0 ;IS IT AN 'IOER'? BEQ 25$ ;IF SO, PASS 'QIOE' ROUTINE MOV #"QI,ERRTYP ;ENTER 'QIOE' TYPE MOV #"OE,ERRTYP+2 ;(SECOND PART OF 'QIOE') BR SHOERR ;NOW OUTPUT RESULT 25$: MOV #"IO,ERRTYP ;ENTER 'IOER' TYPE MOV #"ER,ERRTYP+2 ;(SECOND PART OF 'IOER') SHOERR: MOVB F.ERR(R0),R1 ;ACTUAL # TO BE CONVERTED NEG R1 ;TAKE THE TWO'S COMPLIMENT MOV #HOLD,R0 ;ADDRESS OF TEMP HOLDING AREA FOR RESULT MOV #1,R2 ;INDICATES NO ZERO-SUPPRESSION CALL $CBDMG ;CONV MAGNITUDE OF BIN BYTE TO DEC MOVB HOLD+4,ERRNO+1 ;MOVE TENS DIGIT MOVB HOLD+3,ERRNO ;AND THE UNITS DIGIT QIOW$C IO.WVB,DISP,FLAG,,,, ;PRINT ERR MSG EXIT$S ;EXIT THE PROGRAM .END START