ExecBase	EQU	4
OpenLibrary	EQU	-552
AllocMem	EQU	-198
FreeMem		EQU	-210

* Graphics
InitBitmap	EQU	-390
InitRastPort	EQU	-198
SetAPen		EQU	-342
Move		EQU	-240
Text		EQU	-60
ScrollRaster	EQU	-396

Bitmap_Size	EQU	50000

	OPT	P+			Relocatable Code

	BSR	Open_Libraries
	BSR	Get_Memory
	BSR	Clear_Bitmap
	BSR	Init_Screen
	BSR	Setup_Copper

	BSR	Init_Scroller
	BSR	Put_Text_On_Screen

Wait_Mouse_Press
	CMPI.B	#0,$DFF006
	BNE	Wait_Mouse_Press
	BSR	Move_BackGround
	BSR	Move_ForeGround
	BSR	Move_ForeGround
	BSR	Pulse_Colours
	BSR	Fade_Prompt
	BSR	Fade_Prompt
	BSR	Scroll_Msg
	LEA	Scroll_Delay(PC),A0
	SUBQ.B	#1,(A0)
	BNE	Not_Text_Time
	BSR	Put_Char_On

Not_Text_Time
	BSR	Pause_Routine
	BTST	#6,$BFE001
	BNE	Wait_Mouse_Press
Finish
	BSR	Reset_Copper
	BSR	Free_Memory
	CLR.L	D0
	RTS

Open_Libraries:
	MOVE.L	ExecBase,A6
	LEA	GfxName(PC),A1
	CLR.L	D0
	JSR	OpenLibrary(A6)
	LEA	GfxBase(PC),A1
	MOVE.L	D0,(A1)
	RTS

Get_Memory:
* Memory For Copper List
	MOVE.L	#Copper_Size,D0
	MOVEQ.L	#3,D1
	JSR	AllocMem(A6)
	LEA	Copper_Mem(PC),A0
	MOVE.L	D0,(A0)
* Memory For Bitmap
	MOVE.L	#Bitmap_Size,D0
	MOVE.L	#3,D1
	JSR	AllocMem(A6)
	LEA	Bitmap_Mem(PC),A0
	MOVE.L	D0,(A0)
	RTS

Free_Memory:
	MOVE.L	ExecBase,A6
	MOVE.L	Copper_Mem(PC),A1
	MOVE.L	#Copper_Size,D0
	JSR	FreeMem(A6)
	MOVE.L	Bitmap_Mem(PC),A1
	MOVE.L	#Bitmap_Size,D0
	JSR	FreeMem(A6)
	RTS

Clear_Bitmap:
	MOVE.L	Bitmap_Mem(PC),A0
	MOVE.L	A0,D0
	MOVE.L	#3300,D1
Clr_Bmap
	CLR.L	(A0)+
	SUBQ.L	#1,D1
	BNE	Clr_Bmap
Set_Bitmap_Address
	LEA	Bitmap_Lo(PC),A1
	MOVE.W	D0,(A1)
	SWAP	D0
	LEA	Bitmap_Hi(PC),A1
	MOVE.W	D0,(A1)
	RTS

Init_Screen:
	MOVE.L	GfxBase(PC),A6
	LEA	Bitmap_Struct(PC),A0
	MOVE.L	#1,D0				Depth
	MOVE.L	#$300,D1			Width
	MOVE.L	#$C0,D2				Height
	JSR	InitBitmap(A6)
	LEA	Bitmap_Struct(PC),A0
	MOVE.L	Bitmap_Mem(PC),8(A0)
	LEA	RastPort_Struct(PC),A1
	JSR	InitRastPort(A6)
	LEA	Bitmap_Struct(PC),A0
	LEA	RastPort_Struct(PC),A1
	MOVE.L	A0,4(A1)
	RTS

Setup_Copper:
	MOVE.L	Copper_Mem(PC),A0
	LEA	My_Copper_List(PC),A1
Move_Copper_List
	MOVE.L	(A1),(A0)+
	CMP.L	#$FFFFFFFE,(A1)+
	BNE	Move_Copper_List
	MOVE.W	#$0080,$DFF096			Stop Copper Int.
	MOVE.L	GfxBase(PC),A1
	LEA	Old_Copper_Base(PC),A0
	MOVE.L	$32(A1),(A0)
	MOVE.L	Copper_Mem(PC),$32(A1)
	MOVE.W	#$8080,$DFF096			Start Copper Int.
	RTS

Reset_Copper:
	MOVE.W	#$0080,$DFF096			Stop Copper Int.
	MOVE.L	GfxBase(PC),A0
	MOVE.L	Old_Copper_Base(PC),$32(A0)
	MOVE.W	#$8080,$DFF096			Start Copper Int.
	RTS

Move_BackGround
	MOVE.L	Copper_Mem(PC),A0
	ADD.L	#Wrap_Start-My_Copper_List,A0
	MOVE.L	A0,A1
	MOVE.L	#58,D0				Num. Cop Lines
