Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 29. March 2006, 16:25
-
Hi
Ich habe für mein OS eine kleine Konsole geschrieben, um den code zu testen, den ich schreibe (z.B. Treiber)
Jedenfalls lade ich jetzt beim booten nicht 32Sektoren, sondern 40.
ABER, seit dieser kleinen änderung im bootloader gibts ein Problem.
Unter Bochs läuft alles so, wie es soll, aber jetzt wollte ich es auf einem Echten PC testen, und das geht nicht.:
Das Disketttenlaufwerk (bzw der Motor) ist aktiv, da das lämpchen läuchtet, aber sonst tut sich NICHTS!!
woran liegt das?? an den 40 Sektoren, am BIOS, ...??
hier mal der Codeausschnitt:
loadkernel:
; Diskdrive reset (Interrupt 0x13,0)
push ds ; Sichere DS
mov ax, 0 ; Funktion 0 (reset)
mov dl, [bootdrv] ; Dieses Laufwerk ist gewünscht (bootlaufwerk)
int 0x13 ; Interrupt ausführen
pop ds ; DS wiederherstellen
jc loadkernel ; Geht nicht? -> Noch mal!
load1:
mov ax, 0x1000 ; ES:BX = 1000:0
mov es, ax
mov bx, 0
; Sektoren lesen (Interrupt 0x13, 2)
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 40 ; Lese 40 Sektoren (0x0000 -> 0xxxx) !!ICH HABE NUR DIE ZAHL GEÄNDERT
mov cx, 2 ; Cylinder=0, Sector=2
mov dx, 0 ; Head=0, Lauferk=0
int 0x13 ; ES:BX = Daten vom Laufwerk
jc load1 ; Fehler? -> Noch mal!
retn
Ich hoffe ihr könnt mir helfen...
-
hi, hier im forum hat mir mal jemand den tipp gegeben, dass manche Bios' nicht über track-grenzen hinweg sachen von diskette lesen können. möglicherweise kann dein bios dies, aber dafür nicht über zylinder-grenzen hinweg lesen.
probier einfach mal, das laden des kernels von diskette in zwei teile aufzuteilen. beim ersten 35 sektoren (einer weniger als ein zylinder, weil du bei sektor zwei beginnst) lesen, beim zweiten den rest (bis zu 36):
load1:
mov ax, 0x1000 ; ES:BX = 1000:0
mov es, ax
mov bx, 0
; Sektoren lesen (Interrupt 0x13, 2)
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 35 ; Lese 35 Sektoren (0x0000 -> 0xxxx)
mov cx, 2 ; Cylinder=0, Sector=2
mov dx, 0 ; Head=0, Lauferk=0
int 0x13 ; ES:BX = Daten vom Laufwerk
jc load1 ; Fehler? -> Noch mal!
load2:
add bx, 512*35 ; zieladresse um 512 bytes je sektor erhöhen
; Sektoren lesen (Interrupt 0x13, 2)
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 5 ; Lese 5 Sektoren
mov cl, 1 ; Sector=1
mov ch 1 ; Cylinder=1
mov dx, 0 ; Head=0, Lauferk=0
int 0x13 ; ES:BX = Daten vom Laufwerk
jc load2 ; Fehler? -> Noch mal!
müsste funktionieren. ansonsten probier mal, das ganze jeweils in tracks aufzuteilen. (das wären dann jeweils 18 sektoren)
-
Vielen Dank;
werd es mal ausprobieren.