Аппаратная эмуляция РК86 на ОРИОНЕ за счёт прерываний

Перейти вниз

Аппаратная эмуляция РК86 на ОРИОНЕ за счёт прерываний

Сообщение  barsik в Вс Май 06 2018, 23:30

В этом разделе хочу подумать о аппаратной эмуляции РК86 (а также возможно Специалиста) на базовом ОРИОНЕ с КР580. Хочу поделиться одной мыслью, на которую наткнулся пытаясь по схеме понять как когда-то работал мой аппаратный эмулятор ZX на ОРИОНЕ. Цель этого поста - подумать самому (когда пишу лучше обдумываю), а возможно дать наводки другим любителям рэтро хобби.

Как раз сейчас я нуждаюсь в эмуляторе РК86 на ОРИОНЕ. Дело в том, что пытаюсь изучить программирование на Паскале для РК86. Естественно, это удобнее делать не в реале, а на IBM PC, используя эмулятор.

Свой PC-эмулятор РК86 (для MSDOS) у меня есть, но он убогий (первый блин комом из 1998), - не эмулирует режимы ВГ75, отчего работают только системные программы и лишь часть игр. Но даже, если бы он был великолепен, это не важно, т.к на РК86 вообще нет CP/M, потому транслировать программу Паскаль-компилятором я могу лишь в своём эмуляторе ОРИОНА, где есть CP/M с высоким TPA.

Кстати, чужие эмуляторы ОРИОНА для данной цели почти не годятся, у них неудобный обмен файлами (чтобы получить CP/M-файл в эмуляторе надо с помощью читалки образов дискет 'SteinBlume' копировать файл в образ дискеты). Мой эмулятор ОРИОНА этого не требует и стартует мгновенно.

Потому для разработки программ используя CP/M-компилятор нужны два эмулятора - полноценный эмулятор CP/M и эмулятор РК86. Тогда цикл модификация исходника - проверка, теоретически должен делаться так:

Заканчиваю очередную модификацию исходника Паскаль-программы. Захожу в эмулятор ОРИОНА, запускаю CP/M, транслирую Паскаль программу и копирую готовый COM-файл на винчестер PC. Затем вручную конвертирую этот файл в TAPE-формат, который может загрузить эмулятор РК86 (RKR, но удобнее GAM, т.к он универсальный, грузится и на эмуляторах всех клонов и эмуляторе Специалиста). После чего запускаю эмулятор EMU80 в режиме эмуляции РК86, гружу в него TAPE-файл программы и запускаю её для проверки.

Как видите, получается очень долгий цикл одной итерации. А с учётом того, что выгоднее как можно чаще делать проверку, то выгодно иметь как можно более короткий цикл.

Причём и сама трансляция больших программ в CP/M под эмулятором длится долго. Кстати, наиболее короткое время занимает проверка при разработке на ассеблере, т.к M80/L80 работают под TSR-эмулятором CP/M и стартуют как программы MSDOS. Тогда закончив редактирование, - хлоп по кнопке, - запускается BAT-файл, который транслирует, компонует, копирует файл в каталог эмулятора и стартует эмулятор, в котором автоматически стартует программа. На всё это уходит секунда.

А вот с использованием CP/M-Паскаля потери времени на проверку гораздо бОльшие. Даже с использованием пакетного ввода команд с помощью AUTOEXEC.SUB (благодаря чему сразу же по старту эмулятора начинается трансляция Паскаль программы) уходит много времени. Сначала с помощью M80 транслируются ASM-модули, затем компилятором Паскаля транслируются Паскаль модули, затем происходит линковка с помощью LINKMT. Все трансляции и линковка происходят на скоростях 8-ми разрядки, отчего длится долго (даже Hello World транслируется 15 секунд, а программа в тысячу строк траслируется ~5 минут).

С учётом того, что постоянно возникают ошибки трансляции и её приходится многократно повторять, то потери времени чуть ли не уравнивают трудоёмкость процесса с разработкой на голом ассемблере. Т.е, по крайней мере на несложных по логике программах, из-за длительности процедуры трансляции и отладки, ассемблер оказывается быстрее при разработке, чем ЯВУ.

Потому для сокращения времени, я и проверку РК-программы делаю на ОРИОНЕ, точнее в эмуляторе ОРИОНА. Пользуясь тем, что программы РК не лезующие в экран и к ППА клавиатуры и не вызывающие F812, без проблем работают на ОРИОНЕ. Чтобы проверить программу РК на ОРИОНЕ, мне нужно запустить её в банке 0 на адресе 100. CP/M ОРИОНА работает в банке 1. Потому я отладчиком ZSID3 загружаю код скомпилированной РК-программы на адрес 100, затем делаю сброс (клав.F8) и оказавшись в M3-EXT директивой P копирую банку 1 в банку 0, получив тем самым код программы в банке 0. Далее просто запускаю РК-программу командой G100<ВК>. Такой трюк, благодаря совместимости ОРИОНА и РК86 экономит мне на каждой итерации пару минут.

К сожалению, при написании игр для РК, ради скорости выгоднее выводить в экран не стандартной подпрограммой F809, позиционируя курсор с помощью ESC+Y, а напрямую записывая байт в экранный буфер. Для РК-программ это общепринятая практика, т.к это проще, хотя и не рекомендуется. Даже игры, что выводят на экран п/п-ммой F809 иногда не работают, т.к стандартная п/п-мма для считывания байта с экрана не работает. Т.е при прямой записи в экран проверять программу в ОРИОНЕ уже невозможно. Остаётся только записывать результат трансляции на винчестер PC, вручную конвертировать его в TAPE-формат и проверять в EMU80 эмулирующем РК86.

Мой эмулятор ОРИОНА эмулирует "голый Z80", но прерывания 50 Гц, включаемые портом FB эмулируются. Это даёт возможность написать программый эмулятор, точнее визуализатор программ РК86 (это не эмулятор, потому что доступ в порт клавиатуры 8000, а тем более режимы ВГ75 не эмулируются).

Для чего достаточно к Паскаль программе подключить написанный на ассемблере модуль визуализции экрана РК86 на ОРИОНЕ. Тогда при старте Паскаль программы в ОЗУ ОРИОНА выше 8000 загружается модуль визуализации, который включает прерывания, причём даже не обязательно в MODE2 (MODE 0, с вектором на адресе 38 тоже годится, т.к Паскаль программа выше 100H) и 5-20 раз в секунду визуализирует экран РК86 на экране ОРИОНА. Понятно, что для каждого режима РК86 (которые отличаются адресами экранных строк) нужен свой визуализатор. В простейшем случае это визуализатор базового режима РК86 в 31 строку (25 видимых строк, что устанавливается по сбросу). Понятно, что визуализатор, это крошечная программка всего в сотню байт (плюс фонт псевдографики). Но уже это позволяет запускать на ОРИОНЕ РК-программы, что не лезут в ППА клавиатуры.

А изменив в РК-программе адрес ППА клавиатуры (что работа всего на несколько минут), можно прогонять большинство программ РК. В том числе и графические, изменяющие режим ВГ75 и адрес экрана. Понятно, что для каждой такой игры, к ней должен подключаться свой блок визуализации. Но и это не проблема, т.к половина игр использует ущёрбный стандартный режим с 31-й строкой и межстрочными разрывами, а вторая половина - режим в 39 строк (это режим без межстрочных разрывов). Таким образом достаточно написать программу, которая автоматически прилепляет к каждой РК-игре модуль визуализатора, делая эту игру пригодной для использования на ОРИОНЕ.

К сожалению, не всё так радужно. Разработчики ОРИОНА допустили непростительную ошибку, - подпрограммы опроса клавиатуры работают с отличием от аналогичных подпрограмм РК86 (кстати, подпрограммы опроса клавиатуры РК лучше, т.к короче орионовских). Это приводит к тому, что даже вполне корректные программы РК86 нихрена не работают на ОРИОНЕ, а виснут на опросе клавиатуры.

Это легко исправляется, если на Вашем ОРИОНЕ два банка ПЗУ по 2К в области F800 (коммутируемые портом FC), что я впервые применил в 1991 и с тех пор это на всех моих ОРИОНАХ, т.к очень удобно. Потому два ПЗУ F800, естественно, есть и в моём эмуляторе ОРИОНА из 1999 года. Тогда в режиме прогона РК-программ в окне ПЗУ F800 включается исправленная версия ПЗУ, где подпрограммы опроса клавиатуры работают точно как на РК86, что и позволит прогонять все программы РК, что не лезут в ППА клавиатуры (а те что лезут несложно доработать переадресовав обращения к клавиатуре 8000 на F400).

Таким образом, если в Вашем ОРИОНЕ есть аппаратные прерывания (5...50 ГЦ), то такой ОРИОН позволяет Вам использовать программы от РК86. При некотором усложнении концепции (при переносе кода программы и визуализатора в банку 1), можно эмулировать и Специалист, по крайней мере для программ, что не лезут к матрице клавиатуры напрямую.

Это будет первое полезное применение прерываний на ОРИОНЕ. Для эмуляции РК и Специалиста достаточно даже КР580, если ввести возможность иметь обработчик прерываний на любых адресах. Но и без этого можно использовать прерывания в тех программах, что не затирают область ниже 100H.

Для начала, попробую в своём эмуляторе ОРИОНА визуализатор лишь для самого базового режима (25*64). Позднее, естественно, напишу и визуализатор для 39-строчного режима РК86.

Для реального ОРИОНА иметь эмулятор РК86 мне не особо надо, но впоследствии, естественно попробую и на реальном ОРИОНЕ. Главное, что эта идея позволит мне транслировать и отлаживать программы для РК86 в эмуляторе ОРИОНА.

http://zx-pk.ru/threads/23491-chto-zhe-predlozhil-izobretatel.html?p=940395&viewfull=1#post940395

_________________
***
avatar
barsik
новичёк

Сообщения : 91
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения