שתשת                                        
; This routine is a comlete mess! I was in a terribly hurry writing
; this one;-() Hopefully is works on your machine, I couldn't test this one
; on my new Amiga at all. Fucks up before jumping to it...


newusp=	$28f00
newssp=	$28e00


ylaraja=	0
alaraja=	281

cus=		$dff000
debug=		0
speed=		14
rows=		288
copper=		1
fra=		12
copperhigh=	282

Wblit:	macro
.wb\@:	btst	#14,$2(a6)
	bne.s	.wb\@
	endm

	ifeq	debug
	jmp	j
	org	$2ec00
j:	endc

	lea	$dff000,a6
	ifeq	debug

	bsr.w	memtest
	bsr.w	stackmove
	bsr.w	setupcopper
	bsr.w	setupinter
	moveq	#-1,d0
	move.l	d0,$44(a6)


	lea	$80000,a0
	moveq	#0,d0
	move.w	#($80000-$49000)/4/4-1,d7
.lp:	rept	4
	move.l	d0,-(a0)
	endr
	dbf	d7,.lp


	move.l	#base1,d0
	move.l	#base2,d1
	move.w	d0,cjmp1+6
	move.w	d1,cjmp2+6
	swap	d0
	swap	d1
	move.w	d0,cjmp1+2
	move.w	d1,cjmp2+2

	lea	sintab(pc),a0
	lea	sinend(pc),a1
	moveq	#64-1,d7
.slp:	move.w	(a0)+,(a1)+
	dbf	d7,.slp

	lea	cll(pc),a0
	lea	cll2(pc),a1
	move.l	#$01800000,d0
	moveq	#32-1,d7
.clp:	move.l	d0,(a0)+
	move.l	d0,(a1)+
	add.l	#$00020000,d0
	dbf	d7,.clp

	move.w	#0,init+2
	bsr.w	dotrue
	move.w	init+2,init

	moveq	#7,d4
	move.l	#$01000100,a3
	bsr.w	convert		even
	moveq	#14,d4
	move.l	#$00010001,a3
	bsr.w	convert		odd

;--------------------------
 	lea	pic1,a0
	lea	converted1,a1
	bsr.w	chunky
 	lea	pic2,a0
	lea	converted2,a1
	bsr.w	chunky
 	lea	pic3,a0
	lea	converted3,a1
	bsr.w	chunky
 	lea	pic4,a0
	lea	converted4,a1
	bsr.w	chunky
;--------------------------

	bsr.w	codebase

	lea	converted1,a0
	lea	palette1,a1
	lea	$50000,a2
	lea	overlof,a5
	bsr.w	codecolortab_single
	lea	$50000,a0
	lea	overlof,a1
	move.l	memplace,a2
	bsr.w	codecopperobjs_single

	lea	converted3,a0
	lea	palette3,a1
	lea	$60000,a2
	lea	overlof+$1100,a5
	bsr.w	codecolortab_single
	lea	$60000,a0
	lea	overlof+$1100,a1
	move.l	memplace,a2
	add.l	#$2000,a2
	bsr.w	codecopperobjs_single

	move.l	#copper1,$80(a6)
	endc

mainloop:
	ifeq	debug
	cmp.b	#$37,$dff006
	bne.s	mainloop
	tst.b	$dff005
	beq.s	mainloop
	endc

	moveq	#0,d0
	move.w	dista,d0
	divu	#10,d0
	move.w	d0,zadd

	bsr.w	clr		relief DMA!
	bsr.w	matrix
	bsr.w	calcrest

	bsr.w	setpointers
	bsr.w	setcolors
	moveq	#5,d2
	moveq	#6,d3
	move.l	#$2000,d4
	bsr.w	ReadScript

	and.w	#63*2,ypos

	bsr.w	Swaps
	tst.w	d7
	bne.s	.next

	btst	#6,$bfe001
	bne.w	mainloop

;-----------------------------------------
.next:	move.l	#empty,$dff080
	move.w	d0,$dff088

	move.l	#Script2,Script
	lea	waitp(pc),a0
	moveq	#0,d0
	rept	5
	move.l	d0,(a0)+
	endr
	move.w	#920,(a0)+
	move.w	#-20,(a0)+
	move.l	d0,memadd
	move.w	#6,hiword
	move.w	d0,rotation
	move.w	#1,rotation+2

	bsr.w	codecolortab_multi
	bsr.w	codecopperobjs_multi

mainloop2:
	ifeq	debug
	cmp.b	#$37,$dff006
	bne.s	mainloop2
	tst.b	$dff005
	beq.s	mainloop2
	endc

	moveq	#0,d0
	move.w	dista,d0
	divu	#10,d0
	move.w	d0,zadd

	bsr.w	clr		relief DMA!
	bsr.w	matrix
	bsr.w	calcrest

	bsr.w	setpointers
	bsr.w	setcolors
	moveq	#6,d2
	moveq	#6,d3
	moveq	#0,d4
	bsr.w	ReadScript
	tst.w	d7
	bne.s	quit

	and.w	#127*2,ypos

	bsr.w	Swaps

	btst	#10,$dff016
	bne.w	mainloop2


quit:	lea	$dff000,a6
	move.l	#empty,$80(a6)
	move.w	d0,$88(a6)
	lea	ctb(pc),a0
	moveq	#0,d0
	moveq	#4-1,d7
