	section Code,Code_c

MEMORY	equ	8*40*256

	include	df0:AGA-SourceCode/HardwareEquates

	move.l	4.w,a6
	move.l	#MEMORY,d0
	move.l	#$10002,d1		clear chip
	jsr	-198(a6)		AllocMem
	move.l	d0,screenmem

	move.l	d0,screen1

	bsr	make.copper.lists

	move.l	4.w,a6
	jsr	-132(a6)		turn off multitasking

	lea	$dff000,a6
	move.w	intenar(a6),ints	save system interrupt status
	move.w	#$3fef,intena(a6)
	move.w	#$c010,intena(a6)	enable copper interrupt

vpwait	move.l	vposr(a6),d0		get vertical beam position
	and.l	#$1ff00,d0
	lsr.l	#8,d0
	cmp.w	#312,d0			wait for bottom line
	bne.s	vpwait			before disabling sprite DMA

	move.w	#$03ff,dmacon(a6)	DMA off

	move.l	$14.w,olddbz		division-by-zero exception handler
	move.l	#rteins,$14.w		set to rte instruction


*
* SET SCREEN SIZE ETC
*
	move.w	#$0210,bplcon0(a6)	initialise screen
	move.w	#$2c81,diwstrt(a6)
	move.w	#$2cc1,diwstop(a6)
	move.w	#$38,ddfstrt(a6)
	move.w	#$d8,ddfstop(a6)
	move.w	#0,bplcon1(a6)
	move.w	#$0224,bplcon2(a6)
	move.w	#40*7-8,bpl1mod(a6)
	move.w	#40*7-8,bpl2mod(a6)

*
* SET THE NEW COPPER LOCATION
*
	move.l	4.w,a6
	lea	grafname(pc),a1
	moveq	#0,d0
	jsr	-552(a6)		openlibrary
	tst.l	d0
	beq	end
	move.l	d0,gfxbase
	move.l	d0,a6
	jsr	-456(a6)		ownblitter

	move.l	gfxbase(pc),a1
	move.l	38(a1),oldcopper

	lea	$dff000,a6
	move.l	copper1(pc),cop1lch(a6)
	move.w	d0,copjmp1(a6)
	move.w	#$83c0,dmacon(a6)	DMA on (bitplane, copper, blitter)



*
* INITIALISE LEVEL 3 INTERRUPT
*

	move.l	$6c.w,old
	move.l	#level3,$6c.w


*****************************************
*		MAIN LOOP		*
*****************************************

	move.w	#$100,d7
	lea	Red.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$111,d7
	lea	Grey.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$001,d7
	lea	Blue.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$010,d7
	lea	Green.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$011,d7
	lea	Cyan.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$110,d7
	lea	Gold.256.Colours(pc),a0
	bsr	Initialize.Colours

	move.w	#$101,d7
	lea	Purple.256.Colours(pc),a0
	bsr	Initialize.Colours

	lea	ColourList+24(pc),a0
	moveq	#0,d0
	bsr	Set.Colours

	bsr	Do.Block

loop
	clr.w	nextframe
wait	tst.w	nextframe
	beq.s	wait

	btst	#6,$bfe001
	bne.s	loop



*
* EXIT ROUTINE
*


wait2	btst	#6,dmaconr(a6)		wait for blitter to finish
	bne.s	wait2

	move.l	old(pc),$6c.w

	move.l	oldcopper(pc),cop1lch(a6)

	move.w	#$8030,dmacon(a6)	DMA on (sprite, disk)
	move.w	ints(pc),d0
	ori.w	#$c000,d0		set SET and INTEN bits
	move.w	d0,intena(a6)		restore system interrupt status

	move.l	olddbz(pc),$14.w   restore division-by-zero exception handler

	move.l	gfxbase(pc),a6
	jsr	-462(a6)		disownblitter
	move.l	gfxbase(pc),a1
	move.l	4.w,a6
	jsr	-414(a6)		closelibrary

end	move.l	4.w,a6
	jsr	-138(a6)		turn on multitasking

	move.l	4.w,a6
	move.l	screenmem(pc),a1
	move.l	#MEMORY,d0
	jsr	-210(a6)		FreeMem

	moveq	#0,d0
	rts



*********************
* LEVEL 3 INTERRUPT *
*********************


level3	movem.l	d0-d7/a0-a6,-(sp)
	move.w	#$10,intreq(a6)

	move.w	#1,nextframe

	btst	#2,potgor(a6)
	bne.s	No.Colour.Change

Wait.Release
	btst	#2,potgor(a6)
	beq.s	Wait.Release
	
	lea	ColourList(pc),a0
	move.w	List.Pointer(pc),d0
	mulu	#4,d0
	lea	(a0,d0.w),a0
	addq.w	#1,List.Pointer
	move.l	a0,Main.Colour.Pointer

	cmp.l	#$ffffffff,(a0)
	bne.s	Set.Pointer

	move.l	#ColourList,Main.Colour.Pointer
	move.w	#1,List.Pointer
Set.Pointer
	move.l	Main.Colour.Pointer(pc),a0
	moveq	#0,d0

	bsr	Set.Colours

No.Colour.Change
	movem.l	(sp)+,d0-d7/a0-a6
rteins	rte


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


BLOCK.HEIGHT	EQU	16

Do.Block
	move.l	Screen1(pc),a0
	move.l	a0,a2
	moveq	#0,d7			colour
	moveq	#16-1,d2
Next.Row
	moveq	#20-1,d1

Next.Column
	move.w	#BLOCK.HEIGHT-1,d0
	move.l	a0,a1

