 		opt l-
		
*************************************************
* Programm: EraseDisk			        *
* Version:  V0.69			        *
* Kickstart: 1.2/1.3			        *
* Sprache:   Devpac Assembler		        *
* Datum:     29.5.91			        *
* Autor:     Otto Bernhart	  	        *
* P.S:     * erased Disk in beliebigen Laufw.   *
*	   * nur unter CLI		        *
* Greetings: Elke, Nicole, Sabine, Peter,       *
*            Sandra, Michi, Heiko, Heli, Mum,   *
*            Dad, Karli, Pechti, Fam.Jurak,     *
*            and all the pretty Girls out there.* 
*************************************************

  include df0:include/exec/exec_lib.i
  include df0:include/libraries/dos_lib.i
  include df0:include/intuition/intuition_lib.i

* Parameter auswerten und Laufwerk in "Laufwerk" merken

start1:
  movem.l d0-d7/a0-a6,-(a7)		; alle Register retten
  cmp.b #"?",(a0)			; ? gewählt ?
  bne.s start2				; nein -> normaler Start
  moveq #1,d0
  move.l d0,merker			; ja in "merker" notieren
start2:
  subq.w #1,d0
  beq.s parameterlos			; ohne Parameter = df0:
suche:
  cmp.b #$20,(a0)
  bne.s erfolg
  addq	#1,a0
  dbf d0,suche
raus:
  tst.b merker				; "?" gewählt?
  bne  OpenDos				; Ja -> bereite Ausgabe vor
  movem.l (a7)+,d0-d7/a0-a6
  moveq #0,d0   			; Kommentarlos
  rts					; raus weil falscher Kommentar
erfolg:
  cmp.b #"d",(a0)
  beq.s gut
  cmp.b #"D",(a0)
  bne.s raus
gut:
  addq.l #1,a0
  cmp.b  #"f",(a0)
  beq.s gut2
  cmp.b  #"F",(a0)
  bne.s raus
gut2:
  addq  #1,a0
  moveq #0,d7
  move.b (a0),d7
  cmp.b #$30,d7
  blo.s raus
  cmp.b #$33,d7
  bhi.s raus
  sub.b #$30,d7
  move.l d7,Laufwerk       
  bra.s OpenDos				; Laufwerk in d7
parameterlos:
  moveq  #0,d0
  move.l d0,Laufwerk

*************** Start des Hauptprogramms **************

* Dos-Library öffnen

OpenDos:
  movem.l (a7)+,d0-d7/a0-a6  		; Register zurückholen (wichtig)
  lea.l dosname,a1			; Zeiger auf Dosname
  moveq #0,d0				; Version egal
  CALLEXEC OpenLibrary  		; öffnen
  move.l d0,_DOSBase    		; Zeiger merken
  tst.l merker	
  bne   Info				; "?" angewählt? -> InfoTextausgeben
OpenInt:
  lea.l intname,a1
  moveq #0,d0 
  CALLEXEC OpenLibrary
  move.l d0,_IntuitionBase
  
OutputHandle:
  CALLDOS Output
  move.l d0,d4

ResSpeicher:
  move.l #5632,d0			; größe
  move.l #$10002,d1     		; Bedingungscode
  CALLEXEC AllocMem
  move.l d0,TrackPuffer 		; Adresse Puffer

A lea.l portadr,a1			; Zeiger auf Portstruktur
  CALLEXEC AddPort			; Port anmelden

B sub.l a1,a1				; A1 löschen
  CALLEXEC FindTask			; Zeiger auf eigenen Task holen
  move.l d0,portadr+16  		; in Portstruktur eintragen


OpenDevice:
  move.l Laufwerk,d0
  lea.l iorequest,a1			; Zeiger auf IORequest-Struktur
  lea.l devname,a0			; Zeiger auf Devicenamen
  moveq #0,d1				; keine Flags
  CALLEXEC OpenDevice			; Device öffnen
  tst.l d0
  bne error 				; Fehler beim Öffnen

*********** Starttext ausgeben und auf Return warten ************

Work:
  move.l d4,d1				; Ausgabehandle
  move.l #EraseText,d2
  moveq  #len1,d3			; Länge String
  CALLDOS Write         		; String ausgeben
WaitReturn:
  CALLDOS Input				; Eingabehandle ermitteln
  move.l d0,d5				; in d5 merken
  move.l d5,d1
  move.l #buffer,d2
  moveq #1,d3
  CALLDOS Read				; auf Return warten  

************** Eingabe Start- & EndTrack *************************

Test1:
  lea.l  iorequest,a1
  move.w #14,command
  CALLEXEC DoIO
  move.l IOerror,d5
  beq.s TestProtection

NotInserted:
  moveq  #1,d0				; Typ: Recovery ALERT
  moveq  #45,d1				; Höhe der Alertbox
  lea.l  IText,a0			; Textadresse
  CALLINT DisplayAlert
  move.l d0,Maustaste
  tst.l  Maustaste
  bne    Work				; 0 = rechte Taste		
  bra fini

TestProtection:
  lea.l  iorequest,a1
  move.w #15,command
  CALLEXEC DoIO
  move.l IOerror,d5
  beq.s   GOon

Protected:
  moveq #1,d0				; Typ: Recovery ALERT
  moveq #45,d1				; Höhe der Box
  lea.l PText,a0			; Textadresse
  CALLINT DisplayAlert
  move.l d0,Maustaste
  tst.l  Maustaste
  bne    Work
  bra    fini   

