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