	opt	c-
	
	Section	"BubbleBobble-ChipRamCode",Code_c
	
ScoresGFX	= $199c00
ScoresMask	= $19ce00
CharGFX	= $1a0000
CharMask	= $1a6400
NastyGFX	= $1ac800
NastyMask	= $1b9000
BloxGFX	= $1c5800

ShitBuffer	= $1cf000
Piccy	= $1dcdd0
Piccy1	= $1e8310
PiccyBack	= $1f39f0

CharConOffset	= 30

BlitTest	= $1fe	; (copper colour blit change status)

NastListSlot	= 22	; Bytes for each Nasty Var Data

ActiveObjects	= 60
VBLTime	= $09000
	
Start	Movem.l	d0-d7/a0-a6,-(a7)
	Lea	InitialSP(pc),a5
	Move.l	a7,(a5)
	Bsr	KillSystem
	
Reset	Lea	PiccyBase(pc),a0
	Move.l	#Piccy,0(a0)
	Move.l	#Piccy1,4(a0)
	Lea	CopperBase(pc),a0
	Lea	NewCopperX(pc),a1
	Lea	NewCopper(pc),a2
	Move.l	a1,0(a0)
	Move.l	a2,4(a0)
	Bsr	SetBitPlanes

	Lea	DeadCopper(pc),a1
	Move.l	a1,$Dff080	
	
	Lea	LevelNo(pc),a5
	Move.l	#0,(a5)

	Lea	Piccy,a0
	Lea	Piccy1,a1
ClearPicALoop	Move.l	#0,(a0)+
	Cmp.l	a0,a1
	Bne	ClearPicALoop
	
	Lea	CharFrameDir(pc),a5
	Move.b	#0,(a5)
	
NewLevel	Bsr	GetLevelVars
	Lea	GoodyFrameCount(pc),a5
	Move.l	#0,(a5)
	Lea	TimeFrame(pc),a5
	Move.l	#0,(a5)
	Bsr	SetMouse
	Bsr	SetVars
	
	Move.l	#Piccy,a0
	Add.l	#40*5*16,a0
	Lea	CopperBPLS1S(pc),a1
	Moveq	#4,d7
	Bsr	SetBPLoop

	Lea	$Dff000,a6
	Move.w	#$ffff,$2e(a6)
	Move.w	#$83c0,DMACon(a6)
	Lea	CopperScroll(pc),a1
	Move.l	a1,$Dff080
		
	Bsr	BlitMap

	Lea	$Dff000,a6
	Move.w	#$ffff,$2e(a6)
	Move.w	#$83c0,DMACon(a6)
	Lea	CopperScroll(pc),a1
	Move.l	a1,$Dff080

	Move.l	#234,d5
	Moveq	#0,d6
ScrollLoop	Move.l	#Piccy,a0
	Add.l	#(40*5*16),a0
	Add.l	d6,a0
	Lea	CopperBPLS1S(pc),a1
	Moveq	#4,d7
	Bsr	SetBPLoop
	Bsr	VBL
	Add.l	#40*5*1,d6
	Dbf	d5,ScrollLoop
	
	Bsr	CopyPiccy
	Lea	NewCopper(pc),a1
	Move.l	a1,$Dff080

	Bsr	ClearShowByte

	Bsr	MainLoop
	Cmpi.w	#-1,d0
	Beq	LMBLoop
	
	Lea	LevelNo(pc),a5
	Add.w	#1,(a5)
	Bra	NewLevel
	
LMBLoop	Btst	#2,$Dff016
	Beq	Reset
	Btst	#6,$Bfe001
	Bne	LMBLoop
		
	Bsr	ReturnSystem
	Move.l	InitialSP(pc),a7
	Movem.l	(a7)+,d0-d7/a0-a6
	Move.l	#0,d0
	Rts

SetVars	Lea	VL(pc),a5	
	Move.w	#0,DiagX-VL(a5)
	Move.w	#24,BlokeXPos-VL(a5)
	Move.w	#200,BlokeYPos-VL(a5)
	Move.w	#32,BlokeXPosB-VL(a5)
	Move.w	#32,BlokeYPosB-VL(a5)
	Move.w	#0,DeadFlag-VL(a5)
	Move.w	#0,DeadFlagB-VL(a5)
	Move.b	#0,WalkFrame-VL(a5)
	Move.b	#0,WalkFrameB-VL(a5)
	Move.b	#0,WalkCounter-VL(a5)
	Move.b	#0,WalkCounterB-VL(a5)
	Move.l	#0,TimeFrame-VL(a5)
	Move.l	#0,BurstListPt-VL(a5)
	Move.l	#0,BlokeScore-VL(a5)
	Lea	BurstList(pc),a0
	Moveq	#15,d7
ClearBurstLoop	Move.l	#0,(a0)+
	Dbf	d7,ClearBurstLoop

	Lea	EmptyBubble(pc),a0
	Lea	BubbleList(pc),a1
	Moveq	#15,d7
ResetBubList	Move.l	(a0)+,(a1)+
	Move.l	(a0)+,(a1)+
	Move.l	(a0)+,(a1)+
	Dbf	d7,ResetBubList

	Lea	BlitterList0(pc),a0
	Move.l	#(128*7)-1,d7
ClearBlitList	Move.l	#0,(a0)+
	Dbf	d7,ClearBlitList
		
MakePixTab	Lea	PixelTab(pc),a0
	Move.l	#(40*16*5),d0
	Moveq	#15,d7
PixTabLoop	Move.l	d0,(a0)+
	Add.l	#(40*5),d0
	Dbf	d7,PixTabLoop

	Rts

MainLoop	Move.w	#%1000011111000000,$Dff096

	Bsr	VBL
	Bsr	DoubleBuffer
	Bsr	IncTime

	Move.w	#$333,$Dff180	
	
	Bsr	TrackSticks
	;Bsr	TrackMouse
	
	Lea	ActObjectOffset(pc),a4
	Move.l	#(7*4)*ActiveObjects,(a4)
	
	Bsr	DoBlankListPoke

	Lea	FallSpeed(pc),a4
	Move.w	#2,(a4)
	Lea	CharConNo(pc),a4
	Move.w	#0,(a4)
	Bsr	ProcessMouth
	Bsr	BlokeCon
	Bsr	BlokeWalk
	Bsr	SetBlokeBlit

	;Lea	CharConNo(pc),a4
	;Move.w	#CharConOffset,(a4)
	;Bsr	ProcessMouth
	;Bsr	BlokeCollDet
	;Bsr	BlokeCon
	;Bsr	BlokeWalk
	;Bsr	SetBlokeBlit
	
	Lea	FallSpeed(pc),a4
	Move.w	#2,(a4)
	Bsr	DoNastyA
	Bsr	DoNastyB
	Bsr	SetNastyBlits
	Bsr	ProcessBubbles	
	Bsr	SetBubbleBlits

	Lea	CharConNo(pc),a4
	Move.w	#0,(a4)
	Bsr	BurstBubbles
	Bsr	BurstBubblesN
	Bsr	BubColBursts
	Bsr	BubColBurstsN
	Bsr	AddLevelGoodys
	Bsr	CheckGoodColl
	Bsr	AllKilledCheck
	Bsr	CheckActivated
	Move.w	ActivateFlag(pc),d0
	Move.w	d0,$Dff180
	Cmpi.w	#60,d0
	Bge	EndMainLoop
		
	Bsr	DoBlits
	Bsr	DoBlitRecs

	Move.w	#$303,$Dff180
	
	Bsr	ShowBytes
	Bsr	ShowBubPixels

	Btst	#2,$Dff016
	Beq	EndMainLoopX
	Btst	#6,$Bfe001
	Beq	EndMainLoopX
	Bra	MainLoop
EndMainLoop	Moveq	#1,d0
	Rts
EndMainLoopX	Moveq	#-1,d0
	Rts

AllKilledCheck	Lea	NastyList(pc),a0
	Moveq	#7,d7
	Moveq	#0,d6
CheckDeadList	Move.b	01(a0),d0
	Cmpi.b	#01,d0
	Beq	NastyAlive
	Cmpi.b	#02,d0
	Beq	NastyAlive
	Cmpi.b	#03,d0
	Beq	NastyAlive
	Cmpi.b	#04,d0
	Beq	NastyAlive
	Cmpi.b	#05,d0
	Beq	NastyAlive
	Cmpi.b	#06,d0
	Beq	NastyAlive
	Cmpi.b	#07,d0
	Beq	NastyAlive
	Cmpi.b	#08,d0
	Beq	NastyAlive
	Bra	NextDeadChar
NastyAlive	Btst	#7,02(a0)
	Bne	NextDeadChar
	Moveq	#-1,d6
NextDeadChar	Add.l	#NastListSlot,a0
	Dbf	d7,CheckDeadList
	Lea	AllDeadFlag(pc),a1
	Move.w	d6,$Dff180
	Move.w	d6,(a1)
	Rts

CheckActivated	Lea	ActivateFlag(pc),a1
	Lea	NastyList(pc),a0
	Moveq	#7,d7
CheckActList	Move.w	06(a0),d0
	Cmpi.w	#0,d0
	Beq	TryNextAct
	Cmpi.w	#303,d0
	Beq	TryNextAct	
	Move.w	#0,(a1)
TryNextAct	Add.l	#NastListSlot,a0
	Dbf	d7,CheckActList
	Add.w	#1,(a1)
	Rts

ClearShowByte	Lea	Piccy+(40*16*5),a0
	Lea	Piccy1+(40*16*5),a1
	Lea	PiccyBack+(40*16*5),a2
	Moveq	#50,d7
ClearTopLine	Move.l	#0,(a0)+
	Move.l	#0,(a1)+
	Move.l	#0,(a2)+
	Dbf	d7,ClearTopLine

	Lea	Piccy+40+(40*16*5),a0
	Lea	Piccy1+40+(40*16*5),a1
	Lea	PiccyBack+40+(40*16*5),a2
	Moveq	#3,d7
BitTopLine	Move.l	#$c0000001,(a0)+
	Move.l	#$c0000001,(a1)+
	Move.l	#$c0000001,(a2)+
	Move.l	#$00000003,(a0)+
	Move.l	#$00000003,(a1)+
	Move.l	#$00000003,(a2)+
	Dbf	d7,BitTopLine
	Rts

ShowBytes	Lea	Piccy+(40*16*5),a0
	Lea	Piccy1+(40*16*5),a1
	Lea	PiccyBack+(40*16*5),a2
	Move.w	MoveFlagN(pc),d0
	Bsr	ShowByte
	Move.w	JumpFlagN(pc),d0
	Bsr	ShowByte
	Move.w	CollFlagN(pc),d0
	Bsr	ShowByte
	Rts

ShowByte	Moveq	#7,d7
	
ShowBitsLoop	Btst	#15,d0
	Beq	NoSBitSet
SBitSet	Move.b	#$f0,d1
	Bra	GotSBitSet
NoSBitSet	Move.b	#$00,d1

GotSBitSet	Asl.w	#1,d0
	Btst	#15,d0
	Beq	NoSNBitSet
	Or.b	#$0f,d1
	
NoSNBitSet	Move.b	d1,(a0)+
	Move.b	d1,(a1)+
	Move.b	d1,(a2)+
	
	Asl.w	#1,d0
	Dbf	d7,ShowBitsLoop
	Rts
	
DoPixel	Lea	PixelTab(pc),a1
	Move.l	PiccyBase(pc),a0
	Add.l	#(40*16*5),a0
	Moveq	#0,d2
	Moveq	#0,d3
	Move.w	d0,d2
	Move.w	d1,d3
	Add.w	d3,d3
	Add.w	d3,d3
	Add.l	(a1,d3),a0

	And.w	#7,d0
	Moveq	#7,d3
	Sub.b	d0,d3
	Asr.w	#3,d2
	
	Moveq	#4,d0
PlotPlaneLoop	Btst	#0,d4
	Beq	NoPlotPlane
	Bset	d3,(a0,d2)
NoPlotPlane	Add.l	#40,a0
	Asr.b	#1,d4
	Dbf	d0,PlotPlaneLoop
	Rts

ShowBubPixels	Lea	BubbleList(pc),a4
	Moveq	#15,d7
	Moveq	#0,d0
	Moveq	#0,d1
DrawPixels	Move.w	04(a4),d0
	Move.w	06(a4),d1
	Bsr	NoBubBubColl
	Asr.w	#4,d0
	Asr.w	#4,d1
	Bsr	DoPixel
	Add.l	#12,a4
	Dbf	d7,DrawPixels
	Rts

NoBubBubColl	Move.b	02(a4),d4
	Btst	#0,d4
	Bne	BubColorVert
	Moveq	#4,d4
	Rts
BubColorVert	Moveq	#6,d4
	Rts
	
BurstBubbles	Lea	BubbleList(pc),a4
	Moveq	#15,d7
	Moveq	#0,d0
	Moveq	#0,d1
BurstLoop	Move.w	04(a4),d0
	Move.w	06(a4),d1
	Move.b	02(a4),d4
	Bsr	BubBubCollide
	Add.l	#12,a4
	Dbf	d7,BurstLoop
	Rts

BubBubCollide	Btst	#3,03(a4)
	Bne	NoBubBubColl
	
	Lea	VL(pc),a5
	Moveq	#0,d6
	Move.w	CharConNo-VL(a5),d6
	
	Move.w	04(a4),d0
	Move.w	06(a4),d1
	Move.w	BlokeXPos(pc),d2
	Move.w	BlokeYPos(pc),d3
	
	Btst	#0,DireFlag-VL(a5,d6)
	Bne	CheckWalkR
	Bsr	CheckQuartHColL
	Bra	DoneQuartColl
CheckWalkR	Bsr	CheckQuartHColR	

DoneQuartColl	Tst.w	d4
	Beq	NoBubBubColl	
	Moveq	#17,d4
	Btst	#7,02(a4)
	Bne	AlreadyBurst
	Move.b	#128,02(a4)
AlreadyBurst	Rts

BurstBubblesN	Lea	NastyList(pc),a4
	Moveq	#7,d7
	Moveq	#0,d0
	Moveq	#0,d1
BurstLoopN	Move.w	06(a4),d0
	Move.w	08(a4),d1

	Bsr	BubBubCollideN
	Add.l	#NastListSlot,a4
	Dbf	d7,BurstLoopN
	Rts

BubBubCollideN	Btst	#3,03(a4)
	Beq	NoBubBubColl
	
	Lea	VL(pc),a5
	Moveq	#0,d6
	Move.w	CharConNo-VL(a5),d6
	
	Move.w	06(a4),d0
	Move.w	08(a4),d1
	Move.w	BlokeXPos-VL(a5,d6),d2
	Move.w	BlokeYPos-VL(a5,d6),d3
	
	Btst	#0,DireFlag-VL(a5,d6)
	Bne	CheckWalkRN
	Bsr	CheckQuartHColL
	Bra	DoneQuartCollN
CheckWalkRN	Bsr	CheckQuartHColR	

DoneQuartCollN	Tst.w	d4
	Beq	AlreadyBurstN
	Moveq	#17,d4
BurstNastyBub	Btst	#7,02(a4)
	Bne	AlreadyBurstN
	Move.l	BurstListPt(pc),d6
	Lea	BurstList(pc),a5
	Move.l	a4,00(a5,d6)
	Move.l	TimeFrame(pc),04(a5,d6)
	Lea	BurstListPt(pc),a5
	Add.l	#8,(a5)
	
	Move.b	#%10000000,02(a4)
	Move.b	03(a4),d3
	And.b	#%011100,03(a4)
	Or.b	#%011100,03(a4)
	Move.w	#0,20(a4)
	Bclr	#0,07(a4)
	Bclr	#0,09(a4)
	Move.w	06(a4),16(a4)
	Move.w	08(a4),18(a4)
	Lea	VL(pc),a5
	Moveq	#0,d6
	Move.w	CharConNo-VL(a5),d6
	Btst	#0,DireFlag-VL(a5,d6)
	Bne	SetRBub	
AlreadyBurstN	Rts
SetRBub	Bset	#5,03(a4)
	Rts

CheckQuartHColL	Move.w	d0,d4
	Move.w	d2,d5
	Add.w	#01,d0	; Bubble Min
	Add.w	#08,d2	; Spikes Min
	Add.w	#14,d4	; Bubble Max
	Add.w	#15,d5	; Spikes Max
	Cmp.w	d4,d2
	Blt	LessThanQXHL
	Bra	NoCollideQHVL
LessThanQXHL	Cmp.w	d5,d0
	Bls	CheckQuartVColl
NoCollideQHVL	Moveq	#0,d4
	Rts	
	
CheckQuartHColR	Move.w	d0,d4
	Move.w	d2,d5
	Add.w	#01,d0	; Bubble Min
	Add.w	#00,d2	; Spikes Min
	Add.w	#14,d4	; Bubble Max
	Add.w	#07,d5	; Spikes Max
	Cmp.w	d4,d2
	Blt	LessThanQXHR
	Bra	NoCollideQHVR
LessThanQXHR	Cmp.w	d5,d0
	Bls	CheckQuartVColl
NoCollideQHVR	Moveq	#0,d4
	Rts	
	
CheckQuartVColl	Move.w	d1,d4
	Move.w	d3,d5
	Add.w	#01,d1
	Add.w	#00,d3
	Add.w	#14,d4
	Add.w	#08,d5
	Cmp.w	d4,d3
	Blt	LessThanQYV
	Bra	NoCollideQHVR
LessThanQYV	Cmp.w	d5,d1
	Bls	CollideQHV
	Bra	NoCollideQHVR
CollideQHV	Moveq	#-1,d4
	Rts




BubColBursts	Lea	BubbleList(pc),a4
	Moveq	#15,d6
	
ColBurstLoop1	Moveq	#15,d7
	Lea	BubbleList(pc),a6
	Move.w	04(a4),d0
	Move.w	06(a4),d1
	Move.b	02(a4),d4
	Asr.w	#3,d0
	Asr.w	#3,d1
	Btst	#7,d4
	Beq	NoColBurst1
	And.b	#15,d4
	Cmpi.b	#1,d4
	Bne	NoColBurst1
	
ColBurstLoop	Move.b	02(a6),d5
	Btst	#7,d5
	Bne	NoColBurst
	Move.b	03(a6),d4
	Btst	#3,d4
	Bne	NoColBurst
	
	Move.w	04(a6),d2
	Move.w	06(a6),d3
	Asr.w	#3,d2
	Asr.w	#3,d3
	
	Subq	#2,d2
	Cmp.w	d0,d2
	Bgt	NoColBurst
	Addq	#4,d2
	Cmp.w	d0,d2
	Blt	NoColBurst	

	Subq	#2,d3
	Cmp.w	d1,d3
	Bgt	NoColBurst
	Addq	#4,d3
	Cmp.w	d1,d3
	Blt	NoColBurst
		
	Move.b	#128,02(a6)

NoColBurst	Add.l	#12,a6
	Dbf	d7,ColBurstLoop

NoColBurst1	Add.l	#12,a4
	Dbf	d6,ColBurstLoop1
	Rts

BubColBurstsN	Lea	BubbleList(pc),a4
	Moveq	#15,d6
	
ColBurstLoop1N	Moveq	#7,d7
	Lea	NastyList(pc),a6
	Move.w	04(a4),d0
	Move.w	06(a4),d1
	Move.b	02(a4),d4
	Asr.w	#3,d0
	Asr.w	#3,d1
	Btst	#7,d4
	Beq	NoColBurst1N
	
ColBurstLoopN	Cmpi.w	#0,00(a6)
	Beq	NoColBurstN
	
	Move.b	03(a6),d4
	And.b	#%11000,d4
	Cmpi.b	#%01000,d4
	Beq	Okay2BurstN
	Cmpi.b	#%11000,d4
	Beq	Okay2BurstN
	Bra	NoColBurstN
	
Okay2BurstN	Move.w	06(a6),d2
	Move.w	08(a6),d3
	Asr.w	#3,d2
	Asr.w	#3,d3
	
	Subq	#2,d2
	Cmp.w	d0,d2
	Bgt	NoColBurstN
	Addq	#4,d2
	Cmp.w	d0,d2
	Blt	NoColBurstN	

	Subq	#2,d3
	Cmp.w	d1,d3
	Bgt	NoColBurstN
	Addq	#4,d3
	Cmp.w	d1,d3
	Blt	NoColBurstN
		
	Movem.l	d6/a4,-(sp)
	Move.l	a6,a4
	Bsr	BurstNastyBub
	Movem.l	(sp)+,d6/a4

NoColBurstN	Add.l	#NastListSlot,a6
	Dbf	d7,ColBurstLoopN

NoColBurst1N	Add.l	#12,a4
	Dbf	d6,ColBurstLoop1N
	Rts



DoubleBuffer	Lea	Altern8(pc),a0
	Eor.w	#$ffff,(a0)
	
	Move.l	02(a0),d0
	Move.l	06(a0),02(a0)
	Move.l	d0,6(a0)
	
	Move.l	10(a0),d0
	Move.l	14(a0),10(a0)
	Move.l	d0,14(a0)
	
	Move.l	d0,$Dff080
	Rts	
	
IncTime	Lea	TimeFrame(pc),a5
	Add.l	#1,0(a5)
	Rts
	;Cmpi.b	#50,0(a5)
	;Bne	NotSecYet
	;Move.b	#0,0(a5)
	;Add.b	#1,1(a5)
	;Cmpi.b	#60,1(a5)
	;Bne	NotSecYet
	;Move.b	#0,1(a5)
	;Add.b	#1,2(a5)
	;Cmpi.b	#60,2(a5)
	;Bne	NotSecYet
	;Move.b	#0,2(a5)
	;Add.b	#1,3(a5)
;NotSecYet	Rts
	
SetBitPlanes	Move.l	PiccyBase(pc),a0
	Add.l	#40*5*16,a0
	Lea	CopperBPLS1(pc),a1
	Moveq	#4,d7
	Bsr	SetBPLoop
	Move.l	#Piccy1,a0
	Add.l	#40*5*16,a0
	Lea	CopperBPLS1S(pc),a1
	Moveq	#4,d7
	Bsr	SetBPLoop
	Move.l	PiccyBaseAlt(pc),a0
	Add.l	#40*5*16,a0
	Lea	CopperBPLS1X(pc),a1
	Moveq	#4,d7
	Bsr	SetBPLoop
	Rts
	
SetBPLoop	Move.l	a0,d0
	Move.w	d0,6(a1)
	Swap	d0
	Move.w	d0,2(a1)
	Addq	#8,a1
	Add.l	#40,a0
	Dbf	d7,SetBPLoop
	Rts

CheckGoodColl	Lea	NastyList(pc),a0
	Lea	NastyListPtr(pc),a1
	Move.l	a0,(a1)
ServGoodLoop	Move.l	NastyListPtr(pc),a0
	Cmp.b	#00,01(a0)
	Beq	EndNastyTabG
	Cmp.b	#-1,01(a0)
	Beq	EndNastyTabG
	Cmp.b	#10,01(a0)
	Beq	FoundGoodyN

DoNextGoodN	Lea	NastyListPtr(pc),a4
	Add.l	#NastListSlot,(a4)
	Bra	ServGoodLoop
EndNastyTabG	Rts	

FoundGoodyN	Move.w	BlokeXPos(pc),d0
	Move.w	BlokeYPos(pc),d1
	Move.w	06(a0),d2
	Move.w	08(a0),d3	
	Bsr	CollisionDet
	Tst.w	d0
	Beq	DoNextGoodN

	Move.b	#11,01(a0)
	Move.w	#00,18(a0)
	Move.w	#00,20(a0)
	
	Moveq	#0,d2
	Moveq	#0,d3
	Move.b	00(a0),d2
	Lea	GoodPointList(pc),a2
	Add.w	d2,d2
	Move.w	(a2,d2),d3
	Lea	BlokeScore(pc),a2
	Add.l	d3,(a2)
	Bsr	DoGoodyFX
	Bra	DoNextGoodN
	
DoGoodyFX	Lea	EffectList(pc),a2
	Moveq	#0,d2
	Move.b	00(a0),d2
	
FindGoodFXLoop	Move.w	00(a2),d1
	Cmpi.w	#-1,d1
	Beq	EndFXList
	Cmp.w	d1,d2
	Beq	FoundFX
	Addq	#4,a2
	Bra	FindGoodFXLoop
EndFXList	Rts
FoundFX	Moveq	#0,d0
	Move.w	02(a2),d0
	Lea	VL(pc),a5
	Add.l	d0,a5
	Jmp	(a5)

AddLevelGoodys	Lea	GoodyList(pc),a1
	Lea	GoodyFrameCount(pc),a5
	Move.w	AllDeadFlag(pc),d0
	Tst.w	d0
	Beq	GoodOnline
	Add.l	#1,00(a5)
	Cmpi.l	#400,00(a5)
	Bge	FirstGOnline
GoodOnline	Rts
FirstGOnline	Cmpi.l	#800,00(a5)
	Bge	SecondGOnline
	
GetGoodOnline	Cmpi.b	#$c,01(a1)
	Beq	GoodOnline
	
	Lea	NastyList(pc),a2
FindEmptySlot	Cmpi.b	#0,01(a2)
	Beq	FoundEmptySlot
	Add.l	#NastListSlot,a2
	Bra	FindEmptySlot
FoundEmptySlot	Move.l	a1,a3
	Move.l	a2,a4
	Moveq	#10,d7
CopyGoody	Move.w	(a1)+,(a2)+
	Dbf	d7,CopyGoody
	Move.w	#0,18(a4)
	Move.w	#0,20(a4)
	Move.b	#10,01(a4)
	Move.b	#$c,01(a3)
	Rts
	
SecondGOnline	Add.l	#NastListSlot,a1
	Bra	GetGoodOnline

DoNastyB	Lea	NastyList(pc),a0
	Lea	NastyListPtr(pc),a1
	Move.l	a0,(a1)
ServNastLoopB	Move.l	NastyListPtr(pc),a0
	Cmp.b	#00,01(a0)
	Beq	EndNastyTabB
	Cmp.b	#-1,01(a0)
	Beq	EndNastyTabB
	Cmp.b	#05,01(a0)
	Beq	MoveNastyB
	Bra	DoNextNastyB
	
MoveNastyB	Lea	MoveFlagN(pc),a1
	Move.w	06(a0),10(a1)	; Get X Pos
	Move.w	08(a0),12(a1)	; Get Y Pos
	Btst	#7,02(a0)
	Bne	NastDeadBounceB
	Btst	#3,03(a0)
	Bne	NastyFloatingB
	
	Lea	CharConNo(pc),a4
	Move.w	#CharConOffset*2,(a4)
	Bsr	NastBMove	
	Bsr	NastyCollDet1
	Move.l	NastyListPtr(pc),a0
	Bsr	AdvanceNastyFrm
	Bsr	NastBCheck
	Bsr	CheckBlokeNast

DoNextNastyB	Lea	NastyListPtr(pc),a4
	Add.l	#NastListSlot,(a4)
	Bra	ServNastLoopB
EndNastyTabB	Rts	

NastBMove	Moveq	#0,d0
	Moveq	#1,d4
	Btst	#4,03(a0)
	Beq	NoFasterNast
	Moveq	#2,d4	
NoFasterNast	Move.w	14(a0),d1
	Btst	#0,d1
	Beq	MoveBRight
	Sub.w	d4,06(a0)
	Bset	#2,03(a0)
	Bra	NowCheckBY
MoveBRight	Add.w	d4,06(a0)
	Bclr	#2,03(a0)

NowCheckBY	Btst	#1,d1
	Beq	MoveBUp
	Add.w	d4,08(a0)
	Bra	DoneBYC
MoveBUp	Sub.w	d4,08(a0)

DoneBYC	Rts

NastBCheck	Moveq	#0,d0
	Move.b	CollFlagN(pc),d0
	Or.b	CollFlag1N(pc),d0
	Move.w	14(a0),d1
	
	Btst	#2,d0
	Beq	CheckUpB
	Bset	#1,d1
CheckUpB	Btst	#0,d0
	Beq	CheckLeftB
	Bclr	#1,d1
CheckLeftB	Btst	#3,d0
	Beq	CheckRightB
	Bset	#0,d1
	Bset	#2,03(a0)
CheckRightB	Btst	#1,d0
	Beq	SetNewMoveB	
	Bclr	#0,d1
	Bclr	#2,03(a0)
	
SetNewMoveB	Move.w	d1,14(a0)
	Rts
		
DoNastyA	Lea	NastyList(pc),a0
	Lea	NastyListPtr(pc),a1
	Move.l	a0,(a1)
ServNastLoop	Move.l	NastyListPtr(pc),a0
	Cmp.b	#00,01(a0)
	Beq	EndNastyTab
	Cmp.b	#-1,01(a0)
	Beq	EndNastyTab
	Cmp.b	#01,01(a0)
	Beq	MoveNastyA
	Cmp.b	#02,01(a0)
	Beq	MoveNastyA
	Cmp.b	#06,01(a0)
	Beq	MoveNastyA
	Cmp.b	#07,01(a0)
	Beq	MoveNastyA
	Bra	DoNextNastyA

