BIN2BCD можно шустрей как-нить? На 2313 делаю. почти 2000 циклов. nolist
.include "include\2313def.inc"
.list
.def cnt=r17
.def tmp=r16
.def con03=r11
.def con30=r12
.def bin0=r2 ; бинарник для преобразования
.def bin1=r3
.def bin2=r4
.def bin3=r5
.def bcd01=r6 ; результат сдесь
.def bcd23=r7
.def bcd45=r8
.def bcd67=r9
.def bcd89=r10
;rjmp reset ;reset
;reset:
;cli ;disable interr
; ldi tmp, RAMEND ;stack to top
; out SPL, tmp
; rcall bin2bcd
;nop
; rjmp reset
bin2bcd:
ldi tmp, 0x03 ; добавлять к младшей
mov con03, tmp
ldi tmp, 0x30 ; и старшей тетераде для коррекции
mov con30, tmp
eor bcd01,bcd01
eor bcd23,bcd23
eor bcd45,bcd45
eor bcd67,bcd67
eor bcd89,bcd89
ldi cnt,0x02 ; сдвиги по числу бит в истонике.
loop1: ; первые 2 можно не проверять
;---shift bin
lsl bin0
rol bin1
rol bin2
rol bin3 ;done
;---shift bcd
rol bcd01
rol bcd23
rol bcd45
rol bcd67
rol bcd89 ;done
dec cnt
brne loop1
ldi cnt, 0x1E ; 30 dec: 32-2 осальные сдвиги, кол-во
loop2:
b0: ;--- check and kcorrected bcd
mov tmp, bcd01
andi tmp, 0x0F ; младшая тетрада если больше 5
cpi tmp, 0x05
brlo b1
add bcd01, con03 ;тогда +3
b1:
mov tmp, bcd01 ; и так каждые 4 бита
andi tmp, 0xF0
cpi tmp, 0x50
brlo b2
add bcd01, con30
b2:
mov tmp, bcd23
andi tmp, 0x0F
cpi tmp, 0x05
brlo b3
add bcd23, con03
b3:
mov tmp, bcd23
andi tmp, 0xF0
cpi tmp, 0x50
brlo b4
add bcd23, con30
b4:
mov tmp, bcd45
andi tmp, 0x0F
cpi tmp, 0x05
brlo b5
add bcd45, con03
b5:
mov tmp, bcd45
andi tmp, 0xF0
cpi tmp, 0x50
brlo b6
add bcd45, con30
b6:
mov tmp, bcd67
andi tmp, 0x0F
cpi tmp, 0x05
brlo b7
add bcd67, con03
b7:
mov tmp, bcd67
andi tmp, 0xF0
cpi tmp, 0x50
brlo b8
add bcd67, con30
b8:
mov tmp, bcd89
andi tmp, 0x0F
cpi tmp, 0x05
brlo b9
add bcd89, con03
b9:
mov tmp, bcd89
andi tmp, 0xF0
cpi tmp, 0x50
brlo bcdCorr
add bcd89, con30
bcdCorr: ; сдвигаем все после коррекции
;---shift bin
lsl bin0
rol bin1
rol bin2
rol bin3 ;done
;---shift bcd
rol bcd01
rol bcd23
rol bcd45
rol bcd67
rol bcd89 ;done
dec cnt
brne loop2 ; и так пока не сдвинем все.
ret