* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* NoisePacker V3.0 PlayRoutine ©1991 Twins of Phenomena *
* Used registers are d0-d7/a0-a6     It use lev6irq     *
* How to use it? 1. bsr np_init                         *
*                2. bsr np_music (every vert.)          *
*                3. bsr np_end                          *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *

np_data=$60000

np_init:	moveq	#1,d0
		moveq	#0,d1
		lea	np_data,a4
		lea	$dff000,a5
		lea	np_oldirq(pc),a6

		move.l	$78.w,(a6)+
		move.w	d0,(a6)+
		move.l	a4,a3
		add.w	(a4)+,a3
		move.l	a3,(a6)+
		move.w	d1,(a6)+
np_ini1:	add.w	(a4)+,a3
		move.l	a3,(a6)+
		dbf	d0,np_ini1
		move.w	(a4)+,d0
		add.l	d0,a3

		move.l	#$82000006,(a6)+
		move.w	#$0100,(a6)+
		move.l	#np_portup,(a6)+
		move.l	#np_portdown,(a6)+
		move.l	#np_port,(a6)+
		move.l	#np_vib,(a6)+
		move.l	#np_port2,(a6)+
		move.l	#np_vib2,(a6)+
		move.l	#np_volslide,(a6)+
		move.l	#np_arp,(a6)+
		move.l	#np_songjmp,(a6)+
		move.l	#np_setvol,(a6)+
		move.l	#np_pattbreak,(a6)+
		move.l	#np_filter,(a6)+
		move.l	#np_setspeed,(a6)+

		moveq	#0,d0
		move.l	a4,a6
		add.w	-8(a4),a6
		sub.w	#12,a6
np_ini2:	move.l	a3,2(a4)
		move.l	a3,a2
		move.w	14(a4),d0
		add.w	d0,d0
		add.l	d0,a2
		move.l	a2,8(a4)
		move.w	6(a4),d0
		add.w	d0,d0
		add.l	d0,a3
		add.w	#16,a4
		cmp.l	a4,a6
		bne.b	np_ini2

		bset.b	#1,$bfe001
		move.w	d1,$a8(a5)
		move.w	d1,$b8(a5)
		move.w	d1,$c8(a5)
		move.w	d1,$d8(a5)
		move.w	#$f,$96(a5)

		move.w	#$2000,$9a(a5)
		lea	$bfd000,a0
		move.b	#$7f,$d00(a0)
		move.b	#$08,$e00(a0)
		move.b	#$80,$400(a0)
		move.b	#$01,$500(a0)
np_ini3:	btst.b	#0,$d00(a0)
		beq.b	np_ini3
		move.b	#$81,$d00(a0)
		move.w	#$e000,$9a(a5)
		rts

np_end:		moveq	#0,d0
		lea	$dff000,a5
		move.w	d0,$a8(a5)
		move.w	d0,$b8(a5)
		move.w	d0,$c8(a5)
		move.w	d0,$d8(a5)
		bclr.b	#1,$bfe001
		move.w	#$f,$96(a5)
		move.w	#$2000,$9a(a5)
		move.l	np_oldirq(pc),$78.w
		rts

np_music:	moveq	#0,d6
		lea	$dff0d0,a4
		lea	np_block(pc),a6
		subq.w	#1,(a6)+
		bhi.w	np_nonew

		move.l	(a6)+,a1
		add.w	(a6)+,a1
		move.l	(a6)+,a0
		add.w	(a1),a0
		move.l	(a6)+,d2
		lea	np_data-8,a1
		lea	np_voidat1(pc),a2

		moveq	#8,d0
		moveq	#0,d1
		moveq	#0,d4
		moveq	#0,d5
np_loop1:	move.w	(a0)+,d1

		tst.w	(a2)+
		bpl.b	np_lop3
		addq.w	#1,-(a2)
		add.w	#32,a2
		addq.w	#8,a4
		bra.w	np_lop7
np_lop3:	move.l	d2,a3
		add.l	d1,a3
		add.w	(a2),a3

		move.b	(a3)+,d1
		bpl.b	np_lop4
		ext.w	d1
		addq.w	#1,d1
		addq.w	#1,(a2)
		move.w	d1,-(a2)
		move.w	d6,8(a2)
		add.w	#32,a2
		addq.w	#8,a4
		bra.w	np_lop7
