	SECTION	PELACON,code

	incdir "RAM:"

	include	custom.i
	include	dos_lib.i
	include	exec_lib.i
	include	Planet:include/Archie.i

Hardware	equ	$dff000
memneeded	equ	2+(200*42*10)+2+2000+40000
Syscop1		equ	$26
Syscop2		equ	$32
porta		equ	$bfe001
ICRA		equ	$bfed01
Leftmouse	equ	6

	lea	GraphicsName,a1
	move.l	_SysBase,a6
	moveq	#0,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,GraphicsBase
	lea	DOSName,a1
	moveq	#0,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,DOSBase

	move.l	#memneeded,d0
	moveq	#2,d1
	jsr	_LVOAllocMem(a6)
	tst.l	d0
	beq	MemError
	move.l	d0,MemBase

	move.l	#Hardware,a6

* ASSIGN MEMORY!

	lea	raster1,a0
	addq.l	#2,d0
	moveq	#9,d1

PlaceRasters:
	move.l	d0,(a0)+
	add.l	#200*42,d0
	dbf	d1,PlaceRasters
	move.l	d0,(a0)+
	addq.l	#2,d0
	move.l	d0,Coplist
	add.l	#2000,d0
	move.l	d0,Graphics

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

	move.l	#1005,d2
	move.l	#FileName,d1
	bsr	OpenFile
	beq	Sysout
	move.l	Graphics,d2
	bsr	ReadData
	bsr	CloseFile
	bra	Continuation

OpenFile:
	move.l	DOSBase,a6
	jsr	_LVOOpen(a6)
	move.l	d0,filehd
	rts
CloseFile:
	move.l	DOSBase,a6
	move.l	filehd,d1
	jsr	_LVOClose(a6)
	rts
WriteData:
	move.l	DOSBase,a6
	move.l	filehd,d1
	jsr	_LVOWrite(a6)
	rts
ReadData:
	move.l	DOSBase,a6
	move.l	filehd,d1
	move.l	#$ffffff,d3
	jsr	_LVORead(a6)
	rts

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

Continuation:
	move.l	#Hardware,a6

	move.l	Graphics,a0
	clr.l	Score
	move.l	#39999,d0
.crunch	move.b	(a0)+,d1
	beq.s	.dbf
	addq.l	#1,Score
	move.w	d1,color(a6)
.dbf	dbf	d0,.crunch

	bsr	TakeSystem
	bsr	WriteList

	move.w	#$7fff,intreq(a6)
	move.w	#$83c0,dmacon(a6)
	move.l	Coplist,cop1lc(a6)
	move.w	copjmp1(a6),d0
	bsr	vait
	move.w	#-1,bltafwm(a6)
	move.w	#-1,bltalwm(a6)

	bsr	ClearRasters
	bsr	vait
	
	move.l	#Anim4,PlaneAnimpt
	move.l	#ClearInfo1,Clearpt
	move.l	#ClearInfo2,Clearpt2
	move.l	#SSpriteData,Spritept
	move.l	#ExplodePath,DeadExplodept
	clr.l	ClearInfo1
	clr.l	Time
	move.l	#50*16,d0
	lea	SpriteData,a0
.loop	clr.b	(a0)+
	dbf	d0,.loop
	lea	BulletData,a0
	moveq	#39,d0
.loop2	clr.b	(a0)+
	dbf	d0,.loop2
	lea	ExplosionData,a0
	moveq	#119,d0
.loop3	clr.b	(a0)+
	dbf	d0,.loop3
	lea	ScoreData,a0
	moveq	#119,d0
.loop4	clr.b	(a0)+
	dbf	d0,.loop4
	lea	EnemyBulletData,a0
	moveq	#119,d0
.loop5	clr.b	(a0)+
	dbf	d0,.loop5
	lea	MissileData,a0
	moveq	#29,d0
.loop6	clr.b	(a0)+
	dbf	d0,.loop6
	move.w	#40,Ax
	move.w	#40,Ay
	move.l	#Anim8,Archiept
	move.b	pot0dat(a6),Oldpot
	clr.l	Score
	clr.b	timeout
	clr.b	finish

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

Mloop:
	move.b	Oldpot,d0
	move.b	pot0dat(a6),d1
	cmp.b	d0,d1
	bne	out
	move.b	d1,Oldpot
	btst.b	#4,intreqr+1(a6)
	beq	Mloop
	move.w	#$10,intreq(a6)

	bsr	ClearBits
	bsr	HomingMissileControl
	bsr	SpriteHandler
	bsr	JoystickRead
	bsr	ArchieControl
	bsr	BulletControl
	bsr	EnemyBulletControl
	bsr	ExplosionsAndStuff
	bsr	ArchieDead
	bsr	ShowScore
	bsr	Exceptions
	bsr	DoubleBuffer
	tst.b	timeout
	beq.s	.nodead
	subq.b	#1,timeout
	beq.s	out
.nodead	cmp.l	#500,Time
	bne	Mloop
	move.l	#SSpriteData,Spritept
	clr.l	Time

	bra	Mloop
out	bsr	FreeSystem
Sysout	move.l	_SysBase,a6
	move.l	MemBase,a1
	move.l	#memneeded,d0
	jsr	_LVOFreeMem(a6)

MemError:
	move.l	GraphicsBase,a1
	jsr	_LVOCloseLibrary(a6)
	move.l	DOSBase,a1
	jsr	_LVOCloseLibrary(a6)
	clr.l	d0
	rts

TakeSystem:
	move.w	intenar(a6),SystemInts
	move.w	dmaconr(a6),SystemDMA
	move.w	#$7fff,intena(a6)
	move.w	#$7fff,dmacon(a6)
	move.b	#%01111111,ICRA
	move.l	$68,Level2Vector
	move.l	$6c,Level3Vector
	rts

FreeSystem:
	move.l	Level2Vector,$68
	move.l	Level3Vector,$6c
	move.l	GraphicsBase,a1
	move.l	Syscop1(a1),Hardware+cop1lc
	move.l	Syscop2(a1),Hardware+cop2lc
	move.w	SystemInts,d0
	or.w	#$c000,d0
	move.w	d0,intena(a6)
	move.w	SystemDMA,d0
	or.w	#$8100,d0
	move.w	d0,dmacon(a6)
	move.b	#%10011011,ICRA
