Hallo,
Ich habe (versucht), selber einen Bootloader zu schreiben, leider liest er mir jedoch den Kernel nicht ein. Ich habe mit Bochs im Debugmodus gearbeitet und konnte dabei keine Fehler finden, wobei ich dazu sagen muss, dass es auch recht kompliziert war, sonst hätte ich den Fehler ja vermutlich gefunden...
Ich vermute allerdings, dass etwas mit dem Label "readinfat" nicht stimmt, da die Sektorenberechnungen alle richtige Werte geliefert haben.
Wäre nett, wenn sich das jemand ansehen könnte, vielleicht findet ihr ja den/die Fehler.
MfG,
Argone
[...]
lenofroot: ;Länge des Root-dirs berechnen
mov ax,word [RootEntCnt]
mov cl,5
shl ax,cl
div word [BytesPerSec]
mov word [LenOfRoot],ax
xor ax,ax
posofroot: ;Berechnung der Sektoren vor den Dateien (FAT+Rootdir+Bootsektor
mov al,byte [NumFATs]
mul word [FATSize]
add ax,word [RsvdSecCnt]
mov word [PosOfRoot],ax
push ax
add ax,word [LenOfRoot]
mov word [reserved],ax
pop ax
mov bx,200h ;Lesen nach es:bx
readroot: ;Sektoren des Root-directorys lesen (14)
call lba2chs
mov ah,02h
mov al,byte [LenOfRoot]
mov dl,byte [DrvNum]
int 13h
jc readroot
mov si,bx ;Position des Root-dirs
searchroot:
mov cx,11 ;so lang sind die Dateinamen
mov di,KernelName ;und so heißt der Kernel
push si
repe cmpsb ;repeat if equal
pop si
je readinfat
add si,20h ;nächster Eintrag
jmp searchroot
readinfat:
mov si,word [si + 1ah]
mov ah,02h ;Einlesen der FAT-Tabelle nach 07c0h:200h
mov bx,200h
mov cx,2
mov al,byte [FATSize]
add bx,word [LenOfRoot]
mov dx,1
int 13h
mov ax,1000h
mov es,ax
xor bx,bx
extractfatentry:
add si,200h
mov ax,[si] ;nach ax kommt jetzt der FAT-Eintrag
parsefatentry:
test ax,1
jz evensector
mov cl,4
shr ax,cl
evensector:
and ax,0fffh
push ax
add ax,word [reserved]
call lba2chs
mov ax,0201h
mov dl,byte [DrvNum]
int 13h
add bx,200h
pop ax
cmp ax,0ff0h ;größer -> dies ist der letzte Cluster der Datei
jnb jmp2kernel
mov si,ax
jmp extractfatentry
[...]
lba2chs:
xor dx,dx
div word [SecPerTrack];in ax war die LBA-Adresse
inc dx ;der Rest der Division + 1 ist der Sektor
mov cl,dl
xor dx,dx
div word [NumHeads] ;der Rest ist der Head und der Quotient ist der Track (Zylinder)
mov dh,dl
mov ch,al
ret
PosOfRoot dw ?
LenOfRoot dw ?
reserved dw ?
KernelName db "KERNEL SYS"
P.S.: Ich hoffe der Code ist nicht zu lang...
/Edit: Falsche Version...