; kakukk4.inc: 255 lépéses aszinkron adsr-rel 1704-hez, egyébként mint 
; kakukk2.

f4todo			; nem ezt használjuk flag4 kezelésére
	bcf	flag4
	goto	main1
f2todo			; nem használjuk
	bcf	flag2
	goto	main2	
; amikor a főprogram elágazik ide, többé nincs esélye f2-t és f4-et figyelni,
; így ezek megmaradnak negy számára
negy
	bsf	tilt	; gombfigyelés letiltva, bár úgyis kimaradna
	movlw	low sndtbl
	movwf	sndptr
	movlw	high 1049
	movwf	bh4
	movlw	low 1049
	movwf	bl4
negy1	movlw	4
	movwf	sndnct	; 2 hang 2 szünet
	banksel	dac1con1
	clrf	dac1con1	
	banksel	0
	bsf	adsren	; nem jó, még nem!

; a következő hang töltése
nxt_snd
	call	ldsnd
	movlw	255
	movwf	stcnt
	bsf	fut
; nem várhatunk a 2 ms-ra, mert lehetnek más teendők:
todo
	snb	adsrf	; sűrűn kell jönnie
	goto	burkol
back1
	sb	flag4
	goto	todo
	bcf	flag4
	decfsz	sndtctl,f	; illetve elintéztem az elfogyási feladatot
	goto	todo
	decfsz	sndtcth,f
	goto	todo		; hangidő nem fogyott el
	decfsz	sndnct,f
	goto	nxt_snd		; hangok nem fogytak el
	clrf	ven		; új kakukk kezdődik
	bcf	tilt
	goto	negy
;	goto	main	; így csak friss gombnyomásra indul újra

burkol
	bcf	adsrf
	jnb	fut,back1
	jb	sndnct,0,le
	banksel	dac1con1
	incf	dac1con1,w
	sz	
	movwf	dac1con1
	goto	lefel
le
	banksel	dac1con1
	movf	dac1con1,w
	sz
	decf	dac1con1,f
lefel
	banksel	0
	decfsz	stcnt,f
	goto	back1	; még fut
	bcf	fut	; stcnt elfogyott
	snb	sndnct,0
	clrf	ven	; páratlan hang (párosról indult!)
	goto	back1

; Ez a szubrutin tölti a következő hangot: először az időtartamot, aztán
; három csatornát. Még két csatornával bővíthető lenne,de azok közül egy
; már foglalt a ritmus számára. Hosszúsága miatt a megszakítás legalább
; egy helyen biztosan kettévágja.	
ldsnd
	clrf	ven
	movlp	high sndtbl&0x7f
	movf	sndptr,w
	callw
	movwf	sndtcth	
	incf	sndptr,f
	movf	sndptr,w
	callw
	movwf	sndtctl
	incf	sndptr,f
	movf	sndptr,w
	callw	
	movwf	sndbuf
	andlw	7fh
	movwf	bh1
	snb	sndbuf,7
	bsf	v1en	
	incf	sndptr,f
	movf	sndptr,w
	callw
	movwf	bl1
	incf	sndptr,f
	movf	sndptr,w
	callw	
	movwf	sndbuf
	andlw	7fh
	movwf	bh2
	snb	sndbuf,7
	bsf	v2en	
	incf	sndptr,f
	movf	sndptr,w
	callw
	movwf	bl2
	incf	sndptr,f
	movf	sndptr,w
	callw	
	movwf	sndbuf
	andlw	7fh
	movwf	bh3
	snb	sndbuf,7
	bsf	v3en	
	incf	sndptr,f
	movf	sndptr,w
	callw
	movwf	bl3
	incf	sndptr,f
	pagesel $
	return
; az atir szubrutin az A/D használatához kellene, itt nincs szükség a tevékenységére,
; de az univerzális program hivatkozik rá, így léteznie kell 
atir
	return

toltm		; induló frekvencia paraméterek töltése
	movlw	high 1093
	movwf	bh1
	movlw	low 1093
	movwf	bl1
	movlw	high 1093
	movwf	bh2
	movlw	low 1093
	movwf	bl2
	movlw	high 1093
	movwf	bh3
	movlw	low 1093
	movwf	bl3
	movlw	high 1049
	movwf	bh4
	movlw	low 1049
	movwf	bl4
	clrf	bll4
	movlw	high 1049
	movwf	bh5
	movlw	low 1049
	movwf	bl5
	return

; ezek a programágak üresek, visszavisznek a főhurok elejére:
harom
	goto main
ketto0
	goto main
ketto1	
	goto main
; ha egy1-ben az ugrási címet cserélem, és a stabil végén is, akkor 
; egy kakukk és a szünete után régóta nyomott gombra is újraindul.
egy0
	goto main
egy1
	goto main
;	goto negy
