1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
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
|