ret	rts

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

ClearRasters
	moveq	#9,d0
	move.l	raster1,d1
	bsr	vait
	clr.w	bltdmod(a6)
	clr.w	bltcon1(a6)
	move.w	#$0100,bltcon0(a6)
.loop	bsr	vait
	move.l	d1,bltdpt(a6)
	move.w	#$3215,bltsize(a6)
	add.l	#200*42,d1
	dbf	d0,.loop
	rts

vait	btst.b	#6,dmaconr(a6)
.loop	btst.b	#6,dmaconr(a6)
	bne.s	.loop
	rts

DoubleBuffer:
.DB	btst	#4,intreqr+1(a6)
	beq.s	.DB
	move.w	#$10,intreq(a6)
.DB2	moveq	#0,d0
	move.b	vhposr(a6),d0
	btst	#0,vposr+1(a6)
	beq.s	.all
	bset	#8,d0
.all	cmp.w	#20,d0
	blt.s	.DB2
	move.l	raster1,d0
	move.l	raster2,d1
	move.l	raster3,d2
	move.l	raster4,d3
	move.l	raster5,d4
	move.l	DISPrast1,raster1
	move.l	DISPrast2,raster2
	move.l	DISPrast3,raster3
	move.l	DISPrast4,raster4
	move.l	DISPrast5,raster5
	move.l	d0,DISPrast1
	move.l	d1,DISPrast2
	move.l	d2,DISPrast3
	move.l	d3,DISPrast4
	move.l	d4,DISPrast5
	lea	DISPrast1,a1
	move.l	Coplist,a0
	addq.l	#4,a0
	moveq	#9,d0
.loop	move.w	(a1)+,2(a0)
	addq.l	#4,a0
	dbf	d0,.loop
	move.l	Clearpt,d0
	move.l	Clearpt2,Clearpt
	move.l	d0,Clearpt2
	addq.l	#1,Time
	rts

Exceptions:
	moveq	#48,d6
	lea	SpriteData,a4
.loop	tst.l	_ATPXPos(a4)
	beq	.d
	cmp.l	#Anim7,_ATPAnimpt(a4)
	bne	.d
	move.w	#8,dester+10
	cmp.w	#250,_ATPXPos(a4)
	bgt	.d
	move.b	#$31,_ATPControl(a4)
	lea	dester+10,a0
	move.w	#120,(a0)
.d	add.l	#16,a4
	dbf	d6,.loop
	rts

HomingMissileControl:
	moveq	#3,d6
	moveq	#0,d0
	moveq	#0,d1
	lea	MissileData,a4
.loop	tst.l	_ATPXPos(a4)
	beq.s	.d
	move.w	_ATPXPos(a4),d2
	move.w	_ATPYPos(a4),d3
	bsr	SmartMissile
	move.w	_ATPXPos(a4),d0
	move.w	_ATPYPos(a4),d1
	move.w	4(a4),d2
	cmp.w	#7,d2
	beq.s	.yesup
	cmp.w	#1,d2
	bgt.s	.noup
.yesup	subq.w	#2,_ATPYPos(a4)
.noup	cmp.w	#3,d2
	blt.s	.nodown
	cmp.w	#5,d2
	bgt.s	.nodown
	addq.w	#2,_ATPYPos(a4)
.nodown	tst.w	d2
	beq.s	.norite
	cmp.w	#3,d2
	bgt.s	.norite
	addq.w	#2,_ATPXPos(a4)
.norite	cmp.w	#5,d2
	blt.s	.noleft
	subq.w	#2,_ATPXPos(a4)
.noleft	lea	Anim13,a0
	move.b	(a0,d2.w),d2
	bsr	BlitThing
	tst.l	d7
	beq	.d
	clr.l	(a4)
.d	addq.l	#6,a4
	dbf	d6,.loop
	clr.l	(a4)
	rts

SmartMissile:
	move.w	Ax,d0
	move.w	Ay,d1
	add.w	#200,d0
	add.w	#100,d1
	sub.w	d2,d0
	bmi.s	.xmin
	sub.w	d3,d1
	bmi.s	.ymin
	sub.w	d0,d1
	bmi.s	.OCTANT6
	bra.s	.OCTANT7
.xmin	sub.w	d3,d1
	bmi.s	.xymin
	neg.w	d0
	sub.w	d0,d1
	bmi.s	.OCTANT1
	bra.s	.OCTANT0
.ymin	neg.w	d1
	sub.w	d0,d1
	bmi.s	.OCTANT5
	bra.s	.OCTANT4
.xymin	neg.w	d0
	neg.w	d1
	sub.w	d0,d1
	bmi.s	.OCTANT2
	bra.s	.OCTANT3
.OCTANT0
	move.w	#4,4(a4)
	rts
.OCTANT1
	move.w	#5,4(a4)
	rts
.OCTANT2
	move.w	#6,4(a4)
	rts
.OCTANT3
	move.w	#7,4(a4)
	rts
.OCTANT4
	move.w	#0,4(a4)
	rts
.OCTANT5
	move.w	#1,4(a4)
	rts
.OCTANT6
	move.w	#2,4(a4)
	rts
.OCTANT7
	move.w	#3,4(a4)
	rts

EnemyBulletControl:
	lea	EnemyBulletData,a4
	move.w	Ax,d2
	move.w	Ay,d3
	move.w	d2,d4
	move.w	d3,d5
	add.w	#27,d4
	add.w	#13,d5
	moveq	#19,d6
.loop	tst.l	(a4)
	beq.s	.nocolaa
	move.w	_ATPXPos(a4),d0
	move.w	_ATPYPos(a4),d1
	sub.w	#202,d0
	sub.w	#102,d1
	cmp.w	d0,d2
	bgt.s	.nocol
	cmp.w	d0,d4
	blt.s	.nocol
	cmp.w	d1,d3
	bgt.s	.nocol
	cmp.w	d1,d5
	blt.s	.nocol
	move.b	#220,timeout
	move.b	#-1,finish
