Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 июн 2025, 23:47

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 25 июн 2014, 14:08 
Не в сети

Сообщения: 25
Попробовал сделать простенькую библиотеку. ExtraSpectrumGameOberonEngine сокращённо ESGOE.
Вот такая сама:
Код: "OBERON"
  1. MODULE Esgoe;
  2. IMPORT SYSTEM,B:=Basic,Asm;
  3.  
  4. TYPE
  5. (*Form*=RECORD END; *)
  6.  
  7. PROCEDURE LoadResources*(FileName:ARRAY OF CHAR);
  8. BEGIN
  9. END LoadResources;
  10.  
  11. PROCEDURE ShowForm*(FormName:ARRAY OF CHAR; VAR form:(*Form*)INTEGER):INTEGER;
  12. BEGIN
  13. B.CLS;
  14. B.AT(5,12);
  15. B.PRSTR("PRESS ANY ON KEYBOARD");
  16. REPEAT UNTIL B.KeyPressed();
  17. RETURN 0;
  18. END ShowForm;
  19.  
  20. END Esgoe.

Её тест:
Код: "OBERON"
  1. MODULE EsgoeTest;
  2. IMPORT EN:=Esgoe,B:=Basic;
  3.  
  4.  
  5. VAR
  6. Res:INTEGER;
  7.  
  8. MyStartForm:INTEGER(*EN.Form*);
  9.  
  10. BEGIN (*$MAIN*)
  11. B.PRSTR("0"); B.PRLN;
  12. EN.LoadResources("EsgoeTest");
  13. B.PRSTR("1");
  14. Res:=EN.ShowForm("EsgoeTestStartForm",MyStartForm);
  15. B.PRSTR("2");
  16.  
  17.  
  18. END EsgoeTest.


Когда компилирую (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
Я где-то в батнике менял какой-то адрес, когда круги делал, наверное из-за этого. Буду искать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 25 июн 2014, 14:16 
Не в сети

Сообщения: 25
Да, в файле ZXDev\Bin\build.bat первые 2 строчки:
Код: "OBERON"
  1. @SET CodeAddr=50056
  2. @SET DataAddr=63488

Было 40056 исправил на 50056, вроде пошло, вижу сообщение :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 25 июн 2014, 16:04 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Reobne писал(а):
Когда компилирую (F11) библиотеку, то приходят предупреждения:
?ASlink-Warning-Undefined Global '_Basic_AT_ROM' referenced by module 'Esgoe'
Причиной такого предупреждения может быть неприсутствие в вызове SDCC указания подключить Basic.lib.

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
а BIN здоровый 23 443
SDCC иногда генерирует огромный бинарник, когда пытается соединить память под данные с памятью под код. В случае описания инициализированных переменных, например. Хотя в Обероне таких переменных быть не может. Я написал специально для таких случаев "резалку" ZXDev/Bin/stripbin.exe, которая устроена "в лоб", но помогает. Как её вызывать — вот пример:

%bin%\hex2bin DemoSpr.ihx
%bin%\stripbin DemoSpr.bin

"Резалка" не всегда нужна, — только если SDCC почему-то заупрямится и выдаст огромный бинарник, в конце (перед блоком данных) которого будет много байтов FF FF FF:


Вложения:
ffffff.png
ffffff.png [ 8.05 КБ | Просмотров: 29164 ]
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 25 июн 2014, 16:34 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Кстати, вот ещё момент. Почему нельзя задавать стартовый адрес большой программы слишком низко. В утилите 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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 03:36 
Не в сети

Сообщения: 25
Я простой писатель библиотек, и мне страшно разбираться, как работают BAT файлы. Я чувствую, что если начну думать о них, то забуду свои великие идеи, которые хочу реализовать в библиотеках. :)
Поэтому я начинаю выкручиваться. А что, если сделать ещё один модуль:
Код: "OBERON"
  1. MODULE EsgoeTypes;
  2.  
  3. TYPE
  4. Form*=RECORD END;
  5.  
  6. END EsgoeTypes.

Поскольку в нём нет процедур, он не подвержен смартлинковке.