.mlp:	cmp.b	#$40,6(a6)
	bne.s	.mlp
.mlp2:	cmp.b	#$41,6(a6)
	bne.s	.mlp2
	move.w	(a0,d0.w),color
	addq.w	#2,d0
	dbf	d7,.mlp
	jsr	setoldinter
	jsr	setoldcop
	moveq	#0,d0
	rts


ctb:	dc.w	$111
	dc.w	$222
	dc.w	$333
	dc.w	$433
;------------------------------------------
interrupt:	btst	#5,$dff01f
		beq.s	interrupt
		move.w	#$20,$dff09c

		addq.w	#1,init+2

;		movem.l	d0-a6,-(sp)
;		movem.l	(sp)+,d0-a6
		rte


tt:		dc	0
startclip:	dc	0
endclip:	dc	0
hiword:		dc	5
memplace:	dc.l	$28000
memadd:		dc.l	$2000

;------------------------------------------
ReadScript:	tst.w	movetimey
		beq.s	..1
		subq.w	#1,movetimey
		move.w	movespeedy(pc),d1
		add.w	d1,yadd
..1
		tst.w	zoomtime
		beq.s	..2
		subq.w	#1,zoomtime
		move.w	zoomspeed(pc),d1
		add.w	d1,dista
..2
		move.w	scrollspeedx,d1
		add.w	d1,xpos
		move.w	scrollspeedy,d1
		add.w	d1,ypos

		and.w	#15,xpos

		tst.w	waitp
		beq.s	.go
		subq.w	#1,waitp
		bra.w	outt

.go:		move.l	Script,a0
		move.w	(a0)+,d0
		bge.s	.noend
		moveq	#1,d7
		rts

.noend:		cmp.w	#0,d0
		beq.s	.wait
		cmp.w	#1,d0
		beq.s	.zoom
		cmp.w	#2,d0
		beq.s	.scrolly
		cmp.w	#3,d0
		beq.s	.scrollx
		cmp.w	#4,d0
		beq.s	.movey
		cmp.w	#6,d0
		beq.s	.rotate
		moveq	#0,d7
		rts


.wait:		move.w	(a0)+,waitp
		move.l	a0,Script
		bra.s	outt

.zoom:		move.w	(a0)+,zoomspeed
		move.w	(a0)+,zoomtime
		move.l	a0,Script
		bra.s	outt

.movey:		move.w	(a0)+,movespeedy
		move.w	(a0)+,movetimey
		move.l	a0,Script
		bra.s	outt

.scrolly:	move.w	(a0)+,scrollspeedy
		move.l	a0,Script
		bra.s	outt

.scrollx:	move.w	(a0)+,scrollspeedx
		move.l	a0,Script
		bra.s	outt

.rotate:	move.w	(a0)+,rotation+2
		move.l	a0,Script
		bra.w	outt

outt:		cmp.w	#15,xpos	position checking!
		blt.s	.5
		move.w	#4,hiword
		bra.s	.out
.5		cmp.w	#128,rotation
		blt.s	..see1
		move.w	d3,hiword
		move.l	d4,memadd
		bra.s	.out
..see1		move.w	d2,hiword
		move.l	#0,memadd
.out:		moveq	#0,d7
		rts
;-------------------------------------------
;-------------------------------------------
waitp:		dc.w	0
scrollspeedx:	dc.w	0
scrollspeedy:	dc.w	0
movespeedy:	dc.w	0
movetimey:	dc.w	0
zoomtime:	dc.w	0
zoomspeed:	dc.w	0
xpos:		dc	0
ypos:		dc	0
zadd:		dc	0
dista:		dc	620
yadd:		dc	300

wait:		macro
		dc.w	0,\1		aika
		endm

zoom:		macro
		dc.w	1,\1,\2		nopeus, aika
		endm

scrolly:	macro
		dc.w	2,\1		nopeus
		endm

scrollx:	macro
		dc.w	3,\1		nopeus
		endm

movey:		macro
		dc.w	4,\1,\2		nopeus, aika
		endm

rotate:		macro
		dc.w	6,\1		nopeus
		endm


Script:		dc.l	Script1

Script1:	movey	-4,(300-140)/4
		rotate	1
		zoom	8,(2000-600)/8
		wait	326
		rotate	0
		scrollx	-1
		wait	75
		scrolly	2
		wait	30
		zoom	-8,(2000-950)/8
		rotate	-1
		wait	2*256-128
		movey	-4,(360)/4
		zoom	-8,(950-600)/8
		wait	50
		dc.w	-1

Script2:	movey	4,(20+140)/4
		rotate	1
		wait	62
		rotate	0
		wait	50
		rotate	1
		wait	100
		zoom	4,(2000-600)/4
		scrolly	2
		wait	256-160+64-4
		rotate	0
		zoom	-64,(2000-800)/64
		wait	65
		zoom	32,(3000-800)/32
		wait	(3000-800)/32
		zoom	-24,(3000-800)/24
		movey	-4,(300)/4
		wait	80
		dc.w	-1