.nocol	moveq	#0,d0
	move.b	4(a4),d0
	ext.w	d0
	add.w	d0,_ATPXPos(a4)
	moveq	#0,d0
	move.b	5(a4),d0
	ext.w	d0
	add.w	d0,_ATPYPos(a4)
.nocolaa
	add.l	#6,a4
	dbf	d6,.loop

	move.l	Time,d0
	moveq	#15,d1
	divu	d1,d0
	clr.w	d0
	swap	d0
	tst.w	d0
	bne	ret
	lea	SpriteData,a4

	moveq	#48,d6
.loop2	tst.l	_ATPXPos(a4)
	beq	.d
	move.b	_ATPControl(a4),d7
	and.b	#$0f,d7
	cmp.b	#1,d7
	bne	.next
	lea	EnemyBulletData,a0
	moveq	#19,d0
.loopx	tst.l	_ATPXPos(a0)
	beq.s	.space
	addq.l	#6,a0
	dbf	d0,.loopx
	bra	.d
.space	move.w	_ATPXPos(a4),_ATPXPos(a0)
	move.w	_ATPYPos(a4),_ATPYPos(a0)
	move.b	_ATPControl(a4),d7
	moveq	#0,d5
	btst	#6,d7
	bne.s	.hix
	move.w	#$0200,d5
	bra.s	.ty
.hix	move.w	#$0400,d5
.ty	btst	#4,d7
	bne.s	.hiy
	or.w	#$0002,d5
	bra.s	.txn
.hiy	or.w	#$0004,d5
.txn	btst	#7,d7
	beq.s	.tyn
	ror.w	#4,d5
	ror.w	#4,d5
	neg.b	d5
	ror.w	#4,d5
	ror.w	#4,d5
.tyn	btst	#5,d7
	beq.s	.ad
	neg.b	d5
.ad	move.w	d5,4(a0)
	moveq	#0,d0
	move.l	_ATPAnimpt(a4),a1
	move.b	(a1),d0
	mulu	#20,d0
	lea	gfxcon,a3
	add.l	d0,a3
	move.w	_ATPXGunOffset(a3),d0
	add.w	d0,_ATPXPos(a0)
	move.w	_ATPYGunOffset(a3),d0
	add.w	d0,_ATPYPos(a0)
	bra	.d
.next	cmp.b	#2,d7
	bne	.d
	lea	MissileData,a0
	moveq	#3,d0
.loop3	tst.l	_ATPXPos(a0)
	beq.s	.space2
	addq.l	#6,a0
	dbf	d0,.loop3
	bra	.d
.space2	lea	gfxcon,a3
	moveq	#0,d0
	move.l	_ATPAnimpt(a4),a1
	move.b	(a1),d0
	mulu	#20,d0
	add.l	d0,a3
	move.w	_ATPXPos(a4),d0
	add.w	_ATPXGunOffset(a3),d0
	move.w	d0,_ATPXPos(a0)
	move.w	_ATPYPos(a4),d0
	add.w	_ATPYGunOffset(a3),d0
	move.w	d0,_ATPYPos(a0)
	clr.w	4(a0)
	bra	.d
.d	add.l	#16,a4
	dbf	d6,.loop2
	rts

ShowScore:
	lea	ASCIIScore,a0
	move.l	Score,d2
	move.l	#10000,d1
	divu	d1,d2
	swap	d2
	clr.w	d2
	swap	d2
	moveq	#10,d1
	divu	d1,d2
	move.b	d2,(a0)
	add.b	#16,(a0)+
	mulu	#10000,d2
	mulu	#10,d2
	move.l	Score,d0
	sub.l	d2,d0
	move.l	#10000,d1
	bsr	ASCCONV
	move.l	#1000,d1
	bsr	ASCCONV
	moveq	#100,d1
	bsr	ASCCONV
	moveq	#10,d1
	bsr	ASCCONV
	add.b	#16,d0
	move.b	d0,(a0)+
	clr.b	(a0)
	move.l	raster1,a0
	lea	ASCIIScore,a1
.loop	lea	Font,a2
	moveq	#0,d0
	move.b	(a1)+,d0
	lsl.w	#3,d0
	beq	ret
	add.l	d0,a2
	moveq	#7,d1
.loop2	move.b	(a2)+,(a0)
	add.l	#42,a0
	dbf	d1,.loop2
	sub.l	#8*42-1,a0
	bra.s	.loop

ASCCONV:
	divu	d1,d0
	add.b	#16,d0
	move.b	d0,(a0)+
	clr.w	d0
	swap	d0
	rts

ExplosionsAndStuff:
	lea	ExplosionData,a4
	lea	Anim11,a3
	moveq	#9,d6
.loop	tst.l	(a4)
	beq.s	.d
	move.w	_ATPXPos(a4),d0
	move.w	_ATPYPos(a4),d1
	move.w	4(a4),d4
	addq.w	#1,4(a4)
	moveq	#0,d2
	move.b	(a3,d4.w),d2
	bpl.s	.ok
	clr.l	(a4)
	bra.s	.d
.ok	bsr	BlitThing
.d	addq.l	#6,a4
	dbf	d6,.loop
	clr.l	(a4)

	lea	ScoreData,a4
	moveq	#9,d6
.loop2	tst.l	(a4)
	beq.s	.d2
	move.w	_ATPXPos(a4),d0
	move.w	_ATPYPos(a4),d1
	subq.w	#1,_ATPYPos(a4)
	move.b	4(a4),d2
	move.b	5(a4),d3
	subq.b	#1,4(a4)
	bpl.s	.norews
	clr.l	(a4)
.norews	moveq	#27,d2
	add.b	5(a4),d2
	bsr	BlitThing
.d2	addq.l	#6,a4
	dbf	d6,.loop2
	clr.l	(a4)

	lea	EnemyBulletData,a4
	moveq	#18,d6
.loop3	tst.l	(a4)
	beq.s	.d3
	move.w	_ATPXPos(a4),d0
	move.w	_ATPYPos(a4),d1
	moveq	#20,d2
	bsr	BlitThing
	tst.l	d7
	beq.s	.d3
	clr.l	(a4)
.d3	addq.l	#6,a4
	dbf	d6,.loop3
	clr.l	(a4)
	rts