MoveNastyA	Btst	#7,02(a0)
	Bne	NastDeadBounceA
	Lea	MoveFlagN(pc),a1
	Move.w	06(a0),10(a1)	; Get X Pos
	Move.w	08(a0),12(a1)	; Get Y Pos
	Move.w	12(a0),00(a1)	; Get MoveFlags
	Move.w	14(a0),02(a1)	; Get JumpFlags
	Move.b	03(a0),22(a1)
	Btst	#3,03(a0)
	Bne	NastyFloatingA
	
	Lea	CharConNo(pc),a4
	Move.w	#CharConOffset*2,(a4)
	Bsr	BlokeCon
	Bsr	NastyCollDet
	
	Bsr	CheckBlokeNast
	
	Move.w	BlokeYPos(pc),d1
	Move.w	BlokeYPosN(pc),d3
	Bsr	RelativeNastY
	
	Move.l	NastyListPtr(pc),a0
	Lea	MoveFlagN(pc),a1
	Move.w	10(a1),06(a0)
	Move.w	12(a1),08(a0)
	Move.w	02(a1),d4	; Get Jump Flag
	Move.w	00(a1),d3	; Get Move Flag
	Move.w	02(a0),d2	; Get FrameDir
	And.w	#%1100000011111111,d3
			
	Btst	#8,d4
	Bne	NastyJumping
	
	And.w	#%11111111,d3

NastyJumping	Btst	#9,d4
	Bne	NastyFalling
	
	Btst	#11,d4
	Bne	LookingLRBJ
	
	Btst	#15,d4
	Beq	NotLooking
		
	Bsr	RandomNumber
	Btst	#3,d0
	Beq	NotLooking
	Bsr	LookChangeDir
	
NotLooking	Bclr	#15,d4
	Bsr	AdvanceNastyFrm
	Move.w	02(a0),d2	; d2=Frame+Dir
	
	Btst	#10,d4
	Bne	TestRelative
		
NastyWalkLROkay	Bsr	NastyWalkLR
	
TestRelative	Tst.w	d7
	Beq	OnSameLevel
	
	Cmpi.w	#1,d7
	Beq	BlokeAboveNast
	Bra	NoNastyWalk
		
BlokeAboveNast	Add.b	#1,10(a0)
	Cmpi.b	#20,10(a0)
	Bne	NoNastyWalk
	Move.b	#0,10(a0)
	Bsr	RandomNumber
	Btst	#3,d0
	Beq	JumpUpX
	;Bsr	RandomNumber
	;Btst	#3,d0
	;Beq	JumpUpX
	;Bsr	RandomNumber
	;Btst	#3,d0
	;Beq	JumpUpX
	Bra	NoNastyWalk
	
JumpUpX	Move.b	CollFlagN(pc),d0
	Or.b	CollFlag1N(pc),d0
	Btst	#7,d0
	Beq	NoNastyWalk
		
SetLookLRBJ	Bset	#11,d4
	Move.b	#0,10(a0)
	Bra	NoNastyWalk

LookingLRBJ	Btst	#4,d2
	Beq	SlowLRBJ
	
	Add.b	#1,10(a0)
	Cmpi.b	#07,10(a0)
	Beq	ChangeLRBJDir
	Cmpi.b	#14,10(a0)
	Beq	ChangeLRBJDir
	Cmpi.b	#21,10(a0)
	Bgt	DoneLRBJ
	Bra	NoNastyWalk
	
SlowLRBJ	Add.b	#1,10(a0)
	Cmpi.b	#10,10(a0)
	Beq	ChangeLRBJDir
	Cmpi.b	#20,10(a0)
	Beq	ChangeLRBJDir
	Cmpi.b	#30,10(a0)
	Bgt	DoneLRBJ
	Bra	NoNastyWalk

ChangeLRBJDir	Bchg	#2,d2
	Bra	NoNastyWalk
	
DoneLRBJ	Move.b	#0,10(a0)
	Bclr	#11,d4
	Bset	#10,d4

SetJumpUp	Bset	#11,d3
	Bset	#13,d3
	Bset	#15,d3
	Bra	NoNastyWalk
	
OnSameLevel	Move.b	CollFlagN(pc),d0
	Or.b	CollFlag1N(pc),d0
	Btst	#2,d2
	Bne	TestLeftHole
	
TestRightHole	Btst	#5,d0
	Bne	FloorNast
	Bra	HoleFound
TestLeftHole	Btst	#6,d0
	Bne	FloorNast
	
HoleFound	Bset	#11,d3
	Bset	#13,d3
	Bset	#14,d3
	Bra	NoNastyWalk
	
FloorNast	
NoNastyWalk	Move.w	d2,02(a0)
	Move.w	d3,12(a0)
	Move.w	d4,14(a0)
DoNextNastyA	Lea	NastyListPtr(pc),a4
	Add.l	#NastListSlot,(a4)
	Bra	ServNastLoop
EndNastyTab	Rts
	
NastyFalling	Bset	#15,d4
	Bra	TestRelative
	
LookChangeDir	Move.w	BlokeXPos(pc),d1
	Move.w	BlokeXPosN(pc),d3
	Movem.l	d0-d5/d7,-(sp)
	Bsr	RelativeNastY
	Move.w	d7,d6
	Movem.l	(sp)+,d0-d5/d7	
	Move.w	02(a0),d2
	Cmpi.w	#01,d6
	Beq	NowNDirLeft
	Cmpi.w	#-1,d6
	Beq	NowNDirRight	
NoNastDirX	Rts	

NowNDirLeft	Bset	#2,d2
	Move.w	d2,02(a0)
	Rts
NowNDirRight	Bclr	#2,d2
	Move.w	d2,02(a0)
	Rts

AdvanceNastyFrm	Move.b	04(a0),d0
	Move.b	05(a0),d1
	Cmp.b	d0,d1
	Bne	NoNextNFrame
	
	Move.b	#0,05(a0)
	Move.b	03(a0),d0
	Addq	#1,d0
	And.b	#%00000011,d0
	And.b	#%11111100,03(a0)
	Or.b	d0,03(a0)
	
NoNextNFrame	Add.b	#1,05(a0)
	Rts
	
NastyWalkLR	Btst	#14,d3
	Bne	NastyWalk
	Move.b	CollFlagN(pc),d0
	Or.b	CollFlag1N(pc),d0
	Btst	#0,d0
	Bne	NastyGoLeft
	Btst	#1,d0
	Bne	NastyGoRight
	Bra	NastyWalk
NastyGoLeft	Bset	#2,d2
	Bra	NastyWalk
NastyGoRight	Bclr	#2,d2
NastyWalk	Btst	#2,d2
	Bne	NastyWalkLeft
	Bset	#8,d3
	Bset	#13,d3
	Rts
	Bra	NoNastyWalk
NastyWalkLeft	Bset	#9,d3
	Bset	#13,d3
	Rts
	Bra	NoNastyWalk
	
RelativeNastY	Move.w	d1,d4
	Move.w	d3,d5
	Add.w	#15,d4
	Add.w	#15,d5
	Cmp.w	d4,d3
	Blt	RelLessThanY
	Bra	BlokeAbove
RelLessThanY	Cmp.w	d5,d1
	Bls	BlokeSame
	
BlokeBelow	Moveq	#-1,d7
	Rts	

BlokeSame	Moveq	#00,d7
	Rts
	
BlokeAbove	Moveq	#01,d7
	Rts	

CheckBlokeNast	Bsr	CollisionDetA
	Tst.w	d0
	Beq	NoDetectDeadA	
	Bsr	KillBlokeA	
NoDetectDeadA	Bsr	CollisionDetB
	Tst.w	d0
	Beq	NoDetectDeadB
	Bsr	KillBlokeB
NoDetectDeadB	Rts

CollisionDetA	Move.w	BlokeXPos(pc),d0
	Move.w	BlokeYPos(pc),d1
	Move.w	BlokeXPosN(pc),d2
	Move.w	BlokeYPosN(pc),d3
	Bra	CollisionDet

CollisionDetB	Move.w	BlokeXPosB(pc),d0
	Move.w	BlokeYPosB(pc),d1
	Move.w	BlokeXPosN(pc),d2
	Move.w	BlokeYPosN(pc),d3
	Bra	CollisionDet

CollisionDet	Move.w	d0,d4
	Move.w	d2,d5
	Addq	#2,d0
	Addq	#2,d2
	Add.w	#13,d4
	Add.w	#13,d5
	Cmp.w	d4,d2
	Blt	LessThanX
	Bra	NoCollide
LessThanX	Cmp.w	d5,d0
	Bls	CheckY
NoCollide	Moveq	#0,d0
	Rts	
CheckY	Move.w	d1,d4
	Move.w	d3,d5
	Addq	#2,d1
	Addq	#2,d3
	Add.w	#13,d4
	Add.w	#13,d5
	Cmp.w	d4,d3
	Blt	LessThanY
	Bra	NoCollide
LessThanY	Cmp.w	d5,d1
	Bls	Collide
	Bra	NoCollide
Collide	Moveq	#-1,d0
	Rts

KillBlokeA	Lea	VL(pc),a5
	Moveq	#0,d7
	Btst	#0,DeadFlag-VL(a5,d7)
	Bne	BlokeAlreadyD
	Btst	#1,DeadFlag-VL(a5,d7)
	Bne	BlokeAlreadyD
	Move.w	#$100,DeadFlag-VL(a5,d7)
	Move.b	#12,WalkFrame-VL(a5,d7)
BlokeAlreadyD	Rts

KillBlokeB	Lea	VL(pc),a5
	Moveq	#CharConOffset,d7
	Btst	#0,DeadFlag-VL(a5,d7)
	Bne	BlokeAlreadyD
	Btst	#1,DeadFlag-VL(a5,d7)
	Bne	BlokeAlreadyD
	Move.w	#$100,DeadFlag-VL(a5,d7)
	Move.b	#12,WalkFrame-VL(a5,d7)
	Rts


NastDeadBounceA	Bsr	NastDeadBounce
	Bra	ServNastLoop
NastDeadBounceB	Bsr	NastDeadBounce
	Bra	ServNastLoopB


NastDeadBounce	Lea	DeadSineData(pc),a2
	Moveq	#0,d0
	Move.w	20(a0),d0
	Cmpi.w	#60,d0
	Bls	NotYetDeadFall
	Cmpi.w	#70,d0
	Beq	EndDeadBounce
	Cmpi.w	#61,d0
	Beq	DeadFalling	
	Move.w	#61,20(a0)
	Bclr	#0,09(a0)
DeadFalling	Bsr	DeadFallD
	Bra	EndDeadBounce
	
NotYetDeadFall	Add.w	d0,d0
	Add.w	d0,d0
	Move.w	06(a0),d5
	Move.w	08(a0),d6
	Add.w	02(a2,d0),d6

	Btst	#5,03(a0)
	Bne	DeadBounceR
	Sub.w	00(a2,d0),d5
	Bra	DoneDeadLRB
DeadBounceR	Add.w	00(a2,d0),d5

DoneDeadLRB	Move.w	#273,d3
	Move.w	#208,d4
	Bsr	DoProc
	
	Cmpi.w	#15,d5
	Bgt	NotLBounce
	Bset	#5,03(a0)
	Bra	NotRBounce
NotLBounce	Cmpi.w	#258,d5
	Bls	NotRBounce
	Bclr	#5,03(a0)

NotRBounce	Move.w	d5,06(a0)
	Move.w	d6,08(a0)
	Add.w	#1,20(a0)
	Bsr	AdvDeadFrame
	Bra	EndDeadBounce
	
	
EndDeadBounce	Lea	NastyListPtr(pc),a4
	Add.l	#NastListSlot,(a4)
	Rts
	
AdvDeadFrame	Move.b	03(a0),d0
	Addq	#1,d0
	And.b	#$3,d0
	And.b	#%11111100,03(a0)
	Or.b	d0,03(a0)
	Rts	
	
DeadFallD	Moveq	#0,d6
	Moveq	#0,d7
	Movem.l	d0-d5/a0,-(sp)
	Lea	MapData(pc),a3
	Move.w	#03,d4
	Move.w	#15,d5
	Moveq	#00,d3
	Bsr	DoCollDetN
	Move.w	#12,d4
	Move.w	#15,d5
	Moveq	#00,d3
	Bsr	DoCollDetN
	Move.w	#03,d4
	Move.w	#16,d5
	Moveq	#01,d3
	Bsr	DoCollDetN
	Move.w	#12,d4
	Move.w	#16,d5
	Moveq	#01,d3
	Bsr	DoCollDetN
	Move.w	#03,d4
	Move.w	#17,d5
	Moveq	#02,d3
	Bsr	DoCollDetN
	Move.w	#12,d4
	Move.w	#17,d5
	Moveq	#02,d3
	Bsr	DoCollDetN
	Movem.l	(sp)+,d0-d5/a0
	
	Move.w	d6,d5
	Or.w	d7,d5
	
	Moveq	#1,d0

	Btst	#0,d5
	Bne	FallSpeed2	
	Btst	#1,d5
	Bne	PlatformFound
	Btst	#2,d5
	Bne	FallSpeed1
FallSpeed2	Addq	#1,d0
FallSpeed1	Add.w	d0,08(a0)
	Rts
PlatFormFound	Move.w	#70,20(a0)
	Move.b	#10,01(a0)
	
	
	Lea	BurstList(pc),a5
	Moveq	#0,d4
	Moveq	#7,d5
FindBurstLoop	Move.l	00(a5),a4
	Cmp.l	a0,a4
	Beq	FoundGoodyBurst
	Addq	#8,a5
	Dbf	d5,FindBurstLoop	
GoodBananaX	Moveq	#42,d0	; Goody Value
	Move.b	d0,00(a0)
	Rts	
	
FoundGoodyBurst	Lea	BurstList(pc),a4
	Cmp.l	a4,a5
	Beq	GoodBananaX
	
FindGoodLoop	Move.l	04(a5),d1
	Move.l	-4(a5),d2
	Addq	#8,d2
	Cmp.l	d2,d1
	Bgt	NotConnected
	Addq	#1,d4
	Subq	#8,a5
	Cmp.l	a4,a5
	Bne	FindGoodLoop
	
NotConnected	Lea	BurstBubList(pc),a4
	Add.w	d4,d4
	Move.w	(a4,d4),d0
	Move.b	d0,00(a0)
	Rts	
	
	
	
	
	
	
DoCollDetN	Move.w	06(a0),d0
	Move.w	08(a0),d1
	Add.w	d4,d0
	Add.w	d5,d1
	Move.l	a3,a2
	Asr.w	#3,d0
	Asr.w	#3,d1
	Moveq	#0,d4
	Move.l	#40,d2
	Muls	d1,d2
	Move.w	d2,d4
	Add.w	d0,d4
	Asl.l	#1,d4
	Add.l	d4,a2
	Move.b	(a2),d0
	Btst	#7,d0
	Beq	NoCollisAN
	Bset	d3,d6
NoCollisAN	Btst	#6,d0
	Beq	NoCollisBN
	Bset	d3,d7