;------------------------------------------
;------------------------------------------
Swaps:		cmp.b	#$36,6(a6)
		bne.s	Swaps
		tst.b	5(a6)
		beq.s	Swaps

		move.l	drawcopper,d0
		move.l	showcopper,drawcopper
		move.l	d0,showcopper
		move.l	d0,$80(a6)

		move.l	drawbase,d0
		move.l	showbase,drawbase
		move.l	d0,showbase
		rts
;------------------------------------------
;------------------------------------------
clr:		move.l	drawbase,a0
		add.l	#36,a0
		move.w	#$1fe,d0	no-op
		moveq	#copperhigh/4-1,d7

.lp:		move.w	d0,(a0)
		move.w	d0,1*40(a0)
		move.w	d0,2*40(a0)	don't jump to $180-data, when not
		move.w	d0,3*40(a0)	needed...
		lea	4*40(a0),a0
		dbf	d7,.lp
		rts
;------------------------------------------
;------------------------------------------
codebase:	lea	base1,a1
		move.l	a1,d1
		move.l	#$1bddfffe,d0
		move.w	#copperhigh-1,d7

.lp:		move.l	d0,(a1)+
		move.l	#$e20000+0*rows*44,(a1)+	p1low
		move.l	#$e60000+1*rows*44,(a1)+	p2low
		move.l	#$ea0000+2*rows*44,(a1)+	p3low
		move.l	#$ee0000+3*rows*44,(a1)+	p4low
		move.l	#$f20000+4*rows*44,(a1)+	p5low

		add.l	#10*4,d1
		move.w	#$82,(a1)+	low word of base1
		move.w	d1,(a1)+

		move.w	#$84,(a1)+
		move.w	#5,(a1)+	hi $180-data

		move.w	#$86,(a1)+
		move.w	#0,(a1)+	low $180-data

		move.w	#$8a,(a1)+
		move.w	#0,(a1)+	execute cop2

		add.l	#$01000000,d0
		dbf	d7,.lp
		move.l	#-2,(a1)+

;-------
		lea	cus,a6
		Wblit
		move.l	#$9f00000,$40(a6)
		move.l	#-1,$44(a6)
		move.l	#0,$64(a6)
		move.l	#base1,$50(a6)
		move.l	#base2,$54(a6)
		move.w	#copperhigh*64+20,$58(a6)

		lea	base2,a0
		move.l	a0,d0
		lea	26(a0),a0
		move.w	#copperhigh-1,d7	fix jump pointers...
.clp:		add.l	#10*4,d0
		move.w	d0,(a0)
		lea	40(a0),a0
		dbf	d7,.clp
		rts
;------------------------------------------
;------------------------------------------
codecolortab_single:
		move.l	#$880000,d1	execute copper1

		lea	cll(pc),a3
		moveq	#32-1,d7
.blank:		move.l	(a3)+,(a2)+
		dbf	d7,.blank
		move.l	d1,(a2)+	1st line is blank!

;--- in shift 0:
		move.l	a2,a4
		moveq	#32-1,d6
.lpy1:		lea	cll(pc),a3
		moveq	#32-1,d7
.lpx1:		move.l	(a3)+,d0
		move.b	(a0)+,d0
		move.w	(a1,d0.w),d0	color
		move.l	d0,(a2)+
		dbf	d7,.lpx1
		move.l	d1,(a2)+
		dbf	d6,.lpy1


		moveq	#30*4,d1
		move.l	a4,a3
		lea	2(a4),a1
		moveq	#15-1-1,d7		14 shift variations more
.slp2:		moveq	#32-1,d6
.lpy2:		move.w	d1,d0			source pointer
		moveq	#0,d2
		moveq	#32-1,d5
.lpx2:		move.w	(a3,d2.w),(a2)+
		move.w	(a1,d0.w),(a2)+
		addq.w	#4,d0
		addq.w	#4,d2
		and.w	#31*4,d0
		dbf	d5,.lpx2
		move.l	32*4(a3),(a2)+		$88
		lea	132(a1),a1
		dbf	d6,.lpy2
		dbf	d7,.slp2


		moveq	#32-1,d6
.lpy3:		move.w	d1,d0			source pointer
		moveq	#0,d2
		moveq	#32-1,d5
.lpx3:		move.w	(a3,d2.w),(a5)+		$180-$1be
		move.w	(a1,d0.w),(a5)+
		addq.w	#4,d0
		addq.w	#4,d2
		and.w	#31*4,d0
		dbf	d5,.lpx3
		move.l	32*4(a3),(a5)+		$88
		lea	132(a1),a1
		dbf	d6,.lpy3
		rts

;------------------------------------------
;------------------------------------------
codecopperobjs_single:
		add.l	#132,a0		blank line...

		moveq	#15-1,d7
.slp1:		moveq	#8-1,d6
.lp1a:		move.l	a0,d0
		moveq	#32-1,d5
.lp2a:		move.w	d0,(a2)+
		add.w	#132,d0
		dbf	d5,.lp2a
		dbf	d6,.lp1a
		move.l	d0,a0
		dbf	d7,.slp1


		moveq	#8-1,d6
.lp1b:		move.l	a1,d0
		moveq	#32-1,d5
.lp2b:		move.w	d0,(a2)+
		add.w	#132,d0
		dbf	d5,.lp2b
		dbf	d6,.lp1b
		rts
