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

Твердыня модульных языков
Текущее время: 19 сен 2019, 09:00

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 27 июн 2014, 22:52 
Не в сети
Аватара пользователя

Сообщения: 967
Откуда: Днепропетровская обл.
Reobne писал(а):
Изучаю ассемблер, и что-то не вижу, как вставить бинарник. Нашёл только директиву
include /string/
Которая включает ассемблерный файл.
Это получается, что ресурсный файл со спрайтами придётся готовить в виде ассемблерных текстов с кучей .db .dw :(
И как передать имя файла в ассемлер из оберона? Хотя есть вариант завести фиктивную переменную, а потом её имя в предпроцессоре Си использовать как строку.
Вопрос 2. В том ли направлении я копаю по подключению ресурсов?
Вставить бинарные данные в формируемый бинарник наверное нельзя ни из ассемблера, ни из Си. Не нашёл ничего подобного директиве .incbin

Предлагаю подготавливать ресусры двумя способами.

Способ 1: Оберон. Берём двоичный файл и перегоняем его в шестнадцатеричный подходящим способом. Для подобных целей я специально включил в XDev утилиту Bin/bin2c.exe, вызывается она так:

usage: BIN2C <binfile> <cfile> <varname>

Можно ещё проще:

BIN2C binfile


Она генерирует файл такого вида:
Код: "C"
unsigned char varname[2092] = {
0X2F,0X2A,0X20, ... };
Чтобы преобразовать в Оберон-вид делаем пару замен: "," на "H," и "0X" на "0". Вот так, голь на выдумки хитра. ;) Получается вот что:
Код: "C"
unsigned char varname[2092] = {
02FH,02AH,020H, ... ,00A};
Обратим внимание: последний байтик не захексился, потому что после него уже не было запятой, заменённой на "H,". Это придётся сделать ручками.

Далее можно для удобства разбить этот массив данных на строки и подключить к Оберону с помощью конструкций из модуля Basic DEFDATA/DEFDATAREL и DATA*. Пример есть в DemoSpr.Mod:
Код: "OBERON"
  1. B.DEFDATA(spr0, 157*11 + 5);
  2. B.DATA11(0C4H, 006H, 010H, 00CH, 07EH, 000H, 07FH, 0FFH, 0E0H, 0FFH, 0E0H);
  3. ...
  4. B.DATA5 (042H, 042H, 042H, 042H, 042H);
DEFDATA перепрыгивает с помощью JR или JP данные, чтобы они не исполнялись как код. DEFDATAREL — то же самое, но релоцируемое. Ну и DATA*. Оверхед — это как раз прыжок через данные, притом при задании каждого блока.

Вот. Изящнее пока не придумал. :) Может подсоветуете чего.

Способ 2: Си. Массив данных подготавливаем также с помощью утилиты bin2c. Получившийся файл отредактируем и будем использовать как реализацию Оберон-интерфейса. Пример есть в Lib/LaserSprite2B и в Lib/GrFonts:
Код: "OBERON"
  1. MODULE GrFonts;
  2. IMPORT SYSTEM, Basic;
  3.  
  4. TYPE
  5. Font* = INTEGER;
  6.  
  7. CONST
  8. ZxSpecRom8x8* = Basic.RomFont;
  9.  
  10. VAR
  11. MsDosCga8x8-, ZxSpecRus8x8-: Font;
  12.  
  13. END GrFonts.
Код: "C"
/*  GrFonts.h */
 
#ifndef GrFonts__h
#define GrFonts__h
 
#include "SYSTEM.h"
 
typedef
INTEGER GrFonts_Font;
 
import SYSTEM_BYTE GrFonts_ZxSpecRus8x8Font [768];
import SYSTEM_BYTE GrFonts_MsDosCga8x8Font [768];
 
 
#define GrFonts_ZxSpecRom8x8 0x3D00
#define GrFonts_ZxSpecRus8x8 (int)GrFonts_ZxSpecRus8x8Font
#define GrFonts_MsDosCga8x8 (int)GrFonts_MsDosCga8x8Font
 
 
#define GrFonts__init()
 
