; baba.asm: egyszólamú lejátszó
	list p=10f320
	list r=dec
	#include <p10f320.inc>
	#include <prlx.inc>
	
	__config	2486h

	#include <sounds.inc>	; skálahang - növekmény megfeleltetés

	#include <korde.inc>	; dallamfájl, cserélhető

	cblock 40h
	wtemp
	stemp
	flags
	voi_tmh
	voi_tml
	voi_cnt
	precnt
	count
	repts
	endc
	
#define nstop	flags,0	; flagtörlés egyben álló állapot
#define gomb	porta,3	; ez bemenet, kötelezően a portról
#define tart	lata,0	; 10F-nél nem jár lapváltással a használata

	org	0
	clrf	intcon
	movlw	30h
	movwf	osccon	; 1 MHz
	goto	start	; ugrás a főprogram elejére
; megszakítás
	org	4
	movwf	wtemp
	swapf	status,w
	clrf	status
	movwf	stemp
	bcf	pir1,tmr2if	; flagtörlés
	sb	nstop
	goto	vissza	; nstop=0, áll, nincs mit tenni
	decfsz	voi_tml,f
	goto	vissza	;hangidő nem járt le
	decfsz	voi_tmh,f
	goto	vissza	; hangidő nem járt le
nextv			; nem áll, hangidő lejárt
	movf	voi_cnt,w	; hangsorszám alapján:
	call	pitchh
	movwf	nco1inch	; növekmény felső
	movf	voi_cnt,w	; hangsorszám alapján:
	call	pitchl
	movwf	nco1incl	; növekmény alsó
	movf	voi_cnt,w	; hangsorszám alapján:
	call	vlengthh
	movwf	voi_tmh		; hangidő felső
	movf	voi_cnt,w	; hangsorszám alapján:
	call	vlengthl
	movwf	voi_tml		; hangidő alsó
	incf	voi_cnt,f	; sorszám növelése a következő körre
	cjbel	voi_cnt,voices,sk_stop
	clrf	voi_cnt
	movl	voi_tmh,1
	movwf	voi_tml		;a megszakítás első futásakor tölti
	decfsz	repts,f
	goto	vissza
	bcf	nstop		;ha az utolsó volt, nstop=0
	goto	vissza		;megszakítás vége, a főprogram majd leállít

sk_stop
	movf	voi_tmh,w
	iorwf	voi_tml,w
	snz
	goto	nextv		; ha az új hangidő 0, jöjjön a következő!
	movf	voi_tml,f
	sz
	incf	voi_tmh,f	; ha tml nem nulla, tmh=tmh+1
vissza
	swapf	stemp,w
	movwf	status
	swapf	wtemp,f
	swapf	wtemp,w
	retfie
	
	#include <tables.inc>		
; a főprogram először inicializál	
start
	clrf	lata	; nincs tartás
	movlw	8
	movwf	option_reg	; belső felhúzók engedélyezhetők
	movwf	trisa	; csak RA3 bemenet
	movwf	wpua	; csak rajta van belső felhúzó
;	clrf	ansela	; nincs analóg bemenet
	movlw	249
	movwf	pr2	; fő osztó: 250; 1ms
	movl	nco1clk,1	; clk=fosc
	bsf	nco1con,7	; működhet, de nincs kimenete	 
	bcf	pir1,tmr2if
	bsf	pie1,tmr2ie
	bsf	intcon,peie
	bsf	intcon,gie	; t2 megszakítás engedélyezve, t2 áll
sloop
	snb	gomb		; csengőnél kimarad a gombvárás!
	goto	sloop		;gombra vár
	bsf	tart		;tartóáramkör indul
	movl	repts,times
	movl	voi_tmh,1
	movwf	voi_tml		;a megszakítás első futásakor tölti
	clrf	voi_cnt		;a nullás paramétereket
	bsf	nco1con,n1oe	;nco1 kimenet engedélyezve
	bsf	nstop		; nem áll = 1
	bsf	t2con,tmr2on	;mehet a ms-os óra, elindult
tloop
	snb	nstop
	goto	tloop		; nstop=0-ra vár (a megszakítástól)
	bcf	t2con,tmr2on	;timer2 óra megáll,nem jön megszakítás
	bcf	nco1con,n1oe	;nco1 kimenet engedélyezése megszűnik
	bcf	tart		; tartás megszűnik
	goto	sloop		; vissza a gombvárásra
				; csengőnél ez is más
	end
