;==============================================================================
;
;                          B E R S E R K E R  5.02
;                          +++++++++++++++++++++++
;
;               © Copyright 1988, 1989, 1990 by Ralf Thanner
;
;   The code is entirely written in assembler for the Kuma Seka assembler
;
;===============================  BERSERKER  ==================================
;
; IMPORTANT  NOTICE:   This program is (c) Copyright by Ralf Thanner, but can
; be FREELY DISTRIBUTED, providing that the following rules are respected.
;
;  - No change is made to the program nor to the accompaning documentation.
;
;  - Every  form  of distribution is allowed and encouraged, but no fee can
;    be charged for this program except for, possibly, the cost of magnetic
;    media.
;
;  - The package is always distributed in its complete form consisting of 4
;    files:     'BERSERKER',   'BERSERKER-HANDLER',   'BERSERKER.Doc'   and
;    'BERSERKER.S'.
;
; By  copying,  distributing  and/or using the program you indicate your
; acceptance of the above rules.
;
;==============================================================================
;
;
;   	V5.02	- again fine tuning.
;		  CLI PARAMETER CHECK recognizes now TAB's.
;
;		- new handler version -> V1.5
;
;=============================================================================
forbid		EQU	-132	; 	Exec.library
permit		EQU	-138
allocmem	EQU	-198
freemem		EQU	-210
availmem	EQU	-216
findname	EQU	-276
addtask		EQU	-282
findtask	EQU	-294
settaskpri	EQU	-300
getmsg		EQU	-372
replymsg	EQU	-378
waitport	EQU	-384
findport	EQU	-390
closelib	EQU	-414
openresource	EQU	-498
openlib		EQU	-552
open		EQU	-30	;	Dos.library
close		EQU	-36
read		EQU	-42
write		EQU	-48
output		EQU	-60
seek		EQU	-66
delete		EQU	-72
loadseg		EQU	-150
unloadseg	EQU	-156
delay		EQU	-198
mode_old	EQU	1005
mode_new	EQU	1006
clearmenustrip	EQU	-54	;	Intuition.library
closwindow	EQU	-72
dispalert	EQU	-90
drawborder	EQU	-108
openwindow	EQU	-204
printitext	EQU	-216
setwindowtitles	EQU	-276
;=============================================================================
NULL		EQU 	$00000000	;	FLAGS USED BY POWERWINDOW
MENUNULL	EQU 	$00000000
WBENCHSCREEN	EQU	$00000001
CUSTOMSCREEN	EQU	$0000000f
MENUENABLED	EQU	$00000001
MIDRAWN		EQU	$00000100
SIZEVERIFY	EQU	$00000001	;	IDCMP - FLAGS
NEWSIZE		EQU	$00000002
REFRESHWINDOW	EQU	$00000004
MOUSEBUTTONS	EQU	$00000008
MOUSEMOVE	EQU	$00000010
GADGETDOWN	EQU	$00000020
GADGETUP	EQU	$00000040
REQSET		EQU	$00000080
MENUPICK	EQU	$00000100
CLOSEWINDOW	EQU	$00000200
RAWKEY		EQU	$00000400
REQVERIFY	EQU	$00000800
REQCLEAR	EQU	$00001000
MENUVERIFY	EQU	$00002000
NEWPREFS	EQU	$00004000
DISKINSERTED	EQU	$00008000
DISKREMOVED	EQU	$00010000
WBENCHMESSAGE	EQU	$00020000
ACTIVEWINDOW	EQU	$00040000
INACTIVEWINDOW	EQU	$00080000
DELTAMOVE	EQU	$00100000
VANILLAKEY	EQU	$00200000
INTUITICKS	EQU	$00400000
LONELYMESSAGE	EQU	$80000000
WINDOWSIZING	EQU	$00000001	;	WINDOW TYPE
WINDOWDRAG	EQU	$00000002
WINDOWDEPTH	EQU	$00000004
WINDOWCLOSE	EQU	$00000008
SIZEBRIGHT	EQU	$00000010
SIZEBOTTOM	EQU	$00000020
SMART_REFRESH	EQU	$00000000
SIMPLE_REFRESH	EQU	$00000040
SUPER_BITMAP	EQU	$00000080
BACKDROP	EQU	$00000100
REPORTMOUSE	EQU	$00000200
GIMMEZEROZERO	EQU	$00000400
BORDERLESS	EQU	$00000800
ACTIVATE	EQU	$00001000
WINDOWACTIVE	EQU	$00002000
INREQUEST	EQU	$00004000
MENUSTATE	EQU	$00008000
RMBTRAP		EQU	$00010000
NOCAREREFRESH	EQU	$00020000
WINDOWREFRESH	EQU	$01000000
WINDOWTICKED	EQU	$04000000
WBENCHWINDOW	EQU	$02000000
RP_JAM1		EQU	$00000000	; 	TEXTMODI
RP_JAM2		EQU	$00000001
RP_COMPLEMENT	EQU	$00000002
RP_INVERSIZED	EQU	$00000004
HIGHIMAGE	EQU	$00000000	;	MENU ITEM
CHECKIT		EQU	$00000001
ITEMTEXT	EQU	$00000002
COMMSEQ		EQU	$00000004
MENUTOGGLE	EQU	$00000008
ITEMENABLED	EQU	$00000010
HIGHCOMP	EQU	$00000040
HIGHBOX		EQU	$00000080
HIGHNONE	EQU	$000000C0
CHECKED		EQU	$00000100
BOOLGADGET	EQU	$00000001	; GADGET TYPE
GADGET0002	EQU	$00000002
PROPGADGET	EQU	$00000003
STRGADGET	EQU	$00000004
SIZING		EQU	$00000010	; SYSTEM GADGETS
WDRAGGING	EQU	$00000020
SDRAGGING	EQU	$00000030
WUPFRONT	EQU	$00000040
SUPFRONT	EQU	$00000050
WDOWNBACK	EQU	$00000060
SDOWNBACK	EQU	$00000070
gCLOSE		EQU	$00000080
REQGADGET	EQU	$00001000	; TYPES
GZZGADGET	EQU	$00002000
SCRGADGET	EQU	$00004000
SYSGADGET	EQU	$00008000
GADGHCOMP	EQU	$00000000	; HIGHLIGHT TECHNIQUE
GADGHBOX	EQU	$00000001
GADGHIMAGE	EQU	$00000002
GADHHNONE	EQU	$00000003
GADGHIGHBITS	EQU	$00000003
GADIMAGE	EQU	$00000004
GRELBOTTOM	EQU	$00000008	; LEFT & TOP COORDINATES
GRELRIGHT	EQU	$00000010
GRELWIDHT	EQU	$00000020
RELVERIFY	EQU	$00000001	; GADGET ACTIVATION FLAGS
GADGIMMEDIATE	EQU	$00000002
ENDGADGET	EQU	$00000004
FOLLOWMOUSE	EQU	$00000008
RIGHTBORDER	EQU	$00000010
LEFTBORDER	EQU	$00000020
TOPBORDER	EQU	$00000040
BOTTOMBORDER	EQU	$00000080
TOGGLESELECT	EQU	$00000100
STRINGCENTER	EQU	$00000200
STRINGRIGHT	EQU	$00000400
LONGINT		EQU	$00000800
ALTKEYMAP	EQU	$00001000
;=============================================================================

POWERUP
	movem.l		d0-d7/a0-a6,-(a7)

	LEA		VAR(PC),A5
	move.l		$04.w,a6
	suba.l		a1,a1
	jsr	findtask(a6)
	move.l		d0,a4
	move.l		d0,mytask-VAR(A5)
	tst.l		$ac(a4)
	bne.s	cli_call
	lea		$5c(a4),a0
	jsr	waitport(a6)
	lea		$5c(a4),a0
	jsr	getmsg(a6)
	move.l		d0,message-var(a5)
	not.b		launch-var(a5)
	movem.l 	(a7)+,d0-d7/a0-a6
	LEA		VAR(PC),A5
	bra.L	workbench

* CLI-PARAMETER HANDLER

cli_call
	movem.l 	(a7)+,d0-d7/a0-a6
	LEA		VAR(PC),A5
	subq		#1,d0
	beq.s	no_cli_parameter
