Lustiges Problem mit BIOS interrupts
-
Ich benutze in meinem Bootsec Interrupt 0x13 um ein paar Daten von Diskette ins ram zu lesen. Alles kein Problem. Jetzt hab ich mir schlau gedacht, dass ich gleich mal die FAT16 von Diskette ins Ram lese. Das haut aber nich so hin. Immer wenn ich n paar Sektoren mehr lese (so 10), dann liest er von dikette und liest immer weiter´und liest und liest und nix passiert mehr. Ich hab auch aufgepasst, dass nix wichtiges im ram überschrieben wird, aber irgendwie will es nich. Genauso sieht es aus wenn ich ein zweites mal von diskette ins ram lesen will.
-
Nette Story.
Wenn du eine Erklärung für das Problem gewollt hättest, hättest du Code gepostet, oder?
-
bios_reset_drive: mov ah, 0 ; reset drive function int 0x13 ; call bios disk i/o ret ; ******************************************************************** bios_read_sectors: ; input : es:bx = address of destination ; al = sector count ; cl = sector start number mov ah, 0x02 ; read sectors function mov ch, 0 ; cylinder 0 mov dl, [bootdrv] ; drive number mov dh, 0 ; head number int 0x13 ; call bios disk i/o jc bios_read_sectors ret ;Soweit alles klar oder? call bios_reset_drive jnc reset_ok call reboot reset_ok: mov ax, 0x800 mov es, ax mov bx, 0 ; kernel image destination mov al, 1 ; read 1 sector mov cl, 2 ; starting at sector 2 call bios_read_sectors ;so und nochmal call bios_reset_drive mov ax, 0x800 mov es, ax mov bx, 0 ; kernel image destination mov al, 1 ; read 1 sector mov cl, 3 ; starting at sector 3 call bios_read_sectors
so in der art siehts aus
-
OK und ab wo genau funktioniert es nicht mehr? Wenn du cl auf 10 setzt?
-
ne cl kann ich setzen auf was ich will. AL darf nich höher als 10d sein. Außerdem funzt der code den ich hier gepostet hab auch nicht. sobald ich das zweite mal read sector aufrufe, wars das schon.
-
Hast du mal daran gedacht, dass es daran liegen könnte, dass das Carry-Flag nach der Beendigung des Interrupts aufgrund irgendeines Fehlers gesetzt ist, und du in die Endlosschleife fällst? Bring mal den Fehlercode in Erfahrung ...
-
In dem Bootsektorcode, den du nun wirklich verwendest, steht aber hoffentlich ein vernuenftiger Entrypoint und eine Stackinitialisierung, oder?
Ansonsten wuerde ich auch auf Endlosschleife aufgrund von Fehler beim Lesen tippen (Vielleicht fehlerhafter Datentraeger)
-
Ja beim Bootsec ist das alles i.o. Hab ich hier nur rausgelassen, damits einfacher wird