Библиотека Esqoe будет импортировать тип из него:
Код: "OBERON"
  1. MODULE Esgoe;
  2. IMPORT EsgoeTypes,SYSTEM,B:=Basic,Asm;
  3.  
  4. TYPE
  5. Form*=EsgoeTypes.Form;
  6.  
  7. PROCEDURE LoadResources*(FileName:ARRAY OF CHAR);
  8. BEGIN
  9. END LoadResources;
  10.  
  11. PROCEDURE ShowForm*(FormName:ARRAY OF CHAR; VAR form:Form):INTEGER;
  12. BEGIN
  13. B.CLS;
  14. B.AT(5,12);
  15. B.PRSTR("PRESS ANY ON KEYBOARD");
  16. REPEAT UNTIL B.KeyPressed();
  17. RETURN 0;
  18. END ShowForm;
  19.  
  20. END Esgoe.
  21.  


Обе эти библиотеки нормально собираются.

Теперь тестер:
Код: "OBERON"
  1. MODULE EsgoeTest;
  2. IMPORT EN:=Esgoe,B:=Basic;
  3.  
  4.  
  5. VAR
  6. Res:INTEGER;
  7.  
  8. MyStartForm:EN.Form;
  9.  
  10. BEGIN (*$MAIN*)
  11. B.PRSTR("0"); B.PRLN;
  12. EN.LoadResources("EsgoeTest");
  13. B.PRSTR("1");
  14. Res:=EN.ShowForm("EsgoeTestStartForm",MyStartForm);
  15. B.PRSTR("2");
  16.  
  17.  
  18. END EsgoeTest.

Возникли предупреждения:
Код: "OBERON"
  1. ?ASlink-Warning-Undefined Global '_EsgoeTypes__init' referenced by module 'Esgoe
  2. _003'
  3.  
  4. ?ASlink-Warning-Undefined Global '_EsgoeTypes_Form__typ' referenced by module 'E
  5. sgoeTest'


,но проект скомпилировался.

Варнинги меня сильно смущают, и пугают, это как ругань, мне говорят что я делаю что-то неправильно, но что - я не могу понять. Каждый раз копировать файлы *.с и *.h я устал. Я угнетён и раздавлен.
А ведь я хотел теперь дописывать тип формы.
"А! Зачем мне всё это надо!", думаю я и покидаю мир Оберона.

Обкатка 1 провалена.

Нужно сделать так, чтобы для простой библиотеки не нужно было каждый раз копировать файлы с и h, а только для продвинутых писателей, которые включат в оберон-код библиотеки особый ключ, например (*$C-Lib*)

Либо хотя-бы хорошо описать работу BAT-ников, только то, что нам нужно для работы в ZXDev. Что куда копируется и зачем. С примерами сборки:
библиотеки со смартлинковкой и редактированием Си кода;
библиотеки со смартлинковкой и без редактирования Си кода;
библиотеки без смартлинковкой и редактированием Си кода;
библиотеки без смартлинковкой и без редактирования Си кода.

Надо попытаться побороть варнинги.

Если с моноблочным загрузчиком больше проблем, то почему не сделать по умолчанию обычный загрузчик?

И адреса блоков кода и данных, их тоже надо как-то сделать явными, больше про них написать, что-ли. Или внести в исходник (*$MAIN ZXCodeAddr:=50056 ZXDataAddr:=63488*) Хм, нет, исходник должен быть униплатформенным, некрасиво если он будет наполнен настройками каждой платформы.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 16:32 
Не в сети

Сообщения: 25
Переделал Lib\Bin\Build.bat
Код: "OBERON"
  1. @CD ..
  2. @SET RootBin=..\..\Bin
  3. @REM ..\Bin\sdcc -c %1.c -mz80 --opt-code-size --disable-warning 59 --disable-warning 85 -I "."
  4. @REM @IF errorlevel 1 PAUSE
  5.  
  6. @IF EXIST %1.lib DEL %1.lib
  7. %RootBin%\smartlib %1.c
  8. @FOR %%i IN (%1_0??.c) DO (
  9. ..\Bin\sdcc -c %%i -mz80 --opt-code-size --disable-warning 59 --disable-warning 85 -I "." -I include -I Obj
  10. @IF errorlevel 1 PAUSE
  11. )
  12. @FOR %%i IN (%1_0??.rel) DO ..\Bin\sdar -rc %1.lib %%i
  13. @MOVE /Y %1.lib z80/%1.lib
  14. @Bin\clear


