давно занимает эта тема
вот, решил потестировать все компиляторы, до которых дотянулись руки
проверял на банальнейшей штуке - заливке всего экрана черным цветом, вот такой вот код:
Код:
int main()
{
unsigned char* t;
t = 16384;
while (t<16384+6144)
{
*t = 255;
t++;
}
return 0;
}
специально не использовал никаких библиотек, если что, их всегда можно написать самому, да и не нужна на спеке добрая половина их возможностей.
первым попался под руку z88dk
вот что он мне выдал
Код:
._main
ld hl,16384 ;const
push hl
.i_3
pop hl
push hl
ld de,22528 ;const
ex de,hl
call l_ult
jp nc,i_4
pop hl
push hl
ld (hl),#(255 % 256 % 256)
pop hl
inc hl
push hl
dec hl
jp i_3
.i_4
ld hl,0 ;const
pop bc
ret
то есть даже в таком примитивном коде наворочено по максимуму
причем, это только асмовый исходник, после линковки он добавляет еще мусора
пытаться скомпилировать этот код руками не стал, нервы дороже
в общем, барахло, а не компилятор
Дальше был sdcc
им уже вполне можно пользоваться, судите сами:
Код:
org #9c40
_main_start::
_main:
ld bc,#4000
_l00101:
ld e,c
ld d,b
ld a,e
sub a,#00
ld a,d
sbc a,#58
jp p, _l00103
ld a,#FF
ld (bc),a
inc bc
jp _l00101
_l00103:
ld hl,#0000
_l00104:
ret
слишком много явно лишних операций(типа вычитания нуля из аккумулятора), но это уже что-то
но хотелось лучшего и я полез в инет
нашел еще компилятор от Softools, но он слишком хотел денег и у меня запуститься отказался наотрез
и, в конце-концов наткнулся на компилятор от IAR. Плох он тем, что нет command-line утилит, все встроено в IDE, и писать приходится в нем, неудобно, все же FAR роднее
вот такое вот чудо он нагенерировал:
Код:
org #9c40
main:
PUSH BC
PUSH IX
LD IX,0
ADD IX,SP
PUSH AF
LD (IX-2),0
LD (IX-1),64
l0001:
LD BC,22528
LD L,(IX-2)
LD H,(IX-1)
AND A
SBC HL,BC
JR NC,l0000
l0002:
LD L,(IX-2)
LD H,(IX-1)
LD (HL),255
INC (IX-2)
JR NZ,l0003
INC (IX-1)
l0003:
JR l0001
l0000:
LD SP,IX
POP IX
POP BC
RET
оно, конечно, работает, но не радует, блин
и тут меня как ударило - что-то слишком активно с памятью он работает, и я полез искать в опциях настройки компиляции
и вот оно! оптимизация - Default/Size/Speed
ну, поставил Speed на максимум
вот что выдал:
Код:
org #9c40
main:
PUSH BC
PUSH DE
LD DE,16384
l0001:
LD BC,22528
LD H,D
LD L,E
AND A
SBC HL,BC
JR NC,l0000
l0002:
LD H,D
LD L,E
LD (HL),255
INC DE
JR l0001
l0000:
POP DE
POP BC
RET
довольно непривычно глазу(я б не так написал :-)), но работает
а, главное, действительно оптимизировано, лень такты подсчитывать, но, думаю, это самый быстрый вариант
к чему я это все? да ни к чему, просто хотелось радостью поделиться, нашел хоть один нормальный компилятор :-)
вообще, неудивительно, что он дает такой неплохой код, все-таки коммерческая разработка для промышленного применения
если кто заинтересовался - компилер можно бесплатно скачать с www.iar.com(4 мега). Там написано, что это демо-версия, но никаких ограничений пока не заметил
ЗЫ везде из сгенеренного компилером кода вычищен весь мусор и сам код переделан для нормального ассемблирования сторонним спектрумским ассемблером(я юзал sjasm)