np_lop4:	move.b	(a3)+,d3
		move.b	(a3)+,d4
		addq.w	#3,(a2)+

		move.l	a1,a3
		move.b	d1,d7
		lsl.w	#8,d7
		or.b	d3,d7
		andi.w	#$1f0,d7
		bne.b	np_loop3

		add.w	(a2)+,a3
		addq.w	#2,a2
		addq.w	#2,a3
		bra.b	np_loop4
np_loop3:	move.w	d7,(a2)+
		add.w	d7,a3
		move.w	(a3)+,(a2)+
np_loop4:	andi.w	#$f,d3
		move.w	d3,(a2)+
		move.w	d4,(a2)+

		andi.w	#$fe,d1
		beq.b	np_loop5

		move.w	np_periods-2(pc,d1.w),d7

		subq.w	#3,d3
		beq.w	np_setport
		subq.w	#2,d3
		beq.w	np_setport

		or.w	d0,d5
		move.w	d7,(a2)+
		move.w	d1,(a2)+
		move.w	d6,(a2)+

		move.l	(a3)+,(a4)+
		move.w	(a3)+,(a4)+
		move.l	(a3)+,(a2)+
		move.w	(a3)+,(a2)+

		subq.w	#6,d3
		bmi.b	np_loop6
		add.w	d3,d3
		add.w	d3,d3
		move.l	38(a6,d3.w),a3
		jmp	(a3)

np_loop5:	add.w	#12,a2
		addq.w	#6,a4
		sub.w	#11,d3
		bmi.b	np_loop6
		add.w	d3,d3
		add.w	d3,d3
		move.l	38(a6,d3.w),a3
		jmp	(a3)

np_periods:	dc.w	$0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a
		dc.w	$01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168,$0153,$0140
		dc.w	$012e,$011d,$010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be
		dc.w	$00b4,$00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071

np_loop6:	move.w	-12(a2),(a4)+
np_loop7:	move.w	-18(a2),(a4)
		addq.w	#8,a2
np_lop7:	sub.w	#$18,a4
		lsr.w	#1,d0
		bne.w	np_loop1

		move.w	d5,6(a4)
		or.w	d5,(a6)+
		move.w	(a6)+,-20(a6)
		move.l	#np_irq1,$78.w
		move.b	#$19,$bfde00

		bset.b	#0,(a6)+
		beq.b	np_break
		addq.b	#1,(a6)
		cmp.b	#64,(a6)
		bne.b	np_next
np_break:	move.b	d6,(a6)
		move.l	d6,-32(a2)
		move.l	d6,-64(a2)
		move.l	d6,-96(a2)
		move.l	d6,-128(a2)
		lea	np_block+2(pc),a6
		move.l	(a6)+,a0
		addq.w	#2,(a6)
		move.w	(a6),d0
		cmp.w	-4(a0),d0
		bne.b	np_next
		move.w	-2(a0),(a6)
np_next:	rts

np_setvol:	move.w	d4,-18(a2)
		bra.b	np_loop6

np_pattbreak:	move.b	d6,4(a6)
		bra.b	np_loop6

np_songjmp:	move.b	#63,5(a6)
		move.b	d4,-9(a6)
		bra.b	np_loop6

np_setspeed:	move.w	d4,2(a6)
		bra.w	np_loop6

np_filter:	andi.b	#$fd,$bfe001
		or.b	d4,$bfe001
		bra.w	np_loop6

np_setport:	add.w	#12,a2
		addq.w	#8,a4
		cmp.w	-12(a2),d7
		slt.b	(a2)
		beq.b	np_clear
		move.w	d7,2(a2)
		bra.w	np_loop7
np_clear:	move.w	d6,2(a2)
		bra.w	np_loop7

np_nonew:	lea	np_voidat1(pc),a0
		moveq	#3,d0
np_lop1:	move.w	8(a0),d1
		beq.b	np_lop2
		subq.w	#8,d1
		bhi.b	np_lop2
		addq.w	#7,d1
		add.w	d1,d1
		add.w	d1,d1
		move.l	20(a6,d1.w),a3
		jmp	(a3)
np_lop2:	addi.w	#32,a0
		subi.w	#$0010,a4
		dbf	d0,np_lop1
		rts

np_portup:	move.w	10(a0),d2
		sub.w	d2,12(a0)
		cmpi.w	#$0071,12(a0)
		bpl.b	np_portup2
		move.w	#$71,12(a0)
np_portup2:	move.w	12(a0),6(a4)
		bra.b	np_lop2

np_portdown:	move.w	10(a0),d2
		add.w	d2,12(a0)
		cmpi.w	#$0358,12(a0)
		bmi.b	np_portdown2
		move.w	#$358,12(a0)
