; Teljesen adaptív pöffpöff mindig néma frekvenciákkal, A/D bemenettel.
; A teljes adaptivitás azt jelenti, hogy a frekvencia növekedésével a
; felfutás és a lefutás is arányosan rövidül. (A közepe korábban is.) 
; Gombtól függetlenül fut, a 4. hang túlcsordulása indítja. A gombbal
; üzemmód váltható. A régi felfogásban a pöfögés, ha összeér, átveszi
; az ADSR idő tükörképét és ezzel az aktuális hangerőt, de emiatt a
; pöff elmászkál. Ebben a változatban már két számláló működik. Az új
; segédszámláló egy új pöff indulásakor átveszi a régi értékét és a két
; számláló együtt fut a segéd nullázódásáig. A két amplitúdó összeadó-
; dik, 31-nél vágással. Így megszűnt a változó fáziscsúszás, és a bur-
; kolónak sem kell szimmetrikusnak maradnia. Az a baj, hogy a burkoló
; kapcsolófrekvenciája hallható, és több zajom nincs, hogy elnyomja.

; Változás pofpofb-hez képest: hárombájtos f4 adja a pöfögés ütemét,
; életre kelt az induláskori rápöffentés. A sima átmenet érdekében 
; megkétszerezett f1, az ADSR generátor felezi. Az összeérés korrekt
; kezelése segédszámlálóval. Átszervezett időzítések.

f1felf	equ	2048	; kb.1 kHz, burkolóhoz megfelezem
f1kezd	equ	4096	; kb. 2 kHz, burkolóhoz megfelezem
f1norm	equ	768	; x3/8, mert azt könnyű arányosan rövidíteni
f1las	equ	384	; f1norm fele, légsűrítő hangnak eladva
felfut	equ	64	; ennyi lépésből áll a teljes burkoló
durva	equ	0f0h	; max noise, minden a max zajjal megy
;normal	equ	10h	; medium noise,a pöfögő nem használja
;halk	equ	8h	; low noise, a pöfögő nem használja
zeno	equ	0	; zero noise, minden nulla zajjal áll.
f5kezd	equ	1050	; értéke közömbös
f5norm	equ	1050	; értéke közömbös
alja	equ	179	; pöffsebesség induló értéke

egy0		; stabil elindult állapot, csak atir fut, neki muszáj
	call	atir
	goto	main
egy1		; tranziens induló állapot, ebben marad a pöff végéig,
		; mert a ketto1 (tranziens leálló) is ide mutat
	call	atir		; ez specifikus, extra változat!
	decf	f4lass,f
	sb	f4lass,0
	goto	main
	csbl	stcnt,31	; stcnt<31 az ereszkedő szakaszon
	call	f1fel		; emelkedő szakasz: direkt összeadás
	csal	stcnt,32
	call	f1le		; ereszkedő szakasz: x3/8 hozzáadása
	decf	stcnt,f		; stcnt új értékéből amplitúdó
	movf	stc1,f
	sz
	decf	stc1,f
	movf	stcnt,w
	sublw	felfut-1
	addlw	low adsrt1
	movlp	high adsrt1&0x7f
	callw
	movwf	dacbuf
	movf	stc1,w
	sublw	felfut-1
	addlw	low adsrt1
	movlp	high adsrt1&0x7f
	callw
	addwf	dacbuf,f
	cjbl	dacbuf,32,ennyi
	movlw	31
	movwf	dacbuf
ennyi
	movf	dacbuf,w
	banksel	daccon1
	movwf	daccon1
	pagesel	0
	banksel	porta
; a két vizsgálat között van a feszültségfüggő időzítés:
	movf	stcnt,w
	xorlw	felfut/2+3
	snz
	call	nyujt	; ami feszültségcsökkenésre nyújt
	movf	stcnt,w
	xorlw	felfut/2-3
	sz
	goto	marad
	sb	nnegy
	call	toltl
	snb	nnegy
	call	toltn	; ez adja a lefutás meredekségét
	goto	main
marad
	movf	stcnt,f
	sz
	goto	main
	bcf	fut
	movlw	zeno
	call	toltm
	movwf	nmsk
ketto0		; stabil leállt állapot (gomb szerint)
	goto	egy0
ketto1		; tranziens leálló állapot (gomb szerint)
	
	goto	egy1
harom		; leállítás kezdete
	goto	main
negy		; indítás kezdete
	goto	main
negy1
	call	toltff
	movlw	durva
	movwf	nmsk
	movf	stcnt,w
	movwf	stc1
	movlw	felfut
	movwf	stcnt
;	sublw	felfut
;	movwf	stcnt
	banksel	porta
	bsf	fut
	goto	main1
; f4-gyel ütemezett pöfögés: f4 számláló túlcsordulása adja a pöfögés 
; ütemét, miközben az összeadandó értéke az A/D-től függ egy táblázaton
; keresztül. Az adat f1 ütemében frissül, így a felbontás finomabb lehet
; az f4 ütemében frissüléssel elérhetőnél. Ez itt elindít egy pöfföt f4
; minden túlcsordulásakor.
f4todo
	bcf	flag4
	goto	negy1
; f2-vel lehetne sűríteni az analóg mintavételt, hogy a PWM tápot is
; használni lehessen a pöfögés ütemének meghatározására. Ehelyett a
; régi f1 kétszeresével történik az analóg mintavétel, f2-nek nincs
; dolga. Így ebben a változatban is elég f1-et lecserélni.
f2todo
	bcf	flag2	; így nem tesz fölösleges köröket
	goto	main2