BulletControl:
	moveq	#9,d5
	lea	BulletData,a4
.loop	moveq	#0,d0
	moveq	#0,d1
	tst.l	(a4)
	beq	.cont
	move.w	(a4),d0
	addq.w	#5,2(a4)
	move.w	2(a4),d1

	move.w	d0,d7
	move.w	d1,d6
	cmp.w	#200,d6
	bge	.next
	move.l	raster1,a0
	addq.w	#2,d7
	mulu	#42,d6
	add.l	d6,a0
	moveq	#8,d2
	divu	d2,d7
	moveq	#7,d2
	swap	d7
	sub.w	d7,d2
	clr.w	d7
	swap	d7
	add.l	d7,a0
	moveq	#4,d7
.loopy	btst	d2,(a0)
	bne.s	.hit
	add.l	#200*42,a0
	dbf	d7,.loopy
	bra.s	.next
.hit	move.w	(a4),d7
	add.w	#194,d7
	move.w	2(a4),d6
	add.w	#94,d6
	clr.l	(a4)
	lea	ExplosionData,a0
.loopa	tst.l	(a0)
	beq.s	.okspace
	add.l	#6,a0
	bra.s	.loopa
.okspace
	move.w	d7,_ATPXPos(a0)
	move.w	d6,_ATPYPos(a0)
	clr.w	4(a0)
	bsr	SoWhatDidIHit

.next	add.w	#200,d0
	add.w	#100,d1
	moveq	#19,d2
	bsr	BlitThing
	tst.l	d7
	beq.s	.cont
	clr.l	(a4)
.cont	addq.l	#4,a4
	dbf	d5,.loop
	rts

SoWhatDidIHit:
	movem.l	d0-d7/a0-a6,-(SP)

	add.w	#202,d0
	add.w	#100,d1
	lea	MissileData,a3
	moveq	#3,d7
.looper	tst.l	(a3)
	beq.s	.deee
	cmp.w	_ATPXPos(a3),d0
	blt.s	.deee
	cmp.w	_ATPYPos(a3),d1
	blt.s	.deee
	sub.w	#16,d0
	sub.w	#16,d1
	cmp.w	_ATPXPos(a3),d0
	bgt.s	.dee
	cmp.w	_ATPYPos(a3),d1
	bgt.s	.dee
	clr.l	(a3)
.dee	add.w	#16,d0
	add.w	#16,d1
.deee	addq.l	#6,a3
	dbf	d7,.looper

	lea	SpriteData,a3
	moveq	#48,d7
.loop	tst.l	(a3)
	beq	.next
	lea	gfxcon,a4
	move.l	_ATPAnimpt(a3),a0
	moveq	#0,d2
	move.b	(a0),d2
	mulu	#20,d2
	add.l	d2,a4
	move.w	_ATPLength(a4),d2
	move.w	_ATPHeight(a4),d3
	lsl.w	#3,d2
	move.w	_ATPXPos(a3),d4
	move.w	_ATPYPos(a3),d5
	cmp.w	d0,d4
	bgt	.next
	cmp.w	d1,d5
	bgt.s	.next
	add.w	d4,d2
	add.w	d5,d3
	cmp.w	d0,d2
	blt.s	.next
	cmp.w	d1,d3
	blt.s	.next
	subq.b	#1,_ATPHits(a3)
	bpl.s	.next
	move.b	#60,_ATPHits(a3)
	move.l	#Path7,_ATPPathpt(a3)
	clr.b	_ATPPathPos(a3)

	moveq	#0,d2
	move.w	_ATPScore(a4),d2
	beq	.next
	add.l	d2,Score
	cmp.w	#100,d2
	bne.s	.not100
	moveq	#0,d6
.not100	cmp.w	#250,d2
	bne.s	.not250
	moveq	#1,d6
.not250	cmp.w	#500,d2
	bne.s	.not500
	moveq	#2,d6
.not500	cmp.w	#750,d2
	bne.s	.not750
	moveq	#3,d6
.not750	cmp.w	#1000,d2
	bne.s	.not1
	moveq	#4,d6
.not1
	lea	ScoreData,a5
.loops	tst.l	(a5)
	beq.s	.spacer
	addq.l	#6,a5
	bra.s	.loops
.spacer	move.w	d0,_ATPXPos(a5)
	move.w	d1,_ATPYPos(a5)
	move.b	#40,4(a5)
	move.b	d6,5(a5)

.next	add.l	#16,a3
	dbf	d7,.loop

	movem.l	(SP)+,d0-d7/a0-a6
	rts

ArchieControl:
	tst.b	finish
	bne	ret
	bsr	ArchCol
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	move.w	Ax,d0
	move.w	Ay,d1
	add.w	#200,d0
	add.w	#100,d1
	move.l	Archiept,a0
	move.b	(a0)+,d2
	cmp.b	#-1,(a0)
	beq.s	.reset
	addq.l	#1,Archiept
.ret	bsr	BlitThing
	btst	#7,porta
	bne.s	.clrjlb
	tst.b	jlb
	bne	ret
	move.b	#-1,jlb
	moveq	#9,d0
	lea	BulletData,a0
.loop	tst.l	(a0)
	bne.s	.d
	subq.l	#8,Score
	bpl.s	.nomin
	clr.l	Score
.nomin	move.w	Ax,(a0)+
	move.w	Ay,(a0)
	addq.w	#8,(a0)
	rts
.d	addq.l	#4,a0
	dbf	d0,.loop
	rts
.reset	move.l	#Anim8,Archiept
	bra.s	.ret
.clrjlb	clr.b	jlb
	rts
ArchCol:
	moveq	#0,d1
	moveq	#7,d7
	lea	ColTestData,a0
.loop	move.w	Ax,d0
	add.w	(a0)+,d0
	move.w	Ay,d1
	add.w	(a0)+,d1
	move.l	raster1,a1
	mulu	#42,d1
	add.l	d1,a1
	moveq	#8,d2
	divu	d2,d0
	swap	d0
	moveq	#7,d2
	sub.w	d0,d2
	clr.w	d0
	swap	d0
	add.l	d0,a1
	moveq	#4,d6
.loop2	btst	d2,(a1)
	beq.s	.d
	move.b	#-1,finish
	move.b	#220,timeout
