Quote:
Вот если бы ты не поленился скачать посмотреть (ПРОСТО ПОСМОТРЕТЬ) как мой мадл устроен
Да я знаю что такое макроассемблер. Ну пусть с очень навороченными макросами. Так это ты ещё Форт не видел. В нём такие вещи, которые ты сделал в МАДЛе для задания спрайтов, можно добавлять на лету.
Quote:
нужна процедура типа MEM(Addr:word,B:Byte); Которая будет добавлять байт в конкретный адрес памяти-Львова. Адрес ОБЯЗАТЕЛЬНО НУЖНО УКАЗЫВАТЬ, ну это ж пользователя проблемы если он не туда полезет (не в тот адрес).
SYSTEM.PUT(adr, num).
Для байта: SYSTEM.PUT(adr, 0).
Для слова: SYSTEM.PUT(adr, LONG(0)).
Есть ещё SYSTEM.GET
Ты вообще описание Оберона читал хотя бы бегло?
Quote:
Твоя диковинка всегда ж с нуля компилит ?!
На самом деле не факт. Но это уровень zcc. Надо выяснить как задать адрес компиляции, скорее всего, его задать можно какой-то опцией командной строки.
Quote:
Т.е мне достаточно знать что смело могу процедуру спрайта устанавливать подальше $8000 и код компилятора его долго еще "не заденет" если я начну новую программу. Далее я его переставлю подальше, скажем $B000 или еще куда, ну не такой я уж и дурной, что не пойму когда его код компилятора задел мой код! Тем более буду знать же это и соответственно учитывать такое!
Да. Эту проблему надо решить. Буду думать.
Quote:
procedure SetAddrRAM(e:Cardinal);{CodeProc=1#}
Задается адрес куда будет компилироваться дальнейший поток кода.
См. выше. ORG даже в асм-вставке задать нельзя.
Quote:
Procedure ComA(COM:Cardinal);{CodeProc=9#}
Procedure ComB(COM,Value:Cardinal);{CodeProc=10#}
Procedure ComC(COM,Value:Cardinal);{CodeProc=11#}
Для SDCC я такое делал (см. модуль Asm). Но в SDCC есть __asm__, а в zcc его аналога нет. Вернее, я не уверен, что решётку (#) съест. Ну да это тонкости Си - диграфы, триграфы, решётка служебный символ, короче.
А чем тебе встроенный асм не зашёл? Разве числами писать машкод лучше, чем прямо мнемониками?
Quote:
Пример использования процедур некоторыми процедурами-командами-КР580.
Однобайтовая: {40}Procedure MovBB;begin A($40);end;
Двухбайтовая: {06}Procedure MviB(e:Cardinal);begin B($06,e);end;
Трехбайтовая: {01}Procedure LxiBC(e:Cardinal);begin C($01,e);end;
Вот такое бы ты смог сделать с SDCC. Можно наверно запросить эту фичу у z88dk'шников, но я не уверен, что им это понравится.
Смотри, с SDCC даже вот так можно:
Code:
MODULE TestCalc;
IMPORT b := Basic, c := CalcZX;
BEGIN (*$MAIN*)
b.Init;
c.PushWord(1000); (* 1000 *)
c.PushByte(24); (* 24 *)
c.Begin;
c.add; (* + *)
c.pi_div_2; (* PI/2 *)
c.duplicate; (* DUP *)
c.add; (* + *)
c.add; (* + *)
c.End;
b.PRSTR("1000 + 24 + PI = ");
c.Print_PopReal();
b.Quit
END TestCalc.
Всё это компилится в байтики, а не в вызовы, как и твой МАДЛ.
Quote:
Метки в трехбайтовых командах-асма-в-обероне не нужны!
Да можешь метки юзать во встроенном асме спокойно, какие проблемы.
Quote:
ДОП. Ах да! "Забирать" то данные из асм-кр580 регистров или же какой-то ячейки памяти в оберон-данные то тоже нужно в случае
Funciton ReadKey:Byte; (или ReadKey:Word;)
Begin
CallLV(...)
В лучшем случае из регистров хотябы из А , HL
[...]
Ну короче продумай.
Всё уже продумано и сделано авторами zcc. Есть пара моделей передачи параметров - в регистре и в стеке со снятием внутри процедуры. Из вставки на асме мы не можем этого юзать. Надо писать в обёртке Си - так, как в Lib/C/*.c
А из асм-вставки в Оберон-процедуре (без обёртки в Си) мы можем юзать только стандартную сишную модель передачи параметров (в стеке без снятия внутри процедуры).
Результаты функций всегда передаются в L (байт) или HL (слово). Или DE:HL (двойное слово).