which_parameter
	cmp.b		#$20,(a0)+
	bne.s	parameter_found
	dbra		d0,which_parameter
	bra.s	no_cli_parameter
parameter_found
	move.b		-(a0),d1	
	cmp.b		#$09,d1
	beq.s	TAB
	cmp.b		#'?',d1
	beq.L	instructions
	cmp.b		#'C',d1
	beq.s	no_cold
	cmp.b		#'c',d1
	beq.s	no_cold
	cmp.b		#'I',d1
	beq.s	install_it
	cmp.b		#'i',d1
	beq.s	install_it
	cmp.b		#'R',d1
	beq.s	remove_it
	cmp.b		#'r',d1
	beq.s	remove_it
	bne.s	no_cli_parameter
TAB
	addq.l		#1,a0
	bra.s	which_parameter
no_cold
	addq.l		#1,a0
	not.b		no_killy-VAR(a5)
	bra.s	which_parameter
install_it
	addq.l		#1,a0
	not.b		launcher-VAR(a5)
	bra.s	which_parameter
remove_it
	addq.l		#1,a0
	not.b		remover-VAR(a5) 
	bra.s	which_parameter

no_cli_parameter

	move.l		$04.w,a6
	jsr	FORBID(a6)		; forbid all tasks

	bsr.L	open_libs
	bsr.L	test_lib
	bsr.L	open_output

	tst.w		kickflag-VAR(a5)
	bne.s	wrong_kick
	bsr.L	kill_viruses

	tst.b		virusflag-VAR(a5)
	bne.s	exit4			; Lucky ones...
	move.l		#mes0,d2
	move.l		#mes0length,d3
 	bsr.L	writer
	bra.s	exit3

exit4:	bsr.L	alert			; Virus found

exit3:	tst.b		launcher-VAR(a5)
	beq.s	exit6
	bsr.L	loader
	bra.s	exit7
exit6:	tst.b		remover-VAR(a5)
	beq.s	exit7
	bsr.L	un_load
exit7:	move.l		$04.w,a6
	jsr     PERMIT(a6)		; Allow other tasks
exit5:	bsr.L	close_libs
	moveq		#00,d0
	rts

wrong_kick
	move.l		#mes17,d2
	move.l		#mes17length,d3
 	bsr.L	writer
	bra.s	exit3

exit_workbench
	bsr.L	close_libs
	move.l		$04.w,a6
	jsr	forbid(a6)
	move.l		message(pc),a1
	jsr	replymsg(a6)
	moveq		#00,d0		; For clear entry into CLI
	rts				; Back to CLI...

************************* SUB ROUTINES *********************************

WORKBENCH
	bsr.L	open_libs
	bsr.L	test_lib
	bsr.L	INIT

WORK:	bsr.L	wait_port_get_msg_reply_msg_auswertung_msg
	tst.b		leave_it-VAR(a5)	; window close
	bne.s	work_leave1
	move.l		dosbase(pc),a6
	move.l		#$0a,d1
	jsr	delay(a6)		
	bra.s	work	
work_leave1
	move.l		intbase(pc),a6
	move.l		windowhandle(pc),a0
	jsr	closwindow(a6)

	bra.l	exit_workbench

wait_port_get_msg_reply_msg_auswertung_msg
	move.l		$04.w,a6
	move.l		userport(pc),a0
	jsr	waitport(a6)
	move.l 		userport(pc),a0
	jsr	getmsg(a6)
	move.l		d0,a0
	add.l		#$14,a0
	lea		message_list(pc),a1
	move.l		(a0)+,(a1)+
	move.l		(a0)+,(a1)+
	move.l		(a0)+,(a1)+
	move.l		d0,a1
	jsr	replymsg(a6)
	lea 		message_list(pc),a0
	move.l		(a0)+,d0
	cmp.w		#$200,d0	; closewindow
	beq.s	message_auswertung2
	cmp.w		#$40,d0		; gadup
	beq.s	message_auswertung1
	rts
message_auswertung2
	not.b	leave_it-VAR(A5)
	rts
message_auswertung1
	addq		#4,a0
	move.l		(a0),a1

gad_auswertung
	lea		gad_table(pc),a0
	moveq		#0,d0
gad_auswertung0
	cmp.l		(a0)+,a1
	beq.s	main_auswertung
	addq		#1,d0
	bra.s	gad_auswertung0

main_auswertung
	tst.w		d0
	beq.s	kill_em
	cmp.w		#1,d0
	beq.L	loader
	cmp.w		#2,d0
	beq.L	un_load
	cmp.w		#3,d0
	beq.L	workbench_instructions
	not.b	leave_it-VAR(A5)
	rts

kill_em
	move.l		$04.w,a6
	jsr	forbid(a6)
	tst.w		kickflag-VAR(a5)
	bne.s	kill_em2
	bsr.L	kill_viruses
	tst.b		virusflag-VAR(a5)
	beq.s	kill_em1

	bsr.L	alert
	clr.b		virusflag-VAR(a5)
	bra.s	kill_em2
kill_em1
	lea		Itext11(pc),a0
	bsr.L	write_text
kill_em2
	move.l		$04.w,a6
	jsr     permit(a6)		; Allow it all
	rts


* from WORKBENCH it's 'left mouse' & from CLI it's 'RETURN'

workbench_instructions
	bsr.L	open_con
	bsr.L	instructions0
	move.l		#mes215,d2		; press mouse
	move.l		#mes215length,d3
	bsr.L	writer
	bsr.L	right_mouse_button		; mit delay
	bsr.L	close_con
	rts
instructions
	bsr.L	test_pal
	bsr.L	open_libs
	bsr.L	open_output
	tst.w		pal-VAR(a5)
	bne.s	instructions2
	move.l		#mes15,d2	; Prints out the instructions
	move.l		#mes15length,d3
	bsr.L	writer
	bra.L	exit5
instructions2
	bsr.s	instructions0
	bra.L	exit5

instructions0
	move.l		#mes15,d2		; first part
	move.l		#mes115length,d3
	bsr.L	writer
	tst.b	launch
	bne.s	instructions01			; workbench-> mouse
	move.l		#mes415,d2		; press return
	move.l		#mes415length,d3
	bsr.L	writer
	bsr.L	read_con
	bra.s	instructions02
instructions01
	move.l		#mes215,d2		; press mouse
	move.l		#mes215length,d3
	bsr.L	writer
	bsr.L	right_mouse_button
instructions02
	move.l		#con_error,d2		; clear it
	move.l		#con_clear-con_error,d3
	bsr.L	writer
	move.l		#mes115end,d2		; second part
	move.l		#mes315length,d3
	bra.L	writer


un_load
	move.l		$04.w,a6
	lea		task_name(pc),a1
	jsr	findtask(a6)
	tst.l		d0
	beq.s	nix_un_load
	move.l		d0,a0
	jsr	$5c(a0)			; EXIT-TC
	move.l		dosbase(pc),a6
	jsr	unloadseg(a6)
	tst.l		message-VAR(a5)		; workbench start
	bne.s	un_load1			; nix dos-write
	move.l		#mes21,d2
	move.l		#mes21length,d3
 	bra.L	short_writer
un_load1
	lea		mes21(pc),a0
	bra.L	write_text

nix_un_load
	tst.l		message-VAR(a5)
	bne.s	nix_un_load1
	move.l		#mes20,d2
	move.l		#mes20length,d3
 	bra.L	short_writer
nix_un_load1
	lea		mes20(pc),a0
	bra.L	write_text
loader
	move.l		$04.w,a6
	lea		task_name(pc),a1
	jsr	findtask(a6)
	tst.l		d0
	bne.s	nix_load

	move.l		dosbase(pc),a6

	lea		name(pc),a0
	move.l		a0,d1
	jsr	loadseg(a6)
	tst.l		d0
	beq.L	loader_error
	move.l		d0,d1
	add.l		d0,d0
	add.l		d0,d0
	addq.l		#4,d0
	move.l		d0,a4

	move.l		$04.w,A6
	move.l		dosbase(pc),a0
	move.l		d1,a1
	move.l		intbase(pc),a2
	move.l		trackdisk(pc),a3
	jsr	$5a(a4)	

	tst.b		launch-VAR(a5)
	bne.s	loader1

	move.l		#mes22,d2
	move.l		#mes22length,d3
 	bra.L	short_writer