.d	add.l	#200*42,a1
	dbf	d6,.loop2
	dbf	d7,.loop
	rts

ArchieDead:
	tst.b	finish
	beq	ret
	lea	ExplosionData,a0
	moveq	#19,d0
.loop	tst.l	_ATPXPos(a0)
	beq.s	.space
	addq.l	#6,a0
	dbf	d0,.loop
	rts
.space	move.l	DeadExplodept,a1
	move.w	(a1)+,d0
	cmp.w	#1000,d0
	beq.s	.reset
	move.w	(a1)+,d1
	move.l	a1,DeadExplodept
	add.w	Ax,d0
	add.w	Ay,d1
	add.w	#200,d0
	add.w	#100,d1
	move.w	d0,_ATPXPos(a0)
	move.w	d1,_ATPYPos(a0)
	clr.w	4(a0)
	rts
.reset	move.l	#ExplodePath,DeadExplodept
	rts

JoystickRead:
	tst.b	finish
	bne	ret
	move.w	#$0100,d0
	move.w	#$0001,d1
	move.w	#$0002,d2
	move.w	#$0200,d3
	move.w	joy1dat(a6),d4
	and.w	d4,d0
	and.w	d4,d1
	and.w	d4,d2
	and.w	d4,d3
	lsl.w	#1,d0
	lsl.w	#1,d1
	eor.w	d2,d1
	eor.w	d3,d0

	tst.w	d0
	beq.s	.next
	subq.w	#3,Ay
.next	tst.w	d1
	beq.s	.next2
	addq.w	#3,Ay
.next2	tst.w	d2
	beq.s	.next3
	addq.w	#3,Ax
.next3	tst.w	d3
	beq.s	.next4
	subq.w	#3,Ax
.next4	
	tst.w	Ax
	bmi.s	.resx0
	cmp.w	#290,Ax
	bgt.s	.max290
.rret	cmp.w	#10,Ay
	blt.s	.resy0
	cmp.w	#182,Ay
	bgt.s	.may182
	rts
.resx0	clr.w	Ax
	bra.s	.rret
.resy0	move.w	#10,Ay
	rts
.max290	move.w	#290,Ax
	bra.s	.rret
.may182	move.w	#182,Ay
	rts

SpriteHandler:
	tst.b	finish
	bne	.next
	move.l	Spritept,a4
	tst.w	_ATPXPos(a4)
	bmi	.next
	move.l	Time,d0
	cmp.l	_ATPEntryTime(a4),d0
	bne	.next
	add.l	#12,Spritept
	lea	SpriteData,a0
.tryag	tst.w	_ATPXPos(a0)
	beq.s	.space
	add.l	#16,a0
	bra.s	.tryag
.space	move.w	_ATPXPos(a4),_ATPXPos(a0)
	move.w	_ATPYPos(a4),_ATPYPos(a0)
	moveq	#0,d0
	move.b	_ATPPathType(a4),d0
	lsl.w	#2,d0
	lea	Pathpts,a1
	add.l	d0,a1
	move.l	(a1),_ATPPathpt(a0)
	move.b	_ATPControl(a4),_ATPControl(a0)
	move.b	_ATPHits(a4),_ATPHits(a0)
	clr.b	_ATPPathPos(a0)
	clr.b	_ATPAnimPos(a0)
	moveq	#0,d0
	move.b	_ATPAnimType(a4),d0
	lsl.w	#2,d0
	lea	Animpts,a1
	add.l	d0,a1
	move.l	(a1),_ATPAnimpt(a0)
	bra	SpriteHandler

.next	moveq	#48,d5
	lea	SpriteData,a4
.loop2	tst.l	_ATPXPos(a4)
	bne	.yes
	add.l	#16,a4
	dbf	d5,.loop2
	bra	.next2
.yes	move.l	_ATPPathpt(a4),a0
	moveq	#0,d0
	moveq	#0,d1
	move.b	_ATPPathPos(a4),d0
	add.l	d0,a0
	move.b	(a0)+,d0
	cmp.b	#100,1(a0)
	beq	.resetP
	addq.b	#2,_ATPPathPos(a4)
.Pret	move.b	(a0)+,d1
	btst	#7,d0
	beq.s	.xpos
	or.w	#$ff00,d0
.xpos	btst	#7,d1
	beq.s	.ypos
	or.w	#$ff00,d1
.ypos	add.w	d0,_ATPXPos(a4)
	add.w	d1,_ATPYPos(a4)
	add.l	#16,a4
	dbf	d5,.loop2

.next2	moveq	#48,d5
	lea	SpriteData,a4
.loop	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	move.w	_ATPXPos(a4),d0
	bne.s	.do
	add.l	#16,a4
	dbf	d5,.loop
	rts
.do	move.w	_ATPYPos(a4),d1
	move.l	_ATPAnimpt(a4),a0
	moveq	#0,d3
	move.b	_ATPAnimPos(a4),d3
	add.l	d3,a0
	move.b	(a0)+,d2
	tst.b	(a0)
	bmi	.resetA
	addq.b	#1,_ATPAnimPos(a4)
.Aret	bsr	BlitThing
	tst.l	d7
	beq.s	.rvok
	cmp.b	#2,d7
	beq.s	.rvok
	clr.l	_ATPXPos(a4)
.rvok	add.l	#16,a4
	dbf	d5,.loop
	rts

.resetA	cmp.l	#Anim11,_ATPAnimpt(a4)
	bne.s	.con
	clr.l	(a4)
	bra.s	.rvok
.con	clr.b	_ATPAnimPos(a4)
	bra	.Aret
.resetP	clr.b	_ATPPathPos(a4)
	bra	.Pret

WriteList:
	move.l	Coplist,a0
	lea	raster1,a1
	move.w	#$1001,(a0)+
	move.w	#$ff00,(a0)+
	move.w	#bplpt,d1
	moveq	#9,d0
