Вход

Просмотр полной версии : Хочу сделать IO-символов во внешнее приложение



Uporot
22.11.2010, 13:06
Если кратко, то я хочу сделать PRINT "fuck" или INPUT "Enter your name?", a$, а внутри эмулятора отловить выводимую строчку и сделать с ней еще что-то, возможно вернуть ответ.

Вот тут: http://zx.pk.ru/showthread.php?t=12565 - я полгода назад уже пытался разбираться с устройством потоков, но просто не осилил. Сейчас я взял либу z80ex, построил на ней свой простой эмулятор и начинаю свои извращения с нуля.

Подумалось, что если уж со стандартными потоками столько возни - почему бы не отлавливать значения регистров машины и не делать IO на их основе? В общем с помощью FUSE, его отладчика, самодельной дампилки регистров, перла и прочего скриптоебства я узнал, что для вывода текста можно ловить состояние регистра PC в 0xb24, а выводимый символ читать из регистра А (или старших битов AF).

А вот как найти конец строчки? Подумалось, что EOL нет, а значит надо ловить инструкцию RET (как конец функции отображения, ведь экранные координаты могут быть разные, а хотелось бы целую строчку, без переносов), написал дампилку, и.... в общем как и следовало ожидать, между выводом строк пробегает СЛИШКОМ МНОГО ретов, но мое регексп-фу подсказало 2 адреса - это 0x1987, которое вызывается между строк при выводе LIST и 0x16E4, которое в общем-то вызывается между принтами, но порой и без них. Пробовал гуглить эти функции и их описания - ничего не нашел. Да, можно конечно проверять на вывод пустую строчку, но это не слишком понтово и достаточно костыльно.

Так вот, поскольку я ниасилятор, научи искать нужные значения. Мне бы еще Input пограбить, писать в порты я умею, клаву эмулировать тоже, а вот отлавливать точку входа в опрос - нет, и так чую я, что из-за прерываний это будет сделать _гораздо_ сложнее, нежели разбираться с выводом текста

Есть конечно вариант забить на это и распарсить бейсик, но тогда не будут работать асмовставки (я так понимаю, что подпрограмма на 0x18 работает тоже через 0xb24). Опять же, придется искать указатели на текущие инструкции бейсика, а их я тоже не нашел, в отладчике это будет сделать сложно (ну по крайней мере для меня)

Или лучше вернуться к потокам?

goodboy
22.11.2010, 15:15
#203C
A,B
OR C
DEC BC
RET Z
A,(DE)
INC DE
RST #10
JR #203C

при входе в DE начало печатаемой строки, в BC её длина

почитай ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.txt
поиск длины стринга #25B3

Uporot
23.11.2010, 16:23
#203C
A,B
OR C
DEC BC
RET Z
A,(DE)
INC DE
RST #10
JR #203C

при входе в DE начало печатаемой строки, в BC её длина

почитай ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.txt
поиск длины стринга #25B3За ссылку спасибо, изучаю, а вот с адресом непонятка вышла.

Вот тестовое приложение:
1 PRINT 12
2 PRINT 23242
3 PRINT "длинная строчка"
5 PLOT 10,10
10 PRINT 23623
14 PRINT AT 10,10 ; RND
15 LIST
20 GO TO 1

Лог исполнения которого приведен в аттаче

output - это функция вывода символа, EOL - это возжные выходы из функции (и их адреса)
possible print func - это как раз вызовы 0х203C

как видно, вызывается оно только при выводе длинной строчки, все остальные символы куда-то исчезают