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

User Tag List

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 11 по 20 из 54

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

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

    По умолчанию

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

  2. #12
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    93
    Спасибо Благодарностей получено 
    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

  3. #13
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,197
    Спасибо Благодарностей отдано 
    427
    Спасибо Благодарностей получено 
    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.
    В правильно заданном вопросе содержится половина ответа

  4. #14
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    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.

  5. #15
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    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

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

    По умолчанию

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

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

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

  8. #17
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,604
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Гм, слом программы может быть не из-за самого float, а из-за пристёгивания рантаймов. Там всё хитро, в коде есть окошко, забитое FF, если сделать его слишком маленьким - программа будет глючить. Надо поиграться адресами.

    В ZXDev есть примеры, использующие тип float, которые собираются SDCC и работают. См. Flower, GraphSinus, Spiral в архиве. Используемый в Си-исходниках тип REAL определён в SYSTEM.h как

    Код:
    typedef float REAL;
    floatExamples.zip

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

    По умолчанию

    Что-то с библиотеками у меня.

    Когда я делаю так:

    Код:
    float f=1.0f;
    
    void main(){
    f=f+0.1;
    
    while(1);
    }
    то программа компилируется, но сбрасывается.

    А когда я сам компилирую библиотечную функцию __fsadd() - то работает нормально.

    Думаю, что дело в компиляторе.
    Последний раз редактировалось SfS; 23.12.2016 в 08:52.

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

    По умолчанию

    Разобрался.
    Нашел ошибку в скрипте, который перемещает инициализированные переменные из INITIALIZER в INITIALIZED.

    Нет худа без добра. Вытащил все стандартные библиотеки для Z80 из SDCC и воткнул их в свою систему сборки.

    Если нужна плавающая точка в printf(), то теперь достаточно поправить файл configs/printf_float.mk
    Только вот засада, при использовании printf() с плавающей точкой размер программы сразу возрастает на 6Кбайт!

    Если надо выводить только текстовые строки (с прокруткой, как в терминале) - то есть функция printf() в libconio. Она маленькая. Для управления экраном смотрите libconio.h (цвета, позиция курсора и проч).

    В программе используется шрифт KOI8R (2Кбайта). Есть идея вынести его в отдельную библиотеку. Если он не нужен - то проще использовать системный.

    Пробуйте, то что я накропал) Вдруг кому понравится)
    Вложения Вложения
    Последний раз редактировалось SfS; 24.12.2016 в 14:19.

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

    По умолчанию

    Мои эксперименты с float показали, очевидную вещь - флоат дико тормозит, потому как написан на C.
    Интересно, а имеется ли для 8080/z80 библиотека работы с float IEEE стандарта, написанная на ассемблере? Хотя бы + - * /?

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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