;*******************************************************************************
;   FSK demodulátor: 135600Hz -- HGA22
;Lábkiosztás:
;	PIN1	Vdd	+5V
;	PIN2	RA5	CLKIN (25.175MHz küls? oszc. kell?!)
;	PIN3	RA4	(vételt jelz? LED?)
;	PIN4	RA3	10k+Vcc	/MCLR	-Vpp
;	PIN5	RA2	PWM out	~138 kHz
;	PIN6	RA1	FSK be: 135600 Hz	-ICSPCLK
;	PIN7	RA0	TX(FSK be: 135600 Hz)	-ICSPDAT
;	PIN8	Vss	GND
 ;**********************************************************************
 ; Timer0 --> 
  ; Timer1 --> (PWM-el modulált) hullámhossz méréshez
   ; Timer2 --> 5msec (200 baudrate)
; USART és PWM önállóan megy.
   
; Assembly source line config statements
;    LIST    P=P12F1501
;#include "p12f1501.inc"
;
;; CONFIG1 -- PIC12F1501-hez
;; __config 0xFFE7
; __CONFIG _CONFIG1, _FOSC_ECH & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF
;; CONFIG2
;; __config 0xDFFF
; __CONFIG _CONFIG2, _WRT_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF



    LIST	P=PIC12LF1572	; lista megadása
    RADIX	hex		; alapértelmezet számrendszer megadása
    #include "p12LF1572.inc"         ;Ez a három sor az alap. 
    
; CONFIG1
; __config 0x3984
; __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
; __config 0x3987
    __CONFIG _CONFIG1, _FOSC_ECH & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
; CONFIG2
; __config 0x1EFF
    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOREN_OFF & _LVP_OFF   
;-------------------------------------------------------------------------------

 errorlevel	-302

;#define	ICSPDAT		;RA0	<7>
#define	TX	0		;RA0	<7>
#define	Jelbe	PORTA,1		;RA1	<6>
#define	FSKbe	1		;RA1	<6>
 ;#define	ICSPCLK		;RA1	<6>
#define	PWMki	2		;RA2	<5>
;#define	_MCLR		;RA3	<4>
#define	LED	4		;RA4	<3> '1'-startbit, '0'-üzenet vége
;#define	CLKIN	5	;RA5	<2> (küls? órajel)
#define	StartKar    0x68    ;idöüzenet start karakter - HGA22
#define	StopKar	0x16	    ;üzenet végi stop karakter - HGA22
#define TimeHossz   0x0A
#define	Fosc	d'25175000'    ;külsö órajel
#define	PWMfrek	d'138324'	; -fölsö keverés 138000Hz
#define	Hfrek1	d'135600'-d'170'    ;135430Hz
#define	Hfrek0	d'135600'+d'170'    ;135770Hz
	;Fordító hisztizik a sok számítás miatt!?
		    ;Timer1 elöosztás miatt /8
;#define	Hdem1	Fosc/(PWMfrek-Hfrek1)/8	;8699/8=1087(.38)	;9795.7/8=1224(.46)
;#define	Hdem0	Fosc/(PWMfrek-Hfrek0)/8	;9857/8=1232(.14)   ;11289.2/8=1411.(15)
#define	Hdem1	d'272'	;d'1087'	;d'4348'	;Fosc*4!??  d'1087'	;d'1224'
#define	Hdem0	d'308'	;d'1232'	;d'4928'	;   --"--   d'1232'	;d'1411'
#define	tures   d'4'	;d'32'	;d'256'	;   --"--   d'32'
#define	Hsz	d'4'	;mért hullámok száma (indulásnál+1 !!)
#define Zmin    Hsz*(Hdem1-tures)	;d'1032'	;d'4312'    ;4768
#define	ZminH	Zmin/d'256'		;0x04	;0x10	;0x12
#define	ZminL	Zmin-ZminH*d'256'	;0x30	;0xD8	;0xA0
#define Zmax    Hsz*(Hdem0+tures)	;d'1248'    ;d'4952'    ;5772
#define ZmaxH   Zmax/d'256'		;0x04	;0x13	;0x16
#define ZmaxL   Zmax-ZmaxH*d'256'	;0xE0	;0x58	;0x8C
#define bitV    (Zmax+Zmin)/2		;d'1140'    ;d'4632'    ;5270
#define bitVH   bitV/d'256'		;0x04	;0x12	;0x14
#define bitVL   bitV-bitVH*d'256'	;0x74	;0x18	;0x96
#define T5000us	d'5000'
#define T5000	d'256'-(T5000us*(Fosc/d'4'/d'256'))/d'1000000' ;Timer0 5msec -> elöosztó és Fosc/4
#define T3500us	d'3500'
#define T3500	d'256'-(T3500us*(Fosc/d'4'/d'256'))/d'1000000' ;Timer0 3.5msec -> elöosztó és Fosc/4

;                     A változók számára lefoglalt memóriák    
Valt	udata	0x020
;T1H	res 1	;Timer1 3. bájt
;T1HH	res 1	;Timer1 4. bájt
REGBY	res 1	;osztó_segéd
IDX16_H	res 1	;osztás belsö
IDX16	res 1	;osztás belsö
TvalH	res 1	;mért ( idö )
TvalL	res 1
;TbitL	res 1	;Hsz számu hullám min. ideje
;TbitV	res 1	; 0-1 váltó
;TbitH	res 1	;Hsz számu hullám max. ideje
Vbitsz	res 1	;vett bájt bitszámláló	
Vbajt	res 1	;vett bájt	
Vbajtsz	res 1	;vett bájt számláló	
	
;TXregX	res 1	;3 bájt az X-t?l
;TXregX1	res 1
;TXregX2	res 1
;TXregZ	res 1	;3 bájt az Z-t?l
;TXregZ1	res 1
;TXregZ2	res 1
;bitsz	res 1
;bajtsz	res 1

REGA0	res 1	;lsb
REGA1	res 1
REGA2	res 1
REGA3	res 1	;;msb	dec.'127' fölött a szám negativ!
REGB0	res 1
REGB1	res 1
REGB2	res 1
REGB3	res 1
REGC0	res 1
REGC1	res 1
REGC2	res 1
REGC3	res 1
ADAT    res d'48'   ;normál üzi 17 kar. 
;subMód	res 1
DSIGN	res 1
DIGIT1	res 1
;;DIGIT2	res 1
;;DIGIT3	res 1
;;DIGIT4	res 1
;;DIGIT5	res 1
;;DIGIT6	res 1
;;DIGIT7	res 1
DIGIT0	res 1
;MTEMP   res 1
;MCOUNT	res 1
;DCOUNT	res 1

	
INT_VAR		UDATA_SHR   ;	0x070
Jelsz	res 1
B200	res 1	;ha bit0=1 5msec letelt, következö bitet lehet olvasni
		;ha bit1=1 érvényes hullam -> TMR1-ben
		;ha bit2= "0" v. "1"-es bit érkezett
		;ha bit3=1 
adatV	res 1
d1	res 1   ;várakozáshoz
d2	res 1  
KAR	res 1
CIKLUS	res 1
MTEMP   res 1
MCOUNT	res 1
DCOUNT	res 1
;Tcs	res 1
;STATUS_TEMP	res 1
;W_TEMP	res 1

;-------------------------------------------------------------------------------    
    org	    0x0000	; program memória kezdöcíme    
	NOP
        goto	KEZD
    
    
    org	    0x0004      ;Megszakítás címe
	banksel PORTA
	nop
	btfss	INTCON,IOCIE
;	btfsc	B200,0	;FSK figyelés engedélyezve?
	goto	Mtmr
	btfsc	INTCON,IOCIF	;FSKbe ;FSK jel=1
	goto	FSK
;	goto	Ki_isr

Mtmr:	btfsc	INTCON,TMR0IF
	goto	TMR_0
	goto	Ki_isr
TMR_0:	;5msec lejárt következö bit olvasható
	movlw	T5000
	movwf	TMR0
	bcf 	INTCON,TMR0IF
	banksel IOCAF
	movlw	0xff
	xorwf	IOCAF, W
	andwf	IOCAF, F	;IOCIF bitet igy kell törölni!!!
	banksel PORTA
	bcf	INTCON,IOCIF    ;holtid?ben érkezett FSKbe figyelmen kivül
	bsf	INTCON,IOCIE	;FSKbe eng.
	goto	Ki_isr
	
FSK:
	banksel IOCAF
	movlw 0xff
	xorwf IOCAF, W
	andwf IOCAF, F	;IOCIF bitet igy kell törölni!!!
	banksel PORTA
	bcf    INTCON,IOCIF    ;FSKbe
;	banksel T1CON
	btfss	T1CON,TMR1ON
    	bsf	T1CON,TMR1ON  ;timer1 indul
	decfsz	Jelsz,f
            goto    Ki_isr
	    movlw   Hsz+1
	    movwf   Jelsz   ;csak biztonság kedvéért
	bsf	B200,1
	movf	TMR1L,w
	movwf	TvalL
	movf	TMR1H,w
	movwf	TvalH
	clrf	TMR1L
	clrf	TMR1H
;	call	T1teszt
	call	BitKi

;	btfss	B200,2	;csak teszt
;	goto	bitTeszt0
;    MOVLW "1"
;    CALL SEND_UART1
;    goto	Ki_isr
;bitTeszt0:
;    MOVLW "0"
;   CALL SEND_UART1
;   goto	Ki_isr

Ki_isr:	retfie
;-------------------------------------------------------------------------------
KEZD:
;    movlw   T5000    ;d'134' 5msec
;    movlw   T3500    ;d'170' 3,5msec
    call    delay_4	;4msec
;    call    delay_1u	;1.75usec
;    call    delay_100u
;    call    delay_10u
    call	INICIALIZALAS 
    call    delay_10	;10msec
    
    call    TX_test ;Teszt, 1bájt -> TX (analizátoron NEM látható, de müködik)
    call    delay_4	;4msec
    call    TX_test
    goto    Indul


Rendez:
;	decf	FSR0,f
;	movf	INDF0,W
;	incf	FSR0,f
;FSR0 0x6F fölé NEM mehet! - IDE!!!
	movlw	ADAT+d'48'  ;48 bajt lefoglalva
	subwf	FSR0,w
	btfsc	STATUS,C
	goto	bitHiba
;2. (3.) bájt az adathossz
	movf	Vbajtsz,W
	sublw	0x02
	btfss	STATUS,Z
	goto	Rendez0
;	movf	Vbajt,W
;	sublw	TimeHossz
;	btfss	STATUS,Z
;	goto	Rendez0
	movf	Vbajt,W	    ;ha idö 0x0A
	addlw	ADAT+d'6'   ;2+ 3. ism, +0x68+idöadatok+chekszum+(0x16)
	movwf	adatV
Rendez0:
	movf	adatV,W
	subwf	FSR0,W
;	movf	Vbajt,W
;	sublw	StopKar	;HGA22 STOP karakter: 0x16
	btfsc	STATUS,Z
	goto	ADATki
	goto	OlvasBajt

    
ADATki:
;   movf    FSR0,W
;   movwf   adatV
    movlw   ADAT
    movwf   FSR0
ATx:	;vett adatok Tx-re
	movf    INDF0,W	
	CALL    SEND_UART1
	incf    FSR0,f
	decfsz  Vbajtsz,f
	goto	ATx
    call    delay_4	;4msec
IdoTx:	;ha idö: '0x68' az elsö karakter - kibontás ide!!!
	movlw	ADAT
	movwf	FSR0
	movf	INDF0,W
	sublw	StartKar
	btfss	STATUS,Z
	goto    Indul
	movlw	ADAT+1
	movwf	FSR0
	movf	INDF0,W
	sublw	0x0A
	btfss	STATUS,Z
	goto    Indul
;idö dekódolása és Tx:	
	movlw	ADAT+d'13'
	movwf	FSR0
	movf    INDF0,W	; év a W-ben
	andlw	0x7F	;csak az utolsó 7 bit!
	movwf	REGA0
	call	bin2dec	;
	movlw	'2'
	CALL    SEND_UART1
	movlw	'0'
	CALL    SEND_UART1
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	'_'
	CALL    SEND_UART1
	
	decf	FSR0,f
	movf    INDF0,W	; hónap a W-ben
	andlw	0x0F	;csak az utolsó 4 bit!
	movwf	REGA0
	call	bin2dec	;
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	'_'
	CALL    SEND_UART1
	
	decf	FSR0,f
	movf    INDF0,W	; nap a W-ben
	andlw	0x1F	;csak az utolsó 5 bit! (föls? 3 bit a hét napja)
	movwf	REGA0
	call	bin2dec	;
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	'_'
	CALL    SEND_UART1
	
	decf	FSR0,f
	movf    INDF0,W	; óra a W-ben
	andlw	0x1F	;csak az utolsó 5 bit!
	movwf	REGA0
	call	bin2dec	;
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	':'
	CALL    SEND_UART1
	
	decf	FSR0,f
	movf    INDF0,W	; perc a W-ben
	andlw	0x3F	;csak az utolsó 6 bit!
	movwf	REGA0
	call	bin2dec	;
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	':'
	CALL    SEND_UART1
	
	decf	FSR0,f
	movf    INDF0,W	; másodperc a W-ben
;	andlw	0x3F	;csak az els? 6 bit!
	movwf	REGA0
	rrf	REGA0,f
	rrf	REGA0,f
	call	bin2dec	;
	movf	DIGIT1,W
	addlw	0x30
	CALL    SEND_UART1
	movf	DIGIT0,W
	addlw	0x30
	CALL    SEND_UART1
	movlw	d'13'	    ;sorvég 'CR'
	CALL    SEND_UART1
	
	
	goto	Indul	;új olvasás
	
bin2dec:
;	clrf	MTEMP		;Reset sign flag
;     	call	absa		;Make REGA positive
;      	skpnc
;      	return			;Overflow

;      	call	clrdig		;Clear all digits
	clrf	DIGIT1
	clrf	DIGIT0
      	movlw	D'8'		;d'32'	;Loop counter
      	movwf	MCOUNT
