BBS: Inland Empire Archive Date: 04-15-92 (09:36) Number: 187 From: TOM HAMMOND Refer#: NONE To: DONALD SUTER Recvd: NO Subj: QB help with disk files? Conf: (2) Quik_Bas
DS> OPEN the sixteenth file. My autoexe.bat has FILES=50 BUFFERS=30.
DS>Shouldnt QB4.5 be able to open more than 15 files at one time?
RV>I've seen code on one of the echoes about using interrupt
RV>to go in and increase the maximum DOS file handles. I'm
RV>interested too. I'll look and see if I captured any code.
Donald:
I sent a reply to you a week or so ago, but it apparently got dumped
into the bit bucket somewhere along the line. Hope you get this one.
'From : HOWARD MENCHER
'To : ALL Date: 12/30/91 2:48p
'Subject : Open mega files at once 2
' The following is a BASIC code example of the DOS interrupt necessary
' to access more than 20 DOS file handles:
' $INCLUDE: 'qb.bi'
' For BASIC PDS 7.00 include QBX.BI
' For QuickBASIC include QB.BI
DEFINT A-Z
DIM InRegs AS RegType, OutRegs AS RegType
NrFiles = 40 '35 open files + 5 file handles for DOS I/O
CLS
' --------------------------
' This section of code did NOT come from Howard Mencher, but DOES
' appear to be REQUIRED in order for you to open more than about
' 28-29 files at one time.
' MUST deallocate some memory from the Far Heap
ON ERROR GOTO ReAllocateFarHeap
Allocate = 128 '128 bytes is good up to at least 80 open files
HeapBefore& = SETMEM(0) ' Get size of far heap
IF HeapBefore& - SETMEM(-Allocate) >= Allocate THEN
FarHeap& = SETMEM(-Allocate)
ELSE
PRINT "Insufficient Memory to de-allocate"
END
END IF
' --------------------------
'Continuing with code from Howard Mencher
InRegs.ax = &H6700 'SetFileHandles function
' Value in BX register must be odd in DOS 3.30; odd or even in later
' DOS versions; ranging from 21 to 255:
InRegs.bx = NrFiles 'The number of files to open
CALL Interrupt(&H21, InRegs, OutRegs)
FOR I% = 1 TO NrFiles - 5 '5 files are reserved for
' DOS standard I/O.
File$ = "Junk" + STR$(I%)
OPEN File$ FOR OUTPUT AS I%
PRINT I%
NEXT
CLOSE
' --------------------------
' This code did NOT come from Howard Mencher. It just serves to
' verify 'that the deallocated memory is successfully returned to
' the Far Heap.
ReAllocateFarHeap:
FarHeap& = SETMEM(Allocate + 128) 'Return AT LEAST as much memory
HeapAfter& = SETMEM(0) ' as was deallocated
PRINT "Before:"; HeapBefore&
PRINT " After:"; HeapAfter&
IF HeapAfter& < HeapBefore& THEN PRINT "Far Heap Memory NOT returned"
END
--------------- CUT HERE ---------------
When I imported this file into SLMR, it wrapped pretty badly. I think
I was able to get it reformatted correctly. Hope so anyway.
Hope this helps. Good Luck.
Tom Hammond N0SS
---
þ SLMR 2.1 þ Press any key to continue or any other key to quit
--- WM v2.00/91-0231
* Origin: The Modem Zone BBS (314) 893-5106 (1:289/2)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET