;----------------------------------------------------------------------------
; Flipper ball simulator.. compile with devpac2 with case sensitive
; routine by Mel.
; to move the ball, press the cursor up key and the cursor right key...
; if you find this source usefull then use it, if not then don't use it...
;----------------------------------------------------------------------------


	Incdir	"Df0:Flipper/"   ; set to your own path

	Include	Include/Flipper.I    ; must be on the disk too


PlaneWidth	equ	40
PlaneHeight	equ	256
PlaneDepth	equ	1
PlaneLine	equ	PlaneWidth*PlaneDepth
PlaneSize	equ	PlaneWidth*PlaneHeight
ScreenSize	equ	PlaneSize*PlaneDepth


	RSRESET
*--------------------------------------------------------
Ball_PosX	rs.w	1
Ball_IncX	rs.w	1
Ball_SpeedX	rs.w	1
Ball_CountX	rs.w	1
Ball_MinX	rs.w	1
Ball_MaxX	rs.w	1
Ball_DirX	rs.w	1

Ball_PosY	rs.w	1
Ball_IncY	rs.w	1
Ball_SpeedY	rs.w	1
Ball_MinY	rs.w	1
Ball_MaxY	rs.w	1
Ball_DirY	rs.w	1

Ball_Sprite1	rs.l	1
Ball_Sprite2	rs.l	1


	SECTION 	Flipper,CODE
*--------------------------------------------------------
StartFlipper	movem.l	d0-d7/a0-a6,-(a7)
	move.l	$80.w,-(a7)
	lea	FlipperCode,a0
	move.l	a0,$80.w
	trap	#0
	move.l	(a7)+,$80.w
	movem.l	(a7)+,d0-d7/a0-a6
	clr.l	d0
	rts

*--------------------------------------------------------
FlipperCode	lea	CUSTOM,a5
	move.w	DMACONR(a5),-(a7)
	move.w	#$3ff,DMACON(a5)
	bsr	InitCList
	lea	CList,a0		
	move.l	a0,COP1LCH(a5)
	clr.w	COPJMP1(a5)
	move.w	#$87e0,DMACON(a5)

.Wait	move.l	VPOSR(a5),d0
	and.l	#$1ff00,d0
	cmp.l	#$1000,d0
	bne.s	.Wait

	move.b	KEYBOARD,d0
	move.w	d0,d1
	and.w	#$1,d1
	bne.s	.CheckRK
	clr.w	KeyPressed
	bra.s	.MoveIt

.CheckRK	tst.w	KeyPressed
	bne.s	.MoveIt

	lea	Str_FlipperBall,a0
	cmp.b	#Key_Crt,d0
	bne.s	.NoCrt
	add.w	#20,Ball_IncX(a0)
	move.w	#1,KeyPressed
	bra.s	.MoveIt

.NoCrt	cmp.b	#Key_Cup,d0
	bne.s	.MoveIt
	add.w	#20,Ball_SpeedY(a0)
	move.w	#1,KeyPressed

.MoveIt	lea	Str_FlipperBall,a0
	bsr	SetNewPosX
	lea	Str_FlipperBall,a0
	bsr	SetNewPosY
	lea	Str_FlipperBall,a0
	bsr	ScanCollision
	lea	Str_FlipperBall,a0
	bsr	SetBall
	btst	#6,CIAAPRA
	bne	.Wait

*--------------------------------------------------------
RecoverSys	move.w	#$3ff,DMACON(a5)
	move.l	(ExecBase).w,a0
	move.l	$9c(a0),a0
	move.l	38(a0),a0
	move.l	a0,COP1LCH(a5)
	clr.w	COPJMP1(a5)
	move.w	(a7)+,d0
	or.w	#$8000,d0
	move.w	d0,DMACON(a5)
	rte

*--------------------------------------------------------
*	a0=Ptr op BallStructure
*--------------------------------------------------------
SetNewPosX	move.w	Ball_PosX(a0),d0
	move.w	Ball_IncX(a0),d1
	move.w	d1,d2
	lsr.w	#3,d2

	tst.w	Ball_SpeedY(a0)
	bne.s	.NoZero
	subq.w	#1,Ball_CountX(a0)
	bpl.s	.NoZero
	move.w	Ball_SpeedX(a0),Ball_CountX(a0)
	addq.w	#1,d2
.NoZero	sub.w	d2,d1
	lsr.w	#1,d2
	sub.w	d2,d1
	bpl.s	.NoMoreX
	clr.w	d1

.NoMoreX	tst.w	Ball_DirX(a0)
	beq.s	.AddX
	sub.w	d1,d0
	cmp.w	Ball_MinX(a0),d0
	bge.s	.AddValX
	move.w	Ball_MinX(a0),d0
	bra.s	.CheckBounceX
.AddX	add.w	d1,d0
	cmp.w	Ball_MaxX(a0),d0
	blt.s	.AddValX
.CheckBounceX	tst.w	Ball_DirX(a0)
	beq.s	.SetX
	clr.w	Ball_DirX(a0)
	bra.s	.AddValX
.SetX	move.w	#1,Ball_DirX(a0)
.AddValX	move.w	d0,Ball_PosX(a0)
	move.w	d1,Ball_IncX(a0)
	rts

*--------------------------------------------------------
*	a0=Ptr op BallStructure
*--------------------------------------------------------
SetNewPosY	move.w	Ball_PosY(a0),d0
	move.w	Ball_IncY(a0),d1
	move.w	Ball_SpeedY(a0),d2

	tst.w	Ball_DirY(a0)
	beq.s	.SubIt
	add.w	d1,d0
	addq.w	#1,d1
	bra.s	.AddIt

.SubIt	sub.w	d1,d0
	subq.w	#1,d1

.AddIt	cmp.w	Ball_MaxY(a0),d0
	blt.s	.StartTop
	cmp.w	Ball_MinY(a0),d0
	blt.s	.NoBottom
	move.w	Ball_MinY(a0),d0
	move.w	d2,d1
	bra.s	.RevBounce
.NoBottom	tst.w	d1
	bpl.s	.Clr
	bra.s	.RevBounce

.StartTop	move.w	Ball_MaxY(a0),d0
.RevBounce	tst.w	Ball_DirY(a0)
	beq.s	.Set

	clr.w	Ball_DirY(a0)
	move.w	d2,d3
	lsr.w	#2,d3
	addq.w	#1,d3
.Enough	sub.w	d3,d2

	lsr.w	#1,d3
	sub.w	d3,d2
	move.w	d2,d1
	bpl.s	.Clr
	clr.w	d2
	clr.w	d1
	bra.s	.Clr

.Set	move.w	#1,Ball_DirY(a0)
.Clr	move.w	d0,Ball_PosY(a0)
	move.w	d1,Ball_IncY(a0)
	move.w	d2,Ball_SpeedY(a0)
	rts

*--------------------------------------------------------
*	a0=Ptr op BallStructure
*--------------------------------------------------------
ScanCollision	rts

*--------------------------------------------------------
*	a0=Ptr op BallStructure
*--------------------------------------------------------
SetBall	move.w	Ball_PosX(a0),d0
	move.w	Ball_PosY(a0),d1
	add.w	#$80,d0
	add.w	#$27,d1

.Work	move.w	d0,d2
	lsr.w	#1,d0
	and.w	#$1,d2
	move.w	d1,d3
	add.w	#$10,d3
	cmp.w	#$ff,d1
	ble.s	.UnderFFMin
	sub.w	#$100,d1
	or.w	#$4,d2

.UnderFFMin	cmp.w	#$ff,d3
	ble.s	.UnderFFMax
	sub.w	#$100,d3
	or.w	#$2,d2

.UnderFFMax	lsl.w	#8,d1
	move.b	d0,d1
	swap	d1
	lsl.w	#8,d3
	move.w	d3,d1
	move.b	d2,d1	
	or.b	#$80,d1
	move.l	Ball_Sprite1(a0),a1
	move.l	d1,(a1)
	move.l	Ball_Sprite2(a0),a1
	move.l	d1,(a1)
	rts

*--------------------------------------------------------
InitCList	lea	PlanePtrs,a0
	move.l	#Planes,d0
	moveq	#PlaneDepth-1,d1
.PLoop	swap	d0
	move.w	d0,2(a0)
	swap	d0
	move.w	d0,6(a0)
	addq.l	#8,a0
	add.l	#PlaneLine,d0
	dbf	d1,.PLoop

	lea	SpritePtrs,a0
	move.l	#FlipperBall1,d0
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	addq.l	#8,a0

	move.l	#FlipperBall2,d0
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	addq.l	#8,a0

	move.l	#BlankSprite,d0
	moveq	#5,d1
