PROCESSOR 16f84
	RADIX HEX
	INCLUDE "P16F84.INC"
	__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC

MEM	EQU	0X0C
L1	EQU	MEM+1
L2	EQU	MEM+2
P1	EQU	MEM+4
P2	EQU	MEM+5
INERROR	EQU	MEM+7
COMMAND	EQU	MEM+8
TIMER	EQU	MEM+9
BITS	EQU	MEM+10
CMDTEMP	EQU	MEM+11

#DEFINE	LED	PORTA, 2
#DEFINE	RX	PORTA, 0
#DEFINE	TOWERL	PORTB, 0
#DEFINE	TOWERR	PORTB, 1
#DEFINE	RIGHTU	PORTB, 4
#DEFINE	RIGHTD	PORTB, 5
#DEFINE	LEFTU	PORTB, 6
#DEFINE	LEFTD	PORTB, 7
#DEFINE	MANUAL	PORTB, 2      ;SENSOR na MANUAL režim
			ORG	0X00	
GOTO	BEGIN
			
M100	MOVLW	D'207'
		MOVWF	L1
		MOVLW	D'160'
		MOVWF	L2
		RETURN			
			
TIME  	MOVF    L2, 0
        MOVWF   P2
TIME2  	MOVF    L1, 0
        MOVWF   P1
TIME1  	DECFSZ  P1, 1
        GOTO    TIME1
        DECFSZ  P2, 1
        GOTO    TIME2
        RETURN
           				
BEGIN
	BSF	STATUS, RP0
	MOVLW	B'11111011'
	MOVWF	TRISA
	MOVLW	B'00001100'
	MOVWF	TRISB
	MOVLW	B'10000101'
	MOVWF	OPTION_REG
	BCF	STATUS, RP0
		
TAKE
	BSF	INERROR, 0
	BTFSS	RX
	GOTO	EEND
	CLRF	TMR0

SH	BTFSC	RX
	GOTO	SH
	MOVF	TMR0, 0
	MOVWF	TIMER
	MOVLW	D'100'
	SUBWF	TIMER, 0
	BTFSS	STATUS, C
	GOTO	EEND
	MOVLW	D'105'
	ADDWF	TIMER, 0
	BTFSC	STATUS, C
	GOTO	EEND
			
	CLRF	TMR0

SL	BTFSS	RX
	GOTO	SL
	MOVF	TMR0, 0
	MOVWF	TIMER
	MOVLW	D'50'
	SUBWF	TIMER, 0
	BTFSS	STATUS, C
	GOTO	EEND
	MOVLW	D'180'
	ADDWF	TIMER, 0
	BTFSC	STATUS, C
	GOTO	EEND

	MOVLW	D'7'
	MOVWF	BITS
RDCMD
	CLRF	TMR0
RDCMD1
	BTFSC	RX	
	GOTO	RDCMD1
	MOVF	TMR0, 0
	MOVWF	TIMER
	MOVLW	D'11'
	SUBWF	TIMER, 0
	BTFSS	STATUS, C
	GOTO	EEND
	MOVLW	D'234'
	ADDWF	TIMER, 0
	BTFSC	STATUS, 0
	GOTO	EEND

RDCMD2
	BTFSS	RX
	GOTO	RDCMD2
	MOVF	TMR0, 0
	MOVWF	TIMER
	MOVLW	D'11'
	SUBWF	TIMER, 0
	BTFSS	STATUS, C
	GOTO	EEND
	MOVLW	D'180'
	ADDWF	TIMER, 0
	BTFSC	STATUS, C
	GOTO	EEND
	MOVLW	D'217'
	ADDWF	TIMER, 0
	BTFSC	STATUS, C
	GOTO	CMDH
			
CMDL	RRF	COMMAND, 1
	GOTO	NEXTCMD
CMDH	RRF	COMMAND, 1 
						
NEXTCMD
	DECFSZ	BITS, 1
	GOTO	RDCMD
	RRF	COMMAND, 1
	CLRF	TMR0

EH	BTFSC	RX
	GOTO	EH
	MOVF	TMR0, 0
	MOVWF	TIMER
	MOVLW	D'62'
	SUBWF	TIMER, 0
	BTFSS	STATUS, C
	GOTO	EEND
	MOVLW	D'131'
	ADDWF	TIMER, 0
	BTFSC	STATUS, C
	GOTO	EEND
			
	CLRF	INERROR			
		
