;
;  LISTING 1
;
;       --------------
;         BOOTCOPY
;       --------------
;  Written by Bernd Marienfeldt
;  Lichtenstein,8.12.87

START:
movem.l  d0-d7/a0-a6,-(sp)   ; Register auf SP Retten
move.l   4,a6                ; Execbase nach a6
move.l   #$2c00,d0           ; Speichergroesse nach D0
move.l   #$10003,d1          ; Chip+Clear+Public nach D1
jsr      -198(a6)            ; Speicher reservieren mit Allocmem
beq      Fehler              ; Wenn Null Fehler bei Speicher-
                             ; zuweisung => nichts wie raus!
move.l   d0,diskbuffer       ; Speicherblockadresse retten
 
move.l   4,a6                ; execbase nach a6                      
lea      intlib,a1           ; 'intuition.library' nach A1
jsr      -408(a6)            ; Library oeffnen.
move.l   d0,intbase          ; Zeiger in D0 nach Basis retten
lea      Graphlib,a1         ; 'graphics.library' nach A1         
jsr      -408(a6)            ; Library oeffnen
move.l   d0,Graphbase        ; und wieder Zeiger nach Basis retten.

move.l   intbase,a6          ; Intbase nach a6
lea      newwindow,a0        ; Windowstruktur laden
jsr      -204(a6)            ; Window oeffnen
cmp.l    #0,d0               ; Fehler ? 
beq      fehler              ; ja => ende
move.l   d0,window           ; Windowzeiger retten braucht man!
move.l   d0,a0               ; Wzeiger nach A0
move.l   d0,a1               ; Wzeiger nach A1
move.l   86(a0),msgport      ; 86-Distanzwert liegt der MsgPort!
move.l   50(a1),wrastport    ; 50-Distanzwert liegt der WRastport!
move.l   4,a6                ; Execbase nach a6
lea      devicename,a0       ; Device(TRDdev.) laden           
move.l   #0,d0		     ; Unit 0 (also internes Drive) nach d0
lea      IOrequest,a1	     ; IO/Struktur nach a1
clr.l    d1		     ; Kein Flags => einfach loeschen!
jsr      -444(A6)            ; Device Oeffnen
BeschDat1:
dc.l     1,177,30,string1,14 ; Farbe,x-pos,y-pos,string,laenge 
dc.l     1,118,40,string2,28 ;  "     "      "     "      "
dc.l     1,12,60,string3,55  ;  "     "      "     "      "
move.l   #2,bcount           ; 2 mal durchlaufen(einmal laeuft es
                             ; eh durch-immer so bei dbra!)
lea      BeschDat1,a5        ; obige Daten nach A5
jsr      Beschrifter         ; Beschrifter aufrufen
warten0:
btst     #6,$bfe001          ; Bit 6 im CIA-Port testen
bne.s    warten0             ; Falls nicht gesetzt nach warten0=>Schl.
jsr      TD_Read             ; Cylinder 0 lesen
jsr      TD_motoroff         ; Motor ausschalten
warten1:             
btst     #6,$bfe001          ; Bit 6 wieder testen
bne.s    warten1             ; keine Reaktion => Schleife
jsr      TD_Write            ; Auf Cylinder 0 schreiben
jsr      TD_MotorOff         ; Motor ausschalten
close:
move.l   4,a6                ; execbase,a6
lea      IORequest,a1        ; IOStruktur nach A1
jsr      -450(a6)            ; Device schliessen
move.l   intbase,a6          ; Intbase,a6
move.l   window,a0           ; Windowzeiger nach A0
jsr      -72(a6)             ; Window schliessen       
move.l   4,a6                ; execbase,a6
move.l   intbase,a1          ; Intbase,a6
jsr      -414(a6)            ; Library schliessen

move.l   4,a6                ; Execbase nach a6
move.l   #$2c00,d0           ; Speichergroesse nach D0
move.l   diskbuffer,a1       ; Zugewiesene Speicherblock nach A1
jsr      -210(a6)            ; Speicher freigeben mit Freemem
                             ; Kein Test,da es jetzt eh zu spaet waere

movem.l  (sp)+,d0-d7/a0-a6   ; Register vom SP holen
rts                          ; Zurueck zum SEKA oder CLI


Beschrifter:                 ; Beschrifter Funktion
move.l   Bcount,d7           ; Durchlaufszahl nach D7
BeschrLoop:              
move.l   graphbase,a6        ; Graphik-Library-Base nach A6
move.l   wrastport,a1        ; Wrastport nach A1
move.l   (a5)+,d0            ; Wert in A5 nach d0(PenFarbe)
                             ; und eins weiter.
jsr      -342(a6)            ; Setpen(Farbe fuer Pen A setzen)
move.l   (a5)+,d0            ; Wert in A5 nach d0(X-Pos) +1
move.l   (a5)+,d1            ; Wert in A5 nach d1(Y-Pos) +1
jsr      -240(a6)            ; Cursor setzen
move.l   (a5)+,a0            ; Wert in A5 nach a0(string) +1
move.l   (a5)+,d0            ; Wert in A5 nach d0(Stringlaenge) +1
jsr      -60(a6)             ; Textschreiben
dbra     d7,BeschrLoop       ; Wert in d7 erreicht,wenn nicht SCHLEIFE
rts                          ; Wenn fertig zurueckspringen.
;---------------------------------------------------------------
; WICHTIGE ANMERKUNG ZUM TRDDEVICE:
; Beim Commando Format(11) duerfen im Offset- und
; Laengenregister nur Vielfache von 5632 stehen,da
; der Device nur in der Lage ist einen halben Cylinder,
; also 11 Sektoren,zu formatieren(schreiben)!!!
;
; EBENSO ist beim Commando Write(3) zu beachten,dass hier
; im Offset- und Laengenregister nur Vielfache von 512 stehen
; duerfen,da das Device und auch das Laufwerk(AMIGA) nur in der Lage ist
; ganze Sektoren zu lesen!!!!
;---------------------------------------------------------------- 
TD_read:                     ; LeseFunktion
move.l  4,a6                 ; Execbase nach A6
lea     IORequest,a1         ; IOstruktur nach A1   
move    #2,28(A1)            ; Command(2) setzen
move.l  #$2c00,36(a1)        ; Laenge(512*11*2) setzen
move.l  diskbuffer,40(A1)    ; Datas(Adresse wo hingeladen wird)
move.l  #$0000,44(a1)	     ; Offset(Cylinderadress)Cyl.0
jsr     -456(A6)             ; DoIO aufrufen
rts                          ; Ruecksprung

TD_Write:                    ; Schreib-Routine - Eigentlich wird
                             ; ja formatiert,da Command = 11,erspart
                             ; das vorformatieren - formatiert einfach
                             ; mit Daten im Speicher.
move.l   4,a6                ; Execbase,A6
lea      IORequest,a1        ; IOstruktur nach A1
move     #11,28(a1)          ; Command = 11 =>formatieren
move.l   #$2c00,36(a1)       ; Laenge(512*11*2 =11264=$2c00)
move.l   diskbuffer,40(A1)   ; Databuffer wie schon bei Read
move.l   #$0000,44(a1)       ; Und wieder Cylinderoffset 
jsr      -456(A6)            ; DoIO aufrufen
rts                          ; Ruecksprung

TD_MOTORoff:                 ; Motorauschalten
move.l   4,a6                ; Execbase,A6
lea      IORequest,a1        ; IOstruktur nach A1
move.l   #0,36(A1)           ; Laenge auf 0 => auschalten
move     #9,28(a1)           ; Command 9 => Motor an/aus 
jsr      -456(a6)            ; DoIo aufrufen
rts                          ; Ruecksprung


; Namen fuer Librarys und Zeiger zum Zwischenspeichern
Fehler:	   rts
Devicename:dc.b 'trackdisk.device',0
Graphlib:  dc.b 'graphics.library',0
Intlib:	   dc.b 'intuition.library',0
String1:   dc.b 'BOOTCOPY V.1.0',0
String2:   dc.b 'WRITTEN BY BERND MARIENFELDT',0
String3:
Dc.b '* INSERT SOURCE - LEFTMOUSE - INSERT DEST.- LEFTMOUSE *'
even
Diskbuffer:dc.l 0
Graphbase: dc.l 0
Wrastport: dc.l 0
Intbase:   dc.l 0
Window:	   dc.l 0
Bcount:    dc.l 0

Newwindow:            ; Windowstruktur mit Daten ueber Window
dc.w      120,50      ; Start-position
dc.w      470,100     ; Breite und Hoehe des Windows
dc.b      0,1         ; Farbe fuer Menue und Gadgets
dc.l      $0300       ; IDCMP - Flags ($0300=Windowclose+Menuepick)
dc.l      $1007       ; Aussehen des windows
dc.l      0           ; Pointer zu speziellem gadget
dc.l      0           ; Pointer zu user check mark (eigenr Checkmark)
dc.l      0           ; Pointer zum Title
dc.l      0           ; Pointer zum Screen 
dc.l      0           ; Pointer zu Superbitmap
dc.w      1,1         ; Lleinste Groesse
dc.w      470,100     ; Groesste Groesse
dc.w      $0001       ; ScreenTyp
                      ; Genaueres ueber Windowstrukturen und Intuition
                      ; bitte Fachliteratur entnehmen.
IORequest:   
dc.l 0		; Input/Output-Struktur fuer Device-
dc.l 0		; Kommunikation.Dient dazu,Werte zu holen
dc.b 5          ; ,zu bekommen und zwischenzuspeichern.
dc.b 0	        ; Wichtig fuer TrdDiskDevice ist auch der Msgport,
dc.l MN_node    ; den man ueber das Window erhaelt!
Msgport:
dc.l 0
dc.w 0
dc.l 0  	; Device
dc.l 0		; UnitNr.(0,1,2,3)
dc.w 0 		; Command-Flag
dc.b 0		; Flags
dc.b 0		; Errors (Hier Errors testen)
dc.l 0 		; Actual-Field
dc.l 0		; Laenge (Laenge der Daten)
dc.l 0		; Datas  (Datenbuffer)
dc.l 0		; Offset (Cylinder)
dc.l 0		; Reserviert
dc.l 0		; Reserviert
MN_node:     dc.b 'port',0  ;Portname
even
