Вход

Просмотр полной версии : Кросплатформенный Си компилятор (Cross Platform C Compiler)



MegaMyth
26.04.2009, 11:43
Собственно вот... Уважаемые, подскажите кто каким компилятором когда либо пользовался и Ваше мнение об оном...
В данный момент скачал SDCC но там что-то всё очень сложно (или мне просто лень было разобратся)...

savelij
26.04.2009, 12:23
Собственно вот... Уважаемые, подскажите кто каким компилятором когда либо пользовался и Ваше мнение об оном...
В данный момент скачал SDCC но там что-то всё очень сложно (или мне просто лень было разобратся)...

Вот это случаем не пробовал: http://www.telefonica.net/web2/emilioguerrero/ccz80/ccz80.html

Vitamin
26.04.2009, 12:34
http://zx.pk.ru/showthread.php?t=4110
http://zx.pk.ru/showthread.php?t=30
http://zx.pk.ru/showthread.php?t=1408

MegaMyth
27.04.2009, 11:39
Спасибо, поковыряем...

Добавлено через 10 часов 9 минут

Вот это случаем не пробовал: http://www.telefonica.net/web2/emilioguerrero/ccz80/ccz80.html

Попробовал... Очень своеобразный диалект, прекрасно подходящий для создания Hello World приложений... Сильно удивился когда компиль понял


c<<=2и очень удивился когда он не понял


return с<<2Кто-нить запускал SDCC под виндой? Кто-нить что-нить знает об оном вообще?

bigral
20.04.2010, 20:00
вот увидел такое:

#define min( a, b ) ( a <? b )

что за оператор "<?" и как оно компилится вообще?

Sinus
20.04.2010, 20:31
bigral, какое-то нестандартное расширение SDCC (вообще говоря SDCC плохо совместим со стандартами).

К.О. говорит, что <? по всей видимости возвращает меньшее из a и b

bigral
21.04.2010, 10:45
Оk, а кто-то из гуру может описать в кратце как правильно работать с этим sdcc? Ато вчера надо было одному кадру продемонстрировать как можно в нынешнее время писать проги на С под ZX и мягко говоря получилось не совсем убедительно.

пока что накопились такие вопросы:

1. после разбирательства с архивом который шел с доками для speccy2007 я сворганил такой bat-ник:

sdcc --no-std-crt0 --code-loc 0x8000 -mz80 test_zx.c
hex2bin -s 8000 -e bin test_zx.ihx
bin2sna test_zx1.sna test_zx.sna test_zx.bin

после него мой код с адреса 0x8000 inject-ится в test_zx1.sna и я его пускаю в эмуле через usr 32768. Все это выглядит криво, как получать tap c CODE блоком внутри?

2. как define-нуть таблицу векторов для IM2 по первому подходящему адресу?
(ну типа что-то:
_asm {
currAddress = $
org (currAddress && 0xFF00) + 0x0100
dup (128) dw (interruptHandler)
}

void interruptHandler() {
....
}
)

3. есть вообще хоть какая-то библиотека полезных функций чтоб прикрутить к SDCC?

---------- Post added at 09:45 ---------- Previous post was at 09:41 ----------


http://zx.pk.ru/showthread.php?t=140

хеппибёздие файрекса как раз в тему ссылка :\

Vitamin
21.04.2010, 10:55
хеппибёздие файрекса как раз в тему ссылка :\
Чота косяк какой-то проскочил:) Поправил ссылки.

Valen
21.04.2010, 16:39
(вообще говоря SDCC плохо совместим со стандартами).

Я бы сказал, что он хорошо хавает весь C89 и кое-что из C99.



есть вообще хоть какая-то библиотека полезных функций чтоб прикрутить к SDCC
Снова таки, всё что C89 может компилить без особых проблем.

Sinus
21.04.2010, 16:48
Я бы сказал, что он хорошо хавает весь C89 и кое-что из C99.
может, конечно, что-то и поменялось с того момента, как я его пробовал (лет 8 назад :) )

Valen
21.04.2010, 17:00
может, конечно, что-то и поменялось с того момента, как я его пробовал (лет 8 назад :) )
Поменялось конечно. ;)
Ветка SDCC для Z80 постоянно улучшается. Уменьшается размер кода и увеличивается оптимизация.
Ссылку, на сравнительную таблицу уже как-то кидал http://sourceforge.net/apps/trac/sdcc/wiki/Philipp%27s%20TODO%20list

