Скрытый текст
Твой вариант можно чуть-чуть улучшить в плане компактности:
По поводу указателей. Можно их пока не делать, а вместо них разрешить такие конструкции: 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[свернуть]
Последний раз редактировалось b2m; 02.05.2024 в 20:20. Причина: убрал под спойлер, чтобы не раздражать Shiny
andrews (02.05.2024), Oleg N. Cher (03.05.2024)
ребзя, мы обсуждаем Agon.
Я ж не виноват, что он в этой теме про поддержку строк писал. Можно было бы в теме про TinyContext ответить, но заниматься кросс-постингом не в моих правилах.
Кажется, тут был трэд обсуждения твоего эмулятора? Начни там.
- - - Добавлено - - -
В общем, решил написать бестолковую программу и резко встал на грабли ADL
Теперь программа выводит номер режима и разрешение экрана.
- - - Добавлено - - -
в том самом старом примере 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;
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
было бы неплохо, если бы b2m заинтересовался поддержкой Agon Light! Было бы кому задавать вопросы по эмулятору.
Общаться с буржуинами удовольствие еще то. Они русского не знают, мы в массе своей английского на приличном уровне.
- - - Добавлено - - -
а для чего пока ADL нужен? Наверняка там траблов больше, чем в эмуляции z80. Нужны тесты выполнения инструкций и памяти. Что-то мне они не попадались. А еще системы прерывания и I2C и второго COM-порта ( завороток хотя бы). Хотя к большинству эмуляторов пользовательские внешние девайсы редко можно подключать.
Последний раз редактировалось andrews; 02.05.2024 в 19:55.
512 Кб. Не Мб
- - - Добавлено - - -
Увы, но тему про TinyContext превратили в срач и перенесли во флейм, где её не видно половине форумчан.
С CALL для обхода строки получилось отлично. Про char[addr] и word[addr] ещё думаю.
- - - Добавлено - - -
Просто у Андрея Хохлова, автора TinyContext, в TinyContext v1.18 для DOS сделано по-другому - через char[]. И тогда можно адресовать строку просто как массив char.
Вопрос: а у этой штуки какое-то расширение памяти имеется? или 512кб хватит всем?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)