Можно конечно. Вот есть функция EOF(), но она тоже как-то не так работает, кстати и на Амиге аналогично.
Можно конечно. Вот есть функция EOF(), но она тоже как-то не так работает, кстати и на Амиге аналогично.
В правильно заданном вопросе содержится половина ответа
С уважением,
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
Что-то и с 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.
В правильно заданном вопросе содержится половина ответа
Раз автоматизация, то внесу свои 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.
Автоматизируем дальше.
Разбил библиотеки и программы. Теперь можно компилировать множество программ с одними и теми же библиотеками, но настройки программы для каждой свои.
Библиотеки (исходники) лежат в 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
Переработал немного вывод, чтобы подключить стандартный printf().
Функции для позиционирования курсора, управления цветом и очистки экрана - в библиотеке libconio.
Есть ли поддержка float для z80 в sdcc - ЗАГАДКА. Функции компилируются и имеются в библиотеке. НО! попытка сделать любую операцию с float - ломает программу
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Гм, слом программы может быть не из-за самого float, а из-за пристёгивания рантаймов. Там всё хитро, в коде есть окошко, забитое FF, если сделать его слишком маленьким - программа будет глючить. Надо поиграться адресами.
В ZXDev есть примеры, использующие тип float, которые собираются SDCC и работают. См. Flower, GraphSinus, Spiral в архиве. Используемый в Си-исходниках тип REAL определён в SYSTEM.h как
floatExamples.zipКод:typedef float REAL;
Что-то с библиотеками у меня.
Когда я делаю так:
то программа компилируется, но сбрасывается.Код:float f=1.0f; void main(){ f=f+0.1; while(1); }
А когда я сам компилирую библиотечную функцию __fsadd() - то работает нормально.
Думаю, что дело в компиляторе.
Последний раз редактировалось SfS; 23.12.2016 в 08:52.
Разобрался.
Нашел ошибку в скрипте, который перемещает инициализированные переменные из INITIALIZER в INITIALIZED.
Нет худа без добра. Вытащил все стандартные библиотеки для Z80 из SDCC и воткнул их в свою систему сборки.
Если нужна плавающая точка в printf(), то теперь достаточно поправить файл configs/printf_float.mk
Только вот засада, при использовании printf() с плавающей точкой размер программы сразу возрастает на 6Кбайт!
Если надо выводить только текстовые строки (с прокруткой, как в терминале) - то есть функция printf() в libconio. Она маленькая. Для управления экраном смотрите libconio.h (цвета, позиция курсора и проч).
В программе используется шрифт KOI8R (2Кбайта). Есть идея вынести его в отдельную библиотеку. Если он не нужен - то проще использовать системный.
Пробуйте, то что я накропал) Вдруг кому понравится)
Последний раз редактировалось SfS; 24.12.2016 в 14:19.
Мои эксперименты с float показали, очевидную вещь - флоат дико тормозит, потому как написан на C.
Интересно, а имеется ли для 8080/z80 библиотека работы с float IEEE стандарта, написанная на ассемблере? Хотя бы + - * /?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)