EttinOS/SOURCE/BOOT.ASM

177 lines
2.4 KiB
NASM

[ORG 0x7c00]
jmp short start
nop
;1.44 MB 3.5" floppy disk description table
OEMLabel db "EttinOS "
BytesPerSector dw 0x200
SectorsPerCluster db 0x1
BootRecordSectors dw 0x1
FATs db 0x2
RootEntries dw 0xe0
LogicalSectors dw 0xb40
MediaDescriptor db 0xf0
SectorsPerFAT dw 0x9
SectorsPerTrack dw 0x12
Sides dw 0x2
HiddenSectors dd 0x0
LargeSectors dd 0x0
DriveNumber dw 0x0
DriveSignature db 0x29
VolumeID dd 0x0
VolumeLabel db "EttinOS "
FileSystem db "FAT12 "
start:
;Set up the data segment
mov ax, 0x0
mov ds, ax
;Set up the stack
cli
mov ax, 0x0
mov ss, ax
mov sp, 0x7c00
sti
;Store the boot device number
mov [bootdev], dl
;Load the root FAT
;Set the source
mov ax, 0x13
call calcsource
;Set the destination
mov si, 0x7e00
mov bx, ds
mov es, bx
mov bx, si
;Set the size
mov al, 0xe
;Load
mov ah, 0x2
int 0x13
;Search the root FAT for the system
;Set DI to the root FAT
mov ax, ds
mov es, ax
mov di, 0x7e00
;Initialise the search loop
mov cx, word [RootEntries]
mov ax, 0x0
search:
;Store CX in the stack
push cx
;Check for the binary
mov si, sysfile
mov cx, 0xb
rep cmpsb
je loadsysfat
;Set DI to the next entry
add ax, 0x20
mov di, 0x7e00
add di, ax
;Load CX from the stack
pop cx
loop search
;Load the system FAT
loadsysfat:
;???
mov ax, word [es:di+0xf]
mov word [cluster], ax
;Set the source
mov ax, 0x1
call calcsource
;Set the destination
mov di, 0x7e00
mov bx, di
;Set the size
mov al, 0x9
;Load
mov ah, 0x2
int 0x13
;Load the system
loadsys:
;Set the source
mov ax, word [cluster]
add ax, 0x1f
call calcsource
;Set the destination
mov ax, 0x0
mov es, ax
mov bx, word [pointer]
;Set the size
mov al, 0x1
;Load a cluster
mov ah, 0x2
int 0x13
;Calculate the next cluster
mov ax, [cluster]
mov dx, 0x0
mov bx, 0x3
mul bx
mov bx, 2
div bx
mov si, 0x7e00
add si, ax
mov ax, word [ds:si]
or dx, dx
jz even
odd:
shr ax, 4
jmp contcluster
even:
and ax, 0xfff
contcluster:
mov word [cluster], ax
cmp ax, 0xff8
jge boot
add word [pointer], 0x200
jmp loadsys
boot:
jmp 0x0:0x9e00
sysfile:
db "SYSTEM BIN"
bootdev:
db 0
cluster:
dw 0x0
pointer:
dw 0x9e00
calcsource:
push ax
push bx
mov bx, ax
mov dx, 0x0
div word [SectorsPerTrack]
add dl, 0x1
mov cl, dl
mov ax, bx
mov dx, 0x0
div word [SectorsPerTrack]
mov dx, 0x0
div word [Sides]
mov dh, dl
mov ch, al
pop bx
pop ax
mov dl, byte [bootdev]
ret
;Padding
times 0x1fe-($-$$) db 0x0
;Boot signature
dw 0xaa55