NoCollisBN	Rts
	






		
NastyFloatingA	Bsr	CheckAngry
	Bsr	NastFloat
	Bra	DoNextNastyA
NastyFloatingB	Bsr	CheckAngry
	Bsr	NastFloat
	Bra	DoNextNastyB
	
CheckAngry	Move.w	20(a0),d0
	Tst.w	d0
	Bne	CountingAngry
	Rts
	
CountingAngry	Add.w	#1,20(a0)
	Move.w	16(a0),d1	;WaitTillAngryVar
	Cmp.w	d1,d0
	Bge	AngryStage
	Rts
AngryStage	Move.w	18(a0),d1	;WaitTillBurstVar
	Cmp.w	d1,d0
	Bge	BurstBubble
	Btst	#0,d0
	Beq	NotRedBubble
	Bclr	#2,03(a0)
	Bset	#4,03(a0)
	Rts
		
NotRedBubble	Bclr	#4,03(a0)
ResetOrigDir	Btst	#5,03(a0)
	Beq	ResetGreenBub
	Bset	#2,03(a0)
	Rts
ResetGreenBub	Bclr	#2,03(a0)
	Rts
	
BurstBubble	Move.b	#0,02(a0)
	Bclr	#3,03(a0)
	Bset	#4,03(a0)
	Bclr	#0,07(a0)
	Bclr	#0,09(a0)
	Move.w	#0,20(a0)
	Move.b	#0,14(a0)	
	Bra	ResetOrigDir

NastFloat	Bchg	#7,15(a0)
	Bne	NoFloatN
	Move.w	06(a0),d0
	Move.w	08(a0),d1
	Addq	#7,d0
	Addq	#7,d1
	Bsr	DoBubCollDet
	And.w	#$7,d0
	Cmp.b	#1,d0
	Beq	NFloatUp
	Cmp.b	#2,d0
	Beq	NFloatDown
	Cmp.b	#3,d0
	Beq	NFloatLeft
	Cmp.b	#4,d0
	Beq	NFloatRight
NoFloatN	Rts
	
NFloatUp	Sub.w	#1,08(a0)
	Bra	NFloatUD
NFloatDown	Add.w	#1,08(a0)
	Bra	NFloatUD
NFloatLeft	Sub.w	#1,06(a0)
	Bra	NFloatingLR
NFloatRight	Add.w	#1,06(a0)

NFloatingLR	Add.b	#1,05(a0)
	Cmpi.b	#07,05(a0)
	Bne	ProcNNextBubble
	Move.b	#0,05(a0)
	
	Move.b	03(a0),d4
	Move.b	d4,d5
	And.b	#%11111100,d5
	Addq	#1,d4
	And.b	#3,d4
	Or.b	d4,d5
	Move.b	d5,03(a0)
	Bra	ProcNNextBubble	
	
NFloatUD	Bset	#0,03(a0)
	Bclr	#1,03(a0)
	
ProcNNextBubble	Rts

ProcessBubbles	Lea	BubbleList(pc),a0
	Lea	VL(pc),a5
	Moveq	#15,d7
ProcBubbleLoop	Tst.w	(a0)
	Bne	DoProcBubble
	
ProcNextBubble	Add.l	#12,a0
	Dbf	d7,DoProcBubble
	Rts
	
DoProcBubble	Move.w	02(a0),d0
	Btst	#3,d0
	Bne	BubbleFiring
	Btst	#4,d0
	Bne	BubbleFloating
	Bra	ProcNextBubble
	
BubbleFiring	Moveq	#20,d1
	Btst	#1,CharFrameDir-VL(a5)
	Bne	LongerBubFrame
	Moveq	#10,d1
	Bra	BubTravelOkay
		
LongerBubFrame	Btst	#2,CharFrameDir-VL(a5)
	Beq	BubTravelOkay
	
	Asr.w	#1,d1
	
BubTravelOkay	Add.b	#1,09(a0)
	Move.b	09(a0),d2
	Cmp.b	d1,d2
	Bne	NotNewBubFrame
	
	Move.b	#0,09(a0)
	Move.w	d0,d1
	And.w	#%1111111111111100,d1
	Addq	#1,d0
	And.w	#$3,d0
	Or.w	d0,d1
	Move.w	d1,02(a0)
	
NotNewBubFrame	Btst	#7,03(a0)
	Bne	ProcNextBubble
	
	Moveq	#0,d0
	Add.b	#1,08(a0)
	
	Btst	#1,CharFrameDir-VL(a5)
	Bne	LongerBubTravel	
	Moveq	#19,d1
	Bra	DoneShortTravel
	
LongerBubTravel	Moveq	#38,d1

DoneShortTravel	Btst	#2,CharFrameDir-VL(a5)
	Bne	NoDoubleTravel	
	Add.w	d1,d1
	
NoDoubleTravel	Move.b	08(a0),d0
	Cmp.w	d1,d0
	Bls	BubNotTravel
	
	Move.w	#0,08(a0)
	Bclr	#3,03(a0)
	Bset	#4,03(a0)
	
BubNotTravel	Move.w	02(a0),d0
	Move.w	04(a0),d5
	
	Btst	#2,CharFrameDir-VL(a5)
	Bne	FasterBubSpeed	
	Moveq	#2,d1
	Bra	DoneBubSpeed
	
FasterBubSpeed	Moveq	#4,d1		
	
DoneBubSpeed	Btst	#2,d0
	Bne	BubFGoLeft
	
	Add.w	d1,04(a0)
	Bra	DoneBubFMove
BubFGoLeft	Sub.w	d1,04(a0)

DoneBubFMove	Move.w	04(a0),d0
	Move.w	06(a0),d1
	Bsr	DoBubbleCollDet
	Tst.w	d3
	Beq	BubWallOkay
	Move.w	d5,04(a0)
		
BubWallOkay	Lea	NastyList(pc),a1	
	Moveq	#7,d6
CollBubNastLoop	Tst.w	(a1)
	Beq	NoNastBubHere
	Btst	#3,03(a1)
	Bne	NoNastBubHere
	Move.w	04(a0),d0
	Move.w	06(a0),d1
	Move.w	06(a1),d2
	Move.w	08(a1),d3
	Bsr	CollisionDet
	Tst.w	d0
	Beq	NoNastBubHere
	
	Btst	#5,03(a0)
	Beq	NastGreenBub
	Bset	#2,03(a1)
	Bset	#5,03(a1)
	Bra	DoneColourBub
NastGreenBub	Bclr	#2,03(a1)
	Bclr	#5,03(a1)
DoneColourBub	Bset	#3,03(a1)
	Bclr	#4,03(a1)
	Move.w	#1,20(a1)
	Bset	#7,03(a0)
	Move.w	#303,04(a0)
	Move.w	#032,06(a0)

NoNastBubHere	Add.l	#NastListSlot,a1
	Dbf	d6,CollBubNastLoop
	Bra	ProcNextBubble

BubbleFloating	Bchg	#6,03(a0)
	Beq	ProcNextBubble
	Btst	#7,02(a0)
	Bne	ProcNextBubble
	Move.w	04(a0),d0
	Move.w	06(a0),d1
	Addq	#7,d0
	Addq	#7,d1
	Bsr	DoBubCollDet
	And.w	#$7,d0
	Cmp.b	#1,d0
	Beq	FloatUp
	Cmp.b	#2,d0
	Beq	FloatDown
	Cmp.b	#3,d0
	Beq	FloatLeft
	Cmp.b	#4,d0
	Beq	FloatRight
	Bra	ProcNextBubble
	
FloatUp	Sub.w	#1,06(a0)
	Bra	FloatUD
FloatDown	Add.w	#1,06(a0)
	Bra	FloatUD
FloatLeft	Sub.w	#1,04(a0)
	Bra	FloatingLR
FloatRight	Add.w	#1,04(a0)

FloatingLR	Add.b	#1,09(a0)
	Cmpi.b	#07,09(a0)
	Bne	ProcNextBubble
	Move.b	#0,09(a0)
	Bchg	#0,03(a0)
	Bra	ProcNextBubble	
	
FloatUD	Bset	#0,03(a0)
	Bra	ProcNextBubble
	
SetBubbleBlits	Lea	BubbleList(pc),a0
	Moveq	#15,d7
BubbleServLoop	Tst.w	(a0)
	Beq	UnActiveBubble

	Moveq	#0,d0
	Moveq	#0,d1
	Move.w	00(a0),d0
	Move.w	02(a0),d1
	Move.w	04(a0),d5
	Move.w	06(a0),d6
	
	Movem.l	d7/a0,-(sp)
	Bsr	SetBubbleBlit
	Movem.l	(sp)+,d7/a0

UnActiveBubble	Add.l	#12,a0
	Dbf	d7,BubbleServLoop
	Rts	

SetBubbleBlit	Cmpi.w	#303,d5
	Beq	BypassProcCheck
	Move.w	#272,d3
	Move.w	#232,d4
	Bsr	DoProc
	Move.w	d5,04(a0)
	Move.w	d6,06(a0)
BypassProcCheck	Moveq	#0,d2
	Cmpi.w	#1,d0
	Beq	GotNormBub
	Moveq	#0,d0
	Move.l	#((40*16*5*15)+38),d0
	Bra	DoListPoke
	
GotNormBub	Btst	#7,02(a0)
	Bne	BubbleBurstGFX
	Move.l	#32,d0
	Btst	#7,03(a0)
	Bne	SetHideBub
	Btst	#5,d1
	Beq	GotGreenBub
	Add.l	#(40*16*5),d0
GotGreenBub	And.l	#3,d1
	Add.w	d1,d1
	Add.l	d1,d0
	Bra	DoListPoke	
SetHideBub	Move.l	#((40*16*5*15)+38),d0
	Bra	DoListPoke
	
BubbleBurstGFX	Move.l	#(40*32*5),d0
	Moveq	#0,d1
	Move.b	02(a0),d1
	And.b	#15,d1
	Cmpi.b	#11,d1
	Bls	BurstFrameOkay
	Moveq	#11,d1
	Move.b	#000,02(a0)
	Move.w	#303,04(a0)
	Move.w	#032,06(a0)
BurstFrameOkay	Add.b	#1,02(a0)
	Asr.l	#2,d1
	Add.w	d1,d1
	Add.l	d1,d0
	Bra	DoListPoke		

SetNastyBlits	Lea	NastyList(pc),a0
	Moveq	#7,d7
NastyServLoop	Tst.w	(a0)
	Beq	UnActiveNasty
	
	Moveq	#0,d0
	Moveq	#0,d1
	Move.w	00(a0),d0
	Tst.w	d0
	Beq	UnActiveNasty
	Move.w	02(a0),d1
	Move.w	06(a0),d5
	Move.w	08(a0),d6
	Movem.l	d7/a0,-(sp)
	Bsr	SetNastyBlit
	Movem.l	(sp)+,d7/a0

UnActiveNasty	Add.l	#NastListSlot,a0
	Dbf	d7,NastyServLoop
	Rts
	
SetNastyBlit	And.b	#$ff,d0
	Cmpi.b	#10,d0
	Beq	DoNastGoody
	Cmpi.b	#11,d0
	Beq	DoGoodyScore
	Move.w	#305,d3
	Move.w	#232,d4
	Bsr	DoProc
	Move.w	d5,06(a0)
	Move.w	d6,08(a0)	
	Subq	#1,d0
	Muls	#(40*16*5),d0
	And.w	#%11111,d1
	Btst	#4,d1
	Beq	NotDeadNasty
	And.w	#%01111,d1
	Add.l	#(40*(16*8)*5),d0
NotDeadNasty	Add.w	d1,d1
	Add.l	d1,d0
	Move.l	#NastyMask,a0
	Move.l	#NastyGFX,a1
	Bra	DoListPokeNasty
	
DoNastGoody	Add.w	#1,18(a0)
	Cmpi.w	#650,18(a0)
	Bgt	GoodyExpired
	Cmpi.w	#640,18(a0)
	Bgt	GoodyGoing
ContGoody	Moveq	#0,d0
	Moveq	#0,d1
	Move.b	00(a0),d1
ShowGoody	Lea	SpriteAdTab(pc),a2
	Add.w	d1,d1
	Move.w	(a2,d1),d0	
	Move.l	#CharMask+(40*64*5),a0
	Move.l	#CharGFX+(40*64*5),a1
	Bra	DoListPokeNasty
GoodyExpired	Move.w	#303,06(a0)
	Move.w	#032,08(a0)
	Move.w	#303,d5
	Move.w	#032,d6
	Bra	ContGoody
GoodyGoing	Move.l	#38,d1
	Bra	ShowGoody

DoGoodyScore	Add.w	#1,20(a0)
	Cmpi.w	#70,20(a0)
	Bls	ScoreOkay
	Move.w	#303,06(a0)
	Move.w	#32,08(a0)
ScoreOkay	Cmpi.w	#30,20(a0)
	Bge	StopRising
	Btst	#0,21(a0)
	Bne	StopRising
	Sub.w	#1,08(a0)
StopRising	Lea	GoodPointList(pc),a2
	Lea	SpriteAdTab(pc),a3
	Moveq	#0,d0
	Moveq	#0,d1
	Move.b	00(a0),d0
	Add.w	d0,d0
	Move.w	(a2,d0),d1	
	Add.w	d1,d1
	Move.w	(a3,d1),d0
	Move.l	#ScoresMask+(40*32*5),a0
	Move.l	#ScoresGFX+(40*0*5),a1
	Bra	DoListPokeNasty

SetBlokeBlit	Bsr	ProcBlokePos
	Bsr	DoBlokeFrame
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	Btst	#2,DeadFlag-VL(a5,d7)
	Beq	DoListPoke
	Move.l	#((40*16*5*15)+38),d0
	Bra	DoListPoke
		
DoListPoke	Lea	Altern8(pc),a5
	Tst.w	(a5)
	Bne	GetBlitList1
	Lea	BlitterList0(pc),a4
	Bra	GotBlitList
GetBlitList1	Lea	BlitterList1(pc),a4

GotBlitList	Add.l	ActObjectOffset(pc),a4
	Lea	VL(pc),a5
	Move.l	#CharMask,a0
	Move.l	#CharGFX,a1
	Add.l	d0,a0	; d0 = Anim Frame offset
	Add.l	d0,a1		
	Bsr	DoPosCalc	
	Move.l	PiccyBase(pc),a2
	Move.l	#PiccyBack,a3
	Add.l	d0,a2
	Add.l	d0,a3
	Move.w	d4,d5
	Or.w	#$fca,d4
	Swap	d4
	Move.w	d5,d4
	Move.l	#$00240024,d6
	Moveq	#-1,d0
	Move.w	#(16*5*64)+2,d0
	Movem.l	d0/d4/d6/a0-a3,-(a4)
	Lea	ActObjectOffset(pc),a4
	Sub.l	#28,(a4)
	Rts

DoListPokeNasty	Lea	Altern8(pc),a5
	Tst.w	(a5)
	Bne	GetBlitList1N
	Lea	BlitterList0(pc),a4
	Bra	GotBlitListN
GetBlitList1N	Lea	BlitterList1(pc),a4

GotBlitListN	Add.l	ActObjectOffset(pc),a4
	Lea	VL(pc),a5
	Add.l	d0,a0	; d0 = Anim Frame offset
	Add.l	d0,a1		
	Bsr	DoPosCalc	
	Move.l	PiccyBase(pc),a2
	Move.l	#PiccyBack,a3
	Add.l	d0,a2
	Add.l	d0,a3
	Move.w	d4,d5
	Or.w	#$fca,d4
	Swap	d4
	Move.w	d5,d4
	Move.l	#$00240024,d6
	Moveq	#-1,d0
	Move.w	#(16*5*64)+2,d0
	Movem.l	d0/d4/d6/a0-a3,-(a4)
	Lea	ActObjectOffset(pc),a4
	Sub.l	#28,(a4)
	Rts

DoBlankListPoke	Lea	Altern8(pc),a5
	Tst.w	(a5)
	Bne	GetBlitList1Bl
	Lea	BlitterList0(pc),a4
	Bra	GotBlitListBl
GetBlitList1Bl	Lea	BlitterList1(pc),a4

GotBlitListBl	Add.l	ActObjectOffset(pc),a4
	Lea	VL(pc),a5
	Move.l	#0,a0
	Move.l	#0,a1
	Move.l	#0,a3
	Move.l	PiccyBase(pc),a2
	Add.l	#(40*5*32),a2

	Move.l	#$01000000,d4
	Move.l	#$00240024,d6
	Moveq	#-1,d0
	Move.w	#(16*5*64)+2,d0
	Movem.l	d0/d4/d6/a0-a3,-(a4)
	Lea	ActObjectOffset(pc),a4
	Sub.l	#28,(a4)
	Rts
	
DoBlits	Lea	$Dff000,a6
	Lea	Altern8(pc),a5
	Tst.w	(a5)
	Bne	GetBlitList1A
	Lea	BlitterList0(pc),a5
	Bra	GotBlitListA
GetBlitList1A	Lea	BlitterList1(pc),a5
GotBlitListA	Moveq	#0,d7
BlitNextLoop	Movem.l	(a5)+,d0-d6
	Tst.l	d0
	Beq	GetNextBlit
	Move.l	#$ffff0000,BltAFWM(a6)
	Move.l	d1,BltCon0(a6)
	Move.l	d3,BltAPth(a6)
	Move.l	d4,BltBPth(a6)
	Move.l	d5,BltCPth(a6)
	Move.l	d5,BltDPth(a6)
	Move.w	d2,BltAMod(a6)
	Move.w	d2,BltBMod(a6)
	Swap	d2
	Move.w	d2,BltCMod(a6)
	Move.w	d2,BltDMod(a6)
	Move.w	d0,BltSize(a6)
GetNextBlit	Addq	#1,d7
	Cmpi.w	#ActiveObjects,d7
	Bne	BlitNextLoop
	Rts

DoBlitRecs	Lea	$Dff000,a6
	Lea	Altern8(pc),a5
	Tst.w	(a5)
	Beq	GetBlitList1B
	Lea	BlitterList0(pc),a5
	Bra	GotBlitListB
GetBlitList1B	Lea	BlitterList1(pc),a5
GotBlitListB	Moveq	#0,d7
BlitRecNextLoop	Movem.l	(a5)+,d0-d6
	Tst.l	d0
	Beq	NoRecBlit
	Move.l	#$ffffffff,BltAFWM(a6)
	Move.l	#$09f00000,BltCon0(a6)
	Move.l	d6,BltAPth(a6)
	Move.l	d5,BltDPth(a6)
	Move.w	d2,BltAMod(a6)
	Swap	d2
	Move.w	d2,BltDMod(a6)
	Move.w	d0,BltSize(a6)
NoRecBlit	Addq	#1,d7
	Cmpi.w	#ActiveObjects,d7
	Bne	BlitRecNextLoop
	Rts

BlokeWalk	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	Btst	#0,DeadFlag-VL(a5,d7)
	Bne	BlokeDeadSpin
	Btst	#1,DeadFlag-VL(a5,d7)
	Bne	BlokeReBorn
	Move.b	CollFlag-VL(a5,d7),d0
	Or.b	CollFlag1-VL(a5,d7),d0
	And.w	#3,d0
	Tst.w	d0
	Bne	NoBlokeWalk1
	Add.b	#1,WalkCounter-VL(a5,d7)
	Cmp.b	#4,WalkCounter-VL(a5,d7)
	Beq	DoWalkFrame
	Rts
DoWalkFrame	Move.b	#0,WalkCounter-VL(a5,d7)
	Btst	#5,MoveFlag-VL(a5,d7)
	Beq	NoBlokeWalk1
	Bchg	#0,WalkFrame-VL(a5,d7)
NoBlokeWalk1	Rts

BlokeDeadSpin	Add.b	#1,WalkCounter-VL(a5,d7)
	Cmp.b	#5,WalkCounter-VL(a5,d7)
	Bne	NoBlokeWalk1
	Move.b	#0,WalkCounter-VL(a5,d7)
	
	Add.b	#1,DeadFlag+1-VL(a5,d7)
	Cmp.b	#25,DeadFlag+1-VL(a5,d7)
	Beq	EndDeadSpin
	
	Add.b	#1,WalkFrame-VL(a5,d7)
	Cmp.b	#16,WalkFrame-VL(a5,d7)
	Bne	NoBlokeWalk1
	Move.b	#12,WalkFrame-VL(a5,d7)
	Rts
	
EndDeadSpin	Move.w	#$200,DeadFlag-VL(a5,d7)
	Move.b	#0,WalkFrame-VL(a5,d7)	
	Move.b	#0,CharFrameDir-VL(a5,d7)
	Rts
	
BlokeReBorn	Add.b	#1,DeadFlag+1-VL(a5,d7)
	Cmp.b	#180,DeadFlag+1-VL(a5,d7)
	Beq	EndReBorn
	
	Bchg	#2,DeadFlag-VL(a5,d7)
	Rts
	
EndReBorn	Move.w	#$0,DeadFlag-VL(a5,d7)
	Rts
	
	
DoBlokeFrame	Moveq	#0,d0
	Moveq	#0,d7
	Lea	VL(pc),a5
	Move.w	CharConNo-VL(a5),d7
	Move.b	WalkFrame-VL(a5,d7),d0
	Add.l	d0,d0
	Tst.w	d7
	Beq	NoBloke2
	Add.l	#(16*5*40),d0
NoBloke2	Btst	#0,DeadFlag-VL(a5,d7)
	Bne	NoMouth
	Btst	#0,DireFlag-VL(a5,d7)
	Bne	RightFrame
	Add.w	#12,d0
RightFrame	Move.w	MouthFrame-VL(a5,d7),d2
	Cmpi.w	#1,d2
	Beq	DoMouthFrame1
	Cmpi.w	#2,d2
	Beq	DoMouthFrame2
	Cmpi.w	#3,d2
	Beq	DoMouthFrame1
	Rts
DoMouthFrame1	Addq	#4,d0
	Rts
DoMouthFrame2	Addq	#8,d0
NoMouth	Rts	

ProcBlokePos	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	Moveq	#0,d5
	Moveq	#0,d6
	Move.w	BlokeXPos-VL(a5,d7),d5
	Move.w	BlokeYPos-VL(a5,d7),d6
	Move.w	#273,d3
	Move.w	#224,d4
	Bsr	DoProc
	Move.w	d5,BlokeXpos-VL(a5,d7)
	Move.w	d6,BlokeYpos-VL(a5,d7)
	Rts
	
DoProc	Tst.w	d5
	Bpl	NoClearD5
	Moveq	#0,d5
	
NoClearD5	Cmpi.w	#1,d6
	Bge	NoClearD6
	Cmpi.w	#223,d6
	Bls	NoClearD6
	Move.w	#224,d6
		
NoClearD6	Cmp.w	d3,d5
	Ble	ObjXnover
	Move.w	d3,d5
	
ObjXnover	Cmp.w	#224,d6
	Ble	ObjYnover
	Move.w	#$1,d6
	
ObjYnover	Rts

DoPosCalc	Moveq	#0,d0
	Move.l	#200,d4
	Muls	d6,d4
	Add.l	d4,d0
	Move.w	d5,d4
	Asr.w	#3,d5
	Bclr	#0,d5
	Add.l	d5,d0
	And.w	#$f,d4
	Move.w	d4,d3
	Asl.w	#8,d4
	Asl.w	#4,d4
	Rts

BlitterWait	Btst	#6,DmaConr(A6)
	Bne	BlitterWait
	Rts
	
TrackMouse	Lea	VL(pc),a5
	Move.w	$Dff00a,d0
	Move.b	OldX-VL(a5),d1
	Move.b	d0,OldX-VL(a5)
	Sub.b	d0,d1
	Ext.w	d1
	Sub.w	d1,BlokeXPos-VL(a5)

	Lsr.w	#8,d0
	Move.b	OldY-VL(a5),d1
	Move.b	d0,OldY-VL(a5)
	Sub.b	d0,d1
	Ext.w	d1
	Sub.w	d1,BlokeYPos-VL(a5)
	Rts
	
SetMouse	Move.w	$Dff00a,d0
	Lea	VL(pc),a5
	Move.b	d0,OldX-VL(a5)
	Lsr.w	#8,d0
	Move.b	d0,OldY-VL(a5)
	Rts

BlokeCon	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	
	Moveq	#1,d0
	Btst	#4,CharFrameDir-VL(a5,d7)
	Beq	NoFasterMove
	Moveq	#2,d0
NoFasterMove	Move.w	d0,MoveSpeed-VL(a5)
	Move.b	MoveFlag-VL(a5,d7),d0
	
	Move.b	#$00,CollFlag-VL(a5,d7)
	Move.b	#$00,CollFlag1-VL(a5,d7)

	Btst	#0,DeadFlag-VL(a5,d7)
	Beq	NotDeadYet	
	And.b	#%11000000,d0

NotDeadYet	Btst	#0,d0
	Beq	NoWantMoveRight
	
	Move.w	BlokeXPos-VL(a5,d7),d2
	Move.w	MoveSpeed(pc),d3
	Add.w	d3,BlokeXPos-VL(a5,d7)
	
CheckRightColl	Movem.l	d0-d7,-(sp)
	Lea	MapData(pc),a1	
	Move.w	#15,d4
	Move.w	#15,d5
	Moveq	#00,d3
	Bsr	DoCollDet
	Movem.l	(sp)+,d0-d7	
	Bset	#0,DireFlag-VL(a5,d7)
	
	Btst	#0,CollFlag1-VL(a5,d7)
	Bne	NoMoveBlockR	
	Btst	#0,CollFlag-VL(a5,d7)
	Beq	CheckJump	
	Btst	#0,JumpFlag-VL(a5,d7)
	Bne	NoWantMoveRight
	
NoMoveBlockR	Move.w	d2,BlokeXPos-VL(a5,d7)
	
NoWantMoveRight	Btst	#1,d0
	Beq	CheckJump
	
	Move.w	BlokeXPos-VL(a5,d7),d2
	Move.w	MoveSpeed(pc),d3
	Sub.w	d3,BlokeXPos-VL(a5,d7)
	
CheckLeftColl	Movem.l	d0-d7,-(sp)
	Lea	MapData(pc),a1	
	Move.w	#00,d4
	Move.w	#15,d5
	Moveq	#1,d3
	Bsr	DoCollDet
	Movem.l	(sp)+,d0-d7	
	Bclr	#0,DireFlag-VL(a5,d7)

	Btst	#1,CollFlag1-VL(a5,d7)
	Bne	NoMoveBlockL	
	Btst	#1,CollFlag-VL(a5,d7)
	Beq	CheckJump	
	Btst	#0,JumpFlag-VL(a5,d7)
	Bne	CheckJump
	
NoMoveBlockL	Move.w	d2,BlokeXPos-VL(a5,d7)
	
CheckJump	And.b	#$f,d0
	Move.b	d0,MoveFlag1-VL(a5,d7)

	Movem.l	d0-d7,-(sp)
	Lea	MapData(pc),a1	
	Move.w	#04,d4
	Move.w	#16,d5
	Moveq	#02,d3
	Bsr	DoCollDet
	Move.w	#11,d4
	Move.w	#16,d5
	Moveq	#02,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#16,d5
	Moveq	#02,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#11,d5
	Moveq	#05,d3
	Bsr	DoCollDet
	Move.w	#08,d4
	Move.w	#11,d5
	Moveq	#05,d3
	Bsr	DoCollDet
	Movem.l	(sp)+,d0-d7	
	
	Btst	#0,JumpFlag-VL(a5,d7)
	Bne	DoJumpFollow
	Btst	#3,d0
	Beq	CheckFreeFall
	
	Move.b	CollFlag-VL(a5,d7),d1
	Move.b	CollFlag1-VL(a5,d7),d3
	
	Btst	#5,d3
	Bne	CheckFreeFall
	
	Or.b	d1,d3	
	Btst	#2,d3
	Beq	CheckFreeFall
	
	Bset	#0,JumpFlag-VL(a5,d7)
	Move.b	#0,JumpFlag1-VL(a5,d7)
	
DoJumpFollow	Btst	#0,DeadFlag-VL(a5,d7)
	Beq	NoDeadJump
	
	Move.b	CollFlag-VL(a5,d7),d1
	Or.b	CollFlag1-VL(a5,d7),d1
	Btst	#2,d1
	Bne	NoDeadJump
	Btst	#5,d1
	Bne	NoDeadJump
	Bra	DeadFall
	
NoDeadJump	Move.w	JumpDown-VL(a5,d7),d0
	Move.b	JumpFlag1-VL(a5,d7),d1
	Cmp.b	d0,d1
	Ble	JumpingUp
	
	Bclr	#0,JumpFlag-VL(a5,d7)
	Bclr	#2,JumpFlag-VL(a5,d7)
	Rts
		
JumpingUp	Bclr	#1,JumpFlag-VL(a5,d7)
	Lea	JumpSpeed-VL(a5),a0
	Moveq	#0,d0
	Move.b	JumpFlag1-VL(a5,d7),d0
	Add.b	#1,d0
	Move.w	JumpFrames-VL(a5,d7),d1
	Cmp.b	d0,d1
	Beq	EndJump
	Move.b	d0,JumpFlag1-VL(a5,d7)
	Asl.w	#1,d0
	Move.w	(a0,d0),d1
	Add.w	d1,BlokeYPos-VL(a5,d7)
	Rts
	