psb
21.04.2010, 17:53
Ветка SDCC для Z80 постоянно улучшается.
да, но как обычно со свободным софтом это бывает, улучшается, но никак не может улучшиться... код он генерит странноватый (или тот, кто писал генерацию имеет мало опыта в прогании на з80, или просто там что-то не так) до сих пор. и сам по себе он ни рыба ни мясо... а вот коммерческий IAR - это ващще другое дело! вот к чему надо стремиться, хотя его развитие кончилось 10 лет назад...

ILoveSpeccy
22.04.2010, 22:23
а вот коммерческий IAR - это ващще другое дело!

А где его можно скачать ?

psb
23.04.2010, 07:59
на сайте у valker'а. за что ему спасибо.

bigral
30.04.2010, 18:46
IAR - это ващще другое дело!

Кто возьмется за работу? Глянуть как определенные куски компилит тот же IAR, HITEC и другие, оптимизировать их с помощью советов форумчан и внести в исходники SDCC соответствующие обновления.

psb
30.04.2010, 21:05
вот я не уверен вообще, что "внести изменения" будет хоть сколько-нибудь легко... если вообще возможно.

bigral
05.05.2010, 19:17
Народ ну что никто так и не расскажет как оптимально пользовать этот SDCC? Интересует быстрый способ что-то скомпилить и запустить на реале ну или в эмуле ну и конечно релизы как сделать тоже.

Antipod
05.05.2010, 21:38
Народ ну что никто так и не расскажет как оптимально пользовать этот SDCC? Интересует быстрый способ что-то скомпилить и запустить на реале ну или в эмуле ну и конечно релизы как сделать тоже.

Ну тама наскока помню проблемой было перевести выхлоп sdcc в что-то толковое и удобоваримое.
Был такой батничек

@sdcc -mz80 -I./inc -I./src --code-loc 0x6010 --stack-loc 0x6000 --no-std-crt0 main.c
@if ERRORLEVEL 1 goto SubstErr
@ihx2bin ihx2bin.cfg
@echo ================== done ==================
:SubstErr

Указанную проблему решала утилита ihx2bin, которая перелопачивает *.ihx файл вроде в снапшот( формат однако босяцкий, глазом видно что к чему ). Сорцы есть. Как юзать непомню, нада сорцы ковырять. Ограничения - вроде проблема с компиляцией в страницы нерешена.

Ну и ps: код выдавался страшный по размеру. И из-за отсутствия возможности компилить в страницы и ужасного размера кода ( умудрился более чем на 32к написать ) попытка была оставлена как неперспективная.

Aprisobal
10.05.2010, 00:24
1. после разбирательства с архивом который шел с доками для speccy2007 я сворганил такой bat-ник:

sdcc --no-std-crt0 --code-loc 0x8000 -mz80 test_zx.c
hex2bin -s 8000 -e bin test_zx.ihx
bin2sna test_zx1.sna test_zx.sna test_zx.bin

после него мой код с адреса 0x8000 inject-ится в test_zx1.sna и я его пускаю в эмуле через usr 32768. Все это выглядит криво, как получать tap c CODE блоком внутри?
Можно получить trd/sna/tap с помощью простой программы на SjASMPlus, в которой будет производиться INCBIN кодового блока. Или снапшот через BIN2SNA: http://zx.pk.ru/showthread.php?t=93

MegaMyth
11.11.2010, 00:38
Столкнулся с такой фишкой в SDCC:


print ("Hello World\r"); компилит строку целиком кудато в память, и отправляет её поинтер. А вот что-то на вроде

unsigned char string[255]={"Hello World\r"};
генерит что-то вообще страшное... на инициализацию каждого байта уходит примерно 15-17 байт кода на асме...
а вот если сделать что-то типа функции initarray
(array,"Hello World\r"); прога ваще умирает нах...

мож я что-то не так делаю?

и ещё... из разряда это интересно, но не пытайтесь повторить это дома:


SPI_Send(Address>>24);
SPI_Send(Address>>16);
SPI_Send(Address>>8);
SPI_Send(Address);

Вот это ваще сказка, кода рождается чуть ли ни на 1,5Кбайта

Поставил IAR-ку... вешь интересная, но сугубо для Эмбедедов ИМХО, зато поддерживает страницы при правильной настройке.



/*
In this example banks are defined to work with the MMU in cs64180
Banked code area is 4000-7FFF. The physical memory banks starts at 50000
Banks are selected by BBR, here BBR will be 4C,50,54,58...
Set the "bank" segments initial_address,size,size*10
*/
-b(CODE)CODE=4C4000,4000,40000