BackGround_Line
	MOVE.W	18(A0),6(A0)
	ADD.L	#12,A0
	DBF	D0,BackGround_Line
	MOVE.W	6(A1),6(A0)
	RTS

Move_ForeGround
	MOVE.L	Copper_Mem(PC),A0
	ADD.L	#Wrap_End-My_Copper_List,A0
	MOVE.L	A0,A1
	MOVE.L	#58,D0
ForeGround_Line
	MOVE.W	10(A0),22(A0)
	SUB.L	#12,A0
	DBF	D0,ForeGround_Line
	MOVE.W	10(A1),22(A0)
	RTS

Pulse_Colours
	LEA	Red(PC),A0
	BSR	Pulse_Colour
	LEA	Green(PC),A0
	BSR	Pulse_Colour
	RTS

Pulse_Colour
	TST.B	1(A0)
	BEQ	Inc_Red
	SUBQ.B	#1,(A0)
	CMPI.B	#0,(A0)
	BNE	Pulse_Exit
	NOT.B	1(A0)
	RTS
Inc_Red	ADDQ.B	#1,(A0)
	CMPI.B	#14,(A0)
	BNE	Pulse_Exit
	NOT.B	1(A0)
Pulse_Exit
	RTS

Fade_Prompt
	MOVE.L	Copper_Mem(PC),A0
	ADD.L	#Bot_Col-My_Copper_List,A0
	CLR.L	D1
	CLR.L	D0
	MOVE.B	Red(PC),D0
	LSL.W	#8,D0
	CLR.L	D1
	MOVE.B	Green(PC),D1
	LSL.W	#4,D1
	ADD.L	D1,D0
	CLR.L	D1
	MOVE.B	Blue(PC),D1
	ADD.L	D1,D0
	MOVE.W	D0,(A0)
	RTS
		

Pause_Routine
	RTS

	MOVEM.L	D0,-(SP)
	MOVE.L	#200,D0
Pause_Loop
	SUBQ.L	#1,D0
	BNE	Pause_Loop
	MOVEM.L	(SP)+,D0
	RTS

Scroll_Msg
	LEA	RastPort_Struct(PC),A1
	MOVEQ.L	#2,D0				DX
	MOVEQ.L	#0,D1				DY
	MOVEQ.L	#0,D2				XMIN
	MOVE.L	#73,D3				YMIN
	MOVE.L	#409,D4				XMAX
	MOVE.L	#85,D5				YMAX
	MOVE.L	GfxBase(PC),A6
Wait_Line
	CMPI.B	#140,$DFF006
	BNE.S	Wait_Line
	JSR	ScrollRaster(A6)
	RTS

Put_Char_On
	MOVE.B	#4,(A0)			Reset delay counter
	LEA	RastPort_Struct(PC),A1
	MOVE.L	#390,D0
	MOVE.L	#80,D1
	JSR	Move(A6)
	MOVE.L	Scroll_Pointer(PC),A0
	MOVEQ.L	#1,D0
	JSR	Text(A6)
	LEA	Scroll_Pointer(PC),A0
	ADDQ.L	#1,(A0)
	MOVE.L	(A0),A0
	CMPI.B	#0,(A0)
	BNE	Not_Wrap
Init_Scroller
	LEA	Scroll_Message(PC),A0
	LEA	Scroll_Pointer(PC),A1
	MOVE.L	A0,(A1)
Not_Wrap
	RTS

GfxName	DC.B	'graphics.library',0
	EVEN

Put_Text_On_Screen
	MOVE.L	GfxBase(PC),A6
	LEA	RastPort_Struct(PC),A1
	MOVEQ.L	#1,D0				Pen
	JSR	SetAPen(A6)
	MOVE.L	#180,D0
	MOVEQ.L	#20,D1
	JSR	Move(A6)
	LEA	RastPort_Struct(PC),A1
	MOVE.L	#60,D0
	MOVE.L	#120,D1
	JSR	Move(A6)
	LEA	Message_4(PC),A0
	MOVEQ.L	#Message_4_Size,D0
	JSR	Text(A6)
	RTS

My_Copper_List
	DC.L	$01001200,$01020000,$01080000,$010A0000
	DC.L	$00920020,$009400D8,$008E1C00,$009030FF
	DC.L	$01040024
	DC.W	$00E0
Bitmap_Hi
	DC.W	$0007
	DC.W	$00E2
Bitmap_Lo
	DC.W	$0870
	DC.L	$01800000,$01820FFF