EndJump	Bclr	#0,JumpFlag-VL(a5,d7)
	Btst	#2,CollFlag-VL(a5,d7)
	Bne	NoFreeFall
	Btst	#2,CollFlag1-VL(a5,d7)
	Bne	NoFreeFall
	Bset	#1,JumpFlag-VL(a5,d7)
	Add.w	#1,BlokeYPos-VL(a5,d7)
	
NoFreeFall	Rts	

DeadFall	Bclr	#0,JumpFlag-VL(a5,d7)
	Move.w	BlokeYPos-VL(a5,d7),d2
	Bclr	#0,d2
	Move.w	d2,BlokeYPos-VL(a5,d7)
	
CheckFreeFall	Btst	#0,JumpFlag-VL(a5,d7)
	Bne	FallOkay
	
	And.b	#%00,CollFlag-VL(a5,d7)
	And.b	#%00,CollFlag1-VL(a5,d7)

	Move.w	BlokeYPos-VL(a5,d7),d2
	Move.w	FallSpeed(pc),d5
AddFallSpeed	Add.w	d5,BlokeYPos-VL(a5,d7)
	
	Movem.l	d0-d7,-(sp)
	Lea	MapData(pc),a1	
	Move.w	#03,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#12,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#03,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Move.w	#12,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Movem.l	(sp)+,d0-d7
	
	Move.b	CollFlag-VL(a5,d7),d1
	Move.b	CollFlag1-VL(a5,d7),d3
	
	Btst	#4,d3
	Bne	FallOkay
	Btst	#4,d1
	Bne	FallOkay
	Btst	#3,d1
	Bne	FallNotOkay
	Btst	#3,d3
	Bne	FallNotOkay
	Bra	FallOkay
	
FallNotOkay	Move.w	d2,BlokeYPos-VL(a5,d7)
FallFail	Bclr	#1,JumpFlag-VL(a5,d7)

AddFallSpeed1	Add.w	#1,BlokeYPos-VL(a5,d7)
	And.b	#%00,CollFlag-VL(a5,d7)
	And.b	#%00,CollFlag1-VL(a5,d7)
	
	Movem.l	d0-d7,-(sp)
	Lea	MapData(pc),a1	
	Move.w	#03,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#12,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#15,d5
	Moveq	#03,d3
	Bsr	DoCollDet
	Move.w	#03,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Move.w	#12,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Move.w	#07,d4
	Move.w	#11,d5
	Moveq	#04,d3
	Bsr	DoCollDet
	Movem.l	(sp)+,d0-d7
	
	Move.b	CollFlag-VL(a5,d7),d1
	Move.b	CollFlag1-VL(a5,d7),d3
	
	Btst	#4,d3
	Bne	FallOkay
	Btst	#4,d1
	Bne	FallOkay
	Btst	#3,d1
	Bne	FallNotOkay1
	Btst	#3,d3
	Bne	FallNotOkay1
	Bra	FallOkay
	
FallNotOkay1	Move.w	d2,BlokeYPos-VL(a5,d7)
FallFail1	Bclr	#1,JumpFlag-VL(a5,d7)
	Rts
FallOkay	Bset	#1,JumpFlag-VL(a5,d7)
	Rts
	
ProcessMouth	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
		
	Lea	MouthFlag-VL(a5,d7),a0
	Btst	#0,00(a0)
	Beq	NoOpenMouth

	Add.b	#1,01(a0)
	Move.b	01(a0),d1
	Move.w	04(a0),d0
	Cmp.b	d0,d1
	Bne	NoOpenMouth
	
	Btst	#0,DeadFlag-VL(a5,d7)
	Bne	DoneSBubble
	
	Cmpi.w	#1,02(a0)
	Beq	GoDoBubble
	
DoneSBubble	Move.b	#0,01(a0)
	Add.w	#1,02(a0)
	
	Btst	#3,CharFrameDir-VL(a5,d7)
	Bne	FastRelease
	
SlowRelease	Cmpi.w	#12,02(a0)
	Bne	NoOpenMouth
	Bra	DoneRelease

FastRelease	Cmpi.w	#4,02(a0)
	Bne	NoOpenMouth
	
DoneRelease	Move.l	#$02000000,(a0)	
NoOpenMouth	Rts

GoDoBubble	Move.l	a0,-(sp)
	Bsr	ShootBubble
	Move.l	(sp)+,a0
	Bra	DoneSBubble
	
ShootBubble	Lea	BubbleList(pc),a0
	Lea	BubblePtr(pc),a1
	Moveq	#0,d0
	Move.w	(a1),d0
	Addq	#1,d0
	And.w	#$f,d0
	Move.w	d0,(a1)
	Muls	#12,d0
	
	Add.l	d0,a0	
	
GotEmptyBub	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7		
	Move.w	BlokeXPos-VL(a5,d7),d0
	Move.w	BlokeYPos-VL(a5,d7),d1

	Moveq	#$08,d2
	Btst	#0,DireFlag-VL(a5,d7)
	Bne	DoRightBub	
	Bset	#2,d2
	
DoRightBub	Tst.w	d7
	Beq	GotGreenyBub
	Bset	#5,d2
GotGreenyBub	Move.w	#$01,00(a0)
	Move.w	d2,02(a0)
	Move.w	d0,04(a0)
	Move.w	d1,06(a0)
	Move.l	#0,08(a0)

	Rts
	
		
NastyCollDet	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	Lea	MapData(pc),a1
	
	Move.b	#$00,CollFlag-VL(a5,d7)
	Move.b	#$00,CollFlag1-VL(a5,d7)
	
	Bclr	#7,DireFlag-VL(a5,d7)
	
	Move.w	#16,d4
	Move.w	#15,d5
	Moveq	#0,d3
	Bsr	DoCollDet
	Move.w	#-1,d4
	Move.w	#15,d5
	Move.w	#1,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#16,d5
	Move.w	#2,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#15,d5
	Move.w	#3,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#14,d5
	Move.w	#4,d3
	Bsr	DoCollDet
	Move.w	#15,d4
	Move.w	#18,d5
	Move.w	#5,d3	
	Bsr	DoCollDet
	Move.w	#0,d4
	Move.w	#18,d5
	Move.w	#6,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#16,d5
	Move.w	#2,d3
	Bsr	DoCollDet
	Move.w	#12,d4
	Move.w	#16,d5
	Move.w	#2,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#8,d5
	Move.w	#7,d3
	Bsr	DoCollDetNUP
	Rts
		
NastyCollDet1	Lea	VL(pc),a5
	Moveq	#0,d7
	Move.w	CharConNo-VL(a5),d7
	Lea	MapData(pc),a1
	
	Move.b	#$00,CollFlag-VL(a5,d7)
	Move.b	#$00,CollFlag1-VL(a5,d7)
	
	Bclr	#7,DireFlag-VL(a5,d7)
	
	Move.w	#7,d4
	Move.w	#15,d5
	Moveq	#0,d3
	Bsr	DoCollDet
	Move.w	#0,d4
	Move.w	#7,d5
	Moveq	#1,d3
	Bsr	DoCollDet
	Move.w	#7,d4
	Move.w	#0,d5
	Moveq	#2,d3
	Bsr	DoCollDet
	Move.w	#15,d4
	Move.w	#7,d5
	Moveq	#3,d3
	Bsr	DoCollDet
	Rts
		
DoBubbleCollDet	Lea	MapData(pc),a3
	Moveq	#0,d3
	Asr.w	#3,d0
	Asr.w	#3,d1
	Moveq	#0,d4
	Moveq	#40,d2
	Muls	d1,d2
	Move.w	d2,d4
	Add.w	d0,d4
	Asl.l	#1,d4
	Add.l	d4,a3
	Move.b	00(a3),d0
	Or.b	02(a3),d0
	Or.b	80(a3),d0
	Or.b	82(a3),d0
	Btst	#7,d0
	Beq	NoBubCollisA
	St	d3
NoBubCollisA	Btst	#6,d0
	Beq	NoBubCollisB
	St	d3
NoBubCollisB	Rts

DoCollDet	Move.w	BlokeXPos-VL(a5,d7),d0
	Move.w	BlokeYPos-VL(a5,d7),d1
	Add.w	d4,d0
	Add.w	d5,d1
	Move.l	a1,a0
	Asr.w	#3,d0
	Asr.w	#3,d1
	Moveq	#0,d4
	Move.l	#40,d2
	Muls	d1,d2
	Move.w	d2,d4
	Add.w	d0,d4
	Asl.l	#1,d4
	Add.l	d4,a0
	Move.b	(a0),d0
	Btst	#7,d0
	Beq	NoCollisA
	Bset	d3,CollFlag-VL(a5,d7)
NoCollisA	Btst	#6,d0
	Beq	NoCollisB
	Bset	d3,CollFlag1-VL(a5,d7)
NoCollisB	Rts


DoBubCollDet	Lea	MapData(pc),a1
	Asr.w	#3,d0
	Asr.w	#3,d1
	Moveq	#0,d4
	Move.l	#40,d2
	Muls	d1,d2
	Move.w	d2,d4
	Add.w	d0,d4
	Asl.l	#1,d4
	Moveq	#0,d0
	Move.b	(a1,d4),d0
	Asr.b	#3,d0
	Rts

DoCollDetNUP	Move.w	BlokeXPos-VL(a5,d7),d0
	Move.w	BlokeYPos-VL(a5,d7),d1
	Add.w	d4,d0
	Add.w	d5,d1
	Move.l	a1,a0
	Asr.w	#3,d0
	Asr.w	#3,d1
	Moveq	#0,d4
	Move.l	#40,d2
	Muls	d1,d2
	Move.w	d2,d4
	Add.w	d0,d4
	Add.l	d4,d4
	Move.b	0000(a0,d4),d0
	Or.b	-080(a0,d4),d0
	Sub.l	#80,a0
	Or.b	-080(a0,d4),d0
	Sub.l	#80,a0
	Or.b	-080(a0,d4),d0
	Sub.l	#80,a0
	Or.b	-080(a0,d4),d0
	Btst	#7,d0
	Beq	NoCollisA
	Bset	d3,CollFlag-VL(a5,d7)
NoCollisANUP	Btst	#6,d0
	Beq	NoCollisB
	Bset	d3,CollFlag1-VL(a5,d7)
NoCollisBNUP	Rts
	
TrackSticks	Bsr	TrackStickA
	Bsr	TrackStickB
	Rts
	
TrackStickA	Lea	VL(pc),a5
	Moveq	#0,d7
	Lea	HardWare+Joy1Dat,a0
	Moveq	#7,d4
	Bra	TestJoy
	
TrackStickB	Lea	VL(pc),a5
	Move.l	#CharConOffset,d7
	Lea	HardWare+Joy0Dat,a0
	Moveq	#6,d4

TestJoy	And.w	#%11000000,MoveFlag-VL(a5,d7)
	Move.w	(a0),d0          
	Btst	#1,d0            
	Beq	JoyLeft
	
GoRight	Bset	#0,MoveFlag-VL(a5,d7)
	Bset	#5,MoveFlag-VL(a5,d7)
	
JoyLeft	Btst	#9,d0            
	Beq	JoyDown

GoLeft	Bset	#1,MoveFlag-VL(a5,d7)
	Bset	#5,MoveFlag-VL(a5,d7)
	
JoyDown	Move.w	d0,d1            
	Lsr.w	#1,d1            
	Eor.w	d0,d1            
	Btst	#0,d1            
	Beq	JoyUp

GoDown	;Bset	#2,MoveFlag-VL(a5,d7)
	;Bset	#5,MoveFlag-VL(a5,d7)

JoyUp	Btst	#$8,d1           
	Beq	JoyFire

GoUp	Bset	#3,MoveFlag-VL(a5,d7)
	Bset	#5,MoveFlag-VL(a5,d7)

JoyFire	Btst	d4,$Bfe001
	Bne	ResetJoyFire

GoFire	Btst	#0,MouthFlag-VL(a5,d7)
	Bne	NoJoyFire
	Btst	#1,MouthFlag-VL(a5,d7)
	Bne	NoJoyFire
	Move.l	#$01000001,MouthFlag-VL(a5,d7)
	Bra	NoJoyFire
	
ResetJoyFire	;Bclr	#0,MouthFlag-VL(a5,d7)
	Bclr	#1,MouthFlag-VL(a5,d7)
	
NoJoyFire	Rts

GetKey	Lea	MoveFlag(pc),a5
	Move.b	#$50,$Bfee01
	Move.b	#$10,$Bfee01
	Moveq	#0,d0
	Move.b	$Bfec01,d0
	Ror.b	#1,d0
	Not.b	d0
	
GetK	Move.b	d0,d1	
	Bclr	#7,d0
	
	Cmpi.b	#$19,d0
	Bne	NoKeyRight

	Btst	#7,d1
	Beq	DRight
	Bclr	#0,(a5)
	Bra	NoKeyLeft

DRight	Bset	#0,(a5)
	Bra	NoKeyLeft
	
NoKeyRight	Cmpi.b	#$18,d0
	Bne	NoKeyLeft

	Btst	#7,d1
	Beq	DLeft
	Bclr	#1,(a5)
	Bra	NoKeyLeft
	
Dleft	Bset	#1,(a5)

NoKeyLeft	Cmpi.b	#$20,d0
	Bne	NoKeyDown

	;Bset	#2,(a5)
	Bra	NoKeyDown

NoKeyDown	Cmpi.b	#$10,d0
	Bne	NoKeyUp

	Btst	#7,d1
	Beq	DUp
	Bclr	#3,(a5)
	Bra	NoKeyUp
	
DUp	Bset	#3,(a5)

NoKeyUp	Cmpi.b	#$38,d0
	Bne	NoKeyFire
	
	Bset	#4,(a5)

NokeyFire	Move.b	(a5),d0
	And.b	#$0f,d0
	Cmpi.b	#0,d0
	Bne	Movement
	Bclr	#5,(a5)
	Bra	DoneKeys
Movement	Bset	#5,(a5)
DoneKeys	Rts
	
GetLevelVars	Lea	CharData1(pc),a0
	Moveq	#0,d0
	Move.w	LevelNo(pc),d0
	Muls	#220,d0
	Add.l	d0,a0
	Lea	NastyList(pc),a1
	Move.l	#(8*NastListSlot)-1,d7
CopyNastyLoop	Move.b	(a0)+,(a1)+
	Dbf	d7,CopyNastyLoop
	
	Lea	GoodyList(pc),a1
	Move.l	#(2*NastListSlot)-1,d7
CopyGoodyLoop	Move.b	(a0)+,(a1)+
	Dbf	d7,CopyGoodyLoop




