;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