zunächst mal danke für den tipp.
für mein delay brauch ich einmal irq0:
_int_irq_0:
cli
push eax
mov eax, [_timer]
inc eax
mov [_timer], eax
mov al, 0x20
out 0x20, al
pop eax
sti
iret
_timer dd 0
und dann noch die funktion an sich (in c):
void delay(unsigned long ms)
{
unsigned long startz;
ms*=182;
ms/=10000;
if (ms>(0x0-timer)) timer=0;
startz=timer;
while (startz+ms>timer){;};
}
ich konnte deinen tipp mit dem seek gar nicht testen, weil jetzt auf einmal (war vorher wirklich noch nicht und besteht auch, wenn ich den seek-teil wieder rausnehme) an der stelle, an der ich die delay-funktion aufrufe eine endlosschleife entsteht. ich hab sogar nochmal geguckt, wie c die funktion aufruft und das ganze dann auch so gemacht. ich bin bald echt am verzweifeln.
ich poste jetzt nochmal den code meiner momentanen isr, die einen track von diskette head ch, cylinder cl an [eax] laden soll. ich bin mir ziemlich sicher, dass die endlosschleife bei "call _delay" entsteht. wenn ich das wegmache, entsteht keine. außerdem bleibt der diskettenlaufwerksmotor an.
_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,0Fh ;Seek (positionier) Kommando
call writediskdata
mov al, ch
shl al, 2 ; head
call writediskdata
mov al,cl ;Spur
call writediskdata
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, 0x00 ; bytes to read (standardwert, da sectorsize!=0) (??)
call writediskdata
push dword 0x7d0 ; 2000
call _delay
add esp, 0x4
mov al, 00h
mov dx, 0x03f2
out dx,al ; motor wieder aus
pop edx
iret