toltff		; felfutáskori frekvencia paraméterek töltése
	movlw	high f1felf
	movwf	f1hi
	movlw	low f1felf
	movwf	f1lo
	return
toltn		; normál frekvencia paraméterek töltése
	movlw	high f1norm
	movwf	f1hi
	movlw	low f1norm
	movwf	f1lo
	return
toltl		; lassú frekvencia paraméterek töltése
	movlw	high f1las
	movwf	f1hi
	movlw	low f1las
	movwf	f1lo
	return
toltm		; induló frekvencia paraméterek töltése, f4-et tilos!
	movlw	high f1kezd
	movwf	f1hi
	movlw	low f1kezd
	movwf	f1lo
	movlw	high f2kezd
	movwf	bh2
	movlw	low f2kezd
	movwf	bl2
	movlw	high f3kezd
	movwf	bh3
	movlw	low f3kezd
	movwf	bl3
	movlw	high f5kezd
	movwf	bh5
	movlw	low f5kezd
	movwf	bl5
	return

atir			; ez ad értéket f4-nek és hagy ch,cl-t nyujt-nak
	btfss	pir1,adif
	return		; nem fut, ha nincs kész A/D eredmény
	bcf	pir1,adif
	clrf	ch		; fontos, mert a nyújtó belepiszkíthat!
	banksel	adresh
	clc
	movf	adresh,w
	movwf	cl
	rrf	cl,w
	banksel	0
	sb	gomb
	iorlw	128	; régi és új tábla felső közül választ
	movlp	high tbl4h&0x7f
;	addlw	low tbl4h
	callw		; kikeresett egyet a 128-ból
	movwf	bl4b
	clc
	rrf	cl,w
	sb	gomb
	iorlw	128	; ... alsó...
	movlp	high tbl4l&0x7f
	callw
	movwf	bll4b
	banksel	adcon0
	bsf	adcon0,1	; új konverzió indul
	banksel	0
	bcf	nnegy	; nnegy = a talált érték nem a minimum
	movf	bl4b,f
	sz
	bsf	nnegy
	csbel	bll4b,alja 
	bsf	nnegy		
	movf	bll4b,w
	bcf	intcon,gie
	movwf	bll4	
	movf	bl4b,w
	movwf	bl4
	clrf	bh4
	bsf	intcon,gie
	pagesel	atir
; azonnali rápöffentő, most már működik, mert a semmittevő ütemek is
; hívják az atir szubrutint! (az atir rövidebb lett, a vége egy1-be
; került).
	jb	nnegy,sk1
	bsf	alap	; "most épp nyugalomban" bit
	return
sk1
	sb	alap
	return
; ezt kell tenni, amikor elindulást észlel:
	bcf	alap	; flagtörlés
	movf	stcnt,f
	sz
	return	; ha van folyamatban pöff, semmit
	movlw	0xff
	bcf	intcon,gie
	movwf	ah4	; közel a flag4
	movwf	al4
	bsf	intcon,gie
	return
; adaptivitás irányonként és középen:	
f1fel
	movf	cl,w
f1com
	addwf	f1lo,w
	bcf	intcon,gie
	movwf	bl1
	movf	ch,w
	addwfc	f1hi,w
	movwf	bh1
	bsf	intcon,gie
	return
f1le
	clc
	rrf	cl,w
	addwfc	cl,w
	clc
	rrf	wreg,f
	clc
	rrf	wreg,f
	goto	f1com

; a középső ütemek hossza csak az analóg értéktől függ. A minimális b1
; 80h (128),a maximális  
nyujt
	movf	cl,w	; ez a bemenőfeszültség
	andlw	0f0h
	sz
	goto	ezaz
	movlw	10h	; ha 10h-nál kisebb, az 10h-nak számít
	movwf	cl
ezaz
	clrf	ch
	rlf	cl,f
	rlf	ch,f
	rlf	cl,f
	rlf	ch,f
	rlf	cl,f
	rlf	ch,f	; megszorozta 8-cal
	movlw	0f8h	; kidobta a belépőket
	andwf	cl,f
	btfsc	ch,2
	clrf	cl
	movlw	4	; 10h volt egykor
	btfsc	ch,2
	movwf	ch
	movf	ch,w
	bcf	intcon,gie
	movwf	bh1
	movf	cl,w
	movwf	bl1
	bsf	intcon,gie
	return
; ennek a változatnak nem kell adtbl, mert tbl4-et használja!
	
	ORG	300H
; Ez az indulástáblázat. Kb. szimmetrikus, középen két egyforma értékkel.
; A közepét lelessíthatom, ha hosszabb platót akarok. Minden más
; trükközés is az 1-es freki manipulálásával lehetséges. Az elejétől
; járja be, mert megfordítom az amúgy fogyó pointert.
adsrt1
	dt	1,2,3,4,5,6,7,8		; 
	dt	9,10,11,12,13,14,15,16	; 
	dt	17,18,19,20,21,22,23,24	; 
	dt	25,26,27,28,29,30,31,31	; 
	dt	30,29,28,27,26,25,24,23	; 
	dt	22,21,20,19,18,17,16,15
	dt	14,13,12,11,10,9,8,7
	dt	6,5,4,3,2,1,0,0
	
	
	
	