EEND
	BTFSC	INERROR, 0
	GOTO	TAKE
	MOVF	COMMAND, 0
	MOVWF	CMDTEMP
			
MOVE_UD
	MOVLW	B'00001111'		
	ANDWF	CMDTEMP, 1
	MOVF	CMDTEMP, 0
	BTFSS	STATUS, Z
	GOTO	MOVE1
	GOTO	OFF
			
MOVE1
	MOVF	CMDTEMP, 0
	SUBLW	B'00000010'
	BTFSS	STATUS, Z
	GOTO	MOVE2
	BTFSS	MANUAL		;testovanie ci je na SENZORE 1
	GOTO	MAN1		;ked je MANUAL 1, preskoci
	GOTO	OFF			;prejde na MOVE_UD
MAN1
	BCF	RIGHTD
	BCF	LEFTD
	BSF	RIGHTU
	BSF	LEFTU
	GOTO	MOVETOVER
						
MOVE2
	MOVF	CMDTEMP, 0
	SUBLW	B'00001000'
	BTFSS	STATUS, Z
	GOTO	MOVE3
	BTFSS	MANUAL		;testovanie ci je na SENZORE 1
	GOTO	MAN2		;ked je MANUAL 1, preskoci
	GOTO	OFF			;prejde na MOVE_UD
MAN2
	BCF	RIGHTU
	BCF	LEFTU
	BSF	RIGHTD
	BSF	LEFTD
	GOTO	MOVETOVER
			
MOVE_LR
MOVE3
	MOVF	CMDTEMP, 0
	SUBLW	B'00000001'
	BTFSS	STATUS, Z
	GOTO	MOVE4
	BTFSS	MANUAL		;testovanie ci je na SENZORE 1
	GOTO	MAN3		;ked je MANUAL 1, preskoci
	GOTO	OFF			;prejde na MOVE_UD
MAN3
	BCF	LEFTU
	BCF	RIGHTD
	BSF	LEFTD
	BSF	RIGHTU
	GOTO	MOVETOVER
			
MOVE4
	MOVF	CMDTEMP, 0
	SUBLW	B'00000100'
	BTFSS	STATUS, Z
	GOTO	MOVETOVER
	BTFSS	MANUAL		;testovanie ci je na SENZORE 1
	GOTO	MAN4		;ked je MANUAL 1, preskoci
	GOTO	OFF			;prejde na MOVE_UD
MAN4	
	BCF	RIGHTU
	BCF	LEFTD
	BSF	RIGHTD
	BSF	LEFTU
			
MOVETOVER
	MOVF	COMMAND, 0
	MOVWF	CMDTEMP
	MOVLW	B'01110000'		
	ANDWF	CMDTEMP, 1
	MOVF	CMDTEMP, 0
	BTFSS	STATUS, Z
	GOTO	MOVET1
	BCF	TOWERL
	BCF	TOWERR
	BCF	LED
	GOTO	TAKE
			
MOVET1
	MOVF	CMDTEMP, 0
	SUBLW	B'00010000'
	BTFSS	STATUS, Z
	GOTO	MOVET2
	BCF	TOWERR
	BSF	TOWERL
	GOTO	TAKE

MOVET2
	MOVF	CMDTEMP, 0
	SUBLW	B'01000000'
	BTFSS	STATUS, Z
	GOTO	MOVET3
	BCF	TOWERL
	BSF	TOWERR
	GOTO	TAKE
			
MOVET3
	MOVF	CMDTEMP, 0
	SUBLW	B'00100000'
	BTFSS	STATUS, Z
	GOTO	TAKE
	BSF	LED
	CALL	M100
	CALL	TIME
	BCF	LED
	CALL	M100
	CALL	TIME
	BSF	LED
	CALL	M100
	CALL	TIME
	BCF	LED
	CALL	M100
	CALL	TIME
	BSF	LED
	CALL	M100
	CALL	TIME
	BCF	LED
	GOTO	TAKE

OFF
	BCF	RIGHTU
	BCF	LEFTU
	BCF	RIGHTD
	BCF	LEFTD
	GOTO	MOVETOVER

END