Solid C - компилятор Си для Спринтера
Moderator: Shaos
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
Мне попадался Солид только для MSX-DOS. Автор Солида японскаяShaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
Значит у япошек на то время был не тот стандарт СиShaos wrote:Еще неувязочка:
Сдается мне, что вышеизложенное не соответствует действительности, т.е. в стандартном языке Си данная запись является вполне правильной и приемлемой!Code: Select all
7. Имеется отличие от стандартного языка Си по эффективным пределам имен членов структур и объединений (struct & union). В стандартном Си одно и то же имя члена может появляться в двух различных структурах только в случае, когда они оба одного типа и имеют одинаковое смещение в обеих структурах. Компилятор SOLID C воспринимает имя члена так, как принято в Паскале или в Аде. Таким об- разом, одно и то же имя члена может появляться в разных структурах и будет правильно обработано компилятором SOLID C. В качестве примера рассмотрим следующее описание: struct node { char *word; int count; struct node *next; } pool[1000], *p; struct noad { int atr; struct noad *next; } table[10], *q; В стандартном языке Си данная запись является неправильной, потому, что имя члена "next" появляется в двух структурах - "node" и "noad", где их типы и сме- щения не согласованы. Однако в среде компилятора SOLID C эти записи являются правильными. Следует обратить внимание на следующую запись

Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
Нет. При обращении к char-массиву для printf надо писать не какShaos wrote:Кое что непонятно:
Как я понимаю вместоCode: Select all
#include <stdio.h> char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'}; void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно } Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается
*buffer
а как
(char *) *buffer
Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
IRL формат отличается от REL формата только тем, что имеет в началеShaos wrote:Черновичок перевода:Vasil Ivanov wrote:readme.rus - первое, что надо перевести. Здесь особенности пакета, портированного на Спринтер.
viewtopic.php?t=7580
Поместил в английском форуме про спринтер, так что по русски там не выражаться!
Предлагаю вместо этого осветить только отличные функции,Vasil Ivanov wrote: Очень не помешала бы дока по си-функциям (clib.rus) данного
пакета, потому, что в некоторых функциях встречаются отличия
от стандартных (PC-шных), например функции перемещения
указателя в файле. Но она объемистая.
т.к. си есть си - кто знает, тот в курсе
.irl по английски не нашелVasil Ivanov wrote: Да я фактически все доки и перечислил. По .rel/.irl
форматам и по асму, уже есть англицкий вариант.
Вобщем все доки, кроме cc.rus и clib.rus ты переведешь за
час, а может и быстрей.
за час не получится - за час даже просто прочитать не получится, не то что написать
файла индексированный заголовок. Далее идет rel-имидж, его начало
выровнено на границу 128 байт. Чтобы из irl-формата сделать rel-формат,
надо просто убрать индексированный заголовок и все.
IRL-формат делает только библиотекарь ol.exe. Асм генерит обычные
rel-файлики. Ну линкер ессно понимает оба формата.
У меня где-то был IRL на англицком, если найду, то брошу тебе.
На счет отличных функций,.... надо время. Буду иметь это ввиду.
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...Vasil Ivanov wrote:Нет. При обращении к char-массиву для printf надо писать не какShaos wrote:Кое что непонятно:
Как я понимаю вместоCode: Select all
#include <stdio.h> char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'}; void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно } Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается
*buffer
а как
(char *) *buffer
Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?Vasil Ivanov wrote:Мне попадался Солид только для MSX-DOS. Автор Солида японскаяShaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
На авторство - нет проблем, засуну строчки. Кроме того, оно везде упоминаетсяShaos wrote:Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?Vasil Ivanov wrote:Мне попадался Солид только для MSX-DOS. Автор Солида японскаяShaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
в титлах программ пакета.
На счет оригинальных док - у меня их нет. Есть только доки к MSC-C
и они на русском (пробегали как-то по эхе ZX.SPECTRUM). Он отличается от Солида опциями компилятора, именами файликов и
юзает мелкософтские асм m80.com и линкер L80.com.
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идетShaos wrote:В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...Vasil Ivanov wrote:Нет. При обращении к char-массиву для printf надо писать не какShaos wrote:Кое что непонятно:
Как я понимаю вместоCode: Select all
#include <stdio.h> char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'}; void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно } Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается
*buffer
а как
(char *) *buffer
Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста
Code: Select all
#include <stdio.h>
char buffer[4]="AAA";
void main()
{
printf("0x%02X\n", (char) *buffer);
}
Code: Select all
ld a,(buffer_)
ld c,a
;<-
push bc
ld bc,?63999
push bc
ld hl,2
call printf_
pop bc
pop bc
ret
Для текста же
Code: Select all
#include <stdio.h>
char buffer[4]="AAA";
void main()
{
printf("0x%02X\n", (char *) *buffer);
}
Code: Select all
ld a,(buffer_)
ld c,a
ld b,0 ;<-
push bc
ld bc,?63999
push bc
ld hl,2
call printf_
pop bc
pop bc
ret
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Да - это глюк. А если попробовать вот так:Vasil Ivanov wrote:В папке Examples-ов в bin2c.c, откуда этот пример, обращение идетShaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста
Солид компилит следующий асм-листинг:Code: Select all
#include <stdio.h> char buffer[4]="AAA"; void main() { printf("0x%02X\n", (char) *buffer); }
Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".Code: Select all
ld a,(buffer_) ld c,a ;<- push bc ld bc,?63999 push bc ld hl,2 call printf_ pop bc pop bc ret
Для текста же
Солид компилит правильный асм-листинг:Code: Select all
#include <stdio.h> char buffer[4]="AAA"; void main() { printf("0x%02X\n", (char *) *buffer); }
Code: Select all
ld a,(buffer_) ld c,a ld b,0 ;<- push bc ld bc,?63999 push bc ld hl,2 call printf_ pop bc pop bc ret
printf("0x%02X\n", *(char*)buffer);
кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 233
- Joined: 12 Oct 2004 13:49
Лучшая прошивка для Xbox - Xecuter 2 - написана на 100% CShaos wrote:Я думаю никому и в страшном сне не присниться писать программы для ПЗУ на Си - поэтому ориентируйся на ОЗУ

Конкуренты-ассемблерщики просто неспособны обеспечить тот-же уровень надежности и функциональности.
Но для маленьких 8-бит устройств C - не вариант

-
- Maniac
- Posts: 233
- Joined: 12 Oct 2004 13:49
SOLiD - это ник Егора Вознесенского. Он был отцом-основателем группы Novatec MSX. Он написал SOLiD C с нуля, используя совместимый синтакс и форматы обьектных файлов.Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Вот несколько ссылок по теме:
http://www.getbanner.ru/novatec/index.htm
http://www.msx.org/forumtopic3286.html
http://www.mail-archive.com/msx@stack.nl/msg09371.html
http://opencollector.org/get_details.ph ... rc=summary
http://homepage3.nifty.com/Tatsu_syo/TM ... OLIDC.html
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Только что проверил сам - похоже, что %X вообще неработает с типами char - ни с *buffer, ни с buffer[0], ни просто с переменной типа char - прибавляется еще старший байт, НО если предварительно сделать присвоение int i = *buffer и именно этот int скормить принтфу - то все будет ок.Shaos wrote:Да - это глюк. А если попробовать вот так:Vasil Ivanov wrote:В папке Examples-ов в bin2c.c, откуда этот пример, обращение идетShaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
...
printf("0x%02X\n", *(char*)buffer);
кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
И эту запись так же компилит с ошибкой. Поэтому я и говорю, чтоShaos wrote:Да - это глюк. А если попробовать вот так:Vasil Ivanov wrote:В папке Examples-ов в bin2c.c, откуда этот пример, обращение идетShaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста
Солид компилит следующий асм-листинг:Code: Select all
#include <stdio.h> char buffer[4]="AAA"; void main() { printf("0x%02X\n", (char) *buffer); }
Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".Code: Select all
ld a,(buffer_) ld c,a ;<- push bc ld bc,?63999 push bc ld hl,2 call printf_ pop bc pop bc ret
Для текста же
Солид компилит правильный асм-листинг:Code: Select all
#include <stdio.h> char buffer[4]="AAA"; void main() { printf("0x%02X\n", (char *) *buffer); }
Code: Select all
ld a,(buffer_) ld c,a ld b,0 ;<- push bc ld bc,?63999 push bc ld hl,2 call printf_ pop bc pop bc ret
printf("0x%02X\n", *(char*)buffer);
кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си
имеем глюк компилятора.
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
У него можно получить сорцы SOLID C или это глухое дело ?.dhau wrote:SOLiD - это ник Егора Вознесенского. Он был отцом-основателем группы Novatec MSX. Он написал SOLiD C с нуля, используя совместимый синтакс и форматы обьектных файлов.Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Вот несколько ссылок по теме:
http://www.getbanner.ru/novatec/index.htm
http://www.msx.org/forumtopic3286.html
http://www.mail-archive.com/msx@stack.nl/msg09371.html
http://opencollector.org/get_details.ph ... rc=summary
http://homepage3.nifty.com/Tatsu_syo/TM ... OLIDC.html
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru