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"
B.DEFDATA(spr0, 157*11 + 5);
B.DATA11(0C4H, 006H, 010H, 00CH, 07EH, 000H, 07FH, 0FFH, 0E0H, 0FFH, 0E0H);
...
B.DATA5 (042H, 042H, 042H, 042H, 042H);
DEFDATA перепрыгивает с помощью JR или JP данные, чтобы они не исполнялись как код. DEFDATAREL — то же самое, но релоцируемое. Ну и DATA*. Оверхед — это как раз прыжок через данные, притом при задании каждого блока.
Вот. Изящнее пока не придумал.
Может подсоветуете чего.
Способ 2: Си. Массив данных подготавливаем также с помощью утилиты bin2c. Получившийся файл отредактируем и будем использовать как реализацию Оберон-интерфейса. Пример есть в Lib/LaserSprite2B и в Lib/GrFonts:
Код: "OBERON"
MODULE GrFonts;
IMPORT SYSTEM, Basic;
TYPE
Font* = INTEGER;
CONST
ZxSpecRom8x8* = Basic.RomFont;
VAR
MsDosCga8x8-, ZxSpecRus8x8-: Font;
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, не так-то просто усвоить.
Глаза боятся, а руки делают, разве нет?
Будем разбираться. Прошу задавать наводящие более конкретные и специфические вопросы.