	Section	Demo,Code_C

	Opt	C-,O+,w-
	opt	d+

	; CHESSFUNK, WRITTEN BY SHAGRATT/LSD.
	
	; how chessfunk works. There is a bitmap in memory, of graduated
	; squares one pixel high, with the processor you build a copperlist.
	; the copperlist has a modulo of -40 (repeats the same line)
	; and just re-sets the bitplane pointers to one of the lines
	; on the bitmap.

		
Start:	lea	$dff000,a5		; hardware base address

	Move.w	$1c(a5),OldInt	; Save Old Interupts
	Move.w	$02(a5),OldDma	; Save Old DMA

	Move.w	#$7fff,$9a(a5)	; Clear DMA
	Move.w	#$7fff,$96(a5)	; Clear Interupts
	Move.w	#$7fff,$9c(a5)	; Clear Interupt Requests
	
	Move.b	#$7f,$bfed01	; kill timers (rem me for disk)
	Move.l	$6c.w,OldV3		; save level 3 int

	Move.l	#cf_level3,$6c.w	; put new copper interupt
	Move.l	#cf_copper,$80(a5) 	; Address of copper 1
	Move.l	#dead_copper,$84(a5) 	; Address of copper 1

	Move.w	#$c010,$9a(a5)	; Start interupts

	Move.w	#$83ef,$96(a5)	; Start DMA ( 83ff for disk dma)
	Move.w	#1,$88(a5)		; Strobe for copper start

	move.l	#chessbin+(40*0),d0
	move.w	d0,temp0_lo
	swap	d0
	move.w	d0,temp0_hi
	swap	d0

	add.l	#40,d0
	move.w	d0,temp1_lo
	swap	d0
	move.w	d0,temp1_hi

	bsr	do_funk

wait:	btst	#6,$bfe001
	bne.s	wait		; wait for lmb


	lea	$dff000,a5		; hardware base address
	move.l	#0,$80(a5)		; blank copper list
	move.l	#0,$84(a5)		; if gfx lib not open (slayer boot)
	move.w	#0,$180(a5)		; bgc to black
	
	Move.l	OldV3,$6c.w		; restore old l3
	
	Lea	GfxLib,a1		; Pointer to Library Text
	move.l	4.w,a6
	jsr	-132(a6)		; forbid
	Move.l	4.w,a6		; Exec
	Moveq.l	#0,d0		; Clear D0
	Jsr	-$228(a6)		; Open Library
	cmp.l	#0,d0
	beq	no_gfx_lib		; if gfx lib not open dont restore copper lib (slayer boot)
	
	Move.l	d0,a1			
	Move.l	$26(a1),$80(a5)	; restore copper 1
	Move.l	$32(a1),$84(a5)	; restore copper 2
no_gfx_lib:

	Move.w	OldInt,d0		; start old interupts
	Or.w	#$8000,d0
	Move.w	d0,$9a(a5)
	Move.w	OldDma,d0		; start old DMA
	Or.w	#$8000,d0
	Move.w	d0,$96(a5)
	Move.b	#$9b,$bfed01	; Start Timers
	Move.l	4.w,a6		; Close Gfx lib
	Jsr	-$19e(a6)
	move.l	4.w,a6
	jsr	-138(a6)		; permit

	move.w	#0,$bfec00		; clear kbd

	Moveq.l	#0,d0		; No errors
	Rts			; Exit


cf_level3:
	Movem.l	d0-d7/a0-a6,-(a7)	; New copper
	Move.w	#$10,$dff09c	; Serviced Interupt

	btst	#10,$dff016
	beq	.Exit

	bsr	do_funk

	;move.w	#$666,$dff180

.Exit	Movem.l	(a7)+,d0-d7/a0-a6
	Rte			; Return from Interupt

do_funk:	*-------------------------*
	lea	sintable,a0
	move.w	funk_size2,d0
	move.w	(a0,d0),d0
	muls	#38,d0
	swap	d0
	add.w	#38/2,d0
	move.w	d0,funk_size1	

	add.w	#4,funk_size2	
	and.w	#$1fe,funk_size2	

	move.w	funk_size4,d0
	move.w	(a0,d0),d0
	muls	#38,d0
	swap	d0
	add.w	#38/2,d0
	move.w	d0,funk_size3	

	add.w	#4,funk_size4	
	and.w	#$1fe,funk_size4

	move.w	funk_size1,d0
	mulu	#40*2,d0
	add.l	#chessbin,d0
	move.w	d0,temp0_lo
	swap	d0
	move.w	d0,temp0_hi
	swap	d0
	add.l	#40,d0
	move.w	d0,temp1_lo
	swap	d0
	move.w	d0,temp1_hi

	move.w	funk_size3,d0
	mulu	#40*2,d0
	add.l	#chessbin,d0
	move.w	d0,temp2_lo
	swap	d0
	move.w	d0,temp2_hi
	swap	d0
	add.l	#40,d0
	move.w	d0,temp3_lo
	swap	d0
	move.w	d0,temp3_hi
	
	************

	move.l	copper2_ptr+8,a0
	
	lea	funk_list,a1
	move.w	funk_size1,d0
	asl.w	#1,d0
	move.w	(a1,d0),d5
	ext.l	d5
	asl.l	#8,d5
	asl.l	#8,d5
	asl.l	#8,d5

	move.w	(a1,d0),d0
	ext.l	d0
	asl.l	#8,d0

	move.l	#$2c01fffe,d6

	move.w	#31,d7

