blob: 2ff30f26c3aec84316a1e09965dce308a86347a6 [file] [log] [blame]
bits 16
section .text
; must be filled in
f_buf_size dw 0
f_buf_seg dw 0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
gfx_cb:
push cs
pop ds
cmp al,cb_len
jae gfx_cb_80
movzx bx,al
add bx,bx
call word [bx+cb_table]
jmp gfx_cb_90
gfx_cb_80:
mov al,0ffh
gfx_cb_90:
retf
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Return status info.
;
; return:
; edx filename buffer (64 bytes)
;
cb_status:
mov edx,cs
shl edx,4
add edx,f_name
xor al,al
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Open file.
;
; return:
; al 0: ok, 1: file not found
; ecx file length (al = 0)
;
cb_fopen:
mov si,f_name
push ds
pop es
mov ax,6
int 22h
xchg edx,eax
mov al,1
jc cb_fopen_90
cmp cx,[f_buf_size]
ja cb_fopen_90
or cx,cx
jz cb_fopen_90
mov [f_block_size],cx
or edx,edx
jz cb_fopen_90
mov [f_handle],si
mov [f_size],edx
mov ecx,edx
mov ax,[f_buf_size]
cwd
div word [f_block_size]
mov [f_blocks],ax
xor al,al
cb_fopen_90:
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Read next chunk.
;
; return:
; edx buffer address (linear)
; ecx data length (< 64k)
;
cb_fread:
xor ecx,ecx
mov si,[f_handle]
or si,si
jz cb_fread_80
mov cx,[f_blocks]
mov es,[f_buf_seg]
xor bx,bx
mov ax,7
int 22h
mov [f_handle],si
mov al,1
jc cb_fread_90
cb_fread_80:
xor al,al
cb_fread_90:
movzx edx,word [f_buf_seg]
shl edx,4
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Return current working directory.
;
; return:
; edx filename
;
cb_getcwd:
mov ax,1fh
int 22h
mov edx,es
shl edx,4
movzx ebx,bx
add edx,ebx
xor al,al
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Set current working directory.
;
cb_chdir:
mov bx,f_name
push ds
pop es
mov ax,25h
int 22h
xor al,al
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; read sector
;
; edx sector
;
; return:
; edx buffer (linear address)
;
; Note: does not return on error!
;
cb_readsector:
xor edi,edi
xor esi,esi
mov cx,1
mov es,[f_buf_seg]
xor bx,bx
mov ax,19h
int 22h
movzx edx,word [f_buf_seg]
shl edx,4
xor al,al
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Re-read fs structures.
;
cb_mount:
mov ax,26h
int 22h
setc al
ret
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
align 2, db 0
cb_table dw cb_status
dw cb_fopen
dw cb_fread
dw cb_getcwd
dw cb_chdir
dw cb_readsector
dw cb_mount
cb_len equ ($-cb_table)/2
f_handle dw 0
f_block_size dw 0
f_blocks dw 0
f_size dd 0
f_name times 64 db 0
f_name_len equ $ - f_name