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.