;------------------------------------------
;------------------------------------------
codecolortab_multi:
		lea	colortab,a1
		move.l	#$880000,d1	execute copper1

		lea	cll(pc),a0
		moveq	#32-1,d7
.plp:		move.l	(a0)+,(a1)+
		dbf	d7,.plp
		move.l	d1,(a1)+	1st line is blank!

		lea	objects(pc),a5
.loop:		tst.l	(a5)
		bmi.s	.out
		move.l	(a5)+,a2	source
		move.l	(a5),a3		palette

		moveq	#32-1,d6
.lpy:		lea	cll(pc),a0
		moveq	#32-1,d7
.lpx:		move.l	(a0)+,d0
		move.b	(a2)+,d0
		move.w	(a3,d0.w),d0	color
		move.l	d0,(a1)+
		dbf	d7,.lpx
		move.l	d1,(a1)+
		dbf	d6,.lpy
.nextobj:	addq.l	#4,a5
		bra.s	.loop
.out:		rts


objects:	dc.l	converted1,palette1
		dc.l	converted2,palette2
		dc.l	converted3,palette3
		dc.l	converted4,palette4
		dc.l	-1

cobtab2:	rept	3
		dc.l	converted1
		dc.l	converted2
		dc.l	converted3
		dc.l	converted4
		endr
		dc.l	-1

usedtab:	blk.l	16,-1
;------------------------------------------
;------------------------------------------
codecopperobjs_multi:
		lea	cobtab2(pc),a0
		move.l	memplace,a1		copobjs
.loop:		move.l	(a0)+,d0
		bmi.s	.out
		move.l	#132,d1
		cmp.l	#converted1,d0
		bne.s	.1
		add.l	#0,d1
.1		cmp.l	#converted2,d0
		bne.s	.2
		add.l	#0+32*132,d1
.2		cmp.l	#converted3,d0
		bne.s	.3
		add.l	#0+2*32*132,d1
.3		cmp.l	#converted4,d0
		bne.s	.4
		add.l	#0+3*32*132,d1
.4

.eob:		moveq	#32-1,d7
.lp:		move.w	d1,(a1)+
		add.w	#132,d1
		dbf	d7,.lp
		bra.s	.loop
.out:		rts
;------------------------------------------
;------------------------------------------
chunky:		moveq	#32*32/8-1,d7
.lp:		moveq	#8-1,d6
.lpb:		moveq	#0,d0
		btst	d6,(a0)
		beq.s	.1
		addq.w	#2,d0
.1		btst	d6,1*32*4(a0)
		beq.s	.2
		addq.w	#4,d0
.2		btst	d6,2*32*4(a0)
		beq.s	.3
		addq.w	#8,d0
.3		btst	d6,3*32*4(a0)
		beq.s	.4
		add.w	#16,d0
.4		btst	d6,4*32*4(a0)
		beq.s	.5
		add.w	#32,d0
.5		move.b	d0,(a1)+
		dbf	d6,.lpb
		addq.l	#1,a0
		dbf	d7,.lp
		rts
;------------------------------------------
;------------------------------------------
matrix:		lea	rotation,a0

		move.w	(a0)+,d0
		add.w	(a0),d0
		and.w	#255,d0
		move.w	d0,-(a0)
		add.w	d0,d0

		lea	SinTab(pc),a0
		lea	CosTab(pc),a1

		move.w	(a0,d0.w),d5		sin
		move.w	(a1,d0.w),d6		cos

;----------- Rotate points: ---------

		lea	head(pc),a1
		lea	zs,a2
		lea	headbuffer,a3
		move.w	#156/fra+1-1,d7

.lp:		move.w	(a1)+,d1
		move.w	d1,d2

		muls	d5,d1
		add.l	d1,d1		sin*y
		swap	d1

		muls	d6,d2
		add.l	d2,d2		cos*y
		swap	d2

		move.w	d2,d3
		asr.w	#1,d3
		add.w	zadd,d3
		bgt.s	..1
		moveq	#1,d3
..1		cmp.w	#rows,d3
		blt.s	..2
		move.w	#rows-1,d3
..2		move.w	d3,(a2)+		z-coordinate

		add.w	dista,d2
		muls	d2,d1		perspective
		lsl.l	#6,d1
		swap	d1

		add.w	yadd,d1		centre
		move.w	d1,(a3)+
		dbf	d7,.lp
		rts
;------------------------------------------
;------------------------------------------
calcrest:	lea	headbuffer,a0
		lea	rotated,a1

		moveq	#156/fra-1,d7		valeja yksi vahemman!

.lp:		moveq	#-1,d4
		move.w	(a0)+,d0
		move.w	d0,d3		original coord
		sub.w	(a0),d0
		bgt.s	..1
		blt.s	..2
		moveq	#0,d4
		bra.s	..1
..2:		neg.w	d0
		moveq	#1,d4
..1
		moveq	#fra,d1
		moveq	#fra,d2		b
		moveq	#fra-1,d6

.lp2:		move.w	d3,(a1)+

		sub.w	d0,d2
		bge.s	.pos
.again:		add.w	d4,d3
		add.w	d1,d2
		bmi.s	.again

.pos:		dbf	d6,.lp2
		dbf	d7,.lp
		rts
