; kakukk3.inc: a hanghoz szinkronizált adsr, egyébként mint 
; kakukk2.

f4todo
	bcf	flag4
	goto	main1
f2todo			; nem ezt 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

; a következő hang töltése
nxt_snd
	call	ldsnd
	movlw	31
	movwf	stcnt
	bsf	fut
; nem várhatunk a 2 ms-ra, mert lehetnek más teendők:
todo
	snb	flag1
	goto	fl1
back1
	snb	flag2
	goto	fl2
back2
	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

fl1
	bcf	flag1		; ha flag1 áll
	sb	sndnct,1	; és az első 2 ütem valamelyike,
	goto	back1
	goto	burkol		; akkor burkol
fl2
	bcf	flag2		; ha flag2 áll
	snb	sndnct,1	;és a második két ütem valamelyike
	goto	back2
burkol				; akkor burkol
	jnb	fut,back2
	jb	sndnct,0,le	; páratlan hang csökkenő burkolóval
	banksel	daccon1		; páros hang növekvő burkolóval
	incf	daccon1,w
	sb	wreg,5
	movwf	daccon1		; csak ha a növelés 31-en belül marad
	goto	lefel
le
	banksel	daccon1
	movf	daccon1,w
	sz
	decf	daccon1,f	; csak ha ezzel nem megy 0 alá
lefel
	banksel	0
	decfsz	stcnt,f		; tranziens számláló visszaszámlál
	goto	back2	; még fut
	bcf	fut	; stcnt elfogyott
	snb	sndnct,0
	clrf	ven	; páratlan hang (párosról indult!)
	goto	back2

; 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 hívja, így léteznie kell, még ha üres is 
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
