Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 29. July 2007, 11:47
-
Ich habe folgenden Code:
mov ax, 0x1000
mov es, ax
mov bx, 0 ; Zieladresse(es:bx) 0-2400
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 18 ; Lese 36-18 Sektoren (maximum 36)
mov cx, 0x0013 ; Cylinder=1, Sector=19
xor dx, dx
int 0x13 ; ES:BX = Daten vom Laufwerk
Nach ausführung steht in AH 04h -> "sector not found/read error"
wo muss ich das Problem suchen??
(Ich lasse den codeabschnitt 10 mal durchlaufen (im fehlerfall) und jedesmal der gleiche Fehler)
-
Ich gehe davon aus, du liest von einer 1,44 MByte Floppy-Disk, stimmts? Da gibt es keinen physikalischen Sektor 19. Ich glaube das waren Null bis 17, falls ich mich nicht vertue.
2 Seiten, 80 Spuren, 18 Sektoren pro Spur = 2880 Sektore, jo stimmt ^^
Also Sektor 19 wäre dann:
Seite1, Spur0, Sektor 2 (falls ich mich nicht vertue ^^)
bitmaster
-
Null bis 17
afaik 1 - 18
Am besten im Wiki zum umwandeln nachschauen: CHS (http://lowlevel.brainsware.org/wiki/index.php/CHS) & LBA (http://lowlevel.brainsware.org/wiki/index.php/LBA)
-
Ach ja, stimmt. Ich habe zu lange kein CHS mehr gemacht. ^^ 1 - 18 natürlich. Aber Sektor 19 (logisch) ist trozdem: Seite1, Spur0 und Sektor2.
bitmaster
-
OK, wenns nur daran liegt :-D
Ich bin davon ausgegangen, dass das vom BIOS berechnet wird, da ich ja auch 36 Sektoren gleichzeitig lesen kann...
Jedenfalls danke
-
Du kannst aber nur 36 Sektoren lesen, wenn es nicht über eine Trackgrenze geht.
-
So am rande: Track == Cylinder, richtig?
Habe mich vom unteren code verabschiedet. Die unteren, freien Sektoren reserviere ich für spätere Zweckte.
Nun beginne ich beim 2. Cylinder. (Also Cylinder 1).
Dabei habe ich wider probleme:
erstmal code:
mov ax, 0x1000
mov es, ax
mov bx, 0 ; Zieladresse(es:bx)
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 36
mov cx, 0x0101
xor dx, dx
int 0x13
So, nun zum Fehler:
erstmal sei gesagt, dass ich vorher das ganze segment 0x1000 prüfe (also lesen und schreiben) - ich kann lesen und schreiben. Ich weiß dass es eigentlich nicht nötig ist.
Desweiteren wird vorher das LW resettet
Fehlerbeschreibung:
int 0x13 wird nicht mehr verlassen (hängt sich auf), die LED des Diskettenlaufwerks leuchtet.
So: nun das komische an diesem Fehler:
Wenn ich nur 1 oder 2 Sektoren aufmal lese, funktioniert alles, bei 3 oder mehr kommt es zu dem Fehler
Getestete Kombinationen (Startsector+anzahl)
1+2, 3+1, 3+2, 4+2, 6+2 OK
1+3, 3+5, 3+3, 4+3, 4+4, 6+3 Fehler
-
:oops:
sry, dass ich euch mit so einem scheiß "belestige"
manchmal sieht man den Wald vor lauter Bäumen nicht.
Das Programm liegt im Segment 1000 :-D, und der ramcheck wird nie gecalled :-D :-D