.loop	move.l	fake_copper+0,(a0)+
	move.l	fake_copper+4,(a0)+

	bsr	.nextline
	move.l	d6,(a0)+

	move.l	fake_copper+8,(a0)+
	move.l	fake_copper+12,(a0)+
	
	bsr	.nextline
	move.l	d6,(a0)+

	dbf	d7,.loop	

	move.l	#$fffffffe,(a0)+

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

	move.l	copper2_ptr+12,a0
	
	lea	funk_list,a1
	move.w	funk_size3,d0
	asl.w	#1,d0
	move.w	(a1,d0),d5
	ext.l	d5
	asl.l	#8,d5
	asl.l	#8,d5
	asl.l	#8,d5

	move.w	(a1,d0),d0
	ext.l	d0
	asl.l	#8,d0

	move.l	#$2c01fffe,d6

	move.w	#31,d7

.loop2	move.l	fake_copper+16,(a0)+
	move.l	fake_copper+20,(a0)+

	bsr	.nextline
	move.l	d6,(a0)+

	move.l	fake_copper+24,(a0)+
	move.l	fake_copper+28,(a0)+
	
	bsr	.nextline
	move.l	d6,(a0)+

	dbf	d7,.loop2

	move.l	#$fffffffe,(a0)+

	*********
	
	move.l	copper2_ptr+0,a0
	move.l	copper2_ptr+8,a1
	move.l	copper2_ptr+12,a2

	move.l	#$01002200,(a0)+

	move.l	12(a2),(a0)+	
	move.l	16(a2),(a0)+	
	move.l	12(a1),(a0)+	
	move.l	16(a1),(a0)+	

	move.l	#$2c01fffe,(a0)+

.combine	move.l	8(a1),d0
	and.l	#$ff000000,d0
	move.l	8(a2),d1
	and.l	#$ff000000,d1

	swap	d0
	swap	d1

	cmp.l	d0,d1
	beq	.bothfirst
	blt	.c1first
	
	move.l	8(a1),(a0)+
	move.l	0(a1),(a0)+	
	move.l	4(a1),(a0)+	
	lea	12(a1),a1
	
	bra	.next

.c1first	move.l	8(a2),(a0)+
	move.l	0(a2),(a0)+	
	move.l	4(a2),(a0)+	
	lea	12(a2),a2

	bra	.next

.bothfirst	
	
	cmp.l	#$ffe1fffe,8(a2)
	beq	.xit1

	move.l	8(a1),(a0)+
	
	move.l	0(a2),(a0)+	
	move.l	4(a2),(a0)+	
	move.l	0(a1),(a0)+	
	move.l	4(a1),(a0)+	
	
	lea	12(a1),a1
	lea	12(a2),a2

	bra	.next
	
.next	cmp.l	#$ffe1fffe,(a1)
	bne	.combine
	
.xit1	cmp.l	#$ffe1fffe,8(a1)
	beq	.c1fin
	
	move.l	8(a1),(a0)+
	move.l	0(a1),(a0)+	
	move.l	4(a1),(a0)+	
	lea	12(a1),a1
	bra	.xit1

.c1fin	cmp.l	#$ffe1fffe,8(a2)
	beq	.c2fin
	
	move.l	8(a2),(a0)+
	move.l	0(a2),(a0)+	
	move.l	4(a2),(a0)+	
	lea	12(a2),a2
	bra	.xit1

.c2fin	move.l	4(a1),8(a1)
	move.l	0(a1),4(a1)
	move.l	4(a2),8(a2)
	move.l	0(a2),4(a2)

	lea	4(a1),a1
	lea	4(a2),a2

	move.l	#$ffe1fffe,(a0)+

