; *****************************************************************
; *                      Giga-Checker                             *
; *                                                               *
; * 18.05.90 : Idea,start coding                      v0.1        *
; * 18.05.90 : DoIO,Interrupts,(Old)OpenLibrary       v0.5        *
; * 18.05.90 : Cold/Cool/WarmCapture,Kick(Mem/Tag)Ptr v0.7   1936 *
; * 12.06.90 : Optimized                              v0.8   1416 *
; * 29.07.90 : Hard Reset                             v1.1   1496 *
; * --.--.-- : SumKickData                            v1.2        *
; *****************************************************************

Start:	MOVE.L	4,A6
	LEA	IntName(PC),A1
	JSR	-408(A6)
	MOVE.L	D0,IntBase
	BEQ.L	Error

	LEA	DosName(PC),A1
	JSR	-408(A6)
	MOVE.L	D0,DosBase
	BEQ.L	ClseInt

	MOVE.L	DosBase(PC),A6
	JSR	-60(A6)
	MOVE.L	D0,Output
	BEQ.L	ClseDos

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_Beginning,D2
	MOVEQ	#TEnd_Beginning-Text_Beginning,D3
	JSR	-48(A6)

; Vector 0

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_Vectors,D2
	MOVEQ	#TEnd_Vectors-Text_Vectors,D3
	JSR	-48(A6)

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_SpurInt,D2
	MOVEQ	#TEnd_SpurInt-Text_SpurInt,D3
	JSR	-48(A6)
	MOVE.L	$60,D6
	BSR.L	CheckROM
	BSR.L	PrintHex

; Vectors 1-7
	LEA	$64,A3
	MOVEQ	#6,D5
IntVLp1:MOVE.L	Output(PC),D1
	MOVE.L	#Text_IntLevels,D2
	MOVEQ	#TEnd_IntLevels-Text_IntLevels,D3
	JSR	-48(A6)
	BSR.L	PrintIntLevelAddress
	MOVE.L	(A3)+,D6
	BSR.L	CheckROM
	BSR.L	PrintHex
	ADDQ.B	#1,Text_IntLevels+30
	DBF	D5,IntVLp1

; ExecBase

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_ExecBase,D2
	MOVEQ	#TEnd_ExecBase-Text_ExecBase,D3
	JSR	-48(A6)

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_ColdCapture,D2
	MOVEQ	#TEnd_ColdCapture-Text_ColdCapture,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	42(A0),D6
	BSR.L	CheckNull
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_CoolCapture,D2
	MOVEQ	#TEnd_CoolCapture-Text_CoolCapture,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	46(A0),D6
	BSR.L	CheckNull
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_WarmCapture,D2
	MOVEQ	#TEnd_WarmCapture-Text_WarmCapture,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	50(A0),D6
	BSR.L	CheckNull
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_KickMemPtr,D2
	MOVEQ	#TEnd_KickMemPtr-Text_KickMemPtr,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	546(A0),D6
	BSR.L	CheckNull
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_KickTagPtr,D2
	MOVEQ	#TEnd_KickTagPtr-Text_KickTagPtr,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	550(A0),D6
	BSR.L	CheckNull
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_LineFeed,D2
	MOVEQ	#1,D3
	JSR	-48(A6)

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_DoIO,D2
	MOVEQ	#TEnd_DoIO-Text_DoIO,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	-454(A0),D6
	BSR.s	CheckROM
	BSR.L	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_OldOpenLibrary,D2
	MOVEQ	#TEnd_OldOpenLibrary-Text_OldOpenLibrary,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	-406(A0),D6
	BSR.s	CheckROM
	BSR.s	PrintHex

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_OpenLibrary,D2
	MOVEQ	#TEnd_OpenLibrary-Text_OpenLibrary,D3
	JSR	-48(A6)
	MOVE.L	4,A0
	MOVE.L	-550(A0),A0
	MOVE.L	A0,D6
	CLR.L	D7
	CMP.L	#$518F4879,(A0)
	BEQ.S	OpenLibraryOK
	MOVEQ	#-1,D7
OpenLibraryOK:
	BSR.S	PrintHex

ClseDos:MOVE.L	4,A6
	MOVE.L	DosBase(PC),A1
	JSR	-414(A6)
ClseInt:MOVE.L	4,A6
	MOVE.L	IntBase(PC),A1
	JSR	-414(A6)
Error:	RTS

; Subroutines:

CheckROM:
	MOVEM.L	D0-D2/A0-A2/A6,-(SP)
	MOVE.L	4,A6
	CLR.L	D7
	MOVE.L	D6,A1
	JSR	-534(A6)
	TST.L	D0
	BEQ.S	CheckROMEnd
	MOVEQ	#-1,D7
CheckROMEnd:
	MOVEM.L	(SP)+,D0-D2/A0-A2/A6
	RTS

PrintHex:
	MOVEM.L	D0-D3/A0-A2/A6,-(SP)

	MOVE.L	DosBase(PC),A6
	TST.L	D7		; Check if something wrong
	BEQ.S	PrintHex2
	MOVE.L	Output(PC),D1
	MOVE.L	#Text_Warning,D2
	MOVEQ	#TEnd_Warning-Text_Warning,D3
	JSR	-48(A6)