b2dloop:
	rlf	REGA0,f		;Shift msb into carry
;      	rlf	REGA1,f
;      	rlf	REGA2,f
;      	rlf	REGA3,f
      	movlw	DIGIT0
      	movwf	FSR1		;Pointer to digits
      	movlw	d'2'		;D'10'	;10 digits to do
      	movwf	DCOUNT
adjlp:	rlf	INDF1,f		;Shift digit and carry 1 bit left
      	movlw	d'10'
      	subwf	INDF1,w		;Check and adjust for decimal overflow
      	skpnc
      	movwf	INDF1

      	decf	FSR1,f		;Next digit
      	decfsz	DCOUNT,f
      	goto	adjlp

      	decfsz	MCOUNT,f	;Next bit
      	goto	b2dloop

      	btfsc	MTEMP,0		;Check sign
      	bsf	DSIGN,0		;Negative
      	clrc
      	return




Indul:    
bitHiba:    ;mindent elölröl kezdünk
    banksel PORTA
    clrf    Vbajt
	bcf PORTA,LED
	call    delay_10u
        bsf PORTA,LED

    movlw   ADAT
    movwf   FSR0
	clrf	Vbajtsz
	goto	OlvasBajt

OlvasBajt:
Bajt1:
    bcf	T1CON,TMR1ON  ;timer1 leáll
    clrf	TMR1H
    clrf	TMR1L
    ;bcf   T2CON,TMR2ON    ;TMR2 leáll
	movlw	Hsz+1	;mért hullámok száma
	movwf	Jelsz
	clrf	B200	;jelzök..
	movlw	d'8'	;bitszám+1
	movwf	Vbitsz
	bcf	INTCON,TMR0IE
	bcf	INTCON,TMR0IF	;TMR0 tilt.
	clrf	TMR0
;	bcf	INTCON,IOCIF
	banksel IOCAF
	movlw 0xff
	xorwf IOCAF, W
	andwf IOCAF, F	;IOCIF bitet igy kell törölni!!!
    ;FSK figyelés eng.
        bsf	INTCON,IOCIE	;FSKbe eng.
	bsf	INTCON,GIE
    
Startbit:	;keresés
    banksel PORTA
    btfss	B200,1 ;FSK 1 jel érkezett?
    goto    Startbit
        btfsc   B200,3 ;hibás bit?
	goto    bitHiba
    btfss   B200,2  ;ha bit=0 - startbit
    goto    St0
    goto    St1
St1:	bcf	B200,1
        movlw	Hsz	;mért hullámok száma
	movwf	Jelsz
	bcf INTCON,TMR0IE   ;Timer0 nem szakíthat meg...
;	clrf	TMR1
	bsf PORTA,LED
	clrf    TMR0	;téves megszakítás lehet!?
    goto    Startbit	
    
St0:   	movlw	T3500
	movwf	TMR0
	bcf	INTCON,TMR0IF	;itt elv. nem lehet 1
	bsf	INTCON,TMR0IE
    bcf	B200,1
        movlw	Hsz+1	;mért hullámok száma
	movwf	Jelsz
;    bsf	B200,0		;FSK figyelés tiltva - (5msec) TMR2 eng.
        bcf	INTCON,IOCIE	;FSK-t megszakításban TMR0 engedélyezi.
	bcf	T1CON,TMR1ON  ;timer1 stop
	clrf	TMR1L
	clrf	TMR1H
    bcf PORTA,LED
VettBajt:
	btfss	B200,1 ;FSK 1 jel érkezett
	goto	VettBajt
    btfsc   B200,3 ;hibás bit?
    goto    bitHiba
	btfsc	B200,2 ;vett bit 0-1
	goto	Bbit1
	goto	Bbit0
Bbit0:
    decfsz  Vbitsz,f
    goto    B0be
    goto    VbajtK
B0be:
    rrf	Vbajt,f
    bcf Vbajt,7
    bcf	B200,1 
;	bcf PORTA,LED
    goto    Seb1
Bbit1:	
    nop
    decfsz  Vbitsz,f
    goto    B1be
    goto    VbajtK
B1be:
    rrf	Vbajt,f
    bsf Vbajt,7
    bcf	B200,1
;	bsf PORTA,LED
    goto    Seb1

Seb1:
    bcf	INTCON,IOCIE	;FSK figyelés tiltva - (5msec) TMR2 eng.
    bcf   T1CON,TMR1ON  ;timer1 leáll
    	clrf	TMR1L
	clrf	TMR1H
    movlw	Hsz+1	;mért hullámok száma
    movwf	Jelsz
;	bsf	B200,0		;FSK figyelés tiltva - (5msec) TMR2 eng.
	goto	VettBajt
VbajtK:	;vett bájt kész
    rrf	Vbajt,f
    bsf Vbajt,7
    btfss   B200,2  ;az utólsó bit beforgatása
    bcf Vbajt,7
    
    incf  Vbajtsz,f
    movf    Vbajt,w
    movwf   INDF0
    incf    FSR0,f
    clrf    B200
;chekbit...
        bcf	INTCON,IOCIE	;FSK figyelés tiltva - (5msec) TMR2 eng.
	bcf	T1CON,TMR1ON  ;timer1 leáll
    	clrf	TMR1L
	clrf	TMR1H
	bcf	B200,1
;csak teszthez:
 ;   movf	Vbajt,w
 ;   CALL SEND_UART1    ;csak teszthez
    
        movlw	Hsz+1	;mért hullámok száma
	movwf	Jelsz
Chekbit:
    	btfss	B200,1 ;FSK 1 jel érkezett
	goto	Chekbit
    btfsc   B200,3 ;hibás bit?
    goto    bitHiba
	btfsc	B200,2 ;vett bit 0-1
	goto	CHbit1
	goto	CHbit0
	
CHbit1:	
    nop
	bsf PORTA,LED
	goto	CHbitV
CHbit0:
    nop
	bcf PORTA,LED
CHbitV:
;stopbit...
        bcf	INTCON,IOCIE	;FSK figyelés tiltva - (5msec) TMR2 eng.
	bcf	T1CON,TMR1ON  ;timer1 leáll
    	clrf	TMR1L
	clrf	TMR1H
	bcf	B200,1
        movlw	Hsz+1	;mért hullámok száma
	movwf	Jelsz
Stopbit:

	btfss	B200,1 ;FSK 1 jel érkezett
	goto	Stopbit
    btfsc   B200,3 ;hibás bit?
    goto    bitHiba

	btfsc	B200,2 ;vett bit 0-1
	goto	Stopbit1
	goto	Stopbit0
Stopbit0:
    bcf PORTA,LED
	goto	bitHiba	;elölröl
Stopbit1:
    bsf PORTA,LED
    bcf	INTCON,TMR0IE	;TMR0 ne zavarogjon
    goto    Rendez

