»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»										
»	DarkRoom -40k Intro					by Dweezil				
»										
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

rot		equ	213
zmp		equ	437
part2_flash	equ	215
part2_tm	equ	430

part3_tm	equ	400

w_blit		macro
.\@wb		btst	#6,$002(a6)
		bne.b	.\@wb
		endm

go		move.l	$4.w,a6
		moveq	#0,d0
		lea	gfxname_0(pc),a1
		jsr	-$228(a6)
		move.l	d0,gfxbase_0
		beq	exit_0
		move.l	d0,a6
		move.l  $22(a6),wbview_0
		sub.l	a1,a1
		jsr 	-$de(a6)
		jsr	-$10e(a6)
		jsr	-$10e(a6)
	;	jsr	-$1e8(a6)
		jsr	-$e4(a6)

		bsr	z_init

		lea	$dff000,a6
		move	#$0020,$096(a6)
		clr.l	$140(a6)

	;	move	#$4000,$09a(a6)

		move.l	#copper_0,$080(a6)
		bsr	clbss_0
		bsr	go_part_1

		move.l	#copper_0,$080(a6)
		bsr	clbss_0
		bsr	go_part_2

		move.l	#copper_0,$080(a6)
		bsr	clbss_0
		bsr	go_part_3

		move.l	#copper_0,$080(a6)
		bsr	clbss_0
		bsr	go_part_4
	
		bsr	z_end
		move	#$8020,$dff096

		move.l	gfxbase_0(pc),a6
		jsr	-$e4(a6)
	;	jsr	-$1ce(a6)

		move.l	wbview_0(pc),a1
		jsr	-$de(a6)
		jsr	-$10e(a6)
		jsr	-$10e(a6)
		move.l	$26(a6),$dff080
		move.l	a6,a1
		move.l	$4.w,a6
		jsr	-$19e(a6)

exit_0		moveq	#0,d0
		rts

»» Clear bss-hunk

clbss_0		moveq	#0,d0
		move.l	d0,d1
		move.l	d0,d2
		move.l	d0,d3
		move.l	d0,a0
		move.l	d0,a1
		move.l	d0,a2
		move.l	d0,a3

		lea	chip+chip_siz,a4
		move	#chip_siz>>8-1,d4
.clfast		rept	8
		movem.l	d0-d3/a0-a3,-(a4)
		endr
		dbf	d4,.clfast
		rts

gfxname_0	dc.b	"graphics.library",0
		even

gfxbase_0	dc.l	0
wbview_0	dc.l	0

;; <1>
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»										
»	" S o l a r  W i n d "							
»										
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

go_part_1	bsr	s_init_1
		sf	stuff_1

mouse_1		bsr	do_wind_1

		move.l	#scopa_1,$080(a6)
		bsr	plus_1

		bsr	do_wind_1

		move.l	#scopb_1,$080(a6)
		bsr	minus_1

		cmp	#zmp+170,frame_1
		bhs.b	.x	

		btst	#6,$bfe001
		bne.b	mouse_1

.x		rts

s_init_1	lea	sptra_1,a0
		move.l	#bpa1_1,d2
		lea	sptrb_1,a1
		move.l	#bpb1_1,d3
		moveq	#0,d1
		moveq	#3,d0
.1		move	d2,6(a0,d1.w)
		swap	d2
		move	d2,2(a0,d1.w)
		swap	d2	
		move	d3,6(a1,d1.w)
		swap	d3
		move	d3,2(a1,d1.w)
		swap	d3
		addq	#8,d1
		add.l	#10240,d2
		add.l	#10240,d3
		dbf	d0,.1

		lea	fractar_1,a0
		move	#$17f,d2
		move	#$181,d3
		bsr	do_prog_1

		lea	zoomaa_1,a0
		move	#-1,d2
		move	#$180,d3
		bsr	do_prog_1

		lea	rotate_1,a0
		move	#$180,d2
		move	#1,d3
		bsr	do_prog_1

		move.l	#scopa_1,$080(a6)

		rts

do_wind_1	addq	#1,frame_1
		moveq	#0,d0
		move	frame_1(pc),d0
		move.l	prgptr_1(pc),a0
		cmp.l	(a0),d0
		bne.b	.zop
		move.l	4(a0),d0
		move.l	d0,twist_1
		cmp.l	#zoomaa_1,d0
		bne.b	.2
		st	stuff_1
.2		addq.l	#8,prgptr_1
.zop
		bsr	do_pos_1
		bsr	do_tube_1
		bsr	do_blit_1
		bsr	do_bli2_1

		rts

frame_1		dc	0
twist_1		dc.l	hold_1
prgptr_1	dc.l	program_1

program_1	dc.l	1,fractar_1
		dc.l	rot,rotate_1
		dc.l	zmp,zoomaa_1
		dc.l	-1,-1


»» calculate blit prog

do_prog_1	move	d3,d6
		asl	#2,d3
		move	d2,d5
		asl	#2,d2
		add	d5,d2
		moveq	#8,d1
.l1		move	d2,d7
		moveq	#10,d0
.l2		move	d3,d4
		add	d7,d4
		move	d4,(a0)+
		sub	d5,d7
		dbf	d0,.l2
		sub	d6,d3
		dbf	d1,.l1
		rts

»» + laskuosuus		bpa -> bpb

plus_1		w_blit

		moveq	#0,d0
		move.l	d0,$040(a6)
		move.l	d0,$060(a6)
		move.l	d0,$064(a6)
		moveq	#-1,d0
		move.l	d0,$044(a6)

		move	#$0f80,$040(a6)		bpa2 and bpa3 and bpa4 -> t
		move.l	#bpa2_1,$050(a6)
		move.l	#bpa3_1,$04c(a6)
		move.l	#bpa4_1,$048(a6)
		move.l	#t_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#8,$062(a6)

		move	#$0fe6,$040(a6)		bpa1 + g -> bpb1
		move.l	#t_1,$050(a6)
		move.l	#g_1,$04c(a6)
		move.l	#bpa1_1,$048(a6)
		move.l	#bpb1_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#0,$062(a6)

		move	#$0f9a,$040(a6)		bpa2 + 1 -> bpb2
		move.l	#bpa1_1,$050(a6)
		move.l	#bpb1_1,$04c(a6)
		move.l	#bpa2_1,$048(a6)
		move.l	#bpb2_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#$0f9a,$040(a6)		bpa3 + 1 -> bpb3
		move.l	#bpa2_1,$050(a6)
		move.l	#bpb2_1,$04c(a6)
		move.l	#bpa3_1,$048(a6)
		move.l	#bpb3_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#$0f9a,$040(a6)		bpa4 + 1 -> bpb4
		move.l	#bpa3_1,$050(a6)
		move.l	#bpb3_1,$04c(a6)
		move.l	#bpa4_1,$048(a6)
		move.l	#bpb4_1,$054(a6)
		move	#$4014,$058(a6)

		rts


»» - laskuosuus		bpb -> bpa

minus_1		w_blit

		moveq	#0,d0
		move.l	d0,$040(a6)
		move.l	d0,$060(a6)
		move.l	d0,$064(a6)
		moveq	#-1,d0
		move.l	d0,$044(a6)

		move	#$0f01,$040(a6)		bpb2 and bpb3 and bpb4 -> t
		move.l	#bpb2_1,$050(a6)
		move.l	#bpb3_1,$04c(a6)
		move.l	#bpb4_1,$048(a6)
		move.l	#t_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#8,$062(a6)
		move	#$0f89,$040(a6)		bpb1 - g -> bpa1
		move.l	#t_1,$050(a6)
		move.l	#g_1,$04c(a6)
		move.l	#bpb1_1,$048(a6)
		move.l	#bpa1_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#0,$062(a6)
		move	#$0fa6,$040(a6)		bpb2 - 1 -> bpa2
		move.l	#bpb1_1,$050(a6)
		move.l	#bpa1_1,$04c(a6)
		move.l	#bpb2_1,$048(a6)
		move.l	#bpa2_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#$0fa6,$040(a6)		bpb2 - 1 -> bpa2
		move.l	#bpb2_1,$050(a6)
		move.l	#bpa2_1,$04c(a6)
		move.l	#bpb3_1,$048(a6)
		move.l	#bpa3_1,$054(a6)
		move	#$4014,$058(a6)

		w_blit

		move	#$0fa6,$040(a6)		bpb2 - 1 -> bpa2
		move.l	#bpb3_1,$050(a6)
		move.l	#bpa3_1,$04c(a6)
		move.l	#bpb4_1,$048(a6)
		move.l	#bpa4_1,$054(a6)
		move	#$4014,$058(a6)

		rts


»» put random stuff in the middle of the screen

do_tube_1	move.l	rand_1(pc),d0
		add	frame_1(pc),d0
	;	add.l	$004(a6),d0
		ror.l	#5,d0
		eor	#$1dc4,d0
		move.l	d0,rand_1

		lea	g_1,a0

		tst.b	stuff_1
		bne.b	.2

		moveq	#3,d1	
.1		eor.b	d0,126*48+19(a0)
		swap	d0
		eor.b	d0,126*48+20(a0)
		add	#48,a0
		add	a0,d0
		ror.l	#1,d0
		dbf	d1,.1
		rts

.2		moveq	#3,d1	
.3		clr.b	126*48+19(a0)
		clr.b	126*48+20(a0)
		add	#48,a0
		dbf	d1,.3
		rts

stuff_1		dc	0


»» do the twist!

do_pos_1	moveq	#$1f,d0
		and	frame_1(pc),d0
		add	d0,d0
		lea	.tab(pc),a0
		move	(a0,d0),d0
		move	d0,apos_1
		rts

.tab	dc	%00000,%10000,%01000,%11000,%00100,%10100,%01100,%11100
	dc	%00010,%10010,%01010,%11010,%00110,%10110,%01110,%11110
	dc	%00001,%10001,%01001,%11001,%00101,%10101,%01101,%11101
	dc	%00011,%10011,%01011,%11011,%00111,%10111,%01111,%11111

apos_1		dc	0

»» takaisinkopsublitti

do_bli2_1	move	apos_1(pc),d0
		muls	#24,d0
		move	apos_1(pc),d1
		asr	#4,d1
		add	d1,d0
		add	d0,d0
		ext.l	d0

		lea	t_1+$c0a,a0
		sub.l	d0,a0

		move	apos_1(pc),d1
		ror	#4,d1
		and	#$f000,d1
		or	#$09f0,d1

		w_blit

		move	d1,$040(a6)		t+logo -> g		
		move.l	#0,$044(a6)
		move.l	#$ffffffff,$044(a6)
		move.l	#$00000000,$060(a6)
		move.l	#$00000000,$064(a6)
		move.l	a0,$050(a6)
		move.l	#g_1,$054(a6)
		move	#$4018,$058(a6)

		rts

»» blitter driver for zoomer

do_blit_1	lea	g_1-$c08,a0
		lea	t_1,a4

		move	apos_1(pc),d5
		move	d5,d4
		muls	#384,d5
		add	d4,d5
		subq	#1,d5

		move	#$0803,d3		bltsize
		move.l	twist_1(pc),a1
		add	#$62c,a4		start pos.
		add	#$62c,a0

		move	#$62c,d7		'modulo'
		moveq	#8,d6			loop counter

		lea	$dff002,a6

.blit1		btst	#6,(a6)			
		bne.b	.blit1

		move	#$0000,$042-2(a6)	clear bltcon1
		move.l	#$ffffffff,$044-2(a6)	set masks
		move.l	#$002a002a,$064-2(a6)	set modulos for A & D

.loop2		moveq	#10,d4
.loop1		move	(a1)+,d0
		add	d5,d0
		moveq	#$f,d2
		and	d0,d2
		add	d2,d2
		move	.con0(pc,d2),d2
		asr	#3,d0
		lea	(a0,d0),a3
.blit2		btst	#6,(a6)
		bne.b	.blit2
		move	d2,$040-2(a6)		set bltcon0
		movem.l	a3/a4,$050-2(a6)	set bltaptr & bltdptr
		move	d3,$058-2(a6)		set size
		subq	#4,a0
		subq	#4,a4
		dbf	d4,.loop1
		add	d7,a0
		add	d7,a4
		dbf	d6,.loop2
		lea	$dff000,a6
		rts

.con0		dc	$f9f0,$e9f0,$d9f0,$c9f0,$b9f0,$a9f0,$99f0,$89f0
		dc	$79f0,$69f0,$59f0,$49f0,$39f0,$29f0,$19f0,$09f0

rand_1		dc.l	$deadbeef

;; <2>
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»															
»	" P a r t i c l e s "									
»										
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

go_part_2	lea	$dff000,a6

mouse_2		tst.b	5(a6)
		beq.b	mouse_2
.1		tst.b	5(a6)
		bne.b	.1

		bsr	laita2_2

		cmp	#part2_flash,frame_2
		bne.b	.rer
		bsr	laita1_2

.rer		movem.l	scr1_2(pc),d0-d3
		move.l	d0,d4
		move.l	d1,d0
		move.l	d2,d1
		move.l	d3,d2
		move.l	d4,d3
		movem.l	d0-d3,scr1_2

		move.l	d0,$0e0(a6)
		move.l	d1,$0e4(a6)
		move.l	d2,$0e8(a6)
		move.l	#bpl_tx_2,$0ec(a6)

		move	frame_2(pc),d0
		addq	#1,d0
		move	d0,frame_2

		move.l	parpt_2(pc),a0
		cmp	frame2_2(pc),d0
		bne.b	.3

		addq	#4,a0
		tst.b	1(a0)
		bpl.b	.2
		lea	param_2(pc),a0

.2		moveq	#0,d1
		move.b	(a0),d1
		add	d0,d1
		move	d1,frame2_2
		move.l	a0,parpt_2

.3		move.b	2(a0),d0
		move.b	3(a0),d1
	
		bsr	vaaka_2
		bsr	pysty_2

		move	frame_2(pc),d0

		cmp	#part2_tm+16,d0
		beq.b	.x

		cmp	#part2_tm,d0
		blo.b	.4
		bsr	fadeout_2
.4
		move.l	#copper_2,$080(a6)
		btst	#6,$bfe001
		bne	mouse_2

.x		rts

frame_2		dc	0
frame2_2	dc	1

parpt_2		dc.l	param_2

param_2		dc.b	1,$00,$05,$ff
		dc.b	1,$00,$02,$00
		dc.b	1,$00,$07,$ff
		dc.b	1,$00,$00,$00
		dc.b	1,$00,$01,$ff
		dc.b	1,$00,$06,$00
		dc.b	1,$00,$03,$ff
		dc.b	1,$00,$04,$00
		dc.l	-1

scr1_2		dc.l	bpl1_2
scr2_2		dc.l	bpl2_2
scr3_2		dc.l	bpl3_2
scr4_2		dc.l	bpl4_2

fadeout_2	lea	fadehere_2,a0
		moveq	#15,d3
.lo		addq	#2,a0
		move	(a0),d0
		move	d0,d1
		move	d0,d2

		and	#$000f,d0
		and	#$00f0,d1
		and	#$0f00,d2

		subq	#$0001,d0
		bpl.b	.1
		moveq	#0,d0
.1		sub	#$0010,d1
		bpl.b	.2
		moveq	#0,d1
.2		sub	#$0100,d2
		bpl.b	.3
		moveq	#0,d2
.3		or	d2,d0
		or	d1,d0
		move	d0,(a0)+

		dbf	d3,.lo				
		rts


laita1_2	move.l	scr2_2(pc),a0
		add	#112*40+18,a0
		moveq	#-1,d0
		moveq	#7,d1
.1		move.l	d0,(a0)
		move.l	d0,40(a0)
		move.l	d0,80(a0)
		move.l	d0,120(a0)
		add	#160,a0
		dbf	d1,.1
		rts

laita2_2
		move.l	scr2_2(pc),a0
		add	#112*40,a0
		lea	pic_2,a1
		lea	bpl_tx_2,a2
		add	#112*40,a2

		moveq	#31,d0
		and	frame_2(pc),d0
		mulu	#40,d0
		add	d0,a0
		add	d0,a1
		add	d0,a2

.1		rept	10
		move.l	(a1)+,d2
		or.l	d2,(a0)+
		move.l	d2,(a2)+
		endr
		rts

»» vaakasuuntainen siirto

v_bsiz_2	=	$0105

vaaka_2		move.l	scr1_2(pc),a0
		lea	temp_2,a1

		move	#255,d4
		moveq	#40,d2

		w_blit
		moveq	#0,d3
		move	d3,$042(a6)
		move.l	d3,$064(a6)
		moveq	#-1,d3
		move.l	d3,$044(a6)

.lp		move	d1,d3
		eor	d4,d3
		btst	d0,d3

		beq.b	.bit1
		w_blit
		move	#$19f0,$040(a6)
		movem.l	a0/a1,$050(a6)
		move	#v_bsiz_2,$058(a6)
		add	d2,a0
		add	d2,a1
		dbf	d4,.lp
		rts

.bit1		addq	#2,a0
		w_blit
		move	#$f9f0,$040(a6)
		movem.l	a0/a1,$050(a6)
		move	#v_bsiz_2,$058(a6)
		add	#38,a0
		add	d2,a1
		dbf	d4,.lp
		rts

»» pystypalkkien siirrot

pysty_2		lea	temp_2,a0
		lea	40(a0),a1
		sub	#40,a0
		move.l	scr2_2(pc),a2

		moveq	#-32,d2
		moveq	#19,d6

		w_blit
		move	#0,$042(a6)
		moveq	#38,d3
		move	d3,$062(a6)
		move	d3,$064(a6)
		move	d3,$066(a6)
		moveq	#-1,d3
		move.l	d3,$044(a6)

.ilo		moveq	#15,d5
.l1		move	d1,d3
		eor	d2,d3
		add	d4,d4
		btst	d0,d3
		bne.b	.l1z
		addq	#1,d4
.l1z		addq	#1,d2
		dbf	d5,.l1

		w_blit
		move	#$0dd8,$040(a6)
		movem.l	a0/a1/a2,$04c(a6)
		move	d4,$070(a6)
		move	#$4001,$058(a6)

		addq	#2,a0
		addq	#2,a1
		addq	#2,a2

		dbf	d6,.ilo
		rts

;; <3>
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»										
»	" F i r e F l i e s "							
»											
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

offs_3		=	$780

go_part_3	lea	$dff000,a6

		bsr	init_3
		bsr	dosine_3

mouse_3		tst.b	5(a6)
		beq.b	mouse_3
.1		tst.b	5(a6)
		bne.b	.1

		addq	#1,frame_3

		move	#$7fe,d1

		move.l	posse_3(pc),d2
		add.l	speed_3(pc),d2
		move.l	d2,posse_3
		swap	d2
		add.l	#$800,speed_3
		move	d2,d0
		and	d1,d0

		lea	sin_3,a0
		lea	cos_3-sin_3(a0),a1
		lea	coords_3(pc),a2
		move	(a0,d0),(a2)+
		move	(a1,d0),(a2)+

		lsr	#1,d2
		add	#offs_3,d2
		move	d2,d0
		and	d1,d0
		move	(a0,d0),(a2)+
		move	(a1,d0),(a2)+

		lsr	#1,d2
		add	#offs_3,d2
		move	d2,d0
		and	d1,d0
		move	(a0,d0),(a2)+
		move	(a1,d0),(a2)+

		lsr	#1,d2
		add	#offs_3,d2
		move	d2,d0
		and	d1,d0
		move	(a0,d0),(a2)+
		move	(a1,d0),(a2)+

		lsr	#1,d2
		add	#offs_3,d2
		move	d2,d0
		and	d1,d0
		move	(a0,d0),(a2)+
		move	(a1,d0),(a2)+

		movem.l	coords_3-2(pc),d0-d4
		lea	star_3+512-160,a0
		lea	(a0,d1),a1
		lea	(a0,d2),a2
		lea	(a0,d3),a3
		lea	(a0,d4),a4
		add	d0,a0
		bsr	vaaka_3

		movem.l	coords_3(pc),d0-d4
		lea	star_3+512-128,a0
		lea	(a0,d1),a1
		lea	(a0,d2),a2
		lea	(a0,d3),a3
		lea	(a0,d4),a4
		add	d0,a0
		bsr	pysty_3

		move.l	cop2_3(pc),$080(a6)

		lea	ptexg_3(pc),a0
		movem.l	(a0),d0-d3
		exg	d0,d1
		exg	d2,d3
		movem.l	d0-d3,(a0)

		cmp	#part3_tm,frame_3
		beq.b	.x

		btst	#6,$bfe001
		bne	mouse_3
.x		rts

speed_3		dc.l	$80000
frame_3		dc	0
posse_3		dc.l	0

ptexg_3
cop1_3		dc.l	copper1_3
cop2_3		dc.l	copper2_3
scrl1_3		dc.l	line1_3
scrl2_3		dc.l	line2_3

coords_3	dc	0,0
		dc	0,0
		dc	0,0
		dc	0,0
		dc	0,0

»» Calculate sin & cos lists using formula   sin a = a-a^3/3!+a^5/5!-a^7/7!
»» 11 bits are used in the calculations for precision

dosine_3	lea	sin_3,a0
		lea	1024(a0),a1
		moveq	#0,d4

		move	#255,d3
.l1		move.l	d4,d0
		swap	d0
		add.l	#823550,d4	Pi<<18
		move	d0,d2
		move	d0,d1
		mulu	d1,d1
		lsl.l	#4,d1
		swap	d1
		mulu	d1,d0
		divu	#3<<11,d0
		sub	d0,d2
		mulu	d1,d0
		divu	#10<<11,d0
		add	d0,d2
		mulu	d1,d0
		divu	#21<<11,d0
		sub	d0,d2
		asr	#4,d2

		move	d2,(a0)+
		move	d2,2046(a0)
		move	d2,-(a1)
		neg	d2
		move	d2,1022(a0)
		move	d2,1024(a1)

		dbf	d3,.l1
		rts

»»»»»»» inittialiohjelma »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

init_3		lea	l_even_3,a1		Muodostetaan 1/0 bittitasot
		lea	l_odd_3,a0
		moveq	#-1,d1
		moveq	#9,d0
.1		move.l	d1,(a0)+
		clr.l	(a1)+
		dbf	d0,.1

		lea	copst_3(pc),a0		kopsataan copperlistat
		move.l	cop1_3(pc),a1
		move.l	cop2_3(pc),a2
		moveq	#copstl_3>>2-1,d0
