	ifdef __12F629
		list	P=PIC12F629
		include  "P12F629.INC"
; A nyomógomb a GP3 lábon
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __12F675
		list	P=PIC12F675
		include  "P12F675.INC"
; A nyomógomb a GP3 lábon
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __12F683
		list	P=PIC12F683
		include  "P12F683.INC"
#define _BODEN_OFF	_BOD_OFF
; A nyomógomb a GP3 lábon
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __16F627
		list	P=PIC16F627
		include  "P16F627.INC"
#define	GPIO	PORTB
#define	TRISIO	TRISB
#define	_CPD_OFF	DATA_CP_OFF
#define	GPIE	RBIE
; A nyomógomb az RB7 lábon
; MCLR láb 10k ellenállással a Vdd -re húzva.
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __16F627A
		list	P=PIC16F627A
		include  "P16F627A.INC"
#define	GPIO	PORTB
#define	TRISIO	TRISB
#define	_CPD_OFF	DATA_CP_OFF
#define	GPIE	RBIE
; A nyomógomb az RB7 lábon
; MCLR láb 10k ellenállással a Vdd -re húzva.
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __16F628
		list	P=PIC16F628
		include  "P16F628.INC"
#define	GPIO	PORTB
#define	TRISIO	TRISB
#define	_CPD_OFF	DATA_CP_OFF
#define	GPIE	RBIE
; A nyomógomb az RB7 lábon
; MCLR láb 10k ellenállással a Vdd -re húzva.
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

	ifdef __16F628A
		list	P=PIC16F628A
		include  "P16F628A.INC"
#define	GPIO	PORTB
#define	TRISIO	TRISB
#define	_CPD_OFF	DATA_CP_OFF
#define	GPIE	RBIE
; A nyomógomb az RB7 lábon
; MCLR láb 10k ellenállással a Vdd -re húzva.
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	endif

;#define UseOsccal			; OSCCAL kompenzáció engedélyezése

#define egyes b'00010000' ; középső 1-es pont - GP4 / RB4 -es láb
#define kettes b'00000001' ; egyik kettes átló - GP0 / RB0 -ás láb
#define kettesb b'00000100' ; másik kettes átló - GP2 / RB2 -es láb
#define kettesc b'00000010' ; középső kettes vonal - GP1 / RB1 -es láb
#define harmas (egyes  | kettes)
#define harmasb (egyes | kettesb)
#define negyes (kettes | kettesb)
#define otos (kettes | kettes | egyes)
#define hatos (kettes | kettesb | kettesc)
#define hetes (kettes | kettesb | kettesc | egyes)
#define hangsz b'00100000' ; hangszóró a GP5 / RB5 -re kötve
#define hangszb d'5'

gpr0nobank	udata_shr
ck			res	1
delay1  	res	1
delay2  	res	1
delay3  	res	1
szam_0  	res	1
kikapcsolo	res	1
on_count 	res	1
periodusido res	1
timer 		res	1

PROG CODE
ResetVect
	goto	start
start:
	bsf		STATUS, RP0	
  ifdef UseOsccal
   ifdef OSCCAL
	call	OscCalData		
	movwf	OSCCAL		
   endif
  endif

  ifdef TRISB
	movlw	b'10001000'
  else
	movlw	b'00001000'
  endif
	movwf	TRISIO
	clrf	OPTION_REG		; Felhúzó ellenállások engedélyezése

  ifdef	WPU
	movlw	0xFF
	movwf	WPU
  endif

  ifdef	IOC					; Változásfigyelés beállítása
	movlw	b'00001000'	
	movwf	IOC
  endif

  ifdef	ANSEL
	clrf	ANSEL			; Digitális mód beállítása
  endif

	bcf		STATUS, RP0		;
	clrf	GPIO

  ifdef	CMCON				; Komparátorok kikapcsolása
	movlw	b'00000111'
	movwf	CMCON
  endif

  ifdef	ADCON0
	clrf	ADCON0			; A/D letiltása
  endif

	movlw	1 << GPIE		;
	movwf	INTCON			;
	bsf		T1CON,TMR1ON

 	btfsc	STATUS,NOT_PD	; 0 a harmadik bit?
 	goto	poweronreset	; ha bekapcsolás volt , akkor a reset rutinhoz ugrik


 	btfsc	kikapcsolo,0	; 0 a kinyomógomb alsó bit?
 	goto	kikapcs			; ha bit 1-es, akkor kikapcsol

 	call	delay100ms		; késleltetés a nyomógomp pergésének kiküszöbölésére
 	bsf		kikapcsolo,0	; ha a következő pár sorban jel érkezik a nyomógombtól, akkor kikapcsolás

 	movf	TMR1L,w			; timer olvasása a véletlenszám generálásához
 	movwf	timer			; az elsőnek olvasott valódi véletlenszám tárolása

	call	villogtat_1		; LED-ek villogtatása, csak a játék kredvéért :) + késleltetés + hang
	clrf	kikapcsolo		; innentől a gombnyomás nem vált ki kikapcsolást
	call	villogtat_1		; LED-ek villogtatása, csak a játék kredvéért :) + késleltetés + hang

	movf	timer,w			; előkészítés a véletlenszám osztásához
	call	osztas			; osztási maradék a szam_0 változóban
	movwf	GPIO			; a tárolt érték kijelzése, vagyis a LED-ek állapotának beállítása
  
	movlw	d'6'			; várakozás
	movwf	ck				; enyiszer fut le a ciklus