#endif
Код: "C"
/*  GrFonts.c */
#include "SYSTEM.h"
 
/*================================== Header ==================================*/
 
const unsigned char GrFonts_ZxSpecRus8x8Font [768] = { ... };
 
/*--------------------------------- Cut here ---------------------------------*/
const SYSTEM_BYTE GrFonts_MsDosCga8x8Font [768] = { ... };
Всё как полагается: вообще без оверхеда на перепрыгивание данных и со смартлинковкой. Собирается это дело скриптом Lib/Obj/GrFonts.bat, который просто передаёт управление XDev.bat, в котором есть вызов Lib/Bin/build-xdev.bat:
Код: "WINBATCH"
@CALL ..\Bin\build-xdev.bat GrFonts
Такая схема сборки не кажется идеальной, но она работает. И конечно же буду рад совету как её улучшить.

Reobne писал(а):
Так-же просмотрел ZXDev\Docu\sdccman.pdf пункт 3.14.2 и далее, там вроде как написано как стыковать сишные данные с ассемблерными вставками, но не впитал смысл с ходу. Много слов с двумя подчёркиваниями впереди, всё по неруски, и ассемблер для примера приводится не Z80, не так-то просто усвоить.
Глаза боятся, а руки делают, разве нет? :) Будем разбираться. Прошу задавать наводящие более конкретные и специфические вопросы. :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 ноя 2014, 12:35 
Не в сети
Администратор
Аватара пользователя

Сообщения: 269
Откуда: Россия
А теперь для подключения ресурсов можно использовать константные массивы.


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

Сообщения: 967
Откуда: Днепропетровская обл.
Ещё способ подключать ресурсы, опробован в ZX-клипе:

Clip40Rsrc.c
Код: "C"
const unsigned char Rose2 [3079] = { ... };
Clip40.Mod
Код: "OBERON"
  1. IMPORT SYSTEM, ZX7;
  2.  
  3. PROCEDURE -includeClip40Rsrc '#include "Clip40Rsrc.c"';
  4. PROCEDURE -Rose2 (): INTEGER "(int)Rose2";
  5.  
  6. BEGIN
  7. (* Распакуем экран из массива: *)
  8. ZX7.Mega(Rose2(), 4000H);

2Saferoll: Олежек, покуда не сделаем экспорт — констатнтым массивам будет чего-то недоставать. Хотя вот в данном случае ими можно было бы обойтись (без уровня Си).


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 13 авг 2019, 20:55 
Не в сети

Сообщения: 2
Решил написать небольшую заметку-руководство в помощь тем, кто собирается создавать свои изображения для программ. Этот метод лучше всего подходит, когда нужно закодировать большие изображения, для меньших может быть удобнее использовать ручное кодирование UDG.
Нам понадобятся:
1) Графический кросс-редактор (я пользуюсь ZX-Paintbrush, но, наверное, подойдут и другие);
2) утилита BinCo или аналогичная;

1. Создаем либо открываем изображение, содержащие нужные спрайты;
2. Выбираем выделение областями 8*8, т.е. по знакоместам;
Изображение
3. Выделяем прямоугольную область так, чтобы пунктирная линия выделения находилась внутри нужных знакомест;
Изображение
4. Экспортируем выделение (File —> Export file/selection as..., тип файла выбираем Binary files (*.bin)) в папку, где находится binco.exe. В окне, появившемся при этом, обязательно выбираем Block based output и, если не нужны атрибуты, убираем флажок в пункте "Include attributes in output"; если нужны, то ставим флажок в пункте "First all pixels, followed by all attributes";
Изображение
Изображение
5. Запускаем в этой папке командную строку (для Win10: в адресной строке ввести "CMD", Enter); в ней вводим через пробел: "binco.exe (исходный файл с расширением, в этом примере rectangle.bin) (название итогового файла с расширением .cpp, rectangle.cpp)".
Изображение
6. Открываем cpp-файл в текстовом редакторе. Нам нужны коды вида 0xNN. Копируем и вставляем их в текст программы, заменяя, если надо, "0x" на "0" и "," на "X,".
Изображение


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB