Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nore am 11. April 2006, 17:42
-
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.
-
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.
-
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. ^^
-
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. ;)