'===========================================================================
' 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
