для Fab Agon и для старого нерабочего запуск с ключом -d. Долбагер не подарок, конечно.
Вид для печати
Скрытый текст
Твой вариант можно чуть-чуть улучшить в плане компактности:
По поводу указателей. Можно их пока не делать, а вместо них разрешить такие конструкции: char[addr] и word[addr]. Как раз следом за вышеприведённым кодом идёт обработка type(expr), её можно расширить:Код:if eFlag=0 then
if Buff[0]='"' then
Emi1(0xCD); // CALL ?
word pCode:=nCode;
nCode:=nCode+2;
while Look()!='"' do
if Look()=char(0) then
Stop();
end
Emi1(Read());
end
Emi1(0);
Read();
Emi3(pCode, nCode);
Emi1(0xD1); // POP DE
eFlag:=1;
end
end
Тогда вот такая программа:Код:if eFlag =0 then
word I:=Find(0);
if Cls[I]=1 then
Push(I);
Scan(); // (
Push(Buff[0]);
Scan();
Expr();
word J:=Pop();
I:=Pop();
if J='[' then
Emi1(0xEB); // XCHG
Emi1(0x5E); // MOV E,M
if Size[I]=1 then
Emi1(0x16); // MVI D,0
Emi1(0);
end
if Size[I]=2 then
Emi1(0x23); // INX H
Emi1(0x56); // MOV D,M
end
end
end
будет скомпилирована так:Код:char putc(char C) is
inline 0x0E, 0x02; // mvi C, 2
inline 0xCD, 0x05, 0x00; // call 5
end
word puts(word s) is
while char[s]!=0 do
putc(char[s]);
s:=s+1;
end
end
begin
puts("Hello, world!");
end
Код:ORG 100h
L0005 EQU 5
JMP L014E
L0103:
MVI C,2
CALL L0005
RET
L0109:
LXI H,4101h
MOV E,M
INX H
MOV D,M
XCHG
MOV E,M
MVI D,0
PUSH D
LXI D,0
POP H
MOV A,L
SUB E
JNZ L0122
MOV A,H
SUB D
JZ L014D
L0122:
LXI H,4101h
MOV E,M
INX H
MOV D,M
XCHG
MOV E,M
MVI D,0
LXI H,4100h
MOV M,E
CALL L0103
LXI H,4101h
MOV E,M
INX H
MOV D,M
PUSH D
LXI D,1
POP H
MOV A,L
ADD E
MOV E,A
MOV A,H
ADC D
MOV D,A
LXI H,4101h
MOV M,E
INX H
MOV M,D
JMP L0109
L014D:
RET
L014E:
CALL L015F
DB 'Hello, world!',0
L015F:
POP D
LXI H,4101h
MOV M,E
INX H
MOV M,D
CALL L0109
RET
[свернуть]
ребзя, мы обсуждаем Agon.
Я ж не виноват, что он в этой теме про поддержку строк писал. Можно было бы в теме про TinyContext ответить, но заниматься кросс-постингом не в моих правилах.
Кажется, тут был трэд обсуждения твоего эмулятора? Начни там.
- - - Добавлено - - -
В общем, решил написать бестолковую программу и резко встал на грабли ADL :v2_dizzy_facepalm:
Теперь программа выводит номер режима и разрешение экрана.
- - - Добавлено - - -
в том самом старом примере plot.asm ввел код
и эмуль просто вылетел.Код:; FOR A LINE
.db 18, 0, bright_magenta ; set graphics colour: mode (0), colour
.db 25, 69 ; PLOT: mode (69 is a point in current colour),
.dw 0, 0 ; X; Y;
.db 25, 13 ; PLOT: mode (13 is a line),
.dw 320,240 ; X; Y;
было бы неплохо, если бы b2m заинтересовался поддержкой Agon Light! Было бы кому задавать вопросы по эмулятору.
Общаться с буржуинами удовольствие еще то. Они русского не знают, мы в массе своей английского на приличном уровне.
- - - Добавлено - - -
а для чего пока ADL нужен? Наверняка там траблов больше, чем в эмуляции z80. Нужны тесты выполнения инструкций и памяти. Что-то мне они не попадались. А еще системы прерывания и I2C и второго COM-порта ( завороток хотя бы). Хотя к большинству эмуляторов пользовательские внешние девайсы редко можно подключать.
512 Кб. Не Мб
- - - Добавлено - - -
Увы, но тему про TinyContext превратили в срач и перенесли во флейм, где её не видно половине форумчан.
С CALL для обхода строки получилось отлично. Про char[addr] и word[addr] ещё думаю.
- - - Добавлено - - -
Просто у Андрея Хохлова, автора TinyContext, в TinyContext v1.18 для DOS сделано по-другому - через char[]. И тогда можно адресовать строку просто как массив char.
Вопрос: а у этой штуки какое-то расширение памяти имеется? или 512кб хватит всем?