Home | History | Annotate | Download | only in gfxboot
      1 		bits 16
      2 
      3 		section .text
      4 
      5 		; must be filled in
      6 f_buf_size	dw 0
      7 f_buf_seg	dw 0
      8 
      9 
     10 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     11 gfx_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 
     23 gfx_cb_80:
     24 		mov al,0ffh
     25 gfx_cb_90:
     26 		retf
     27 
     28 
     29 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     30 ; Return status info.
     31 ;
     32 ; return:
     33 ;  edx		filename buffer (64 bytes)
     34 ;
     35 cb_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 ;
     50 cb_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
     75 cb_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 ;
     86 cb_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
     99 cb_fread_80:
    100 		xor al,al
    101 cb_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 ;
    113 cb_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 ;
    127 cb_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 ;
    147 cb_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 ;
    164 cb_mount:
    165 		mov ax,26h
    166 		int 22h
    167 		setc al
    168 		ret
    169 
    170 
    171 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    172 ;
    173 		align 2, db 0
    174 
    175 cb_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
    182 cb_len		equ ($-cb_table)/2
    183 
    184 f_handle	dw 0
    185 f_block_size	dw 0
    186 f_blocks	dw 0
    187 f_size		dd 0
    188 f_name		times 64 db 0
    189 f_name_len	equ $ - f_name
    190 
    191