Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Обкатка системы создания библиотек https://zx.oberon.org/forum/viewtopic.php?f=10&t=205 |
Страница 1 из 1 |
Автор: | Reobne [ 25 июн 2014, 14:08 ] |
Заголовок сообщения: | Обкатка системы создания библиотек |
Попробовал сделать простенькую библиотеку. ExtraSpectrumGameOberonEngine сокращённо ESGOE. Вот такая сама: Код: "OBERON"
Её тест: Код: "OBERON"
Когда компилирую (F11) библиотеку, то приходят предупреждения: ?ASlink-Warning-Undefined Global '_Basic_AT_ROM' referenced by module 'Esgoe' Игнорирую, но всё-же? Библиотечный тип-RECORD пришлось пока закомментировать, а то при сборке ругался, что сильно много раз определён тип. Это из-за смартлинковки? Можно-ли её отключить? Если можно, то как это правильно сделать? Каждый раз, между F11 и F12 либы, приходится копировать файлы Esgoe.h и Esgoe.c из Lib\Obj в Lib. В итоге тест собирается в TAP размером в 23 581 байт, и при запуске ругается: M RAMTOP no good, 10:1 Причём IHX (Intel HEX, как я понял) маленький 2 654 а BIN здоровый 23 443 Я где-то в батнике менял какой-то адрес, когда круги делал, наверное из-за этого. Буду искать. |
Автор: | Reobne [ 25 июн 2014, 14:16 ] |
Заголовок сообщения: | Re: Обкатка системы создания библиотек |
Да, в файле ZXDev\Bin\build.bat первые 2 строчки: Код: "OBERON"
Было 40056 исправил на 50056, вроде пошло, вижу сообщение ![]() |
Автор: | Zorko [ 25 июн 2014, 16:04 ] | ||
Заголовок сообщения: | Re: Обкатка системы создания библиотек | ||
Reobne писал(а): Когда компилирую (F11) библиотеку, то приходят предупреждения: Причиной такого предупреждения может быть неприсутствие в вызове SDCC указания подключить Basic.lib.?ASlink-Warning-Undefined Global '_Basic_AT_ROM' referenced by module 'Esgoe' Reobne писал(а): Библиотечный тип-RECORD пришлось пока закомментировать, а то при сборке ругался, что сильно много раз определён тип. Это из-за смартлинковки? Можно-ли её отключить? Если можно, то как это правильно сделать? Нужно создать свой собственный командный файл (одноимённый с модулем библиотеки), который будет запускаться нажатием F12 и в котором будут точно описаны особенности сборки данной библиотеки. Со смартлинковкой — значит там будет вызов smartlib и компиляция-архивация кусочков в библиотеку. Нет — значит всё будет описано одним вызовом компилятора и одним — библиотекаря.Универсальный батник, который будет для Оберон-библиотек собирать их без смартлинковки, а для Си-библиотек — с ней, планируется, но, увы, пока не реализован. Reobne писал(а): Каждый раз, между F11 и F12 либы, приходится копировать файлы Esgoe.h и Esgoe.c из Lib\Obj в Lib. Можно в этом же батнике прописать компиляцию прямо в Lib/Obj, и тогда не придётся копировать. Раньше я и копирование из Lib/Obj в Lib прописывал в батник.Важно помнить, что нажатие F11 запускает всегда батник Bin/compile.bat, и он один на все случаи. А нажатие F12 проверяет: есть ли для модуля Esgoe в папочке Obj батник Esgoe.bat? Если да, то запускает именно его; если же нет, то для сборки запускается батник Bin/build.bat, который построен более универсально, но как только появляется специфика — приходится отказываться от build.bat и "перекрывать" его работу в соответствии с более специфическими условиями сборки. Reobne писал(а): Причём IHX (Intel HEX, как я понял) маленький 2 654 SDCC иногда генерирует огромный бинарник, когда пытается соединить память под данные с памятью под код. В случае описания инициализированных переменных, например. Хотя в Обероне таких переменных быть не может. Я написал специально для таких случаев "резалку" ZXDev/Bin/stripbin.exe, которая устроена "в лоб", но помогает. Как её вызывать — вот пример:а BIN здоровый 23 443 %bin%\hex2bin DemoSpr.ihx %bin%\stripbin DemoSpr.bin "Резалка" не всегда нужна, — только если SDCC почему-то заупрямится и выдаст огромный бинарник, в конце (перед блоком данных) которого будет много байтов FF FF FF:
|
Автор: | Zorko [ 25 июн 2014, 16:34 ] |
Заголовок сообщения: | Re: Обкатка системы создания библиотек |
Кстати, вот ещё момент. Почему нельзя задавать стартовый адрес большой программы слишком низко. В утилите bin2data есть возможность генерировать загрузчик с кодовым блоком, прописанным после REM (задаётся ключиком -rem). Простой подсчёт: вдруг у нас кодовый блок начинается с адреса 32000 и занимает 20 кб. Сколько будет занимать бейсик-загрузчик? Очевидно, что в случае использования ключика -rem он представляет из себя строчку бейсика CLEAR 31999: RANDOMIZE USR (прыжок на код, размещённый после REM, который перенесёт блок кода нашей программы на его фактическое место и запустит) плюс 20 кб кода внутри REM, поэтому загрузчик после старта не сможет задать RAMTOP в 31999 — не хватит памяти. Вот и получится RAMTOP no good, 10:1 Как бороться. Очевидно, менять утилиту bin2data на другую аналогичного назначения, например, bin2tap, которая сгенерирует уже не загрузчик с кодом внутри (моноблок), а классическую загрузку кода из бейсик-загрузчика: CLEAR 31999: LOAD ""CODE: RANDOMIZE USR 32000 |
Автор: | Reobne [ 26 июн 2014, 03:36 ] |
Заголовок сообщения: | Re: Обкатка системы создания библиотек |
Я простой писатель библиотек, и мне страшно разбираться, как работают BAT файлы. Я чувствую, что если начну думать о них, то забуду свои великие идеи, которые хочу реализовать в библиотеках. ![]() Поэтому я начинаю выкручиваться. А что, если сделать ещё один модуль: Код: "OBERON"
Поскольку в нём нет процедур, он не подвержен смартлинковке. Библиотека Esqoe будет импортировать тип из него: Код: "OBERON"
Обе эти библиотеки нормально собираются. Теперь тестер: Код: "OBERON"
Возникли предупреждения: Код: "OBERON"
,но проект скомпилировался. Варнинги меня сильно смущают, и пугают, это как ругань, мне говорят что я делаю что-то неправильно, но что - я не могу понять. Каждый раз копировать файлы *.с и *.h я устал. Я угнетён и раздавлен. А ведь я хотел теперь дописывать тип формы. "А! Зачем мне всё это надо!", думаю я и покидаю мир Оберона. Обкатка 1 провалена. Нужно сделать так, чтобы для простой библиотеки не нужно было каждый раз копировать файлы с и h, а только для продвинутых писателей, которые включат в оберон-код библиотеки особый ключ, например (*$C-Lib*) Либо хотя-бы хорошо описать работу BAT-ников, только то, что нам нужно для работы в ZXDev. Что куда копируется и зачем. С примерами сборки: библиотеки со смартлинковкой и редактированием Си кода; библиотеки со смартлинковкой и без редактирования Си кода; библиотеки без смартлинковкой и редактированием Си кода; библиотеки без смартлинковкой и без редактирования Си кода. Надо попытаться побороть варнинги. Если с моноблочным загрузчиком больше проблем, то почему не сделать по умолчанию обычный загрузчик? И адреса блоков кода и данных, их тоже надо как-то сделать явными, больше про них написать, что-ли. Или внести в исходник (*$MAIN ZXCodeAddr:=50056 ZXDataAddr:=63488*) Хм, нет, исходник должен быть униплатформенным, некрасиво если он будет наполнен настройками каждой платформы. |
Автор: | Reobne [ 26 июн 2014, 16:32 ] |
Заголовок сообщения: | Re: Обкатка системы создания библиотек |
Переделал Lib\Bin\Build.bat Код: "OBERON"
В Lib\Bin\build-AutoCopy.bat Код: "OBERON"
Добавил Lib\Obj\EsgoeTypes.BAT Код: "OBERON"
Работает, но на паузу в конце не становится. Что там за закоментированные две строчки? Это их нужно писать, чтобы смарт линковки не было, или просто старьё? |
Автор: | Zorko [ 26 июн 2014, 17:33 ] | ||
Заголовок сообщения: | Re: Обкатка системы создания библиотек | ||
Прошу не отчаиваться. ![]() Reobne писал(а): Я простой писатель библиотек, и мне страшно разбираться, как работают BAT файлы. Я чувствую, что если начну думать о них, то забуду свои великие идеи, которые хочу реализовать в библиотеках. Не боги горшки обжигают — бери и делай свой батник, притом не с нуля, а на основе готового из папочек Obj и Lib/Obj![]() Основная трудность батников — это как раз ключики командной строки SDCC. Знание о том, какая папка в батнике текущая, позволяет легко добавить в батник команды копирования. Разберёмся как может быть устроен батник Bin/compile.bat, устраняющий необходимость копирования .h и .c файлов: Код: "OBERON"
Reobne писал(а): Возникли предупреждения: происходят из-за того, что батник (в момент вызова SDCC) не знает ничего о библиотеке Esgoe.lib, и, соответственно, её нужно подключить простым добавлением Esgoe.lib в команду вызова SDCC.Код: "OBERON"
Reobne писал(а): Варнинги меня сильно смущают, и пугают, это как ругань, мне говорят что я делаю что-то неправильно, но что - я не могу понять. Каждый раз копировать файлы *.с и *.h я устал. Внизу я прикреплю архив с собираемой библиотекой. Но замечу, что батники — самая гибкая система быстрого скриптования, и я не вижу как избавиться от них целиком или хотя бы частично, поэтому придётся разбираться понемножку. Я буду помогать, я же для этого специально и форум создал. Главное — не сдаваться. ![]() Reobne писал(а): Нужно сделать так, чтобы для простой библиотеки не нужно было каждый раз копировать файлы с и h, а только для продвинутых писателей, которые включат в оберон-код библиотеки особый ключ, например (*$C-Lib*) Я тоже думал как бы это решить, но в итоге пришёл к выводу, что не следует такие вещи выносить в исходник. Скрипты сборки (мейк-файлы в терминологии Си) есть скрипты сборки, и даже стартовый адрес кода и данных — это низкоуровневые понятия.Reobne писал(а): Либо хотя-бы хорошо описать работу BAT-ников, только то, что нам нужно для работы в ZXDev. Что куда копируется и зачем. С примерами сборки: Конечно поддерживаю!библиотеки со смартлинковкой и редактированием Си кода; библиотеки со смартлинковкой и без редактирования Си кода; библиотеки без смартлинковкой и редактированием Си кода; библиотеки без смартлинковкой и без редактирования Си кода. Ты сейчас мне работку тоже задал. Тонкости они, брат, завсегда в любом деле есть, все заранее не учтёшь. Вот чего получилось: Цитата: h:\Archive\Projects\XDev\ZXDev\Obj>..\Bin\sdcc EsgoeTest.c -mz80 --code-loc 45056 --data-loc 63488 --no-std-crt0 --opt-code-size --funsigned-char --disable-warning 59 --disable-warning 85 -I "." -I ..\Lib -L ..\Lib/z80 Basic.lib XDev.lib Esgoe.lib Я разгадал проблему и такого рода варнингов. Смотри что получается. Из-за того, что при компиляции библиотеки Esgoe заголовки SDCC берёт не из Lib, а из Obj/Lib (а там пустышки, — сгенеренные Ofront'ом пустые тела), — получается, что при использовании скомпилированной таким образом библиотеки лезут варнинги. Нам необходимо поправить пути. И если знаешь чего происходит, уже ясно как с этим бороться. Первый блин комом, как водится. ?ASlink-Warning-Undefined Global '_Basic_CLS' referenced by module 'Esgoe' ?ASlink-Warning-Undefined Global '_Asm__init' referenced by module 'Esgoe' ?ASlink-Warning-Undefined Global '_Basic__init' referenced by module 'Esgoe' ?ASlink-Warning-Undefined Global '_Basic_AT' referenced by module 'Esgoe' ?ASlink-Warning-Undefined Global '_Basic_PRSTR' referenced by module 'Esgoe' ![]() Ещё может влиять порядок перечисления библиотек. Я меняю в строке вызова компилера: -I "." -I include -I Obj на: -I include -I Obj -I "." и это... не помогает! А ведь причина зарыта где-то здесь. Поэтому чешем тыкову и думаем дальше. Можно сперва скопировать из Lib/Obj в Lib, но упс — и так не получается. Вобщем, долго я провозился. И пришёл к выводу, что приоритет при инклюде одноимённых заголовков из разных папочек всегда в пользу даже не текущей папки, а папки, из которой берётся исходник, т.е. в нашем случае это папка Obj. Даже если её не указать в пути ключиком -I Obj. Что ж, может это и "скорее баг, чем фича" компилятора SDCC, но нам остаётся до лучшего решения использовать автокопирование. Правлю скрипт, чтобы копировал Lib/Obj/Esgoe.* в Obj/Esgoe.*, и дальше всё будет собираться накатанным способом. Я раньше чисто обероновские библиотеки не создавал, может поэтому и не предусмотрел этот способ в скриптах. Reobne писал(а): Если с моноблочным загрузчиком больше проблем, то почему не сделать по умолчанию обычный загрузчик? Сделаем. Просто руки не дошли. ![]() Reobne писал(а): И адреса блоков кода и данных, их тоже надо как-то сделать явными, больше про них написать, что-ли. Или внести в исходник (*$MAIN ZXCodeAddr:=50056 ZXDataAddr:=63488*) Хм, нет, исходник должен быть униплатформенным, некрасиво если он будет наполнен настройками каждой платформы. Да, точно. Все эти вещи — в скрипт сборки. Ведь обычно кодер платформы знает особенности платформы.P.S. Вся проблема вытекает не из Оберона, а из особенностей скрещивания Оберона и SDCC, но, видит бог, другого выхода задействовать Оберон в программировании для Спека я не нашёл.
|
Автор: | Zorko [ 26 июн 2014, 17:36 ] |
Заголовок сообщения: | Re: Обкатка системы создания библиотек |
Reobne писал(а): Добавил Lib\Obj\EsgoeTypes.BAT Нужно: Код: "BAT" ..\BIN\Build-AutoCopy.BAT EsgoeTypes Работает, но на паузу в конце не становится. Код: "BAT" @CALL ..\BIN\Build-AutoCopy.BAT EsgoeTypes Reobne писал(а): Что там за закоментированные две строчки? Это их нужно писать, чтобы смарт линковки не было, или просто старьё? Просто старьё.
|
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |