	list p=18f4550
	; Include file, change directory if needed
	include "p18f4550.inc"


irqido = 0f900		;a stepper megszakitas innen indul ffff-ig
oraido = 04900 		;a megszakitason belul az idomero szamoloja
stepperido = 01		;a forgas sebessege
kisido = 20		;az ido belsoszamlaloja

; 4550-es USB , A ROTAROD vezerlopanelje
; Timer3-al csinalom a stepper idozitest
; Timer0-val az oraidozites, a masodperc kb valos

#define step1 PORTB,0
#define step2 PORTB,1
#define step3 PORTB,2
#define step4 PORTB,3
#define zoldled PORTB,4
#define hall1 PORTA,2   ;alapbol hi szinten
#define hall2 PORTA,3   ; a bemenetek!
#define hall3 PORTA,4
#define hall4 PORTA,5
#define gomb1 PORTE,0	;alapbol hi szinten
#define gomb2 PORTE,1   ; a bemenetek!
#define gomb3 PORTE,2

#define dataport 	PORTD	;a kijelzo ertekei
#define reset		PORTC,7
#define a0		PORTC,6
#define chipselect	PORTC,0
#define write		PORTC,1
#define read		PORTC,2


;BANK 0

cblock 0x10
villog
steppervillogo
stepperbase
sorozat
foroge
masodperclo
masodperchi
idegkar
szorzolo
szorzohi
szorzandolo
szorzandohi
szamlalo
szamlahi
szepite	
osztolo	
osztohi	
oszto2lo
oszto2hi
osztandolo
osztandohi
osztando2lo
osztando2hi
munkalo
munkahi
munka2lo
munka2hi
eredmenylo
eredmenyhi
eredmeny2lo
eredmeny2hi
TEMP1
TEMP2
CIKLOHI
CIKLOLO
ERTEK
ERTEKKI
nyolcbites
PITCH
PLUSZ
IDEG
IDEG2
TEMPVK1
TEMPVK2
TEMPVK3
ELSONIB
PUFCIKSZAM
pufcimhi
pufcimlo
endc

;****** MAKROK

adat MACRO bertek
	mov ERTEK,bertek
	call ADATKI
	ENDM

parancs MACRO bertek
	mov ERTEK,bertek
	call COMMANDKI
	ENDM

CLKVAR MACRO
	nop
	nop
	ENDM

tablabeallitas MACRO bertek
	mov TBLPTRU,0
	mov TBLPTRH, high bertek
	mov TBLPTRL, low bertek
	ENDM

szovegki MACRO bertek
	mov TBLPTRU,0
	mov TBLPTRH, high bertek
	mov TBLPTRL, low bertek
	parancs 42
	call szoveglup
	ENDM


ORG 0x0000
	goto _start
	return 0
org 0x0008
        goto high_isr	;low priority int
	return 0
org 0x0018
	retfie 0	;high priority int
	return 0
org 0x002a
	nop

;----------------------------------------- INTERRUPT HANDLER

high_isr
	btfsc INTCON,TMR0IF
	bra timer0thread

	btfss	PIR2,TMR3IF,A
	bra	irq_exit

stepper_irq
	bcf	PIR2,TMR3IF,A
	mov TMR3H,HIGH irqido
	mov TMR3L,LOW irqido
	decfsz steppervillogo	;stepper idozitoje
	jmp irq_stvege
	movbb steppervillogo,stepperbase
   btfsc foroge,0	;a 0.bit, vagyis 1/0
   jmp forogbizony
	movf PORTB,w		;nem lehet bitenkent lekapcsolni, csak egyben!
	andlw B'11110000'
	movwf PORTB
	jmp irq_stvege
   forogbizony

	incf sorozat
	movlw 0
	cpfseq sorozat
	jmp irq_st2
	bsf step3
	jmp irq_stvege
    irq_st2
	movlw 1
	cpfseq sorozat
	jmp irq_st3
	bcf step1
	jmp irq_stvege
    irq_st3
	movlw 2
	cpfseq sorozat
	jmp irq_st4
	bsf step2
	jmp irq_stvege
    irq_st4
	movlw 3
	cpfseq sorozat
	jmp irq_st5
	bcf step3
	jmp irq_stvege
    irq_st5
	movlw 4
	cpfseq sorozat
	jmp irq_st6
	bsf step4
	jmp irq_stvege
    irq_st6
	movlw 5
	cpfseq sorozat
	jmp irq_st7
	bcf step2
	jmp irq_stvege
    irq_st7
	movlw 6
	cpfseq sorozat
	jmp irq_st8
	bsf step1
	jmp irq_stvege
    irq_st8
	movlw 7
	cpfseq sorozat
	jmp irq_stvege
	bcf step4
	mov sorozat,0ff
	jmp irq_stvege

irq_stvege:


irq_exit:
	retfie

timer0thread
	bcf INTCON,TMR0IF
	mov TMR0H,HIGH oraido
	mov TMR0L,LOW oraido

	decfsz villog
	jmp ora_irqveg
	mov villog,kisido
	btg zoldled
	infsnz masodperclo
	incf masodperchi
ora_irqveg
	jmp irq_exit
;-----------------------------------

_start:
	mov TRISA,0ff	;mind bemenet
	mov TRISB,0	;mind kimenet
	mov TRISC,0	;mind kimenet
	mov TRISD,0	;mind kimenet
	mov TRISE,0ff	;mind bemenet
	clrf	PORTB
	clrf	PORTC
	clrf	PORTD

	mov TMR3H,HIGH irqido
	mov TMR3L,LOW irqido
	mov T3CON,B'00010101'	;enable tmr3,internal clk,8bit mode,prescaler 1:2
	bsf PIE2,TMR3IE		;enable tmr3 interrupt
	bsf INTCON, PEIE        ;enable peripheral interrupts like tmr3
	mov villog,kisido
	mov sorozat,0
	mov steppervillogo,stepperido
	mov T0CON,B'10000010'
	mov TMR0H,HIGH oraido
	mov TMR0L,LOW oraido
	bsf INTCON, TMR0IE

	bsf INTCON,GIE		;enable general interrupt

	mov ADCON0,1		; 0.csat,AD bekapcs.
	mov ADCON1,b'00001110'	; ref GND,Vcc, AN0 analog
	mov ADCON2,b'10111110'	; 
           
	bsf reset		;kepernyo alapeset
	bsf chipselect
	bsf read
	bsf write
	bcf a0
	clrf PORTD

	bcf reset		;reset
	call sokvarakozas
	bsf reset
	call sokvarakozas
	bcf chipselect		;chipselect be
	call sokvarakozas

	call LCD_INIT
	call TEXTTORLES2

	clrf masodperclo
	clrf masodperchi

huhu
parancs 46	;KURZOR beallitas
adat 00
adat 00
parancs 42

	mov ADCON0,B'00000001'	;az AD be, channel 0
	bsf ADCON0,GO
advar
	btfsc ADCON0,DONE
	jmp advar
	movbb szamlalo,ADRESL
	movbb szamlahi,ADRESH
	movbb stepperbase,szamlalo

	carry0
	rrcf szamlahi,f
	rrcf szamlalo,f
	carry0
	rrcf szamlahi,f
	rrcf szamlalo,f
	carry0
	rrcf szamlahi,f
	rrcf szamlalo,f
	carry0
	rrcf szamlahi,f
	rrcf szamlalo,f

	call szamot_kiir

	movlw ' '
	call KARKI
	movlw '-'
	call KARKI

	movbb szamlalo,masodperclo
	movbb szamlahi,masodperchi
	call szamot_kiir

	call sokvarakozas

	btfsc gomb3;	hall1
	jmp nemforo
	bsf foroge,0
	jmp huhu
nemforo
	bcf foroge,0
	jmp huhu

;------------------------------------------------------- R U T I N O K ---------


COMMANDKI
	bsf a0
	bcf write
	movbb PORTD,ERTEK
	CLKVAR
	bsf write
	CLKVAR
	ret

ADATKI
	bcf a0
	bcf write
	movbb PORTD,ERTEK
	CLKVAR
	bsf write
	CLKVAR
	ret

ADATBE
	bsf a0
	mov TRISD,0ff
	bcf read
	CLKVAR
	movbb ERTEK,PORTD
	bsf read
	bcf a0
	clrf TRISD
	ret
            

;KARKI
	movwf TEMP2		;szepite exchanges zeros into space, if set
	btfss szepite,0
	goto simkir
	movlw '0'
	subwf TEMP2,W
	skipz
	goto nemnulla
	mov TEMP2,' '
	goto simkir
nemnulla
	bcf szepite,0
simkir
      	movf TEMP2,w
KARKI
SENDCHAR
	movwf TEMP2
	parancs 42
	movbb ERTEK,TEMP2
	call ADATKI
	ret

szamot_kiir
      	bcf nyolcbites,0
akcijo
	movbb osztandolo,szamlalo
	movbb osztandohi,szamlahi
	mov osztohi, high D'10000' ;ten thousands
	mov osztolo, low D'10000'
	call osztas16
	btfss nyolcbites,0
	call KARKI

	mov osztohi, high D'1000' ;thousand
	mov osztolo, low D'1000'
	call osztas16
	btfss nyolcbites,0
	call KARKI

	mov osztohi, high D'100'  ;hundred
	mov osztolo, low D'100'
	call osztas16
	call KARKI

	mov osztohi, high D'10' ;ten
	mov osztolo, low D'10'
	call osztas16
	call KARKI

	movf munkalo,W		;one
	addlw '0'
	call SENDCHAR
	ret