loader1
	lea		mes22(pc),a0
	bra.L	write_text

nix_load
	tst.b		launch-VAR(a5)
	bne.s	nix_load1
	move.l		#mes23,d2
	move.l		#mes23length,d3
 	bra.L	short_writer
nix_load1
	lea		mes23(pc),a0
	bra.L	write_text
loader_error
	tst.b		launch-VAR(a5)
	bne.s	loader_error1
	move.l		#mes19,d2
	move.l		#mes19length,d3
 	bra.L	writer
loader_error1
	lea		mes25(pc),a0
	bra.s	write_text

*****************************************************************************
INIT
	moveq		#-3,d0
set_task_pri
	move.l		mytask(pc),a1
	move.b		d0,newtaskpri-VAR(A5)
	jsr	settaskpri(a6)
open_window
	move.l		intbase(pc),a6
	lea		NewWindowStructure1(pc),a0
	jsr	openwindow(a6)
	move.l		d0,windowhandle-VAR(A5)
	move.l		d0,a0
get_my_port
	move.l		86(a0),userport-VAR(A5)
	move.l		50(a0),my_rastport-VAR(A5)
draw_border
	lea		border(pc),a1
	move.l		my_rastport(pc),a0
	move.w		#2,d0
	move.w		#110,d1
	jmp	drawborder(a6)
test_lib
	move.l		dosbase(pc),a0
	move.w		$14(a0),d1
	cmp.w		#35,d1			; darf nicht OS 2.0 sein
	ble.s	yo_lib
	not.w		kickflag-VAR(a5)
yo_lib:	rts

write_text
	lea		IntText(pc),a1
	move.l		a0,12(a1)
	move.l		intbase(pc),a6
	move.l		my_rastport(pc),a0
	moveq		#0,d0
	moveq		#0,d1
	jmp	printitext(a6)
open_output
	move.l		Dosbase(pc),a6
	jsr	output(a6)
	move.l		d0,handle-VAR(a5)
	rts
open_con
	move.l		Dosbase(pc),a6
	move.l		#con,d1
	move.l		#mode_old,d2
	jsr	open(a6)
	LEA		VAR(pc),A5
	move.l		d0,handle-VAR(a5)
	rts
close_con
	move.l		Dosbase(pc),a6
	move.l		handle-VAR(a5),d1
	jmp	close(a6)
test_pal
	move.l		$04.w,a6
	cmp.b		#$32,530(a6)
	beq.s	test_pal1
	not.w		pal-VAR(a5)
test_pal1
	rts
writer:	move.l		Dosbase(pc),a6
	move.l		handle(pc),d1
	jmp	write(a6)

short_writer				; to avoid two messages in memory..
	move.l		Dosbase(pc),a6
	move.l		handle(pc),d1
	jsr	write(a6)
	move.l		handle(pc),d1
	move.l		#mes24,d2
	move.l		#mes24length,d3
	jmp	write(a6)

writer1:move.l		Dosbase(pc),a6
	move.l		handle(pc),d1
	jsr	write(a6)
	move.l		handle(pc),d1
	move.l		#mes,d2
	move.l		#meslength,d3
	jmp	write(a6)

alert:	lea		alert1(pc),a0
calert:	move.l		Intbase(pc),a6
 	moveq		#00,d0		; Recovery Alert
 	move.l 		#28,d1
 	jmp 	dispalert(a6)

killcold_cool
	tst.b		no_killy-VAR(a5)
	bne.s	kcc3
	move.l		$04.w,a6
	clr.l		46(a6)	; cool-capture normal
	clr.l		42(a6)	; cold-capture normal
	clr.l		50(a6)
	lea		34(a6),a0	; New execbase checksum
	moveq		#0,d0
	moveq		#$17,d1
kcc1:	add.w		(a0)+,d0
	dbf	d1,kcc1
	not.w		d0
	move.w		d0,(a0)
kcc3:	rts

tracker
	move.l		$04.w,a6
	lea		350(a6),a0
	lea		Trddevice(pc),a1	; Searches
	jsr	findname(a6)			; for trackdisk.device
	move.l		d0,a0
	sub.l		#28,a0			; that's the most used
	move.l		a0,trackdisk-VAR(a5)
	rts					; pointer in trd.dev...

filler:	lea		$400(a0),a1
fill1:	clr.l		(a0)+
	cmpa.l		a0,a1
	bge.s	fill1
	rts

clear_kicktag
	move.l  	$04.w,a6
	clr.l		554(a6)		; Kickchecksum
	clr.l		550(a6)		; Kicktagptr
	clr.l		546(a6)		; Kickmemptr
	rts

open_libs
	move.l		$04.w,a6
	lea.l		Dosname(pc),a1
	bsr.s		open_libs1
	move.l		d0,dosbase-VAR(a5)

	lea.l		expname(pc),a1	; expansion
	bsr.s		open_libs1
	move.l		d0,expbase-VAR(a5)

	lea.l		Intname(pc),a1
	bsr.s		open_libs1
	move.l 		d0,IntBase-VAR(a5)

	lea.l		layname(pc),a1
	bsr.s		open_libs1
	move.l		d0,laybase-VAR(a5)

	lea.l		gfxname(pc),a1
	bsr.s		open_libs1
	move.l 		d0,gfxBase-VAR(a5)
	rts
open_libs1
	moveq		#$21,d0
	jmp	openlib(a6)

close_libs
	move.l		$04.w,a6
	move.l		dosbase(pc),a1
	bsr	close_libs2
	move.l 		IntBase(pc),a1
	bsr	close_libs2
	move.l		gfxbase(pc),a1
	bsr	close_libs2
	move.l		laybase(pc),a1
	bsr	close_libs2
	move.l 		expBase(pc),a1
	bsr	close_libs2
	rts
close_libs2
	jmp     closelib(a6)

right_mouse_button
	move.l		dosbase(pc),a6
right_mouse_button1
	move.l		#$0a,d1
	jsr		delay(a6)
	btst		#10,$dff016
	bne.s		right_mouse_button1
	rts

read_con
	clr.w		input_buffer-VAR(A5)
	move.l		dosbase(pc),a6
	move.l		handle(pc),d1
	move.l		#input_buffer,d2
	move.l		#2,d3	; nur ein zeichen
	jsr		read(a6)
	move.b		input_buffer-VAR(a5),d0
	cmp.b		#$0a,d0				; wenn ich RETURN
	bne.s	read_con				; schreibe, meine
	rts						; ich es auch so..

********************  L I B  C H E C K E R  *****************************

lib_checker
	lea		layname(pc),a2
	move.l		laybase-VAR(a5),a0
	bsr.s	lib_check
	lea		expname(pc),a2
	move.l		expbase-VAR(a5),a0
	bsr.s	lib_check
	lea		gfxname(pc),a2
	move.l		gfxbase-VAR(a5),a0
	bsr.s	lib_check
	lea		intname(pc),a2
	move.l		intbase-VAR(a5),a0
	bsr.s	lib_check
	lea		exename(pc),a2
	move.l		$04.w,a0	; execbase
	bra.s	lib_check
lib_check
	cmp.l		#0,a0
	beq.s	lib_check_ende
	moveq		#0,d0
	moveq		#0,d1
	moveq		#0,d2
	move.l		a0,a1
	move.w		$10(a1),d0	; laenge vor knoten
	move.w		$1c(a1),d2	; checksum	
	lsr.w		#1,d0		; for dbf
	bra.s	lib_check2
lib_check1
	add.w		-(a0),d1
lib_check2
	dbf	d0,lib_check1
	cmp.w		d1,d2
	beq.s	lib_check_ende
	bsr.s	lib_checker_alert
lib_check_ende
	rts

lib_checker_alert
	lea		alert4(pc),a0
lib_checker_alert1
	move.b		(a2)+,(a0)+
	bne.s	lib_checker_alert1
	move.b		#$20,-(a0)
	lea		alert3(pc),a0
	bra.L	calert
