Так что же насчёт МГ-формата орловского монитора. Как такой файл ввести в эмулятор?
Сообщение от
Pyk
Сообщение от
barsik
принцип эмуляции магнитофона здесь основан на перехвате единственной подпрограммы LDBYTE (C377, С806). Причём предполагается, что эта подпрограмма вызывается из подпрограммы ввода массива
Нет, это не предполагается
Ну так расскажите о принципе эмуляции работы с магнитофоном в вашем эмуляторе. Всем это будет интересно узнать.
Ясно, что для перехвата используется попадание программы на адреса C377 и C806, т.е на стандартную подпрограмму ввода байта. Но не ясно по какому критерию Вы определяете, что прогон программы ввода байта закончился. b2m в своём эмуляторе делает это вполне понятным образом, он контроллирует точки выхода из п/п-рамм ввода байта и вывода байта. Поэтому его эмулятор не проблема настроить на любое ПЗУ конкретного компьютера. А вот как Ваш эмулятор настроить на конкретное ПЗУ нет никакой информации, а догадаться об этом изучая файлы EMU80.conf и Specialist.conf невозможно. Расскажите как Вы определяете, что ввод байта закончился.
Сообщение от
Pyk
для формата MSX, интересно было бы попробовать перехватить также и эти вызовы.
В этом нет проблемы. Т.к побайтовый обмен в любом МГ-формате имеет точку входа и точку выхода, то достаточно отлавливать вход в соответствующую исполнительную часть подпрограммы LDBYTE. Если перехватывать вход в подпрограмму LDBYTE и точку выхода из неё по RET, то Вас совершенно не волнует какой физически формат использует ПЗУ, это может быть даже и не МГ-формат, а например формат передачи по проводний линии со скоростью 8 кб в секунду.
А в ленинградском мониторе перехватывать ввод/вывод в любых форматах вообще не проблема. Так как в нём подпрограммы LDBYTE/SVBYTE векторизованы (идея заимствованая из монитора SP580), кстати, как и в ОРИОНЕ.
Итак, в ленинградском мониторе СПЕЦИАЛИСТА введены два вектора:
8FD3/D4 - ASAVE - адрес исполнительной части п/п-ммы записи байта на МГ
8FD5/D6 - ALOAD - адрес исполнительной части п/п-ммы чтения байта с МГ
а подпрограммы работы с МГ в ленинградском мониторе вот какие:
Код:
.
LDBYTE: PUSH HL
LD HL,(ALOAD)
EX (SP),HL
RET
SVSB: LD A,0E6H ; вывод на МГ синхробайта
SVBYTE: PUSH HL
LD HL,(ASAVE)
EX (SP),HL
RET
Так что, если Вы перехватили точки входа LDBYTE/SVBYTE, то Вы перехватили ввод/вывод байта во всех форматах, в том числе и когда загружен драйвер для обмена по проводной линии.
В ленинградском мониторе при включении частотной MSX-кодировки нажатием НР+F3 (включение обратно фазовой кодировки - НР+F4), то просто в ячейки ALOAD/ASAVE подставляются другие адреса. Однако в ленинградском мониторе в процедурах ввода/вывода используются не тупые программные паузы программной петлёй, а в паузе между фронтами процессор в правом верхнем углу экрана (по адресу из ACOUNT) выводит число - адрес ячейки куда (откуда) в данный момент происходит ввод (вывод) байта.
8FD7/D8 - ACOUNT (B00B) - экранный адрес куда выводится счётчик при вводе/выводе
А если Вы подменяете прогон реальных МГ-подпрограмм, то естественно и счётчика на экране не будет, если только Вы сами не захотите его выводить. Потому в эмуляторе от b2m счётчик при работе с магнитофоном бежит, а при Вашем алгоритме эмуляции магнитофона этого нет.
При такой концепции должен работать ввод многоблочных программ (вскоре попробую это проверить заменив ПЗУ в эмуляторе). Но перехват подпрограмм LDBYTE/SVBYTE никак не поможет грузить защищённые программы в которых содержится свой загрузчик с МГ, причём даже, если формат не хитроумный с антикракерскими мерами, а стандартный двухфазный, но точка входа в процедуру ввода иная.
Оказывается эмулятор от b2m тоже не совершенен по работе с магнитофоном. Там тоже какая-то "химия". Т.к он не грузит коммерческие программы защищённые форматом записи (естественно, в WAV-виде). А грузит только программы, что используют стандартную п/п-мму ввода байта.