biphali: /////////// bi-phase driver
// calls from main in fast cycle
//
ldi tmp1,$c0
sbis BI1PORT-2,BI1BIT
cbr tmp1,$40
sbis BI2PORT-2,BI2BIT ; сигналы на разных портах
cbr tmp1,$80
eor tmp1,biphase ; <1> = B2B1 0 0 0 0 0 0
cpi tmp1,$40
brlo bisel0 ; return if B1B2 readed same as prev. saved
eor tmp1,biphase ; cc000000
lsr biphase
lsr biphase ; biphase bbaaS000 --> 00bbaaS0
or tmp1,biphase ; ccbbaaS0
cbr tmp1,$f ; ccbb0000
sbrc biphase,1
sbr tmp1,1<<3 ; ccbbS000 === OK
mov biphase,tmp1
cpi tmp1,$90
brsh biret ; phases 9..f: do nothing
swap tmp1
sbrc tmp1,7
subi tmp1,-$89 ; $80..$89 --> 9..17d
LDADDR Z,bisel0 ; 2,4:set minus 1,5: set plus 8 Forw 7 Rev
cpi tmp1,18
brsh biret ; fuse: <tmp1>= 0..17
ADD21 ZH,Zl,tmp1
ijmp ; 984
bisel0: ret bisel1: ret bisel2: rjmp bisem bisel3: ret
bisel4: rjmp bisem bisel5: ret bisel6: ret bisel7: ret
bisel8: rjmp bifo
bisel9: ret bisel10: rjmp bisep bisel11: rjmp bire bisel12: ret
bisel13: ret bisel14: ret bisel15: ret bisel16: ret
bisel17: rjmp bisep
bisem: ldi tmp1,8 ; set minus
or biphase,tmp1
ret
bisep: ldi tmp1,~8 ; set plus
and biphase,tmp1
ret
bifo: lds tmp2,bico ; step forward
inc tmp2
rjmp biend
bire: lds tmp2,bico ; step backward
dec tmp2
biend: sts bico,tmp2
biret: ret
; bico накапливает шаги в быстром цикле, потом раз в 40 мс они прибавляются к основному значению и отображаются