Wenn bei Fat.inc ein Fehler wär würd Nasm es ja sagen. Und da steht eigentlich nur ein ganz normaler FAT12 Header drin. Ich poste mal die Stücke bei denen das Problem liegen könnte einzeln und gib mal nen Kommentar dazu ab:
1. Hier könnte ein Problem mit den Segmenten oder dem Stack sein
[BITS 16]
[ORG 0x7C00]
;------- BIOS Parameter Block und BS FAT12 --------
jmp short start
nop
%include "G:\_UnrealOS\source\boot\FAT.inc"
;---------------------MAIN CODE--------------------
start:
; BOOTLAUFWERK SPEICHERN---------------------------
mov [DriveNumber], dl ; Von DL in Var kopieren
; SEGMENTE UPDATEN---------------------------------
mov ax, cs ; Codesegment ermitteln
mov ds, ax ; und in alle anderen Segmente schreiben
mov es, ax
mov gs, ax
mov fs, ax
; VORRÜBERGEHENDEN STACK BAUEN---------------------
mov ax, 0x7B0 ; Stack Adresse ist 0x7BFF
mov ss, ax
mov sp, 0xF0
2. Hier ist die Frage ob das ES Update nach dem ReadSectors okay ist:
; ROOTDIR NACH 0x7E00 LADEN------------------------
; Die Zieladresse steht per Default schon richtig
; Startsektor steht auch schon richtig
mov cx, [RootSize] ; Anzahl der Sektoren laden
call ReadSectors ; Laden!
; ES UPDATEN---------------------------------------
mov bx, 0x7C00
mov es, bx
3. Der Teil der die Datei sucht sollte eigentlich in Ordnung sein weil ich ihn 100x überptüft hab.
4. Die Funktionen sollten eigentlich auch funktionieren. Kritisch ist nur lsn2chs und ReadSectors:
; lsn2chs
; Rechnet die Adresse vom LSN ins CHS Format um
; Parameter:
; o AX = LSN
; Rückgabe:
; o CL = Sector
; o DH = Head
; o CH = Cylinder
lsn2chs:
xor dx, dx ; DX <- 0
mov bx, [SectorsPerTrack] ; BX <- Sektoren pro Track
div bx ; dx=(ax mod bx)+1
inc dx ; DX um eins erhöhen
push dx ; Wird der absolute Sektor sein
xor dx, dx ; DX <- 0
mov bx, [NumHeads] ; BX <- Anzahl Heads
div bx
mov ch, al ; Track
mov dh, dl ; Head
pop ax ; Sektor von Stack nach AX
mov cl, al ; Sektor in CL
ret
; ReadSectors
; Sektoren laden
; Parameter:
; o CX = # Sektoren
; o LBA = Ab welchem Sektor
ReadSectors:
mov ax, [LBA]
.1:
push cx ; CX sichern
call lsn2chs ; LSN in CHS umrechnen
.2
mov es, [LoaderSegment] ; Ziel-Segment aus Var holen
mov bx, [LoaderOffset] ; Ziel-Offset aus Variable kopieren
mov ax, 0x0201 ; Sektor Lesen-Befehl und 1 Sektor lesen
mov dl, [DriveNumber] ; Drive Number kopieren
int 0x13 ; BIOS-Befehl: Lesen
jc .2 ; Fehler? -> Nochmal!
add bx, [BytesPerSector] ; BX um Anzahl der Bytes pro Sektor erhöhen
mov [LoaderOffset], bx ; BX beeinhaltet jetzt das neue Offset
mov si, MsgDot ; Punkt malen
call putstr
mov ax, [LBA] ; Sektornummer laden, ...
inc ax ; erhöhen und ...
mov [LBA], ax ; wieder speichern
pop cx ; CX wieder vom Stack holen
loop .1 ; Nächster Sektor
mov [LoaderOffset], word 0 ; Ziel-Offset auf 0 setzen
mov dx, 0x3F2 ; Motor anhalten
mov al, 0x0C
out dx, al
ret
Ansonsten noch ein paar allgemeine Sachen:
Nachdem der Stack gebaut wurde werden ein paar Messages angezeigt die aber unwichtig sind. Dann wird das Rootdir geladen. Die ReadSectors Funktion nimmt den Startsektor aus der Variable LBA und die Zieladresse aus LoaderSegment & LoaderOffset. Alle drei Vars haben am Anfang schon den richtigen Wert für das Root Directory. Pro gelesenem Sektor wird ein Punkt gemalt. Da wie schon gesagt am Ende 14 da stehen wird das RD komplett geladen.