.combine2	move.l	8(a1),d0
	and.l	#$ff000000,d0
	move.l	8(a2),d1
	and.l	#$ff000000,d1

	swap	d0
	swap	d1

	cmp.l	d0,d1
	beq	.bothfirst2
	blt	.c1first2
	
	move.l	8(a1),(a0)+
	move.l	0(a1),(a0)+	
	move.l	4(a1),(a0)+	
	lea	12(a1),a1
	
	bra	.next2

.c1first2	move.l	8(a2),(a0)+
	move.l	0(a2),(a0)+	
	move.l	4(a2),(a0)+	
	lea	12(a2),a2

	bra	.next2

.bothfirst2

	move.l	8(a2),(a0)+
	move.l	0(a2),(a0)+	
	move.l	4(a2),(a0)+	
	move.l	0(a1),(a0)+	
	move.l	4(a1),(a0)+	

	lea	12(a1),a1
	lea	12(a2),a2

	move.l	(a2),d0
	cmp.l	#$fffffffe,d0
	beq	.xit2
	
	bra	.next2
	
.next2	cmp.l	#$fffffffe,(a1)
	bne	.combine2

.xit2
	move.l	#$fffffffe,(a0)+


	move.l	copper2_ptr,d0
	move.l	copper2_ptr+4,copper2_ptr
	move.l	d0,copper2_ptr+4
	move.l	d0,$dff084

	*-------------------------*

.exit	rts


.nextline	add.l	d5,d6
	bcc	.ok
	
	move.l	#$ffe1fffe,(a0)+
	
.ok	rts

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

cf_copper:	dc.w	$100,$0200		; 4 bp - lo res
	dc.w	$104,$a		; bp control reg
	dc.w	$108,-40		; bp modulo - odd
	dc.w	$10a,-40		; bp modulo - even
	dc.w	$180,0		; colour 0 to black
	dc.w	$102,0
		
	dc.w	$08e,$2c81		; bp window start left
	dc.w	$090,$2cc1		; bp window bot right

	dc.w	$94,$d0		; bp stop horz
	dc.w	$92,$38
		
	dc.w	$120,0,$122,0
	dc.w	$124,0,$126,0
	dc.w	$128,0,$12a,0
	dc.w	$12c,0,$12e,0
	dc.w	$130,0,$132,0
	dc.w	$134,0,$136,0
	dc.w	$138,0,$13a,0
	dc.w	$13c,0,$13e,0
				
	dc.w	$180,$000
	dc.w	$182,$00f
	dc.w	$184,$f00
	dc.w	$186,$f00

	dc.w	$1c01,$fffe
	dc.w	$9c,$8010	; irq set bits - restart copper
				
	dc.w	$8a,0	; strobe copper 2				
	dc.w	$ffff,$fffe	; end of copper list

dead_copper:dc.w	$ffff,$fffe	; end of copper list

	

fake_copper:dc.w	  $e0
temp0_hi:	dc.w	0,$e2
temp0_lo:	dc.w	0,$e0
temp1_hi:	dc.w	0,$e2
temp1_lo:	dc.w	0,$e4
temp2_hi:	dc.w	0,$e6
temp2_lo:	dc.w	0,$e4
temp3_hi:	dc.w	0,$e6
temp3_lo:	dc.w	0

copper2_ptr:dc.l	copper_spc1
	dc.l	copper_spc2
	dc.l	copper_spc3
	dc.l	copper_spc4
		
funk_size1:	dc.w	0
funk_size2:	dc.w	0
funk_size3:	dc.w	0
funk_size4:	dc.w	256

funk_list:	dc.w	78
	dc.w	76
	dc.w	74
	dc.w	72
	dc.w	70
	dc.w	68
	dc.w	66
	dc.w	64
	dc.w	62
	dc.w	60
	dc.w	58
	dc.w	56
	dc.w	54
	dc.w	52
	dc.w	50
	dc.w	48
	dc.w	46
	dc.w	44
	dc.w	42
	dc.w	40
	dc.w	38
	dc.w	36
	dc.w	34
	dc.w	32
	dc.w	30
	dc.w	28
	dc.w	26
	dc.w	24
	dc.w	22
	dc.w	20
	dc.w	18
	dc.w	16
	dc.w	14
	dc.w	12
	dc.w	10
	dc.w	08
	dc.w	06
	dc.w	04
	dc.w	02
	dc.w	00

delay:	dc.w	0		

oldint:	dc.l	0
olddma:	dc.l	0
oldv3:	dc.l	0
gfxlib:	dc.b	"graphics.library",0
	even

chessbin:	incbin	"dh0:data/joes/data/chessfunk.bin"

sintable:	incbin	"dh0:data/misc/sin.maxi"

copper_spc1:ds.l	900
copper_spc2:ds.l	900
copper_spc3:ds.l	400
copper_spc4:ds.l	400

		

	end
	


				



