
[bits 16]
[org 0x7C00]

BOOTSECTOR_INFOBLOCK:
jmp BOOTINFOBLOCK_END
OSName db "HGOS "
BytesPerSec dw 512
SecPerClus db 1
RsvdSecCnt dw 1 ;Wieviele Bootsektoren?
NumFATs db 2
RootEntCnt dw 224
TotSec dw 2880
MediaType db 0F0h
FATSize dw 9
SecPerTrack dw 18
NumHeads dw 02
HiddenSec dd 0000
TotSec32 dd 0
DrvNum db 0
Reserved db 0
VolumeID dd 1
VolumeLabel db "NO NAME "
FileSysType db "FAT12 "
BOOTINFOBLOCK_END:

start:
Filename db "Kernel bin"

%include "makro.asm"

cli
mov ax, 0x9000
mov ss, ax
xor sp, sp
sti
call func_FindFileSector
or ax, ax
jz KernelNotFound
call func_ReadFATTable
mov bx, 0x1000
mov dx, [RootEntCnt]
shl dx, 5
add dx, [BytesPerSec]
dec dx
shr dx, 9
add [Temp], dx

LoadKernelFile:
mov dx, [Temp] ;Startsektor der Datensektoren in DX schreiben
add dx, ax ;Zum Startsektor der Datensektoren den Startsektor der
;Datei addieren
dec dx ;DX um 2 verringern
dec dx;Zweimal "dec dx" braucht weniger Bytes als einmal "sub dx, 2"
push bx ;Segmentadresse an die der Sektor gelesen werden soll auf
;den Stack pushen
push dx ;Sektornummer die gelesen werden soll auf den Stack
;pushen
call func_ReadSector ;Sektor lesen lassen
add sp, 4 ;2 Parameter vom Stack löschen
push ax ;FAT-Eintrag-Nummer auf den Stack pushen
call func_ReadFATEntry ;Wert des FAT-Eintrags lesen (Rückgabe in AX)
add sp, 2 ;1 Parameter vom Stack löschen
cmp ax, 0xFFF ;Ist das der letzte FAT-Eintrag der Kernel-
;Datei?
je ExecuteKernel ;Wenn Ja -> Springe zum Kernel
add bx, 32 ;Segmentadresse um 32 erhöhen. Dort wird der
;nächste Sektor hingelesen
jmp LoadKernelFile ;Springe wieder nach oben um nächsten Sektor
;der Kernel-Datei zu lesen

ExecuteKernel:
mov ax, 0x1000
push ax ;Segmentadresse an welcher der Kernel ist auf den Stack
;pushen
mov ax, 0
push ax ;Offsetadresse des Kernels (0) auf den Stack pushen
retf ;Einen FAR-Rücksprung zum Kernel machen

MsgFileNotFound db "Kernel nicht gefunden"

KernelNotFound:
push WORD MsgFileNotFound ;Offset der "File not Found" Meldung auf
;den Stack pushen
call func_PrintString ;Meldung ausgeben lassen
add sp, 2 ;1 Parameter vom Stack löschen

WaitForKeyToReboot:
mov ah, 0 ;Auf Tastendruck warten
int 0x16

Reboot:
db 0xEA ;Reboot
dw 0x0000
dw 0xFFFF

times 512-($-$$)-2 db 0
dw 055AAh
