Autor Thema: schreiben auf floppy mit fdc und dma. finde den fehler nicht  (Gelesen 5017 mal)

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
ich hab mit einigem abwandlungen eine zweite funktion daraus gebastelt, die sektoren schreiben soll. beim ersten test hat diese auch funktioniert, jetzt funktioniert sie nicht mehr. dabei hab ich auch hier einen seek- sowie calibrate-befehl drin. vielleicht entdeckt ja einer von euch den fehler:


  _writesec:
  push ebp
  mov ebp, esp
    push ecx
    push edx
    push ebx
    mov cl, [ebp+0x8]         ; cylinder
    mov ch, [ebp+0xc]         ; head
    mov ah, [ebp+0x10]        ; sector
    mov ebx, [ebp+0x14]       ; speicheradresse

    mov al, 0x14
    out 0x08, al               ; dma deaktivieren
    mov al, 0x5A
    out 0x0b, al               ; einzel, adressinc, kein autoinit, lesen, kanal2
    out 0x0c, al               ; flip-flop leeren
    mov al, bl
    out 0x04, al               ; niederwertiges adressbyte schicken
    shr ebx, 8
    mov al, bl
    out 0x04, al               ; höherwertiges adressbyte schicken
    shr ebx, 8
    mov al, bl
    out 0x81, al               ; page-byte senden
    out 0x0c, al               ; flip-flop leeren
    mov al, 0xFF
    out 0x05, al               ; wie viele zugriffe (bytes)(niederwertiges byte)  (gesamtzugriffe-1=angegebene zahl)
    mov al, 0x1
    out 0x05, al               ; wie viele zugriffe (bytes)(höherwertiges byte)
    mov al, 0x02
    out 0x0A, al               ; mögliche maskierung aufheben
    mov al, 0x10
    out 0x08, al               ; dma wieder aktivieren

    mov     al, 0x1c
    mov     dx, 0x03f2
    out     dx ,al           ; diskettenlaufwerks-motor einschalten (laufwerk A, über dma, ...)

    mov al,7
    call writediskdata
    mov al,0
    call writediskdata       ; neu kalibrieren
    push dword 200
    call _delay
    add esp, 0x4

    mov al,3
    call writediskdata
    mov al,0x0F
    call writediskdata
    mov al,2
    call writediskdata       ; laufwerkdaten festlegen

    mov al,0Fh               ;Seek (positionier) Kommando
    call writediskdata
    mov al, ch
    shl al, 2                ; head
    call writediskdata
    mov al,cl                ;Spur
    call writediskdata
    push dword 200
    call _delay
    add esp, 0x4

    mov al, 0x45             ; erstes byte des write-befehls
    call writediskdata
    mov al, ch
    shl al, 2                ; head
    call writediskdata
    mov al, cl               ; cylinder
    call writediskdata
    mov al, ch               ; head
    call writediskdata
    mov al, ah                ; sector
    call writediskdata
    mov al, 2                ; sectorsize (128*2^2)
    call writediskdata
    mov al, 18               ; secpertrack
    call writediskdata
    mov al, 27               ; länge von GAP3 (??)
    call writediskdata
    mov al, 0x00             ; bytes to read (standardwert, da sectorsize!=0) (??)
    call writediskdata

    push dword 1000
    call _delay
    add esp, 0x4

    mov     al, 00h
    mov     dx, 0x03f2
    out     dx,al           ; motor wieder aus
    pop ebx
    pop edx
    pop ecx
  mov esp, ebp
  pop ebp
  ret


der befehl sollte wie man sehen kann, einfach einen sektor von einer bestimmten speicheradresse auf diskette schreiben. aber hinterher ist der sektor auf der diskette unverändert.

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 11. April 2006, 18:18 »
es ist doch, wie es immer ist: man sucht tagelang und findet nichts. und kurz nach dem posten findet man dann den fehler. der ist in meinem fall, dass ich nicht bedacht habe, dass die funktion _delay, die ja in c geschrieben ist, EAX verändert und ich den sektor am anfang in ah reinschreibe.  jetzt hab ichs.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 11. April 2006, 22:20 »
Zitat von: nore
es ist doch, wie es immer ist: man sucht tagelang und findet nichts. und kurz nach dem posten findet man dann den fehler. der ist in meinem fall, dass ich nicht bedacht habe, dass die funktion _delay, die ja in c geschrieben ist, EAX verändert und ich den sektor am anfang in ah reinschreibe.  jetzt hab ichs.
Hehehe, ou ja das kenne ich. Man sucht und sucht und sucht, und findet am ende so einen blöden kleinen oder schwerwiegenden fehler. *freu* das du ihn gefunden hast, denn ich weiß wie das ist wenn man einen Fehler gefunden hat wo man Nächte drüber gegrübelt hat. Dann wird die Nacht ja heute schöner. Tip: Progge heute am besten nichts mehr, sonst machst du 'nen Fehler und die Nacht ist wieder versaut. ^^
In the Future everyone will need OS-64!!!

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 12. April 2006, 08:24 »
Zitat von: bitmaster
Hehehe, ou ja das kenne ich. Man sucht und sucht und sucht, und findet am ende so einen blöden kleinen oder schwerwiegenden fehler. *freu* das du ihn gefunden hast, denn ich weiß wie das ist wenn man einen Fehler gefunden hat wo man Nächte drüber gegrübelt hat. Dann wird die Nacht ja heute schöner. Tip: Progge heute am besten nichts mehr, sonst machst du 'nen Fehler und die Nacht ist wieder versaut. ^^

danke. :-)
ich habe gestern dann auch nichts mehr gemacht. dafür geht es heute direkt weiter. ;)

 

Einloggen