.loop	move.w	d1,(a0)+
	move.w	(a1)+,(a0)+
	addq.w	#2,d1
	dbf	d0,.loop
	move.w	#bplcon0,(a0)+
	move.w	#$5200,(a0)+
	move.w	#bplcon1,(a0)+
	clr.w	(a0)+
	move.w	#bpl1mod,(a0)+
	move.w	#2,(a0)+
	move.w	#bpl2mod,(a0)+
	move.w	#2,(a0)+
	move.w	#diwstrt,(a0)+
	move.w	#$2c81,(a0)+
	move.w	#diwstop,(a0)+
	move.w	#$2cc1,(a0)+
	move.w	#ddfstrt,(a0)+
	move.w	#$0038,(a0)+
	move.w	#ddfstop,(a0)+
	move.w	#$00d0,(a0)+

	move.w	#color,d1
	move.l	Graphics,a1
	moveq	#31,d0
.loop2	move.w	d1,(a0)+
	move.w	(a1)+,(a0)+
	addq.w	#2,d1
	dbf	d0,.loop2

	move.w	#$5001,d0
	move.w	#$ff00,d1
	move.w	#color,d2
	clr.w	d3
	moveq	#15,d4
.loop3	move.w	d0,(a0)+
	move.w	d1,(a0)+
	move.w	d2,(a0)+
	move.w	d3,(a0)+
	addq.w	#1,d3
	add.w	#$500,d0
	dbf	d4,.loop3
	moveq	#15,d4
	move.w	#$f,d3
.loop4	move.w	d0,(a0)+
	move.w	d1,(a0)+
	move.w	d2,(a0)+
	move.w	d3,(a0)+
	add.w	#$10,d3
	add.w	#$300,d0
	dbf	d4,.loop4
	moveq	#15,d4
	move.w	#$ff,d3
.loop5	move.w	d0,(a0)+
	move.w	d1,(a0)+
	move.w	d2,(a0)+
	move.w	d3,(a0)+
	add.w	#$100,d3
	add.w	#$200,d0
	dbf	d4,.loop5
	move.w	#color,(a0)+
	move.w	#$f,(a0)+
	move.w	#$f301,(a0)+
	move.w	#$ff00,(a0)+
	move.w	#bpl1mod,(a0)+
	move.w	#-124,(a0)+
	move.w	#bpl2mod,(a0)+
	move.w	#-124,(a0)+
	move.l	Graphics,a1
	move.w	#color+2,d4
	moveq	#30,d0
.loop7	move.w	d4,(a0)+
	addq.w	#2,d4
	move.w	(a1)+,d1
	lsr.w	#1,d1
	and.w	#$777,d1
	move.w	d1,(a0)+
	dbf	d0,.loop7
	move.w	#$ffe1,(a0)+
	move.w	#$fffe,(a0)+
	move.w	#$0001,d0
	move.w	#$ff00,d1
	move.w	#color,d2
	move.w	#$00f,d3
	moveq	#15,d4
.loop6	move.w	d0,(a0)+
	move.w	d1,(a0)+
	move.w	d2,(a0)+
	move.w	d3,(a0)+
	subq.w	#1,d3
	add.w	#$300,d0
	dbf	d4,.loop6
	move.w	#intreq,(a0)+
	move.w	#$8010,(a0)+

	move.w	#$ffff,(a0)+
	move.w	#$fffe,(a0)
	rts




ClearBits:
	move.l	Clearpt,a5
	move.l	Clearpt,a0
.CBR	move.l	(a0)+,d1
	beq	ret
	move.w	(a0)+,d2
	move.w	d2,d3
	and.w	#$003f,d3
	lsl.w	#1,d3
	moveq	#42,d4
	sub.w	d3,d4
	bsr	vait
	move.w	#$100,bltcon0(a6)
	clr.w	bltcon1(a6)
	move.w	d4,bltdmod(a6)
	moveq	#4,d0
.loop	bsr	vait
	move.l	d1,bltdpt(a6)
	move.w	d2,bltsize(a6)
	add.l	#200*42,d1
	dbf	d0,.loop
	bra	.CBR
	rts

BlitThing:
*d0 = X-pos
*d1 = Y-pos
*d2 = type of thing.

	clr.b	bltcol			;Clear collision detect.
	moveq	#0,d7			;Clear return value.
	lea	gfxcon,a1
	lea	gfxconcopy,a2
	mulu	#20,d2
	add.l	d2,a1			;Find Data Structure.
	moveq	#19,d3
.loopy	move.b	(a1,d3.w),(a2,d3.w)	;and copy it.
	dbf	d3,.loopy

	cmp.w	#520,d0			;Is Object Visible?
	bge	.NIVR			;No.
	cmp.w	#300,d1
	bge	.NIVB
	move.w	_ATPLength(a1),d2
	lsl.w	#3,d2			;Multiply by 8.
	add.w	d0,d2
	cmp.w	#200,d2
	blt	.NIVL
	move.w	_ATPHeight(a1),d3
	add.w	d1,d3
	cmp.w	#100,d3
	ble	.NIVT
	cmp.w	#520,d2
	bge	.CLIPR
	cmp.w	#200,d0
	blt	.CLIPL
	sub.w	#184,d0

.CLRET	move.w	_ATPHeight(a1),d2
	add.w	d1,d2
	cmp.w	#300,d2
	bge	.CLIPB
	cmp.w	#100,d1
	blt	.CLIPT
	sub.w	#100,d1

.CTRET	move.l	Graphics,d2
	moveq	#0,d3
	move.w	_ATPMOffset(a2),d3
	add.l	d3,d2
	move.l	Graphics,d3
	add.l	_ATPOffset(a2),d3
	move.l	raster1,a0
	subq.l	#2,a0
	mulu	#42,d1
	add.l	d1,a0
	moveq	#16,d1
	divu	d1,d0
	move.w	d0,d1
	lsl.w	#1,d1
	add.l	d1,a0
	swap	d0
	ror.w	#4,d0
	bsr	vait
	clr.w	bltalwm(a6)
	move.w	d0,bltcon1(a6)
	or.w	#$0fca,d0
	move.w	d0,bltcon0(a6)
	move.w	_ATPLength(a2),d0
	move.w	_ATPLength(a1),d4
	addq.w	#2,d0
	sub.w	d0,d4
	move.w	d4,bltamod(a6)
	move.w	_ATPLength(a1),d0
	mulu	#4,d0
	add.w	d4,d0
	move.w	d0,bltbmod(a6)
	moveq	#40,d0
	sub.w	_ATPLength(a2),d0
	move.w	d0,bltcmod(a6)
	move.w	d0,bltdmod(a6)
	moveq	#4,d0
	move.l	a0,(a5)+
	move.w	_ATPBltsize(a2),(a5)+
