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