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

Твердыня модульных языков
Текущее время: 22 ноя 2017, 20:13

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




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

Сообщения: 843
Откуда: Днепропетровская обл.
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 
В сети
Администратор
Аватара пользователя

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


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

Сообщения: 843
Откуда: Днепропетровская обл.
Ещё способ подключать ресурсы, опробован в 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: Олежек, покуда не сделаем экспорт — констатнтым массивам будет чего-то недоставать. Хотя вот в данном случае ими можно было бы обойтись (без уровня Си).


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

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


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

Сейчас этот форум просматривают: Saferoll и гости: 1


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

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