191 lines
2.8 KiB
NASM
191 lines
2.8 KiB
NASM
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
|
|
|