В Lib\Bin\build-AutoCopy.bat
Код: "OBERON"
  1. @CD ..
  2. @SET RootBin=..\..\Bin
  3. @REM ..\Bin\sdcc -c %1.c -mz80 --opt-code-size --disable-warning 59 --disable-warning 85 -I "."
  4. @REM @IF errorlevel 1 PAUSE
  5.  
  6. @COPY /Y Obj\%1.c
  7. @COPY /Y Obj\%1.h
  8.  
  9. @IF EXIST %1.lib DEL %1.lib
  10. %RootBin%\smartlib %1.c
  11. @FOR %%i IN (%1_0??.c) DO (
  12. ..\Bin\sdcc -c %%i -mz80 --opt-code-size --disable-warning 59 --disable-warning 85 -I "." -I include -I Obj
  13. @IF errorlevel 1 PAUSE
  14. )
  15. @FOR %%i IN (%1_0??.rel) DO ..\Bin\sdar -rc %1.lib %%i
  16. @MOVE /Y %1.lib z80/%1.lib
  17. @Bin\clear


Добавил Lib\Obj\EsgoeTypes.BAT
Код: "OBERON"
  1. ..\BIN\Build-AutoCopy.BAT EsgoeTypes
  2. PAUSE


Работает, но на паузу в конце не становится.

Что там за закоментированные две строчки? Это их нужно писать, чтобы смарт линковки не было, или просто старьё?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 17:33 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Прошу не отчаиваться. :) Сам был почти в таком же положении, щас будем разбираться.

Reobne писал(а):
Я простой писатель библиотек, и мне страшно разбираться, как работают BAT файлы. Я чувствую, что если начну думать о них, то забуду свои великие идеи, которые хочу реализовать в библиотеках. :)
Не боги горшки обжигают — бери и делай свой батник, притом не с нуля, а на основе готового из папочек Obj и Lib/Obj

Основная трудность батников — это как раз ключики командной строки SDCC. Знание о том, какая папка в батнике текущая, позволяет легко добавить в батник команды копирования.

Разберёмся как может быть устроен батник Bin/compile.bat, устраняющий необходимость копирования .h и .c файлов:
Код: "OBERON"
  1. @CD ..
  2. @IF EXIST %1.c GOTO c_lib
  3.  
  4. :o_lib_obj
  5. ..\Bin\sdcc Obj\%1.c -mz80 --opt-code-size --no-std-crt0 --disable-warning 59 --disable-warning 85 -I "." -I
  6.  
  7. include -I Obj -L z80 XDev.lib
  8. @GOTO exit
  9.  
  10. c_lib:
  11. ..\Bin\sdcc %1.c -mz80 --opt-code-size --no-std-crt0 --disable-warning 59 --disable-warning 85 -I "." -I
  12.  
  13. include -I Obj -L z80 XDev.lib
  14.  
  15. exit:
  16. @IF errorlevel 1 PAUSE
При его запуске (F11-компиляция) не следует обращать внимания на варнинги, поскольку полной сборки рабочего бинарника не осуществляется. Но варнинги такого вида:
Reobne писал(а):
Возникли предупреждения:
Код: "OBERON"
  1. ?ASlink-Warning-Undefined Global '_EsgoeTypes__init' referenced by module 'Esgoe_003'
происходят из-за того, что батник (в момент вызова SDCC) не знает ничего о библиотеке Esgoe.lib, и, соответственно, её нужно подключить простым добавлением Esgoe.lib в команду вызова SDCC.

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

?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'
Я разгадал проблему и такого рода варнингов. Смотри что получается. Из-за того, что при компиляции библиотеки Esgoe заголовки SDCC берёт не из Lib, а из Obj/Lib (а там пустышки, — сгенеренные Ofront'ом пустые тела), — получается, что при использовании скомпилированной таким образом библиотеки лезут варнинги. Нам необходимо поправить пути. И если знаешь чего происходит, уже ясно как с этим бороться. Первый блин комом, как водится. ;)

Ещё может влиять порядок перечисления библиотек. Я меняю в строке вызова компилера:

-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, но, видит бог, другого выхода задействовать Оберон в программировании для Спека я не нашёл.


Вложения:
libEsgoe.zip [8.32 КБ]
Скачиваний: 1292
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 17:36 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Reobne писал(а):
Добавил Lib\Obj\EsgoeTypes.BAT
Код: "BAT"
..\BIN\Build-AutoCopy.BAT EsgoeTypes
PAUSE


Работает, но на паузу в конце не становится.
Нужно:
Код: "BAT"
@CALL ..\BIN\Build-AutoCopy.BAT EsgoeTypes
А то происходит окончательный переход на другой скрипт, а не вызов скрипта из скрипта.

Reobne писал(а):
Что там за закоментированные две строчки? Это их нужно писать, чтобы смарт линковки не было, или просто старьё?
Просто старьё.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club