;  FANUC 02 serial encoder
;
;  PD1 UART TxD
;  PD2 F02SE data input
;  PB0 F02SE REQ
;  PB1 F02SE #REQ
;
;  XT 12MHz

.include "m8def.inc"
.cseg
.org $0		RJMP INIT
.org $09	RJMP TIMER0
.org $013	RETI
.org $01F

.def regbits=r20

TIMER0:		;2Hz
  in   r21,sreg
  // cteci pulz [8us @12MHz = 96clk]
  // PB0 F02SE  REQ   PB1 F02SE #REQ
  ldi  r19,$01
  out  portb,r19 	; _/

  ldi  r19,$0
  pulz:			;smycka 60-1 clk
    inc r19		;1
    cpi r19,23	;1
  brne pulz		;2 nebo 1 nakonci

  ldi  r19,$02	;1
  out  portb,r19 	; \_
  ori  regbits,1	;sync bit
  ldi  r19,$0
  out  sreg,r21
RETI


INIT:
; config SP
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16

; config IO
ldi r16,$0
out sfior,r16
;    B		
ldi r16,$0		;stav 0
out portb,r16
ldi r16,$FF		;out
out ddrb,r16
;    C			
ldi r16,$0		;stav 0
out portc,r16
ldi r16,$FF		;out
out ddrc,r16
;    D			
ldi r16,$FF		;stav1 + PU na TxD
out portd,r16
ldi r16,0b00000010 ;in	mimo TxD
out ddrd,r16

; RAM hadr
ldi r16,0
ldi XL,$60
ldi XH,$00
clr_ioreg:
 st X+,r16
cpi XL,$0
brne clr_ioreg

; UART	19200@12MHz
ldi r17,0
ldi r16,38		
out UBRRH, r17
out UBRRL, r16
ldi r16, 0b10001110 ;URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
out UCSRC,r16
ldi r16, 0b10011000	;RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
out UCSRB,r16
ldi r16, 0b00000000 ;RXC TXC UDRE FE DOR PE U2X MPCM
out UCSRA,r16

; int+timer0
ldi r16,0b00000010	;ckio/1024
out TCCR0,r16
ldi r16,0b00000001	;TOIE
out TIMSK,r16
sei

/*;poslat intro (test UART)
ldi  r16,$11
call transmit
ldi  r16,$22
call transmit
ldi  r16,$33
call transmit
ldi  r16,$44
call transmit
ldi  r16,$55
call transmit
ldi  r16,$66
call transmit

ldi  r16,$77
call transmit
*/
;=== zacatek of main ===
LOOP:

cekejnatimer:	;ceka na sync timeru
sbrs regbits,0
  rjmp cekejnatimer
andi regbits,$FE

sbrc regbits,1	;data se posilaji, necist.
  rjmp skipscan

ldi r18,$0
ldi XL,$60
ldi XH,$0
ldi r17,47	;znacka namisto prvniho blabolu, pocet datovych B

cekejna1:	;ceka na 1 na dat.pinu 
sbis pind,2
  rjmp cekejna1
;cli

scan_byte:		
  ;nacteni 1B,celkem 184b [2Mbps @ osc12MHz = 6CLKS na bit] 
  ;			   		instrukce navic
  ;= bit7
  in  r16,pind	;1
  bst r16,2		;1
  st  X+,r17	;2	--	ulozi predchozi byte do BUF
  lsl r17		;1
  bld r17,0		;1
  ;= bit6
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  nop			;1
  nop			;1
  ;= bit5
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  nop			;1
  nop			;1
  ;= bit4
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  nop			;1
  nop			;1
  ;= bit3
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  nop			;1
  nop			;1
  ;= bit2
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  nop			;1
  inc r18		;1	-	pricte pointer
  ;= bit1
  in  r16,pind	;1
  bst r16,2		;1
  lsl r17		;1
  bld r17,0		;1
  lsl r17		;1	-	posun pro nasledny bit
  cpi r18,24	;1	-	porovna s maximem
  ;= bit0
  in  r16,pind	;1
  bst r16,2		;1
  bld r17,0		;1
  nop			;1
  brne scan_byte ;2 --  2 if jump

  st X+,r17				;ulozi posledni byte do BUF
  ori regbits,$02		;bit1 pozadavek odeslat
  ;sei

skipscan:
  ldi r18,0		;prenos dat priprava
  ldi XL,$60
  ldi XH,$0
poslatbyte:
  ld r16,X+
  call transmit
  inc r18
  cpi r18,24
brne poslatbyte   

  ldi r18,0		;prenos dat priprava
  ldi XL,$60
  ldi XH,$0
  st  X,r18
poslatbyte1:
  ld r16,X+
  call transmit
  inc r18
  cpi r18,24
brne poslatbyte1   


call delay

andi regbits,$FC ; nulovat SEND a TIMER

RJMP LOOP
;=== konec of main ===

transmit:
    waittransmitter:
      sbis ucsra,udre
    rjmp waittransmitter
    out  udr,r16		;odeslani 1B
RET

delay:
; koncova prodleva 1275x1019 taktu = 108.26875ms

ldi r18,0
wait2:
  inc r18
  ldi r17,0
  wait1:
    inc  r17
    ldi  r16,0
    wait0:
      inc  r16	;1
      cpi  r16,0	;1
    brne wait0	;2
    cpi  r17,0
  brne wait1
  cpi r18,5
brne wait2

RET


