korekcja dziesiętna char-jak?

0

Czy macie może sposób na inne wykonanie konwersji z hex na upakowane bcd?
Ja zrobiłem to tak ale to przekombinowane. Czy może mozna prościej?

char hextobin(char x){
unsigned char y;
y=x;
x%=10;
y/=10;
y%=10;
y<<=4;
x=x|y;
return x;
}

W asemblerze to proste jak drut. A w C, kompilator z tego zrobił modlitwę (zresztą prawidłowo).
Oczywiście zakres do 99 binarnie i x to char. Nic więcej nie potrzebuję.

0

To nie kompilator zrobił z tego modlitwę zaś ty.
char hextobin(char x) { return ((x/10)<<4)|(x%10); }

0

Dziękuję za pomoc, ale po kompilacji nie wyglada lepiej.

_hextobin:
mov r7,dpl
; lcdht.c return ((x/10)<<4)|(x%10);
clr F0
mov b,#0x0a
mov a,r7
jnb acc.7,00103$
cpl F0
cpl a
inc a
00103$:
div ab
jnb F0,00104$
cpl a
inc a
00104$:
swap a
anl a,#0xF0
mov r6,a
mov b,#0x0a
mov a,r7
clr F0
jnb acc.7,00105$
setb F0
cpl a
inc a
00105$:
div ab
mov a,b
jnb F0,00106$
cpl a
inc a
00106$:
orl a,r6
mov dpl,a
ret

a w asm

KOREKCJA:
MOV B,#10
DIV AB
SWAP A
ADD A,B
RET

Ech..... coś czuje że wstawka w ASM konieczna ;)

W dodatku RIDE7 tego nie łapie! (return ((x/10)<<4)|(x%10); )
W sdcc nie ma problemu. Ale w ride kod mniejszy o 30%:(

1 użytkowników online, w tym zalogowanych: 0, gości: 1