; BLOCKS.SBR ; PROGRAM TO DETERMINE THE LARGEST CONTIGUOUS BLOCK ; & TOTAL FREE BLOCKS AVAILABLE ON THE SPECIFIED DISK ; ; 09/17/83 - D. EICHBAUER ; ; ; ; PROPRIETARY PROGRAM MATERIAL ; ; THIS MATERIAL IS THE PROPERTY OF DALE A. EICHBAUER, ; 692 E. FREELAND ROAD, MERRILL, MICHIGAN, 48637. PERMISSION ; TO COPY & USE IS GRANTED FOR NON-PROFIT USES ONLY. ; ; ; ; ; CALLED AS --> XCALL BLOCKS,FSPEC,CONTIG,FREE ; WHERE FSPEC IS A VALID PARTIAL FILESPEC (E.G. "DSK0:"), ; AND CONTIG & FREE ARE FLOATING POINT VARIABLES ON ; WORD BOUNDARIES. ; SEARCH SYS SEARCH SYSSYM AUTOEXTERN VMAJOR=2. VMINOR=0. VSUB=1. VEDIT=100. VWHO=1. ; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC PARMS=0 TYP.1=2 ADD.1=4 SIZE.1=10 TYP.2=14 ADD.2=16 SIZE.2=22 TYP.3=26 ADD.3=30 SIZE.3=34 STRING = 2 FLOAT = 4 ; OFFSETS FROM A4 (FREE MEMORY POINTER) DDB.X=0 ; DDB FOR I/O BUF.X = D.DDB ; RECORD BUFFER (512 BYTES) SIZ.L=D.DDB+512. ; RECORD SIZE CNT.L=D.DDB+516. ; FREE BLOCK COUNTER REC.L=D.DDB+520. ; RECORD NUMBER LRG.L=D.DDB+524. ; LARGEST BLOCK COUNTER PHDR -1,PV$RPD,PH$REE!PH$REU OBJNAM BLOCKS.SBR BR START ASCII / COPYRIGHT (C) 1983, 1984 DALE A. EICHBAUER / EVEN START: MOV A5,D1 ; GET THE END OF AVAILABLE MEMORY SUB A4,D1 ; NOW SUBTRACT BEGINNING OF AVAILABLE CMP D1,#D.DDB+528. ; SEE IF ENOUGH ROOM FOR VARIABLES JLT ABORT ; IF NOT, GO BACK EMPTY CMPW PARMS(A3),#3 ; CHECK FOR RIGHT NUMBER OF PARAMETERS JNE ABORT ANDW #17,TYP.1(A3) ; MASK OFF UNNECESSARY BITS CMPW TYP.1(A3),#STRING ; SEE IF FILESPEC A STRING JNE ABORT ; IF NOT, BAD PARAMETER ANDW #17,TYP.2(A3) ; MASK OFF UNNECESSARY BITS CMPW TYP.2(A3),#FLOAT ; SEE IF SECOND ARGUMENT A FLOAT JNE ABORT ANDW #17,TYP.3(A3) ; MASK OFF UNNECESSARY BITS CMPW TYP.3(A3),#FLOAT JNE ABORT CLEAR @A4,D.DDB+528. ; CLEAR OUT THE AREA MOV #2,REC.L(A4) ; START WITH PHYSICAL RECORD #2 LEA A2,BUF.X(A4) ; POINT TO THE DDB BUFFER MOV A2,D.BUF(A4) ; SAVE IT IN THE DDB MOV #512.,D.SIZ(A4) ; PUT THE RECORD SIZE IN THE DDB MOVB #D$INI,D.FLG(A4) ; INIDICATE DDB INITED MOV ADD.1(A3),A2 ; POINT TO FILESPEC FOR CONVERSION FSPEC @A4 ; PROCESS FILESPEC FROM COMMAND LINE MOV #2,D.REC(A4) ; FAKE IT OUT INTO LOADING DRIVER READ @A4 ; WITH A USELESS READ MOV D.DVR(A4),A1 ; GET THE DRIVER ADDRESS MOV 24(A1),D4 ; NOW GET BLOCK COUNT FROM THE DRIVER CLR D1 ; CLEAR OUR CURRENT FREE BLOCK COUNTER GETREC: MOV REC.L(A4),D.REC(A4) ; PUT THE RECORD NUMBER INTO DDB INC REC.L(A4) ; AND INCREMENT IT FOR NEXT USE READ DDB.X(A4) ; READ THE RECORD MOV D.BUF(A4),A2 ; GET THE BUFFER ADDRESS MOV D.SIZ(A4),SIZ.L(A4) ; SAVE RECORD SIZE FOR LATER USE LOOP: CLR D3 ; THIS IS OUR TEST PATTERN (1 BIT ONLY) L01010: INC CNT.L(A4) ; INCREMENT THE TOTAL FREE BLOCK COUNT BTST D3,@A2 ; NOW SEE IF THE BIT IS SET BEQ OPENB ; IF NOT, THEN OPEN BLOCK CMP D1,LRG.L(A4) ; SEE IF THIS ONE IS HIGHER BLOS NOTHIGH ; IF NOT, IGNORE MOV D1,LRG.L(A4) ; ELSE MAKE THIS THE HIGHEST NOTHIGH: DEC CNT.L(A4) ; DECREMENT THE FREE BLOCK COUNT CLR D1 BR NOINC OPENB: INC D1 ; INCREMENT THE CURRENT FREE COUNT NOINC: DEC D4 ; DECREMENT THE BLOCK COUNT ON DEVICE BEQ L01114 ; AND WHEN ZERO, DO FINISH UP INC D3 ; INCREMENT THE BIT POSITION NUMBER CMP D3,#10 BLT L01010 ; AND IF NOT DONE, LOOP BACK L01104: DEC SIZ.L(A4) ; DECREMENT THE BYTE COUNT FOR RECORD BEQ GETREC ; IF DONE WITH THIS RECORD, GET NEXT INC A2 ; POINT TO NEXT BYTE BR LOOP ; ELSE PROCESS ANOTHER WORD L01114: CMP D1,LRG.L(A4) ; SEE IF THIS ONE IS HIGHER BLOS IGNORE ; IF NOT, IGNORE MOV D1,LRG.L(A4) ; ELSE MAKE THIS THE HIGHEST IGNORE: MOV CNT.L(A4),D1 ; GET THE FREE BLOCK COUNT MOV ADD.3(A3),A1 ; POINT TO FREE BLOCK RETURN VARIABLE FLTOF CNT.L(A4),@A1 ; & CONVERT INTO IT MOV ADD.2(A3),A1 ; POINT TO THE CONTIG RETURN VARIABLE FLTOF LRG.L(A4),@A1 ; & CONVERT INTO IT RTN ; BACK TO BASIC ABORT: TYPECR ?ERROR IN BLOCKS.SBR EXIT ; KAPUT ASCII / COPYRIGHT (C) 1983, 1984 DALE A. EICHBAUER / EVEN END .