;------------------------------------------
;------------------------------------------
setpointers:	movem.l	a2-a6,-(sp)

		move.l	drawbase,a0
		addq.l	#4,a0
		lea	zs,a3
		lea	rotated,a2

;---- clipping:
		moveq	#0,d4
		move.w	2*fra(a3),d0
		move.w	(a3),d1
		move.w	2*156-2(a2),d2
		move.w	(a2),d3
		cmp.w	d2,d3
		bge.s	..c1
		exg	d2,d3		d3 = suurempi y!
		exg	d0,d1
		moveq	#1,d4
..c1		cmp.w	#ylaraja,d3
		blt.w	.out
		cmp.w	#alaraja,d2
		bgt.w	.out		kokonaan ulkopuolella?
		cmp.w	#ylaraja,d2
		bge.s	..c2
		bsr.w	clip_yla
..c2:		cmp.w	#alaraja,d3
		ble.w	..c3
		bsr.w	clip_ala
..c3:
;---------
		move.w	d3,d7
		sub.w	d2,d7
		ble.w	.out
		subq.w	#1,d7		y size


		moveq	#0,d6
		moveq	#0,d5
		move.w	d3,d6
		move.w	d1,d5
		tst.w	d4
		beq.s	..cs
		move.w	d2,d6
		move.w	d0,d5
..cs		muls	#4*10,d6
		add.l	d6,a0		set pos in copperlist
		muls	#44,d5

		move.w	d3,startclip
		move.w	d2,endclip
		tst.w	d4
		beq.s	..cs2
		move.w	d2,startclip
		move.w	d3,endclip
..cs2

		moveq	#44,d4
		move.w	2*fra(a3),d0
		sub.w	(a3),d0		loppu-alku = dz
		bge.s	..1
		moveq	#-44,d4
		neg.w	d0
..1
		moveq	#40,d3
		move.w	2*156-2(a2),d1	
		sub.w	(a2),d1		loppu-alku = dy
		bge.s	..2
		moveq	#-40,d3
		neg.w	d1		mittasuhteet sailyvat clipattaessa!!!
..2

		move.l	#$00e20000,a2
		add.w	d5,a2
		move.l	a2,a3
		move.l	a2,a4
		move.l	a2,a5
		move.l	a2,a6
		add.l	#$00040000+1*44*rows,a3
		add.l	#$00080000+2*44*rows,a4
		add.l	#$000c0000+3*44*rows,a5
		add.l	#$00100000+4*44*rows,a6

;-----
.lp:		sub.w	d0,d2
		bge.s	.pos

.neg:		add.w	d4,a2		next/previous row in pic
		add.w	d4,a3
		add.w	d4,a4
		add.w	d4,a5
		add.w	d4,a6
		add.w	d1,d2
		bmi.s	.neg

.pos:		movem.l	a2-a6,(a0)
		add.l	d3,a0		next/previous row in copper
		dbf	d7,.lp
.out:
		movem.l	(sp)+,a2-a6
		rts
;------------------------------------------
clip_yla:	moveq	#0,d5
		moveq	#0,d6
		move.w	d3,d6
		sub.w	d2,d6		dy
		move.w	d1,d5
		sub.w	d0,d5		dz
		moveq	#ylaraja,d7
		sub.w	d2,d7		dy'

		muls	d5,d7
		divs	d6,d7

		moveq	#ylaraja,d2
		add.w	d7,d0
		rts
;------------------------------------------
clip_ala:	moveq	#0,d5
		moveq	#0,d6
		moveq	#0,d7
		move.w	d3,d6
		sub.w	d2,d6		dy
		move.w	d1,d5
		sub.w	d0,d5		dz
		move.w	d3,d7
		sub.w	#alaraja,d7	dy'

		muls	d5,d7
		divs	d6,d7

		move.w	#alaraja,d3
		sub.w	d7,d1
		rts
;------------------------------------------
;------------------------------------------
setcolors:	move.l	memplace,a0
		add.l	memadd(pc),a0
		moveq	#0,d0
		move.w	ypos(pc),d0
		add.l	d0,a0
		move.w	xpos(pc),d0
		mulu	#2*32*8,d0
		add.l	d0,a0

		lea	rotated,a1
		move.l	drawbase,a2
		add.l	#34,a2
		move.l	a2,a3		save...


		move.w	2*156-2(a1),d1
		sub.w	(a1),d1		loppu-alku > 0, normal order
		bge.w	normal


		moveq	#0,d6
		subq.w	#1,d6		counter
		move.w	startclip,d2
		lea	rotated,a1
.clp1		addq.w	#1,d6
		move.w	(a1)+,d3
		cmp.w	d3,d2
		beq.s	..1
		blt.s	.clp1
		tst.w	d6
		ble.s	..1
		subq.w	#1,d6
		subq.l	#2,a1
		move.w	d2,-2(a1)
..1		subq.l	#2,a1
		add.l	d6,a0
		add.l	d6,a0

		move.w	d6,d7
		subq.w	#1,d6
		move.w	endclip,d2
		lea	rotated+[2*156],a4
.clp2		addq.w	#1,d6
		move.w	-(a4),d3
		cmp.w	d3,d2
		beq.s	..2
		bgt.s	.clp2
		sub.w	d6,d7
		beq.s	..2
		subq.w	#1,d6
		addq.l	#2,a4
		move.w	d2,2(a4)
		addq.l	#2,a4
