		include	"dragonhw.s"

bpm		equ	160
frags_per_beat	equ	15
sample_cycles	equ	89
sample_rate	equ	894886.25 / sample_cycles

; ------------------------------------------------------

do_frame

		cmpu	#tune_end	; 5
		bhs	10F		; 3 = 8
		bra	20F		; 3 (a)
10		ldu	#tune_start	; 3 (b)
20

		ldb	,u+		; 6
		bmi	10F		; 3 = 9
		;
		exg	a,b		; 8
		exg	a,b		; 8	- preserving b
		exg	a,b		; 8
		exg	a,b		; 8	- preserving b
		abx			; 3
		nop			; 2
		bra	20F		; 3 = 40 (a)
		;
10		pulu	x,y		; 9
		stx	wave1ptr	; 5
		sty	wave1end	; 6
		pulu	x,y		; 9
		stx	wave1restart	; 5
		sty	wave1freq	; 6 = 40 (b)
		;
20		lslb			; 2
		bmi	10F		; 3 = 5
		;
		tfr	b,a		; 6
		tfr	b,a		; 6
		nop			; 2
		bra	20F		; 3 = 17 (a)
		;
10		pulu	a,x		; 8
		sta	wave2ptr	; 4
		stx	wave2freq	; 5 = 17 (b)
		;
20		lslb			; 2
		bmi	10F		; 3 = 5
		;
		tfr	b,a		; 6
		tfr	b,a		; 6
		nop			; 2
		bra	20F		; 3 = 17 (a)
		;
10		pulu	a,x		; 8
		sta	wave3ptr	; 4
		stx	wave3freq	; 5 = 17 (b)
		;
20		; 104 cycles total

; ------------------------------------------------------

; this is an adaptation of the optimised sound core from remz' cocosid3.
; it drops one of the channels and converts the other to sample playback
; (with a repeat section).

play_frag
		pshs	u

		sts	mixer_stmp

		ldd	#((sample_rate / (bpm / 60)) / frags_per_beat)
		std	sample_count

		lds	#reg_pia1_pdra
wave1ptr	equ	*+1
		ldx	#midpoint
wave2ptr	equ	*+1
		ldu	#silence
wave3ptr	equ	*+2
		ldy	#silence

mixer_loop

wave1off	equ	*+2
		ldd	#$0000		; 3
wave1freq	equ	*+1
		addd	#$0000		; 4
		stb	wave1off	; 4
		ldb	,x		; 4
		stb	wave1value	; 4
		leax	a,x		; 5
wave1end	equ	*+1
		cmpx	#$0000		; 4
		bhs	1F		; 3
		bra	2F		; 3 (1)
wave1restart	equ	*+1
1		ldx	#midpoint	; 3 (2)
2
					; == 34

wave2off	equ	*+1
		ldd	#$0000		; 3
wave2freq	equ	*+1
		addd	#$0000		; 4
		std	wave2off	; 5
		ldb	a,u		; 5
		stb	wave2value	; 4
					; == 21

wave3off	equ	*+1
		ldd	#$0000		; 3
wave3freq	equ	*+1
		addd	#$0000		; 4
		std	wave3off	; 5
		ldb	a,y		; 5
					; == 17

wave1value	equ	*+1
		addb	#$00		; 2
wave2value	equ	*+1
		addb	#$00		; 2
		stb	,s		; 4
					; == 8

		dec	sample_count1	; 6
		bne	mixer_loop	; 3
					; == 9 ... == 89 (mixer loop)

wave2arpeg	equ	*+1
		ldu	#$0000		; 3
		ldd	wave2freq	; 5
		std	wave2arpeg	; 5
		stu	wave2freq	; 5
		ldu	wave2ptr	; 5
		
		dec	sample_count0	; 6
		bpl	mixer_loop	; 3
					; == 32 ... == 121 (1 in 256 samples)

		stx	wave1ptr
		lds	mixer_stmp
		puls	u,pc

; ------------------------------------------------------

mixer_stmp	rmb	2
sample_count
sample_count0	rmb	1
sample_count1	rmb	1

; ------------------------------------------------------