;*********************************
TX_test:   ;Teszt, 1bájt -> TX (analizátoron NEM látható, de müködik)
    MOVLW "U"
    CALL SEND_UART1
    MOVLW "A"
    CALL SEND_UART1
    MOVLW "R"
    CALL SEND_UART1
    MOVLW "T"
    CALL SEND_UART1
    MOVLW "_"
    CALL SEND_UART1
    call    delay_4    ; 4msec
    MOVLW "t"
    CALL SEND_UART1
    MOVLW "e"
    CALL SEND_UART1
    MOVLW "s"
    CALL SEND_UART1
    MOVLW "t"
    CALL SEND_UART1
    call    delay_10u
    return
SEND_UART1:
	banksel	TXREG
        MOVWF TXREG
SEND_UART11:
        BTFSS TXSTA,TRMT
        GOTO SEND_UART11
	banksel	PORTA
        RETURN
	
;-------------------------------------------------------    
INICIALIZALAS:
    ;Külsö  óra
    banksel	OSCCON
    clrf OSCCON	    ;<-- CONFIGWORD határozza meg!

;Port beállítás:
	banksel	INLVLA	;bemenetválasztó TTL(0) - STtrigg(1 alap)
	banksel	ODCONA	;kimenet (open-drain) -- push-pull
	clrf	ODCONA
	banksel	APFCON
	clrf	APFCON
	movlw	b'00000000' ;nincs pin csere...
	movwf	APFCON
	bsf	APFCON,T1GSEL	;T1G RA3-ra (így talán RA4 m?ködik)
	BANKSEL PORTA ;
	CLRF PORTA ;Init PORTA
	BANKSEL LATA ;Data Latch
	CLRF LATA ;
;	bsf	LATA,TEST
	BANKSEL ANSELA ;
	CLRF ANSELA ;digital I/O
	
;UART vezérlés érdekes: (így müködik)
	bsf ANSELA,TX	;
;	bsf ANSELA,LED	;

	BANKSEL TRISA ;RA4-et nem hajlandó kimenetnek beállítani!!!!
        MOVLW B'00111111' ;Set RA<5:0> as inputs
	MOVWF TRISA 
	bsf	TRISA,FSKbe
	bcf	TRISA,TX   ;itt kimenetnek van beállítva, de ANSEL miatt analóg kimenet
	;UART így már megy !!!
	bcf	TRISA,PWMki
	bcf	TRISA,LED
    
	banksel	WPUA
	movlw	b'00000000' ;bemenetek gyenge felhúzása - NEM
	movwf	WPUA


;EUSART beállítás: -->9600 baud rate 8bites
	;TXSTA,TMRT --> ha=1 TSR üres
	banksel	BAUDCON
	bcf	BAUDCON,BRG16
	bcf	BAUDCON,SCKP
	banksel	TXSTA
	bcf	TXSTA,TX9 ;8bites
	bsf	TXSTA,TXEN
	bcf	TXSTA,SYNC
	bcf	TXSTA,BRGH
	bsf	RCSTA,SPEN   ;USART engedélyezése!
	banksel	SPBRG
	movlw	d'40'	;beállítani!
	;<-Fosc + boudrate (25.175MHz 9600baud-->d'40' ~-0,06%
	movwf	SPBRG
	clrf	SPBRGH

	
	
;Timer1 beállítása:
	banksel	T1CON
	movlw	b'00110100' ;elöosztás 1:8,-még áll, bit2-sync.
	movwf	T1CON
	movlw	b'00000011' ;b'10000000' ; b10 - kapuválasztó
	movwf	T1GCON
;	bsf T1CON,TMR1ON    ;timer1 indul
	
;
;;Timer2 beállítása 5msec-re 25.175MHz- el?osztó=1/64; PR2=244; utóosztó=1/8 (4.983msec)
;	;			    16MHz-> el?osztó=16; PR2=125; utóosztó=10
;;	banksel	INTCON
;	bsf	INTCON,PEIE
;	bsf	INTCON,T0IE
;	banksel	PR2
;	movlw	d'245'	;d'244'
;	movwf	PR2
;	banksel T2CON
;;	movlw	b'00111011' ; 1/8-1/64-> b'00111011'
;	movlw	b'00111010' ; 1/8-1/16-> számított/4 KELL!!! (Fosc/4??)
;	movwf	T2CON
;     bsf   T2CON,TMR2ON    ;indítás
;MPLAB V8.92-ben TMR2 NEM megy!
	
PWM_indul: ;beállítás  logikai analizátor szerint --> büvészkedve!
    ;PIC12F1572 <-- 16 bites PWM (RA2-PWM3!)
    ;banksel APFCON
    ;bsf    APFSEL.P1SEL    ;PWM1->RA5
    ;bsf    APFSEL.P2SEL    ;PWM2->RA4
    ;PWM3 --> RA2 ;fix
    banksel  PWMOUT ;minden PWM a bank27-ben van
    clrf    PWM1CON
    clrf    PWM2CON ;PWM1,PWM2 letíltva
    
    bsf	PWMOUT,PWM3OUT_A
 
    movlw    b'11000000'
    movwf    PWM3CON	;standard PWM mód
    clrf	    PWM3INTE	;interrupt nincs
   	;Logikai analizátor szerint jó? -Phase=0; period=31; Duty=16
    movlw   d'0'      ;Phase
    movwf   PWM3PHL
    clrf    PWM3PHH
    movlw    d'181'   ;138kHz-hez
    clrf    PWM3PRH
    movwf    PWM3PRL
    movlw    d'91'   ;138kHz-hez
    clrf    PWM3DCH
    movwf    PWM3DCL

    clrf    PWM3CLKCON	;Fosc, osztás nélkül
    bsf	PWMLD,PWM3LDA_A
    bsf	PWMEN,PWM3EN_A
    bsf	PWMOUT,PWM3OUT_A
    ;PWM=133909,6Hz <--számított, mérve: 133910Hz
    
    ;ez a beállítás PIC12F1501-hez jó -- 10 bites PWM! (RA2 - PWM1!)
;    	banksel	PR2
;	movlw	d'116'	;d'29'	;PR2 = 0b00011101 ;
;	movwf	PR2
;	clrf	T2CON
;	bsf	T2CON,TMR2ON
;	banksel	PWM1CON
;	movlw	b'00000000'	;d'14'--10bites! b'0000001110'
;	movwf	PWM1DCL
;	movlw	b'00111011'
;	movwf	PWM1DCH
;	movlw	b'11100000'
;	movwf	PWM1CON
;	banksel	TRISA
;	bcf	TRISA,2 ;PWM pin
;
;	banksel	PORTA


;Timer0:	
	banksel	OPTION_REG
	movlw	b'0000111'	;elöosztó 1:256
	movwf	OPTION_REG  ;Timer0 mindig fut!
	banksel	PORTA	 ;Bank 0


;Megszakítás INIT:
	clrf    INTCON
	banksel	IOCAP
	bsf	IOCAP,FSKbe
	bsf	IOCAF,FSKbe

	bcf	INTCON,IOCIE	;FSK figyelés még nem!
	bcf	INTCON,GIE ;Beolvasáskor eng. Adatküldéskor nem?
	banksel	PORTA
	return	
;------------------------------------------------------------------------------- 
BitKi:    ;megszakítás_FSK-ból
Bitvizsg:
    banksel PORTA
    bcf	B200,3	 ;"hibátlan" bit
Bv01:
    movlw   bitVL   ;0 vagy 1
    movwf   REGB0
    movlw   bitVH
    movwf   REGB1
    movfw   TvalL
    movwf   REGA0
    movfw   TvalH
    movwf   REGA1
    call    SUB16
    btfsc   STATUS,C	;fölsö keverés!  (alsónál btfss kell)
    goto    Bv0
    goto    Bv1
Bv0:
    bcf	B200,2	;ha bit2= "0" v. "1"-es bit érkezett
    bsf	B200,1	;ha bit1=1 érvényes hullam -> TMR1-ben
    bcf	PORTA,LED   ;ha vett jó bitet "L"
    movlw   ZmaxL   ;túl hosszú?
    movwf   REGB0
    movlw   ZmaxH
    movwf   REGB1
    movfw   TvalL
    movwf   REGA0
    movfw   TvalH
    movwf   REGA1
    call    SUB16
    btfss   STATUS,C
    return
    bsf	B200,3	;hibás bit volt
;    bcf	B200,1	;ha bit1=0 érvénytelen hullam -> TMR1-ben
    bsf	PORTA,LED   ;imp "H"
    call    delay_10u  
    bcf	PORTA,LED   ;"L"
    return

Bv1:	
    bsf	B200,2	;ha bit2= "0" v. "1"-es bit érkezett
    bsf	B200,1	;ha bit1=1 érvényes hullam -> TMR1-ben
    bsf	PORTA,LED
    movlw   ZminL   ;túl rövid?
    movwf   REGB0
    movlw   ZminH
    movwf   REGB1
    movfw   TvalL
    movwf   REGA0
    movfw   TvalH
    movwf   REGA1
    call    SUB16
    btfsc   STATUS,C
    return
    bsf	B200,3	;hibás bit volt
;    bcf	B200,1	;ha bit1=0 érvénytelen hullam -> TMR1-ben
    bcf	PORTA,LED   ;imp "L"
    call    delay_10u  
    bsf	PORTA,LED   ;"H"
    return

;
;    call    BitVR4	;bit (id?) teszt
;;	bsf	PORTA,LED   ;ha vett jó bitet "H"
;;	btfss   B200,2
;;	bcf	PORTA,LED   ;ha vett jó bitet "L"
;    return
;
;    
;T1teszt:
;    movlw   'T'
;	call	SEND_UART1    
;    movf    TvalH,W
;	call	SEND_UART1
;    movf    TvalL,W
;    	call	SEND_UART1
;    return
;BitVR4: ;R4 vált - ha timer1 túlcsordult -> csak inpulzus
;;    banksel PORTA
;    btfss   PORTA,LED	;R4 vált-- teszt
;    goto    BitV
;    bcf	PORTA,LED
;;    banksel PIR1
;    btfss   PIR1,TMR1IF   ;TMR1 túlcsordult???
;    return
;    bcf PIR1,TMR1IF
;;    banksel PORTA
;    call    delay_10u
;    bsf PORTA,LED
;    return
;BitV:	bsf PORTA,LED
;;        banksel PIR1
;	btfss   PIR1,TMR1IF   ;TMR1 túlcsordult???
;	return
;	bcf PIR1,TMR1IF
;;	banksel	PORTA
;	call    delay_10u
;	bcf	PORTA,LED
;    return
;*****************************************************
;	Fosc=25.175 MHz
delay_1u:	; 1us
    banksel d1
	movlw	0x1 ;0x05
	movwf	d1
	goto	delay_u_0
delay_10u:	; 10us
    banksel d1
	movlw	0x13	;0x51
	movwf	d1
	goto	delay_u_0
delay_100u:	; 10us
    banksel d1
	movlw	0xD5
	movwf	d1
	goto	delay_u_0
delay_u_0:	;4 cycles (including call)
	decfsz	d1, f
	goto	delay_u_0                  
	RETURN

delay_10:	; 10msec delay
    banksel d1
	movlw	0x87	;0x1E
	movwf	d1
	movlw	0x32	;0xC6
	movwf	d2
	goto	delay_0

delay_4:    ; 4msec
    banksel d1
	movlw	0xC7	;0x1E
	movwf	d1
	movlw	0x14	;0x4F
	movwf	d2
	goto	delay_0
delay_0:
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	delay_0	;2 cycles
	goto	$+1
	nop		;4 cycles (including call)
	RETURN

;*********************************
;16 bites kismatek
ADD16:		;összeadás 2 byte REGA0,1=REGA0,1 + REGB0,1
	MOVF    REGB0,W
	ADDWF   REGA0,f
	BTFSC   STATUS,C
	INCF    REGA1,F
	MOVF    REGB1,W
	ADDWF   REGA1,f
	RETURN

SUB16:		;kivonás 2 byte	REGA0,1=REGA0,1 - REGB0,1
	MOVF    REGB1,W
	MOVWF   REGBY
	MOVF    REGB0,W
	SUBWF   REGA0,f
	BTFSS   STATUS,C
	INCF    REGBY,F
	MOVF    REGBY,W
	SUBWF   REGA1,f
	RETURN
;****************************************************	
	end 

	
;MULV16:	 	;szorzás 2 byte  REGA0,1=REGA0,1 * REGB0,1
;	;(ha túlcsordul a túlcsordulás elveszik!)
;	CLRF REGC0
;	CLRF REGC1
;MULU16LOOP:
;	BTFSC REGB0,0
;	CALL ADD16M	;!BIS
;	BCF STATUS,C
;	RRF REGB1,F
;	RRF REGB0,F
;	BCF STATUS,C
;	RLF REGA0,F
;	RLF REGA1,F
;	MOVF REGB0,F
;	BTFSS STATUS,Z
;	GOTO MULU16LOOP
;	MOVF REGB1,F
;	BTFSS STATUS,Z
;	GOTO MULU16LOOP
;	movf	REGC0,W
;	movwf	REGA0
;	movf	REGC1,W
;	movwf	REGA1
;	RETURN
;ADD16M:
;	MOVF REGA0,W
;	ADDWF REGC0,f
;	BTFSC STATUS,C
;	INCF REGC1,f
;	MOVF REGA1,W
;	ADDWF REGC1,f
;	RETURN
;
;DIVV16:	;osztás 2 byte  REGA0,1=REGA0,1 / REGB0,1
;	MOVF REGB0,F
;	BTFSS  STATUS,Z
;	GOTO  ZERO_TEST_SKIPPED
;	MOVF REGB1,F
;	BTFSC STATUS,Z
;	RETURN
;ZERO_TEST_SKIPPED:
;	MOVLW   1
;	MOVWF   IDX16
;	CLRF    IDX16_H
;	CLRF    REGC0
;	CLRF    REGC1
;SHIFT_IT16:
;	BCF     STATUS,C
;	RLF     IDX16,F
;	RLF     IDX16_H,F
;	BCF     STATUS,C
;	RLF     REGB0,F
;	RLF     REGB1,F
;	BTFSS   REGB1,7
;	GOTO    SHIFT_IT16
;DIVU16LOOP:
;	CALL    SUB16
;	BTFSC   STATUS,C
;	GOTO    COUNTX
;	CALL    ADD16
;	GOTO    FINALX
;COUNTX:
;	MOVF    IDX16,W
;	ADDWF   REGC0,f
;	BTFSC   STATUS,C
;	INCF    REGC1,F
;	MOVF    IDX16_H,W
;	ADDWF   REGC1,f
;FINALX:
;	BCF     STATUS,C
;	RRF     REGB1,F
;	RRF     REGB0,F
;	BCF     STATUS,C
;	RRF     IDX16_H,F
;	RRF     IDX16,F
;	BTFSS   STATUS,C
;	GOTO    DIVU16LOOP
;	movf	REGC0,W
;	movwf	REGA0
;	movf	REGC1,W
;	movwf	REGA1
;	RETURN
;
;
;MULV8:	;szorzás 1 byte  REGA0=REGA0 * REGB0
;	;(ha túlcsordul a túlcsordulás elveszik!)
;	CLRF REGC0
;MULU8LOOP:
;	MOVF REGA0,W
;	BTFSC REGB0,0
;	ADDWF REGC0,f
;	BCF STATUS,C
;	RRF REGB0,F
;	BCF STATUS,C
;	RLF REGA0,F
;	MOVF REGB0,F
;	BTFSS STATUS,Z
;	GOTO MULU8LOOP
;	movf	REGC0,W
;	movwf	REGA0
;	RETURN
;
;DIVV8:		;osztás 1 byte	REGA0=REGA0 / REGB0
;	MOVF  REGB0,F
;	BTFSC STATUS,Z ;SKIP IF NON-ZERO
;	RETURN
;	CLRF  REGC0
;	MOVLW  1
;	MOVWF  IDX16
;SHIFT_IT8:
;	BCF   STATUS,C
;	RLF   IDX16,F
;	BCF   STATUS,C
;	RLF   REGB0,F
;	BTFSS  REGB0,7
;	GOTO  SHIFT_IT8
;DIVU8LOOP:
;	MOVF  REGB0,W
;	SUBWF  REGA0,f
;	BTFSC   STATUS,C
;	GOTO   COUNT8
;	ADDWF   REGA0,f
;	GOTO  FINAL8
;COUNT8:
;	MOVF  IDX16,W
;	ADDWF  REGC0,f
;FINAL8:
;	BCF   STATUS,C
;	RRF   REGB0,F
;	BCF   STATUS,C
;	RRF   IDX16,F
;	BTFSS   STATUS,C
;	GOTO   DIVU8LOOP
;	movf	REGC0,W
;	movwf	REGA0	
;	RETURN
;;***************************************************
;
;Clr_reg:
;    clrf    REGA0
;    clrf    REGA1
;    clrf    REGA2
;    clrf    REGA3
;    clrf    REGB0
;    clrf    REGB1
;    clrf    REGB2
;    clrf    REGB3
;    clrf    REGC0
;    clrf    REGC1
;    clrf    REGC2
;    clrf    REGC3
;    return
;
;;	*	*	*	*	*	*	*	*	*	*	*	*
;;		32 bites matek !!!
;
;;	CALL	add		;REGA.=REGA.+REGB. (30-33 ill. 40-43)
;;	CALL	subtract	;REGA.=REGA.-REGB. 
;;	CALL	multiply	;REGA.=REGA.*REGB. 
;; 	CALL	divide		;REGA.=REGA./REGB. 
;;	CALL	round
;;	CALL	sqrt		;REGA.=n'gyzetgy<k (REGA.)
;;	CALL	bin2dec		;eredm'ny 50-5A -ig (REGA. átalakitása decim?lissá --> LCD )
;;	movlw	0x0A		;alakitandô KARAKTEREK száma->W
;;	call	dec2bin		;Digit1-t<l->regA-ba
;;
;
;
;      ;*** 32 BIT SIGNED SUTRACT ***
;      ;REGA - REGB -> REGA
;      ;Return carry set if overflow
;subtract:
;      	call	negateb		;Negate REGB
;      	skpnc
;      	return			;Overflow
;
;      ;*** 32 BIT SIGNED ADD ***
;      ;REGA + REGB -> REGA
;      ;Return carry set if overflow
;
;add:	movf	REGA3,w		;Compare signs
;      	xorwf	REGB3,w
;      	movwf	MTEMP
;
;      	call	addba		;Add REGB to REGA
;
;      	clrc			;Check signs
;      	movf	REGB3,w		;If signs are same
;      	xorwf	REGA3,w		;so must result sign
;      	btfss	MTEMP,7		;else overflow
;      	addlw	0x80
;      	return
;
;      ;*** 32 BIT SIGNED MULTIPLY ***
;      ;REGA * REGB -> REGA
;      ;Return carry set if overflow
;
;multiply:
;      	clrf	MTEMP		;Reset sign flag
;      	call	absa		;Make REGA positive
;      	skpc
;      	call	absb		;Make REGB positive
;      	skpnc
;      	return			;Overflow
;
;      	call	movac		;Move REGA to REGC
;      	call	clra		;Clear product
;
;      	movlw	D'31'		;Loop counter
;      	movwf	MCOUNT
;
;muloop:	call	slac		;Shift left product and multiplicand
;      	
;      	rlf	REGC3,w		;Test MSB of multiplicand
;      	skpnc			;If multiplicand bit is a 1 then
;      	call	addba		;add multiplier to product
;
;      	skpc			;Check for overflow
;      	rlf	REGA3,w
;      	skpnc
;      	return
;
;      	decfsz	MCOUNT,f	;Next
;      	goto	muloop
;
;      	btfsc	MTEMP,0		;Check result sign
;      	call	negatea		;Negative
;      	return
;
;
;      ;*** 32 BIT SIGNED DIVIDE ***
;      ;REGA / REGB -> REGA
;      ;Remainder in REGC
;      ;Return carry set if overflow or division by zero
;
;divide:	clrf	MTEMP		;Reset sign flag
;      	movf	REGB0,w		;Trap division by zero
;      	iorwf	REGB1,w
;      	iorwf	REGB2,w
;      	iorwf	REGB3,w
;      	sublw	0
;      	skpc
;      	call	absa		;Make dividend (REGA) positive
;      	skpc
;      	call	absb		;Make divisor (REGB) positive
;      	skpnc
;      	return			;Overflow
;
;      	clrf	REGC0		;Clear remainder
;      	clrf	REGC1
;      	clrf	REGC2
;      	clrf	REGC3
;      	call	slac		;Purge sign bit
;
;      	movlw	D'31'		;Loop counter
;      	movwf	MCOUNT
;
;dvloop:	call	slac		;Shift dividend (REGA) msb into remainder (REGC)
;
;      	movf	REGB3,w		;Test if remainder (REGC) >= divisor (REGB)
;      	subwf	REGC3,w
;      	skpz
;      	goto	dtstgt
;      	movf	REGB2,w
;      	subwf	REGC2,w
;      	skpz
;      	goto	dtstgt
;      	movf	REGB1,w
;      	subwf	REGC1,w
;      	skpz
;      	goto	dtstgt
;      	movf	REGB0,w
;      	subwf	REGC0,w
;dtstgt:	skpc			;Carry set if remainder >= divisor
;      	goto	dremlt
;
;      	movf	REGB0,w		;Subtract divisor (REGB) from remainder (REGC)
;      	subwf	REGC0,f
;      	movf	REGB1,w
;      	skpc
;      	incfsz	REGB1,w
;      	subwf	REGC1,f
;      	movf	REGB2,w
;      	skpc
;      	incfsz	REGB2,w
;      	subwf	REGC2,f
;      	movf	REGB3,w
;      	skpc
;      	incfsz	REGB3,w
;      	subwf	REGC3,f
;      	clrc
;      	bsf	REGA0,0		;Set quotient bit
;
;dremlt:	decfsz	MCOUNT,f	;Next
;      	goto	dvloop
;
;      	btfsc	MTEMP,0		;Check result sign
;      	call	negatea		;Negative
;      	return
;
;      ;*** ROUND RESULT OF DIVISION TO NEAREST INTEGER ***
;
;round:	clrf	MTEMP		;Reset sign flag
;      	call	absa		;Make positive
;      	clrc
;      	call	slc		;Multiply remainder by 2
;      	movf	REGB3,w		;Test if remainder (REGC) >= divisor (REGB)
;      	subwf	REGC3,w
;      	skpz
;      	goto	rtstgt
;      	movf	REGB2,w
;      	subwf	REGC2,w
;      	skpz
;      	goto	dtstgt
;      	movf	REGB1,w
;      	subwf	REGC1,w
;      	skpz
;      	goto	rtstgt
;      	movf	REGB0,w
;      	subwf	REGC0,w
;rtstgt:	skpc			;Carry set if remainder >= divisor
;      	goto	rremlt
;      	incfsz	REGA0,f		;Add 1 to quotient
;      	goto	rremlt
;      	incfsz	REGA1,f
;      	goto	rremlt
;      	incfsz	REGA2,f
;      	goto	rremlt
;      	incf	REGA3,f
;      	skpnz
;      	return			;Overflow,return carry set
;rremlt:	btfsc	MTEMP,0		;Restore sign
;      	call	negatea
;      	return
;
;
;      ;*** 32 BIT SQUARE ROOT ***
;      ;sqrt(REGA) -> REGA
;      ;Return carry set if negative
;
;sqrt:		rlf	REGA3,w		;Trap negative values
;      	skpnc
;      	return
;
;      	call	movac		;Move REGA to REGC
;      	call	clrba		;Clear remainder (REGB) and root (REGA)
;
;      	movlw	D'16'		;Loop counter
;      	movwf	MCOUNT
;
;sqloop:	rlf	REGC0,f		;Shift two msb's
;      	rlf	REGC1,f		;into remainder
;      	rlf	REGC2,f
;      	rlf	REGC3,f
;      	rlf	REGB0,f
;      	rlf	REGB1,f
;      	rlf	REGB2,f
;      	rlf	REGC0,f
;      	rlf	REGC1,f
;      	rlf	REGC2,f
;      	rlf	REGC3,f
;      	rlf	REGB0,f
;      	rlf	REGB1,f
;      	rlf	REGB2,f
;
;      	setc			;Add 1 to root
;      	rlf	REGA0,f		;Align root
;      	rlf	REGA1,f
;      	rlf	REGA2,f
;
;      	movf	REGA2,w		;Test if remdr (REGB) >= root (REGA)
;      	subwf	REGB2,w
;      	skpz
;      	goto	ststgt
;      	movf	REGA1,w
;      	subwf	REGB1,w
;      	skpz
;      	goto	ststgt
;      	movf	REGA0,w
;      	subwf	REGB0,w
;ststgt:	skpc			;Carry set if remdr >= root
;      	goto	sremlt
;
;      	movf	REGA0,w		;Subtract root (REGA) from remdr (REGB)
;      	subwf	REGB0,f
;      	movf	REGA1,w
;      	skpc
;      	incfsz	REGA1,w
;      	subwf	REGB1,f
;      	movf	REGA2,w
;      	skpc
;      	incfsz	REGA2,w
;      	subwf	REGB2,f
;      	bsf	REGA0,1		;Set current root bit
;
;sremlt:	bcf	REGA0,0		;Clear test bit
;      	decfsz	MCOUNT,f	;Next
;      	goto	sqloop
;
;      	clrc
;      	rrf	REGA2,f		;Adjust root alignment
;      	rrf	REGA1,f
;      	rrf	REGA0,f
;      	return
;
;
;      ;*** 32 BIT SIGNED BINARY TO DECIMAL ***
;      ;REGA -> DIGITS 1 (MSD) TO 10 (LSD) & DSIGN
;      ;DSIGN = 0 if REGA is positive, 1 if negative
;      ;Return carry set if overflow
;      ;Uses FSR register
;
;bin2dec:
;	clrf	MTEMP		;Reset sign flag
;      	call	absa		;Make REGA positive
;      	skpnc
;      	return			;Overflow
;
;      	call	clrdig		;Clear all digits
;      	movlw	D'32'		;Loop counter
;      	movwf	MCOUNT
;b2dloop:
;	rlf	REGA0,f		;Shift msb into carry
;      	rlf	REGA1,f
;      	rlf	REGA2,f
;      	rlf	REGA3,f
;      	movlw	DIGIT10
;      	movwf	FSR		;Pointer to digits
;      	movlw	D'10'		;10 digits to do
;      	movwf	DCOUNT
;adjlp:	rlf	INDF,f		;Shift digit and carry 1 bit left
;      	movlw	D'10'
;      	subwf	INDF,w		;Check and adjust for decimal overflow
;      	skpnc
;      	movwf	INDF
;
;      	decf	FSR,f		;Next digit
;      	decfsz	DCOUNT,f
;      	goto	adjlp
;
;      	decfsz	MCOUNT,f	;Next bit
;      	goto	b2dloop
;
;      	btfsc	MTEMP,0		;Check sign
;      	bsf	DSIGN,0		;Negative
;      	clrc
;      	return
;
;
;      ;*** 32 BIT SIGNED DECIMAL TO BINARY ***
;      ;Decimal DIGIT1 thro DIGIT(X) & DSIGN -> REGA
;      ;Set DSIGN = 0 for positive, DSIGN = 1 for negative values
;      ;Most significant digit in DIGIT1
;      ;Enter this routine with digit count in w register
;      ;Return carry set if overflow
;      ;Uses FSR register
;
;dec2bin:
;	movwf	MTEMP		;Save digit count
;      	movlw	D'32'		;Outer bit loop counter
;      	movwf	MCOUNT
;d2blp1:	movlw	DIGIT1-1	;Set up pointer to MSD
;      	movwf	FSR
;      	movf	MTEMP,w		;Inner digit loop counter
;      	movwf	DCOUNT
;      	movlw	D'10'
;      	clrc			;Bring in '0' bit into MSD
;d2blp2:	incf	FSR,f
;      	skpnc
;      	addwf	INDF,f		;Add 10 if '1' bit from prev digit
;      	rrf	INDF,f		;Shift out LSB of digit
;      	decfsz	DCOUNT,f	;Next L.S. Digit
;      	goto	d2blp2
;
;      	rrf	REGA3,f		;Shift in carry from digits
;      	rrf	REGA2,f
;      	rrf	REGA1,f
;      	rrf	REGA0,f
;
;      	decfsz	MCOUNT,f	;Next bit
;      	goto	d2blp1
;
;      	movf	INDF,w		;Check for overflow
;      	addlw	0xFF
;      	skpc
;      	rlf	REGA3,w
;      	skpnc
;      	return
;
;      	btfsc	DSIGN,0		;Check result sign
;      	call	negatea		;Negative
;      	return
;
;
;      ;UTILITY ROUTINES
;
;
;      ;Add REGB to REGA (Unsigned)
;      ;Used by add, multiply,
;
;addba:	movf	REGB0,w		;Add lo byte
;      	addwf	REGA0,f
;
;      	movf	REGB1,w		;Add mid-lo byte
;      	skpnc			;No carry_in, so just add
;      	incfsz	REGB1,w		;Add carry_in to REGB
;      	addwf	REGA1,f		;Add and propagate carry_out
;
;      	movf	REGB2,w		;Add mid-hi byte
;      	skpnc
;      	incfsz	REGB2,w
;      	addwf	REGA2,f
;
;      	movf	REGB3,w		;Add hi byte
;      	skpnc
;      	incfsz	REGB3,w
;      	addwf	REGA3,f
;      	return
;
;
;      ;Move REGA to REGC
;      ;Used by multiply, sqrt
;
;movac:	movf	REGA0,w
;      	movwf	REGC0
;      	movf	REGA1,w
;      	movwf	REGC1
;      	movf	REGA2,w
;      	movwf	REGC2
;      	movf	REGA3,w
;      	movwf	REGC3
;      	return
;
;
;      ;Clear REGB and REGA
;      ;Used by sqrt
;
;clrba:	clrf	REGB0
;      	clrf	REGB1
;      	clrf	REGB2
;      	clrf	REGB3
;
;      ;Clear REGA
;      ;Used by multiply, sqrt
;
;clra:	clrf	REGA0
;      	clrf	REGA1
;      	clrf	REGA2
;      	clrf	REGA3
;      	return
;
;      ;Clear REGA
;clrb:	clrf	REGB0
;      	clrf	REGB1
;      	clrf	REGB2
;      	clrf	REGB3
;      	return
;
;      ;Check sign of REGA and convert negative to positive
;      ;Used by multiply, divide, bin2dec, round
;
;absa:		rlf	REGA3,w
;      	skpc
;      	return			;Positive
;
;      ;Negate REGA
;      ;Used by absa, multiply, divide, bin2dec, dec2bin, round
;
;negatea:	movf	REGA3,w		;Save sign in w
;      	andlw	0x80
;
;      	comf	REGA0,f		;2's complement
;      	comf	REGA1,f
;      	comf	REGA2,f
;      	comf	REGA3,f
;      	incfsz	REGA0,f
;      	goto	nega1
;      	incfsz	REGA1,f
;      	goto	nega1
;      	incfsz	REGA2,f
;      	goto	nega1
;      	incf	REGA3,f
;
;nega1:     	incf	MTEMP,f		;flip sign flag
;      	addwf	REGA3,w		;Return carry set if -2147483648
;      	return
;
;
;      ;Check sign of REGB and convert negative to positive
;      ;Used by multiply, divide
;
;absb:		rlf	REGB3,w
;      	skpc
;      	return			;Positive
;
;      ;Negate REGB
;      ;Used by absb, subtract, multiply, divide
;
;negateb:	movf	REGB3,w		;Save sign in w
;      	andlw	0x80
;
;      	comf	REGB0,f		;2's complement
;      	comf	REGB1,f
;      	comf	REGB2,f
;      	comf	REGB3,f
;      	incfsz	REGB0,f
;      	goto	negb1
;      	incfsz	REGB1,f
;      	goto	negb1
;      	incfsz	REGB2,f
;      	goto	negb1
;      	incf	REGB3,f
;
;negb1:     	incf	MTEMP,f		;flip sign flag
;      	addwf	REGB3,w		;Return carry set if -2147483648
;      	return
;
;
;      ;Shift left REGA and REGC
;      ;Used by multiply, divide, round
;
;slac:		rlf	REGA0,f
;      	rlf	REGA1,f
;      	rlf	REGA2,f
;      	rlf	REGA3,f
;slc:		rlf	REGC0,f
;      	rlf	REGC1,f
;      	rlf	REGC2,f
;      	rlf	REGC3,f
;      	return
;
;      ;Set all digits to 0
;      ;Used by bin2dec
;
;clrdig:	clrf	DSIGN	;most ez is elég!!!
;      	clrf	DIGIT1
;;      	clrf	DIGIT2
;;      	clrf	DIGIT3
;;      	clrf	DIGIT4
;;      	clrf	DIGIT5
;;      	clrf	DIGIT6
;;      	clrf	DIGIT7
;;      	clrf	DIGIT8
;;      	clrf	DIGIT9
;      	clrf	DIGIT10
;      	return
;___________________________________________	
;Timer2test: ;debugger szerint: 5,08msec
;    banksel	PORTA
;	bsf PORTA,LED
;	call    delay_100u
;	bcf PORTA,LED
;	clrf TMR2
;	bsf T2CON,TMR2ON
;;	banksel	PIR1
;	btfss	PIR1,TMR2IF
;	goto	$-1
;;	banksel	PORTA
;	bsf PORTA,LED
;	call    delay_10u
;	bcf PORTA,LED
;	bcf T2CON,TMR2ON
;	clrf TMR2
;	bcf PIR1,TMR2IF
;Timer1test: ;debugger szerint: 20,8msec
;	bsf PORTA,LED
;	call    delay_100u
;	bcf PORTA,LED
;	clrf TMR1H
;	clrf	TMR1L
;	bsf T1CON,TMR1ON
;;	banksel	PIR1
;	btfss	PIR1,TMR1IF
;	goto	$-1
;;	banksel	PORTA
;	bsf PORTA,LED
;	call    delay_100u
;	bcf PORTA,LED
;	bcf T1CON,TMR1ON
;	clrf TMR1H
;	clrf	TMR1L	
;	bcf PIR1,TMR1IF
;Time0test:  ;1/256
;    bcf	INTCON,TMR0IF
;    clrf    TMR0
;    btfss   INTCON,TMR0IF
;    goto    $-1
;        bsf PORTA,LED
;	call    delay_10u
;	bcf PORTA,LED
;    bcf	INTCON,TMR0IF
;    movlw   d'134'  ;d'134->4.96msec ;d'133'->5.004msec
;    movwf   TMR0
;    btfss   INTCON,TMR0IF
;    goto    $-1
;    	bsf PORTA,LED
;	call    delay_10u
;	bcf PORTA,LED
    nop