Autor Thema: Problem beim lesen der Disk im RM  (Gelesen 3590 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« 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)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 29. July 2007, 12:46 »
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
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 29. July 2007, 12:49 »
Null bis 17
afaik 1 - 18

Am besten im Wiki zum umwandeln nachschauen: CHS & LBA
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #3 am: 29. July 2007, 12:55 »
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
In the Future everyone will need OS-64!!!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 29. July 2007, 22:08 »
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 30. July 2007, 00:03 »
Du kannst aber nur 36 Sektoren lesen, wenn es nicht über eine Trackgrenze geht.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #6 am: 04. August 2007, 21:26 »
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
« Letzte Änderung: 04. August 2007, 21:29 von RedEagle »

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #7 am: 05. August 2007, 11:26 »
 :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

 

Einloggen