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