;	Lea	NastyListStart(pc),a0
;	Lea	NastyList(pc),a1
;	Move.l	#(8*NastListSlot)-1,d7
;CopyNastyLoopX	Move.b	(a0)+,(a1)+
;	Dbf	d7,CopyNastyLoopX
;	



	Lea	LevelData1(pc),a0
	Moveq	#0,d0
	Move.w	LevelNo(pc),d0
	Muls	#2320,d0
	Add.l	d0,a0
	Lea	MapData(pc),a1
	Move.l	#2319,d7
CopyMapLoop	Move.b	(a0)+,(a1)+
	Dbf	d7,CopyMapLoop
	Rts

Level2Int	Movem.l	d0-d7/a0-a6,-(sp)
	Btst	#3,$Bfed01
	Beq	RetExc2

	Bsr	GetKey

RetExc2	Movem.l	(sp)+,d0-d7/a0-a6
	Move.w	#$8,$Dff09c
	Rte

Level3Int	Movem.l	d0-d7/a0-a6,-(sp)
	Move.w	$Dff01e,d0
	Btst	#5,d0
	Beq	RetExc3
	
RetExc3	Movem.l	(sp)+,d0-d7/a0-a6
	Move.w	#$20,$Dff09c
	Rte

BlitMap	Lea	HardWare,a6

	Lea	Piccy1,a0
	Lea	PiccyBack,a1
ClearMapLoop	Move.l	#0,(a0)+
	Cmp.l	a0,a1
	Bne	ClearMapLoop
	
	Move.w	#$83c0,$Dff096
	;Lea	DeadCopper(pc),a5
	;Move.l	a5,$Dff080
	Lea	MapData(pc),a5
	Lea	Piccy1,a4
	Move.w	#28,d7
DoYMap	Move.l	a4,a2
	Move.w	#39,d6
DoXMap	Lea	BloxGFX,a3
	Move.w	(a5)+,d5
	And.l	#$7ff,d5
	Moveq	#0,d4
	Move.w	d5,d4
	Move.l	#40,d3
	Divs	d3,d4
	Moveq	#0,d0
	Moveq	#0,d1
	Move.w	d4,d3
	Swap	d4
	Move.l	#1600,d2	
	Muls	d3,d2
	Add.w	d4,d2
	And.l	#$ffff,d2
	Add.l	d2,a3
	Move.l	a2,a1

	Bsr	DoMapBlit
		
NoBlox	Add.l	#1,a2
	Dbf	d6,DoXMap	
	
	Add.l	#1600,a4
	Dbf	d7,DoYMap
	
	Bsr	BlitterWait
	
	Move.l	#$ffffffff,Bltafwm(a6)	
	Lea	PiccyBack,a5
	Move.l	a5,Bltdpth(a6)	
	Move.w	#0,Bltdmod(a6)	
	Lea	Piccy1,a5
	Move.l	a5,Bltapth(a6)	
	Move.w	#0,Bltamod(a6)	
	Move.w	#$09f0,Bltcon0(a6)	
	Move.w	#$0000,Bltcon1(a6)	

	Move.w	#4,d7
Mapcopy	Bsr	Blitterwait
	Move.w	#232*64+20,BltSize(a6)
	Dbf	d7,MapCopy

	Bsr	Blitterwait
	Rts
	
CopyPiccy	Lea	Piccy,a5
	Move.l	a5,Bltdpth(a6)	
	Move.w	#0,Bltdmod(a6)	
	Lea	Piccy1,a5
	Move.l	a5,Bltapth(a6)	
	Move.w	#0,Bltamod(a6)	
	Move.w	#$09f0,Bltcon0(a6)	
	Move.w	#$0000,Bltcon1(a6)	

	Move.w	#4,d7
Mapcopy1	Bsr	Blitterwait
	Move.w	#232*64+20,BltSize(a6)
	Dbf	d7,MapCopy1

	Bsr	Blitterwait
	Rts
	
DoMapBlit	Lea	HardWare,a6
	
	Bsr	BlitterWait
	Bsr	BlitterWait
	Bsr	BlitterWait
	
	Move.w	#$ffff,Bltadat(a6)
	Move.l	#-1,Bltafwm(a6)
	Move.l	a1,Bltdpth(a6)	
	Move.l	a1,Bltcpth(a6)	
	Move.w	#36,Bltdmod(a6)	
	Move.w	#36,Bltcmod(a6)	
	Move.l	#000,Bltapth(a6)	
	Move.l	a3,Bltbpth(a6)	
	Move.w	#36,Bltamod(a6)	
	Move.w	#36,Bltbmod(a6)	
	Move.w	#$0000,Bltcon1(a6)	
	Move.l	a1,d0
	Move.l	a3,d1
	Btst	#0,d0
	Bne	Shift1
	Move.l	#$ff000000,Bltafwm(a6)
	Btst	#0,d1
	Beq	Shift2
Shift3	Move.w	#$8002,Bltcon1(a6)
	Add.l	#1600,a1
	Add.l	#1600,a3
	Move.l	a1,Bltdpth(a6)	
	Move.l	a1,Bltcpth(a6)	
	Move.l	a3,Bltbpth(a6)		
	
	Move.w	#$ffff,Bltadat(a6)
	Move.w	#$07ca,Bltcon0(a6)
	Move.w	#((8*5)+1)*64+2,Bltsize(a6)	
	Rts
Shift1	Move.l	#$00ff0000,Bltafwm(a6)
	Btst	#0,d1
	Bne	Shift2
	Move.w	#$8000,Bltcon1(a6)
Shift2	;Move.w	#$ffff,Bltadat(a6)
	Move.w	#$07ca,Bltcon0(a6)
	Move.w	#(8*5)*64+2,Bltsize(a6)	
Noblit	Rts

VBL	Move.l	$Dff004,d0
	And.l	#$1ff00,d0
	Cmp.l	#VBLTime,d0
	Bne	VBL
	Rts

RandomNumber	Movem.l	d1-d3/a0,-(sp)
	Lea	RandSeedPos(pc),a0
	Add.l	#4,(a0)
	Move.l	(a0),a0
	Move.l	(a0),d0
	Move.w	d0,d1
	Swap	d0
	Eor.w	d1,d0
	Move.l	TimeFrame(pc),d1
	Move.l	d1,d2
	Move.l	d1,d3
	Asr.l	#3,d2
	Asr.l	#6,d3
	Eor.b	d1,d0
	Eor.b	d2,d3
	Eor.b	d3,d0
	Add.b	d2,d0
	Movem.l	(sp)+,d1-d3/a0
	Rts

KillSystem	Move.w	#$ffff,d0
SysPause	Move.w	d0,$Dff182
	Dbf	d0,SysPause
	Move.l	$4,a6
	Moveq	#0,d0
	Lea	GFXLib(pc),a1
	Jsr	-552(a6)	_LVOOpenLibrary
	Lea	GFXBase(pc),a5
	Move.l	d0,(a5)
	Jsr	-132(a6)	_LVOForbid
	Jsr	-150(a6)	_LVOSuperState
	Lea	SYSStack(pc),a5
	Move.l	d0,00(a5)
	Move.w	$Dff01C,04(a5)
	Move.w	$Dff01E,06(a5)
	Move.w	$Dff002,08(a5)
	Move.w	$Dff010,10(a5)
	Bset	#1,$Bfe001
	Move.w	#%0111111111111111,$Dff096	
	Lea	NewCopper(pc),a5
	Move.l	a5,$Dff080
	Move.w	#0,$Dff088
	Move.w	#%1000011111000000,$Dff096
	Move.w	#$7fff,$Dff09a
	Move.w	#$7fff,$Dff09c
	;Lea	OldLevel2(pc),a0
	;Lea	Level2Int(pc),a1
	;Move.l	$68,(a0)
	;Move.l	a1,$68
	;Lea	OldLevel3(pc),a0
	;Lea	Level3Int(pc),a1
	;Move.l	$6c,(a0)
	;Move.l	a1,$6c
	Rts

ReturnSystem	Move.w	#$7fff,$Dff09a
	Move.w	#$7fff,$Dff09c
	;Move.l	OldLevel2,$68
	;Move.l	OldLevel3,$6c
	Move.w	IntEnSave(pc),d7
	Bset	#$F,d7
	Move.w	d7,$Dff09A
	Move.w	IntRqSave(pc),d7
	Bset	#$F,d7
	Move.w	d7,$Dff09C
	Move.w	DMASave(pc),d7
	Bset	#$F,d7
	Move.w	d7,$Dff096
	Move.w	#$F,$Dff096
	Move.w	ADKSave(pc),d7
	Bset	#$F,d7
	Move.w	d7,$Dff09E
	Move.l	GFXBase(pc),a0
	Move.l	$26(a0),$Dff080
	Move.l	$4,a6
	Jsr	-138(a6)	_LVOPermit
	Move.l	SYSStack(pc),d0		
	Jsr	-156(a6)	_LVOUserState
	Rts
	
; System Variables
	Cnop	8,8
	
OldLevel2	Dc.l	0
OldLevel3	Dc.l	0

GFXBase	Dc.l	0
SYSStack	Dc.l	0
IntEnSave	Dc.w	0
IntRqSave	Dc.w	0
DMASave	Dc.w	0
ADKSave	Dc.w	0
InitialSP	Dc.l	0
GFXLib	Dc.b	"graphics.library",0
	Even	

; Program Variables

VL	Dc.b	"Retro..."

Altern8	Dc.w	0
PiccyBase	Dc.l	0
PiccyBaseAlt	Dc.l	0
CopperBase	Dc.l	0
CopperBaseAlt	Dc.l	0

OldX	Dc.w	0
OldY	Dc.w	0
GoodyFrameCount	Dc.l	0
AllDeadFlag	Dc.w	0
ActivateFlag	Dc.w	0
LevelNo	Dc.w	0

CharConNo	Dc.w	0

MoveFlag	Dc.b	0	; 0
MoveFlag1	Dc.b	0	; 1
JumpFlag	Dc.b	0	; 2
JumpFlag1	Dc.b	0	; 3
CollFlag	Dc.b	0	; 4
CollFlag1	Dc.b	0	; 5
DireFlag	Dc.b	0	; 6
WalkFrame	Dc.b	0	; 7
WalkSpeed	Dc.b	4	; 8
WalkCounter	Dc.b	0	; 9
BlokeXPos	Dc.w	0	; 10
BlokeYPos	Dc.w	0	; 12
BlokeFrame	Dc.w	0	; 14
JumpFrames	Dc.w	39	; 15
JumpDown	Dc.w	19	; 18
DeadFlag	Dc.w	0	; 20
CharFrameDir	Dc.w	0	; 22
MouthFlag	Dc.w	0	; 24
MouthFrame	Dc.w	0	; 26
MouthSpeed	Dc.w	2	; 28
	
MoveFlagB	Dc.b	0
MoveFlag1B	Dc.b	0
JumpFlagB	Dc.b	0
JumpFlag1B	Dc.b	0
CollFlagB	Dc.b	0
CollFlag1B	Dc.b	0
DireFlagB	Dc.b	0
WalkFrameB	Dc.b	0
WalkSpeedB	Dc.b	4
WalkCounterB	Dc.b	0
BlokeXPosB	Dc.w	0
BlokeYPosB	Dc.w	0
BlokeFrameB	Dc.w	0
JumpFramesB	Dc.w	39
JumpDownB	Dc.w	19
DeadFlagB	Dc.w	0
CharFrameDirB	Dc.w	0
MouthFlagB	Dc.w	0
MouthFrameB	Dc.w	0
MouthSpeedB	Dc.w	4

MoveFlagN	Dc.b	0	; 0
MoveFlag1N	Dc.b	0	; 1
JumpFlagN	Dc.b	0	; 2
JumpFlag1N	Dc.b	0	; 3
CollFlagN	Dc.b	0	; 4
CollFlag1N	Dc.b	0	; 5
DireFlagN	Dc.b	0	; 6
WalkFrameN	Dc.b	0	; 7
WalkSpeedN	Dc.b	4	; 8
WalkCounterN	Dc.b	0	; 9
BlokeXPosN	Dc.w	0	; 10
BlokeYPosN	Dc.w	0	; 12
BlokeFrameN	Dc.w	0	; 14
JumpFramesN	Dc.w	39	; 16
JumpDownN	Dc.w	19	; 18
Null	Dc.w	0	; 20
CharFrameDirN	Dc.w	0	; 22
MouthFlagN	Dc.w	0	; 24
MouthFrameN	Dc.w	0	; 26
MouthSpeedN	Dc.w	1	; 28

RandSeedPos	Dc.l	$f80000
FallSpeed	Dc.w	2
BubblePtr	Dc.w	0
BubbleSpeed	Dc.w	4
BubbleRelease	Dc.w	4
BubbleTravel	Dc.w	20

MoveSpeed	Dc.w	0

BlokeScore	Dc.l	0

TimeFrame	Dc.l	0
;TimeSecs	Dc.b	0
;TimeMins	Dc.b	0
;TimeHour	Dc.b	0

FontAdd	Dc.l	0
FontChar	Dc.w	0
FontXPos	Dc.w	0
FontYPos	Dc.w	0

DiagVal	Dc.w	47
DiagReg	Dc.w	12
DiagX	Dc.w	0
		
ActObjectOffset	Dc.l	0

PixelTab	Dcb.l	16,0

JumpSpeed	Dc.w	-4,-3,-4,-3,-4,-3,-3,-3,-2,-3,-2,-2,-2,-1,-2,-1,-1,-1,0,-1,0,-1,0
	Dc.w	0,-1,0,0,1,0,1,0,1,1,1,1,1,2,1,2,1,2,2,2,2,2,3,2,3,3	
		
; NastyListVars,   0=Active, 1=Frame+Dir Flags, 2=FrameSpeed, 3=XPos, 4=YPos
; 5=(Byte0=LookFlags),(Byte1=LookCount), 6=MoveFlag, 7=JumpFlag,
; 8=WaitTillAngryAmount, 9=WaitTillBurst, 10=AngryCounter
; FrameDir Flags, 0&1=FrameNo, 2=Dir, 3=Bubble eg-
; (0=(b2=0-Right/1-Left))/(1=(b2=0-Green/1-Blue)), 4=DeadSpin

NastyListPtr	Dc.l	0

NastyListStart	Dc.w	1,$0,$0700,80,097,0,0,0,$200,$300,0
	Dc.w	1,$4,$0700,36,071,0,0,0,$200,$300,0
	Dc.w	5,$0,$0700,70,031,0,0,0,$200,$300,0
	Dc.w	5,$0,$0700,80,081,0,0,0,$200,$300,0
	Dc.w	1,$4,$0700,40,157,0,0,0,$200,$300,0
	Dc.w	1,$4,$0700,60,157,0,0,0,$200,$300,0
	Dc.w	5,$0,$0700,20,127,0,0,0,$200,$300,0
	Dc.w	5,$0,$0700,30,183,0,0,0,$200,$300,0
	Ds.w	8*NastListSlot

