Read From a DOS File
From CometWiki
Read from a DOS File
Syntax:
DOSRW(AX-value, file-handle, number-of-bytes, format-statement-label) EXCP=statement-label
Entry:
AX-value = "@3F00@"
.
file-handle = file handle established when the file was opened
.
number-of-bytes = number of characters to be read
.
format-statement-label = format statement to be used to receive incoming data from DOS file
Return:
If the read function is successful, the data variable(s) contained in the format statement will contain the data from the
DOS file, and the AX register will contain the number of bytes that were actually read in hexidecimal.
If an exception occurs, byte 2 of the AX field will contain the DOS error code (in hex).
Discussion:
The DOSRW function can be used to read data from a DOS file. The data is received into a variable or multiple variables listed in an Internet Basic format statement.
This function requires that the AX-value be set to "@3F00@". The file's handle (established when the file was opened) must also be included in this function call. Likewise, you must specify the number of bytes to be read from the DOS file and the label of the format statement that will receive the incoming data.
After the function is executed, the data variable(s) contained in the format statement will contain the data read from the DOS file (assuming there was any data in the file). Also, the AX register will contain the number of bytes that were actually read from the file. This value is in hex, so it will have to be converted to decimal to serve any meaningful purpose.
One application of this AX value is to test for the "end of file." For example, if the number of bytes actually read from a DOS file equals 0, that means that there is no more data to read (i.e., the end of file).
Example:
! S SFREAD,DSK
! O FREAD,DSK
! L T00,E
! R QMONITOR
!
!========== READ FROM A DOS FILE ==============================
!
LENGTH 2 & LOCAL AX$,BX$,CX$,DX$ ! Define registers
LOCAL FILEHANDLE$ ! Define file handle
LENGTH 64 & LOCAL FILENAME$ ! Define file name
LENGTH 4.0 & LOCAL BYTES ! Define byte counter
!
LENGTH 100 & LOCAL DATASTRING$ ! Define data string
!
LENGTH 3 & LOCAL DOSCODE$ ! Define DOS error code
LENGTH 37 & LOCAL DOSMESSAGE$ ! Define DOS message
!
1000 FORMAT DOSMESSAGE$ ! File input format
!
100 FORMAT (ET) ! Screen format
!
9999 FORMAT DATASTRING$ ! DOS file input format
!
CLEAR ! Initialize variables
PRINT (0,100) ! Set typewriter mode
!
PRINT (0) "NAME OF DOS FILE TO OPEN:" ! Display prompt
INPUT (0) FILENAME$ ! Enter file name
IF FILENAME$ = "" THEN RUN "QMONITOR" ! If null, then stop
!
AX$ = "@3D42@" ! Set AX to "OPEN FILE"
CX$ = "@0000@" ! Set CX to null
!
DOSFC(AX$,CX$,FILENAME$) EXCP=EXCEPTION ! Perform DOSFC call
!
FILEHANDLE$ = AX$ ! Store the file handle
!
READ: ! Start of read loop
AX$ = "@3F00@" ! Set AX to "READ"
!
DOSRW(AX$,FILEHANDLE$,100,9999) EXCP=EXCEPTION ! Read 100 bytes
!
BYTES = HEXDEC(AX$) ! Convert AX to decimal
IF BYTES = 0 THEN GOTO BOTTOM ! Check for end-of-file
!
PRINT (0) DATASTRING$ ! Display data from file
!
GOTO READ ! Loop back
!
EXCEPTION: ! Exception routine
PRINT (0) "DOS ERROR DURING READ" ! Display message
OPEN (1) "QERCOMET" ! Open error file
DOSCODE$ = "D" + HEXASC(SUB(AX$,2,1)) ! Construct key to file
READ (1,1000) KEY=DOSCODE$ ! Read error record
PRINT (0) "DOS error code: ";DOSCODE$ ! Display DOS error code
PRINT (0) DOSMESSAGE$ ! Display error message
INPUT (0) "" ! Hold
CLOSE (1) ! Close error file
RUN "QMONITOR" ! Exit
!
BOTTOM: AX$ = "@3E00@" ! Set AX to "CLOSE FILE"
BX$ = FILEHANDLE$ ! Set BX to file handle
CX$ = "@0000@" ! Set CX to null
DX$ = "@0000@" ! Set DX to null
DOSMS(AX$,BX$,CX$,DX$) ! Perform DOSMS call
RUN "QMONITOR" ! Exit
END
DOS function calls/pseudo calls