PrintHex2:
	BSR.S	PutHex
	MOVE.L	Output(PC),D1
	MOVE.L	#Text_HexNumber,D2
	MOVEQ	#TEnd_HexNumber-Text_HexNumber,D3
	JSR	-48(A6)
	MOVE.L	Output(PC),D1
	MOVE.L	#Text_Normal,D2
	MOVEQ	#TEnd_Normal-Text_Normal,D3
	JSR	-48(A6)
	TST.L	D7
	BEQ.S	PrintHex3
	MOVE.L	IntBase(PC),A6
	CLR.L	D0
	LEA	Text_Alert(PC),A0
	MOVEQ	#76,D1
	JSR	-90(A6)
	TST.L	D0
	BEQ.S	Reset
PrintHex3:
	MOVEM.L	(SP)+,D0-D3/A0-A2/A6
	RTS

PrintIntLevelAddress:
	MOVEM.L	D0-D3/A0-A2/A6,-(SP)

	MOVE.L	A3,D6
	BSR.s	PutHex
	LEA	Text_HexNumberStart-2(PC),A0
	LEA	Text_IntAddress+5(PC),A1
	MOVE.B	(A0)+,(A1)+
	MOVE.B	(A0)+,(A1)+

	MOVE.L	Output(PC),D1
	MOVE.L	#Text_IntAddress,D2
	MOVEQ	#TEnd_IntAddress-Text_IntAddress,D3
	JSR	-48(A6)

	MOVEM.L	(SP)+,D0-D3/A0-A2/A6
	RTS

PutHex:	MOVEM.L	D0/D5-D6/A0,-(SP)
	LEA	Text_HexNumberStart(PC),A0
	MOVEQ	#7,D5
PutHex2:MOVE.L	D6,D0
	AND.B	#$F,D0
	CMP.B	#9,D0
	BLS.S	PutHex3
	ADDQ.B	#7,D0
PutHex3:ADD.B	#"0",D0
	MOVE.B	D0,-(A0)
	LSR.L	#4,D6
	DBF	D5,PutHex2
	MOVEM.L	(SP)+,D0/D5-D6/A0
	RTS

CheckNull:
	CLR.L	D7
	TST.L	D6
	BEQ.S	CheckNullEnd
	MOVEQ	#-1,D7
CheckNullEnd:
	RTS

Reset:	MOVE.L	4,A6
	JSR	-120(A6)
	LEA	HReset(PC),A5
	JSR	-30(A6)
HReset:	CLR.L	4
	LEA	2,A0
	RESET
	JMP	(A0)

IntBase:DC.L	0
DosBase:DC.L	0
Output:	DC.L	0
IntName:DC.B	'intuition.library',0
DosName:DC.B	'dos.library',0
Text_Alert:
	DC.B	0,200,16,`* * *   W A R N I N G   * * *`,0,1
	DC.B	0,160,32,`This pointer may be infected by a VIRUS`,0,1
	DC.B	0,32,64,`CONTINUE`,0,1
	DC.B	1,144,64,`HARD RESET (REMOVE VIRUS)`,0,0
Text_Beginning:
	DC.B	13,10,155,'0m       ',155,'1mGiga-Watt',155,'0m presen'
	DC.B	'ts: ',155,'1;33mGiga-Checker v1.1',155,'31;0m',13,10
	DC.B	'     Coded by Kimmo Mustonen on 29th July 1990',13,10
Text_LineFeed:
	DC.B	10
TEnd_Beginning:

Text_Vectors:
	DC.B	155,'4mVectors',155,'0m:',13,10
TEnd_Vectors:
Text_SpurInt:
	DC.B	'- Spurious Interrupt             $0060 :'
TEnd_SpurInt:
Text_IntLevels:
	DC.B	'- Interrupt Auto-Vector Level 1'
TEnd_IntLevels:
Text_IntAddress:
	DC.B	'  $0000 :'
TEnd_IntAddress:

Text_ExecBase:
	DC.B	155,'4mExecBase',155,'0m:',13,10
TEnd_ExecBase:
Text_ColdCapture:
	DC.B	'- ColdCapture:              $002A   42 :'
TEnd_ColdCapture:
Text_CoolCapture:
	DC.B	'- CoolCapture:              $002E   46 :'
TEnd_CoolCapture:
Text_WarmCapture:
	DC.B	'- WarmCapture:              $0032   50 :'
TEnd_WarmCapture:
Text_KickMemPtr:
	DC.B	'- KickMemPtr:               $0222  546 :'
TEnd_KickMemPtr:
Text_KickTagPtr:
	DC.B	'- KickTagPtr:               $0226  550 :'
TEnd_KickTagPtr:
Text_DoIO:
	DC.B	'- DoIO:                     $FE3A -454 :'
TEnd_DoIO:
Text_OldOpenLibrary:
	DC.B	'- OldOpenLibrary:           $FE68 -408 :'
TEnd_OldOpenLibrary:
Text_OpenLibrary:
	DC.B	'- OpenLibrary:              $FDD8 -552 :'
TEnd_OpenLibrary:

Text_Warning:
	DC.B	155,'1;33m'
TEnd_Warning:
Text_Normal:
	DC.B	155,'0;31m'
TEnd_Normal:
Text_HexNumber:
	DC.B	' $00000000'
Text_HexNumberStart:
	DC.B	13,10
TEnd_HexNumber:
