;Перевод 2ух байтового числа в 5 цифр для семисегментного индикатора
;Вызов
; void int2bcdASM(char *dst,int i);
;
;308 циклов 74 байт
MODULE int2bcd
RSEG CODE
PUBLIC int2bcdASM
int2bcdASM:
;R16-указатель на конечный буфер
;R18:R19-исходная величина
;R20,R21,R22- переходные регистры
mov R30,R16
mov R31,R17
ldi R20,0
ldi R21,1
mov R22,R20
; mov R31,R20
Lab0: ;цикл
subi R20,-$33 ;add 0x30
sbrs R20,7
subi R20,$30 ;add 0x30
sbrs R20,3
subi R20,$03 ;add 0x03
tst R22
breq Lab1
subi R21,-$33 ;add 0x30
sbrs R21,7
subi R21,$30 ;add 0x30
sbrs R21,3
subi R21,$03 ;add 0x03
Lab1:
lsl R18
rol R19
rol R20 ;a
rol R21 ;b
rol R22 ;c
brcc Lab0
;закончили, перенести значение в конечный буфер
andi R22,0x0F ;
st Z, R22
mov R16,R21
swap R21
andi R21,0x0F
std Z+1,R21
andi R16,0x0F
std Z+2,R16
mov R16,R20
swap R20
andi R20,0x0F
std Z+3,R20
andi R16,0x0F
std Z+4,R16
RET
END