..2		bra.s	abnormal


normal:		moveq	#0,d6
		subq.w	#1,d6		counter
		move.w	startclip,d2
		lea	rotated,a1
.clp1		addq.w	#1,d6
		move.w	(a1)+,d3
		cmp.w	d3,d2
		beq.s	..1
		bgt.s	.clp1
		tst.w	d6
		ble.s	..1
		subq.w	#1,d6
		subq.l	#2,a1
		move.w	d2,-2(a1)
..1		subq.l	#2,a1
		add.l	d6,a0
		add.l	d6,a0

		move.w	d6,d7
		subq.w	#1,d6
		move.w	endclip,d2
		lea	rotated+[2*156],a4
.clp2		addq.w	#1,d6
		move.w	-(a4),d3
		cmp.w	d3,d2
		beq.s	..2
		blt.s	.clp2
		sub.w	d6,d7
		beq.s	..2
		subq.w	#1,d6
		addq.l	#2,a4
		move.w	d2,2(a4)
		addq.l	#2,a4
..2

abnormal:	moveq	#0,d0
		move.w	(a1),d0
		muls	#4*10,d0
		add.l	d0,a2		pos in coplist


		moveq	#0,d0
		moveq	#0,d1
;		lea	rotated,a4
		move.w	(a1),d0
		move.w	(a4),d1
		cmp.w	d1,d0
		beq.w	.out
		bgt.s	..1
		exg	d0,d1
..1:		move.w	d0,d2		d0=suurempi
		subq.w	#1,d0
		muls	#4*10,d0
		move.l	#$0000008a,(a3,d0.w)
		move.l	#$0000008a,1*40(a3,d0.w)
		move.l	#$0000008a,2*40(a3,d0.w)
		move.w	#5,-4(a3,d0.w)
		move.w	#5,40-4(a3,d0.w)
		move.w	#5,80-4(a3,d0.w)
		add.w	#$1c+1,d1
		add.w	#$1c,d2
		lsl.w	#8,d1
		lsl.w	#8,d2
		add.w	#$71,d1
		add.w	#$e1,d2
		move.l	drawcopper,a3
		lea	2*15(a3),a3
		move.w	d1,(a3)
		move.w	d2,4(a3)	screen limits...


		moveq	#0,d1
		move.w	#$008a,d2
		move.w	hiword,d3
		move.w	#156-1-1,d7
		sub.w	d6,d7
		ble.s	.out

.lp:		moveq	#0,d1
		move.w	2(a1),d1	2nd-1st
		sub.w	(a1)+,d1
		move.w	(a0)+,(a2)	color
		move.w	d2,2(a2)	$8a  ...execute...
		move.w	d3,-4(a2)
		ext.l	d1
		muls	#4*10,d1
		add.l	d1,a2
		dbf	d7,.lp
.out:		rts
;------------------------------------------
;------------------------------------------ PreC
dotrue:		lea	basic,a0
		moveq	#0,d0
		move.w	#32*11-1,d7
..lp1:		move.b	d0,(a0)+
		addq.b	#1,d0
		and.w	#31,d0
		dbf	d7,..lp1	do pic at smallest

		lea	speedtab,a0
		move.w	#-2*40,d0
		move.w	#rows+speed-1-1,d7
..lp3:		addq.w	#2,d0
		move.w	d0,(a0)+
		dbf	d7,..lp3	growth speed

;--------- CALC LINEAR ZOOM

		lea	speedtab+speed,a4
		move.l	#352,d3
		move.l	#basic+176,d4
		lea	chunkycol+176,a5
		move.l	#-352,d5
		move.w	#rows-1,d6	zoomed rows

.lp		add.l	d3,d5
		move.l	d4,a0
		lea	-1(a0),a2
		lea	(a5,d5.l),a1		destination
		move.l	a1,a3

		move.w	#176,d0		original
		move.w	d0,d1
		add.w	(a4)+,d1	now
		move.w	d1,d2		b

		moveq	#176/2-1,d7
.lp2:		sub.w	d0,d2
		bge.s	..1
.aga:		addq.l	#1,a0
		subq.l	#1,a2
		add.w	d1,d2
		bmi.s	.aga
..1:		move.b	(a0),(a1)+
		move.b	(a2),-(a3)

		sub.w	d0,d2
		bge.s	..2
		addq.l	#1,a0
		subq.l	#1,a2
		add.w	d1,d2
..2:		move.b	(a0),(a1)+
		move.b	(a2),-(a3)

		dbf	d7,.lp2
		dbf	d6,.lp
		rts
;------------------------------------------
convert:	move.l	d4,a4
		moveq	#0,d4

		moveq	#8-1,d6
.lp2:		lea	chunkycol,a0
		add.l	d4,a0
		lea	truecol,a1
		move.l	a4,d5
		subq.w	#2,a4
		move.l	a3,d1

		moveq	#5-1,d7		planes
.lp1:		tst.w	d5
		blt.s	.des
		move.l	d5,d0
		ror.l	#4,d0
		add.l	#$0dfc0002,d0
		moveq	#-8*2-2,d2
		moveq	#-4,d3
		bra.s	.asc