/*
If using a simple latch to select memory banks:
Set the "bank" segments initial_address,size,bankincrement
-b(CODE)CODE=4000,4000,10000 banks will be numbered 00,01,02...


в ближайшее время попробую чтонить компильнуть в ИАРке, если будет что рассказать - расскажу.

Vitamin
11.11.2010, 08:45
А вот что-то на вроде

Код:
unsigned char string[255]={"Hello World\r"};

генерит что-то вообще страшное... на инициализацию каждого байта уходит примерно 15-17 байт кода на асме...

А что выдаст на


static char string[255] = "Hello World\n";

?

sergey2b
11.11.2010, 10:36
можно еще попробовать
char string[] = "Hello World\n";
char *string = "Hello World\n";
и static если string неглобальная переменная

jerri
11.11.2010, 18:01
а в чем mojon twins компилят?

MegaMyth
11.11.2010, 22:20
А что выдаст на


static char string[255] = "Hello World\n";
?

сокращение кода примерно на 300 байт. но строка так целиком в бинарнике и не появилась. в этом плане IAR получше будет...

---------- Post added at 22:14 ---------- Previous post was at 21:22 ----------

и ещё об оптимизации... строка
unsigned char string[]="Hello World\n";
SDCC превращает вот в это УГ!!!


;main.c:7: unsigned char string[]="Hello World\n";
ld hl,#0x0003
add hl,sp
ld c,l
ld b,h
ld a,#0x48
ld (bc),a
ld e,c
ld d,b
inc de
ld a,#0x65
ld (de),a
ld e,c
ld d,b
inc de
inc de
ld a,#0x6C
ld (de),a
ld hl,#0x0003
add hl,bc
ex de,hl
ld a,#0x6C
ld (de),a
ld hl,#0x0004
add hl,bc
ex de,hl
ld a,#0x6F
ld (de),a
ld hl,#0x0005
add hl,bc
ex de,hl
ld a,#0x20
ld (de),a
ld hl,#0x0006
add hl,bc
ex de,hl
ld a,#0x57
ld (de),a
ld hl,#0x0007
add hl,bc
ex de,hl
ld a,#0x6F
ld (de),a
ld hl,#0x0008
add hl,bc
ex de,hl
ld a,#0x72
ld (de),a
ld hl,#0x0009
add hl,bc
ex de,hl
ld a,#0x6C
ld (de),a
ld hl,#0x000A
add hl,bc
ex de,hl
ld a,#0x64
ld (de),a
ld hl,#0x000B
add hl,bc
ex de,hl
ld a,#0x0A
ld (de),a
а к слову сказать
unsigned char * string ="Hello World"; делает как раз то что надо :-), только такая запись бывает не всегда уместна. сяс посмотрю что компилит IAR...

---------- Post added at 22:20 ---------- Previous post was at 22:14 ----------

IAR фиолетово как писать
usnigned char string[]="Hello World"; или
usnigned char * string="Hello World";
Строка красиво и главное целостно ложится в бинарник... и это радует!

sergey2b
11.11.2010, 22:35
и ещё об оптимизации... строка
unsigned char string[]="Hello World\n";

если string не глобальная а объявленна в функции, то значит она auto и должна быть в стеке

Vitamin
11.11.2010, 22:50
если string не глобальная а объявленна в функции, то значит она auto и должна быть в стеке
...и должна создаваться во время исполнения.


IAR фиолетово как писать
usnigned char string[]="Hello World"; или
usnigned char * string="Hello World";
Попробуй после добавить


string[0] = 'Z';


Если по прежнему будет грузить указатель на строку из ресурсов- можешь IAR выкинуть.

MegaMyth
12.11.2010, 00:58
IAR я люблю и не выкину, а вот SDCC пожалуй утоплю... итак...
C:


unsigned char string[]="Hello World\n";
string[0]='X';

ASM:


806e 39 ADD HL,SP
806f 5D LD E,L
8070 54 LD D,H
8071 21F480 LD HL,80F4H
8074 010D00 LD BC,000DH
8077 EDB0 LDIR
8079 DD36F258 LD (IX-0EH),58H


IARка молодец?

---------- Post added at 00:58 ---------- Previous post was at 00:51 ----------


...и должна создаваться во время исполнения.
но есть 2 варианта создаваться:
1. скопировать строку откуда-то из памяти целиком
2. инициализировать её побайтово.

так вот по первому варианту работает IAR, а SDCC по второму.

KPOTOB
12.11.2010, 23:02
MegaMyth, более того, SDCC для кода
static const char * const str = "Hello word!";

генерица в памяти указатель и код его инициализации :S