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


Anmelden zum Antworten