bond/legacy/lib/fat12readfile.lib
hyperassembler 286803f026 Nop
2014-09-28 18:50:01 -04:00

166 lines
2.5 KiB
Plaintext

;FAT12ReadFile(ULONG16 Base,ULONG16 Offset,ULONG16 OffsetFileName)
FAT12ReadFile:
.START:
push bp
mov bp,sp
push bp
xor ah, ah
xor dl, dl
int 13h
mov word [wSectorNo], SectorNoOfRootDirectory
.LABEL_SEARCH_IN_ROOT_DIR_BEGIN:
cmp word [wRootDirSizeForLoop], 0
jz .LABEL_NO_LOADERBIN
dec word [wRootDirSizeForLoop]
mov ax, [ss:bp+4]
mov es, ax
mov bx, [ss:bp+6]
mov ax, [wSectorNo]
mov cl, 1
call ReadSector
mov si, [ss:bp+8]
mov di, [ss:bp+6]
cld
mov dx, 10h
.LABEL_SEARCH_FOR_LOADERBIN:
cmp dx, 0
jz .LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR
dec dx
mov cx, 11
.LABEL_CMP_FILENAME:
cmp cx, 0
jz .LABEL_FILENAME_FOUND
dec cx
lodsb
cmp al, byte [es:di]
jz .LABEL_GO_ON
jmp .LABEL_DIFFERENT
.LABEL_GO_ON:
inc di
jmp .LABEL_CMP_FILENAME
.LABEL_DIFFERENT:
and di, 0FFE0h
add di, 20h
mov si, [ss:bp+8]
jmp .LABEL_SEARCH_FOR_LOADERBIN;
.LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR:
add word [wSectorNo], 1
jmp .LABEL_SEARCH_IN_ROOT_DIR_BEGIN
.LABEL_NO_LOADERBIN:
jmp $
.LABEL_FILENAME_FOUND:
mov ax, RootDirSectors
and di, 0FFE0h
add di, 01Ah
mov cx, word [es:di]
push cx
add cx, ax
add cx, DeltaSectorNo
mov ax, [ss:bp+4]
mov es, ax
mov bx, [ss:bp+6]
mov ax, cx
.LABEL_GOON_LOADING_FILE:
mov cl, 1
call ReadSector
pop ax
push word [ss:bp+4]
call GetFATEntry
add sp,2
cmp ax, 0FFFh
jz .LABEL_FILE_LOADED
push ax
mov dx, RootDirSectors
add ax, dx
add ax, DeltaSectorNo
add bx, [BPB_BytsPerSec]
jmp .LABEL_GOON_LOADING_FILE
.LABEL_FILE_LOADED:
mov sp,[bp-2]
pop bp
ret
wRootDirSizeForLoop dw RootDirSectors
wSectorNo dw 0
bOdd db 0
ReadSector:
push bp
mov bp, sp
sub esp, 2
mov byte [bp-2], cl
push bx
mov bl, [BPB_SecPerTrk]
div bl
inc ah
mov cl, ah
mov dh, al
shr al, 1
mov ch, al
and dh, 1
pop bx
mov dl, [BS_DrvNum]
.GoOnReading:
mov ah, 2
mov al, byte [bp-2]
int 13h
jc .GoOnReading
add sp, 2
pop bp
ret
GetFATEntry:
push bp
mov bp,sp
push es
push bx
push ax
mov ax, [ss:bp+4]
sub ax, 0100h
mov es, ax
pop ax
mov byte [bOdd], 0
mov bx, 3
mul bx
mov bx, 2
div bx
cmp dx, 0
jz .LABEL_EVEN
mov byte [bOdd], 1
.LABEL_EVEN:
xor dx, dx
mov bx, [BPB_BytsPerSec]
div bx
push dx
mov bx, 0
add ax, SectorNoOfFAT1
mov cl, 2
call ReadSector
pop dx
add bx, dx
mov ax, [es:bx]
cmp byte [bOdd], 1
jnz .LABEL_EVEN_2
shr ax, 4
.LABEL_EVEN_2:
and ax, 0FFFh
.LABEL_GET_FAT_ENRY_OK:
pop bx
pop es
pop bp
ret