; tru1704.asm: portolás 16F1704-re

; truman.asm: 411 utánzat 12F1840-re, 32 MHz belső óra. Egy összegkimenet
; ra5-ön. DAC is aktív, bemenete ra1, kimenete ra0 (vagy fordítva?) . 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. az első 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=16F1704
	list r=dec
	#include <p16F1704.inc>
	
	__CONFIG _CONFIG1, _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
	__CONFIG _CONFIG2, _WRT_OFF & _ZCDDIS_ON& _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
	adsrdiv	; adsr osztó
	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, csak a zaj használhatja!!!
	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	adsren	syn,7
#define adsrf	syn,5	
#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	Nout	portc,1	; 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álná
#define	tilt	flags,0

; 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

f2kezd	equ	f2norm*2
f3kezd	equ	f3norm*2
f4kezd	equ	f4norm

adiv0	equ	8	


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

stc	macro		; és ami onnan kimaradt: set carry
	bsf	status,c
	endm
	
	org	0
	nop
	pagesel 0
	goto	start
	org	4
	#include <its2.inc>
; már csak inícializálni kell, aztán mehet!	
start
	banksel	LATA
	CLRF	LATA
	CLRF	LATC
	banksel	trisa
	movlw	0x3B	; ra,2,5 kimenet
	movwf	trisa
	MOVLW	0X2d
	MOVWF	TRISC
	BANKSEL	ANSELA
	MOVLW	0X37
	MOVWF	ANSELA
	MOVLW	0X2D
	MOVWF	ANSELC
	MOVLW	8
	MOVWF	WPUA
	CLRF	WPUC
	BANKSEL	OPTION_REG
	BCF	OPTION_REG,7
	BANKSEL	ODCONA
	CLRF	ODCONA
	CLRF	ODCONC
	BANKSEL	PPSLOCK
	MOVLW	0X55
	MOVWF	PPSLOCK
	MOVLW	0XAA
	MOVWF	PPSLOCK
	BCF	PPSLOCK,PPSLOCKED
	BANKSEL	RC4PPS
	MOVLW	0X0E
	MOVWF	RC4PPS
	BANKSEL	PPSLOCK
	MOVLW	0X55
	MOVWF	PPSLOCK
	MOVLW	0XAA
	MOVWF	PPSLOCK
	BSF	PPSLOCK,PPSLOCKED
	BANKSEL	OSCCON
	MOVLW	0X70
	MOVWF	OSCCON
	CLRF	OSCSTAT
	CLRF	OSCTUNE
	BANKSEL	DAC1CON0
	CLRF	DAC1CON1
	MOVLW	0X94
	MOVWF	DAC1CON0
	banksel	adcon0
	movlw	0X24
	movwf	adcon1
	movlw	11h
	movwf	adcon0
	CLRF	ADCON2
	bsf	adcon0,adon
	banksel	osccon
	movlw	70h	; 8 MHz (x4 a config miatt=32)
	movwf	osccon
	BANKSEL	OPA1CON
	MOVLW	0XD2
	MOVWF	OPA1CON
	BANKSEL	OPA2CON
	MOVLW	0XD0
	MOVWF	OPA2CON
	
	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, vagy üres
	banksel	pwm3con
	movlw	0x80
	movwf	pwm3con
	clrf	pwm3dch
	clrf	pwm3dcl
	banksel	t2con
	clrf	t2con
	movlw	255
	movwf	pr2
	banksel	pie1
	bsf	pie1,tmr2ie
	banksel	t2con
	bsf	t2con,tmr2on	;indul a 31250 Hz-es megszakítás	
	banksel	porta
	clrf	flags
	clrf	ven
	bsf	oldbut
	clrf	all4	; új: a 4. csatorna legalsója 0
;	movlw	64
;	movwf	bll4	; új: a 4. csatorna legalsója 64 (pöfögőhöz!)
	clrf	bll4	; az összes többihez
	call	toltm	; kezdeti frekvenciák töltése
	movlw	2
	movwf	f4lass	; lassító regiszter kezdőértéke
	bsf	aux,2	; hogy biztosan ne legyen mind 0
	clrf	nmsk	; zaj nincs
	clrf	stcnt	; ADSR számláló nulla
	clrf	ven	; egyik hang sincs engedélyezve
	clrf	syn	; minden szinkronbit nulla
	movlw	adiv0
	movwf	adsrdiv
	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

; (1704-hez még nem) használható viselkedésleíró fájlok
;	#include <adsr.inc>
;	#include <levego.inc>
;	#include <poff.inc>
;	#include <pofpofc.inc>
; már tényleg lehetséges viselkedésleíró fájlok:
	#include <mav.inc>
;	#include <kakukk4.inc>	; az 1, 2, 3, ide nem jó!

; jelalak táblázatok	
	org	800h
;	#include <f530_8.inc>	; fütty fő csatorna 1/7
;	#include <f529_4.inc>	; fütty 528 és 529 Hz	1/3
;	#include <f508_4.inc>	; fütty 508 Hz 1/3
;	#include <f540_4.inc>	; fütty 540 Hz 1/3
;	#include <tbl1a.inc>	; fütty változat
;	#include <tbl2b.inc>	; fütty változat
;	#include <tbl4b.inc>	; fütty változat	
;	#include <tbl5b.inc>	; fütty változat
;	#include <t2.inc>	; pofpofc-hez való!
	#include <mavs1.inc>	; MÁV szignál, 1. csatorna (1 szólam)
	#include <mavs23.inc>	; MÁV szignál,2. és 3.csatorna (2 szólam)
;	#include <ka.inc>	; kakukk 1. hangja
;	#include <kukk.inc>	; kakukk 2. hangja
; 3 csatornás dallamleírók
	#include <msig.inc>	; MÁV szignál csökkentett hangerővel
;	#include <kakukks4.inc> ; szabvány kakukk a "klón" alapján,
				; az angolhoz hasonló burkolóval.
	end
	