Oleg N. Cher, опять умничаешь :)
ZEK, а ты грубишь
добрее надо быть
Вид для печати
Oleg N. Cher, опять умничаешь :)
ZEK, а ты грубишь
добрее надо быть
Eltaron, это чо за шаманство?
Ключики влияют на размер программы, о чём сейчас и спор.
Так вот, о мифах. В своих высказываниях насчёт того, что у SDCC лучшая кодогенерация, я опирался на мнение Филиппа Краузе, сделанный им набор тестов и список проверенных на этих тестах компиляторов. Согласитесь, это уже что-то более существенное, чем субъективные высказывания в стиле "я шото откомпилировал и шото сравнил". Филипп согласен, что IAR имеет качественную кодогенерацию, но указывает на то, что нужно тестировать компиляторы в равных условиях. В связи с этим он просит желающих скомпилировать в IAR данные тестовые программы, но чтобы компилятор не использовал недокументированные инструкции процессора и чтобы все функции были реентерабельными, если это конечно возможно в IAR. Этого, по его словам, будет достаточно, чтобы добавить результаты в таблицу тестов.
Ну и планка рекорда поднята. :)
Цитата:
Сообщение от Philipp Klaus Krause
Информация о таких инструкциях конечно доступна. Но данный набор инструкций в многочисленных документах по Z80 называется недокументированным. (Zilog мог в новых версиях процессора убрать поддержку этих инструкций. Не знаю, правда, насколько это актуально в данный момент). Но Вы ж видите, для Филиппа это имеет значение. Хотя во встроенный асм включить эти инструкции он согласился.
И сам SDCC генерирует только документированные инструкции. Если интересно по каким причинам они избегают недокументированных, могу спросить. (Может по идеологическим причинам, а может просто нигде не понадобились).
да не, я лишь о том, что сегодня это необоснованное ограничение. если вдруг окажется, что IAR использует такие инструкции (что-то не верю в это) и генерит код лучше - это его полное право.
Ну так пересоберите тесты для IAR без использования недокументированных инструкций. Тогда IAR появится в списке Филиппа, и это окончательно расставит точки над тем, у кого лучшая кодогенерация.
P.S. Списался с IAR, попросил сделать IAR Embedded Workbench for Zilog Z80 безплатным хотя бы для некоммерческого использования, ну раз уже не продают, так чего хоронить. Ага, щаз.
Цитата:
Dear Oleg,
Thanks for your email!
I've now checked the issue and due to this is a product we do not longer support we can offer you an
PC locked license of EWZ80 version 4.06 ( from the year 2001) without support.
For the amount of 1715 EUR
Payment: In advance
Please do check if this version would be ok and also if you would need any further information or would like
to place an order.
Best regards,
Liselott Lundeborg Sales Manager Sweden - Key Account Manager Nordic
IAR Systems AB
Box 23051, Strandbodgatan 1
SE-750 23 Uppsala, SWEDEN
Website: www.iar.com
>without support
>For the amount of 1715 EUR
Петросяны #%я =)
Забыл добавить:
>PC locked
(залоченный на один комп, как я понимаю)
А вы типа хотели, чтобы вам плоды сотен человекочасов за спасибо отдали? Кто еще петросяны...
Господа, подскажите вот какую вещь.
Как с помощью препроцессора передать символ # вовнутрь тела макроса?
Я придумал способ передавать параметры функций через регистры. Сразу скажу про ограничение этого способа. Он не позволяет передавать вычисляемые в рантайме выражения, только константы, числа известные на этапе компиляции. Проблема в том, что SDCC-ассемблер требует везде, где подразумевается числовой литерал, писать перед ним # (в sdasz80 это не обозначитель шестнадцатеричного числа), и опускать # нельзя. Получается, что без # невозможно нормально написать даже DB(DEFB). А препроцессор напротив считает # сугубо служебным символом и ругается на любые попытки передавать его в теле макроса.
Т.е. хочу, чтобы если встретилось BORDER(4), оно превращалось в:
но в SDCC-асме так будет ошибка. Надо:Код:LD A,4
CALL 0x229B
Так что при попытке скомпилировать код:Код:LD A,#4
CALL 0x229B
SDCC выдаёт ошибку:Код:#ifndef Basic_fastcall_BORDER
import void BORDER (BYTE color);
#else //Basic_fastcall_BORDER
#define BORDER(color) __asm \
LD A,#color \
CALL 0x229B \
__endasm;
#endif
Пробовал различные комбинации скобочек, по совету Филиппа пробовал такое:Цитата:
Basic.h:13:29: error: '#' is not followed by a macro parameter
Пробовал даже диграфы и триграфы. Не подошли (не понимаю тогда зачем они вообще нужны).Код:#define id(x) x
#ifndef Basic_fastcall_BORDER
import void BORDER (SHORTINT color);
#else //Basic_fastcall_BORDER
#define BORDER(color) __asm \
LD A,id(#)color \
CALL 0x229B \
__endasm;
#endif
Есть ли решение?
Код:#define hash #
#define id(x) x
#define BORDER(x) ld a,id(hash)x
void main()
{
BORDER(5)
}
Всё-таки удалось выспросить у IAR триальную версию Embedded Workbench for Z80. Филипп, как и обещал, добавил её в список.
Цитата:
Сообщение от Philipp Klaus Krause