.loop	bsr	vait
	btst	#5,dmaconr(a6)
	beq.s	.cont
	move.b	#-1,bltcol
.cont	move.l	d2,bltapt(a6)
	move.l	d3,bltbpt(a6)
	move.l	a0,bltcpt(a6)
	move.l	a0,bltdpt(a6)
	move.w	_ATPBltsize(a2),bltsize(a6)
	add.l	#200*42,a0
	add.w	_ATPLength(a1),d3
	dbf	d0,.loop
	clr.l	(a5)
	bsr	vait
	move.w	#-1,bltalwm(a6)
	rts
.NIVT	moveq	#3,d7
	rts
.NIVB	moveq	#4,d7
	rts
.NIVL	moveq	#1,d7
	rts
.NIVR	moveq	#2,d7
	cmp.w	#600,d0
	blt	ret
	moveq	#5,d7
	rts
.CLIPT	moveq	#100,d3
	sub.w	d1,d3
	move.w	_ATPBltsize(a2),d4
	ror.w	#6,d4
	sub.w	d3,d4
	rol.w	#6,d4
	move.w	d4,_ATPBltsize(a2)
	sub.w	d3,_ATPHeight(a2)
	move.w	_ATPLength(a1),d4
	mulu	d3,d4
	add.w	d4,_ATPMOffset(a2)
	mulu	#5,d4
	add.l	d4,_ATPOffset(a2)
	moveq	#0,d1
	bra	.CTRET
.CLIPB	sub.w	#100,d1
	move.w	#200,d4
	sub.w	d1,d4
	move.w	d4,_ATPHeight(a2)
	move.w	_ATPBltsize(a2),d3
	and.w	#$003f,d3
	lsl.w	#6,d4
	or.w	d4,d3
	move.w	d3,_ATPBltsize(a2)
	bra	.CTRET
.CLIPL	move.w	#200,d3
	sub.w	d0,d3
	moveq	#16,d4
	divu	d4,d3
	sub.w	d3,_ATPBltsize(a2)
	lsl.w	#1,d3
	sub.w	d3,_ATPLength(a2)
	add.w	d3,_ATPOffset+2(a2)	;This may cause some problems!
	add.w	d3,_ATPMOffset(a2)
	swap	d3
	moveq	#16,d0
	sub.w	d3,d0
	bra	.CLRET
.CLIPR	move.l	#536,d3
	sub.w	d0,d3
	moveq	#16,d4
	divu	d4,d3
	swap	d3
	subq.w	#1,d3
	bmi	.r16
.r16r	swap	d3
	and.w	#$ffc0,_ATPBltsize(a2)
	addq.w	#1,d3
	or.w	d3,_ATPBltsize(a2)
	subq.w	#1,d3
	lsl.w	#1,d3
	move.w	d3,_ATPLength(a2)
	swap	d3
	moveq	#15,d4
	sub.w	d3,d4
	sub.w	#184,d0
	and.w	#$fff0,d0
	or.w	d4,d0
	bra	.CLRET
	rts
.r16	move.w	#15,d3
	bra	.r16r
	even

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

	SECTION	PELACON,data

GraphicsName	dc.b	"graphics.library",0
	even
DOSName		dc.b	"dos.library",0
	even
FileName	dc.b	"Planet:Graphics/Archie.DATA",0
	even
Font:	incbin	"Planet:Graphics/Digital.FONT"
	even
gfxcon:
	dc.l	64
	dc.w	4,16,$0403,0,0,0,0,1664
	dc.l	1984
	dc.w	16,52,$0d09,1,100,0,0,6144
	dc.l	6976
	dc.w	8,24,$0605,2,1000,-20,24,7936
	dc.l	8128
	dc.w	26,12,$030e,3,250,0,0,9688
	dc.l	10000
	dc.w	8,36,$0905,4,500,0,0,20080
	dc.l	11440
	dc.w	8,36,$0905,4,500,0,0,20368
	dc.l	12880
	dc.w	8,36,$0905,4,500,0,0,20656
	dc.l	14320
	dc.w	8,36,$0905,4,500,0,0,20944
	dc.l	15760
	dc.w	8,36,$0905,4,500,0,0,21232
	dc.l	17200
	dc.w	8,36,$0905,4,500,0,0,21520
	dc.l	18640
	dc.w	8,36,$0905,4,500,0,0,21808
	dc.l	22096
	dc.w	6,25,$0644,5,750,0,20,23596
	dc.l	22846
	dc.w	6,25,$0644,5,750,0,0,23746
	dc.l	23896
	dc.w	4,33,$0843,6,100,0,0,24556
	dc.l	24688
dester	dc.w	16,42,$0a89,7,1000,0,3,28048
	dc.l	384
	dc.w	4,16,$0403,0,0,0,0,1728
	dc.l	704
	dc.w	4,16,$0403,0,0,0,0,1792
	dc.l	1024
	dc.w	4,16,$0403,0,0,0,0,1856
	dc.l	1344
	dc.w	4,16,$0403,8,1000,0,0,1920
	dc.l	28720
	dc.w	2,8,$0202,9,0,0,0,28800
	dc.l	28816
	dc.w	2,6,$0182,10,0,0,0,28876
	dc.l	28888
	dc.w	2,16,$0402,11,0,0,0,29848
	dc.l	29048
	dc.w	2,16,$0402,11,0,0,0,29880
	dc.l	29208
	dc.w	2,16,$0402,11,0,0,0,29912
	dc.l	29368
	dc.w	2,16,$0402,11,0,0,0,29944
	dc.l	29528
	dc.w	2,16,$0402,11,0,0,0,29976
	dc.l	29688
	dc.w	2,16,$0402,11,0,0,0,30008
	dc.l	30040				;27
	dc.w	4,10,$0283,12,0,0,0,31040
	dc.l	30240
	dc.w	4,10,$0283,12,0,0,0,31080
	dc.l	30440
	dc.w	4,10,$0283,12,0,0,0,31120
	dc.l	30640
	dc.w	4,10,$0283,12,0,0,0,31160
	dc.l	30840
	dc.w	4,10,$0283,12,0,0,0,31200
	dc.l	31240				;Missile
	dc.w	2,16,$0402,13,100,0,0,32520
	dc.l	31400
	dc.w	2,16,$0402,13,100,0,0,32552
	dc.l	31560
	dc.w	2,16,$0402,13,100,0,0,32584
	dc.l	31720
	dc.w	2,16,$0402,13,100,0,0,32616
	dc.l	31880
	dc.w	2,16,$0402,13,100,0,0,32648
	dc.l	32040
	dc.w	2,16,$0402,13,100,0,0,32680
	dc.l	32200
	dc.w	2,16,$0402,13,100,0,0,32712
	dc.l	32360
	dc.w	2,16,$0402,13,100,0,0,32744

