*SOURCE*


****** Protect Boot pour Boot-Master ******


* Version 2


* But:Proteger un boot-block en le lisant puis en le comparant a un autre
* boot-block sauvé auparavant en fichier sur le disk (fichier 'Boot-Block').
* Si le fichier 'Boot-Block' n'est pas trouvé,le prog. demandera s'il peut
* en créer un.

* Se lance uniquement du CLI.
* Commande à mettre dans la Startup-Sequence de la disquette à protéger
* (en première commande).


**************** Macros ****************


print:		MACRO

		movem.l	d0-d7/a0-a6,-(a7)
		move.l	dosbase,a6
		move.l	output,d1
		move.l	#\1,d2			; le texte
		move.l	#\2,d3			; la longueur
		jsr	-48(a6)			; write
		movem.l	(a7)+,d0-d7/a0-a6

		ENDM


************** Fin Macros **************

	section	prog,code

Protect:

	bsr	openlibrary		; ouvre le nécessaire
	cmp.l	#-1,d7			; une erreur a l'ouverture ?
	bne.s	lib_ok			; non

	tst.l	output
	beq	fin2

	print	err_lib,err_lib2	; affiche l'erreur

	bra	fin2			; au revoir
lib_ok:


	bsr	loadfile		; charge le boot-block en fichier
	cmp.l	#-1,d7
	bne.s	file_ok			; oui

	print	err_file,err_file2

	print	save_boot,save_boot2
	
mouse:	btst	#6,$bfe001		; souris gauche
	beq	save_bb
	btst	#10,$dff016		; souris droite
	bne.s	mouse

	bra	fin2

file_ok:
	bsr	opentrackdisk		; ouvre le trackdisk du DF0:
	cmp.l	#-1,d7			; une erreur
	bne.s	track_ok		; non
no_track:
	print	err_track,err_track2
	
	bra	fin2

track_ok:

	bsr	loadboot		; charge le boot-block
	cmp.l	#-1,d7
	bne.s	boot_ok
no_boot:
	print	err_boot,err_boot2

	bra	fin
boot_ok:
	bsr	compareboot		; on le compare avec le fichier
fin:
	bsr	closetrackdisk		; ferme le trackdisk du DF0:
fin2:
	bsr	closelibrary		; ferme les librairies

	moveq	#0,d0

	rts				; on sort


************** Sous programmes **************


save_bb:
	bsr	opentrackdisk		; ouvre le trackdisk du DF0:
	cmp.l	#-1,d7			; une erreur
	beq	no_track		; oui

	bsr	loadboot		; charge le boot-block
	cmp.l	#-1,d7			; une erreur
	beq	no_boot			; oui

	print	saving,saving2

	move.l	dosbase,a6
	move.l	#1006,d2		; mode new=écriture
	move.l	#file_name,d1		; nom à charger
	jsr	-30(a6)			; open
	move.l	d0,filehd		; save filehandle
	beq	error_bb		; une erreur

	move.l	d0,d1
	move.l	#1024,d3		; longueur
	move.l	#buffer_disk,d2
	jsr	-48(a6)			; write

	move.l	filehd,d1
	jsr	-36(a6)			; close

	print	ok,ok2

	bra	fin

error_bb:
	print	err,err2
	bra	fin


compareboot:
	move.l	buffer_file+4,d0	; compare la
	move.l	buffer_disk+4,d1	; checksum
	move.l	buffer_file,d2		; et autre
	move.l	buffer_disk,d3
	move.l	buffer_file+1020,d4
	move.l	buffer_disk+1020,d5

	add.l	d2,d0
	add.l	d3,d1
	add.l	d4,d0
	add.l	d5,d1

	cmp.l	d0,d1
	beq.s	nothing			; rien a signaler

	bsr	do_alert
	tst.l	d0
	bne.s	nothing			; on veut pas ecrire	

	bsr	update			; la on veut bien !
nothing:
	rts



do_alert:				; effectue une alerte intuition
					; (comme un GURU)
	move.l	intuitionbase,a6
	move.l	#80000000,d0		; code alerte
	move.l	#alerttext,a0		; texte de l'alerte
	move.l	#35,d1			; hauteur de l'alerte
	jsr    -$5a(a6)			; do alert

	rts



loadboot:				; charge le boot de la disquette
	lea	diskio,a1
	move.w	#2,28(a1)		; mode lecture
	move.l	#buffer_disk,40(a1)	; buffer
	move.l	#2*512,36(a1)		; longueur a charger
	move.l	#0*512,44(a1)		; No de block
	move.l	4,a6
	jsr	-456(a6)		; doio

	bsr	arret
	rts
	

arret:					; arrête le moteur du lecteur
	lea	diskio,a1
	move.l	#0,36(a1)		; OFF
	move.w	#9,28(a1)		; commande moteur
	move.l	4,a6
	jsr	-456(a6)		; doio
	rts

