Also ich verwende eine Floppy Laufwerk mit FAT12 Dateisystem ... Der Bootloader lädt die Datein Kernel.bin und System.bin, anschließend springt er zur System Datei ... hier werden Vesa,A20,GDT,... initialisiert und dann in den PM geschalten ... der Kernel ist an die Adresse 0x10000 geladen .. dorthin springt er wenn in PM geschalten wurde ... wie gesagt wenn die datei kleiner als 64K ist funznt alles (CD,FD,Paging,Multitasking...)
Hier der Boot-Code
;##########################################################
;########### Bootloader starten ###########
;##########################################################
jmp short start
nop
;##########################################################
;########### FAT Tabelle holen ###########
;##########################################################
%include "FAT.inc"
;##########################################################
;########### ------------------ ###########
;##########################################################
start:
jmp 0x7C0:write_cs
;##########################################################
;########### ------------------ ###########
;##########################################################
write_cs:
mov ax,cs
mov ds,ax
mov es,ax
mov gs,ax
mov fs,ax
mov ax,0xAC0
mov ss,ax
mov sp,0x200 ; stack linear addr 0x7BFF
;##########################################################
;########### Lade-Nachricht ausgeben ###########
;##########################################################
mov si, Loading
call PrintMsg
;##########################################################
;########### Rootverzeichnis festlegen ###########
;##########################################################
mov cx,[Root_Groesse] ; Größe des Rootverzeichnisses
call Sektor_Lesen ; Rootverzeichnis laden
;##########################################################
;######### 1 Prozess ( System.sys ) Laden ########
;##########################################################
mov si,KernelName
mov [DateiSegment] , word 0xFFF
mov [DateiOffset] , word 0x10
call Lade_Sektor ; Lade_Sektor funktion ausführen
;##########################################################
;######### 2 Prozess ( Kernel.sys ) Laden ########
;##########################################################
mov si,SystemName
mov [DateiSegment] , word 0x240
mov [DateiOffset] , word 0x0
call Lade_Sektor ; Lade_Sektor funktion ausführen
jmp 0x240:0x0
hlt
;##########################################################
;########### Sektor Laden ###########
;########### ###########
;########### - Suchen auf A:\ ###########
;########### - Gefundenen Eintrag laden ###########
;##########################################################
Lade_Sektor:
mov bx,0x7C0 ; Segment auf 0x7C0 festlegen ( 0x7C0:0x000 )
mov es,bx ; ES das Segment zuweisen
mov cx , word [MaxRootEntries]
mov di , 0x200
.1:
pusha
mov cx , 0x000B ; CX = 11 weil Fat-Eintrag aus 11 Zeichen besteht
rep cmpsb
popa
je Gefunden ; Wenn Datei gefunden zu Gefunden hüpfen
add di , 32
loop .1
jmp Error
ret
Gefunden:
mov ax , [di+26]
call FAT_2_LBA ; FAT Adresse (DI) in LBA konvertieren
mov [Datei_Start] , ax ; AX (LBA-Adresse) in Datei_Start kopieren
mov ax , [di+28]
call Bytes_2_Sektors ; Berechnen wieviel Sektoren die Bytes in AX entsprechen
mov cx , ax
mov ax , [Datei_Start]
mov [LBA] , ax
;mov si, Datei_Start
;call PrintMsg
call Sektor_Lesen
ret
;##########################################################
;########### Bytes auf Sektoren ###########
;########### aufteilen ###########
;##########################################################
Bytes_2_Sektors:
xor dx,dx ; DX = 0
div word [BytesPerSector]
cmp dx , 0 ; DX mit 0 vergleichen
jz .1 ; Wenn DX = 0 springe zu .1
inc ax
.1
ret
;##########################################################
;########### Wenn Fehler auftritt ###########
;########### alles Ordnungsgemäß beenden ###########
;##########################################################
Error:
mov si , ErrorMsg ; Error Nachricht in SI kopieren
call PrintMsg ; Text ausgeben
xor ax , ax
int 0x16 ; Warte auf Tastendruck (int 16h)
mov ax , 0x64 ; HEX-Wert 0x64 in AX schreiben
out 0x64 , ax ; Computer neu starten
cli
hlt ; Alles anhalten
;##########################################################
;########### Ausgabe von Texten ###########
;##########################################################
PrintMsg:
mov ah , 0x0E
mov bh , 0
mov bl , 15
.1
lodsb
cmp al , 0
je .2
int 0x10
jmp .1
.2
ret
;##########################################################
;########### Sektoren einlesen ###########
;##########################################################
Sektor_Lesen:
mov ax , [LBA]
.1:
push cx ; CX in Stack sichern
call LBA_2_CHS
.2
mov es , [DateiSegment] ; Datei Segment in ES kopieren
mov bx , [DateiOffset] ; Datei Offset in BX kopieren
mov ax , 0x0201 ; AH = 02-Sektor laden | AL = 01-Sektor1
mov dl , [DriveNumber] ; Laufwerknummer ( 00 für A: )
int 0x13 ; Lesen des Sektors
jc .2
add bx , [BytesPerSector] ; BX = BX + 0x200 ( 1 Sektor - 512 Bytes )
mov [DateiOffset] , bx ; Dateioffset ist BX ( Um 512 Bytes größer )
mov si , Ladezeichen ; Punkt für Laden zeichnen
call PrintMsg ; Ausgeben des Punktes
mov ax , [LBA] ; AX = LBA
inc ax ; AX = AX + 1
mov [LBA] , ax ; LBA = AX ( LBA = LBA + 1 )
pop cx ; CX aus Stack wieder auslesen
loop .1 ; CX gibt an wie oft wiederholt wird
mov [DateiOffset] , word 0 ; Wenn fertig, Dateioffset auf 0 setzen
mov dx , 0x3F2 ; Floppy stoppen
mov al , 0x0C
out dx , al
ret
;##########################################################
;########### LBA in CHS umwandeln ###########
;########### LBA auf Tracks,Heads,. aufteilen ###########
;##########################################################
LBA_2_CHS:
xor dx , dx ; DX = 0
mov bx , [SectorsPerTrack] ; BX = 0x0012 ( 18 Sektoren )
div bx
inc dx ; DX = DX + 1
push dx ; DX im Stack zwischenspeichern
xor dx , dx ; DX = 0
mov bx , [NumHeads] ; BX = 0x0002 ( 2 Tracks )
div bx
mov ch , al ; CH = Track
mov dh , dl ; DH = Head
pop ax
mov cl , al ; CL = Sektor
ret
;##########################################################
;########### FAT in LBA umwandeln ###########
;########### alles Ordnungsgemäß beenden ###########
;##########################################################
FAT_2_LBA:
sub ax,0x2 ; AX = AX - 0x2
add ax,[Data_Start] ; AX = AX + 33
ret
;##########################################################
;########### Variablen deklarieren ###########
;##########################################################
Root_Groesse dw 14
Root_Start dw 19
Data_Start dw 33
LBA dw 19
DateiSegment dw 0x7E0
DateiOffset dw 0x0
Datei_Start dw 0
SystemName db "SYSTEM BIN"
KernelName db "KERNEL BIN"
Loading db 13,10,"OS wird geladen ",0
ErrorMsg db 13,10,"Datei nicht gefunden!",0
Ladezeichen db '²',0
;##########################################################
;########### Datei mit 0er ausfüllen ###########
;##########################################################
times 510-($-$$) db 0 ; Mit 0er ausfüllen
sign dw 0xAA55 ; Bootsignatur