np_portdown2:	move.w	12(a0),6(a4)
		bra.b	np_lop2

np_arp:		move.w	-2(a6),d2
		sub.w	16(a6),d2
		neg.w	d2
		move.b	np_arplist(pc,d2.w),d2
		beq.b	np_arp0
		subq.w	#2,d2
		beq.b	np_arp2
np_arp1:	move.w	10(a0),d2
		lsr.w	#3,d2
		andi.w	#$000e,d2
		bra.b	np_arp3
np_arp2:	move.w	10(a0),d2
		andi.w	#$000f,d2
		add.w	d2,d2
np_arp3:	add.w	14(a0),d2
		cmpi.w	#$0048,d2
		bls.b	np_arp4
		moveq	#$48,d2
np_arp4:	lea	np_periods-2(pc),a3
		move.w	(a3,d2.w),6(a4)
		bra.w	np_lop2
np_arp0:	move.w	12(a0),6(a4)
		bra.w	np_lop2

np_arplist:
	dc.b	0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

np_sin:	dc.b	$00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
	dc.b	$ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18

np_vib:		move.w	10(a0),d3
		beq.b	np_vib2
		move.w	d3,30(a0)
np_vib2:	move.w	16(a0),d3
		lsr.w	#2,d3
		andi.w	#$001f,d3
		moveq	#0,d2
		move.b	np_sin(pc,d3.w),d2
		move.w	30(a0),d3
		andi.w	#$000f,d3
		mulu	d3,d2
		lsr.w	#7,d2
		move.w	12(a0),d3
		tst.b	17(a0)
		bmi.b	np_vibsub
		add.w	d2,d3
		bra.b	np_vib3
np_vibsub:	sub.w	d2,d3
np_vib3:	move.w	d3,6(a4)
		move.w	30(a0),d3
		lsr.w	#2,d3
		andi.w	#$003c,d3
		add.b	d3,17(a0)
		cmp.b	#20,d1
		bne.w	np_lop2

np_volslide:	move.w	10(a0),d2
		add.b	d2,7(a0)
		bmi.b	np_vol3
		cmp.w	#$40,6(a0)
		bmi.b	np_vol2
		move.w	#$40,6(a0)
np_vol2:	move.w	6(a0),8(a4)
		bra.w	np_lop2

np_vol3:	move.w	d6,6(a0)
		move.w	d6,8(a4)
		bra.w	np_lop2

np_port:	move.w	10(a0),d2
		beq.b	np_port2
		move.w	d2,28(a0)

np_port2:	move.w	26(a0),d2
		beq.b	np_rts
		move.w	28(a0),d3
		tst.w	24(a0)
		bne.b	np_sub
		add.w	d3,12(a0)
		cmp.w	12(a0),d2
		bgt.b	np_portok
		move.w	d2,12(a0)
		move.w	d6,26(a0)
np_portok:	move.w	12(a0),6(a4)
np_rts:		cmp.b	#16,d1
		beq.b	np_volslide
		bra.w	np_lop2

np_sub:		sub.w	d3,12(a0)
		cmp.w	12(a0),d2
		blt.b	np_portok
		move.w	d2,12(a0)
		move.w	d6,26(a0)
		move.w	12(a0),6(a4)
		cmp.b	#16,d1
		beq.w	np_volslide
		bra.w	np_lop2

np_irq1:	tst.b	$bfdd00
		move.b	#$19,$bfde00
		move.l	#np_irq2,$78.w
		move.w	np_block+16(pc),$dff096
		move.w	#$2000,$dff09c
		rte

np_irq2:	move.l	a0,-(a7)
		lea	$dff000,a0
		tst.b	$bfdd00
		move.l	np_voidat1+18(pc),$d0(a0)
		move.w	np_voidat1+22(pc),$d4(a0)
		move.l	np_voidat1+50(pc),$c0(a0)
		move.w	np_voidat1+54(pc),$c4(a0)
		move.l	np_voidat1+82(pc),$b0(a0)
		move.w	np_voidat1+86(pc),$b4(a0)
		move.l	np_voidat1+114(pc),$a0(a0)
		move.w	np_voidat1+118(pc),$a4(a0)
		move.l	np_oldirq(pc),$78.w
		move.w	#$2000,$9c(a0)
		move.l	(a7)+,a0
		rte

np_oldirq:	dc.l	0
np_block:	blk.l	19,0
np_voidat1:	blk.l	32,0