Animpts:
	dc.l	Anim0,Anim1,Anim2,Anim3,Anim4,Anim5,Anim6,Anim7,Anim8,Anim9,Anim10,Anim11,Anim12,Anim13
Pathpts:
	dc.l	Path0,Path1,Path2,Path3,Path4,Path5,Path6,Path7,Path8

Anim0	dc.b	1,-1
Anim1	dc.b	2,-1
Anim2	dc.b	3,-1
Anim3	dc.b	6,-1
Anim4	dc.b	6,6,6,6,7,7,7,7,8,8,8,8,7,7,7,7,9,9,9,9,10,10,10,10,4,4,4,4,5,5,5,5,-1
Anim5	dc.b	11,12,-1
Anim6	dc.b	13,-1
Anim7	dc.b	14,-1
Anim8	dc.b	0,15,16,17,18,17,16,15,-1
Anim9	dc.b	19,-1
Anim10	dc.b	20,-1
Anim11	dc.b	21,21,22,22,23,23,23,24,24,24,25,25,25,25,26,26,26,26,26,-1
Anim12	dc.b	38,-1
Anim13	dc.b	32,33,34,35,36,37,38,39,-1

Path0	dc.b	-1,0,100
Path1	dc.b	-2,0,100
Path2	dc.b	-3,0,100
Path3	dc.b	-4,0,100
Path4	dc.b	0,0,100
Path5	dc.b	-4,3,-4,3,-4,2,-4,1,-4,0,-4,0,-4,-1,-4,-2,-4,-3,-4,-3,-4,-3,-4,-3,-4,-2,-4,-1,-4,0,-4,0,-4,1,-4,2,-4,3,-4,3,100
Path6	dc.b	-3,-1,100
Path7	dc.b	0,8,100
Path8	dc.b	-8,0,100

	even

SSpriteData:
	dc.w	520,248
	dc.l	30
	dc.b	0,5,1,0
	dc.w	520,235
	dc.l	30
	dc.b	$c1,2,2,5
	dc.w	520,220
	dc.l	50
	dc.b	$c1,2,2,5
	dc.w	520,250
	dc.l	50
	dc.b	$c1,2,2,5
	dc.w	520,240
	dc.l	100
	dc.b	0,5,3,4
	dc.w	520,267
	dc.l	150
	dc.b	0,1,1,6
	dc.w	520,200
	dc.l	150
	dc.b	$d1,2,6,5
	dc.w	520,258
	dc.l	170
	dc.b	$e1,25,1,7
	dc.w	590,264
	dc.l	200
	dc.b	$02,10,0,1
	dc.w	520,288
	dc.l	200
	dc.b	0,20,0,2
	dc.w	520,140
	dc.l	220
	dc.b	0,5,5,4
	dc.w	520,200
	dc.l	300
	dc.b	0,5,5,4
	dc.w	560,230
	dc.l	300
	dc.b	0,5,5,4
	dc.w	520,248
	dc.l	320
	dc.b	0,5,1,0
	dc.w	-1

ColTestData:
	dc.w	4,4,10,4,16,4,22,4
	dc.w	4,10,10,10,16,10,22,10

ExplodePath:
	dc.w	-4,-4,20,5,-2,6,30,-2,6,6,10,-3,14,0,5,2,1000

	even

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

	SECTION	PELACON,BSS

Level2Vector	ds.l	1
Level3Vector	ds.l	1
SystemInts	ds.w	1
SystemDMA	ds.w	1
MemBase		ds.l	1
DOSBase		ds.l	1
GraphicsBase	ds.l	1
raster1		ds.l	1
raster2		ds.l	1
raster3		ds.l	1
raster4		ds.l	1
raster5		ds.l	1
DISPrast1	ds.l	1
DISPrast2	ds.l	1
DISPrast3	ds.l	1
DISPrast4	ds.l	1
DISPrast5	ds.l	1
clipboard	ds.l	1
Coplist		ds.l	1
Graphics	ds.l	1
ZERO		ds.l	2
SMARTRESTORE	ds.l	1
filehd		ds.l	1
Xposit		ds.l	1
Xposit2		ds.l	1
Xposit3		ds.l	1
PlaneAnimpt	ds.l	1
Clearpt		ds.l	1
Clearpt2	ds.l	1
Spritept	ds.l	1
Archiept	ds.l	1
Time		ds.l	1
DeadExplodept	ds.l	1
mx		ds.w	1
my		ds.w	1
Ax		ds.w	1
Ay		ds.w	1
Oldmousex	ds.w	1
Oldmousey	ds.w	1
PelaconX	ds.w	1
PelaconY	ds.w	1
Score		ds.l	1

gfxconcopy	ds.b	20
ClearInfo1	ds.b	6*150
ClearInfo2	ds.b	6*150
SpriteData	ds.b	20*50
BulletData	ds.b	40
ExplosionData	ds.b	120
ScoreData	ds.b	120
EnemyBulletData	ds.b	120
MissileData	ds.b	30
ASCIIScore	ds.b	8
Oldpot		ds.b	1
counter1	ds.b	1
screen		ds.b	1
EOD		ds.b	1
jlb		ds.b	1
bltcol		ds.b	1
finish		ds.b	1
timeout		ds.b	1

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

	end

