2020-03-16 18:24:39 +01:00
|
|
|
; Bootsector for FAT32 filesystems
|
|
|
|
org 0x0800
|
2020-03-30 22:41:32 +02:00
|
|
|
cpu 8086
|
2020-03-25 22:19:40 +01:00
|
|
|
jmp short init
|
|
|
|
nop
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-31 22:03:05 +02:00
|
|
|
%include "inc/bpb.asm"
|
2020-03-30 17:07:09 +02:00
|
|
|
|
2020-03-31 22:03:05 +02:00
|
|
|
bpb: equ 0x080B
|
2020-03-16 18:24:39 +01:00
|
|
|
|
|
|
|
; Area for BPB
|
2020-03-31 22:03:05 +02:00
|
|
|
times ( 0x5A - ($-$$) ) db 0
|
2020-03-16 18:24:39 +01:00
|
|
|
|
|
|
|
init: xor ax, ax
|
|
|
|
mov ss, ax
|
|
|
|
mov sp, 0x7C00
|
|
|
|
|
2020-03-30 22:41:32 +02:00
|
|
|
; save potential partition table entry
|
|
|
|
push ds
|
|
|
|
push si
|
|
|
|
|
|
|
|
mov ds, ax
|
|
|
|
mov es, ax
|
|
|
|
|
|
|
|
mov si, 0x7C00
|
2020-03-16 18:24:39 +01:00
|
|
|
mov di, 0x0800
|
|
|
|
mov cx, 0x0100
|
|
|
|
rep movsw
|
|
|
|
jmp 0x0:main
|
|
|
|
|
2020-04-03 19:38:33 +02:00
|
|
|
%include "inc/booterr.asm"
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-30 17:07:09 +02:00
|
|
|
; offsets relative to FS
|
2020-03-30 20:50:17 +02:00
|
|
|
readd: ; add offset of cluster data area to DX:AX
|
2020-03-30 17:07:09 +02:00
|
|
|
push cx
|
2020-03-31 22:03:05 +02:00
|
|
|
mov di, [bp+bpb_rde]
|
2020-03-30 17:07:09 +02:00
|
|
|
mov cl, 4
|
|
|
|
shr di, cl ; 32 bytes per entry
|
|
|
|
add ax, di
|
|
|
|
adc dx, 0
|
|
|
|
pop cx
|
2020-03-30 20:50:17 +02:00
|
|
|
readr: ; add offset to rootdir to DX:AX (FAT12/FAT16 only)
|
2020-03-16 18:24:39 +01:00
|
|
|
push cx
|
2020-03-30 17:07:09 +02:00
|
|
|
xor ch, ch
|
2020-03-31 22:03:05 +02:00
|
|
|
mov cl, byte [bp+bpb_fn]
|
|
|
|
fatlp: add ax, [bp+bpb7_lsf]
|
|
|
|
adc dx, [bp+bpb7_lsf+2]
|
2020-03-30 17:07:09 +02:00
|
|
|
loop fatlp
|
|
|
|
pop cx
|
2020-03-30 20:50:17 +02:00
|
|
|
readf: ; add offset to FAT table to DX:AX
|
2020-03-31 22:03:05 +02:00
|
|
|
add ax, word [bp+bpb_rsc]
|
2020-03-30 17:07:09 +02:00
|
|
|
adc dx, 0
|
|
|
|
readp: ; read sector DX:AX from partition
|
2020-03-31 22:03:05 +02:00
|
|
|
add ax, word [bp+bpb_po]
|
|
|
|
adc dx, word [bp+bpb_po+2]
|
2020-04-03 19:38:33 +02:00
|
|
|
jc dskerr
|
2020-04-04 16:29:33 +02:00
|
|
|
jmp [bp-2]
|
|
|
|
|
|
|
|
rchs: ; read sector DX:AX from disk
|
|
|
|
; uses basic CHS disk IO
|
|
|
|
; this cant reliable read over track boundaries
|
|
|
|
; so we read each single sector in loop over CX
|
|
|
|
chslp: push ax
|
|
|
|
push cx
|
|
|
|
push dx
|
|
|
|
push bx
|
|
|
|
|
|
|
|
; calculate CHS data
|
|
|
|
div word [bp+bpb_spt] ; ax:temp = (lba / spt)
|
|
|
|
inc dx ; dx:sector = (lba % spt) + 1
|
|
|
|
mov cl, dl ; sector number
|
|
|
|
xor dx, dx
|
|
|
|
div word [bp+bpb_nos] ; ax:cylinder = (tmp / heads)
|
|
|
|
; dx:head = (tmp % heads)
|
|
|
|
mov ch, al ; cylinder number
|
|
|
|
mov dh, dl ; head number
|
|
|
|
mov dl, [bp+bpb7_dn] ; drive number
|
|
|
|
|
|
|
|
; set up read buffer
|
|
|
|
mov es, bx
|
|
|
|
xor bx, bx
|
|
|
|
|
|
|
|
; call bios
|
|
|
|
mov ax, 0x0201
|
|
|
|
int 0x13
|
|
|
|
jc dskerr
|
|
|
|
|
|
|
|
pop bx
|
|
|
|
pop dx
|
|
|
|
pop cx
|
|
|
|
pop ax
|
|
|
|
|
|
|
|
; increment sector num + write offset
|
|
|
|
add ax, 1
|
|
|
|
adc dx, 0
|
|
|
|
add bx, 0x20
|
|
|
|
; loop on CX
|
|
|
|
loop chslp
|
|
|
|
ret
|
|
|
|
|
|
|
|
rebios: ; read sector DX:AX from disk
|
|
|
|
; this uses the EBIOS extensions
|
2020-03-30 17:07:09 +02:00
|
|
|
; qword sector number DX:AX
|
|
|
|
push cs
|
|
|
|
push cs
|
|
|
|
push dx
|
2020-03-16 18:24:39 +01:00
|
|
|
push ax
|
2020-03-30 17:07:09 +02:00
|
|
|
|
|
|
|
; dword target buffer: BX:0
|
|
|
|
push bx
|
|
|
|
push cs
|
|
|
|
|
|
|
|
; word sector number
|
|
|
|
push cx
|
|
|
|
|
|
|
|
; size & passing
|
2020-03-31 22:03:05 +02:00
|
|
|
mov di, 0x10
|
|
|
|
push di
|
2020-03-30 17:07:09 +02:00
|
|
|
|
|
|
|
mov si, sp
|
2020-03-16 18:24:39 +01:00
|
|
|
mov ah, 0x42
|
2020-03-31 22:03:05 +02:00
|
|
|
mov dl, [bp+bpb7_dn]
|
2020-03-30 17:07:09 +02:00
|
|
|
stc
|
2020-03-16 18:24:39 +01:00
|
|
|
int 0x13
|
2020-03-30 20:50:17 +02:00
|
|
|
jc dskerr
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-31 22:03:05 +02:00
|
|
|
add sp, di
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-30 17:07:09 +02:00
|
|
|
ret
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-04-03 19:38:33 +02:00
|
|
|
; error handling for disk errors
|
|
|
|
dskerr: call errcll
|
|
|
|
|
2020-03-30 20:50:17 +02:00
|
|
|
next: ; Advances DX:AX to next FAT entry
|
|
|
|
push ax
|
|
|
|
push bx
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-25 22:19:40 +01:00
|
|
|
; shift 2 left for dword-sized FAT entries
|
|
|
|
; shift 9 right for sector size
|
2020-03-16 18:24:39 +01:00
|
|
|
mov cl, 7
|
|
|
|
shftl: clc
|
|
|
|
rcr dx, 1
|
|
|
|
rcr ax, 1
|
|
|
|
loop shftl
|
|
|
|
|
2020-03-30 17:07:09 +02:00
|
|
|
mov bx, 0xA0
|
2020-03-16 18:24:39 +01:00
|
|
|
mov cx, 1
|
2020-03-30 20:50:17 +02:00
|
|
|
call readf
|
|
|
|
|
|
|
|
pop bx
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-30 20:50:17 +02:00
|
|
|
; get lower part of cluster number
|
|
|
|
pop si
|
2020-03-25 22:19:40 +01:00
|
|
|
; multiply with 4
|
2020-03-16 18:24:39 +01:00
|
|
|
sal si, 1
|
|
|
|
sal si, 1
|
2020-03-25 22:19:40 +01:00
|
|
|
; make sure its within sector range
|
2020-03-16 18:24:39 +01:00
|
|
|
and si, 0x1FF
|
|
|
|
add si, buf
|
2020-03-30 20:50:17 +02:00
|
|
|
; load dword from FAT
|
|
|
|
lodsw
|
|
|
|
mov dx, [si]
|
2020-03-16 18:24:39 +01:00
|
|
|
|
|
|
|
ret
|
|
|
|
|
2020-03-25 22:19:40 +01:00
|
|
|
; reads current cluster into [dest]
|
|
|
|
readc: ; load cluster number
|
2020-03-30 20:50:17 +02:00
|
|
|
push ax
|
|
|
|
push dx
|
2020-03-25 22:19:40 +01:00
|
|
|
|
|
|
|
; subtract the two dummy entries from FAT start
|
|
|
|
sub ax, 2
|
|
|
|
sbb dx, 0
|
|
|
|
|
|
|
|
; convert cluster number to sector number
|
|
|
|
; this is some cheapo multiplication with 2^n
|
2020-03-31 22:03:05 +02:00
|
|
|
mov cl, [bp+bpb_sc]
|
2020-03-25 22:19:40 +01:00
|
|
|
l02: shr cl, 1
|
|
|
|
jz l02e
|
|
|
|
clc
|
|
|
|
rcl ax, 1
|
2020-03-30 20:50:17 +02:00
|
|
|
rcl dx, 1
|
2020-03-25 22:19:40 +01:00
|
|
|
jmp l02
|
|
|
|
l02e:
|
|
|
|
; dx:ax is now sector num in data area
|
2020-03-31 22:03:05 +02:00
|
|
|
mov cx, [bp+bpb_sc]
|
2020-03-25 22:19:40 +01:00
|
|
|
xor ch, ch
|
|
|
|
|
2020-03-30 20:50:17 +02:00
|
|
|
call readd
|
2020-03-25 22:19:40 +01:00
|
|
|
|
2020-03-31 22:03:05 +02:00
|
|
|
xchg di, cx
|
2020-03-28 18:36:52 +01:00
|
|
|
mov cl, 5
|
2020-03-31 22:03:05 +02:00
|
|
|
sal di, cl
|
|
|
|
add bx, di
|
2020-03-30 20:50:17 +02:00
|
|
|
|
|
|
|
pop dx
|
|
|
|
pop ax
|
2020-03-28 18:36:52 +01:00
|
|
|
|
2020-03-25 22:19:40 +01:00
|
|
|
ret
|
|
|
|
|
2020-04-04 18:03:02 +02:00
|
|
|
; Load root directory
|
2020-04-04 16:29:33 +02:00
|
|
|
loadr: mov ax, 2
|
|
|
|
xor dx, dx
|
|
|
|
jmp load
|
|
|
|
|
2020-04-04 18:03:02 +02:00
|
|
|
; Load file identified by fsattr
|
|
|
|
; Directory data is expected at 0x07C00
|
|
|
|
loadf: mov si, (0x7C00-0x20)
|
|
|
|
sloop: add si, 0x20
|
2020-03-30 20:50:17 +02:00
|
|
|
; check if entry is valid
|
|
|
|
mov al, [si]
|
|
|
|
; unallocated direntry
|
|
|
|
test al, al
|
2020-04-03 19:38:33 +02:00
|
|
|
jz fserr
|
2020-03-30 20:50:17 +02:00
|
|
|
; deleted files
|
|
|
|
cmp al, 0xE2
|
2020-04-04 18:03:02 +02:00
|
|
|
je sloop
|
2020-03-30 20:50:17 +02:00
|
|
|
; check attr
|
|
|
|
mov al, [si+11]
|
|
|
|
and al, 0x5C
|
|
|
|
cmp al, ah
|
2020-04-04 18:03:02 +02:00
|
|
|
jne sloop
|
|
|
|
mov ax, [si+0x1A]
|
|
|
|
mov dx, [si+0x14]
|
|
|
|
|
|
|
|
; Load cluster chain DX:AX to 0x07C00
|
|
|
|
load: mov bx, 0x07C0
|
|
|
|
lloop: call readc
|
|
|
|
call next
|
|
|
|
cmp word dx, 0x0FFF
|
|
|
|
jne lloop
|
2020-03-30 20:50:17 +02:00
|
|
|
ret
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-03-31 22:03:05 +02:00
|
|
|
main: mov bp, bpb
|
|
|
|
mov [bp+bpb7_dn], dl
|
2020-04-04 16:29:33 +02:00
|
|
|
|
|
|
|
; check if EBIOS is supported
|
|
|
|
mov bx, 0x55AA
|
|
|
|
mov ah, 0x41
|
|
|
|
stc
|
|
|
|
int 0x13
|
|
|
|
; default: use CHS read
|
|
|
|
mov ax, rchs
|
|
|
|
jc noebio
|
|
|
|
; if EBIOS: use LBA read
|
|
|
|
mov ax, rebios
|
|
|
|
noebio: lea di, [bp-2]
|
|
|
|
stosw
|
|
|
|
|
2020-03-30 22:41:32 +02:00
|
|
|
; load root directory
|
2020-03-30 21:43:07 +02:00
|
|
|
call loadr
|
|
|
|
; search for first system directory
|
|
|
|
mov ah, 0x14
|
|
|
|
call loadf
|
|
|
|
; search for first system file
|
2020-03-30 20:50:17 +02:00
|
|
|
mov ah, 0x04
|
2020-03-30 21:43:07 +02:00
|
|
|
call loadf
|
2020-03-30 22:41:32 +02:00
|
|
|
|
|
|
|
; restore drive number
|
2020-03-31 22:03:05 +02:00
|
|
|
mov dl, [bp+bpb7_dn]
|
2020-03-30 22:41:32 +02:00
|
|
|
|
|
|
|
; restore potential partition table
|
|
|
|
pop si
|
|
|
|
pop ds
|
|
|
|
|
2020-04-04 16:29:33 +02:00
|
|
|
jmp 0x7C00
|
2020-03-16 18:24:39 +01:00
|
|
|
|
2020-04-03 19:38:33 +02:00
|
|
|
; error handling for file not found
|
|
|
|
fserr: call errcll
|
2020-03-28 18:36:52 +01:00
|
|
|
|
2020-03-16 18:24:39 +01:00
|
|
|
; Padding and signature
|
|
|
|
times (0x1FE - ($-$$)) db 0
|
|
|
|
dw 0xAA55
|
|
|
|
buf:
|