So I was about to start adding some very basic "simulation" support for files into my emulator, and I'd lost track of the API details as they were listed on Facebook. Facebook isn't a great place to have technical discussions as you can't search later to find the stuff you need!
Fortunately I had it saved off, so before I (and everyone else) loses it, I thought I'd put it up here. I'll do a little ASM lib with all this later.
I'll also extend this if/when I discover more commands, as there appears to be very little info about the esxDOS API
;
; NOTE: File paths use the slash character (‘/’) as directory separator (UNIX style)
;
M_GETSETDRV equ $89
F_OPEN equ $9a
F_CLOSE equ $9b
F_READ equ $9d
F_WRITE equ $9e
F_SEEK equ $9f
F_GET_DIR equ $a8
F_SET_DIR equ $a9
FA_READ equ $01
FA_APPEND equ $06
FA_OVERWRITE equ $0C
; Function: Detect if unit is ready
; Out: A = default drive (required for all file access)
; Carry flag will be set if error.
GetSetDrive:
xor a ; A=0, get the default drive
rst $08
db M_GETSETDRV
ld (DefaultDrive),a
ret
DefaultDrive db 0
; Function: Open file
; In: IX = filename
; B = open mode
; A = Drive
; Out: A = file handle
; On error: Carry set
; A = 5 File not found
; A = 7 Name error - not 8.3?
; A = 11 Drive not found
;
fOpen:
ld a, (DefaultDrive) ; get drive we're on
ld b, FA_READ ; b = open mode
ld ix,FileName ; ix = Pointer to file name (ASCIIZ)
rst $08
db F_OPEN ; open read mode
ret ; Returns a file handler in 'A' register.
; Function: Read bytes from a file
; In: A = file handle
; ix = address to load into
; bc = number of bytes to read
; Out: Carry flag is set if read fails.
fRead:
ld ix, 16384 ; ix = address where to store what is read
ld bc, 6912 ; bc = bytes to read
ld a, filehandle ; a = the file handler
rst $08
db F_READ ; read file
ret
; Function: Write bytes to a file
; In: A = file handle
; ix = address to save from
; bc = number of bytes to write
; Out: Carry flag is set if write fails.
fWrite:
ld ix, 16384 ; ix = memory address to save from
ld bc, 6912 ; bc = bytes to write
ld a, handle ; a = file handler
rst $08
db F_WRITE ; write file
ret
; Function: Write bytes to a file
; In: A = file handle
; Out: Carry flag active if error when closing
fClose:
ld a, handle ; a = file handler
rst $08
db F_CLOSE
ret
; Function: Seek into file
; In: A = file handle
; L = mode: 0 - from start of file
; 1 - forward from current position
; 2 - back from current position
; BCDE = bytes to seek
; Out: BCDE = Current file pointer. (*does not return this yet)
;
fSeek:
ld a,handle ; file handle
or a ; is it zero?
ret z ; if so return
ld l,0
ld bc,0
ld de,0
rst $08
db F_SEEK
ret
; Function: SetDirectory
; In: A = Drive
; HL = pointer to zero terminated path string ("path",0)
; Out: carry set if error
;
SetDir:
ld a,(DefaultDrive) ; drive to change directory on
ld hl,Path ; point to "path",0 to set
rst $08
db F_SET_DIR
ret
; Function: Get Directory
; In: A = Drive
; HL = pointer to where to STORE zero terminated path string
; Out: carry set if error
;
GetDir:
ld a,(DefaultDrive) ; drive to get current directory from
ld hl,Path ; location to store path string in
rst $08
db F_GET_DIR
ret