FILE HANDLES
PRODUCT : TURBO BASIC NUMBER : 360
VERSION : 1.0
OS : PC-DOS
DATE : July 22, 1987 PAGE : 1/5
TITLE : FILE HANDLES
This program demonstrates how to retrieve a file handle from
within a Turbo Basic program.
$INCLUDE "REGNAMES.INC" ' This file should be on your Turbo
Basic disk.
Begin:
CLS
OPEN "Test1" FOR OUTPUT AS #1
CALL Get.File.Date.and.Time ( 1, Year%, Month%, Date%,_
Hour%, Minute%, Second% )
CALL Print.Stats
CALL Set.File.Date.and.Time ( 1, 1987, 6, 30,_
12, 30, 55 )
CALL Get.File.Date.and.Time ( 1, Year%, Month%, Date%,_
Hour%, Minute%, Second% )
CALL Print.Stats
CLOSE
KILL "Test1"
END
PRODUCT : TURBO BASIC NUMBER : 360
VERSION : 1.0
OS : PC-DOS
DATE : July 22, 1987 PAGE : 2/5
TITLE : FILE HANDLES
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³
³ FNFileHandleAddress% : ³
³ ³
³ Returns a file handle based upon the number of the file ³
³ passed into the function. The function searches through Turbo³
³ Basic's linked list of file handles for the corresponding ³
³ file number passed in the function. You will know which file ³
³ number to pass in through the syntax of the OPEN statement ³
³ that you used on the file. See the program FILEEX.BAS for an ³
³ example of how to use this function along with DOS function ³
³ call 87 ( 57 hex ). ³
³ ³
³ Turbo Basic's linked list of file handles is stored in ³
³ the string data segment area. Two bytes at offsets 6 & 7 ³
³ are a pointer to the first node of the linked list. Each ³
³ node in the linked list has the following format: ³
³ ³
³ ³
³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³
³ | Pointer to next node | 2 Bytes ³
³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³
³ | Pointer to previous node | " " ³
³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³
³ | File Number | " " ³
³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³
³ | DOS File Handle | " " ³
³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³
³ ³
³ Please keep in mind that the information is stored in ³
³ byte-reverse notation. This was written on 6/4/87 for ³
³ Turbo Basic 1.00. ³
³ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PRODUCT : TURBO BASIC NUMBER : 360
VERSION : 1.0
OS : PC-DOS
DATE : July 22, 1987 PAGE : 3/5
TITLE : FILE HANDLES
DEF FNFileHandleAddress%(FileNumber%)
LOCAL Segment%,Ofs%,Done%
DEF SEG
Segment% = PEEK(0) + (256 * PEEK(1)) ' Get the string
segment.
DEF SEG = Segment%
Ofs% = PEEK(6) + (256 * PEEK(7)) ' Peek at the first file
number.
Done% = 1
WHILE Done% = 1
IF (PEEK(Ofs%+4) + (256 * PEEK(Ofs%+5))) = FileNumber% THEN
FNFileHandleAddress% = PEEK(Ofs%+6) + (256 * PEEK(Ofs%+7))
Done% = 0
ELSEIF (PEEK(Ofs%) + (256 * PEEK(Ofs%+1))) = 0 THEN
FNFileHandleAddress% = 0 ' File number not
found.
Done% = 0
ELSE
Ofs% = PEEK(Ofs%) + (256 * PEEK(Ofs%+1)) ' Traverse the
linked list.
END IF
WEND
END DEF
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³
³ Get.File.Date.and.Time ³
³ ³
³ Uses DOS Function call 87 ( hex 57 ) to retrieve ³
³ a file's time and date statistics. To accomplish this, ³
³ the file handle must be first retrieved from Turbo Basic's ³
³ linked list structure of file handles. If the file handle ³
³ is present in the linked list, the statistics concerning it ³
³ are returned. If not, all variables passed to the procedure ³
³ Get.File.Date.and.Time are set to zero. ³
³ ³
³ Written on 6/4/87 for Turbo Basic version 1.00. ³
³ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PRODUCT : TURBO BASIC NUMBER : 360
VERSION : 1.0
OS : PC-DOS
DATE : July 22, 1987 PAGE : 4/5
TITLE : FILE HANDLES
SUB Get.File.Date.and.Time ( FileNumber%, Year%, Month%, Date%,_
Hour%, Minute%, Second% )
FH% = FNFileHandleAddress% ( FileNumber% ) ' Get the File
Handle.
IF ( FH% ) THEN
REG %AX,&H5700 ' DOS Function Call 87 -- see p.319
REG %BX,FH% ' of Peter Norton's Programmer's Guide to
' the IBM PC.
REG %DX,0
REG %CX,0
CALL INTERRUPT &H21
Year% = 1980 + FNShr% ( REG (%DX), 9 )
Month% = ( REG(%DX) AND &HLE0 ) \ 32
Date% = REG(%DX) AND &HLF
Weekday% = REG(%DX) AND &H1F
Hour% = FNShr% ( REG(%CX), 11 )
Minute% = FNShr% ( REG(%CX), 5 ) AND &H3F
Second% = FNShl% ( ( REG(%CX) AND &HLF ) , 1 )
ELSE
Year% = 0 ' If the File Handle was not found,
Month% = 0 ' set all variables to zero.
Date% = 0
Weekday% = 0
Hour% = 0
Minute% = 0
Second% = 0
END IF
END SUB
SUB Set.File.Date.and.Time ( FileNumber%, Year%, Month%, Date%,_
Hour%, Minute%, Second% )
FH% = FNFileHandleAddress% ( FileNumber% ) ' Get the File
Handle.
IF ( FH% ) THEN
REG %AX,&H5701
REG %BX,FH%
PRODUCT : TURBO BASIC NUMBER : 360
VERSION : 1.0
OS : PC-DOS
DATE : July 22, 1987 PAGE : 5/5
TITLE : FILE HANDLES
REG %DX, (Year% - 1980%) * 512% + Month% * 32% + Date%
REG %CX, FNShl% ( Hour%, 11 )
REG %CX, REG(%CX) + FNShl% ( Minute%, 5 )
REG %CX, REG(%CX) + ( Second% \ 2 )
CALL INTERRUPT &H21
ELSE
PRINT "File number: ";FileNumber%;" associated handle not
found."
END IF
END SUB
SUB Print.Stats
SHARED Year%, Month%, Date%, Hour%, Minute%, Second%
PRINT "Year = "; Year%
PRINT "Month = "; Month%
PRINT "Day = "; Date%
PRINT "Hour = "; Hour%
PRINT "Minute = "; Minute%
PRINT "Seconds = "; Second%
END SUB
DEF FNHi% ( AnyInt% )
FNHi% = AnyInt% AND &HFF00
END DEF
DEF FNLow% ( AnyInt% )
FNLow% = AnyInt% AND &H00FF
END DEF
DEF FNShl% ( AnyInt%, Bits% )
FNShl% = AnyInt% * ( 2% ^ Bits% )
END DEF
DEF FNShr% ( AnyInt%, Bits% )
FNShr% = AnyInt% \ ( 2% ^ Bits% )
END DEF
Comments
Post a Comment