; truman.asm: 411 utánzat 12F1840-re, 32 MHz belső óra. Egy összegkimenet
; ra5-ön. DAC is aktív, bemenete ra1, kimenete ra0. ra4 analóg bemenetnek
; használható. Az inícializálás beolvassa és átadja az atir szubrutinnak, 
; ami include fájlban van. Az atir dolga a konverzió újbóli indítása, ha 
; rendszeres beolvasásra van szükség, pl. valamelyik hang ciklusához 
; szinkronizálva. Szétágazó gombértelmezővel, az ágai include fájlban 
; vannak. Definíciói az összes változatot kielégítik, beleértve a két új 
; megszakítás változatot is.
; Azóta már pöfögésre is alkalmas egy másik include fájllal, de nem együtt.

	list p=12F1840
	list r=dec
	#include <p12F1840.inc>
	
	__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
	__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_HI & _LVP_OFF
	
	cblock	20h
	sreg0	; az ötbájtos léptetőregiszter alsó 4 bájtja
	sreg1
	sreg2
	sreg3
	ah1	; 1. hang fázisakkumulátor felső
	al1	; 1. hang fázisakkumulátor alsó
	bh1	; 1. hang frekvenciaregiszter felső
	bl1	; 1. hang frekvenciaregiszter alsó
	ah2
	al2
	bh2
	bl2
	ah3
	al3
	bh3
	bl3
	ah4
	al4
	all4	; 4. hang fázisakkumulátor legalsó
	bh4
	bl4
	bl4b	; bl4 háttér
	bll4	; 4. hang frekvenciaregiszter legalsó
	bll4b	; bll4 háttér
	ah5
	al5
	bh5
	bl5	; 5. hang frekvenciaregiszter alsó
	f1hi
	f1lo
	belso
	kulso
	ezvan
	f1lass
	f4lass
	modct1
	modct2
	dacbuf
	sndnct
	sndtcth
	sndtctl
	sndptr
	sndbuf
	endc
	cblock	0x70
	ah	; jelösszegző regiszter felső
	al	; jelösszegző regiszter alsó
	bh	; jelkomponens felső
	bl	; jelkomponens alsó
	ch	; segédregiszter felső
	cl	; segédregiszter alsó
	aux	; egybájtos segédregiszter
	flags	; jelzőbitek
	ven	; hang engedélyezés
	syn	; csatorna szinkronbitek
	stcnt	; az ADSR generátor számlálója
	sreg4	; az ötbájtos léptetőregiszter felső bájtja
	nmsk	; zajmaszk
	stc1	; segéd-állapotszámláló
	endc
#define	v1en	ven,4	; 1. hang engedélyező bitje
#define	v2en	ven,3
#define	v3en	ven,2
#define	v4en	ven,1
#define	v5en	ven,0	
#define	flag1	syn,4	; 1. hang szinkronbitje (ah1:al1 túlcsordulás)
#define	flag2	syn,3
#define	flag3	syn,2
#define	flag4	syn,1
#define	flag5	syn,0
#define	nnegy	syn,7	; "nem alapérték jött" jelzőbit	
#define	out	porta,2	; zajkimenet
#define	gomb	porta,3	; gomb vagy jumper bemenet
#define nyolc	flags,7	; fix 8,192 ms periódusidejű szinkronjel
#define	fut	flags,6	; ADSR ciklus van folyamatban
#define mute4	flags,5	; 4. csatorna külön némító (obsolete)
#define alap	flags,4	; a pöfögés alapon van 
#define csend	flags,3	; közös tiltóbit (obsolete)
#define oldbut	flags,2	; előző gombállapot
;#define most	flags,1	; az ADSR-t a fix frekvenciához szinkronizálná
#define most	flag1	; az ADSR-t az 1. csatornához szinkronizálja
#define	tilt	flags,0	; tiltja a gombfigyelést

; frekvenciaregiszterek rendes és kezdeti értékei (a többi az aktuális
; betét modulban van definiálva)
f2norm	equ	1107
f3norm	equ	1109
f4norm	equ	1066
;f5norm	equ	1132

f2kezd	equ	f2norm*3
f3kezd	equ	f3norm*3
f4kezd	equ	f4norm*3	
;f5kezd	equ	f5norm*3

#include <prlx.inc>	; parallax stílusú makrogyűjtemény

stc	macro		; és ami onnan kimaradt: set carry
	bsf	status,c
	endm
	
	org	0
	nop
	goto	start
	org	4
	#include <its2.inc>