.des:		move.l	d5,d0
		neg.l	d0
		ror.l	#4,d0
		add.l	#$0dfc0000,d0
		moveq	#8*2-2,d2
		moveq	#0,d3

.asc:		Wblit
		move.l	d0,$40(a6)	descending
		move.l	d1,$44(a6)	mask
		move.w	d3,$62(a6)	mod b
		move.w	d2,$64(a6)	mod a
		move.w	d3,$66(a6)	mod c
		move.l	a1,$4c(a6)	b
		move.l	a0,$50(a6)	a
		move.l	a1,$54(a6)

		rept	6
		move.w	#1,$58(a6)
		Wblit
		endr
		move.w	#206*64+1,$58(a6)

		subq.l	#1,d5
		lsl.l	#1,d1
		add.l	#rows*44,a1	next plane
		dbf	d7,.lp1
		addq.l	#2,d4
		dbf	d6,.lp2
		rts
;------------------------------------------
;------------------------------------------
stackmove:	lea	newusp,a0
		move.l	(a7),(a0)
		move.l	4(a7),4(a0)
		move.l	a0,a7

		move.l	#sysp,$80.w
		trap	#0
		moveq	#0,d0
		rts

sysp:		lea	newssp,a0
		move.l	(a7),(a0)
		move.l	4(a7),4(a0)
		move.l	a0,a7
		rte
;------------------------------------------
memtest:	lea	memplace(pc),a1
		move.l	$4.w,a0
		move.l	$3e(a0),d0
		cmp.l	#$100000,d0
		bmi.s	.n1mbc
		move.l	#$b0000,(a1)
		bra.s	.oa
.n1mbc:		move.l	#`.Skl`,$c30000
		move.l	$c30000,d0
		cmp.l	#`.Skl`,d0
		bne.s	.nrf
		move.l	#$c30000,(a1)
		bra.s	.oa
.nrf:		move.l	#`.Skl`,$230000
		move.l	$230000,d0
		cmp.l	#`.Skl`,d0
		bne.w	.oa		;no extra mem... fuck!
		move.l	#$230000,(a1)
.oa:		rts
;------------------------------------------
setupcopper:	moveq	#0,d0
		lea	$120(a6),a0
		moveq	#24-1,d7
.lp:		move.l	d0,(a0)+
		dbf	d7,.lp

		move.w	$2(a6),dmacon
		move.w	#$7fff,$96(a6)
		move.w	#$87c0,$96(a6)
		rts
;------------------------------------------
setupinter:	move.l	$1c(a6),intena
		move.l	#$7fff7fff,$9a(a6)
		move.l	$6c,level3
		move.l	#interrupt,$6c
		move.w	#$c020,$9a(a6)
		rts
;------------------------------------------
setoldinter:	move.l	level3(pc),$6c
		move.l	intena(pc),d0
		or.l	#$80008000,d0
		move.l	d0,$9a(a6)
		rts
;------------------------------------------
setoldcop:	move.l	$4.w,a5
		move.l	156(a5),a4
		move.l	38(a4),$80(a6)
		move.w	#0,$2e(a6)
		move.w	dmacon(pc),d0
		or.w	#$8000,d0
		move.w	d0,$96(a6)
		rts
;------------------------------------------
init:		dc.l	0
dmacon:		dc	0
intena:		dc.l	0
level3:		dc.l	0
;------------------------------------------
empty:		dc.w	$100,$0200
		dc.w	$180
color:		dc.w	0
		dc.l	-2
;------------------------------------------
copper1:	dc	$108,0,$10a,0
		dc	$106,0,$1fc,0
		dc	$102,$aa
		dc	$120,0,$122,0
		dc	$8e,$1c71,$90,$3ce1
		dc	$92,$28,$94,$d0
		dc	$e0,7
		dc	$e4,7
		dc	$e8,7
		dc	$ec,7
		dc	$f0,7
		dc	$100,$5200

		dc	$80,4

cll:		blk.l	32,0


		ifne	copper
cjmp1:		dc	$84,0
		dc	$86,0
		dc	$8a,0
		else
		dc.l	-2
		endc
;------------------------------------
copper2:	dc	$108,0,$10a,0
		dc	$106,0,$1fc,0
		dc	$102,$aa
		dc	$120,0,$122,0
		dc	$8e,$1c71,$90,$3ce1
		dc	$92,$28,$94,$d0
		dc	$e0,7
		dc	$e4,7
		dc	$e8,7
		dc	$ec,7
		dc	$f0,7
		dc	$100,$5200
		dc	$80,4

cll2:		blk.l	32,0

		ifne	copper
cjmp2:		dc	$84,0
		dc	$86,0
		dc	$8a,0
		else
		dc.l	-2
		endc
;------------------------------------
SinTab:	dc.w	0,804,1608,2411,3212,4011,4808,5602
	dc.w	6393,7179,7962,8739,9512,10279,11039,11793
	dc.w	12540,13279,14010,14733,15446,16151,16846,17530
	dc.w	18204,18868,19519,20159,20787,21403,22005,22594
	dc.w	23170,23732,24279,24812,25329,25832,26319,26790
	dc.w	27245,27683,28105,28510,28898,29269,29621,29956
	dc.w	30273,30571,30852,31113,31356,31580,31785,31971
	dc.w	32137,32285,32412,32520,32609,32678,32727,32757
