'=========================================================================== ' Subject: FASTER FILE READ Date: 07-25-98 (09:10) ' Author: The ABC Programmer Code: QB, PDS ' Origin: voxel@edmc.net Packet: INTERRPT.ABC '=========================================================================== ' READBLK.BAS ' reads a block from the disk into memory (using interrupts). ' ' Supposedly faster than GET, on average... but not on small files. ' The bigger the file, the better the results. Buffer size also affects ' the running time. Run this at least twice to get an average, sometimes ' GET will be faster... usually on small files. '$INCLUDE: 'QB.BI' CONST BufferSize = 100 '' GET becomes a bit slower if this is set low DIM INRegs AS RegTypeX, OUTRegs AS RegTypeX DIM big.array(1) AS STRING * BufferSize filename$ = "c:\abc\graphics.abc" '' bigger the better! filenameZ$ = filename$ + CHR$(0) CLS ' open an existing file for reading INRegs.ax = &H3D00 INRegs.dx = SADD(filenameZ$) INRegs.ds = VARSEG(filenameZ$) CALL INTERRUPTX(&H21, INRegs, OUTRegs) IF (OUTRegs.flags AND &H1) <> 0 THEN PRINT "Can't open the file." END END IF ' set the i/o pointer to 0 file.handle% = OUTRegs.ax INRegs.ax = &H4200 INRegs.bx = file.handle% INRegs.cx = 0 INRegs.dx = 0 CALL INTERRUPTX(&H21, INRegs, OUTRegs) IF (OUTRegs.flags AND &H1) <> 0 THEN PRINT "File pointer error" GOTO CloseFile END IF PRINT "Using buffer" PRINT "Start time: "; TIMER T! = TIMER INRegs.ax = &H3F00 INRegs.bx = file.handle% INRegs.cx = BufferSize INRegs.dx = VARPTR(big.array(1)) INRegs.ds = VARSEG(big.array(1)) DO CALL INTERRUPTX(&H21, INRegs, OUTRegs) IF (OUTRegs.flags AND &H1) <> 0 THEN PRINT "Disk read error" GOTO CloseFile END IF LOOP UNTIL OUTRegs.ax = 0 CloseFile: INRegs.ax = &H3E00 INRegs.bx = file.handle% CALL INTERRUPTX(&H21, INRegs, OUTRegs) T! = TIMER - T! PRINT "End time: "; TIMER PRINT USING "Difference: #.#############"; T! FOR i = 1 TO 1 PRINT big.array(i) NEXT i PRINT SLEEP 1 PRINT "Using get" OPEN filename$ FOR BINARY AS #1 PRINT "Start time: "; TIMER T! = TIMER DO GET #1, , big.array(1) LOOP UNTIL EOF(1) CLOSE #1 T! = TIMER - T! PRINT "End time: "; TIMER PRINT USING "Difference: #.#############"; T! SLEEP FOR i = 1 TO 1 PRINT big.array(i) NEXT i END