NastyList	Ds.w	32*22
	Dcb.w	16,0

GoodyList	Dc.w	$040a,$0,$0700,20,127,0,0,0,$200,$300,0
	Dc.w	$040a,$0,$0700,30,183,0,0,0,$200,$300,0
	
BubbleList	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dc.w	0001,$0,0303,0032,0,0
	Dcb.w	(16*6),0

EmptyBubble	Dc.w	0001,$57,0303,0032,0,0

	Dc.l	0,0,0,0,0,0,0
BlitterList0	Ds.l	7*64
	Dc.l	0,0,0,0,0,0,0
BlitterList1	Ds.l	7*64

BurstBubList	Dc.w	42,43,49,60,47,45,64,55
BurstListPt	Dc.l	0
BurstList	Dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

PointsList	Dc.w	0,10,20,30,40,50,60,70,80,90
	Dc.w	100,150,200,250,300,500,750
	Dc.w	1000,2000,3000,4000,5000,6000
	Dc.w	7000,8000,9000,10000,20000,30000
	Dc.w	40000,50000,60000,10000
	
GoodPointList	Dc.w	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,20,17,17,17,17
	Dc.w	10,10,17,10,10,10,10,10,10,10,10,10,10,10,13,17,17,17,10,10
	Dc.w	18,00,15,17,03,23,08,21,12,18,10,17,07,14,02,25,00,00,00,00
	Dc.w	20,20,10,10,24,19,18,13,18,17,12,11,17,17,17,19,00,00,00,00
	
EffectList	Dc.w	63,SpeedyBootFX-VL,26,FastBubRelFX-VL
	Dc.w	27,FasterBubbleFX-VL,28,LongerBubbleFX-VL
	Dc.w	-1,-1
	
SpeedyBootFX	Lea	VL(pc),a5
	Bset	#4,CharFrameDir-VL(a5)
	Rts	
FastBubRelFX	Lea	VL(pc),a5
	Bset	#2,CharFrameDir-VL(a5)
	Bset	#3,CharFrameDir-VL(a5)
	Rts	
FasterBubbleFX	Lea	VL(pc),a5
	Bset	#2,CharFrameDir-VL(a5)
	Rts	
LongerBubbleFX	Lea	VL(pc),a5
	Bset	#1,CharFrameDir-VL(a5)
	Rts	
	
O1	= (40*16*5)
O2	= (40*32*5)
O3	= (40*48*5)
	
SpriteAdTab	Dc.w	00,02,04,06,08,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
	Dc.w	00+O1,02+O1,04+O1,06+O1,08+O1,10+O1,12+O1,14+O1,16+O1,18+O1
	Dc.w	20+O1,22+O1,24+O1,26+O1,28+O1,30+O1,32+O1,34+O1,36+O1,38+O1
	Dc.w	00+O2,02+O2,04+O2,06+O2,08+O2,10+O2,12+O2,14+O2,16+O2,18+O2
	Dc.w	20+O2,22+O2,24+O2,26+O2,28+O2,30+O2,32+O2,34+O2,36+O2,38+O2
	Dc.w	00+O3,02+O3,04+O3,06+O3,08+O3,10+O3,12+O3,14+O3,16+O3,18+O3
	Dc.w	20+O3,22+O3,24+O3,26+O3,28+O3,30+O3,32+O3,34+O3,36+O3,38+O3
	

Newcopper	Dc.w	$0100,$200,$1f0,0,$0104,$000A
	Dc.w	$0092,$0030,$0094,$0092
	Dc.w	$008E,$3069,$0090,$36ab
	Dc.w	$120,0,$122,0,$142,0,$144,0,$146,0
	Dc.w	$102,$00aa
	Dc.w	$1fc,$3
	Dc.w	$0108,$a0,$010A,$a0
	Dc.w	$0001,$fffe
CopperBPLS1	Dc.w	$00E0
Pl0h	Dc.w	$0000
	Dc.w	$00E2
Pl0l	Dc.w	$0000
	Dc.w	$00E4
Pl1h	Dc.w	$0000
	Dc.w	$00E6
Pl1l	Dc.w	$0000
	Dc.w	$00E8
Pl2h	Dc.w	$0000
	Dc.w	$00Ea
Pl2l	Dc.w	$0000
	Dc.w	$00Ec
Pl3h	Dc.w	$0000
	Dc.w	$00Ee
Pl3l	Dc.w	$0000
	Dc.w	$00f0
Pl4h	Dc.w	$0000
	Dc.w	$00f2
Pl4l	Dc.w	$0000

	Dc.w	$0101,$fffe,$100,$5200

	Dc.w	$0180,$0000,$0182,$0fb7,$0184,$0f71,$0186,$0c61
	Dc.w	$0188,$0941,$018a,$0f00,$018c,$0b00,$018e,$0700
	Dc.w	$0190,$053f,$0192,$042c,$0194,$0318,$0196,$0215
	Dc.w	$0198,$0a0c,$019a,$0809,$019c,$0507,$019e,$0111
	Dc.w	$01a0,$0555,$01a2,$0fff,$01a4,$0ccc,$01a6,$0888
	Dc.w	$01a8,$0000,$01aa,$0ff1,$01ac,$0cc1,$01ae,$0991
	Dc.w	$01b0,$04ad,$01b2,$037a,$01b4,$0257,$01b6,$00c0
	Dc.w	$01b8,$00a0,$01ba,$0070,$01bc,$0050,$01be,$0e66
	
	Dc.w	$ffe1,$fffe
	Dc.w	$0001,$fffe
	Dc.w	$100,$200
	Dc.w	$009c,$00
	Dc.w	$ffff,$fffe

NewcopperX	Dc.w	$0100,$200,$1f0,0,$0104,$000A
	Dc.w	$0092,$0030,$0094,$0092
	Dc.w	$008E,$3069,$0090,$36ab
	Dc.w	$120,0,$122,0,$142,0,$144,0,$146,0
	Dc.w	$102,$00aa
	Dc.w	$1fc,$03
	Dc.w	$0108,$a0,$010A,$a0
	Dc.w	$0001,$fffe
CopperBPLS1X	Dc.w	$00E0
Pl0hX	Dc.w	$0000
	Dc.w	$00E2
Pl0lX	Dc.w	$0000
	Dc.w	$00E4
Pl1hX	Dc.w	$0000
	Dc.w	$00E6
Pl1lX	Dc.w	$0000
	Dc.w	$00E8
Pl2hX	Dc.w	$0000
	Dc.w	$00Ea
Pl2lX	Dc.w	$0000
	Dc.w	$00Ec
Pl3hX	Dc.w	$0000
	Dc.w	$00Ee
Pl3lX	Dc.w	$0000
	Dc.w	$00f0
Pl4hX	Dc.w	$0000
	Dc.w	$00f2
Pl4lX	Dc.w	$0000

	Dc.w	$0101,$fffe,$100,$5200

	Dc.w	$0180,$0000,$0182,$0fb7,$0184,$0f71,$0186,$0c61
	Dc.w	$0188,$0941,$018a,$0f00,$018c,$0b00,$018e,$0700
	Dc.w	$0190,$053f,$0192,$042c,$0194,$0318,$0196,$0215
	Dc.w	$0198,$0a0c,$019a,$0809,$019c,$0507,$019e,$0111
	Dc.w	$01a0,$0555,$01a2,$0fff,$01a4,$0ccc,$01a6,$0888
	Dc.w	$01a8,$0000,$01aa,$0ff1,$01ac,$0cc1,$01ae,$0991
	Dc.w	$01b0,$04ad,$01b2,$037a,$01b4,$0257,$01b6,$00c0
	Dc.w	$01b8,$00a0,$01ba,$0070,$01bc,$0050,$01be,$0e66

	Dc.w	$ffe1,$fffe
	Dc.w	$0001,$fffe
	Dc.w	$100,$200
	Dc.w	$009c,$00
	Dc.w	$ffff,$fffe

CopperScroll	Dc.w	$0100,$200,$1f0,0,$0104,$000A
	Dc.w	$0092,$0030,$0094,$0092
	Dc.w	$008E,$3069,$0090,$36ab
	Dc.w	$120,0,$122,0,$142,0,$144,0,$146,0
	Dc.w	$102,$00aa
	Dc.w	$1fc,$03
	Dc.w	$0108,$a0,$010A,$a0
	Dc.w	$0001,$fffe
CopperBPLS1S	Dc.w	$00E0
	Dc.w	$0000
	Dc.w	$00E2
	Dc.w	$0000
	Dc.w	$00E4
	Dc.w	$0000
	Dc.w	$00E6
	Dc.w	$0000
	Dc.w	$00E8
	Dc.w	$0000
	Dc.w	$00Ea
	Dc.w	$0000
	Dc.w	$00Ec
	Dc.w	$0000
	Dc.w	$00Ee
	Dc.w	$0000
	Dc.w	$00f0
	Dc.w	$0000
	Dc.w	$00f2
	Dc.w	$0000

	Dc.w	$0101,$fffe,$100,$5200

	Dc.w	$0180,$0000,$0182,$0fb7,$0184,$0f71,$0186,$0c61
	Dc.w	$0188,$0941,$018a,$0f00,$018c,$0b00,$018e,$0700
	Dc.w	$0190,$053f,$0192,$042c,$0194,$0318,$0196,$0215
	Dc.w	$0198,$0a0c,$019a,$0809,$019c,$0507,$019e,$0111
	Dc.w	$01a0,$0555,$01a2,$0fff,$01a4,$0ccc,$01a6,$0888
	Dc.w	$01a8,$0000,$01aa,$0ff1,$01ac,$0cc1,$01ae,$0991
	Dc.w	$01b0,$04ad,$01b2,$037a,$01b4,$0257,$01b6,$00c0
	Dc.w	$01b8,$00a0,$01ba,$0070,$01bc,$0050,$01be,$0e66

	Dc.w	$ffe1,$fffe
	Dc.w	$0001,$fffe
	Dc.w	$100,$200
	Dc.w	$009c,$00
	Dc.w	$ffff,$fffe

DeadCopper	Dc.w	$100,$200,$1f0,0,$ffff,$fffe

CopperShade	Dc.l	0

	IncDir	Df1:

MapData	Dcb.b	2320,0
	Dcb.w	160,$0800
	
DeadSineData	Incbin	SysData/DeadSine0.Dat
	Dc.w	0,0,0,0,0,0,0,0
LevelData1	Incbin	SysData/OrigLevel1.LevDAT
LevelData2	Incbin	SysData/OrigLevel2.LevDAT
LevelData3	Incbin	SysData/OrigLevel3.LevDAT
LevelData4	Incbin	SysData/OrigLevel4.LevDAT
LevelData5	Incbin	SysData/OrigLevel5.LevDAT
LevelData6	Incbin	SysData/OrigLevel6.LevDAT
LevelData7	Incbin	SysData/OrigLevel7.LevDAT
LevelData8	Incbin	SysData/OrigLevel8.LevDAT
CharData1	Incbin	SysData/OrigLevel1.CharDAT
CharData2	Incbin	SysData/OrigLevel2.CharDAT
CharData3	Incbin	SysData/OrigLevel3.CharDAT
CharData4	Incbin	SysData/OrigLevel4.CharDAT
CharData5	Incbin	SysData/OrigLevel5.CharDAT
CharData6	Incbin	SysData/OrigLevel6.CharDAT
CharData7	Incbin	SysData/OrigLevel7.CharDAT
CharData8	Incbin	SysData/OrigLevel8.CharDAT

***** Custom chipbase offset table *****

;General registers

Dmaconr	= $002
Vposr	= $004
Vhposr	= $006
Joy0dat	= $00A
Joy1dat	= $00C
Intenar	= $01C
Intereqr	= $01E
CopCon	= $02E

;Blitter registers

Bltcon0	= $040
Bltcon1	= $042
Bltafwm	= $044
Bltalwm	= $046
Bltcpth	= $048
Bltcptl	= $04A
Bltbpth	= $04C
Bltbptl	= $04E
Bltapth	= $050
Bltaptl	= $052
Bltdpth	= $054
Bltdptl	= $056
Bltsize	= $058
Bltcmod	= $060
Bltbmod	= $062
Bltamod	= $064
Bltdmod	= $066
Bltcdat	= $070
Bltbdat	= $072
Bltadat	= $074

;Copper registers

Cop1lc	= $080
Cop1lch	= $080
Cop1lcl	= $082
Cop2lc	= $084
Cop2lch	= $084
Cop2lcl	= $086
Copjmp1	= $088
Copjmp2	= $08A
Diwstrt	= $08E
Diwstop	= $090
Ddfstrt	= $092
Ddfstop	= $094
Dmacon	= $096
Intena	= $09A
Intreq	= $09C

;Audio registers

Adkcon	= $09E
Aud0lch	= $0A0
Aud0lcl	= $0A2
Aud0len	= $0A4
Aud0per	= $0A6
Aud0vol	= $0A8
Aud0dat	= $0AA
Aud1lch	= $0B0
Aud1lcl	= $0B2
Aud1len	= $0B4
Aud1per	= $0B6
Aud1vol	= $0B8
Aud1dat	= $0BA
Aud2lch	= $0C0
Aud2lcl	= $0C2
Aud2len	= $0C4
Aud2per	= $0C6
Aud2vol	= $0C8
Aud2dat	= $0CA
Aud3lch	= $0D0
Aud3lcl	= $0D2
Aud3len	= $0D4
Aud3per	= $0D6
Aud3vol	= $0D8
Aud3dat	= $0DA

Color00	= $180
Color01	= $182
Color02	= $184
Color03	= $186
Color04	= $188
Color05	= $18A
Color06	= $18C
Color07	= $18E
Color08	= $190
Color09	= $192
Color10	= $194
Color11	= $196
Color12	= $198
Color13	= $19A
Color14	= $19C
Color15	= $19E
Color16	= $1A0
Color17	= $1A2
Color18	= $1A4
Color19	= $1A6
Color20	= $1A8
Color21	= $1AA
Color22	= $1AC
Color23	= $1AE
Color24	= $1B0
Color25	= $1B2
Color26	= $1B4
Color27	= $1B6
Color28	= $1B8
Color29	= $1BA
Color30	= $1BC
Color31	= $1BE

Bpl1pth	= $0E0
Bpl1ptl	= $0E2
Bpl2pth	= $0E4
Bpl2ptl	= $0E6
Bpl3pth	= $0E8
Bpl3ptl	= $0EA
Bpl4pth	= $0EC
Bpl4ptl	= $0EE
Bpl5pth	= $0F0
Bpl5ptl	= $0F2
Bpl6pth	= $0F4
Bpl6ptl	= $0F6
Bplcon0	= $100
Bplcon1	= $102
Bplcon2	= $104
Bpl1mod	= $108
Bpl2mod	= $10A

HardWare	= $dff000


