Next.Block.Line
	btst	#0,d7
	beq	Skip.One
	move.w	#$ffff,(a1)
Skip.One
	btst	#1,d7
	beq	Skip.Two
	move.w	#$ffff,40(a1)
Skip.Two
	btst	#2,d7
	beq	Skip.Three
	move.w	#$ffff,80(a1)
Skip.Three
	btst	#3,d7
	beq	Skip.Four
	move.w	#$ffff,120(a1)
Skip.Four
	btst	#4,d7
	beq	Skip.Five
	move.w	#$ffff,160(a1)
Skip.Five
	btst	#5,d7
	beq	Skip.Six
	move.w	#$ffff,200(a1)
Skip.Six
	btst	#6,d7
	beq	Skip.Seven
	move.w	#$ffff,240(a1)
Skip.Seven
	btst	#7,d7
	beq	Skip.Eight
	move.w	#$ffff,280(a1)
Skip.Eight
	add.w	#320,a1
	dbra	d0,Next.Block.Line	

	addq.w	#1,d7

	cmp.w	#256,d7
	beq.s	Exit.Do.Block	

	addq.w	#2,a0
	dbra	d1,Next.Column

	add.l	#40*8*BLOCK.HEIGHT,a2
	move.l	a2,a0

	dbra	d2,Next.Row

Exit.Do.Block
	rts


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


; a0 = ColourList Pointers
; d0 = Which Set of 32 To Affect

Set.Colours
	move.l	(a0),a1
	moveq	#8-1,d7
Next.32.Set
	move.w	#$0c40,d1
	or.w	d0,d1
	move.w	d1,$106(a6)
	lea	$dff180,a2
	moveq	#16-1,d2
Next.Colour.C40
	move.l	(a1)+,(a2)+
	dbra	d2,Next.Colour.C40

	move.w	#$0e40,d1
	or.w	d0,d1
	move.w	d1,$106(a6)
	lea	$dff180,a2
	moveq	#16-1,d2

Next.Colour.E40
	move.l	(a1)+,(a2)+
	dbra	d2,Next.Colour.E40

	add.w	#$2000,d0
	dbra	d7,Next.32.Set

	rts


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

; a0 - Memory Address To Store Colours
; d7 - Increment Value

Initialize.Colours
	moveq	#0,d0
	move.l	d0,d1
	moveq	#8-1,d4
Lop1
	moveq	#2-1,d5	
	moveq	#16-1,d6
Lop2
	move.w	d0,(a0)+
	dbra	d6,Lop2
	add.w	d7,d0
	moveq	#16-1,d6
	dbra	d5,Lop2
	moveq	#16-1,d6
	moveq	#2-1,d5
Lop3
	move.w	d1,(a0)+
	add.w	d7,d1
	dbra	d6,Lop3
	moveq	#16-1,d6
	moveq	#0,d1
	dbra	d5,Lop3

	dbra	d4,Lop1

	rts

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


make.copper.lists
	move.l	Screen1(pc),d0
	move.l	#Bit.Screen,a0


init.copper
	moveq	#8-1,d1
next.plane
	move.w	d0,6(a0)		save low word
	swap	d0
	move.w	d0,2(a0)		save high word
	swap	d0
	add.l	#40,d0			next bitplane
	addq.w	#8,a0			update pointer to copper list
	dbra	d1,next.plane
	rts



;""""""""""""""""""""""""""""""""""""""""
;	" THE COPPER LIST "
;	"                 "
;	"""""""""""""""""""

copper.list.1
	dc.w	$010c,$0011
	dc.w	$0106,$0c40

Bit.Screen
	dc.w	bpl1pth			8 bitplane display
	dc.w	0,bpl1ptl
	dc.w	0,bpl2pth
	dc.w	0,bpl2ptl
	dc.w	0,bpl3pth
	dc.w	0,bpl3ptl
	dc.w	0,bpl4pth
	dc.w	0,bpl4ptl
	dc.w	0,bpl5pth
	dc.w	0,bpl5ptl
	dc.w	0,bpl6pth
	dc.w	0,bpl6ptl
	dc.w	0,bpl7pth
	dc.w	0,bpl7ptl
	dc.w	0,bpl8pth
	dc.w	0,bpl8ptl
	dc.w	0

	dc.w	$01e4,$2100
	dc.w	$01fc,$0003

	dc.w	$2c01,$fffe

	dc.w	intreq,$8010

	dc.w	$ffff,$fffe		END



*************
* VARIABLES *
*************


screenmem	dc.l	0
screen1		dc.l	0

copper1		dc.l	copper.list.1

olddbz		dc.l	0
oldcopper	dc.l	0
gfxbase		dc.l	0
ints		dc.w	0
old		dc.l	0
nextframe	dc.w	0
List.Pointer	dc.w	0
Main.Colour.Pointer
		dc.l	ColourList

ColourList	dc.l	Red.256.Colours
		dc.l	Grey.256.Colours
		dc.l	Blue.256.Colours
		dc.l	Green.256.Colours
		dc.l	Cyan.256.Colours
		dc.l	Gold.256.Colours
		dc.l	Purple.256.Colours
		dc.l	$ffffffff

grafname	dc.b	'graphics.library',0
		even

Red.256.Colours
	ds.w	32*2*8

Grey.256.Colours
	ds.w	32*2*8

Blue.256.Colours
	ds.w	32*2*8

Green.256.Colours
	ds.w	32*2*8

Cyan.256.Colours
	ds.w	32*2*8

Gold.256.Colours
	ds.w	32*2*8

Purple.256.Colours
	ds.w	32*2*8
