writetrack:
;Diese Routine schreibt Daten vom Speicher auf Diskette
;A0 zeigt auf Schreibpuffer, der die codierten und formatierten Daten
;enthält
;D0 enthält die Anzahl zu schreibender Bytes
 move.l  #setdsklen,a4            ;Zeiger auf DSKLEN-Routine
 movem.l a4/a2/d2,-(a7)           ;Register retten
 move.l  a0,a2                    ;Zeiger auf Schreibpuffer nach A2
 move.l  d0,d2                    ;Anzahl zu schreibender Bytes
 bsr     anmelden                 ;Laufwerk anmelden
 move.b  65(a3),$bfd100           ;Motorbits setzen
 move.w  #$4000,$dff024           ;Disk-DMA sperren
 move.l  #1000,d0                 ;Wert fÜr Wartezeit
 bsr     warten                   ;warten (warum, weiß ich nicht!!!)
 lea     $dff000,a1               ;Zeiger auf Hardware-Register
 move.l  a2,32(a1)                ;Zeiger auf Disk-Daten (DSKPT)
 move.w  #$1002,156(a1)           ;DiskSync und DiskBlockReady Interrupts
                                  ;sperren
 move.w  #$8002,154(a1)           ;DiskBlockReady Interrupt erlauben
 btst    #2,$bfe001               ;Diskette im Laufwerk?
 bne     diskok                   ;verzweige, wenn OK
nodiskin:
 moveq   #29,d2                   ;Fehlernummer in D0
 bra     writefailed              ;Routine verlassen
diskok:
 btst    #3,$bfe001               ;Diskette schreibgeschÜtzt?
 beq     writeprotect             ;verzweige, wenn schreibgeschÜtzt
 move.l  execbase,a0              ;Zeiger auf ExecBase in A0
 move.w  #$4000,154(a1)           ;Interrupts sperren
 addq.b  #1,294(a0)               ;Disable-Funktion ausfÜhren
 btst    #4,34(a6)                ;Bit 4 in Statusbyte gesetzt?
 beq     bit4clear                ;verzweige, wenn gelöscht
 moveq   #36,d2                   ;sonst Fehlernummer in D2
 move.l  execbase,a0              ;Zeiger auf ExecBase in A0
 subq.b  #1,294(a0)               ;Enable-Funktion ausfÜhren
 bge     intfehler                ;Interrupts trotz Enable noch gesperrt
 move.w  #$c000,154(a1)           ;Interrupts erlauben
intfehler:
 bra     writefailed              ;Routine verlassen
bit4clear:
 bset    #5,34(a6)                ;Bit 5 in Statusbyte setzen
 move.l  execbase,a0              ;Zeiger auf ExecBase in A0
 subq.b  #1,294(a0)               ;Enable-Funktion ausfÜhren
 bge     nextintfehler            ;Interrupts trotz Enable noch gesperrt
 move.w  #$c000,154(a1)           ;Interrupts erlauben
nextintfehler:
 move.w  #$6000,158(a1)           ;PRECOMP-Zeit auf Null setzen
 move.w  76(a3),d0                ;Tracknummer in D0
 move.w  #$8000,d1                ;PRECOMP-Zeit Null
 cmp.w   38(a3),d0                ;anderer PRECOMP-Wert erforderlich?
 bls     precompok                ;Nein
 move.w  #$a000,d1                ;sonst 140 Nanosekunden
precompok:
 move.w  d1,158(a1)               ;Schreibdichte eintragen
 lsr.w   #1,d2                    ;Anzahl der zu schreibenden Worte in D2
 ori.w   #$c000,d2                ;Bit fÜr Schreiben setzen
 move.l  d2,d0                    ;Wert nach D0
 jsr     (a4)                     ;DSKLEN beschreiben (Track schreiben)
 bsr     waitmessage              ;Warten, bis Track geschrieben ist
 lea     $dff000,a1               ;Zeiger auf Hardware-Register
 move.w  #2,154(a1)               ;DiskBlockReady Interrupt sperren
 move.l  #2000,d0                 ;Wert fÜr Wartezeit
 bsr     warten                   ;warten
 move.w  #$4000,36(a1)            ;Disk-DMA sperren
 bclr    #5,34(a6)                ;Bit 5 des Statusbyte löschen
 btst    #2,$bfe001               ;Diskette im Laufwerk?
 beq     nodiskin                 ;Nein, dann verzweigen
 moveq   #0,d2                    ;Flag fÜr kein Fehler
writefailed:
 bsr     abmelden                 ;Laufwerk abmelden
 move.l  d2,d0                    ;RÜckmeldung nach D0
 movem.l (a7)+,a4/a2/d2           ;Register zurÜckholen
 rts                              ;RÜcksprung
writeprotect:
 moveq   #28,d2                   ;Fehlermeldung in D2
 bra     writefailed              ;Routine verlassen