; már csak inícializálni kell, aztán mehet!	
start
	banksel	porta
	movlw	1fh
	movwf	porta	; ra5 alacsony, a többi magas
	banksel	trisa
	movlw	0x1a	; ra0,2,5 kimenet
	movwf	trisa
	banksel	adcon0
	movlw	20h
	movwf	adcon1
	movlw	0ch
	movwf	adcon0
	bsf	adcon0,adon
	
	movlw	8
	banksel	wpua
	movwf	wpua	; felhúzó csak ra3-on
	banksel	ansela
	movlw	16	; csak ra4 analóg
	movwf	ansela	
	banksel	option_reg
	movlw	8	; nincs t0 bemenet
	movwf	option_reg
	banksel	osccon
	movlw	70h	; 8 MHz (x4 a config miatt=32)
	movwf	osccon
	banksel	adcon0
	bsf	adcon0,1	; konverzió indítása
adwt
	btfsc	adcon0,1
	goto	adwt
	banksel	0
	call	atir		; 4. csatorna beállítása
	banksel	apfcon
	movlw	3
	movwf	apfcon
	banksel	pr2
	movlw	255
	movwf	pr2
	banksel	pie1
	bsf	pie1,tmr2ie
	banksel	ccp1con
	movlw	1
	movwf	pstr1con	; ccp kimenet helye, polaritása
	movlw	0dh
	movwf	ccp1con
	banksel	daccon0
	clrf	daccon1
	movlw	0a4h
	movwf	daccon0
	banksel	t2con
	bsf	t2con,tmr2on	;indul a 31250 Hz-es megszakítás	
	banksel	porta
	clrf	flags
	bsf	csend
	bsf	oldbut
	clrf	all4	; új: a 4. csatotrna legalsója 0
	movlw	64
	movwf	bll4	; új: a 4. csatorna legalsója 64 (pöfögőhöz!)
	call	toltm	; kezdeti frekvenciák töltése
	movlw	2
	movwf	f4lass	; lassító regiszter kezdőértéke
	bsf	aux,2
	clrf	nmsk	; zaj nincs
	clrf	stcnt	; ADSR számláló nulla
	clrf	ven	; egyik hang sincs engedélyezve
	clrf	syn	; minden szinkronbit nulla
	bsf	intcon,peie
	bsf	intcon,gie	; innen él a t2 megszakítás
		
main
	btfss	flag4
	goto	main1
	goto	f4todo	; 4-es flag f4todo-t hívja (ld. betét)
main1
	btfss	flag2
	goto	main2
	goto	f2todo	; 2-es flag f2todo-t hívja
main2
	btfsc	tilt
	goto	main		
	btfss	most	; a "most" flag gomb szerint ugrik
	goto	main
	bcf	most
	movf	porta,w
	andlw	8
	movwf	ezvan	; ezvan.3=aktuális gomb
	movf	flags,w
	andlw	4	; (flags.2=régi gomb)
	iorwf	ezvan,w	; a kombinációjuk 4-gyel osztható
	brw
	btfsc	fut	; 0 volt, 0 lett, megy
	goto	egy1	; időzítő még megy, időzített teendőkre
	goto	egy0	; időzítő befejezte
	nop		; helykitöltés
	bcf	oldbut	; 1 volt, 0 lett: mostantól 0 az előző és
	goto	negy
	nop
	nop
	bsf	oldbut	; 0 volt,1 lett: mostantól 1 az előző és
	goto	harom	; indítás
	nop
	nop
	btfsc	fut	; 1 volt, 1 lett (áll)
	goto	ketto1	; időzítő még megy, időzített teeendők
	goto	ketto0	; időzítő áll, lehet lustálkodni
	goto	main
dum
	return

; lehetséges betétek
;	#include <adsr.inc>
;	#include <levego.inc>
;	#include <poff.inc>
;	#include <pofpof.inc>
;	#include <pofpofa.inc>
;	#include <pofpofb.inc>
;	#include <pofpofc.inc>
;	#include <mav.inc>
	#include <kakukk1.inc>

; jelalak táblázatok	
	org	800h
;	#include <tbl1a.inc>
;	#include <mavs1.inc>
;	#include <mavs23.inc>
;	#include <tbl2b.inc>
;	#include <tbl4b.inc>	; kürthöz való
;	#include <t2.inc>	; pofpofc-hez való!
;	#include <tbl5b.inc>
	#include <ka.inc>
	#include <kukk.inc>
	#include <kakukks.inc>
;	#include <msig.inc>
	end
	