**************************************************************************
kill_viruses
	lea		VAR(pc),a5
	bsr.L	jack			; The Traveling JACK
	bsr.L	centurion
	bsr.l	disaster_master
	bsr.L	Xeno			; XENO - Link
	bsr.L	revenge			; REVENGE (old one)	
	bsr.L	revenge_boot		; REVENGE - BOOTLOADER
	bsr.L	gadaffi			; Gadaffi
	bsr.L	disk_doctor		; Disk Doctor
	bsr.L	sca			; Checks for SCA & mutants
	bsr.L	dasa			; Checks for Byte Warrior
	bsr.L	irq			; Link
	bsr.L	bsg			; Link
	bsr.L	exterminator
	bsr.L	bytebandit
	bsr.L	killcold_cool
	bsr.L	lib_checker
	rts			
******************* V I R U S  K I L L I N G  P A R T ********************
jack:	; improved to find also the mutant version
	move.l		dosbase(pc),a0	
	move.l		46(a0),a1	; pointer to jack

	move.l		(a1)+,d0
	cmp.l		#$48e7fffe,d0
	bne.s	no_jack
	addq.l		#4,a1	
	move.l		(a1),d0
	cmp.l		#$0c000001,d0
	bne.s	no_jack			; no jack anymore  he he
	move.l		#$4e714e71,(a1)+
	move.w		#$4e71,(a1)
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	jack1
	move.l		#mes18,d2
	move.l		#mes18length,d3
	bra.L	writer1
no_jack:rts
jack1
	lea		vir0(pc),a0
	bra.L	write_text

***************************************************************************
*	The Traveling JACK
*
*	you can wipe him out with a reset..
*	he changes the dos.lib jump tab.. 
*	(meine hochachtung fuer die routinen, hat richtig spass gemacht)
*	he tries to infect a file..
*	when he is installed, he tries to write his 'VIRUS.xx' file to
*	the disk. each time a programm access the drive he write his
*	stupid text.
***************************************************************************
centurion:
	move.l		$04.w,a6
	move.l		550(a6),d0
	beq.s	cen_exit
	move.l		d0,a0
	move.l		30(a0),a1
	lea		cen(pc),a0
	moveq		#3,d0
cen1:	cmpm.l		(a0)+,(a1)+		; the first four longs
	dbne		d0,cen1			; of his code..
	tst.w		d0
	bpl.s	cen_exit
	move.l		-610(a6),a0	
	cmp.l		#$7f0fe,a0
	bne.s	cen_exit
	lea		$7fdf0,a0		; is his save back
	move.l		(a0),-610(a6)		; pointer..
	bsr.L	tracker
	lea		$7fdf4,a1		; restore
	move.l		(a1),(a0)		; trackdisk.device
	bsr.L	clear_kicktag			; throw resident out
	lea		$7f000,a0
	bsr.L	filler				; clears memory
	bsr.L	filler				; clears memory part2
	bsr.L	filler				; clears memory part3
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	cen11
	move.l		#mes16,d2
	move.l		#mes16length,d3
	bra.L	writer1
cen_exit:
	rts
cen11
	lea		vir1(pc),a0
	bra.L	write_text
	
cen:	dc.l	$4eaeff88,$60b241fa
	dc.l	$0d00202e,$02266712
**************************************************************************
*
*	CENTURION - LINK VIRUS
*
*	makes himself resident, changes the DOIO & KICKSUM.
*
*	Virus is 3916 bytes long and tries to infect the programs in
*	the startup-sequence.
*	After XX resets he changes the mousepointer to a smiley with a
*	little scroller.
*
***************************************************************************
Disaster_Master:
	move.l		$04.w,a6
	move.l		550(a6),d0
	beq.s	disaster_exit
	move.l		d0,a0
	move.l		(a0),a0
	cmp.w		#$4afc,(a0)+	; isses denn RESIDENT???
	bne.s	disaster_exit
	move.l		(a0)+,a2
	move.l		(a0)+,a1		
	sub.l		a2,a1
	cmpa.l		#$1e,a1		; is immer seine struct laenge
	bne.s	disaster_exit
	move.l		(a0),d0
	cmp.l		#$01210873,d0	; sind seine flags
	bne.s	disaster_exit
	add.l		#12,a0	
	move.l		(a0),a0
	move.l		a0,a2		; backsave
	add.l		#8,a0
	move.l		(a0),d0
	cmp.l		#$011cd7c0,d0	; teil seines codes	
	bne.s	disaster_exit
	move.w		#$4e75,(a2)	; castrated	
	move.l		a2,a0
	add.l		#$14a,a0
	move.l		(a0),-454(a6)	; rauswerfen
	bsr.L	clear_kicktag
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	disaster1
	move.l		#mes14,d2
	move.l		#mes14length,d3
 	bra.L	writer1
disaster_exit
	rts
disaster1
	lea		vir2(pc),a0
	bra.L	write_text

**************************************************************************
*
*	DISASTER-MASTER V2	FILE VIRUS
*
*	makes himself resident and changes the DOIO.
*
*	Virus is 1740 bytes long, his name is 'CLS' and is
*	found in the 'C' Dir.
*	When he has infected a disk, he is always the first command
*	in the startup-sequence -> 'CLS *'
*	If you execute him he will clear screen, but if you execute him
*	with 'CLS *' he will do nothing. Looks like a option!
*	Infects everything with 's/startup-sequence' even harddisks.
*
***************************************************************************

* here begins the part taken from VIRUSX4.0 by STEVE TIBBET

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
;	Check for and Remove the Xeno Virus
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

