;	*****   The Final Boot-Protector   *****

Execbase:equ	4		;Exec-Basisadresse

AllocMem:equ	-198		;Speicher Belegen
Freemem: equ	-210		;Speicher freigeben
FindTask:equ	-294		;Task-Struktur suchen
AddPort: equ	-354		;Port erstellen
RemPort: equ	-360		;Port entfernen
OpenLibrary:equ	-408		;Library oeffnen
CloseLibrary:equ-414		;Library schliessen
OpenDev: equ	-444		;Device oeffnen
CloseDev:equ	-450		;Device schliessen
DoIO:	equ	-456		; I/O starten und warten

DisplayAlert: equ	-90	;Alert anzeigen

BootSize:equ	512*2

Chip:	equ	2

Start:
	move.l	ExecBase,a6	;Zeiger auf Exec-Bibliothek

OpenIntuition:
	lea	IntuitionName(pc),a1
	moveq	#0,d0
	jsr     OpenLibrary(a6)

	move.l	d0,IntuitionBase
	beq.L	Error

	move.l	$2a(a6),d0		; ColdCapture
	or.l	$2e(a6),d0		; CoolCapture
	or.l	$32(a6),d0		; WarmCapture

	or.l	550(a6),d0		; KickMemPtr
	or.l	554(a6),d0		; KickTagPtr

	bne.s	Virus			; wenn eines nicht null
					; stimmt was nicht

	cmp.w	#$fc,148(a6)		; wenn nicht im Kickstart
	beq.s	AllocateMemory	; hat sich was eingelinkt

Virus:
	moveq	#1,d0
	moveq	#45,d1
	lea	ALVirus(pc),a0
	move.l	IntuitionBase(pc),a6
	jsr	DisplayAlert(a6)

	tst.l	d0
	bne.L	Killer

AllocateMemory:
	move.l	ExecBase,a6

	move.l	#BootSize,d0
	moveq	#Chip,d1

	Jsr	AllocMem(a6)

	move.l	d0,PointDiskBuff
	beq.L	CloseIntuition

	sub.l	a1,a1		;eigener Task
	jsr	Findtask(a6)	;Task suchen
	move.l	d0,ReadReply+$10;SigTask: eigener Task

	lea	ReadReply(pc),a1
	jsr	AddPort(a6)	;Add Reply-Port

	lea	DiskIO(pc),a1	;I/O-Struktur
	moveq	#0,d0		;Laufwerk df0:
	moveq	#0,d1		;keine Flags
	lea	TrdDevice(pc),a0;Device-Name
	jsr	OpenDev(a6)	;Open trackdisk.device

	tst.l	d0		;ok?
	bne.s 	FreeMemory	;nein: Fehler aufgetreten!

ReadBootBlock:
	lea	DiskIO(pc),a1

	move.l	#ReadReply,14(a1);set Reply-Port
	move.w	#2,28(a1)	;Command: READ
	move.l	PointDiskBuff(pc),40(a1);Puffer
	move.l	#BootSize,36(a1);Länge: 2 Sektoren
	clr.l	44(a1)		;Offset: 0 (Bootblock)

	jsr	DoIO(a6)	;Sektor lesen

	move.w	#BootSize/4-1,d0
	move.l	PointDiskBuff(pc),a0
	lea	BootBlock(pc),a1

VerifyBootBlock:
	move.l	(a0)+,d1
	cmp.l	(a1)+,d1
	bne.s	NotEqual

	dbra	d0,VerifyBootBlock

MotorOff:
	lea	DiskIO(pc),a1
	move.w	#9,28(a1)	;Commane :td_MOTOR
	clr.l	36(a1)		;Motor ausschalten

	move.l	ExecBase,a6
	jsr	DoIO(a6)

	lea	ReadReply(pc),a1
	jsr	RemPort(a6)	;Port entfernen

	lea	DiskIO(pc),a1
	jsr	CloseDev(a6)	;Trackdisk-Device schliessen

FreeMemory:
	move.l	ExecBase,a6

	move.l	PointDiskBuff(pc),a1
	move.l	#BootSize,d0

	jsr	FreeMem(a6)

CloseIntuition:
	move.l	IntuitionBase(pc),a1
	jsr     CloseLibrary(a6)

Error:
	rts			;ende

