; baba.asm: egyszólamú lejátszó
	list p=10f320
	list r=dec
	#include <p10f320.inc>
	#include <prlx.inc>
	
	__config	2486h
	
; ide kell beilleszteni a használható hangok növekményeit
	#include <sounds.inc>	; növekmény fájl
	
; ide kell beilleszteni az aktuális dallamfájlt (ezt lehet cserélni):
	#include <jjbaba.inc>	; dallamfájl Juhász János cikkéből
				; számított időzítésekkel
; változók
	cblock 40h
	wtemp		; w mentő
	stemp		; status mentő
	flags		; jelzőbitek
	sound_tmh	; hang időzítő felső
	sound_tml	; hang időzítő alsó
	sound_cnt	; hangok számlálója
	repts		; lejátszás számláló
	endc
	
#define nstop	flags,0	; flagtörlés egyben álló állapot
#define gomb	porta,3
#define tart	lata,0

	org	0
	clrf	intcon
	movlw	30h	; (2 M 40,500k 20)
	movwf	osccon	; 1 MHz
	goto	start	; ugrás a főprogram elejére
; megszakítás
	org	4
	movwf	wtemp		;mentés
	swapf	status,w
	clrf	status
	movwf	stemp
	bcf	pir1,tmr2if	; flagtörlés
	sb	nstop
	goto	vissza		; nstop=0, áll, nincs mit tenni
	decfsz	sound_tml,f
	goto	vissza		; hangidő nem járt le
	decfsz	sound_tmh,f
	goto	vissza		; hangidő nem járt le
nextv				; nem áll, hangidő lejárt
	movf	sound_cnt,w	; hangsorszám alapján:
	call	pitchh
	movwf	nco1inch	; növekmény felső
	movf	sound_cnt,w	; hangsorszám alapján:
	call	pitchl
	movwf	nco1incl	; növekmény alsó
	movf	sound_cnt,w	; hangsorszám alapján:
	call	lengthh
	movwf	sound_tmh	; hangidő felső
	movf	sound_cnt,w	; hangsorszám alapján:
	call	lengthl
	movwf	sound_tml	; hangidő alsó
	incf	sound_cnt,f	; sorszám növelése a következő körre
	cjbel	sound_cnt,sounds,sk_stop
	clrf	sound_cnt
	movl	sound_tmh,1
	movwf	sound_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	sound_tmh,w
	iorwf	sound_tml,w
	snz
	goto	nextv		; ha az új hangidő 0, jöjjön a következő!
	movf	sound_tml,f
	sz
	incf	sound_tmh,f	; ha tml nem nulla, tmh=tmh+1
vissza
	swapf	stemp,w		; visszaállítás
	movwf	status
	swapf	wtemp,f
	swapf	wtemp,w
	retfie
	
; a főprogram először inicializál	
start
	clrf	porta	; alapállapot, de egyelőre analóg bemenetek
	bsf	tart	; tartóáramkör majd csak trisa után indul!
	movlw	8
	movwf	option_reg	; belső felhúzók engedélyezhetők
	movwf	trisa	; csak RA3 bemenet, de ő sohasem analóg
	movwf	wpua	; csak rajta van belső felhúzó
	movlw	249
	movwf	pr2	; fő osztó: 250; 1ms
;	bsf	t2con,3		; normál fekvésben nincs!!!!!!!!!!!!!!!!!!!!!!
	movl	nco1clk,1	; nco1clk=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
	movl	repts,times
	movl	sound_tmh,1
	movwf	sound_tml	; a megszakítás első futásakor tölti
	clrf	sound_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
				
; táblázatok
	#include <tables.inc>		
	end
