Ну, раз так, будь добр, поделись настройками HiTech C для хорошего кода.
Речь же о версии 3.09 для cp/m? Пробовал его "в общем порядке" - сгенереный код ничем не отличается от кучи других компиляторов тех лет.
Вид для печати
Sergey, я по совету Еррора перепроверил доку на предмет работы оптимизатора, перепроверил то, что я ему скармливал и пришёл к выводу, что всё время я ему пытался скормить файлы получаемые от p1.com. он же генерирует подобие "байткода", который потом нужно скормить cgen, который потом выдаст асм листинг. я и не думал, что оптимизатору нужно именно его подсовывать. я думал, байткодовый файл оптимизатору нужен. устранив свой же косяк я увидел ооочень хорошо оптимизированный код. ну как оптимизированный, на фоне того, что он генерит до оптимизации, это оптимизация. да и sdcc явно не лучше даёт код ну или в крайнем случае, рядом где-то ходят. самое простое, пример с hello world, без оптимизатора:
а это с оптимизатором:Код:psect text
global _main
_main:
global ncsv, cret, indir
call ncsv
defw f38
global _printf
ld hl,19f
push hl
call _printf
ld hl,2
add hl,sp
ld sp,hl
l3: jp cret
f38 equ 0
psect data
19: defb 72,101,108,108,111,32,119,111,114,108,100,33,33,33,10,0
тем более, если говорить про тот же evosdk, то там используется старая версия sdcc, а с новой, говорят. косяки. у меня у самого не получается нормально заставить нормально работать сдк с новым sdcc.Код:global _main
global ncsv, cret, indir
global _printf
psect text
_main:
ld hl,19f
push hl
call _printf
pop bc
ret
psect data
19: defb 72,101,108,108,111,32,119,111,114,108,100,33,33,33,10,0
psect text
Надеюсь, ты добавил еще одно подчеркивание к "_asm", "_endasm" и "_naked" в исходниках evo-sdk? ;) У меня всё работает:
http://zx-pk.ru/showpost.php?p=702247&postcount=100
Правда, там надо было crt0.s поправить. и заработало как надо: http://zx-pk.ru/showpost.php?p=702743&postcount=107
Вот здесь есть EVO-SDK (под TS-Config, правда) переделанная под SDCC v.3.x.x.
http://forum.tslabs.info/viewtopic.p...t=211&start=25
C 3.4.0 будет работать. Почитай тред - увидишь, какие были проблемы с переводом.
Sergey, я незнаю. crt0 я тоже правил. мелкие проектики из пакета сдк собрались. а вот ксоникс, с ним пришлось попарится, но в итоге оно заработало, хотя при сборке выдавало несколько варнингов. а вот robo, там даже автор в теме про игру пишет, что тоже не смог пересобрать под 3.х.х.
не знаю почему, но хайтеховый оптимизатор нагло выкидывает из кода строку с halt. например, делаю ei halt, оптимизатор выкидывает halt. свинья!!!
А еще он выкидывает RET. Ну выкидывает и выкидывает, подумаешь. Я же писал: ассемберные процедуры компилируй без оптимизации в отдельном объектном модуле. Оптимизатор там для оптимизации его собственных С-транслированных конструкций, в которых не предусмотрены ни HALT ни лишние RET из тела процедур. А твой АСМ нафига оптимизировать? Он небось и так нормальный. :)
сделал иначе:
на это макросе компилятор выдаёт несколько ошибок:Код:#define _sync() asm(" ei"); asm(" defb 76h");
но при этом всё собирается, и халт на месте.Код:: asm(" ei"); asm(" defb 76h");
) expected ^
; expected ^
( expected ^
expression syntax ^
) expected ^
) expected ^
; expected ^
( expected ^
expression syntax ^
) expected ^
если засовывать в либу, тогда конструкция выростает до:
т.е. лишние телодвижения.Код:_sync: pop de ; return address
push de
ei
halt
ret
Sayman, ЭЛТ вы показываете здесь PPS у всех есть код, начинающийся в 0x8100 и стек на 0xc000. Этот регион (~ 16k) достаточно мала для скомпилированной программы C.
Рассматривали ли вы другие карты памяти?
Для PPS-ZX цели я хотел бы поставить барана в 0-16k области и заполнить, что с библиотекой кода. Область между конец файла отображения и 0x8000 я мог бы использовать для STDIO дисковых буферов и таНос регионе. В 0x8000 - 0x8300 я бы поставил стека и im2 блок. После 0x8300 я бы просто пусть программа растут вверх, чтобы 0xffff (~ 32k). 32k для C не считая библиотек приличного размера.
Я использую автоматический перевод http://sprinter.winglion.ru/sp2000.pdf для информации, но она по-прежнему трудно выяснить.
Будет что-то нравится эта работа? Я представляю себе небольшую программу загрузчик, который бы ознакомиться с полным C Runtime в 0-16k области и загрузить программу C в 0x8300, прежде чем прыгать на ЭЛТ.
То, что я не знаю, если память утверждал на спринтера в гх режиме и является ли файлы на диске (в частности, HDD) можно прочитать в виде файлов. Функции BIOS документально выше, только говорить о чтении и записи абсолютных секторах на диске.
Там также нет слова на действительно ли спринтер дос-либо буферизации. Большинство дисков ОС на Z80 машин очень просты и не буфер все данные так, чтобы они трэш, когда типовые программы C у файловый ввод / вывод. Например, если вы читаете один символ в то время, из файла вот так:
в то время как ((с = fgetc (в))! = EOF)
do_something (с);
на большинстве z80 дисковых операционных систем, читал, что один символ может привести весь сектор для чтения, а затем выбросить. Есть также проблемы с имеющих более одного открытого файла или с открытого файла для обновления ("+", где есть две файловые указатели, работающие на файле).
Информация о спринтер DOS, кажется, очень мало. Если спринтер DOS не делает эти вещи, которые мы должны поставить код, чтобы сделать это, но мы не имеем, что готов.
Скрытый текст
Sayman, the crts you are showing here for pps all have code starting at 0x8100 and the stack at 0xc000. This region (~16k) is quite small for a compiled C program.
Have you considered other memory maps?
For a pps-zx target I would like to put ram in the 0-16k area and fill that with library code. The area between the end of the display file and 0x8000 I might use for stdio disk buffers and malloc region. At 0x8000 - 0x8300 I'd put the stack and im2 block. After 0x8300 I would just let the program grow upward to 0xffff (~32k). 32k for C not counting the libraries is a decent size.
I'm using the an automatic translation of http://sprinter.winglion.ru/sp2000.pdf for information but it's still hard to figure out.
Would something like this work? I imagine a small loader program that would read a complete c runtime into the 0-16k area and load the C program at 0x8300 before jumping to the crt.
What I don't know is if memory is contended on the sprinter in zx mode and whether files on disk (particularly hdd) can be read as files. The bios functions documented above only talk about reading and writing to absolute sectors on disk.
There's also no word on whether the sprinter dos does any buffering. Most disk oses on z80 machines are very simple and do not buffer any data so that they thrash when typical C programs do file i/o. Eg, if you read one char at a time from a file like so:
while ((c = fgetc(in)) != EOF)
do_something(c);
on most z80 disk operating systems, reading that one char will cause the entire sector to be read and then thrown away. There are also issues with having more than one file open or having a file open for update ("a+" where there are two file pointers operating on the file).
Information on the sprinter dos seems very sparse. If the sprinter dos does not do these things we have to supply the code to do it but we don't have that ready yet.
[свернуть]
Не понял зачем там pop/push
у V3.09 какие-то проблемы с пониманием конструкции asm("ор"), я ее заменял на #asm #endasm
Если тебе надо вставить всего лишь 2 команды которые не понимает оптимизатор и избежать лишнего call/ret, как вариант можно использовать опкоды
#asm
defb
defb
#endasm
В моем случае были объемные процедуры на голом ASM, я их выносил в отдельный модуль.
при написании какой то процедуры на асме, чтобы прога не тупанула, нужно вести для хайтеха стек. при входе нужно дёрнуть адрес возврата и все аргументы.Цитата:
Не понял зачем там pop/push
в данном случае я скорей всего тупанул, т.к. для процедуры нет аргументов. но если они есть, то делать нужно как уже сказал. можно пушами и попами, можно через ld hl,2 add hl,sp или через ix. но тогда при выходе ix обязательно нужно восстановить, иначе всё дохнет.
не хотелось бы пихать в основное тело (типа в main()) всякие куски с #asm #endasm. потому пихаю макрос. выдаёт варнинг, да, но зато работает и меньше байтов и тактов тратится.Цитата:
Если тебе надо вставить всего лишь 2 команды которые не понимает оптимизатор и избежать лишнего call/ret, как вариант можно использовать опкоды
---------- Post added at 14:34 ---------- Previous post was at 14:33 ----------
Alcoholics Anonymous, I answer to you in z88dk forum, soon.