szunet
	movbb TEMP2,PITCH
cimke3
       mov TEMP1,0ffh
cimke4
       decfsz  TEMP1, F
       jmp    cimke4
       decfsz  TEMP2, F
       jmp    cimke3
       ret


szorzas32			;16*16 bit unsigned multiplication

        clrf    eredmenyhi        ;szorzo(16) times szorzando(16) into osszam(32)
        clrf    eredmenylo
        clrf    eredmeny2hi
        clrf    eredmeny2lo
                           
        movlw   10
        movwf   TEMP1
loop56
        bcf     STATUS, C        ; Clear the carry bit in the status Reg.
	rrcf    szorzohi, F
	rrcf	szorzolo,F

        btfss   STATUS, C
	jmp forgatasok
	movf szorzandolo,W
	carry0
	addwf eredmeny2lo,F
	skipnc
	incf eredmeny2hi
	movf szorzandohi,W
	carry0
	addwf eredmeny2hi,F

forgatasok
        rrcf     eredmeny2hi, F
        rrcf     eredmeny2lo, F
        rrcf     eredmenyhi, F
        rrcf     eredmenylo, F

        decfsz  TEMP1, F
        jmp    loop56
	ret


osztas16
	clrf osztando2lo
	clrf osztando2hi
	clrf oszto2lo
	clrf oszto2hi

osztas32                        ;32 bit binary unsigned division
	clrf munkalo   		;osztando(32) over oszto(32) into eredmeny(32)
	clrf munkahi            ;modulo writed back into osztando!
	clrf munka2lo
	clrf munka2hi

	mov TEMP1,20h		;32 binary step
ciklus2
	carry0
	rlcf osztandolo,F
	rlcf osztandohi,F
	rlcf osztando2lo,F
	rlcf osztando2hi,F
	rlcf munkalo,F
	rlcf munkahi,F
	rlcf munka2lo,F
	rlcf munka2hi,F

	carry1  		;hi word hi byte
	movf oszto2hi,W
	subwf munka2hi,W
	skipnz
	jmp eldonteni2		;equal
	skipnc
	jmp kivonas
	jmp csakbit2  		;less
eldonteni2
	carry1  		;hi word lo byte
	movf oszto2lo,W
	subwf munka2lo,W
	skipnz
	jmp eldonteni3		;equal
	skipnc
	jmp kivonas
	jmp csakbit2  		;less
eldonteni3
	carry1  		;lo word hi byte
	movf osztohi,W
	subwf munkahi,W
	skipnz
	jmp eldonteni4		;equal
	skipnc
	jmp kivonas
	jmp csakbit2  		;less
eldonteni4
	movf osztolo,W		;lo word lo byte
	subwf munkalo,W
	skipc
	jmp csakbit2  		;less

kivonas
	movf oszto2hi,W 	;dd oszto always lower than dd munka
	subwf munka2hi,f

	carry1
	movf oszto2lo,W
	subwf munka2lo,f
	skipc
	decf munka2hi

	carry1
	movf osztohi,W
	subwf munkahi,f
	skipc
	decf munka2lo

	carry1
	movf osztolo,W
	subwf munkalo,f
	skipc
	decf munkahi
	carry1	;it must be 1

csakbit2
	rlcf eredmenylo,F
	rlcf eredmenyhi,F
	rlcf eredmeny2lo,F
	rlcf eredmeny2hi,F
	decfsz TEMP1,F
	jmp ciklus2

	movbb osztandolo, munkalo
	movbb osztandohi, munkahi
	movbb osztando2lo, munka2lo
	movbb osztando2hi, munka2hi

	movf eredmenylo,W
	addlw '0'
        ret

LCD_INIT:               ;DEFAULT BEALLITASOK

parancs 40	;system set
adat 38		;MEGHAJTAS MODJA, ROM TIPUS KULSO(p1,w/s,M2-0) 11H
adat 87		; 8 PIXEL, [P2,WF,FX]
adat 07		;VERTICAL CHAR FIELD,FUGGOLEGES KARAKTER MERET (MAX 0F)
adat 3f		;85 KARAKTER/SOR [C/R](54H)
adat 49		;TOTAL ADDRESS RANGE / ROW [58/78H]
adat 7f		;LINES/FRAME
adat 40;80		;APL (55)
adat 00		;APH, ADDRESS PITCH, A SOR VEGEN A KOV. SOR EL. CURSOR

parancs 44	;SCROLL PARANCS
adat 00		;ELSO KEPERNYO KEZDOCIME (0)
adat 00
adat 3f		;PIXELSOROK SZAMA AZ 1. KEPERNYON (64)
adat 00		;2. KEPERNYO KEZDOCIME
adat 2a		;high grafstart	;[2AH]
adat 3f		;PIXELSOROK SZAMA A 2. KEPERNYON
adat 00		;3. KEPERNYO KEZDOCIME
adat 50		;[8]
adat 3f

