Спасибо, читаю помаленьку.

Прочитал(sdccman.pdf 3.14.1.2), что в sdcc ассемблерные вставки можно делать так:
Код: "OBERON"
__asm__ (”; This is a comment\nlabel:\n\tnop”);
Тут "\n", это символ перевода строки; "\t" - табуляции.
И подумалось мне, что возможно, было-бы удобно писать ассемблерный текст прямо в обероновском исходнике.
Код: "OBERON"
MODULE AsmTest;
IMPORT Asm;
BEGIN (*$MAIN*)
Asm.Code(' PUSH HL');
Asm.Code(' LD HL,#0h4000');
Asm.Code(' LD (HL),#1');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#3');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#7');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#6');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#255');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#127');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#127');
Asm.Code(' INC H');
Asm.Code(' LD (HL),#255');
Asm.Code(' POP HL');
END AsmTest.
Решил попробовать. Написал интерфейс библиотеки Asm
Код: "OBERON"
MODULE Asm;
(*PLATFORM Spectrum48;*)
PROCEDURE Code*(IN str: ARRAY OF CHAR); BEGIN END Code;
END Asm.
Сохранил в "ZXDev\Lib\Mod"
Компильнул "F11"
Скопировал получившиеся Asm.c и Asm.h из "ZXDev\Lib\Obj" в "ZXDev\Lib"
Переправил хедер
Код: "OBERON"
/* Ofront 1.2 -xtspkae */
#ifndef Asm__h
#define Asm__h
#include "SYSTEM.h"
#define Asm_Code(a,b) __asm__ ("; This is a comment\n\tnop")
import void *Asm__init(void);
#endif
Из Asm.c выкусил Asm_Code, (так как оно теперь в хедере, как предпроцессорный "макрос").
Собрал библиотеку.
Попробовал компилить тестовый пример - не получается

Потыкался, оказалось в батнике ZXDev\Bin\build.bat надо прописать "Asm.lib"
В таком виде всё компилится и собирается, но "; This is a comment\n\tnop" - это заглушка. Надо подставлять строку с кодом из аргумента.
И вот тут возник затык.Тестовый пример даёт такой сишный код
Код: "OBERON"
export main(int argc, char **argv)
{
__INIT(argc, argv);
__IMPORT(Asm__init);
__REGMAIN("AsmTest", 0);
/* BEGIN */
Asm_Code((void*)&" PUSH HL", (LONGINT)9);
Asm_Code((void*)&" LD HL,#0h4000", (LONGINT)15);
Asm_Code((void*)&" LD (HL),#1", (LONGINT)12);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#3", (LONGINT)12);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#7", (LONGINT)12);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#6", (LONGINT)12);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#255", (LONGINT)14);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#127", (LONGINT)14);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#127", (LONGINT)14);
Asm_Code((void*)&" INC H", (LONGINT)7);
Asm_Code((void*)&" LD (HL),#255", (LONGINT)14);
Asm_Code((void*)&" POP HL", (LONGINT)8);
__FINI;
}
Думаю, что из-за этого привидения типа "(void*)&", которое ОФронт понавставлял, и не работает.
Кажется, осталось немного и всё заработает. Либо обмануть ОФронт, чтобы не генерировал "(void*)&", либо как-то хитро сишным предпроцессором его откусить. Мне пока не удалось.