А можно посмотреть пример такого кода, до и после правки?
Вид для печати
andreyu, можете в evo sdk заглянуть для примера. это не мой продукт, конечно. но хорошо показывает подобную ситуацию. особенно с xnx и robo.
Я имел обыкновение думать, что это, но после того, как на самом деле пытается это с функции, имеющие более чем один или два параметра я больше не думаю, что это просто дело вкуса.Цитата:
Он неэкономно передаёт параметры (даже однобайтовые - всегда в двух байтах).
Цитата:
а вот это уже вопрос вкуса - кому то это не экономно, а кому то лишние inc sp не экономно (а именно так sdcc и передаёт 8ми битные аргументы стэком, может посчитаем, как оно более оптимально по тактам передавать, просто на стек кинув значение или кинуть да ещё и стэком отдельно крутить?) мне 1 байт не впадлу со стэка отдать, у меня памяти не 48кб, не жалко.
Я могу вам сказать, что для игры "Piętro Bros" после изменения интерфейса нирванную использовать символы так, чтобы SDCC могли бы объединить два символа в один 16-битное значение в параметрах, размер программы сократился на 400 байт, а код был, вероятно, в целом немного быстрее.
Я покажу вам, почему. Это одна строка C кода, вызывающего в нирване двигателя:
Скрытый текст
I used to think this but after actually trying this with functions having more than one or two parameters I no longer think it is simply a matter of taste.
I can tell you that for the game "pietro bros" after changing the nirvana interface to use chars so that sdcc could combine two chars into a single 16-bit value in parameters, the program size shrank by 400 bytes and the code was probably overall a little bit faster.
I will show you why. This is one line of C code calling into the nirvana engine:
[свернуть]
Если я прототипирование эту функцию принимает "Integer" параметры, как:Код:NIRVANAP_drawT( tmp0 , tmp, hit_col[index_player] );
extern void NIRVANAP_drawT(unsigned int tile,unsigned int lin,unsigned int col);
генерируемый в одном месте, это было:
Скрытый текст
If I prototyped this function taking integer parameters as in:
the generated call in one place was this:
[свернуть]
Это добавляет до 40 байт и 216 циклов.Код:ld a,+((_hit_col) & 0xFF)
ld hl,_index_player
add a, (hl)
ld c,a
ld a,+((_hit_col) / 256)
adc a,0x00
ld b,a
ld a,(bc)
ld (ix-3),a
ld (ix-2),0x00
ld hl,_tmp
ld c,(hl)
ld b,0x00
ld hl,_tmp0
ld e,(hl)
ld d,0x00
pop hl
push hl
push hl
push bc
push de
call _NIRVANAP_drawT_callee
Если я прототипирование функцию, принимая мангалов параметры, как:
extern void NIRVANAP_drawT(unsigned char tile,unsigned char lin,unsigned char col);
результат был:
Скрытый текст
This adds up to 40 bytes and 216 cycles.
If I prototyped the function taking char parameters as in:
the result was:
[свернуть]
Это добавляет до 25 байт и 127 циклов. Это совсем немного лучше.Код:ld a,(_index_player)
add a,+((_hit_col) & 0xFF)
ld c,a
ld a,+((_hit_col) / 256)
adc a,0x00
ld b,a
ld a,(bc)
push af
inc sp
ld hl,(_tmp - 1)
ld a,(_tmp0)
ld l,a
push hl
call _NIRVANAP_drawT_callee
Это с zsdcc (версия z88dk о SDCC), так что SDCC само по себе не так хороша, но она по-прежнему бьет первую версию.
Скрытый текст
This adds up to 25 bytes and 127 cycles. That's quite a bit better.
This is with zsdcc (z88dk's version of sdcc) so sdcc itself is not quite as good but it still beats the first version.
[свернуть]
Sayman, можешь написать что используешь дляхайтека на цп/м? Геттинг стартид какой.
Smalovsky, для запуска компилятора под вендой я использую такой консольный эмулятор цпм: http://www.vector.co.jp/soft/win95/util/se378130.html
он умеет возвращать винде код завершения HitechC, что нужно для make.
что ты имеешь в виду?Цитата:
Геттинг стартид какой.
Он имеет в виду мануал для быстрого вруливания в хайтех - что как и за чем делать. Хотя бы на примере ХеллоВорлда - от исходника на Си, пошагово как компилить, как запускать внешний оптимизатор, чуть-чуть тонкостей про ключики. И как получить на выхлопе окончательный сильно оптимизированный бинарь или tap/trd'шку ;-)
не. писать мануалы я не буду. можно заглянуть в профильный раздел Ориона. там есть тема про uzix. там есть архив описание как что собирать и есть make файл. опять таки, есть мануал на буржуйском на сам компилятор.
Решил на свою голову замутиться парой програмулек на sdcc 3.6.0. в процессе написания натолкнулся на некий неописуемый баг. решил, для теста написать просто пустой си файл с одной main функцией и одной строкой, в ней и проблема:
компилю и вижу строки в asm файле:Код:void main()
{
int a;
a = 400;
}
приехали! эт как? что делать с этим? писал писал, в итоге всё коту под хвост...Код:; ---------------------------------
; Function main
; ---------------------------------
_main::
;test3.c:28: a = 400;
ret
.area _CODE
.area _INITIALIZER
.area _CABS (ABS)
sdcc похуже z88dk