.c1		move.l	(a0),(a1)+
		move.l	(a0)+,(a2)+
		dbf	d0,.c1

		move.l	scrl1_3(pc),d0		laitetaan niihin bpl-pointterit
		move.l	cop1_3(pc),a0
		bsr	.cz
		move.l	scrl2_3(pc),d0
		move.l	cop2_3(pc),a0
		bsr	.cz

		bsr	inz_cl_3
		bsr	do_sqt_3

		rts	

»»

.cz		moveq	#4-1,d1			Asettaa bpl-pointterit copperlistaan
.cz1		move	d0,bploff_3+4(a0)
		swap	d0
		move	d0,bploff_3(a0)
		swap	d0
		addq	#8,a0
		add.l	#40,d0
		dbf	d1,.cz1
		rts

copst_3		dc	$008e,$2c81,$0090,$2cc1		Copperlistan alku
		dc	$0092,$0038,$0094,$00d0
		dc	$0100,$5000,$0102,$0000
		dc	$0104,$0000,$0180,$0000
		dc	$0108,$ffd8,$010a,$ffd8
bploff_3	=	*-copst_3+2
		dc	$00e0,$0000,$00e2,$0000
		dc	$00e4,$0000,$00e6,$0000
		dc	$00e8,$0000,$00ea,$0000
		dc	$00ec,$0000,$00ee,$0000
copstl_3	=	*-copst_3

»» varilistat yms. rakennetaan

inz_cl_3	lea	cmaps_3,a0
		lea	$1200(a0),a1
		lea	.ctab(pc),a3
		lea	cptab_3,a4

		moveq	#0,d4

		moveq	#$3f,d7
.1		move.l	a0,(a4)+

		move.l	#l_even_3,d1
		move	#$00f2,(a0)+
		move	d1,(a0)+
		move	#$00f0,(a0)+
		swap	d1
		move	d1,(a0)+

		move.l	#l_odd_3,d1
		move	#$00f2,(a1)+
		move	d1,(a1)+
		move	#$00f0,(a1)+
		swap	d1
		move	d1,(a1)+

		move	#$0180,d1

		move	#$01a0,d2
		moveq	#$f,d6
.2		and	#$7e,d4
		move	(a3,d4),d3
		addq	#8,d4
		move	d1,(a0)+
		move	d3,(a0)+
		move	d2,(a1)+
		move	d3,(a1)+
		addq	#2,d1	
		addq	#2,d2
		dbf	d6,.2
		addq	#2,d4

		dbf	d7,.1
		rts


.ctab	blk	24,0

	dc	$000,$001,$002,$003,$004,$005,$006,$007
	dc	$008,$009,$00a,$00b,$00c,$00d,$00e,$00f
	dc	$22f,$44f,$88f,$aaf,$ccf,$eef,$fff,$fff
	dc	$fff,$fff,$fff,$fff,$fff,$eef,$ccf,$aaf
	dc	$88f,$11e,$00c,$00a,$008,$006,$004,$002
	blk	32,0

	dc	$000,$001,$002,$003,$004,$005,$006,$007
	dc	$008,$009,$00a,$00b,$00c,$00d,$00e,$00f
	dc	$00e,$00d,$01c,$02b,$03a,$049,$058,$067
	dc	$076,$085,$094,$0a3,$0b2,$0c1,$0d0,$0e0
	dc	$0f0,$0e0,$0d0,$1c0,$2b0,$3a0,$490,$580
	dc	$670,$760,$850,$940,$a30,$b20,$c10,$d00
	dc	$e00,$f00,$e00,$d00,$c00,$b00,$a00,$900
	dc	$800,$700,$600,$500,$400,$300,$200,$100

»» muodostetaan taulukkoja

do_sqt_3	lea	star_3,a0
		lea	1024(a0),a1
		move	#511,d0
.1		moveq	#5,d2
		add	d0,d2
		move.l	#$100,d1
		divu	d2,d1	

		move.b	d1,(a0)+
		move.b	d1,-(a1)
		dbf	d0,.1
		rts

»» rakennetaan copperlista

pysty_3		move.l	#$2c01fffe,d1
		move.l	#$01000000,d2

		move.l	cop2_3(pc),a5
		add	#copstl_3,a5

		moveq	#$7f,d3

		w_blit

		move.l	#$09f00000,$040(a6)
		move.l	#$ffffffff,$044(a6)
		move.l	#$00000000,$064(a6)

.zoka		move.b	(a0)+,d0		Even line
		add.b	(a1)+,d0
		add.b	(a2)+,d0
		add.b	(a3)+,d0
		add.b	(a4)+,d0

		and	#$fc,d0
		move.l	cptab_3(pc,d0),d0

		move.l	d1,(a5)+
		add.l	d2,d1

		w_blit

		move.l	d0,$050(a6)
		move.l	a5,$054(a6)
		move	#$0109,$058(a6)
		add	#$48,a5

		move.b	(a0)+,d0		Odd line
		add.b	(a1)+,d0
		add.b	(a2)+,d0
		add.b	(a3)+,d0
		add.b	(a4)+,d0

		and	#$fc,d0
		move.l	cptab_3(pc,d0),d0
		add.l	#$1200,d0
		move.l	d1,(a5)+
		add.l	d2,d1
		bcc.b	.b3
		move.l	#$ffe1fffe,(a5)+

.b3		w_blit

		move.l	d0,$050(a6)
		move.l	a5,$054(a6)
		move	#$0109,$058(a6)
		add	#$48,a5

		dbf	d3,.zoka

		move.l	#$01800000,(a5)+

		move.l	#-2,(a5)+
		rts
	
cptab_3		ds.l	$40

»» rakennetaan vaakarivi

vaaka_3		move.l	scrl2_3(pc),a5
		moveq	#9,d7
.a		moveq	#15,d5
.b		rept	2
		move.b	(a0)+,d0
		add.b	(a1)+,d0
		add.b	(a2)+,d0
		add.b	(a3)+,d0
		add.b	(a4)+,d0
		add.b	d0,d0
		addx.l	d4,d4
		add.b	d0,d0
		addx.l	d3,d3
		add.b	d0,d0
		addx.l	d2,d2
		add.b	d0,d0
		addx.l	d1,d1
		endr
		dbf	d5,.b
		move.l	d4,120(a5)
		move.l	d3,80(a5)
		move.l	d2,40(a5)
		move.l	d1,(a5)+
		dbf	d7,.a
		rts

;; <4>
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»										
»	" L a z e r s "								
»										
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

lines_4		=	64

go_part_4	lea	$dff000,a6

		move.b	#$ac,lin1_4
		move.b	#$ac,lin2_4

		bsr	do_sine_4

mouse_4		tst.b	5(a6)
		beq.b	mouse_4
.1		tst.b	5(a6)
		bne.b	.1

		bsr.b	avaa_4

		movem.l	scr1_4(pc),d0-d1
		exg	d0,d1
		movem.l	d0-d1,scr1_4

		add.l	#$500,d0
		move.l	d0,$0e0(a6)
		move.l	d0,$0e4(a6)
		move.l	#pic_4,$0e8(a6)

		addq	#1,frame_4

		bsr	clear_4
		bsr	radat_4
		bsr	dolines_4

		move.l	#copper_4,$080(a6)

		btst	#6,$bfe001
		bne	mouse_4

		rts

frame_4		dc	0

avaa_4		move.b	lin1_4,d0
		cmp.b	#$99,d0
		beq.b	.x
		subq.b	#1,lin1_4
		addq.b	#1,lin2_4
.x		rts

»» Clear

clear_4		w_blit
		move.l	#$01000000,$040(a6)
		move	#0,$066(a6)
		move.l	scr2_4(pc),a0
		add	#32*40,a0
		move.l	a0,$054(a6)
		move	#$4014,$058(a6)
		rts

»» Laskee radat

radat_4		move.l	#$ffff,d2
		move	frame_4(pc),d6
		moveq	#$40,d0
		sub	d6,d0
		bmi.b	.fg

		asr	#2,d0
		ror.l	d0,d2

.fg		moveq	#0,d5
		sub	#$20,d6
		add	d6,d6

		ror	d6,d2
		move	d6,d7

.lp		lea	sin_4,a1
		lea	rata_4,a2

		move	frame_4(pc),d5

		btst	#8,d5
		bne.b	.sfg
		not	d5
		add	#$100,d5
.sfg		sub	#$80,d5
		ext	d5
		asl	#4,d5

		and	#$fe,d6
		and	#$fe,d7

		moveq	#lines_4-1,d4

.zp		move	d5,d0
		add	(a1,d7),d0
		add	(a1,d6),d0
		move	64(a1,d7),d1
		add	64(a1,d6),d1

		move	d0,(a2)+
		move	d1,(a2)+
		move	d2,(a2)+

		ror	#1,d2

		addq.b	#4,d6
		addq.b	#8,d7

		dbf	d4,.zp

		rts


»» Lineprutku

dolines_4	move.l	scr2_4(pc),a0
		add	#6420,a0
		lea	rata_4,a1

		w_blit			Init line
		moveq	#-1,d2
		move.l	d2,$044(a6)

		moveq	#40,d2
		move	d2,$060(a6)
		move	d2,$066(a6)
		move	#$8000,$074(a6)

		moveq	#lines_4-1,d5

.ll		movem	(a1)+,d0/d1/d4
		moveq	#0,d2		Draw the line
		tst	d0
		bpl.b	.1
		neg	d0
		moveq	#16,d2
.1		tst	d1
		bpl.b	.2
		neg	d1
		addq	#8,d2
.2		cmp	d0,d1
		blo.b	.3
		bne.b	.z
		tst	d0
		beq.b	.x
.z		exg	d0,d1
		addq	#4,d2
		move	#$2002,d3
		bra.b	.4
.3		move	#$2802,d3
.4		add	d1,d1

		w_blit

		move	d4,$072(a6)
		move.l	a0,$048(a6)
		move.l	a0,$054(a6)
		move	d1,$062(a6)
		sub	d0,d1
		bpl.b	.5
		addq	#2,d2
.5		move	#$0bea,$040(a6)
		move	.bcon0(pc,d2),$042(a6)
		move	d1,$052(a6)
		sub	d0,d1
		move	d1,$064(a6)
		move	d3,$058(a6)

.x		dbf	d5,.ll
		rts

.bcon0		dc	%0010001,%1010001
		dc	%0000001,%1000001
		dc	%0011001,%1011001
		dc	%0000101,%1000101
		dc	%0010101,%1010101
		dc	%0001001,%1001001
		dc	%0011101,%1011101
		dc	%0001101,%1001101

»» Calculate sin & cos lists using formula   sin a = a-a^3/3!+a^5/5!-a^7/7!
»» 11 bits are used in the calculations for precision

do_sine_4	lea	sin_4,a0
		lea	128(a0),a1

		move.l	#823550<<2,d4
		moveq	#31,d3
.l1		move.l	d4,d0
		swap	d0
		add.l	#823550<<3,d4	Pi<<18
		move	d0,d2
		move	d0,d1
		mulu	d1,d1
		lsl.l	#4,d1
		swap	d1
		mulu	d1,d0
		divu	#3<<11,d0
		sub	d0,d2
		mulu	d1,d0
		divu	#10<<11,d0
		add	d0,d2
		mulu	d1,d0
		divu	#21<<11,d0
		sub	d0,d2
		asr	#2,d2

		move	d2,(a0)+
		move	d2,254(a0)
		move	d2,-(a1)
		neg	d2
		move	d2,126(a0)
		move	d2,128(a1)

		dbf	d3,.l1
		rts

scr1_4		dc.l	bpl1_4
scr2_4		dc.l	bpl2_4

;; <5>
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
»										
»	R e p l a y  R o u t i n e						
»												
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»


** ====	Initialize ============================================	**

z
z_unptb	dc.b	$00,$00,$01,$02,$04,$08,$10,$20
	dc.b	$40,$ff,$fe,$fc,$f8,$f0,$e0,$c0

z_init	lea	z_data,a4
	lea	biisi,a0
	move.l	a4,a1

	move	#biisi_l>>3-1,d0
.yt	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	dbf	d0,.yt

	lea	z(pc),a5

	move.l	14(a4),d0		UnSqueeze samples
	lea	(a4,d0.l),a0
	move.l	(a0)+,d0
	lea	-4(a0,d0.l),a1
	lsr.l	#1,d0
	add.l	d0,a0
	subq	#1,d0
	move	d0,d1
.mo	move.b	-(a0),-(a1)
	dbf	d1,.mo

	subq	#4,a0
	moveq	#0,d1
	moveq	#0,d3

.un	move.b	(a1)+,d1
	moveq	#$f,d2
	and	d1,d2
	lsr	#4,d1
	tst	d1
	bne.b	.u1
	moveq	#0,d3
.u1	add.b	z_unptb(pc,d1),d3
	move.b	d3,(a0)+
	tst	d2
	bne.b	.u2
	moveq	#0,d3
.u2	add.b	z_unptb(pc,d2),d3
	move.b	d3,(a0)+
	dbf	d0,.un

	lea	$dff000,a6

	lea	z_vibtb-z(a5),a0	Calculate vibrato table
	lea	z_sinus-z(a5),a1
	moveq	#$3f,d0
.1	move	(a1)+,d4
	moveq	#0,d2
	moveq	#15,d1
.2	move	d2,d3
	asr	#7,d3
	move.b	d3,(a0)+
	add	d4,d2
	dbf	d1,.2
	dbf	d0,.1

	move.l	(a4),d0			Add offset to songpos-pointer
	lea	(a4,d0.l),a0
	move.l	a0,(a4)

.3	move.l	(a0),d0			Add offsets to songpos-table
	bmi.s	.4
	add.l	a4,d0
	move.l	d0,(a0)+
	bra.s	.3
.4
	lea	6(a4),a0
	move.l	a4,d1

	moveq	#31-1,d0		Add offsets to samplepointers
z_sloop	addq.l	#8,a0
	add.l	d1,(a0)+
	add.l	d1,(a0)+
	dbf	d0,z_sloop

	moveq	#-4,d0
	move	d0,z_song-z(a5)
	move.b	d0,z_pos-z(a5)

	move.b	#$06,z_speed-z(a5)
	move.b	#$01,z_count-z(a5)

	bset	#1,$bfe001

	lea	z_ociab-z(a5),a0
	lea	$bfd000,a1
	move.l	$78.w,(a0)+
	move.l	$6c.w,(a0)+
	move.b	$400(a1),(a0)+
	move.b	$500(a1),(a0)+
	move.b	$e00(a1),(a0)+
	move.b	$f00(a1),(a0)+
	move	$01c(a6),(a0)+
	move	#$7fff,$09a(a6)

	move.b	#$02,$500(a1)		$200 = 11.3 raster lines
	move.b	#$00,$400(a1)
	move.b	#$1f,$d00(a1)
	move.b	#$81,$d00(a1)
	move.b	#$1c,$e00(a1)
	lea	z_irq1-z(a5),a0
	move.l	a0,$78.w
	lea	z_pirq-z(a5),a0
	move.l	a0,$6c.w
	move	#$e020,$09a(a6)

	bra	z_quiet

** ====	Disable sound =========================================	**

z_end	lea	$dff000,a6
	lea	z_ociab(pc),a0
	lea	$bfd000,a1
	move	#$7fff,$09a(a6)
	move.l	(a0)+,$78.w
	move.l	(a0)+,$6c.w
	move.b	(a0)+,$400(a1)
	move.b	(a0)+,$500(a1)
	move.b	#$af,$d00(a1)
	move.b	(a0)+,$e00(a1)
	move.b	(a0)+,$f00(a1)
	move	(a0)+,d0
	or	#$8000,d0
	move	d0,$09a(a6)

z_quiet	clr	$0a8(a6)
	clr	$0b8(a6)
	clr	$0c8(a6)
	clr	$0d8(a6)
	move	#$000f,$096(a6)
	rts

** ====	Play music ============================================	**

z_pirq	movem.l	d0-d4/a0-a6,-(sp)
	bsr	z_music
	move	#$0020,$09c(a6)
	movem.l	(sp)+,d0-d4/a0-a6
	rte

z_music	lea	z_data,a4
	lea	z(pc),a5
	lea	$dff000,a6

	clr	z_dmaen-z(a5)

	move.b	z_speed-z(a5),d0
	beq	z_ende
	subq.b	#1,z_count-z(a5)	New note?
	bne	z_nonew
	move.b	d0,z_count-z(a5)

	addq.b	#4,z_pos-z(a5)		Proceed in song
	bne.s	z_newpa

	move.l	(a4),a0			New pattern
	addq	#4,z_song-z(a5)
	move	z_song-z(a5),d0
	move.l	(a0,d0.w),d0
	bpl.s	.1
	clr	z_song-z(a5)
	clr.b	z_pos-z(a5)
	move.l	(a0),d0
.1	move.l	d0,z_patt-z(a5)

z_newpa	move.b	z_pos-z(a5),d0		Play new notes

	move.l	z_patt-z(a5),a0

	pea	.1-z(a5)
	lea	z_voi1-z(a5),a3
	cmp.b	(a0),d0
	bne	z_playo
	move.l	(a0)+,d1
	bra	z_playn

.1	pea	.2-z(a5)
	lea	z_voi2-z(a5),a3
	addq.b	#1,d0
	cmp.b	(a0),d0
	bne	z_playo
	move.l	(a0)+,d1
	bra	z_playn

.2	pea	.3-z(a5)
	lea	z_voi3-z(a5),a3
	addq.b	#1,d0
	cmp.b	(a0),d0
	bne	z_playo
	move.l	(a0)+,d1
	bra	z_playn

.3	pea	.4-z(a5)
	lea	z_voi4-z(a5),a3
	addq.b	#1,d0
	cmp.b	(a0),d0
	bne	z_playo
	move.l	(a0)+,d1
	bra	z_playn

.4	move.l	a0,z_patt-z(a5)

z_nonew	lea	z_voi1-z(a5),a1		Do effects
	bsr	z_doefx
	move	d4,$0a6(a6)
	move	14(a1),$0a8(a6)

	lea	z_voi2-z(a5),a1
	bsr	z_doefx
	move	d4,$0b6(a6)
	move	14(a1),$0b8(a6)

	lea	z_voi3-z(a5),a1
	bsr	z_doefx
	move	d4,$0c6(a6)
	move	14(a1),$0c8(a6)

	lea	z_voi4-z(a5),a1
	bsr	z_doefx
	move	d4,$0d6(a6)
	move	14(a1),$0d8(a6)

	move	z_dmaen-z(a5),d0
	beq.s	z_ende
	move	d0,$096(a6)
	or	#$8000,d0
	move	d0,z_dmaen-z(a5)

	ror	#1,d0
	bpl.s	.1
	move.l	z_voi1+2-z(a5),$0a0(a6)
	move	z_voi1+6-z(a5),$0a4(a6)
.1	ror	#1,d0
	bpl.s	.2
	move.l	z_voi2+2-z(a5),$0b0(a6)
	move	z_voi2+6-z(a5),$0b4(a6)
.2	ror	#1,d0
	bpl.s	.3
	move.l	z_voi3+2-z(a5),$0c0(a6)
	move	z_voi3+6-z(a5),$0c4(a6)
.3	ror	#1,d0
	bpl.s	.4
	move.l	z_voi4+2-z(a5),$0d0(a6)
	move	z_voi4+6-z(a5),$0d4(a6)
.4

z_ende	move.b	#$1d,$bfde00
	rts

z_irq1	tst.b	$bfdd00
	move	z_dmaen(pc),$dff096
	move.l	#z_irq2,$78.w
	move	#$2000,$dff09c
	move.b	#$1d,$bfde00
	rte

z_irq2	tst.b	$bfdd00
	move.l	a6,-(sp)
	lea	$dff000,a6
	move.l	z_voi1+8(pc),$0a0(a6)	Set repeat pointers
	move	z_voi1+12(pc),$0a4(a6)
	move.l	z_voi2+8(pc),$0b0(a6)
	move	z_voi2+12(pc),$0b4(a6)
	move.l	z_voi3+8(pc),$0c0(a6)
	move	z_voi3+12(pc),$0c4(a6)
	move.l	z_voi4+8(pc),$0d0(a6)
	move	z_voi4+12(pc),$0d4(a6)
	move	#$2000,$09c(a6)
	lea	z_irq1(pc),a6
	move.l	a6,$78.w
	move.l	(sp)+,a6
	move.b	#$1c,$bfde00
	rte

z_doefx	move	16(a1),d4		Get period
	move.b	24(a1),d0		Do effect commands
	ext	d0
	add	d0,d0
	moveq	#0,d1
	move.b	25(a1),d1		d1 = effect data

	move.b	z_count-z(a5),d2
	cmp.b	z_speed-z(a5),d2
	bne.s	.1

	move	z_jump1(pc,d0.w),d0
	jmp	(a5,d0.w)
.1	move	z_jump2(pc,d0.w),d0
	jmp	(a5,d0.w)

z_jump1	dc	z_retrn-z,z_retrn-z,z_retrn-z,z_retrn-z	Count = Speed
	dc	z_retrn-z,z_retrn-z,z_retrn-z,z_retrn-z	New note
	dc	z_retrn-z,z_ofset-z,z_retrn-z,z_posjm-z
	dc	z_setvl-z,z_ptbrk-z,z_ecmds-z,z_setsp-z

z_jump2	dc	z_arpeg-z,z_sldup-z,z_sldwn-z,z_tport-z	Count <> Speed
	dc	z_vibra-z,z_tpvsl-z,z_vibvs-z,z_retrn-z		
	dc	z_retrn-z,z_retrn-z,z_volsl-z,z_retrn-z
	dc	z_retrn-z,z_retrn-z,z_retrn-z,z_retrn-z

z_arpls	dc.b	0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0
	dc.b	1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

z_retrn	rts

z_arpeg	tst	d1			CMD 0:	Arpeggio
	beq.s	z_retrn
	move.b	z_count-z(a5),d0
	ext	d0
	move.b	z_arpls(pc,d0.w),d0
	beq.s	z_arpg0
	subq.b	#1,d0
	beq.s	z_arpg1
	and	#$f,d1
	add	d1,d1
	add	18(a1),d1
	add	#z_notes-z,d1
	move	(a5,d1.w),d4
	rts
z_arpg1	lsr	#4,d1
	add	d1,d1
	add	18(a1),d1
	add	#z_notes-z,d1
	move	(a5,d1.w),d4
	rts
z_arpg0	move	18(a1),d1
	add	#z_notes-z,d1
	move	(a5,d1.w),d4
	rts

z_sldup	sub	d1,d4			CMD 1:	Slide up
	cmp	#$71,d4
	bcc.s	.1
	move	#$71,d4
.1	move	d4,16(a1)
	rts