update:					; écrit sur le boot-block
	lea	diskio,a1
	move.w	#3,28(a1)		; commande write
	move.l	#buffer_file,40(a1)	; buffer
	move.l	#2*512,36(a1)		; longueur
	move.l	#0*512,44(a1)		; offset
	move.l	4,a6
	jsr	-456(a6)		; doio
	lea	diskio,a1
	move.w	#4,28(a1)		; commande update
	jsr	-456(a6)		; doio

	bsr	arret			; arrête le moteur

	rts



opentrackdisk:				; ouvre le trackdisk du DF0:

	move.l	4,a6
	sub.l	a1,a1			; trouve notre tåche
	jsr	-294(a6)		; findtask
	move.l	d0,diskrep+$10
	lea	diskrep,a1		; crée notre port-message
	jsr	-354(a6)		; addport
	lea	diskio,a1
	move.l	#diskrep,14(a1)
	clr.l	d0			; unité 0
	clr.l	d1			; flag
	lea	trddevice,a0
	jsr	-444(a6)		; opendevice
	tst.l	d0
	bne	error			; une erreur

	clr.l	d7
	rts


closetrackdisk:				; libère le trackdisk du DF0:

	move.l	4,a6
	lea	diskio,a1
	jsr	-450(a6)		; closedevice
	lea	diskrep,a1
	jsr	-360(a6)		; remove port

	rts


closelibrary:				; ferme les librairies ouvertes
	move.l	4,a6

	tst.l	dosbase			; la dos.library était-elle ouverte
	beq.s	no_dos			; non

	move.l	dosbase,a1
	jsr	-414(a6)		; close lib
no_dos:
	tst.l	intuitionbase
	beq.s	no_itui
	move.l	intuitionbase,a1
	jsr	-414(a6)		; close lib
no_itui:
	rts


openlibrary:
	move.l	4,a6
	lea	dosname,a1		; la dos.library
	moveq	#0,d0			; n'importe-quelle version
	jsr	-552(a6)		; openlib
	move.l	d0,dosbase		; sauve la base de la librarie
	beq	error			; une erreur
	lea	intuitionname,a1	; intuition.library
	moveq	#0,d0			; version
	jsr	-552(a6)		; openlib
	move.l	d0,intuitionbase
	beq	error

	tst.l	dosbase
	beq.s	no_dosbase

	move.l	dosbase,a6		; chercher la sortie standard du CLI
	jsr	-60(a6)			; output
	move.l	d0,output
no_dosbase:
	clr.l	d7			; tout est ok
	rts


loadfile:
	move.l	dosbase,a6
	move.l	#1005,d2		; mode old=lecture
	move.l	#file_name,d1		; nom à charger
	jsr	-30(a6)			; open
	move.l	d0,filehd		; save filehandle
	beq	error			; une erreur

	move.l	d0,d1
	move.l	#1024,d3		; longueur
	move.l	#buffer_file,d2
	jsr	-42(a6)			; read

	move.l	filehd,d1
	jsr	-36(a6)			; close

	clr.l	d7
	rts

error:
	move.l	#-1,d7
	rts



***************** Donnees 1 ****************


dosname:	dc.b	"dos.library",0
intuitionname:	dc.b	"intuition.library",0

file_name:	dc.b	"Boot-block",0
trddevice:	dc.b	"trackdisk.device",0

alerttext:
	dc.b 	10,40,10
	dc.b	"    Your boot-block is apparently destroyed"
	dc.b	",maybe by a virus ...",0,1
	dc.b	10,40,20
	dc.b	"    Left=continue                "
	dc.b	"Right=write the real boot-block ",0,0

err_lib:
	dc.b	"Error while opening a library ...",10
err_lib2=*-err_lib

err_track:
	dc.b	"Error while opening trackdisk ...",10
err_track2=*-err_track

err_file:
	dc.b	"Error ! I can't find the file called 'Boot-block'",10
err_file2=*-err_file 

err_boot:
	dc.b	"Error while reading boot-block ...",10
err_boot2=*-err_boot

save_boot:
	dc.b	"Save the DF0: boot-block as file 'Boot-block' ?",10
	dc.b	"Left mouse -> Save          Right mouse -> Skip",10
save_boot2=*-save_boot

saving:
	dc.b	"Saving boot-block ... in file ...",10
saving2=*-saving

err:
	dc.b	"Error !",10
err2=*-err

ok:
	dc.b	"Ok .",10
ok2=*-ok


***************** Donnees 2 ****************

	section	donnees,bss_c


	even
dosbase:
	ds.l	1
intuitionbase:
	ds.l	1
filehd:
	ds.l	1
output:
	ds.l	1

buffer_file:
	ds.b	1024
diskio:
	ds.l	20
diskrep:
	ds.l	8
buffer_disk:
	ds.b	1024


*END SOURCE*

