anmelden:
;Diese Routine setzt den Task auf Wartestellung, bis das Laufwerk frei ist
 movem.l a2/a4,-(a7)              ;Register retten
 move.l  a6,a2                    ;Zeiger auf Trackdisk-Device-Struktur
 move.l  52(a2),a4                ;Zeiger auf ExecBase in A4
 move.l  60(a2),a6                ;Zeiger auf Disk-Resource
anmeldung:
 lea     208(a3),a1               ;Zeiger auf Message fÜr Anmeldung
 jsr     -18(a6)                  ;Laufwerk anmelden
 tst.l   d0                       ;muß noch gewartet werden?
 bne     nowait                   ;Nein, Zugriff kann sofort beginnen
 exg     a6,a4                    ;Zeiger auf ExecBase in A6
getmessage:
 move.l  #1024,d0                 ;Signalmaske fÜr Wait-Funktion
 jsr     wait(a6)                 ;Warten, bis Signal kommt
 lea     174(a3),a0               ;Zeiger auf Reply-Port
 jsr     getmsg(a6)               ;Message holen
 tst.l   d0                       ;Message angekommen?
 beq     getmessage               ;Nein, auf Message warten
 exg     a6,a4                    ;A4 und A6 wieder vertauschen
 bra     anmeldung                ;Laufwerk nochmals anmelden
nowait:
 exg     a6,a2                    ;Zeiger auf Trackdisk-Device-Struktur
 move.b  65(a3),d1                ;Motorbits nach D1
 or.b    #$7f,d1                  ;Bits 0-6 setzen
 move.b  d1,$bfd100               ;Leitungen auf 1 setzen, da Low-aktiv
 lea     208(a3),a0               ;Zeiger auf Message fÜr Anmeldung
 cmp.l   d0,a0                    ;Messages gleich?
 beq     gleich                   ;Ja, dann verzweige
 lea     $dff000,a0               ;Zeiger auf Hardware-Register
 move.w  #$600,158(a0)            ;ADKCON-Register (Sync sperren)
 move.w  #$9100,158(a0)           ;MFM-Format / FAST-Mode
gleich:
 movem.l (a7)+,a2/a4              ;Register zurÜckholen
 rts                              ;RÜcksprung

abmelden:
;Ein vorher angemeldetes Laufwerk wird abgemeldet, so daß ein anderer Task
;auf das Laufwerk zugreifen kann.
 move.l  a6,-(a7)                 ;A6 retten
 move.l  60(a6),a6                ;Zeiger auf Disk-Resource
 jsr     -24(a6)                  ;Laufwerk abmelden
 move.l  (a7)+,a6                 ;A6 zurÜckholen
 rts                              ;RÜcksprung

motorschalten:
;Schaltet den Motor ein bzw. aus
;D0 enthält Null fÜr Ausschalten / Eins fÜr Einschalten
 move.l  d2,-(a7)                 ;D2 retten
 tst.l   d0                       ;Ein- oder Ausschalten?
 seq     d1                       ;D0=0 => D1=$FF sonst D1=0
 and.b   #128,d1                  ;Bits 0-6 löschen
 cmp.b   d1,d2                    ;Stimmen Werte Überein?
 beq     motormarke               ;Ja, Motor hat bereits gewÜnschten Zustand
 bclr    #7,65(a3)                ;Bit 7 der Motorbits löschen
 or.b    d1,65(a3)                ;Bit aus D1 eintragen
 bsr     anmelden                 ;Laufwerk anmelden
 moveq   #255,d1                  ;Leitungen von $BFD100 sind Low-aktiv
 eor.b   d2,d1                    ;gewÜnschte Bits selectieren
 move.b  d1,$bfd100               ;Leitungen in Hi-Zustand
 move.b  65(a3),$bfd100           ;Es werden nur 1-0 SprÜnge registriert
 bsr     abmelden                 ;Laufwerk abmelden
 btst    #7,65(a3)                ;Ein- oder Ausschalten?
 bne     motormarke               ;Einschalten, also verzweige
 move.l  #500000,d0               ;Wert fÜr Wartezeit
 bsr     warten                   ;warten, bis Motor ausgelaufen
motormarke:
 moveq   #0,d0                    ;D0 löschen
 btst    #7,d2                    ;ursprÜnglicher Zustand des Motors
 seq     d0                       ;Bit7(D2)=0 => D0=$FF sonst D0=0
 move.l  (a7)+,d2                 ;D2 zurÜckholen
 rts                              ;RÜcksprung

