
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Bin to ASCII
// IN = value
// A B C = ascii code of digits
#define BIN8toASCII3(a_,b_,c_,in_) \
do
{
asm volatile(
"LDI %A[RA],-1+'0'" "\n\t"
"bcd1%=:" "INC %A[RA]" "\n\t"
"SUBI %A[RC],100" "\n\t" \
"BRCC bcd1%=" "\n\t" \
"LDI %A[RB],10+'0'" "\n\t" \
"bcd2%=:" "DEC %A[RB]" "\n\t"
"SUBI %A[RC],-10" "\n\t" \
"BRCS bcd2%=" "\n\t" \
"SBCI %A[RC],-'0'" "\n\t" \
: [RA]"=a" (a_), [RB]"=a" (b_), [RC]"=a" (c_) \
: "[RC]" (in_)
);
}
while(0)
Нет, это не УЖОСНАХ, а GCCшная ассемблерная вставка. Я корячил
алгоритм BIN2ASCII и так и, эдак, потом решил, что красивей, короче и
быстрей чем на ассемблере не получится и воткнул его в код так. О том, как
писать такие вставки в GCC неплохо написал Alatar в нашем сообществе.
Если кто не читал, то рекомендую. Также, если будут желающие, то я
дополнительно постараюсь разжевать эту тему до состояния манной каши.
Аккуратно припаялся к пленочке, выставив минимальную температуру
паяльника (около 230 градусов), чтобы не поплавить нежную плёночку. А
потом, для демонстрации, прибил все к какому-то блокнотику, что завалялся
под рукой.