CosTab:	dc.w	32767,32757,32728,32678,32609,32521,32412,32285
	dc.w	32137,31971,31785,31580,31356,31113,30852,30571
	dc.w	30273,29956,29621,29268,28898,28510,28105,27683
	dc.w	27245,26790,26319,25832,25329,24811,24279,23731
	dc.w	23170,22594,22005,21403,20787,20159,19519,18868
	dc.w	18204,17530,16846,16151,15446,14732,14010,13279
	dc.w	12539,11793,11039,10278,9512,8739,7962,7179
	dc.w	6393,5602,4808,4011,3212,2411,1608,804
	dc.w	0,-803,-1607,-2409,-3211,-4010,-4807,-5601
	dc.w	-6391,-7178,-7961,-8738,-9511,-10277,-11038,-11792
	dc.w	-12538,-13277,-14009,-14731,-15445,-16150,-16845,-17529
	dc.w	-18203,-18866,-19518,-20158,-20786,-21401,-22004,-22593
	dc.w	-23169,-23730,-24278,-24810,-25328,-25831,-26318,-26789
	dc.w	-27244,-27682,-28104,-28509,-28897,-29267,-29620,-29955
	dc.w	-30272,-30570,-30851,-31112,-31355,-31579,-31784,-31970
	dc.w	-32136,-32284,-32411,-32520,-32608,-32677,-32727,-32756
	dc.w	-32766,-32756,-32727,-32677,-32608,-32520,-32411,-32284
	dc.w	-32136,-31970,-31784,-31579,-31355,-31112,-30851,-30570
	dc.w	-30272,-29955,-29620,-29267,-28897,-28509,-28104,-27682
	dc.w	-27244,-26789,-26318,-25831,-25328,-24810,-24278,-23730
	dc.w	-23169,-22593,-22004,-21401,-20786,-20158,-19518,-18866
	dc.w	-18203,-17529,-16845,-16150,-15445,-14731,-14009,-13277
	dc.w	-12538,-11792,-11038,-10277,-9511,-8738,-7961,-7178
	dc.w	-6391,-5601,-4807,-4010,-3211,-2409,-1607,-803
sinend:	blk.w	64,0

;-----------------------------------
head:
a	set	-156
	rept	156/fra+1
	dc.w	a
a	set	a+(2*fra)
	endr
;-----------------------------------
drawcopper:	dc.l	copper1
showcopper:	dc.l	copper2
drawbase:	dc.l	base1
showbase:	dc.l	base2
;-----------------------------------
pic1:		incbin	seka:src/tp/harlequin.kala
pic2:		incbin	seka:src/tp/harlequin.suke
pic3:		incbin	seka:src/tp/harlequin.huul
pic4:		incbin	seka:src/system/harlequin4.raw

palette1:
palette2:
palette3:	dc.w	$0000
		dc.w	$0aaa
		dc.w	$0630
		dc.w	$0960
		dc.w	$0c90
		dc.w	$0eb0
		dc.w	$0fd0
		dc.w	$0ff0
		dc.w	$0b80
		dc.w	$0046
		dc.w	$0069
		dc.w	$008b
		dc.w	$00ad
		dc.w	$00cf
		dc.w	$06ef
		dc.w	$0bff
		dc.w	$0fff
		dc.w	$0e52
		dc.w	$0b45
		dc.w	$0869
		dc.w	$0c41
		dc.w	$0a20
		dc.w	$0710
		dc.w	$0610
		dc.w	$0510
		dc.w	$0410
		dc.w	$0e87
		dc.w	$0faa
		dc.w	$0fcd
		dc.w	$0d66
		dc.w	$0eee
		dc.w	$0fff

palette4:	dc.w	$0000
		dc.w	$0fdf
		dc.w	$0ebf
		dc.w	$0c9e
		dc.w	$0b8d
		dc.w	$097c
		dc.w	$085b
		dc.w	$074a
		dc.w	$0538
		dc.w	$0437
		dc.w	$0326
		dc.w	$0215
		dc.w	$0114
		dc.w	$0103
		dc.w	$0002
		dc.w	$0c08
		dc.w	$0fec
		dc.w	$0eda
		dc.w	$0db9
		dc.w	$0ca7
		dc.w	$0b96
		dc.w	$0a85
		dc.w	$0974
		dc.w	$0863
		dc.w	$0852
		dc.w	$0742
		dc.w	$0631
		dc.w	$0521
		dc.w	$0420
		dc.w	$0310
		dc.w	$0c08
		dc.w	$0c08
e

		org	$40000
base1:		blk.b	14000,0
base2:		blk.b	14000,0
speedtab:	blk.w	rows+speed,0
truetab:	blk.b	352,0
converted1:	blk.b	32*32,0
converted2:	blk.b	32*32,0
converted3:	blk.b	32*32,0
converted4:	blk.b	32*32,0

		org	$49000
overlof:	blk.b	$4000,0

headbuffer	blk.w	2*(156/fra+1),0
zs:		blk.w	fra+1,0
rotated:	blk.w	156,0
basic:		blk.b	352,0
rotation:	dc.w	0,0
ee

		org	$50000
chunkycol:	blk.b	2,0

		org	$60000
colortab:	blk.b	51200,0

		org	$70000
truecol:	blk.b	$10000,0

