Собственно вот... Уважаемые, подскажите кто каким компилятором когда либо пользовался и Ваше мнение об оном...
В данный момент скачал SDCC но там что-то всё очень сложно (или мне просто лень было разобратся)...
Вид для печати
Собственно вот... Уважаемые, подскажите кто каким компилятором когда либо пользовался и Ваше мнение об оном...
В данный момент скачал SDCC но там что-то всё очень сложно (или мне просто лень было разобратся)...
Вот это случаем не пробовал: http://www.telefonica.net/web2/emili...z80/ccz80.html
Спасибо, поковыряем...
Добавлено через 10 часов 9 минут
Попробовал... Очень своеобразный диалект, прекрасно подходящий для создания Hello World приложений... Сильно удивился когда компиль понял
и очень удивился когда он не понялКод:c<<=2
Кто-нить запускал SDCC под виндой? Кто-нить что-нить знает об оном вообще?Код:return с<<2
вот увидел такое:
#define min( a, b ) ( a <? b )
что за оператор "<?" и как оно компилится вообще?
bigral, какое-то нестандартное расширение SDCC (вообще говоря SDCC плохо совместим со стандартами).
К.О. говорит, что <? по всей видимости возвращает меньшее из a и b
О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 ----------
хеппибёздие файрекса как раз в тему ссылка :\
может, конечно, что-то и поменялось с того момента, как я его пробовал (лет 8 назад :) )Цитата:
Я бы сказал, что он хорошо хавает весь C89 и кое-что из C99.
Поменялось конечно. ;)
Ветка SDCC для Z80 постоянно улучшается. Уменьшается размер кода и увеличивается оптимизация.
Ссылку, на сравнительную таблицу уже как-то кидал http://sourceforge.net/apps/trac/sdc...%20TODO%20list
да, но как обычно со свободным софтом это бывает, улучшается, но никак не может улучшиться... код он генерит странноватый (или тот, кто писал генерацию имеет мало опыта в прогании на з80, или просто там что-то не так) до сих пор. и сам по себе он ни рыба ни мясо... а вот коммерческий IAR - это ващще другое дело! вот к чему надо стремиться, хотя его развитие кончилось 10 лет назад...
на сайте у valker'а. за что ему спасибо.
вот я не уверен вообще, что "внести изменения" будет хоть сколько-нибудь легко... если вообще возможно.
Народ ну что никто так и не расскажет как оптимально пользовать этот SDCC? Интересует быстрый способ что-то скомпилить и запустить на реале ну или в эмуле ну и конечно релизы как сделать тоже.
Ну тама наскока помню проблемой было перевести выхлоп sdcc в что-то толковое и удобоваримое.
Был такой батничек
Указанную проблему решала утилита ihx2bin, которая перелопачивает *.ihx файл вроде в снапшот( формат однако босяцкий, глазом видно что к чему ). Сорцы есть. Как юзать непомню, нада сорцы ковырять. Ограничения - вроде проблема с компиляцией в страницы нерешена.Код:@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
Ну и ps: код выдавался страшный по размеру. И из-за отсутствия возможности компилить в страницы и ужасного размера кода ( умудрился более чем на 32к написать ) попытка была оставлена как неперспективная.
Можно получить trd/sna/tap с помощью простой программы на SjASMPlus, в которой будет производиться INCBIN кодового блока. Или снапшот через BIN2SNA: http://zx.pk.ru/showthread.php?t=93
Столкнулся с такой фишкой в SDCC:
компилит строку целиком кудато в память, и отправляет её поинтер. А вот что-то на вродеКод:print ("Hello World\r");
генерит что-то вообще страшное... на инициализацию каждого байта уходит примерно 15-17 байт кода на асме...Код:unsigned char string[255]={"Hello World\r"};
а вот если сделать что-то типа функции initarrayпрога ваще умирает нах...Код:(array,"Hello World\r");
мож я что-то не так делаю?
и ещё... из разряда это интересно, но не пытайтесь повторить это дома:
Вот это ваще сказка, кода рождается чуть ли ни на 1,5КбайтаКод:SPI_Send(Address>>24);
SPI_Send(Address>>16);
SPI_Send(Address>>8);
SPI_Send(Address);
Поставил 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...
можно еще попробовать
char string[] = "Hello World\n";
char *string = "Hello World\n";
и static если string неглобальная переменная
а в чем mojon twins компилят?
сокращение кода примерно на 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";
Строка красиво и главное целостно ложится в бинарник... и это радует!
и ещё об оптимизации... строка
unsigned char string[]="Hello World\n";
если string не глобальная а объявленна в функции, то значит она auto и должна быть в стеке
IAR я люблю и не выкину, а вот SDCC пожалуй утоплю... итак...
C:
ASM:Код:unsigned char string[]="Hello World\n";
string[0]='X';
IARка молодец?Код: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
---------- Post added at 00:58 ---------- Previous post was at 00:51 ----------
но есть 2 варианта создаваться:
1. скопировать строку откуда-то из памяти целиком
2. инициализировать её побайтово.
так вот по первому варианту работает IAR, а SDCC по второму.
MegaMyth, более того, SDCC для кода
static const char * const str = "Hello word!";
генерица в памяти указатель и код его инициализации :S