xeno:
	move.l	DOSBase(pc),a0		; Get addr of Open() Vector
	sub.w	#$1c,a0
	move.l	(a0),a0

	move.l	a0,d0			;: If Bit 0 of the Address is set,
	btst	#0,d0			;: then it's not really an address
	bne.s	NoVirus_xeno		
	
	cmp.l	#$B47C03EE,(a0)
	bne.s	NoVirus_xeno
	cmp.l	#$67000224,4(a0)
	bne.s	NoVirus_xeno

	;:: If we're here, we're fairly sure A0 is pointing to the
	;:: base of the Xeno virus (well, not it's base, but the address
	;:: of the first vector it stole, the Open() one.
	;:: So we'll nuke it.  8-)

	move.w	#$6000,$4(a0)
	move.w	#$603E,$240(a0)
	move.w	#$601E,$29C(a0)

* END OF PART

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	xeno1
	move.l		#mes13,d2
	move.l		#mes13length,d3
 	bsr.L		writer
NoVirus_xeno:
	rts
xeno1
	lea		vir3(pc),a0
	bra.L	write_text

; i hate to do this, but until now i never got a xeno virus and was
; therefore not able to do my own killer.
; in addition to that: I HATE THE WAY S.TIBBET KILLS VIRUSES!!!!!!!
; it is not very intelligent to look for a checksum....

revenge:
	move.l		$04.w,a6
	cmp.l		#$7e060,46(a6)
	bne.s	revenge_ende
	move.l		$c0,d0
	cmp.l		#$0c794ef9,$c0
	bne.s	revenge_ende

	move.l		$7e068,-454(a6)	; restoring the old pointers
	move.l		$7e06e,148(a6) 	; by grabbing his saved systemcalls

	lea		$7e000,a0	; the virus
	bsr.L	filler

	lea		$c0,a0		; CLEAR
	moveq		#0,d0		; his routine
	moveq.l		#$10,d6		; located at $c0
rev1:
	move.l		d0,(a0)+
	dbf	d6,rev1

	bsr.L	killcold_cool		; out of memory!! HE HE..

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	revenge11
	move.l		#mes12,d2
	move.l		#mes12length,d3
 	bra.L	writer1
revenge_ende:
	rts
revenge11
	lea		vir4(pc),a0
	bra.L	write_text

*************************************************************************
* REVENGE is a stupid one, it copies a small CONTROLLER part down to
* $c0 and is ALWAYS located at $7e000. (No interest in Fast Mem!!) 
* I only added this one, because it was easy and BERSERKER III crashed
* when REVENGE was in memory. (uses cold cap., 148(a6) & -454(a6) DOIO)
*************************************************************************

revenge_boot:	; seems to be a brand new one...
	bsr.L		tracker
	move.l		a0,revenge1-VAR(a5)
	move.l		(a0),d4
	swap		d4
	cmp.b		#$fe,d4		; Is this pointer normal? (V1.2)
	beq.L	revenge_boot_ende
	cmp.b		#$ff,d4		; Is this pointer normal? (V1.3)
	beq.L	revenge_boot_ende

	move.l		$4.w,a6		; using his own check
	moveq		#0,d0		; routine... 
	move.w		$94(a6),d0
	and.l		#$f0,d0
	cmp.w		#$f0,d0
	beq.L	revenge_boot_ende	; not in memory

	move.l		(a0),a1
	add.l		#$228,a1
	move.l		(a1),revenge_track-VAR(a5); -28(trackdisk.device)
	add.l		#$4,a1
	move.l		(a1),revenge_rast-VAR(a5); 148(a6)
	add.l		#$4,a1
	move.l		(a1),revenge_alloc-VAR(a5); the part he spreads
	sub.l		#$3c4,a1
	move.l		a1,revenge_mem-VAR(a5)	; his own start

	move.l		revenge1-VAR(a5),a0		; restoring pointers
	move.l		revenge_track-VAR(a5),(a0)

	move.l		revenge_rast-VAR(a5),$94(a6)		

	bsr.L	clear_kicktag

	move.l		revenge_mem-VAR(a5),a0
	bsr.L	filler

	move.l		revenge_alloc-VAR(a5),a0
	bsr.L	filler

	move.l		revenge_alloc-VAR(a5),a1	; he allocatesw memory..
	move.l		#$400,d0		; ani i give it back...
	jsr	freemem(a6)

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	revenge_boot1
	move.l		#mes11,d2
	move.l		#mes11length,d3
 	bra.L	writer1
revenge_boot_ende:
	rts
revenge_boot1
	lea		vir5(pc),a0
	bra.L	write_text

*************************************************************************
*
* seems to be a new one -> contains ASCII Text 'REVENGE BOOTLOADER' 
*
*************************************************************************

disk_doctor:
	move.l		$04.w,a6	; Disk-Doc uses cold & cool capture
	move.l		46(a6),d0
					; No other virus uses both
	beq.L	dd0			; pointers... [ hope so !!! ]
	move.l		42(a6),d0
	beq.L	dd0

	move.l		42(a6),diskdoc-VAR(a5)	; I had to add this very
	move.l		diskdoc-VAR(a5),a0	; complicated routine because
	add.l		#$c4,a0		; Disk-Doc uses or changes:
	move.l		a0,a1		; - cool capt.
	addq.l		#4,a1		; - cold capt.
	move.w		#$4e75,(a1)	; - DoIO
	jsr		(a0)		; - 148(a6) [what's that?]
	move.l		a2,diskdoc1-VAR(a5)	; - The task of clipboard.device
	addq.l		#6,a2
	move.l		a2,a3		; This routine gets the adress of
	addq.l		#4,a2		; its task routine and cuts it off
	move.w		#$4e75,(a2)
	jsr		(a3)
	move.l		a0,diskdoc2-VAR(a5)
	bsr.L		killcold_cool
	move.l		$04.w,a6
	move.l		#$fc06dc,-$1c6(A6); Only Kick 1.2 values, on 1.3
	move.l		#$fc12fc,148(a6)  ; Disk-Doc shouldn't work...

	move.l		diskdoc-VAR(a5),a0
	move.l		a0,a1
	add.l		#$1a0,a1
	moveq		#0,d0
dd2:	move.l		d0,(a0)+
	cmpa.l		a0,a1
	bge.s	dd2
	move.l		diskdoc1-VAR(a5),a2
	move.w		#$4e75,(a2)
	move.l		diskdoc2-VAR(a5),a2
	move.w		#$4e75,(a2)

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	dd1
	move.l		#mes6,d2
	move.l		#mes6length,d3
 	bra.L	writer1
dd0:	rts
dd1
	lea		vir7(pc),a0
	bra.L	write_text

***********************************************************************
*
*	DISK-DOCTOR
*
*	- After each reset Disk Doctor allocates more memory
*	- This was in my opinion the best one, although it could be
*	  better: - it uses DoIO pointer from Kick 1.2 (crash on 1.3)
*		  - you can read text in the boot-block
*	- it uses the clipboard task for its dirty work
*	- it uses cold & cool capture to stay in memory
*
*	For such kind of virus Guardian or VirusX are the best killers!!
*	( Find them in the boot and fight them when they are harmless! )
*	Same with TIMEBOMB, Berserker can't fight this one........
************************************************************************

gadaffi:
	move.l		$04.w,a6	; Gadaffi uses cool capture
	cmp.l		#0,46(a6)	; for its dirty work...
	beq.s		gad0		; no cool capture set

	cmp.l		#$47414441,$7fb40; Gadaffi
	bne.s		gad0		; is ALWAYS to be found at $7fb00

	move.l		-$1c6(a6),d5	; $4b0 with 512 kb
	swap		d5
	cmp.w		#$fc,d5		; $fc06dc (1.2)  $fc0718 (1.3)
	beq.s		gad0

	move.l		46(a6),gadaf-VAR(a5)
	bsr.L	killcold_cool		; Clear its cool pointer
	move.l		$04.w,a6
	move.l		#$fc06dc,-$1c6(A6)

	bsr.L		clear_kicktag

	move.l		gadaf-VAR(a5),a0
	sub.l		#$dc,a0
	bsr.L	filler
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	gad11
	move.l		#mes4,d2
	move.l		#mes4length,d3
 	bra.L	writer1
gad0:	rts
gad11
	lea		vir11(pc),a0
	bra.L	write_text

********************************************************************
*
*	GADAFFI is a mutant version of Byte Warrior
*
*	- It changes cool capture, kicktag. and DoIO
*	- It is much more stupid than Byte Warrior:
*	 -> you can read it in the boot...
*	 -> normally it crashes with Kick 1.3 because
*	    he uses the DoIO vector of 1.2 itself
*	- After 12 resets it tries to kill your drive, or
*	  was it playing a drive music ?? (I don't see any difference!)
*
********************************************************************
bsg:
	move.l		$04.w,a6
	move.l		546(a6),d0	; BSG 9 is a resident module
	adda.l		550(a6),d0	; It is still in memory after
	adda.l		554(a6),d0	; a reset
	beq.s	bsgende
	move.l		550(a6),a0	; Searching from A0
	move.l		a0,a1
	add.l		#$1000,a1	; Searching to A1
	move.l		#$00005454,d0	; Searching for 'TT'
	moveq		#0,d1
bsg0:
	move.w		(a0)+,d1
	cmp.w		d1,d0
	beq.s	bsg1
	cmpa.l		a0,a1
	bge.s	bsg0
	rts				; Nothing found !
					; It is not always a virus which
					; uses these pointers. It could
bsg1:					; also be your ramdrive....
	move.w		#$5631,d0
	move.w		(a0),d1
	cmp.w		d1,d0
	bne.s	bsg0
	moveq		#0,d0		; Kills it from beginning
	move.l		a0,a1		; to 'TTV1' <- its end marker
	move.l		550(a6),a0
bsg2:
	move.l		d0,(a0)+
	cmpa.l		a0,a1
	bne.s	bsg2

	bsr.L		clear_kicktag

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	bsg3
	move.l		#mes2,d2
	move.l		#mes2length,d3
 	bra.L	writer
bsgende:
	rts
bsg3
	lea		vir9(pc),a0
	bra.L	write_text

********************************************************************
*
*	BSG 9 is an intelligent version of a link virus
*
*	- It always modifies the FIRST file of the startup-
*	  sequence
*	- The file now always is about 2608 bytes long
*	- The old file in in the devs dir with
*	  spaces instead of a name now
*	- After the fourth or fifth reset it turns the
*	  screen black and prints out its stupid message.
*
*********************************************************************

irq:	; changes oldopen
	move.l		$04.w,a6
	move.l		-$196(a6),d4
	swap		d4
	cmp.b		#$fc,d4	; V1.2 00fc1430  V1.3 00fc146c
	beq.s	irq5
	move.l		-$196(a6),a4
	add.w		#8,a4
	move.l		#$4e714e71,(a4)	; Castrate virus
	sub.l		#$196,a6	; In this part the old
	move.l		(a6),a4		; oldopenlib call
	add.l		#18,a4		; is restored...
	move.l		(a4),(a6)
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	irq1
	move.l		#mes3,d2
	move.l		#mes3length,d3
	bra.L	writer
irq5	rts
irq1	lea		vir10(pc),a0
	bra.L	write_text

**************************************************************
*
*	The IRQ Team Virus was the first link virus
*	on AMIGA...
*
*	It uses oldopenlibrary for its dirty work.
*	In order to work properly with all Kickstart
*	versions the IRQ-virus saves the replaced
*	sytemcall in memory.
*	To let my Berserker work with all kick versions
*	I just grab his saved sytemcall in order to
*	throw him out properly...
*
**************************************************************

exterminator:	; in trddevice, doio & kicktag... ($4678, $414, $898)
	bsr.L		tracker
	move.l		a0,exter-VAR(a5)
	move.l		(a0),d4
	swap		d4
	cmp.b		#$fe,d4		; Is the pointer normal (V1.2)
	beq.L	exe4
	cmp.b		#$ff,d4
	beq.L	exe4		; Is the pointer normal (V1.3)

	move.l		a6,a4
	sub.w		#$262,a4	; In A5 now Exterminator's address..
	move.l		a4,exter1-VAR(a5)
	move.l		(a4),d4
	swap		d4
	cmp.b		#$fc,d4		; Is it the normal system call?
	beq.s	exe4

	move.l		exter1-VAR(a5),a4
	move.l		(a4),a0
	sub.l		#$14e,a0
	move.l		a0,a1
	add.l		#$400,a1
	moveq		#0,d1
	moveq		#0,d0
exe7:
	move.w		#$4c41,d0	; We are looking for 'LAMER'
	move.w		(a0)+,d1
	cmp.w		d1,d0
	beq.s	exe2
	cmpa.l		a0,a1
	bge.s	exe7
	rts
exe2:
	move.w		#$4d45,d0
	move.w		(a0),d1
	cmp.w		d1,d0
	bne.s	exe7
	add.l		#28,a0		; Here exteminator saves his
	move.l		(a0)+,a1	; changed system calls
	move.l		(a0)+,a2


	bsr.L	clear_kicktag

	move.l		exter1-VAR(a5),a0	; Correct both pointers
	move.l		a1,(a0)
	move.l		exter-VAR(a5),a0
	move.l		a2,(a0)
	move.l		exter1-VAR(a5),a4	; Crucify it
	move.l		(a4),a0
	sub.l		#$14e,a0
	bsr.L	filler
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	exe1
	move.l		#mes9,d2
	move.l		#mes9length,d3
	bra.L	writer1
exe4:	rts
exe1
	lea		vir13(pc),a0
	bra.L	write_text

***********************************************************************

sca:
	move.l		$04.w,a6
	move.l		46(a6),d2	; Cold-capture
	bne.s		sca1
	rts
sca1:
	move.b		#1,virusflag-VAR(A5)
	move.l		46(a6),a0
	move.l		a0,a1
	sub.l		#$3e,a0		; We are now searching
	add.l		#$400,a1	; for jsr -456(a6) [DoIO]
	moveq		#0,d1		; if cold capture is set
	moveq		#0,d0		; and in the routine is
sca2:					; a DoIO it is 100% a
	move.w		#$4eae,d0	; virus ( mostly mutants)
	move.w		(a0)+,d1
	cmp.w		d1,d0
	beq.s		sca3
	cmpa.l		a0,a1
	bge.s		sca2
	rts				; Nothing found
sca3:
	move.w		#$fe38,d0
	move.w		(a0),d1
	cmp.w		d1,d0
	bne.s	sca2
	move.l		$7eff0,d2	; Here is the direct test
	cmp.l 		#$53434121,d2	; if it is SCA or AEK or LSD
	beq.s	sca4			; if it is none of them it is
					; another mutant SCA...
	bra.s	scamutants
sca4:
	tst.b		launch-VAR(a5)
	bne.s	sca01
	move.l		#mes5,d2	; SCA
	move.l		#mes5length,d3
 	bsr.L	writer1
	bra.s	scakill
sca01
	lea		vir12(pc),a0
	bsr.L	write_text

	bra.s	scakill	
scamutants:
	tst.b		launch-VAR(a5)
	bne.s	sca02
	move.l		#mes8,d2	; Mutant
	move.l		#mes8length,d3
 	bsr.L	writer1
scakill:
	move.l		46(a6),a0
	sub.l		#$3e,a0
	bsr.L	filler
	bra.L	killcold_cool	; Repairs both vectors
sca02
	lea		vir6(pc),a0
	bsr.L	write_text
	bra.s	scakill
************************************************************************

dasa:
	move.l		$04.w,a6
	move.l		-$1c6(a6),d5	; $4b0 with 512 kb
	swap		d5
	cmp.w		#$fc,d5		; $fc06dc (1.2)  $fc0718 (1.3)
	bne.s	dasa0
	move.l		$7f804,d5	; Dasa is ALWAYS at $7f800
	cmp.l		#$64116dec,d5	; no need to restore doio
	beq.s	dasa1			; pointer (not changed)
	rts
dasa0:
	move.l		#$00fc06dc,-$1c6(a6)	; Remove its pointer
dasa1:	move.l		-$1c6(a6),a3
	sub.l		#$16e,a3	; Its beginning

	bsr.L	clear_kicktag

	move.l		#$4ff,d1	; Delete virus
dasa2:	move.b		d0,(a3)+
	dbf		d1,dasa2
	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	dasa3
	move.l		#mes1,d2
	move.l		#mes1length,d3
	bra.L	writer1
dasa3
	lea		vir8(pc),a0
	bra.L	write_text

****************************************************************
*
*	DASA is the Byte Warrior
*
*	DASA is always located at $7f800 and since
*	it uses a direct jump for DoIO of kick V1.2
*	( jmp $fc06dc ) for his own copy-routines it
*	crashes on kick v1.3.
*	Therefore I have added this two way search, because
*	when it's kick 1.3 DASA can't work but is still in
*	memory and I don't like a virus in memory...
*
*		ONLY A DEAD VIRUS IS A GOOD VIRUS!!!!
*
***************************************************************

bytebandit:		    ; Searches for byte bandit

	bsr.L		tracker
	move.l		a0,bb1
	cmp.l		#$00f00000,a0
	ble.s	bytebandit1		; OK! DoIO is changed
	rts

bytebandit1:
	move.l		148(a6),a0	; Now second test if it
	cmp.l		#$00f00000,a0	; is really byte bandit
	ble.s	bytebandit2		; LAMER also changes DoIO!
	rts

bytebandit2:	; it is byte bandit!!
	move.l		a0,a4
	add.l		#$10c,a0	; Here the pointers are
	move.l		(a0)+,a1	; saved...
	move.l		(a0),a2
	move.l		bb1,a0
	move.l		a1,(a0)		; Restoring both
	move.l		a2,148(a6)	; pointers...

	bsr.L	clear_kicktag

	sub.l		#$2ca,a4	; Its beginning
	move.l		a4,a0
	bsr.L	filler

	move.b		#1,virusflag-VAR(A5)
	tst.b		launch-VAR(a5)
	bne.s	bb22
	move.l		#mes10,d2
	move.l		#mes10length,d3
	bra.L	writer1
bb22
	lea		vir14(pc),a0
	bra.L	write_text

***************** M E S S A G E S  AND  D A T A S ********************
even
mes:	dc.b $0a,'Virus killed, check your disks....'
	dc.b $0a,$0a             
mesend:
meslength = mesend-mes
even
mes0:	dc.b $0a,$9b,'7;32;41m'
	dc.b $1b,'[1m'
	dc.b '   BERSERKER found ** NO VIRUS ** in memory !!!  '   
	dc.b $1b,'[0m'
	dc.b $9b,'0;31;40m'
	dc.b $0a,$0a
mes0end:
mes0length = mes0end-mes0
even
mes1:	dc.b $0a,$0c,'DANGER!! BYTE - WARRIOR (DASA) VIRUS found'
mes1end:
mes1length = mes1end-mes1
even
mes2:	dc.b $0a,$0c,'DANGER!!  BSG 9 LINK -  VIRUS killed!!!'                
	dc.b $0a,'Check first prog. in startup seq. or look into devs.'
	dc.b $0a
mes2end:
mes2length = mes2end-mes2
even
mes3:	dc.b $0a,$0c,'DANGER!!  IRQ LINK - VIRUS killed!!!'                
	dc.b $0a,'Check 2nd prog. in startup seq. or cli-command DIR.'
	dc.b $0a
mes3end:
mes3length = mes3end-mes3
even
mes4:	dc.b $0a,$0c,'DANGER!!  GADAFFI - VIRUS found!!!'                
mes4end:
mes4length = mes4end-mes4
even
mes5:	dc.b $0a,$0c,'DANGER!!  SCA - VIRUS found!!!'                
mes5end:
mes5length = mes5end-mes5
even
mes6:	dc.b $0a,$0c,'DANGER!!  Disk-Doctor VIRUS found!!!'                
mes6end:
mes6length = mes6end-mes6
even
mes8:	dc.b $0a,$0c,'DANGER!!  MUTANT SCA - VIRUS found!!!'                
mes8end:
mes8length = mes8end-mes8
even
mes9:	dc.b $0a,$0c,'DANGER!!  EXTERMINATOR (Lamer!) found!!!'                
mes9end:
mes9length = mes9end-mes9
even
mes10:	dc.b $0a,$0c,'DANGER!!  BYTE - BANDIT VIRUS found!!!'
mes10end:
mes10length = mes10end-mes10
even
mes11:	dc.b $0a,$0c,'DANGER!! REVENGE - BOOTLOADER VIRUS found!'
mes11end:
mes11length = mes11end-mes11
even
mes12:	dc.b $0a,$0c,'DANGER!! REVENGE VIRUS found!'
mes12end:
mes12length = mes12end-mes12
even
mes13:	dc.b $0a,$0c,'DANGER!!  XENO LINK - VIRUS neutralized!!'                
	dc.b $0a,'Check files on disks and hard-disk with "KV".'
	dc.b $0a,$0a
mes13end:
mes13length = mes13end-mes13
even
mes14:	dc.b $0a,$0c,'DANGER!!  Disaster-Master V2 FILE VIRUS killed!!!'                
	dc.b $0a,'Check first prog. in startup seq. & cli-command CLS.'
	dc.b $0a,$0a
mes14end:
mes14length = mes14end-mes14
even
mes16:	dc.b $0a,$0c,'DANGER!!  CENTURION LINK - VIRUS neutralized!!'                
	dc.b $0a,'Check files in startup-sequence.'
	dc.b $0a,$0a
mes16end:
mes16length = mes16end-mes16
even
mes17:	dc.b $0a,$0c,'SORRY!!  You have the wrong KICKSTART.'                
	dc.b $0a,'BERSERKER cannot work with this version.'
	dc.b $0a,$0a
mes17end:
mes17length = mes17end-mes17
even
mes18:	dc.b $0a,$0c,'DANGER!!  Traveling Jack - VIRUS neutralized!!'                
	dc.b $0a
mes18end:
mes18length = mes18end-mes18
even
mes19:	dc.b	$0a
	dc.b "   BERSERKER could not load 'BERSERKER-HANDLER'..  "   
	dc.b $0a
mes19end:
mes19length = mes19end-mes19
even
mes20:	dc.b	" was NOT installed!!  "
mes20end:
	dc.b	0
mes20length = mes20end-mes20
even
mes21:	dc.b	" CHECKER is removed!! "
mes21end:
	dc.b	0
mes21length = mes21end-mes21
even
mes22:	dc.b 	" CHECKER is installed."   
mes22end:
	dc.b	0
mes22length = mes22end-mes22
even
mes23:	dc.b 	" ALREADY installed...."   
mes23end:
	dc.b	0
mes23length = mes23end-mes23
even
mes24:	dc.b	$0a,$0a
mes24end:
mes24length = mes24end-mes24
even
mes25:	dc.b 	" !! could not load !! ",0   
mes25end:
mes25length = mes25end-mes25
even
mes15:
dc.b $0c,$1b,'[1m','                        *****  BERSERKER 5.02  *****'
dc.b $1b,'[0m'
dc.b	$0a
dc.b $0a,'	   1. This Viruskiller finds and destroys the following:'
dc.b $0a,'	      Byte Bandit,  Byte Warrior (DASA), SCA,  AEK, LSD,'
dc.b $0a,'	      OBELISK, WARHAWK,  PENTAGON, BAMIGA S1, NORTHSTAR,'
dc.b $0a,'	      Exterminator (LAMER) all versions,  GADAFFI Virus,'
dc.b $0a,'	      Disk-Doctor Virus, IRQ-Team 41 Virus (Link Virus),'
dc.b $0a,'	      BSG9 VIRUS (Link Virus), REVENGE BOOTLOADER Virus,'
dc.b $0a,'	      REVENGE, XENO Link, Disaster Master File Virus,'
dc.b $0a,'	      CENTURION & JACK Link Virus (all versions).'
dc.b $0a,'	   2. All bootblock  viruses  will be deleted from memory'
dc.b $0a,'	      and all  changed  system pointers will be restored.'
dc.b $0a,'	   3. The  Link Viruses  are only  killed in memory. They'
dc.b $0a,'	      might have infected some prgs. on disk!! Take care!'
dc.b $0a,'	      If you  want  protection from  JACK  and  CENTURION'
dc.b $0a,'	      you have to choose option I ( install checker ).'
mes115end:
mes115length = mes115end-mes15
dc.b $0a,'	   4. Berserker  gives you the choice to kill the cold- &'
dc.b $0a,'	      cool capture....(only from CLI)'
dc.b $0a,'	   5. BERSERKER checks libraries.....'
dc.b $0a,'	   6. You can  launch a permanent  CHECKER, which remains'
dc.b $0a,'	      in memory and  checks always for  JACK & CENTURION.'
dc.b $0a
dc.b $1b,'[1m'	; dick
dc.b $0a,'      CLI OPTIONS:  [ C (kill COLD & COOL)] [ ? (instructions)]'
DC.B $0A,'		    [ I (install checker)]  [ R (remove checker)]'
dc.b $1b,'[0m'
dc.b $0a
dc.b $1b,'[1m'
dc.b $0a,'                    This program is in the PUBLIC DOMAIN!!!'
dc.b $1b,'[3m'
dc.b $0a
dc.b $0a,'                               ©Copyright 1988, 1989, 1990 by Ralf Thanner.'
dc.b $1b,'[0m'
dc.b $0a
mes15end:
mes15length = mes15end-mes15
mes315length = mes15end-mes115end
even
mes215:
dc.b $0a,$0a,$1b,'[1m'	; dick
dc.b $0a,'					PRESS RIGHT MOUSE BUTTON'
dc.b $1b,'[0m'
mes215end:
mes215length = mes215end-mes215
EVEN
mes415:
dc.b $0a,$0a,$1b,'[1m'	; dick
dc.b $0a,'						PRESS RETURN'
dc.b $1b,'[0m'
mes415end:
mes415length = mes415end-mes415
EVEN
 con:
dc.b'CON:0/0/640/190/            BERSERKER 5.02      INSTRUCTIONS        ',0
EVEN
 con_error:
	dc.b	$0c
 con_clear:
EVEN
;=============================================================================
VAR:
 newtaskpri:	dc.l	0
 mytask:	dc.l 	0
 my_rastport:	dc.l	0
 windowhandle:	dc.l	0	
 message_list:	dc.l	0,0,0
 userport:	dc.l	0	
 gad_table:	dc.l	gad1,gad2,gad3,gad4,gad5
 revenge1:	dc.l	0
 revenge_alloc:	dc.l	0
 revenge_track:	dc.l	0
 revenge_rast:	dc.l	0
 revenge_mem:	dc.l	0
 diskdoc:	dc.l	0
 diskdoc1:	dc.l	0
 diskdoc2:	dc.l	0
 gadaf:		dc.l	0
 bb1:		dc.l	0
 exter:		dc.l	0
 exter1:	dc.l	0
 expbase: 	dc.l	0 
 gfxbase: 	dc.l	0 
 laybase: 	dc.l	0 
 dosbase: 	dc.l	0 
 IntBase:	dc.l	0
 trackdisk:	dc.l	0
 handle:	dc.l	0
 message:	dc.l	0
 kickflag:	dc.w	0
 pal:		dc.w	0
 input_buffer:	dc.w	0
 launcher:	dc.b	0
 remover:	dc.b	0	
 no_killy:	dc.b 	$ff
 virusflag:	dc.b	0
 leave_it:	dc.b	0
 launch:	dc.b	0
 TASK_NAME:	dc.b	'BerserkerV5.0',0
 MSG_PORT_NAME:	dc.b	'BERSERKER',0
EVEN
 NAME:		DC.B	'l:Berserker-Handler',0
EVEN
 TRDDEVICE:	DC.B	'trackdisk.device',0
EVEN
 INTNAME: 	DC.B	'intuition.library',0
EVEN
 EXPNAME: 	DC.B	'expansion.library',0
EVEN
 GFXNAME: 	DC.B	'graphics.library',0
EVEN 
 LAYNAME: 	DC.B	'layers.library',0
EVEN
 DOSNAME:	DC.B	'dos.library',0
EVEN
 EXENAME:	DC.B	'exec.library',0
EVEN
;=============================================================================
alert1:	dc.w 	178
	dc.b 	16
	dc.b 	'Berserker found VIRUS in memory!'
EVEN
alert3:	dc.w 	128
	dc.b 	16
	dc.b 	'CHECKSUM of   '
alert4: dc.b	'                   '
	dc.b	'is NOT correct....',0
EVEN
NewWindowStructure1:
	dc.w	0,0	;105,58	;window XY origin relative to TopLeft of screen
	dc.w	204,130	;window width and height
	dc.b	0,2	;detail and block pens
	dc.l	CLOSEWINDOW+GADGETUP	;IDCMP flags
	dc.l	WINDOWDEPTH+WINDOWCLOSE+WINDOWDRAG+ACTIVATE+WINDOWACTIVE+NOCAREREFRESH+RMBTRAP
	dc.l	GadgetList1	;first gadget in gadget list
	dc.l	NULL	;custom CHECKMARK imagery
	dc.l	NewWindowName1	;window title
	dc.l	NULL	;custom screen pointer
	dc.l	NULL	;custom bitmap
	dc.w	5,5	;minimum width and height
	dc.w	-1,-1	;maximum width and height
	dc.w	WBENCHSCREEN	;destination screen type
NewWindowName1:
	dc.b	'BERSERKER 5.02 ',0
EVEN
GadgetList1:
Gad1:
	dc.l	Gad2	;next gadget
	dc.w	28,26-9	;origin XY of hit box relative to window TopLeft
	dc.w	149,11	;hit box width and height
	dc.w	NULL	;gadget flags
	dc.w	RELVERIFY	;activation flags
	dc.w	BOOLGADGET	;gadget type flags
	dc.l	Border1	;gadget border or image to be rendered
	dc.l	NULL	;alternate imagery for selection
	dc.l	IText1	;first IntuiText structure
	dc.l	NULL	;gadget mutual-exclude long word
	dc.l	NULL	;SpecialInfo structure
	dc.w	NULL	;user-definable data
	dc.l	NULL	;pointer to user-definable data
Border1:
	dc.w	-1,0	;XY origin relative to container TopLeft
	dc.b	3,0,RP_JAM1	;front pen, back pen and drawmode
	dc.b	5	;number of XY vectors
	dc.l	BorderVectors2	;pointer to XY vectors
	dc.l	NULL	;next border in list
IText1:
	dc.b	3,0,RP_JAM2,0	;front and back text pens, drawmode and fill byte
	dc.w	24,1+1	;XY origin relative to container TopLeft
	dc.l	NULL	;font pointer or NULL for default
	dc.l	ITextText1
	dc.l	NULL	;next IntuiText structure
ITextText1:
	dc.b	'CHECK MEMORY',0
EVEN
Gad2:
	dc.l	Gad3
	dc.w	28,42-9
	dc.w	149,11
	dc.w	NULL
	dc.w	RELVERIFY
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	NULL
	dc.l	IText2
	dc.l	NULL
	dc.l	NULL
	dc.w	null
	dc.l	NULL
BorderVectors2:
	dc.w	0,-1
	dc.w	149,-1
	dc.w	149,11
	dc.w	0,11
	dc.w	0,-1
IText2:
	dc.b	3,0,RP_JAM2,0
	dc.w	1+5,1+1
	dc.l	NULL
	dc.l	ITextText2
	dc.l	NULL
ITextText2:
	dc.b	' INSTALL CHECKER',0
EVEN
Gad3:
	dc.l	Gad4
	dc.w	28,58-9
	dc.w	149,11
	dc.w	NULL
	dc.w	RELVERIFY
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	NULL
	dc.l	IText3
	dc.l	NULL
	dc.l	NULL
	dc.w	null
	dc.l	NULL
IText3:
	dc.b	3,0,RP_JAM2,0
	dc.w	5+5,1+1
	dc.l	NULL
	dc.l	ITextText3
	dc.l	NULL
ITextText3:
	dc.b	' REMOVE CHECKER',0
EVEN
Gad4:
	dc.l	Gad5
	dc.w	28,74-9	
	dc.w	149,11
	dc.w	NULL	
	dc.w	RELVERIFY
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	NULL
	dc.l	IText4
	dc.l	NULL	
	dc.l	NULL	
	dc.w	null
	dc.l	NULL	
IText4:
	dc.b	3,0,RP_JAM2,0
	dc.w	11+8,1+1
	dc.l	NULL
	dc.l	ITextText4
	dc.l	NULL
ITextText4:
	dc.b	' INSTRUCTIONS',0
EVEN
Gad5:
	dc.l	NULL
	dc.w	28,97-9
	dc.w	149,11
	dc.w	NULL
	dc.w	RELVERIFY
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	NULL
	dc.l	IText5
	dc.l	NULL
	dc.l	NULL
	dc.w	null
	dc.l	NULL
IText5:
	dc.b	1,3,RP_jam1,0
	dc.w	21+4,1+1
	dc.l	NULL
	dc.l	ITextText5
	dc.l	NULL
ITextText5:
	dc.b	' «» EXIT «»',0
EVEN
Border:
	dc.w	0,0	;XY origin relative to container TopLeft
	dc.b	1,0,RP_JAM1	;front pen, back pen and drawmode
	dc.b	5	;number of XY vectors
	dc.l	BorderVectors6	;pointer to XY vectors
	dc.l	NULL	;next border in list
BorderVectors6:
	dc.w	0,-1
	dc.w	199,-1
	dc.w	199,18
	dc.w	0,18
	dc.w	0,-1
EVEN
IntText:
	dc.b	1,0,RP_JAM2,0
	dc.w	17,115
	dc.l	NULL
	dc.l	NULL
	dc.l	NULL
IText11:
        dc.b	'    NO VIRUS FOUND    ',0
EVEN
VIR0
	dc.b	'    TRAVELING JACK    ',0
EVEN
VIR1
	dc.b	'    CENTURION LINK    ',0
EVEN
VIR2
	dc.b	'   DISASTER MASTER    ',0
EVEN
VIR3
	dc.b	'   XENO LINK VIRUS    ',0
EVEN
VIR4
	dc.b	'       REVENGE        ',0
EVEN
VIR5
	dc.b	'   REV. BOOTLOADER    ',0
EVEN
VIR6
	dc.b	'      MUTANT SCA      ',0
EVEN
VIR7
	dc.b	'     DISK  DOCTOR     ',0
EVEN
VIR8
	dc.b	'     BYTE WARRIOR     ',0
EVEN
VIR9
	dc.b	'     BSG 9  LINK      ',0
EVEN
VIR10
	dc.b	'     IRQ TEAM 41      ',0
EVEN
VIR11
	dc.b	'       GADAFFI        ',0
EVEN
VIR12
	dc.b	'       S  C  A        ',0
EVEN
VIR13
	dc.b	'     EXTERMINATOR     ',0
EVEN
VIR14
	dc.b	'     BYTE  BANDIT     ',0
EVEN

