diff options
Diffstat (limited to 'contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm')
-rw-r--r-- | contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm b/contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm new file mode 100644 index 0000000..2ff30f2 --- /dev/null +++ b/contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm @@ -0,0 +1,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 + |