parancs 5a	;HDOT SCR PARANCS
adat 00		;SET HORIZONTAL PIXEL SHIFT TO ZERO

parancs 5b	;OVERLAY PARANCS
adat 00		;0 0 0 OV DM1 DM2 MX1 MX0 (01=EXOR) [00]

parancs 5d	;CSR FORM KURZOR ALAKJA
adat 05
adat 87

parancs 59
adat 4	;17		;1. SCREEN, VILLOGO KURZOR, 2. Screen grafikus, 0300H-nal kezd

parancs 4c
ret






LCD_INIT2:               ;DEFAULT BEALLITASOK

parancs 40	;system set
adat 32		;MEGHAJTAS MODJA, ROM TIPUS KULSO(p1,w/s,M2-0) 11H
adat 85		; 6 PIXEL, 512/6=85 MARADEK 2 BLANK (85H)[P2,WF,FX]
adat 07		;VERTICAL CHAR FIELD,FUGGOLEGES KARAKTER MERET (MAX 0F)
adat 54		;85 KARAKTER/SOR [C/R](54H)
adat 58		;TOTAL ADDRESS RANGE / ROW [58/78H]
adat 3F		;LINES/FRAME
adat 55		;APL (55)
adat 00		;APH, ADDRESS PITCH, A SOR VEGEN A KOV. SOR EL. CURSOR

parancs 44	;SCROLL PARANCS
adat 00		;ELSO KEPERNYO KEZDOCIME (0)
adat 00
adat 3f		;PIXELSOROK SZAMA AZ 1. KEPERNYON (64)
adat 00		;2. KEPERNYO KEZDOCIME
adat 04		;[2AH]
adat 3f		;PIXELSOROK SZAMA A 2. KEPERNYON
adat 00		;3. KEPERNYO KEZDOCIME
adat 50		;[8]
adat 3f

parancs 5a	;HDOT SCR PARANCS
adat 00		;SET HORIZONTAL PIXEL SHIFT TO ZERO

parancs 5b	;OVERLAY PARANCS
adat 00		;0 0 0 OV DM1 DM2 MX1 MX0 (01=EXOR) [00]

parancs 5d	;CSR FORM KURZOR ALAKJA
adat 05
adat 87

parancs 59
adat 04	;7	;1. SCREEN, VILLOGO KURZOR, 2. Screen grafikus, 0300H-nal kezd

parancs 4c
ret

TEXTTORLES2
parancs 46	;KURZOR A 0-AS POZICIORA
adat 00
adat 00	;elso kepernyo

meret = D'85' * 8
	mov CIKLOHI, high meret
	mov CIKLOLO, low meret
	incf CIKLOHI
	parancs 42
elsopont2
	adat ' '
	decfsz CIKLOLO
	jmp elsopont2
	decfsz CIKLOHI
	jmp elsopont2
	ret

hexaszamot_kiir
	movwf IDEG
	andlw 0f0
	movwf ELSONIB
	rrncf ELSONIB
	rrncf ELSONIB
	rrncf ELSONIB
	rrncf ELSONIB
	parancs 42
	call szamjegy
	movf IDEG,w
	andlw 0f
	movwf ELSONIB
	call szamjegy
	mov ERTEK,20
	call ADATKI
	ret

szamjegy
	mov TBLPTRU,0
	mov TBLPTRH, high hexaszamok
	mov TBLPTRL, low hexaszamok
	movf ELSONIB,w
	addwf TBLPTRL,f
	TBLRD*
	movbb ERTEK, TABLAT
	call ADATKI
	ret

hexaszamok
db "0123456789ABCDEF",0,0,0

szoveglup
	tblrd*+
	movbb ERTEK, TABLAT
	call ADATKI
	movlw 0
	cpfseq ERTEK
	jmp szoveglup
	ret

szoveg1
db "Ez az elso kis szovegem!! -----------",0



sokvarakozas                 ;a long wait
	mov TEMPVK3,2
cimkex3
	mov TEMPVK2,0
cimkex2              
	mov TEMPVK1,0
cimkex
	decfsz  TEMPVK1, F
	jmp    cimkex
	decfsz  TEMPVK2, F
	jmp    cimkex2
	decfsz  TEMPVK3, F
	jmp    cimkex3
	ret

kisvarakozas
       
	mov TEMPVK2,12 	;a minimum
cimkey2              
	mov TEMPVK1,0
cimkey
	decfsz  TEMPVK1, F
	jmp    cimkey
	decfsz  TEMPVK2, F
	jmp    cimkey2

	ret


;-----------------------------------------

END
