hi, ich hab zum lesen eines tracks von diskette einen kleinen sofware-interrupt geschrieben, den ich dann mit einer funktion aufrufe. der hat anfangs sowohl unter bochs als auch an diversen richtigen PCs funktioniert. seit ungefähr einer woche tut er dies allerdings nicht mehr. unter bochs funktioniert es noch, aber am richtigen PC nicht mehr.
das interessante daran ist: ich habe unmittelbar davor an der ISR dieses interrupts nichts geändert. ich habe jetzt schon einige stunden mit fehlersuchen verbracht und bin mittlerweile echt am verzweifeln.
anbei poste ich den code der ISR und hoffe, ihr könnt mir helfen.
kurze bemerkungen: in eax steht beim aufruf die adresse, an die der track geladen werden soll, in ch steht der kopf und in cl der zylinder.
die funktion delay funktioniert (unabhängig von diesem interrupt getestet) und erwartet millisekunden in einem unsigned long.
ob der track in den arbeitsspeicher geladen wurde teste ich mit einer funktion, die mit sehr großer wahrscheinlichkeit fehlerfrei läuft (andere speicherstellen werden richtig angezeigt).
hier also der code der ISR:
das interessante daran ist: ich habe unmittelbar davor an der ISR dieses interrupts nichts geändert. ich habe jetzt schon einige stunden mit fehlersuchen verbracht und bin mittlerweile echt am verzweifeln.
anbei poste ich den code der ISR und hoffe, ihr könnt mir helfen.
kurze bemerkungen: in eax steht beim aufruf die adresse, an die der track geladen werden soll, in ch steht der kopf und in cl der zylinder.
die funktion delay funktioniert (unabhängig von diesem interrupt getestet) und erwartet millisekunden in einem unsigned long.
ob der track in den arbeitsspeicher geladen wurde teste ich mit einer funktion, die mit sehr großer wahrscheinlichkeit fehlerfrei läuft (andere speicherstellen werden richtig angezeigt).
hier also der code der ISR:
Code: [Auswählen]
_int_0x30:
push edx
push eax
mov al, 0x14
out 0x08, al ; dma deaktivieren
mov al, 0x56
out 0x0b, al ; einzel, adressinc, kein autoinit, schreiben, kanal2
pop eax
out 0x0c, al ; flip-flop leeren
out 0x04, al ; niederwertiges adressbyte schicken
shr eax, 8
out 0x04, al ; höherwertiges adressbyte schicken
shr eax, 8
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, 0x23
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
mov al,3
call writediskdata
mov al,0x0F
call writediskdata
mov al,2
call writediskdata ; laufwerkdaten festlegen
mov al, 0x46 ; erstes byte des read-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, 1 ; 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, 0xFF ; bytes to read (standaradwert, da sectorsize!=0) (??)
call writediskdata
push dword 0x400 ;1024
call _delay
pop eax
mov al, 00h
mov dx, 0x03f2
out dx,al ; motor wieder aus
pop edx
iret

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
