166 lines
2.5 KiB
Plaintext
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
|