.BLoop	swap	d0
	move.w	d0,2(a0)
	swap	d0
	move.w	d0,6(a0)
	addq.l	#8,a0
	dbf	d1,.BLoop

	lea	SpritePal,a0
	lea	FlipperPalette,a1
	move.w	#15,d0
.SCLoop	move.w	(a1)+,2(a0)
	addq.w	#4,a0
	dbf	d0,.SCLoop
	rts
	
*--------------------------------------------------------
Str_FlipperBall	dc.w	0,3,8,8
	dc.w	0,304
	dc.w	0

	dc.w	239,21,21
	dc.w	240,0
	dc.w	0

	dc.l	FlipperBall1
	dc.l	FlipperBall2

*--------------------------------------------------------
KeyPressed	dc.w	0

FlipperPalette	dc.w	$0000
	dc.w	$0500
	dc.w	$0710
	dc.w	$0930
	dc.w	$0A50
	dc.w	$0D90
	dc.w	$0FD0
	dc.w	$0000
	dc.w	$0005
	dc.w	$0006
	dc.w	$0118
	dc.w	$033A
	dc.w	$055B
	dc.w	$088C
	dc.w	$0CCD
	dc.w	$0FFF

*--------------------------------------------------------
	SECTION	ChipData,DATA_C
*--------------------------------------------------------
CList	dc.w	DIWSTRT,$2781,DIWSTOP,$27c1
	dc.w	DDFSTRT,$0038,DDFSTOP,$00d0
	dc.w	BPL1MOD,-PlaneWidth
	dc.w	BPL2MOD,-PlaneWidth
	dc.w	BPLCON0,$1000,BPLCON1,$0000
	dc.w	BPLCON2,$0022

ColorPal	dc.w	COLOR00,$0000,COLOR01,$0555

SpritePal	dc.w	COLOR16,$0000,COLOR17,$0000
	dc.w	COLOR18,$0000,COLOR19,$0000
	dc.w	COLOR20,$0000,COLOR21,$0000
	dc.w	COLOR22,$0000,COLOR23,$0000
	dc.w	COLOR24,$0000,COLOR25,$0000
	dc.w	COLOR26,$0000,COLOR27,$0000
	dc.w	COLOR28,$0000,COLOR29,$0000
	dc.w	COLOR30,$0000,COLOR31,$0000

SpritePtrs	dc.w	SPR0PTH,$0000,SPR0PTL,$0000
	dc.w	SPR1PTH,$0000,SPR1PTL,$0000
	dc.w	SPR2PTH,$0000,SPR2PTL,$0000
	dc.w	SPR3PTH,$0000,SPR3PTL,$0000
	dc.w	SPR4PTH,$0000,SPR4PTL,$0000
	dc.w	SPR5PTH,$0000,SPR5PTL,$0000
	dc.w	SPR6PTH,$0000,SPR6PTL,$0000
	dc.w	SPR7PTH,$0000,SPR7PTL,$0000

PlanePtrs	dc.w	BPL1PTH,$0000,BPL1PTL,$0000
	dc.l	$fffffffe

BlankSprite	dc.l	0

FlipperBall1	dc.w	$0000,$0000
	dc.w	$07C0,$0040
	dc.w	$1620,$0FC0
	dc.w	$1590,$31E0
	dc.w	$7248,$2C70
	dc.w	$3B68,$5C70
	dc.w	$6360,$5C78
	dc.w	$F268,$4C70
	dc.w	$3E64,$6078
	dc.w	$28C4,$60F8
	dc.w	$1F88,$7FF0
	dc.w	$4F18,$3FE0
	dc.w	$3010,$0FE0
	dc.w	$1260,$0D80
	dc.w	$0FC0,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

FlipperBall2	dc.w	$0000,$0080
	dc.w	$0040,$0200
	dc.w	$0000,$0720
	dc.w	$0E00,$2730
	dc.w	$1F80,$6078
	dc.w	$3F80,$7870
	dc.w	$3F80,$BF84
	dc.w	$3F80,$3F8C
	dc.w	$1F80,$FF8C
	dc.w	$1F00,$EF98
	dc.w	$0000,$B470
	dc.w	$0000,$1C70
	dc.w	$0000,$1A48
	dc.w	$0000,$33D0
	dc.w	$0000,$11A0
	dc.w	$0000,$0380
	dc.w	$0000,$0000
	dc.w	$0000,$0000

*--------------------------------------------------------
	SECTION	Planes,DATA_C
*--------------------------------------------------------
Planes	ds.l	PlaneWidth

*--------------------------------------------------------
	end