warten:
;D0 enthält den Wert der Warteschleife
 cmp.l   #300,d0                  ;Wert fÜr Wartezeit testen
 blt     kleiner                  ;Warteschleife, sonst zum Timer-Device
 movem.l a0/a1,-(a7)              ;Register retten
 lea     94(a3),a1                ;Zeiger auf IORequest fÜr Timer-Device
 clr.l   32(a1)                   ;Actual-Langwort löschen
 move.l  d0,36(a1)                ;Länge eintragen
 move.l  a6,-(a7)                 ;A6 retten
 move.l  execbase,a6              ;Zeiger auf ExecBase
 jsr     doio(a6)                 ;Warten
 move.l  (a7)+,a6                 ;A6 zurÜckholen
 bra     gewartet                 ;Fertig
kleiner:
 tst.l   (a3)                     ;Aktion innerhalb der Warteschleife
 dbf     d0,kleiner               ;Warteschleife
gewartet:
 rts                              ;RÜcksprung

movehead:
;Bewegt den Schreib- Lesekopf auf einen gewÜnschten Track. Die Tracknummer
;muß unbedingt gÜltig sein, da die Fehlerabfrage entfernt ist!
;D0 enthält die Tracknummer
 movem.l d2/d3,-(a7)              ;Register retten
 move.w  76(a3),d2                ;Tracknummer in D2
;Hier steht die Fehlerabfrage:
; bpl     trackok
; move.l  d0,d2
; bsr     error
; tst.l   d0              ;Tracknummer berichtigt?
; bne     movefertig      ;Register zurÜckholen, Routine verlassen
; exg     d0,d2
;trackok:
 cmp.w   d0,d2                    ;Tracknummern gleich?
 beq     trackgleich              ;Ja, steppen nicht mehr nötig
 move.l  d0,d3                    ;gewÜnschter Track in D3
 bsr     anmelden                 ;Laufwerk anmelden
 move.b  65(a3),d1                ;Motorbits nach D1
 bset    #2,d1                    ;untere Seite anwählen
 btst    #0,d3                    ;obere oder untere Seite?
 beq     geradertrack             ;gerade Tracknummer (untere Seite)
 bclr    #2,d1                    ;obere Seite anwählen
geradertrack:
 move.b  d1,65(a3)                ;Motorbits in Laufwerks-Port eintragen
 move.b  d1,$bfd100               ;Side-Select eintragen
 move.w  d3,76(a3)                ;Tracknummer eintragen
 lsr.w   #1,d2                    ;Cylindernummer
 lsr.w   #1,d3                    ;Cylindernummer
 sub.w   d3,d2                    ;An gewÜnschte Position angekommen?
 bcs     nachinnen                ;Nein, noch zu weit außen
 bhi     nachaussen               ;Nein, noch zu weit innen
 bsr     abmelden                 ;Ja, dann Laufwerk abmelden
 bra     trackgleich              ;und Routine verlassen
nachinnen:
 bclr    #1,d1                    ;Direction-Bit: nach innen
 move.b  d1,65(a3)                ;Motorbits in Laufwerks-Port
 neg.w   d2                       ;Cylindernummer positiv machen
 bra     stepagain                ;Kopf um einen Track bewegen
nachaussen:
 bset    #1,d1                    ;Direction-Bit: nach außen
 move.b  d1,65(a3)                ;Motorbits in Laufwerks-Port
 bra     stepagain                ;Kopf um einen Track bewegen
step:
 bsr     stepmotor                ;Kopf um einen Track bewegen
stepagain:
 dbf     d2,step                  ;bis gewÜnschte Position erreicht ist
 bsr     abmelden                 ;Laufwerk abmelden
 move.l  48(a3),d0                ;Wert fÜr Wartezeit in D0
 bsr     warten                   ;warten
trackgleich:
 moveq   #0,d0                    ;Flag fÜr kein Fehler
 movem.l (a7)+,d2/d3              ;Register zurÜckholen
 rts                              ;RÜcksprung

stepmotor:
 move.b  65(a3),d0                ;Motorbits nach D3
 move.b  d0,d1                    ;Motorbits nach D1
 bclr    #0,d0                    ;Wert fÜr Kopf steppen
 move.b  d0,$bfd100               ;Kopf steppen
 nop
 nop                              ;kurze Zeit warten
 move.b  d1,$bfd100               ;Leitungen auf 1, da Low-aktiv
 bsr     abmelden                 ;Laufwerk abmelden
 move.l  44(a3),d0                ;Wartezeit zwischen zwei steps
 bsr     warten                   ;warten
 bsr     anmelden                 ;Laufwerk wieder anmelden
 move.b  65(a3),$bfd100           ;Drive-Select-Register beschreiben
 rts                              ;RÜcksprung
