Solid C - компилятор Си для Спринтера

Компьютер "Спринтер" http://sprinter.nedopc.org

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

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
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

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);
иначе ерунда какая-то получается
Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:readme.rus - первое, что надо перевести. Здесь особенности пакета, портированного на Спринтер.
Черновичок перевода:
viewtopic.php?t=7580

Поместил в английском форуме про спринтер, так что по русски там не выражаться! ;)
Vasil Ivanov wrote: Очень не помешала бы дока по си-функциям (clib.rus) данного
пакета, потому, что в некоторых функциях встречаются отличия
от стандартных (PC-шных), например функции перемещения
указателя в файле. Но она объемистая.
Предлагаю вместо этого осветить только отличные функции,
т.к. си есть си - кто знает, тот в курсе ;)
Vasil Ivanov wrote: Да я фактически все доки и перечислил ;). По .rel/.irl
форматам и по асму, уже есть англицкий вариант.
Вобщем все доки, кроме cc.rus и clib.rus ты переведешь за
час, а может и быстрей ;).
.irl по английски не нашел

за час не получится - за час даже просто прочитать не получится, не то что написать ;)
IRL формат отличается от REL формата только тем, что имеет в начале
файла индексированный заголовок. Далее идет rel-имидж, его начало
выровнено на границу 128 байт. Чтобы из irl-формата сделать rel-формат,
надо просто убрать индексированный заголовок и все.
IRL-формат делает только библиотекарь ol.exe. Асм генерит обычные
rel-файлики. Ну линкер ессно понимает оба формата.
У меня где-то был IRL на англицком, если найду, то брошу тебе.

На счет отличных функций,.... надо время. Буду иметь это ввиду.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:
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);
иначе ерунда какая-то получается
Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:
Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.
Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?
На авторство - нет проблем, засуну строчки. Кроме того, оно везде упоминается
в титлах программ пакета.
На счет оригинальных док - у меня их нет. Есть только доки к MSC-C
и они на русском (пробегали как-то по эхе ZX.SPECTRUM). Он отличается от Солида опциями компилятора, именами файликов и
юзает мелкософтские асм m80.com и линкер L80.com.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:
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);
иначе ерунда какая-то получается
Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

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
Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

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
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:
Shaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

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
Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

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
dhau
Maniac
Posts: 233
Joined: 12 Oct 2004 13:49

Post by dhau »

Shaos wrote:Я думаю никому и в страшном сне не присниться писать программы для ПЗУ на Си - поэтому ориентируйся на ОЗУ :)
Лучшая прошивка для Xbox - Xecuter 2 - написана на 100% C :)

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

Но для маленьких 8-бит устройств C - не вариант :)
dhau
Maniac
Posts: 233
Joined: 12 Oct 2004 13:49

Post by dhau »

Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
SOLiD - это ник Егора Вознесенского. Он был отцом-основателем группы Novatec MSX. Он написал 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
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
...
Да - это глюк. А если попробовать вот так:

printf("0x%02X\n", *(char*)buffer);

кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си
Только что проверил сам - похоже, что %X вообще неработает с типами char - ни с *buffer, ни с buffer[0], ни просто с переменной типа char - прибавляется еще старший байт, НО если предварительно сделать присвоение int i = *buffer и именно этот int скормить принтфу - то все будет ок.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote: В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

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
Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

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
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

dhau wrote:
Shaos wrote:И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
SOLiD - это ник Егора Вознесенского. Он был отцом-основателем группы Novatec MSX. Он написал 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
У него можно получить сорцы SOLID C или это глухое дело ?.
Vasil Ivanov
vasil-i@yandex.ru