z_sldwn	add	d1,d4			CMD 2:	Slide down
	cmp	#$358,d4
	bmi.s	.1
	move	#$358,d4
.1	move	d4,16(a1)
	rts

z_tport	tst	d1			CMD 3:	Tone portamento
	beq.s	z_port2
	move.b	d1,22(a1)

z_port2	moveq	#0,d0
	move.b	22(a1),d0
	move	30(a1),d2

	cmp	d2,d4
	bpl.s	z_tprtu

	add	d0,d4
	cmp	d2,d4
	bmi.s	.1
	move	d2,d4
.1	move	d4,16(a1)
	rts

z_tprtu	sub	d0,d4
	cmp	d2,d4
	bpl.s	.1
	move	d2,d4
.1	move	d4,16(a1)
	rts

z_vibra	tst.b	d1			CMD 4:	Vibrato
	beq.s	z_dovib
	move.b	d1,26(a1)

z_dovib	move.b	28(a1),d0		Vibrate period
	add	d0,d0
	add	d0,d0
	and	#$3f0,d0
	moveq	#$f,d2
	and.b	26(a1),d2
	add	d0,d2
	add	#z_vibtb-z,d2
	move.b	(a5,d2),d2
	ext	d2
	add	d2,d4
	moveq	#-$10,d0		Vibrato speed
	and.b	26(a1),d0
	lsr.b	#2,d0
	add.b	d0,28(a1)
	rts

z_ofset	lsl	#7,d1			Cmd 9:	Set sample offset
	cmp	6(a1),d1
	bhi.s	.2
	sub	d1,6(a1)
	ext.l	d1
	add.l	d1,d1
	add.l	d1,2(a1)	
.2	rts

z_tpvsl	bsr	z_port2			Cmd 5:	Tone portamento and vol slide
	bra.s	z_volsl

z_vibvs	bsr.s	z_dovib			Cmd 6:	Vibrato and volume slide

z_volsl	move	d1,d0			Cmd A:	Volume slide
	lsr	#4,d0
	beq.s	.1
	add	d0,14(a1)
	moveq	#$40,d2
	cmp	14(a1),d2
	bpl.s	.2
	move	d2,14(a1)
.2	rts
.1	sub	d1,14(a1)
	bpl.s	.3
	clr	14(a1)
.3	rts

z_posjm	move.b	#$fc,z_pos-z(a5)	Cmd B:	Position jump
	ext	d1
	add	d1,d1
	add	d1,d1
	subq	#4,d1
	move.b	d1,z_song-z(a5)
	rts

z_setvl	cmp	#$40,d1			Cmd C:	Set volume
	bls.s	.1
	moveq	#$40,d1
.1	move	d1,14(a1)
	rts

z_ptbrk	move.b	#$fc,z_pos-z(a5)	Cmd D:	Pattern break
	rts				(Parameter not supported!)

z_ecmds	moveq	#$f,d0			Cmd E: Special commands
	and	d1,d0
	lsr	#4,d1
	add	d1,d1

	move	z_ejump(pc,d1.w),d1
	jmp	(a5,d1.w)

z_ejump	dc	z_filtr-z,z_fsldu-z,z_fsldd-z,z_retrn-z
	dc	z_retrn-z,z_retrn-z,z_retrn-z,z_retrn-z		
	dc	z_retrn-z,z_retrn-z,z_fvolu-z,z_fvold-z
	dc	z_retrn-z,z_retrn-z,z_retrn-z,z_retrn-z

z_filtr	tst	d0			Cmd E0:	Set filter
	beq.s	.1
	bset	#1,$bfe001
	rts
.1	bclr	#1,$bfe001
	rts

z_fsldu	sub	d0,d4			CMD E1:	Fine slide up
	cmp	#$71,d4
	bpl.s	.1
	move	#$71,d4
.1	move	d4,16(a1)
	rts

z_fsldd	add	d0,d4			CMD E2:	Fine slide down
	cmp	#$358,d4
	bmi.s	.1
	move	#$358,d4
.1	move	d4,16(a1)
	rts

z_fvolu	add	d0,14(a1)		Cmd EA:	Fine vol slide up
	moveq	#$40,d2
	cmp	14(a1),d2
	bpl.s	.1
	move	d2,14(a1)
.1	rts

z_fvold	sub	d0,14(a1)		Cmd EB:	Fine vol slide down
	bpl.s	.1
	clr	14(a1)
.1	rts

z_setsp	move.b	d1,z_speed-z(a5)	Cmd F: Set speed
	move.b	d1,z_count-z(a5)
	rts

z_playo	moveq	#0,d1

z_playn	move.l	d1,d2			Play notes
	and	#$0fff,d1
	move	d1,24(a3)		Save effect command
	swap	d1
	and	#$7e,d1
	beq.s	.5
	ror.l	#8,d2
	and	#$01f0,d2
	bne.s	.1

	move	20(a3),d2
	lea	-10(a4,d2.w),a2
	add	(a2)+,d1
	addq.l	#2,a2			(sample 0: no volume change!)
	bra.s	.3

.1	move	d2,20(a3)		Save sample 0 - pointer
	lea	-10(a4,d2.w),a2
	add	(a2)+,d1
	move	(a2)+,14(a3)

.3	move	d1,18(a3)
	move	z_notes(pc,d1.w),d1
	move	d1,30(a3)

	cmp.b	#3,24(a3)		Effect 3: don't care about sample
	beq.s	.2

	move	d1,16(a3)
	move	(a3),d1
	or	d1,z_dmaen-z(a5)

.4	move	(a2)+,6(a3)
	move	(a2)+,12(a3)
	move.l	(a2)+,2(a3)
	move.l	(a2)+,8(a3)
.2	rts

.5	ror.l	#8,d2			No note: change repeat pointers
	and	#$01f0,d2
	beq.s	.2
	move	d2,20(a3)
	lea	-8(a4,d2.w),a2
	move	(a2)+,14(a3)
	bra.s	.4

z_notes	dc	0

	dc	856,808,762,720,678,640,604,570,538,508,480,453
	dc	428,404,381,360,339,320,302,285,269,254,240,226
	dc	214,202,190,180,170,160,151,143,135,127,120,113

	dc	850,802,757,715,674,637,601,567,535,505,477,450
	dc	425,401,379,357,337,318,300,284,268,253,239,225
	dc	213,201,189,179,169,159,150,142,134,126,119,113

	dc	844,796,752,709,670,632,597,563,532,502,474,447
	dc	422,398,376,355,335,316,298,282,266,251,237,224
	dc	211,199,188,177,167,158,149,141,133,125,118,112

	dc	838,791,746,704,665,628,592,559,528,498,470,444
	dc	419,395,373,352,332,314,296,280,264,249,235,222
	dc	209,198,187,176,166,157,148,140,132,125,118,111

	dc	832,785,741,699,660,623,588,555,524,495,467,441
	dc	416,392,370,350,330,312,294,278,262,247,233,220
	dc	208,196,185,175,165,156,147,139,131,124,117,110

	dc	826,779,736,694,655,619,584,551,520,491,463,437
	dc	413,390,368,347,328,309,292,276,260,245,232,219
	dc	206,195,184,174,164,155,146,138,130,123,116,109

	dc	820,774,730,689,651,614,580,547,516,487,460,434
	dc	410,387,365,345,325,307,290,274,258,244,230,217
	dc	205,193,183,172,163,154,145,137,129,122,115,109

	dc	814,768,725,684,646,610,575,543,513,484,457,431
	dc	407,384,363,342,323,305,288,272,256,242,228,216
	dc	204,192,181,171,161,152,144,136,128,121,114,108

	dc	907,856,808,762,720,678,640,604,570,538,508,480
	dc	453,428,404,381,360,339,320,302,285,269,254,240
	dc	226,214,202,190,180,170,160,151,143,135,127,120

	dc	900,850,802,757,715,675,636,601,567,535,505,477
	dc	450,425,401,379,357,337,318,300,284,268,253,238
	dc	225,212,200,189,179,169,159,150,142,134,126,119

	dc	894,844,796,752,709,670,632,597,563,532,502,474
	dc	447,422,398,376,355,335,316,298,282,266,251,237
	dc	223,211,199,188,177,167,158,149,141,133,125,118

	dc	887,838,791,746,704,665,628,592,559,528,498,470
	dc	444,419,395,373,352,332,314,296,280,264,249,235
	dc	222,209,198,187,176,166,157,148,140,132,125,118

	dc	881,832,785,741,699,660,623,588,555,524,494,467
	dc	441,416,392,370,350,330,312,294,278,262,247,233
	dc	220,208,196,185,175,165,156,147,139,131,123,117

	dc	875,826,779,736,694,655,619,584,551,520,491,463
	dc	437,413,390,368,347,328,309,292,276,260,245,232
	dc	219,206,195,184,174,164,155,146,138,130,123,116

	dc	868,820,774,730,689,651,614,580,547,516,487,460
	dc	434,410,387,365,345,325,307,290,274,258,244,230
	dc	217,205,193,183,172,163,154,145,137,129,122,115

	dc	862,814,768,725,684,646,610,575,543,513,484,457
	dc	431,407,384,363,342,323,305,288,272,256,242,228
	dc	216,203,192,181,171,161,152,144,136,128,121,114

