На данный момент уже могут компилироваться многие программы работающие с 8 битной арифметикой. Имеются некоторые недоделки в плане условий (if). Для примера приведу код вычисления crc8:
Код:
unsigned char test(unsigned char *a, unsigned char size)
{
unsigned char crc = 0xFF;
unsigned char i;
while (size--)
{
crc ^= *a++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc<<1) ^ 0x31 : crc<<1;
}
return crc;
}
А вот что мы получаем на выходе (входные данные передаются через HL - указатель на массив, A - длина массива):
Код:
; BB#0: ; %entry
ld b, a
ld c, -1
jp .BB0_3
.BB0_2: ; %while.cond.loopexit
; in Loop: Header=BB0_3 Depth=1
inc hl
.BB0_3: ; %while.cond.loopexit
; =>This Loop Header: Depth=1
; Child Loop BB0_5 Depth 2
ld a, b
cp 0
jp z, .BB0_1
; BB#4: ; %while.body
; in Loop: Header=BB0_3 Depth=1
ld a, (hl)
xor c
ld e, a
ld d, 0
dec b
.BB0_5: ; %for.body
; Parent Loop BB0_3 Depth=1
; => This Inner Loop Header: Depth=2
ld a, e
and -128
ld hx, a
sla e
ld a, e
xor 49
ld c, a
ld a, hx
cp 0
jp nz, .BB0_7
; BB#6: ; %for.body
; in Loop: Header=BB0_5 Depth=2
ld c, e
.BB0_7: ; %for.body
; in Loop: Header=BB0_5 Depth=2
inc d
ld a, d
cp 8
ld e, c
jp z, .BB0_2
jp .BB0_5
.BB0_1: ; %while.end
ld a, c
ret
Конечно не всё идеально, но crc8 вычисляется правильно. Если у кого-то есть свои примеры и интересно во что они скомпилируются, кидайте, покажу. Но замечу еще раз, что пока работа полностью реализована только для 8 битной арифметики, т.е. int пока в вычислениях использовать не получится. В ближайшее время займусь как раз реализацией 16 битной арифметики. Пока из нового все.