Cik01
	call	delay20s		; késleltetés
	decfsz	ck,1			; ck csökkentlése 0-ig
	goto	Cik01			; visszaugrás 2 sort, ha még nem nulla

	goto	kikapcs			; elég hosszú idő telt el, kikapcsolás

;*********************************************
beep_1:

							; hang előállítási rutin
 	movlw	d'200'			; 200 ciklusos lesz
 	movwf	delay1
bp1:
	movlw	d'80'			; ettől függ a periódusidő
	addwf	szam_0,w		; és persze a számtól is, hogy többféle hangmagasság legyen
	movwf	periodusido		; eltesszük a változóba az aktuális értéket
  

	swapf	delay1,w		; kiszámolunk egy másik lehetséges frekvenciát is
	andlw	d'15'			; ez nem a számtól, hanem külső ciklustól függ
	iorlw	d'80'
	;btfsc on_count,0
	btfsc	timer,6			; ez dönti el, hogy a két kiszámolt frekvencia közül melyik szóljon éppen

Cik02
	decfsz	periodusido,1	; periódusidő várakozó ciklusa
	goto	Cik02
	movlw	hangsz			; a hanszóró bitje a GPIO porton
	xorwf	GPIO,1			; hangszóró bit invertálása
	decfsz	delay1,f		; 0-ig fogunk számolni
	goto	bp1				; vissza a ciklus elejére

	bcf		GPIO,hangszb	; a végén a hangszóró kikapcsp (biztos, ami biztos alapon :))
	retlw	0				; visszatérés a függvényből

;********************************************
villogtat_1:

	movlw	d'11'			; ez egy ennyiszer lefutó ciklus lesz
	movwf	ck				; szám a cilusváltozóba

jmp1:

							; véletlenszám generálás (ez csak a villogás miatt kell)
	call	sorsol			; szám: 0...11 a szam_0 változóban
	movwf	GPIO			; LED-ek bekapcsolása

							;call delay100ms ; várakozás - ez volt korábban
	call	beep_1			;most hangot is adunk ki
	decfsz	ck,f			;ismétlés amíg a ciklusváltozó nullára csökken
	goto	jmp1			; vissza a ciklus elejére

	retlw	0				; visszatérés a függvémnyből

;***************************

poweronreset:

							; ide ugrik, ha a program resettel kezdett (pl.: elemcsre)
	clrf	on_count		;bekapcsolásszámláló nullázás
	movlw	hetes			; összes LED bekapcsolás (hetest dobtam! :))
	movwf	GPIO			; bekapcsoljuk a LED-eket

kikapcs:
	call	delay100ms		; késleltestés a gombpergés és hasonlók miatt
	call	beep_1			; hanszóró csippantás + még késleltetés
	incf	on_count,f		; bekapcsolás számolás (valójában kikapcsolást számolunk, de mostmár mindegy)
	clrf	kikapcsolo		; kinyomógomb nullázása, hiszen mindjárt kikapcsolunk
	clrf	GPIO			; kimenetetk nullázása, LED-ek és a hangszóró kikapcsolása
	movf	GPIO,w
	sleep					; alvó üzemmód, kikapcsolás a következő reset-ig
	nop

;***********************************
sorsol:

							; véletlenszám generálás
	movf	TMR1L,w			; a beépített TIMER értékét olvassuk véletlenszámnak
  
osztas:

	movwf	szam_0
	movlw	d'12'			;12-vel fogunk osztani
	subwf	szam_0,w		; levonjuk az osztót
	BTFSC	STATUS,C		; addig amíg sz osztandó el nem fogy
	goto	osztas			; vissza a ciklus elejére, ha az osztandó még nem 0	
							; az osztási maradék a szam_0 változóba került	
	movf	szam_0,w		; w-ban (0...11)
							; itt valósítjuk a meg a szám- LED-ek állapota konverziót
	addwf	PCL,f
	retlw	egyes
	retlw	kettes
	retlw	harmas
	retlw	negyes
	retlw	otos
	retlw	hatos
	retlw	egyes
	retlw	kettesb
	retlw	harmasb
	retlw	negyes
	retlw	otos
	retlw	hatos

;********************************
delay20s:

							 ; ez az egyik késleltető ciklus, semmi mást nem csinál, csak futnak a ciklusok és közbentelik az idő
	clrf	delay3
	goto	d2

delay100ms:

							; 100ms késleltetés
	movlw	1
	movwf	delay3
d2:
	movlw	d'70'
	movwf	delay2
d1:

	clrf	delay1
	decfsz	delay1,f
	goto 	$-1  

	decfsz	delay2,f
	goto	d1
	decfsz	delay3,f
	goto	d2

	retlw	0

;**********************************************

  ifdef	OSCCAL
OSCVAL	CODE 0x3ff
OscCalData
	retlw	0x43
  endif

	end