GOon:
  lea.l  iorequest,a1			; Zeiger auf IORequest
  move.w #11,command
  move.l #160*5632,IOlenght 		; 160 Tracks
  move.l #TrackPuffer,IOdata		; TrackPuffer
  moveq  #0,d0
  move.l d0,IOoffset			; starte Track 0
  CALLEXEC DoIO				; Device starten

Message:
  move.l d4,d1
  move.l #FinishText,d2
  moveq  #len4,d3
  CALLDOS Write

Motoraus:
  lea.l  iorequest,a1
  move.w #9,command	
  moveq  #0,d0				; Kommando: Motor aus
  move.l d0,IOlenght	   		; löschen für Motor an
  CALLEXEC DoIO         		; aktiviere Device

fini:
* Speicher wieder freigeben  

  move.l TrackPuffer,a1 		; Startadresse
  move.l #5632,d0			; Speichergröße
  CALLEXEC FreeMem

* Trackdisk.device schließen		
  lea.l iorequest,a1
  CALLEXEC CloseDevice 			; Device schließen

error:
* Port abmelden				
  lea.l portadr,a1
  CALLEXEC RemPort			; Port abmelden

* IntLib schließen
  move.l _IntuitionBase,a1
  CALLEXEC CloseLibrary

* DosLib schließen

CloseDos:
  move.l _DOSBase,a1
  CALLEXEC CloseLibrary    
  
  moveq #0,d0				; Errorflag löschen
  rts					; BABA

***************** Unterprogramme ***************

Info:
  CALLDOS Output
  move.l d0,d1
  move.l #InfoText,d2
  move.l #InfoTextlen,d3
  CALLDOS Write
  bra.s CloseDos
  
* Strukturen

portadr dc.l 0
	dc.l 0
	dc.b 4				; Typ = Message-Port
	dc.b 0				; Priorität = 0
	dc.l portname			; Zeiger auf Portnamen
	dc.b 0
	dc.b 31				; Nummer von Signal-Bit
	dc.l 0,0,0,0
	dc.b 0,0
; ------------------------------------------------------
       
iorequest 	dc.l 0,0
		dc.b 5	 		; Typ = Message
		dc.b 0
		dc.l 0
		dc.l portadr 		; Zeiger auf Reply-Port
		dc.w 48         	; Strukturgröße in Byte
		dc.l 0,0
command		dc.w 0			; Kommando: formatieren
		dc.w 0
IOerror		dc.l 0
IOlenght	dc.l 0          	; 160 Tracks formatieren
IOdata		dc.l 0
IOoffset	dc.l 0			; starte bei Track 0

; ------------------------------------------------------

* Datenbereich		

_DOSBase 	dc.l 0
_IntuitionBase  dc.l 0
dosname 	dc.b "dos.library",0
intname         dc.b "intuition.library",0
portname	dc.b "trackdisk.port",0
devname		dc.b "trackdisk.device",0

Laufwerk        dc.l 0
TrackPuffer     dc.l 0
buffer          ds.b 1
STbuffer	ds.l 0
ETbuffer	ds.l 0
Maustaste 	ds.l 1
merker          dc.l 0

EraseText	dc.b $9b,"1;33;40m"
		dc.b 10,10,10,"              EraseDisk V0.69",10
		dc.b $9b,"0;31;40m"
                dc.b    "              Please insert disk to be erased and press RETURN:"
len1            equ *-EraseText	
FinishText      dc.b 10,"                   ...all done!           AUTHOR: "
  		dc.b $9b,"0;32;40mOtto Bernhart",10
  		dc.b $9b,"0;31;40m"
len4            equ *-FinishText

************************* ALERT-Texte ************************

PText           dc.b 0,120,16,"ATTENTION !  Disk in selected drive is write-protected!!!"
		dc.b 0,$FF,0,17,32," left button: CONTINUE                                 right button: CANCEL",0,0
		
IText           dc.b 0,120,16,"     ATTENTION ! No disk in selected drive!!!"		
		dc.b 0,$FF,0,17,32," left button: CONTINUE                                 right button: CANCEL",0,0
	
************************* INFO-Text **********************

InfoText:
		dc.b 12,10,10
		dc.b $9b,"1;33;40mEraseDisk V0.69"
		dc.b $9b,"0;31;40m by "
		dc.b $9b,"1;33;40mOtto Bernhart "
		dc.b $9b,"0;31;40m29/5/91",10,10
		dc.b $9b,"1;32;40m       USAGE: "
		dc.b $9b,"0;31;40m" 
		dc.b " EraseDisk [DRIVE],[?]",10,10
		
		dc.b "       This program erases a disk in a selected drive.",10
		dc.b "       (It sets all bits zero)",10,10
		
		dc.b "       Write to me: Otto Bernhart",10
		dc.b "                    Postfach 10",10
		dc.b "                    8423 St.Veit a.V.",10
		dc.b "                    AUSTRIA",10,10
		
		dc.b $9b,"0;32;40m"
		dc.b "       EraseDisk is a PUBLIC DOMAIN program,",10
		dc.b "       but if you like it, please send $5 (or more)",10
		dc.b "       to the adress above. (I`m a poor pupil)",10
		dc.b $9b,"0;31;40m",10,10
		dc.b " EraseDisk is dedicated to all the pretty girls out there!!!",10,10

InfoTextlen	equ  *-InfoText 
		even
	
