summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm')
-rw-r--r--contrib/syslinux-4.02/com32/gfxboot/realmode_callback.asm190
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
+