Wrap_Start
	DC.L	$3401FFFE,$01800000,$01820000
	DC.L	$3501FFFE,$01800001,$01820100
	DC.L	$3601FFFE,$01800002,$01820200
	DC.L	$3701FFFE,$01800003,$01820300
	DC.L	$3801FFFE,$01800004,$01820400
	DC.L	$3901FFFE,$01800005,$01820500
	DC.L	$3A01FFFE,$01800006,$01820600
	DC.L	$3B01FFFE,$01800007,$01820700
	DC.L	$3C01FFFE,$01800008,$01820800
	DC.L	$3D01FFFE,$01800009,$01820900
	DC.L	$3E01FFFE,$0180000A,$01820A00
	DC.L	$3F01FFFE,$0180000B,$01820B00
	DC.L	$4001FFFE,$0180000C,$01820C00
	DC.L	$4101FFFE,$0180000D,$01820D00
	DC.L	$4201FFFE,$0180000E,$01820E00
	DC.L	$4301FFFE,$0180000F,$01820F00
	DC.L	$4401FFFE,$0180001F,$01820F10
	DC.L	$4501FFFE,$0180002F,$01820F20
	DC.L	$4601FFFE,$0180003F,$01820F30
	DC.L	$4701FFFE,$0180004F,$01820F40
	DC.L	$4801FFFE,$0180005F,$01820F50
	DC.L	$4901FFFE,$0180006F,$01820F60
	DC.L	$4A01FFFE,$0180007F,$01820F70
	DC.L	$4B01FFFE,$0180008F,$01820F80
	DC.L	$4C01FFFE,$0180009F,$01820F90
	DC.L	$4D01FFFE,$018000AF,$01820FA0
	DC.L	$4E01FFFE,$018000BF,$01820FB0
	DC.L	$4F01FFFE,$018000CF,$01820FC0
	DC.L	$5001FFFE,$018000DF,$01820FD0
	DC.L	$5101FFFE,$018000EF,$01820FE0
	DC.L	$5201FFFE,$018000FF,$01820FF0
	DC.L	$5301FFFE,$018000FE,$01820FE0
	DC.L	$5401FFFE,$018000FD,$01820FD0
	DC.L	$5501FFFE,$018000FC,$01820FC0
	DC.L	$5601FFFE,$018000FB,$01820FB0
	DC.L	$5701FFFE,$018000FA,$01820FA0
	DC.L	$5801FFFE,$018000F9,$01820F90
	DC.L	$5901FFFE,$018000F8,$01820F80
	DC.L	$5A01FFFE,$018000F7,$01820F70
	DC.L	$5B01FFFE,$018000F6,$01820F60
	DC.L	$5C01FFFE,$018000F5,$01820F50
	DC.L	$5D01FFFE,$018000F4,$01820F40
	DC.L	$5E01FFFE,$018000F3,$01820F30
	DC.L	$5F01FFFE,$018000F2,$01820F20
	DC.L	$6001FFFE,$018000F1,$01820F10
	DC.L	$6101FFFE,$018000F0,$01820F00
	DC.L	$6201FFFE,$018000E0,$01820E00
	DC.L	$6301FFFE,$018000D0,$01820D00
	DC.L	$6401FFFE,$018000C0,$01820C00
	DC.L	$6501FFFE,$018000B0,$01820B00
	DC.L	$6601FFFE,$018000A0,$01820A00
	DC.L	$6701FFFE,$01800090,$01820900
	DC.L	$6801FFFE,$01800080,$01820800
	DC.L	$6901FFFE,$01800070,$01820700
	DC.L	$6A01FFFE,$01800060,$01820600
	DC.L	$6B01FFFE,$01800050,$01820500
	DC.L	$6C01FFFE,$01800040,$01820400
	DC.L	$6D01FFFE,$01800030,$01820300
	DC.L	$6E01FFFE,$01800020,$01820200
	DC.L	$6F01FFFE,$01800010,$01820100
Wrap_End
	DC.L	$7001FFFE,$01800000,$01820000
	DC.L	$7101FFFE,$01800000,$01820000
	DC.L	$7201FFFE,$01820FFF,$01800000
	DC.W	$D001,$FFFE,$0182
Bot_Col	DC.W	$0333
	DC.L	$FFFFFFFE
Copper_Size	EQU *-My_Copper_List

Message		DC.B	'MATRIX'
Message_Size	EQU *-Message
		EVEN
Message_2	DC.B	'PRESENTS'
Message_2_Size	EQU *-Message_2
		EVEN
Message_3	DC.B	'A GOOD DEMO!'
Message_3_Size	EQU *-Message_3
		EVEN
Message_4	DC.B	'Press Left Button To Continue'
Message_4_Size	EQU *-Message_4
		EVEN
Scroll_Pointer	DC.L	0
Scroll_Delay	DC.B	50
Scroll_Message
		DC.B 	'HI FROM MATRIX , JUST A SMALL DEMO....'
		
                DC.B 0
GfxBase		DC.L	0
Copper_Mem	DC.L	0
Bitmap_Mem	DC.L	0
Old_Copper_Base	DC.L	0
Red		DC.B	10,0
Green		DC.B	10,0
Blue		DC.B	10,0
Bitmap_Struct	DS.L	30
RastPort_Struct	DS.L	30