NotEqual:
	moveq	#1,d0
	moveq	#45,d1
	lea	AlarmotherBoot(pc),a0
	move.l	IntuitionBase(pc),a6
	jsr	DisplayAlert(a6)

	tst.w	d0			; Continue gedrueckt
	beq.s	JmpMotorOff
	
	move.w	#BootSize/4-1,d0

	lea	BootBlock(pc),a0
	move.l	PointDiskBuff(pc),a1

CopyBootBlock:
	move.l	(a0)+,(a1)+		; alten BootBlock ins ChipRam
	dbra	d0,CopyBootBlock	; kopieren

WriteBootBlock:
	lea	DiskIO(pc),a1

	move.w	#3,28(a1)	;Command: Write

	move.l	ExecBase,a6	;Exec-Basisadresse
	jsr	DoIO(a6)	;Sektor lesen

	move.w	#4,28(a1)	;Command: UpDate
	jsr	DoIO(a6)		;Sektor lesen

	tst.b	DiskIO+31	;kein Fehler beim Saven
	bne.s	SaveBootError

	move.w	#5,28(a1)	;Command: Clear
	jsr	DoIO(a6)		;TrackBuffer ungültig

	bra.L	ReadBootBlock	; Nochmal Lesen

SaveBootError:
	moveq	#1,d0
	moveq	#45,d1

	lea	CheckDiskDrive(pc),a0
	move.l	IntuitionBase(pc),a6
	jsr	DisplayAlert(a6)

	tst.w	d0
	bne.s	WriteBootBlock

JmpMotorOff:
	bra.L	MotorOff

Killer:
	move.l	ExecBase,a6

	clr.l	42(a6)
	clr.l	46(a6)
	clr.l	50(a6)

	clr.l	550(a6)
	clr.l	554(a6)

	cmp.w	#$fc,148(a6)
	beq.s	NotChanced

	clr.l	148(a6)	; Entschuldigung

NotChanced:
	moveq	#1,d0
	moveq	#45,d1

	lea	DoResetKill(pc),a0
	move.l	IntuitionBase(pc),a6
	jsr	DisplayAlert(a6)

	tst.w	d0
	beq.L	AllocateMemory

ResetKiller:
		; was hier geschieht ist ganz link und unschön
		; aber es wird wirklich alles geloescht!

	move.w	#$7fff,$dff09a	; DMA und Interrupt Sperren
	move.w	#$7fff,$dff096

	moveq	#Z2-Z1/4-1,d0	; Löschroutine ans Speicherende
	lea	ToCopy(pc),a0	; kopieren
	lea     $7ffd0,a1
	move.l	a1,a2

Loop1:
	move.l	(a0)+,(a1)+
	dbra	d0,Loop1
	jmp	(a2)		; und ausführen

Z1:
ToCopy:
	sub.l	a0,a0		; 0 (Chip Mem)
	lea	$c00000,a1	; 512K Erweiterung

	move.l	#$7ffd0/4,d0

Loop2:	move.w	d0,$dff180	; damit man was Sieht

	clr.l	(a0)+
	clr.l	(a1)+

	subq.l	#1,d0
	bne.s	Loop2

	jmp	$f80002

	align	4
Z2:

IntuitionBase:
IntuitionName:	dc.b	"intuition.library",0
	align	2

AlarmotherBoot:
	dc.b	0,110,20,"Warning ! There is an other BootBlock "
	dc.b	"on this Disk",0,-1
	dc.b	0,90,30,"Re-Write BootBlock",0,-1
	dc.b	1,210,30,"Continue",0,0
	align	2

CheckDiskDrive:
   dc.b	0,160,20," --- Please check your disk & drive ---",0,-1
	dc.b	0,100,30,"Retry",0,-1
	dc.b	1,250,30,"Cancle",0,0
	align	2

ALVirus:dc.b	0,170,20,"Warning !  Perhaps a Virus"
	dc.b	" in Memory",0,$ff
	dc.b	0,140,30,"KILL",0,$ff
	dc.b    1,200,30,"Continue",0,0
	align	2

DoResetKill:dc.b 0,255,18,"CLEAR Memory",0,$ff
	dc.b	0,140,28,"YES ",0,$ff
	dc.b    1,220,28,"NO",0,0
	align	2

TrdDevice:	dc.b	"trackdisk.device",0
	align	4

PointDiskBuff:	dc.l	0	

DiskIO:		blk.l	20,0
readreply:	blk.l	8,0

BootBlock:	blk.b	1024,"x"
