1 bits 16 2 3 section .text 4 5 ; must be filled in 6f_buf_size dw 0 7f_buf_seg dw 0 8 9 10; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11gfx_cb: 12 push cs 13 pop ds 14 15 cmp al,cb_len 16 jae gfx_cb_80 17 18 movzx bx,al 19 add bx,bx 20 call word [bx+cb_table] 21 jmp gfx_cb_90 22 23gfx_cb_80: 24 mov al,0ffh 25gfx_cb_90: 26 retf 27 28 29; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30; Return status info. 31; 32; return: 33; edx filename buffer (64 bytes) 34; 35cb_status: 36 mov edx,cs 37 shl edx,4 38 add edx,f_name 39 xor al,al 40 ret 41 42 43; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 44; Open file. 45; 46; return: 47; al 0: ok, 1: file not found 48; ecx file length (al = 0) 49; 50cb_fopen: 51 mov si,f_name 52 push ds 53 pop es 54 mov ax,6 55 int 22h 56 xchg edx,eax 57 mov al,1 58 jc cb_fopen_90 59 cmp cx,[f_buf_size] 60 ja cb_fopen_90 61 or cx,cx 62 jz cb_fopen_90 63 mov [f_block_size],cx 64 or edx,edx 65 jz cb_fopen_90 66 mov [f_handle],si 67 mov [f_size],edx 68 mov ecx,edx 69 mov ax,[f_buf_size] 70 cwd 71 div word [f_block_size] 72 mov [f_blocks],ax 73 74 xor al,al 75cb_fopen_90: 76 ret 77 78 79; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 80; Read next chunk. 81; 82; return: 83; edx buffer address (linear) 84; ecx data length (< 64k) 85; 86cb_fread: 87 xor ecx,ecx 88 mov si,[f_handle] 89 or si,si 90 jz cb_fread_80 91 mov cx,[f_blocks] 92 mov es,[f_buf_seg] 93 xor bx,bx 94 mov ax,7 95 int 22h 96 mov [f_handle],si 97 mov al,1 98 jc cb_fread_90 99cb_fread_80: 100 xor al,al 101cb_fread_90: 102 movzx edx,word [f_buf_seg] 103 shl edx,4 104 ret 105 106 107; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 108; Return current working directory. 109; 110; return: 111; edx filename 112; 113cb_getcwd: 114 mov ax,1fh 115 int 22h 116 mov edx,es 117 shl edx,4 118 movzx ebx,bx 119 add edx,ebx 120 xor al,al 121 ret 122 123 124; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 125; Set current working directory. 126; 127cb_chdir: 128 mov bx,f_name 129 push ds 130 pop es 131 mov ax,25h 132 int 22h 133 xor al,al 134 ret 135 136 137; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 138; read sector 139; 140; edx sector 141; 142; return: 143; edx buffer (linear address) 144; 145; Note: does not return on error! 146; 147cb_readsector: 148 xor edi,edi 149 xor esi,esi 150 mov cx,1 151 mov es,[f_buf_seg] 152 xor bx,bx 153 mov ax,19h 154 int 22h 155 movzx edx,word [f_buf_seg] 156 shl edx,4 157 xor al,al 158 ret 159 160 161; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 162; Re-read fs structures. 163; 164cb_mount: 165 mov ax,26h 166 int 22h 167 setc al 168 ret 169 170 171; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 172; 173 align 2, db 0 174 175cb_table dw cb_status 176 dw cb_fopen 177 dw cb_fread 178 dw cb_getcwd 179 dw cb_chdir 180 dw cb_readsector 181 dw cb_mount 182cb_len equ ($-cb_table)/2 183 184f_handle dw 0 185f_block_size dw 0 186f_blocks dw 0 187f_size dd 0 188f_name times 64 db 0 189f_name_len equ $ - f_name 190 191