z_sinus	dc	$0000,$0018,$0031,$004a,$0061,$0078,$008d,$00a1
	dc	$00b4,$00c5,$00d4,$00e0,$00eb,$00f4,$00fa,$00fd
	dc	$00ff,$00fd,$00fa,$00f4,$00eb,$00e0,$00d4,$00c5
	dc	$00b4,$00a1,$008d,$0078,$0061,$004a,$0031,$0018
	dc	$0000,$ffe8,$ffcf,$ffb6,$ff9f,$ff88,$ff73,$ff5f
	dc	$ff4c,$ff3b,$ff2c,$ff20,$ff15,$ff0c,$ff06,$ff03
	dc	$ff01,$ff03,$ff06,$ff0c,$ff15,$ff20,$ff2c,$ff3b
	dc	$ff4c,$ff5f,$ff73,$ff88,$ff9f,$ffb6,$ffcf,$ffe8

** ====	Variables =============================================	**

z_song	dc	0
z_pos	dc.b	0
z_speed	dc.b	0
z_count	dc.b	0
	even
z_patt	dc.l	0
z_dmaen	dc	0

z_ociab	ds.b	14

z_voi1	dc	1
	ds.b	30
z_voi2	dc	2
	ds.b	30
z_voi3	dc	4
	ds.b	30
z_voi4	dc	8
	ds.b	30

z_vibtb	ds.b	1024

;; <6>

biisi		incbin	"darkroom.zen"
biisi_l		= *-biisi
		even

pic_2		incbin	"darkroom.raw"

»»»»»»»	bss (fast) »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

	section	ada,bss

fast_siz	=	$1000
fast		ds.b	fast_siz

fractar_1	=	fast
zoomaa_1	=	fast+200
rotate_1	=	fast+400
hold_1		=	fast+600

sin_3		=	fast
cos_3		=	fast+$200
star_3		=	fast+$a00

sin_4		=	fast
rata_4		=	fast+360
	;(ds.w 3*lines)

»»»»»»»	bss-chip »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

	section	we,bss_c

z_data		ds.b	$10000
chip_siz	=	$30000
chip		ds.b	chip_siz

g_1		=	chip
bpa1_1		=	chip+$3000
bpa2_1		=	chip+$5800
bpa3_1		=	chip+$8000
bpa4_1		=	chip+$a800
bpb1_1		=	chip+$d000
bpb2_1		=	chip+$f800
bpb3_1		=	chip+$12000
bpb4_1		=	chip+$14800
t_1		=	chip+$18000

bpl1_2		=	chip
temp_2		=	chip+$2828
bpl2_2		=	chip+$5050
bpl3_2		=	chip+$7850
bpl4_2		=	chip+$a050
bpl_tx_2	=	chip+$c850

line1_3		=	chip
line2_3		=	chip+160
l_even_3	=	chip+320
l_odd_3		=	chip+360
copper1_3	=	chip+400
copper2_3	=	chip+$5190
cmaps_3		=	chip+$a190

bpl1_4		=	chip
bpl2_4		=	chip+$3200
bpl3_4		=	chip+$6400


»»»»»»»	copperlistat, ym chip-kama »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

	section	rw,data_c

copper_0	dc	$0100,$0000,$0180,$0000
		dc.l	-2

»» routine 1

scopa_1		dc	$008e,$2c81,$0090,$2cc1
		dc	$0092,$0038,$0094,$00d0
		dc	$0108,$0000,$010a,$0000
		dc	$0100,$4000,$0102,$0000

	;	dc	$0180,$0000,$0182,$0100,$0184,$0200,$0186,$0300
	;	dc	$0188,$0400,$018a,$0500,$018c,$0600,$018e,$0700
	;	dc	$0190,$0800,$0192,$0910,$0194,$0a20,$0196,$0b30
	;	dc	$0198,$0c40,$019a,$0d50,$019c,$0e60,$019e,$0f70

		dc	$0180,$0000,$0182,$0001,$0184,$0002,$0186,$0003
		dc	$0188,$0004,$018a,$0005,$018c,$0006,$018e,$0007
		dc	$0190,$0008,$0192,$0009,$0194,$000a,$0196,$000b
		dc	$0198,$000c,$019a,$000d,$019c,$000e,$019e,$000f

sptra_1		dc	$00e0,$0000,$00e2,$0000
		dc	$00e4,$0000,$00e6,$0000
		dc	$00e8,$0000,$00ea,$0000
		dc	$00ec,$0000,$00ee,$0000
		dc.l	-2
scopb_1
sptrb_1		dc	$00e0,$0000,$00e2,$0000
		dc	$00e4,$0000,$00e6,$0000
		dc	$00e8,$0000,$00ea,$0000
		dc	$00ec,$0000,$00ee,$0000
		dc.l	-2

»» routine 2

copper_2	dc	$008e,$2c81,$0090,$2cc1
		dc	$0092,$0038,$0094,$00d0
		dc	$0100,$4000,$0102,$0000
		dc	$0108,$0000,$010a,$0000
	
fadehere_2	dc	$0180,$0000,$0182,$0226,$0184,$0226,$0186,$033a
		dc	$0188,$0226,$018a,$033a,$018c,$033a,$018e,$044f
		dc	$0190,$044f,$0192,$066f,$0194,$066f,$0196,$0aaf
		dc	$0198,$066f,$019a,$0aaf,$019c,$0aaf,$019e,$0fff

		dc.l	-2

»» routine 4

copper_4	dc	$008e,$2c81,$0090,$2cc1
		dc	$0092,$0038,$0094,$00d0
		dc	$0100,$2000,$0102,$0001
		dc	$0108,$0000,$010a,$0000
		dc	$0180,$0000,$0182,$0006,$0184,$0006,$0186,$000c
		dc	$0188,$0ccc,$018a,$0ccf,$018c,$0ccf,$018e,$0ccf
lin1_4		dc	$9911,$fffe,$0100,$3000
lin2_4		dc	$bf11,$fffe,$0100,$2000
		dc.l	-2

pic_4		incbin	"credits.raw"	
