Последние темы
» Вити больше нет!автор bug19 Пн Фев 20 2023, 19:54
» Собираем оригинальный Орион 128
автор bug19 Пн Фев 20 2023, 19:47
» Проблема плющеного экрана ОРИОНА
автор kanzler Пн Ноя 28 2022, 12:05
» Орион 128 и его клоны возрождение 2019-2022 год
автор kanzler Пн Ноя 28 2022, 12:03
» Электроника КР-04. Информация, документы, фото.
автор kanzler Пн Ноя 28 2022, 12:02
» Новости форума
автор kanzler Пн Ноя 28 2022, 11:52
» Орион-128 НГМД запуск 2021 года
автор matrixplus Сб Сен 10 2022, 17:36
» ПЗУ F800 для РК86
автор ведущий_специалист Сб Сен 10 2022, 10:37
» Микропроцессорная лаборатория "Микролаб К580ИК80", УМК-80, УМПК-80 и др.
автор Электротехник Вт Июл 26 2022, 19:33
» Орион-128 SD карта в Орионе
автор matrixplus Чт Июн 02 2022, 09:00
» 7 Мая. День Радио!
автор Viktor2312 Чт Май 12 2022, 10:58
» Серия: Массовая радио библиотека. МРБ
автор Viktor2312 Ср Май 11 2022, 12:17
» Полезные книги
автор Viktor2312 Пн Май 09 2022, 15:07
» Орион 128 Стандарты портов и системной шины Х2
автор matrixplus Вс Май 08 2022, 23:08
» Орион-128 и Орион ПРО еще раз про блоки питания
автор matrixplus Вс Май 08 2022, 19:09
» Орион-128 Программаторы
автор matrixplus Вс Май 08 2022, 19:02
» Орион ПРО история сборки 2021 до 2022
автор matrixplus Вс Май 08 2022, 18:47
» Анонсы монет (New coin).
автор Viktor2312 Сб Май 07 2022, 23:11
» Хочу свой усилок для квартиры собрать не спеша
автор Viktor2312 Сб Май 07 2022, 19:33
» Амфитон 25у-002С
автор Viktor2312 Сб Май 07 2022, 09:38
» Майнер: T-Rex
автор Viktor2312 Вс Май 01 2022, 09:12
» GoWin. Изучение документации. SUG100-2.6E_Gowin Software User Guide. Среда разработки EDA.
автор Viktor2312 Пн Апр 25 2022, 01:01
» GoWin. Изучение документации. UG286-1.9.1E Gowin Clock User Guide.
автор Viktor2312 Сб Апр 23 2022, 18:22
» GoWin. Documentation Database. Device. GW2A.
автор Viktor2312 Ср Апр 20 2022, 14:08
» GOWIN AEC IP
автор Viktor2312 Ср Апр 20 2022, 12:08
Самые активные пользователи за месяц
Нет пользователей |
Поиск
Программы от РК86 на Специалисте
Страница 1 из 1 • Поделиться
Программы от РК86 на Специалисте
1
Собственно, Специалист уже в 80-тые годы успешно спаразитировал на Микро-80 и РК86. От них ему достался бейсик и пакет МИКРОН для программирования на ассемблере. Это оказалось возможным потому, что чисто системные программы для текстовой машины обычно не лезут ни в железо, ни в рабочие ячейки ROM-BIOS, - достаточно было заменить вызовы ПЗУ F803...F833 на соответствующие из ПЗУ Специалиста, чтобы такие программы стали работоспособны на Специалисте.
А вот с играми от РК86 всё оказалось сложнее (для Микро-80 игр очень мало). Те из РК-игр, что не лезут в экранное ОЗУ и не читают матрицу клавиш через ППА $8000 адаптировать оказалось также не очень сложно. Так Специалист поимел, например, Пэкмана, шахматы и др. Но в общем-то число адаптированных игр оказалось намного меньше, чем можно было ожидать.
Причина этого в том, что большинство игр РК86 нагло лезут в экранное ОЗУ 76D0...7FF4. Многие из таких программ успешно работают на Специалисте, т.е, - имеется реакция на клавиши, но на экране почти ничего не видно (лишь рамка и счёт игры). Чтобы такую программу переделать, её достаточно полноценно дизассемблировать и все команды КР580, что пишут в экранную область, надо дополнить подпрограммой, что дублирует это дело в экране Специалиста. Тогда игра будет играться на Специалисте, причём с учётом перевеса по скорости CPU даже быстрее, чем на самОм РК86.
В 90-тые годы, когда я писал эмуляторы РК86 (для PC 386 или ОРИОНА) мне в научных целях пришлось дизассемблировать около 20 РК-игр. Я обнаружил, что почти все РК-игры (~95%) нагло лезут в экранное ОЗУ 76D0...7FF4. Но процентов 70...80% игр клавиатуру опрашивают стандартными подпрограммами ПЗУ F800. Хотя и среди таких более-менее корректных игр встречаются игры от "врагов народа", - это игры в которых автор сдуру, несмотря на предупреждения авторов РК, что это делать ни в коем случае нельзя, нагло лезет к процедурам внутри ПЗУ F800 (что навсегда лишает возможности улучшать ПЗУ).
И лишь остальные 20-30% игр отличаются повышенной изощрённостью (т.е привязкой к конкретному железу) и создают дополнительные проблемы при их конверсии на Специалист. Помимо обычного прямого доступа в экран РК такие программы ещё более жёстко привязаны к железу. Таких изощрённых игр есть тоже два вида. Один, вполне приличный, заключается в том, что игра сама через ППА по адресу $8000 сканирует матрицу клавиатуры. Обычно это сделано в качественно написанных играх, т.к если надо опрашивать лишь несколько клавиш, то собственный опрос работает быстрее, чем стандартная подпрограмма F81B из ПЗУ РК86. Также прямой доступ к клавиатуре через ППА необходим для определения сразу двух нажатых клавиш.
Но вот второй вариант таких сложных для адаптации игр применяют лишь явные враги народа, которые извращаются издеваясь над системным ПО РК86. Эти нехорошие люди управляют драйвером вывода химическими методами, хотя почти всё то же самое можно делать стандартными подпрограммами. Они подставляют в служебные ячейки ROM-BIOS свои, причём часто недопустимые числа, что вызывает изменение поведения драйвера вывода символов в ПЗУ.
Чтобы адаптировать такие наглые игры недостаточно имитировать работу входов в стандартные подпрограммы ПЗУ, требуется прогонять код именно самого ПЗУ РК86 (который в Специалисте по адресу F800, или где либо ещё, вообще отсутствует как класс). Естественно, и такая проблема при конверсии решается, но путём дополнительных усилий программиста (в ОЗУ приходится иметь копию ПЗУ F800). В общем для обоих типов таких программ требуется дополнительный индивидуальный труд адаптатора.
Итак, если около 70% РК-игр не работают на Специалисте лишь из-за расположения его экрана не в том месте, то в голову сразу же приходит вариант их визуализации на прерываниях. Прерывания ставятся как при Z80, так и при КР580. Хотя Z80 имеет MODE2 для прерываний, что позволяет обработчик прерываний иметь в любом месте ОЗУ, а при КР580 (без ВН59) обработчик прерываний всегда должен стартовать на одном из RST-входов (традиционно используют RST 38) или же требуются дополнительные аппаратные прибамбасы, чтобы поиметь MODE2 в машине с КР580.
Чтобы заставить игру РК86 работать на Специалисте делаем следующее. В области F800...F8FF должно быть открыто ОЗУ, т.е однозначно необходим Специалист с ОЗУ на 565 РУ5. Это позволяет в адресах F803, F809, F812, F818... поставить JMP-ы на процедуры имитирующие вывод символов в экранное ОЗУ РК86 и опрос РК-клавиш. К игре автоматически (т.е простенькой программкой) подключается особый стартёр, который перед запуском и в ходе игры делает следующее.
Сначала он копирует в ту область ОЗУ, которая отсутствует в РК86 (т.е куда-то выше 8000), модуль визуализации (это всего несколько сот байтов) и модуль имитации ПЗУ F800, а также соответствующе настраивает и включает аппаратные прерывания от кадрового бланка (это обычно 50 ГЦ). А затем запускает игру от РК86 в оригинале. Прерывания используются для счёта реального времени, что позволяет примерно 3-4 раза в секунду вызывать процедуру визуализации при которой копия экрана РК86 выводится на экран Специалиста.
Т.о игра работает, реагируя на клавиши (т.к они опрашиваются вызовом входов F803, F812 и F81B), а видимость изображения обеспечивается визуализацией на прерываниях. Запаса скорости Специалиста в турбированном по простому и надёжному варианту Турбо-142% (т.е с реальным тактом 2.25*1.42= ~3.2 МГЦ) с запасом хватит на простой вариант визуализации.
Если же Специалист никак не турбирован, то при 2-х МГЦ потребуется ускорять визуализацию и/или понижать значение FPS (frame pro secundo). Т.к максимальный тормоз вносит именно вывод символа в экран Специалиста, то нет смысла это делать для всех 64*31 символов текстового экрана Специалиста в каждой процедуре визуализации. Это необходимо делать только для тех символов, что изменились со времени последней визуализации. Для этого в ОЗУ организуется чисто текстовая копия экрана Специалиста размером в 64*31= 1984 байта. Программа визуализации сравнивает эту копию экрана Специалиста с экранным ОЗУ РК86, и если обнаружится несравнение, то соответствующий символ выводится в нужном месте в физический экран Специалиста.
Но не всё так радужно. А именно, автоматически, т.е просто (подключением к оригиналу игры дополнительного модуля визуализации) можно адаптировать только те игры, что не меняют режим ВГ75. Т.е если в игре стандартный режим текстового драйвера из ПЗУ, т.е формат экрана 64*25. Таких игр, вероятно половина.
Но более качественные игры используют псевдографику (т.е 16 граф.символов с кодами менее $20), а чтобы картинка выводилась без вертикальных разрывов, режим ВГ75 перепрограммируют так, чтобы было не 25 видимых строк, а 30 (иногда выводят и на 31-ю строку). Естественно, экранное ОЗУ при этом существенно разбухает и чтобы оно не затирало рабочие ячейки ПЗУ, экранный буфер программно переносят ниже 7600.
Специалист без проблем позволяет отобразить экран 64*32 (размер знакоместа 6*8 ), но т.к для разных псевдографических игр этот экран расположен в разных местах, потребуется индивидуальная настройка блока визуализации под конкретную игру. Это немного неприятно, т.к потребуется дизассемблировать и разобраться в коде каждой такой игры. Утешает лишь то, что не требуется получать полноценный исходник (т.е такой, что правильно транслируется при смене адреса трансляции), достаточно просто вида программы в мнемоническом ассемблерном представлении, чтобы узнать адреса нового экрана формата 64*30.
Можно в качестве источника кодов брать игры не от РК86, а от Микроши, т.к для него игр значительно больше (в Микроше экран такой же, лишь подпрограммы ПЗУ и клавиатура отличаются). А вот от развитых РК-клонов ничего на прерываниях не адаптировать, т.к у них ОЗУ намного больше, чем у Специалиста, и экран в неудачном месте. Как только разберусь с железом попробую так адаптировать несколько РК-игр, чьи исходники имею (в частности, КРОК, МАРС, пэкманы, ксониксы), которые не меняют режим ВГ75.
А вот с играми от РК86 всё оказалось сложнее (для Микро-80 игр очень мало). Те из РК-игр, что не лезут в экранное ОЗУ и не читают матрицу клавиш через ППА $8000 адаптировать оказалось также не очень сложно. Так Специалист поимел, например, Пэкмана, шахматы и др. Но в общем-то число адаптированных игр оказалось намного меньше, чем можно было ожидать.
Причина этого в том, что большинство игр РК86 нагло лезут в экранное ОЗУ 76D0...7FF4. Многие из таких программ успешно работают на Специалисте, т.е, - имеется реакция на клавиши, но на экране почти ничего не видно (лишь рамка и счёт игры). Чтобы такую программу переделать, её достаточно полноценно дизассемблировать и все команды КР580, что пишут в экранную область, надо дополнить подпрограммой, что дублирует это дело в экране Специалиста. Тогда игра будет играться на Специалисте, причём с учётом перевеса по скорости CPU даже быстрее, чем на самОм РК86.
В 90-тые годы, когда я писал эмуляторы РК86 (для PC 386 или ОРИОНА) мне в научных целях пришлось дизассемблировать около 20 РК-игр. Я обнаружил, что почти все РК-игры (~95%) нагло лезут в экранное ОЗУ 76D0...7FF4. Но процентов 70...80% игр клавиатуру опрашивают стандартными подпрограммами ПЗУ F800. Хотя и среди таких более-менее корректных игр встречаются игры от "врагов народа", - это игры в которых автор сдуру, несмотря на предупреждения авторов РК, что это делать ни в коем случае нельзя, нагло лезет к процедурам внутри ПЗУ F800 (что навсегда лишает возможности улучшать ПЗУ).
И лишь остальные 20-30% игр отличаются повышенной изощрённостью (т.е привязкой к конкретному железу) и создают дополнительные проблемы при их конверсии на Специалист. Помимо обычного прямого доступа в экран РК такие программы ещё более жёстко привязаны к железу. Таких изощрённых игр есть тоже два вида. Один, вполне приличный, заключается в том, что игра сама через ППА по адресу $8000 сканирует матрицу клавиатуры. Обычно это сделано в качественно написанных играх, т.к если надо опрашивать лишь несколько клавиш, то собственный опрос работает быстрее, чем стандартная подпрограмма F81B из ПЗУ РК86. Также прямой доступ к клавиатуре через ППА необходим для определения сразу двух нажатых клавиш.
Но вот второй вариант таких сложных для адаптации игр применяют лишь явные враги народа, которые извращаются издеваясь над системным ПО РК86. Эти нехорошие люди управляют драйвером вывода химическими методами, хотя почти всё то же самое можно делать стандартными подпрограммами. Они подставляют в служебные ячейки ROM-BIOS свои, причём часто недопустимые числа, что вызывает изменение поведения драйвера вывода символов в ПЗУ.
Чтобы адаптировать такие наглые игры недостаточно имитировать работу входов в стандартные подпрограммы ПЗУ, требуется прогонять код именно самого ПЗУ РК86 (который в Специалисте по адресу F800, или где либо ещё, вообще отсутствует как класс). Естественно, и такая проблема при конверсии решается, но путём дополнительных усилий программиста (в ОЗУ приходится иметь копию ПЗУ F800). В общем для обоих типов таких программ требуется дополнительный индивидуальный труд адаптатора.
Итак, если около 70% РК-игр не работают на Специалисте лишь из-за расположения его экрана не в том месте, то в голову сразу же приходит вариант их визуализации на прерываниях. Прерывания ставятся как при Z80, так и при КР580. Хотя Z80 имеет MODE2 для прерываний, что позволяет обработчик прерываний иметь в любом месте ОЗУ, а при КР580 (без ВН59) обработчик прерываний всегда должен стартовать на одном из RST-входов (традиционно используют RST 38) или же требуются дополнительные аппаратные прибамбасы, чтобы поиметь MODE2 в машине с КР580.
Чтобы заставить игру РК86 работать на Специалисте делаем следующее. В области F800...F8FF должно быть открыто ОЗУ, т.е однозначно необходим Специалист с ОЗУ на 565 РУ5. Это позволяет в адресах F803, F809, F812, F818... поставить JMP-ы на процедуры имитирующие вывод символов в экранное ОЗУ РК86 и опрос РК-клавиш. К игре автоматически (т.е простенькой программкой) подключается особый стартёр, который перед запуском и в ходе игры делает следующее.
Сначала он копирует в ту область ОЗУ, которая отсутствует в РК86 (т.е куда-то выше 8000), модуль визуализации (это всего несколько сот байтов) и модуль имитации ПЗУ F800, а также соответствующе настраивает и включает аппаратные прерывания от кадрового бланка (это обычно 50 ГЦ). А затем запускает игру от РК86 в оригинале. Прерывания используются для счёта реального времени, что позволяет примерно 3-4 раза в секунду вызывать процедуру визуализации при которой копия экрана РК86 выводится на экран Специалиста.
Т.о игра работает, реагируя на клавиши (т.к они опрашиваются вызовом входов F803, F812 и F81B), а видимость изображения обеспечивается визуализацией на прерываниях. Запаса скорости Специалиста в турбированном по простому и надёжному варианту Турбо-142% (т.е с реальным тактом 2.25*1.42= ~3.2 МГЦ) с запасом хватит на простой вариант визуализации.
Если же Специалист никак не турбирован, то при 2-х МГЦ потребуется ускорять визуализацию и/или понижать значение FPS (frame pro secundo). Т.к максимальный тормоз вносит именно вывод символа в экран Специалиста, то нет смысла это делать для всех 64*31 символов текстового экрана Специалиста в каждой процедуре визуализации. Это необходимо делать только для тех символов, что изменились со времени последней визуализации. Для этого в ОЗУ организуется чисто текстовая копия экрана Специалиста размером в 64*31= 1984 байта. Программа визуализации сравнивает эту копию экрана Специалиста с экранным ОЗУ РК86, и если обнаружится несравнение, то соответствующий символ выводится в нужном месте в физический экран Специалиста.
Но не всё так радужно. А именно, автоматически, т.е просто (подключением к оригиналу игры дополнительного модуля визуализации) можно адаптировать только те игры, что не меняют режим ВГ75. Т.е если в игре стандартный режим текстового драйвера из ПЗУ, т.е формат экрана 64*25. Таких игр, вероятно половина.
Но более качественные игры используют псевдографику (т.е 16 граф.символов с кодами менее $20), а чтобы картинка выводилась без вертикальных разрывов, режим ВГ75 перепрограммируют так, чтобы было не 25 видимых строк, а 30 (иногда выводят и на 31-ю строку). Естественно, экранное ОЗУ при этом существенно разбухает и чтобы оно не затирало рабочие ячейки ПЗУ, экранный буфер программно переносят ниже 7600.
Специалист без проблем позволяет отобразить экран 64*32 (размер знакоместа 6*8 ), но т.к для разных псевдографических игр этот экран расположен в разных местах, потребуется индивидуальная настройка блока визуализации под конкретную игру. Это немного неприятно, т.к потребуется дизассемблировать и разобраться в коде каждой такой игры. Утешает лишь то, что не требуется получать полноценный исходник (т.е такой, что правильно транслируется при смене адреса трансляции), достаточно просто вида программы в мнемоническом ассемблерном представлении, чтобы узнать адреса нового экрана формата 64*30.
Можно в качестве источника кодов брать игры не от РК86, а от Микроши, т.к для него игр значительно больше (в Микроше экран такой же, лишь подпрограммы ПЗУ и клавиатура отличаются). А вот от развитых РК-клонов ничего на прерываниях не адаптировать, т.к у них ОЗУ намного больше, чем у Специалиста, и экран в неудачном месте. Как только разберусь с железом попробую так адаптировать несколько РК-игр, чьи исходники имею (в частности, КРОК, МАРС, пэкманы, ксониксы), которые не меняют режим ВГ75.
barsik- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия, СПб
Меандр или апп.прерывания ?
2
Для использования на Специалисте игр от РК86 не обязательно иметь процессор Z80 и даже не обязательно иметь апп.прерывания. Некоторые игры и уж тем более системные программы РК86 можно прогонять в оригинале (или при минимальной модификации). Но совсем без апп.доработок не обойтись. Хотя никаких особо тяжких вторжений на основную плату Специалиста не требуется. Процессор Z80 предпочтительнее из-за того, что он легко турбируется в 1.42 или 2.0 раза (т.е с WAIT или без WAIT) и с процессором Z80 процедуру визуализации ускоряет наличие у него команд для сравнения двух блоков.
Чтобы РК-игры работали на Специалисте нужно всего две вещи. Первое, это чтобы при вызовах по адресам F803, F806, F809... происходили те же события и прогонялся тот же код, что и в оригинальном РК86, т.е чтобы срабатывали подпрограммы опроса клавиш и вывода на экран. И, как упомянуто в предыдущем посте, достаточно каким-то образом, как минимум, 3-4 раза в секунду вылетать в процедуру визуализации.
Естественно, для таких задач принято применять аппаратные прерывания. Однако не каждый сразу захочет добавлять в свой Специалист две дополнительные микросхемы вторым этажом (не считая дешифратора 555 ИД7 для области F800...FFFF) не убедившись предварительно, что прерывания это стОящее дело, обеспечивающее не только возможность считать время, но и добавляющее нескольких десятков игр от РК86 из 1986-1988 годов. Кстати, Специалист, в отличие от ОРИОНА позволяет добавить прерывания. Т.к в программах Специалиста не встречаются команды EI/DI, а в ОРИОНЕ на КР580 прерывания вообще невозможны, т.к были сдуру истрачены под звук.
Обе эти проблемы (входов F8xx и визуализации) не идеально, но решаются за счёт страничного ПЗУ Специалиста и двух диодов. Два диода и резистор, естественно, нужны, чтобы обеспечить чтение участка ПЗУ C800 в области F800...F8FF. Диоды и страничность ПЗУ были бы не нужны, если бы была возможность иметь ПЗУ в области F800, но и наличие просто JMP-ов на адресах F803, F806, F809... позволяет перехватывать эти вызовы и иметь для них произвольный исполнительный код. А страничное ПЗУ (хотя бы 2 страницы) нужно потому, что в обычном ПЗУ Специалиста при вызове п/п-мм C803, C806, C809... исполняются вовсе не оригинальные подпрограммы РК86, а что-то похожее (потому включение стандартного куска из C8xx на F8xx не поможет). Нужна именно страничность ПЗУ. Изобилие ПЗУ C000...F7FF (14 кб) тут также не поможет, т.к надо обеспечить, чтобы по входам F8xx прогонялся код из ПЗУ РК86, хотя где именно он располагается не важно.
А во второй странице ПЗУ мы как раз можем иметь любой код в адресах C800...C8FF. В том числе мы можем разместить во второй странице ПЗУ весь код из ПЗУ РК86. Главное, что входы F803, F806, F809... оказываются там же, исполнительная часть этих подпрограмм может располагаться в ПЗУ Специалиста с любого адреса (но во второй странице ПЗУ). Или при необходимости - в ОЗУ выше 8000. По п/п-мме вывода на экран F809 и по использованию раб.ячеек код должен быть идентичным РК-шному, а вот по опросу клавиш - другой, т.к в Специалисте матрица клавиш другая.
Тогда, например, по вызову п/п-ммы F809 символ из регистра C будет помещён в экранное ОЗУ РК86. Но это не приведёт к видимости этого символа на экране Специалиста (удачно, что область 76D0...7FF4 не попадает в экран Специалиста). Чтобы картинка в игре РК86 стала видимой надо выполнить процедуру визуализации и затем постоянно повторять её, как минимум, несколько раз в секунду. Сама процедура визуализации крошечная (150 байт), проблема лишь в том, как узнать момент когда надо прогонять процедуру визуализации и как из прикладных программ несколько раз в секунду вылетать на эту процедуру визуализации в машине не имеющей апп.прерываний.
Т.к все игры (те которые сами не лезут в матрицу клавиш) до нескольких тысяч раз в секунду вызывают или подпрограмму F81B или подпрограмму F812, то в принципе, считая число вызовов этих подпрограмм можно, например, по каждому 500-тому вызову F81B, делать визуализацию. Проблема в том, что в одной игре за секунду происходит всего 40-50 вызовов F81B, а в другой игре 1000 вызовов F81B в секунду и периодичность этих вызовов колеблется по ходу игры. Потому на таком принципе не получить равномерный темп игры.
Единственный выход - аппаратно-программная эмуляция прерываний. Т.е всё-равно нужна аппаратная опора, позволяющая организовать программно независимый счёт времени, - нужно поиметь простейший аппаратный таймер. Для этого на единственный имеющийся в Специалисте вход, а именно, - вход магнитофона заводим меандр с частотой 3...10 Герц. А подпрограмму F81B дополняем процедурой, которая определяет фронт 0-1 на входе магнитофона. Т.к п/п-мму F81B используют и п/п-ммы F812 и F803 и F809, то получается, что меандр на входе МГ контроллируется непрерывно. За исключением нескольких игр, нет программ которые не вызывали бы F81B сотни и даже тысячи раз в секунду.
Таким образом для визуализации достаточно на вход магнитофона подключить генератор на 1533 ЛН1, выдающий НЧ-меандр частотой 3-10 Герц. Для этого не требуется особо курочить печ.плату - достаточно лишь отключить выход операционника. А если операционник грамотно установлен на панельке (как у меня), то достаточно просто выковырять этот КР140УД6 (или 140УД608) из панельки. Кстати у меня вместо КР140УД6 прекрасно работает совпадающий и по параметрам и по цоколёвке популярный импортный операционник 741. Если паять НЧ-генератор 5 Гц на неохота, подходящую частоту удобно получить с помощью 155 ИЕ2 подав на её вход КСИ с частотой 50 Герц. Хотя отдельный генератор позволяет регулировку переменным резистором, что плавно меняет темп игры, но для единообразия разумно всё-же иметь строго фиксированную частоту меандра.
Потеря процессорного времени на опрос порта в п/п-мме F81B невелика (~0.5%) потому это равноценно апп.прерываниям, но по сложности доработки проще и практически без вторжений на основной плате. Ещё раз напомню, что так, т.е по прерываниям (или по их аппаратно-программной или программной эмуляции) можно прогонять без переделок только РК-программы выводящие на стандартный экран 76D0...7FF4 (т.е программы для режима в 25 строк) и опрашивающие клавиатуру без прямого залезания в какой-то порт по адресу $8000.
Псевдографические игры у которых режим ВГ75 изменён, чтобы получить видео режим в 30 видимых строк и отчего экранный буфер в нестандартном месте, требуют для визуализации совсем другой процедуры и она будет индивидуальной для каждой игры. Но даже такие игры адаптировать на прерываниях на два-три порядка проще, чем их конвертировать для Специалиста традиционным спрособом (по сути надо лишь пошариться отладчиком в коде игры, чтобы найти где именно размещается экран и подставить нужные параметры в блок визуализации).
Низкочастотный меандр на МГ-входе (что реализует простейший апп.таймер) получить нетрудно. Такой простейший апп.таймер ещё очень полезен для генерации многоголосной музыки. Использование апп.таймера вместо прерываний выгоднее, чем апп.прерывания когда игра располагается с адреса 0 (т.е при загрузке затирает адрес $0038, что не позволяет использовать апп.прерывания без модификации кода самой РК-игры). Естественно, ради единообразия для создания меандра разумно применить недорогой счётчик 155 ИЕ2, который делит частоту кадрового бланка на 10. Т.к частота кадров в Специалисте 50 Гц, то это даёт нам период меандра в 200 МСЕК, а т.к у меандра два фронта, это позволяет нам точно отмерять временные интервалы в 100 МСЕК.
Чтобы РК-игры работали на Специалисте нужно всего две вещи. Первое, это чтобы при вызовах по адресам F803, F806, F809... происходили те же события и прогонялся тот же код, что и в оригинальном РК86, т.е чтобы срабатывали подпрограммы опроса клавиш и вывода на экран. И, как упомянуто в предыдущем посте, достаточно каким-то образом, как минимум, 3-4 раза в секунду вылетать в процедуру визуализации.
Естественно, для таких задач принято применять аппаратные прерывания. Однако не каждый сразу захочет добавлять в свой Специалист две дополнительные микросхемы вторым этажом (не считая дешифратора 555 ИД7 для области F800...FFFF) не убедившись предварительно, что прерывания это стОящее дело, обеспечивающее не только возможность считать время, но и добавляющее нескольких десятков игр от РК86 из 1986-1988 годов. Кстати, Специалист, в отличие от ОРИОНА позволяет добавить прерывания. Т.к в программах Специалиста не встречаются команды EI/DI, а в ОРИОНЕ на КР580 прерывания вообще невозможны, т.к были сдуру истрачены под звук.
Обе эти проблемы (входов F8xx и визуализации) не идеально, но решаются за счёт страничного ПЗУ Специалиста и двух диодов. Два диода и резистор, естественно, нужны, чтобы обеспечить чтение участка ПЗУ C800 в области F800...F8FF. Диоды и страничность ПЗУ были бы не нужны, если бы была возможность иметь ПЗУ в области F800, но и наличие просто JMP-ов на адресах F803, F806, F809... позволяет перехватывать эти вызовы и иметь для них произвольный исполнительный код. А страничное ПЗУ (хотя бы 2 страницы) нужно потому, что в обычном ПЗУ Специалиста при вызове п/п-мм C803, C806, C809... исполняются вовсе не оригинальные подпрограммы РК86, а что-то похожее (потому включение стандартного куска из C8xx на F8xx не поможет). Нужна именно страничность ПЗУ. Изобилие ПЗУ C000...F7FF (14 кб) тут также не поможет, т.к надо обеспечить, чтобы по входам F8xx прогонялся код из ПЗУ РК86, хотя где именно он располагается не важно.
А во второй странице ПЗУ мы как раз можем иметь любой код в адресах C800...C8FF. В том числе мы можем разместить во второй странице ПЗУ весь код из ПЗУ РК86. Главное, что входы F803, F806, F809... оказываются там же, исполнительная часть этих подпрограмм может располагаться в ПЗУ Специалиста с любого адреса (но во второй странице ПЗУ). Или при необходимости - в ОЗУ выше 8000. По п/п-мме вывода на экран F809 и по использованию раб.ячеек код должен быть идентичным РК-шному, а вот по опросу клавиш - другой, т.к в Специалисте матрица клавиш другая.
Тогда, например, по вызову п/п-ммы F809 символ из регистра C будет помещён в экранное ОЗУ РК86. Но это не приведёт к видимости этого символа на экране Специалиста (удачно, что область 76D0...7FF4 не попадает в экран Специалиста). Чтобы картинка в игре РК86 стала видимой надо выполнить процедуру визуализации и затем постоянно повторять её, как минимум, несколько раз в секунду. Сама процедура визуализации крошечная (150 байт), проблема лишь в том, как узнать момент когда надо прогонять процедуру визуализации и как из прикладных программ несколько раз в секунду вылетать на эту процедуру визуализации в машине не имеющей апп.прерываний.
Т.к все игры (те которые сами не лезут в матрицу клавиш) до нескольких тысяч раз в секунду вызывают или подпрограмму F81B или подпрограмму F812, то в принципе, считая число вызовов этих подпрограмм можно, например, по каждому 500-тому вызову F81B, делать визуализацию. Проблема в том, что в одной игре за секунду происходит всего 40-50 вызовов F81B, а в другой игре 1000 вызовов F81B в секунду и периодичность этих вызовов колеблется по ходу игры. Потому на таком принципе не получить равномерный темп игры.
Единственный выход - аппаратно-программная эмуляция прерываний. Т.е всё-равно нужна аппаратная опора, позволяющая организовать программно независимый счёт времени, - нужно поиметь простейший аппаратный таймер. Для этого на единственный имеющийся в Специалисте вход, а именно, - вход магнитофона заводим меандр с частотой 3...10 Герц. А подпрограмму F81B дополняем процедурой, которая определяет фронт 0-1 на входе магнитофона. Т.к п/п-мму F81B используют и п/п-ммы F812 и F803 и F809, то получается, что меандр на входе МГ контроллируется непрерывно. За исключением нескольких игр, нет программ которые не вызывали бы F81B сотни и даже тысячи раз в секунду.
Таким образом для визуализации достаточно на вход магнитофона подключить генератор на 1533 ЛН1, выдающий НЧ-меандр частотой 3-10 Герц. Для этого не требуется особо курочить печ.плату - достаточно лишь отключить выход операционника. А если операционник грамотно установлен на панельке (как у меня), то достаточно просто выковырять этот КР140УД6 (или 140УД608) из панельки. Кстати у меня вместо КР140УД6 прекрасно работает совпадающий и по параметрам и по цоколёвке популярный импортный операционник 741. Если паять НЧ-генератор 5 Гц на неохота, подходящую частоту удобно получить с помощью 155 ИЕ2 подав на её вход КСИ с частотой 50 Герц. Хотя отдельный генератор позволяет регулировку переменным резистором, что плавно меняет темп игры, но для единообразия разумно всё-же иметь строго фиксированную частоту меандра.
Потеря процессорного времени на опрос порта в п/п-мме F81B невелика (~0.5%) потому это равноценно апп.прерываниям, но по сложности доработки проще и практически без вторжений на основной плате. Ещё раз напомню, что так, т.е по прерываниям (или по их аппаратно-программной или программной эмуляции) можно прогонять без переделок только РК-программы выводящие на стандартный экран 76D0...7FF4 (т.е программы для режима в 25 строк) и опрашивающие клавиатуру без прямого залезания в какой-то порт по адресу $8000.
Псевдографические игры у которых режим ВГ75 изменён, чтобы получить видео режим в 30 видимых строк и отчего экранный буфер в нестандартном месте, требуют для визуализации совсем другой процедуры и она будет индивидуальной для каждой игры. Но даже такие игры адаптировать на прерываниях на два-три порядка проще, чем их конвертировать для Специалиста традиционным спрособом (по сути надо лишь пошариться отладчиком в коде игры, чтобы найти где именно размещается экран и подставить нужные параметры в блок визуализации).
Низкочастотный меандр на МГ-входе (что реализует простейший апп.таймер) получить нетрудно. Такой простейший апп.таймер ещё очень полезен для генерации многоголосной музыки. Использование апп.таймера вместо прерываний выгоднее, чем апп.прерывания когда игра располагается с адреса 0 (т.е при загрузке затирает адрес $0038, что не позволяет использовать апп.прерывания без модификации кода самой РК-игры). Естественно, ради единообразия для создания меандра разумно применить недорогой счётчик 155 ИЕ2, который делит частоту кадрового бланка на 10. Т.к частота кадров в Специалисте 50 Гц, то это даёт нам период меандра в 200 МСЕК, а т.к у меандра два фронта, это позволяет нам точно отмерять временные интервалы в 100 МСЕК.
barsik- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия, СПб
.
3
После прочтения предыдущего поста каждому обладающему минимальными техническими знаниями (полученными хотя бы путём прочтения статей в ж.Радио за 80-тые годы XX-века о работе микросхем 155-той и 555-той серий), стало совершенно ясно, что если бы эмуляторы Специалиста поддерживали меандр на МГ-входе, то любой начинающий программист любитель, уже успешно изучивший работу большинства команд микропроцессора КР580, мог бы сразу же и всего за несколько дней даже не напрягаясь конвертировать большинство игр РК86 для Специалиста.
При этом (т.е при наличии прерываний или апп.таймера) часть РК-игр (тех, что не лезут в ППА и не меняют режим ВГ75) вообще бы не пришлось изменять. Аппаратные доработки Специалиста в минимуме сводятся к введению любым способом ПЗУ в участке F800...F8FF и подаче меандра на МГ-вход. Программу визуализации конечно удобнее тоже прошить в ПЗУ (всё-равно для эмуляции в базовом ПЗУ Специалиста требуется доработать п/п-мму C81B), но можно её грузить и в отсутствующий в РК86 участок ОЗУ 8000...8FFF.
Потому меня сейчас периодически тянет заняться изготовлением своего эмулятора Специалиста. Это несложно, т.к у меня есть исходник эмулятора ОРИОНА и по сути надо лишь искурочить исходник, чтобы убрать банковость, перенести экран на другое место, убрать (или изменить) цвет и главная сложность, переделать эмуляцию клавиатуры с РК-шной на специалистовскую. Это труд всего часов на 10, вероятно этим займусь, как появится достаточно энергии на это. Действительно надо ~10 часов, без учёта закона Мерфи (Закон Мерфи: Если вы думаете, что всё будет легко - умножьте предполагаемые трудности на два. А потом ещё на два. Теперь вы получили близкую к реальности картину.).
Разумеется игры РК86 не настолько играбельны, чтобы мечтать поиметь их на Специалисте и ради этого внедрять аппаратно-программную эмуляцию (хотя конечно, чем больше программ, даже плохих, - тем платформа ретро компьютера мощнее). Важнее, что аппаратно-программная эмуляция годится не только для РК86, есть до десятка других ретро-компьютеров, программы которых можно попытаться эмулировать на прерываниях. Тут уже конечно без замены КР580 на Z80 и апп.прерываний и говорить не о чем.
Недавно я озадачился вопросом о наличии игр для ZX-Spectrum с ОЗУ 16 кб (столько ОЗУ этот игровой компьютер имел в начальные годы своего существования). Есть архивы содержащие аж по 15.000 ZX-игр, но больше распространены архивные сборники содержащие всего по ~5 тысяч ZX-программ. Оказалось, что сохранилось несколько сотен высоко-играбельных ZX-игр пригодных для использования на ZX-Spectrum с ОЗУ 16 кб и скачать их (в разных форматах) не проблема.
Сейчас удачно, что имеющиеся эмуляторы для ZX-16K позволяют не трахаться с вводом ZX-программ с МГ-ленты (что сильно утомляло в 1995 году при эмуляции ZX-игр на ОРИОНЕ), а позволяют сохранить слепок всей памяти в 16 кб в виде одного файла. Достаточно потом загрузить этот файл в Специалист и запустить ZX-игру в режиме эмуляции ZX-Spectrum.
А для эмуляции ZX-Spectrum с ОЗУ 16 кб (по крайней мере в монохроме), архитектуры и объёма памяти Специалиста на Z80 хватает. Хотя требуются и несложные аппаратные доработки и внешние прибамбасы. Требуется добавить порт клавиатуры и (при желании и) порт джойстика по схеме ZX-Spectrum. А также нужна внешняя клавиатура с матрицей кнопок 5*8 (или её эмулятор на PS/2 клавиатуре на Atmega, таких конструкций много) и (при желании ещё и) контактный джойстик. Кстати, если впоследствии потребуется добавить возможность использовать игры на 48К, то архитектуру Специалиста придётся усовершенствовать возможностью закрыть участок адресов 8000...FFFF дополнительным статическим ОЗУ 62256.
Т.о, в том что касается монохромной графики доработки минимальны, а вот с цветом хуже. Хотя как раз цвет Специалиста с его автозаписью очень подходит для эмуляции ZX, он почти вдвое ускоряет визуализацию по сравнению с ОРИОНОМ, т.к цвет в ZX знакоместный. Увы, сам цвет не соответствует. Потому для цвета надо переделать платку цвета Специалиста (как описано здесь).
- - - Добавлено - - -
Как было выше упомянуто, качественно написанные РК-игры часто опрашивают клавиатуру сами. Для этого они записывают 0 по нужной линии матрицы в порт А по адресу 8000 и затем считывают результат опроса из порта B по адресу 8001. К сожалению, клавиатура в Специалисте совсем другая и к тому же ППА для неё установлен по адресу FF00, а не 8000. При этом даже совмещение адреса 8000 и FF00 не поможет. Т.о такие игры без переделок их кода или существенных доработок в схеме Специалиста не удастся эмулировать на простейшем аппаратно-программном эмуляторе.
Если не хочется ковырять такие РК-игры и переделывать в них работу с клавиатурой на F81B, то можно попробовать обслуживать РК-клавиатуру на прерываниях. Т.к на адресе 8000 в Специалисте находится ячейка ОЗУ, то байт записанный туда можно после считать. Если каким-то образом вылетать на прерывание по команде чтения из порта 8001, то работу матричной РК-клавиатуры РК можно имитировать, эмулируя нажатия на клавиатуре Специалиста в виде байта возвращаемого по чтению из адреса 8001.
Для этого, как только процессор выполнил команду чтения из адреса 8001 (или 8xx1, 8xx5, 8xx9... т.е в дешифрации обязаны участвовать лишь адреса А0 и А1, потому ловушка на адрес 8001 проста), то взводится триггер запроса прерывания, что приводит сразу после команды чтения порта к апп.прерыванию (в MODE2, чтобы обработчик не конфликтовал с кодом РК-игры). В процедуре обслуживания этого апп.прерывания процессор, считав байт из ячейки 8000, узнаёт какую линию РК-матрицы сейчас считывает процессор и в соответствии с состоянием клавиатуры Специалиста возвращает в аккумуляторе соответствующий байт. Запаса скорости Специалиста на такое обслуживание с большим запасом хватает.
Естественно, при этом прерывания INT должны быть свободны, т.е ещё не заняты на визуализацию. Визуализация д.быть за счёт имитации прерываний с помощью простейшего аппаратного таймера с периодом 100 или 200 МСЕК и для отлова обращений на 8001 нужна доп.схема ловушки. Прерывание можно было бы сделать и по NMI, но NMI не имеет MODE2 и его обработчик прерываний в Zero-Page может затираться игрой. А вот INT позволяет MODE2. Обработчик прерываний может быть в ОЗУ или ПЗУ выше адреса 8000 (там где у РК нет ни ОЗУ ни ПЗУ и куда пРК-программы не лезут).
При этом (т.е при наличии прерываний или апп.таймера) часть РК-игр (тех, что не лезут в ППА и не меняют режим ВГ75) вообще бы не пришлось изменять. Аппаратные доработки Специалиста в минимуме сводятся к введению любым способом ПЗУ в участке F800...F8FF и подаче меандра на МГ-вход. Программу визуализации конечно удобнее тоже прошить в ПЗУ (всё-равно для эмуляции в базовом ПЗУ Специалиста требуется доработать п/п-мму C81B), но можно её грузить и в отсутствующий в РК86 участок ОЗУ 8000...8FFF.
Потому меня сейчас периодически тянет заняться изготовлением своего эмулятора Специалиста. Это несложно, т.к у меня есть исходник эмулятора ОРИОНА и по сути надо лишь искурочить исходник, чтобы убрать банковость, перенести экран на другое место, убрать (или изменить) цвет и главная сложность, переделать эмуляцию клавиатуры с РК-шной на специалистовскую. Это труд всего часов на 10, вероятно этим займусь, как появится достаточно энергии на это. Действительно надо ~10 часов, без учёта закона Мерфи (Закон Мерфи: Если вы думаете, что всё будет легко - умножьте предполагаемые трудности на два. А потом ещё на два. Теперь вы получили близкую к реальности картину.).
Разумеется игры РК86 не настолько играбельны, чтобы мечтать поиметь их на Специалисте и ради этого внедрять аппаратно-программную эмуляцию (хотя конечно, чем больше программ, даже плохих, - тем платформа ретро компьютера мощнее). Важнее, что аппаратно-программная эмуляция годится не только для РК86, есть до десятка других ретро-компьютеров, программы которых можно попытаться эмулировать на прерываниях. Тут уже конечно без замены КР580 на Z80 и апп.прерываний и говорить не о чем.
Недавно я озадачился вопросом о наличии игр для ZX-Spectrum с ОЗУ 16 кб (столько ОЗУ этот игровой компьютер имел в начальные годы своего существования). Есть архивы содержащие аж по 15.000 ZX-игр, но больше распространены архивные сборники содержащие всего по ~5 тысяч ZX-программ. Оказалось, что сохранилось несколько сотен высоко-играбельных ZX-игр пригодных для использования на ZX-Spectrum с ОЗУ 16 кб и скачать их (в разных форматах) не проблема.
Сейчас удачно, что имеющиеся эмуляторы для ZX-16K позволяют не трахаться с вводом ZX-программ с МГ-ленты (что сильно утомляло в 1995 году при эмуляции ZX-игр на ОРИОНЕ), а позволяют сохранить слепок всей памяти в 16 кб в виде одного файла. Достаточно потом загрузить этот файл в Специалист и запустить ZX-игру в режиме эмуляции ZX-Spectrum.
А для эмуляции ZX-Spectrum с ОЗУ 16 кб (по крайней мере в монохроме), архитектуры и объёма памяти Специалиста на Z80 хватает. Хотя требуются и несложные аппаратные доработки и внешние прибамбасы. Требуется добавить порт клавиатуры и (при желании и) порт джойстика по схеме ZX-Spectrum. А также нужна внешняя клавиатура с матрицей кнопок 5*8 (или её эмулятор на PS/2 клавиатуре на Atmega, таких конструкций много) и (при желании ещё и) контактный джойстик. Кстати, если впоследствии потребуется добавить возможность использовать игры на 48К, то архитектуру Специалиста придётся усовершенствовать возможностью закрыть участок адресов 8000...FFFF дополнительным статическим ОЗУ 62256.
Т.о, в том что касается монохромной графики доработки минимальны, а вот с цветом хуже. Хотя как раз цвет Специалиста с его автозаписью очень подходит для эмуляции ZX, он почти вдвое ускоряет визуализацию по сравнению с ОРИОНОМ, т.к цвет в ZX знакоместный. Увы, сам цвет не соответствует. Потому для цвета надо переделать платку цвета Специалиста (как описано здесь).
- - - Добавлено - - -
Как было выше упомянуто, качественно написанные РК-игры часто опрашивают клавиатуру сами. Для этого они записывают 0 по нужной линии матрицы в порт А по адресу 8000 и затем считывают результат опроса из порта B по адресу 8001. К сожалению, клавиатура в Специалисте совсем другая и к тому же ППА для неё установлен по адресу FF00, а не 8000. При этом даже совмещение адреса 8000 и FF00 не поможет. Т.о такие игры без переделок их кода или существенных доработок в схеме Специалиста не удастся эмулировать на простейшем аппаратно-программном эмуляторе.
Если не хочется ковырять такие РК-игры и переделывать в них работу с клавиатурой на F81B, то можно попробовать обслуживать РК-клавиатуру на прерываниях. Т.к на адресе 8000 в Специалисте находится ячейка ОЗУ, то байт записанный туда можно после считать. Если каким-то образом вылетать на прерывание по команде чтения из порта 8001, то работу матричной РК-клавиатуры РК можно имитировать, эмулируя нажатия на клавиатуре Специалиста в виде байта возвращаемого по чтению из адреса 8001.
Для этого, как только процессор выполнил команду чтения из адреса 8001 (или 8xx1, 8xx5, 8xx9... т.е в дешифрации обязаны участвовать лишь адреса А0 и А1, потому ловушка на адрес 8001 проста), то взводится триггер запроса прерывания, что приводит сразу после команды чтения порта к апп.прерыванию (в MODE2, чтобы обработчик не конфликтовал с кодом РК-игры). В процедуре обслуживания этого апп.прерывания процессор, считав байт из ячейки 8000, узнаёт какую линию РК-матрицы сейчас считывает процессор и в соответствии с состоянием клавиатуры Специалиста возвращает в аккумуляторе соответствующий байт. Запаса скорости Специалиста на такое обслуживание с большим запасом хватает.
Естественно, при этом прерывания INT должны быть свободны, т.е ещё не заняты на визуализацию. Визуализация д.быть за счёт имитации прерываний с помощью простейшего аппаратного таймера с периодом 100 или 200 МСЕК и для отлова обращений на 8001 нужна доп.схема ловушки. Прерывание можно было бы сделать и по NMI, но NMI не имеет MODE2 и его обработчик прерываний в Zero-Page может затираться игрой. А вот INT позволяет MODE2. Обработчик прерываний может быть в ОЗУ или ПЗУ выше адреса 8000 (там где у РК нет ни ОЗУ ни ПЗУ и куда пРК-программы не лезут).
barsik- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия, СПб
Похожие темы
» Z80 в Специалисте
» ПЭВМ Специалист-Экспресс
» Бейсик ZX-Spectrum в Специалисте
» Аппаратные прерывания в Специалисте
» ПЭВМ Специалист-МХ
» ПЭВМ Специалист-Экспресс
» Бейсик ZX-Spectrum в Специалисте
» Аппаратные прерывания в Специалисте
» ПЭВМ Специалист-МХ
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения