Важная информация

User Tag List

Страница 1 из 6 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 54

Тема: SDCC: Автоматизация

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    94
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию SDCC: Автоматизация

    Предлагается публиковать всяческие утилитки, так или иначе автоматизирующие процесс создания программ в SDCC от компиляции до конечного продукта.
    Также приветствуются настройки CMAKE, Code::Blocks, Eclipse, иных сред разработки, для работы с SDCC.

    Прилагаю sdccscl.rex - скрипт, автоматизирующий процесс компиляции исходника на Си и преобразование в готовое к запуску приложение.
    В двух словах: на входе исходник на Си, на выходе - SCL c BASIC-монолодером, содержащим и запускающим результат компиляции исходника. Исходник относительно скрипта может размещаться где-угодно.

    В начале скрипта есть настройки, но реально из них можно менять только адрес стэка и список подключаемых библиотек, потому что иначе надо переделывать генерацию scl-файла.

    К скрипту прилагается пример: scr.c. Программка должна заполнять спектрумовский экран кодом 0xAA, и она, таки, заполняет.

    P.S. Для тех, кто в танке: для работы скрипта требуется наличие установленного интерпретатора Regina REXX.
    Вложения Вложения
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    94
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    magicwc.rex, собиралка плагинов для WC по типу make.
    Должна лежать в папке с исходниками плагина. Параметров не требует. Всё задаётся статично внутри скрипта.
    На входе имена исходных файлов (Си, ассемблер, данные), а на выходе - плагин.WMF.
    Имя плагина определяется по файлу для 0-й страницы.
    Более подробно - памятка в конце скрипта.

    Всё не тестировал, но прилагаемый пример компилится и работает. Об ошибках прошу докладывать незамедлительно.
    Вложения Вложения
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  4. #3
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,198
    Спасибо Благодарностей отдано 
    429
    Спасибо Благодарностей получено 
    219
    Поблагодарили
    130 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да что ж это такое творится с функцией seek()?
    Она работает, указатель по хэндлеру передвигает куда надо, но возвращает всегда 0 (а должна возвращать установленную позицию от начала). TAPView из-за этого косяка только первый заголовок и показывает т.к.:
    FILELENGTH=SEEK(FILE,0,'E') => FILELENGTH=0
    ...
    IF SEEK(FILE,1)=FILELENGTH THEN EXIT => 0=0 вот оно из цикла и выходит

    Я уже всю голову сломал.
    В правильно заданном вопросе содержится половина ответа

  5. #4
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    94
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от creator Посмотреть сообщение
    Да что ж это такое творится с функцией seek()?
    Она работает, указатель по хэндлеру передвигает куда надо, но возвращает всегда 0 (а должна возвращать установленную позицию от начала). TAPView из-за этого косяка только первый заголовок и показывает т.к.:
    FILELENGTH=SEEK(FILE,0,'E') => FILELENGTH=0
    ...
    IF SEEK(FILE,1)=FILELENGTH THEN EXIT => 0=0 вот оно из цикла и выходит

    Я уже всю голову сломал.
    Есть вещи, которые работают не так как должны или не работают
    Но это можно обойти другими средствами REXX. Сейчас на работе. Позже подумаю, как решить твой вопрос.
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  6. #5
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,198
    Спасибо Благодарностей отдано 
    429
    Спасибо Благодарностей получено 
    219
    Поблагодарили
    130 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Можно конечно. Вот есть функция EOF(), но она тоже как-то не так работает, кстати и на Амиге аналогично.
    В правильно заданном вопросе содержится половина ответа

  7. #6
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    94
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от creator Посмотреть сообщение
    Можно конечно. Вот есть функция EOF(), но она тоже как-то не так работает, кстати и на Амиге аналогично.
    Чтобы узнать длину файла или его существование использую функцию CHARS
    Для произвольного доступа - CHARIN/CHAROUT
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  8. #7
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,198
    Спасибо Благодарностей отдано 
    429
    Спасибо Благодарностей получено 
    219
    Поблагодарили
    130 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что-то и с CHARS() не попёрло.
    И тут идея — а чего я парюсь, если когда мы достигаем конца файла то BLOCKLENGTH=-2, потому как:

    LOOP:
    BLOCKLENGTH=C2D(REVERSE(READCH(FILE,2)))-2

    Ну и влепил в сразу после этого строку
    IF BLOCKLENGTH=-2 THEN EXIT

    Соответственно предпоследнюю строку
    IF SEEK(FILE,1)=FILELENGTH THEN EXIT
    переделываем в
    a=SEEK(FILE,1)

    FILELENGTH нам уже не нужен, соответственно строки перед циклом:
    FILELENGTH=SEEK(FILE,0,'E')
    a = SEEK(FILE,0,'B') /* Regina REXX mistake: translating unused function result to console. Need to use any variable*/
    можно смело выбросить

    Работает.

    Затем думаю, а почему бы не попробовать EOF() применить (который раньше не хотел работать в конце цикла). Ну и меняем нашу новопридуманную
    IF BLOCKLENGTH=-2 THEN EXIT
    на
    IF EOF(FILE) THEN EXIT

    И тоже всё замечательно работает.

    Sergey, спасибо за моральную поддержку.

    Опечатку нашел. Строку
    WHEN TYPE=0 THEN TYPE='Programm'
    заменить на
    WHEN TYPE=0 THEN TYPE='Program'
    иначе, при отсутствии автозапуска не будет подставляться слово NONE, а будет высвечиваться какое-нибудь 65535, что есть бред.
    Вложения Вложения
    Последний раз редактировалось creator; 26.01.2015 в 17:17.
    В правильно заданном вопросе содержится половина ответа

  9. #8
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Раз автоматизация, то внесу свои 5 копеек. Давно хотел, но то забыл то некогда.

    В SDCC есть один недостаток - он всегда делает для инициализированных статических переменных отдельную секцию с данными, которую называет _INITIALIZER.
    После загрузки программы, содержимое секции _INITIALIZER должно быть скопировано в секцию _INITIALIZED и только потом вызывается main().

    Это приводит к тому, что для загрузки программа требует больше памяти, а главное - это копирование совершенно бессмысленно.

    Выхода два:
    1. Объявлять все инициализированные переменные как const. Очень неправильный и некрасивый выход.
    2. Скопировать содержимое секции _INITIALIZER в секцию _INITIALIZED после линковки, а секцию _INITIALIZER вообще удалить. Именно такой выход и реализован мной в скрипте на bash. Для работы скрипта нужен .map-файл и бинарь.

    Во вложении лежит пример.

    sdcc-noinit-20.12.2016.tar.bz2.7z

    Немного о структуре:

    scripts/autoconfig - слздает файл autoconfig.asm из config.mk
    scripts/bin2hob - умеет делать hobeta из бинарей с помощью z80asm
    scripts/sdrmini - скрипт, который копирует содержимое секции _INITIALIZER в секцию _INITIALIZED и удаляет секцию _INITIALIZER

    crt0.s - начальный "запускальщик"
    main.c - пример программы
    Makefile - сборочный скрипт
    tools.mk - тут описаны утилиты для сборки
    config.mk - конфигурация программы: стартовый адрес, стек собственный или вызывающего, разрешение-запрещение прерываний


    Наберите make tap и получите два выходных tap-файла:
    bzxtest.tap - файл с бейсик-загрузчиком.
    czxtest.tap - только кодовый файл.

    Для добавления своих файлов с исходниками достаточно изменить строку Makefile OBJ=main.rel на свою, например OBJ=main.rel myfile.rel

    Если в каталоге будет файл на C myfile.с или на ассемблере myfile.s - то он автоматически будет скомпилирован.

    Для работы всего этого, конечно, нужны sdcc, bin2tap, make, bash, dd, sed, grep, dz80, hex2bin, z80asm. В общем приличный набор каждого уважающего себя кодера для ZX

    В основном спековские утилиты есть во втором вложении.

    - - - Добавлено - - -

    Что-то увлекло меня.
    В общем облагородил систему сборки. Библиотеки в отдельном каталоге libsrc теперь. Автоматически пути генерируются. Автоматически подключаются к программе.

    Собирается вся эта радость sdcc-3.6.0

    Дополнительные утилиты прилагаю.

    Засунул туда поддержку PS2 (в демке не используется), спрайтов, printfa куцего и сбацал микро-дему (шарики и музыка по кругу)

    Сборочная среда с демкой.
    sdcc-noinit-20.12.2016-1.tar.bz2.7z

    Утилиты.
    speccy-toochain-3.2.tar.bz2.7z
    Вложения Вложения
    Последний раз редактировалось SfS; 20.12.2016 в 11:37.

  10. #9
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Автоматизируем дальше.
    Разбил библиотеки и программы. Теперь можно компилировать множество программ с одними и теми же библиотеками, но настройки программы для каждой свои.
    Библиотеки (исходники) лежат в libsrc, откомпиленные библиотеки - в libs.
    Программы (исходники) лежат в apps, откомпиленные программы - в bin.

    Настройки общие - в configs. Там отельные файлы:
    apps.mk - список программ для сборки
    library.mk - список собираемых библиотек
    tools.mk - список утилит
    crt0.mk - стартовый код. Для каждой программы от собирается со своими настройками, которые находятся в каталоге программы (файл apps/имя программы/config.mk).

    Такой подход позволяет собирать программы с разными адресами расположения.

    Ограничения. Имя программы должно совпадать с каталогом ее расположения. Например:
    программа testapp распологается в каталоге apps/testapp и в файле apps/testapp/Makefile имя программы тоже указано как APP=testapp

    sdcc-noinit-21.12.2016-1.7z

  11. #10
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Переработал немного вывод, чтобы подключить стандартный printf().
    Функции для позиционирования курсора, управления цветом и очистки экрана - в библиотеке libconio.

    Есть ли поддержка float для z80 в sdcc - ЗАГАДКА. Функции компилируются и имеются в библиотеке. НО! попытка сделать любую операцию с float - ломает программу
    Вложения Вложения

Страница 1 из 6 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. SDCC: библиотеки для ZX
    от Sergey в разделе Программирование
    Ответов: 10
    Последнее: 25.10.2015, 19:30
  2. Бага SDCC версии 3.3.0
    от TSL в разделе Программирование
    Ответов: 37
    Последнее: 20.04.2014, 17:31
  3. sdcc. с чего начать.
    от ALKO в разделе Программирование
    Ответов: 42
    Последнее: 16.09.2012, 15:49
  4. SDCC вокруг да около
    от andrews в разделе Программирование
    Ответов: 8
    Последнее: 26.03.2008, 08:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •