Прерывания IM2 в Специалисте на КР580
При КР580 основной проблемой при введении прерываний в машину, где они изначально не предусмотрены, является отсутствие в КР580 прерывания в MODE 2, т.к без наличия БИС ВН59 нет возможности разместить обработчик прерывания в произвольном месте памяти. Из-за чего приходится использовать резисторы привязки и RST 38.
Этот трюк годится для машин, где ПЗУ стоит с адреса 0, а также годится для CP/M, т.к там область 0038...003A специально зарезервирована для этого. Но увы, во времена Специалиста никто не знал о CP/M, отчего программы работают с адреса 0 и при своей загрузке затирают адрес 0038.
Прерывания в Специалисте полезны для мыши и для вывода одноголосной музыки программно и трёхголосной через ВИ53. При введении прерываний в машину, где они изначально не предусмотрены, выручает режим прерываний 2. Задача в том, чтобы придумать простую схему, как получить IM2 на КР580 аппаратно.
Для обслуживания прерываний в системе КР580 формируется сигнал INTA. ВК28 выдаёт его готовым. Но и без ВК28 цикл INTA для чтения кода прерывания легко фиксируется, т.к при обработке прерывания в слове состояния по стробу SYNC выдаётся бит D0=1. Защёлкнув его в триггере ТМ2, и добавив буфер АП6 можем заставить КР580 считать с шины код CD. Считав код CD процессор, обнаружив, что это код команды CALL, в следующих машинных циклах снова дважды читает память (адрес подпрограммы). Т.о в целом считаются три байта CD,CD,CD, что является кодом команды CALL CDCD.
А адрес CDCD это в Специалисте область базового ПЗУ, куда можно навсегда прошить команду JMP в область ОЗУ чуть ниже RAMTOP, куда прикладные программы точно не лезут. Т.к в коде СD всего 3 нуля, то если часть шины данных привязать на +5В, то для выдачи кода CD, вместо АП6 можно применить более удобные 4-х разрядные буфера ЛН6, ЛП11 или 589 АП16.
Есть и другие варианты введения прерываний не использующие ОЗУ занятое программами.
Во-первых, сделав привязку шины на +5В (чтобы с шины читался код RST 38), по тому же триггеру ТМ2 взведённому в цикле обслуживания прерывания, можно временно включать маленькое ПЗУ с адреса 0 (например кусок в 4 кб из базового ПЗУ C000). Тогда по адресу 0038 окажется содержимое ПЗУ C038, куда и должен быть прошит JMP в системную область ROM-BIOS. Это позволит иметь прерывания в программах, где стек стоит выше адреса 1000H, т.к считав с шины код RST 38, процессор кидает адрес возврата в стек. Но увы, в CP/M стек ставится на адрес 0080, так что теневое ПЗУ с 0 не сработает.
Для борьбы с этим есть более громоздкий вариант также с теневым ПЗУ, но включаемым не сразу, а только после того, как процессор закинет в стек адрес возврата в команде RST. Тогда по выдаче слова состояния в цикле обслуживания прерывания также взводится триггер ТМ2. Процессор читает с шины код RST 38, и перед уходом на адрес 0038 сохраняя адрес возврата, выполняет два цикла записи в память (причём бит D2 слова состояния =1, свидетельствуя о стековой операции).
И только после окончания второй записи в память (по фронту 0->1 сигнала /WR CPU) сигнал начальный пуск (НП) устанавливается в 1, который отключает всё ОЗУ и делает во всём адресном пространстве ПЗУ. Процессор читает из ПЗУ по адресу 0038 код следующей команды JMP в область ПЗУ C000, где программно сбрасывается сигнал включения ПЗУ на всю память и выполняется уход на обработчик прерывания в системном ОЗУ. Т.о отличие этой схемы лишь в том, что сигнал триггера ТМ2 дважды сдвигается фронтом сигнала /WR, отчего теневое ПЗУ включается с задержкой нужной процессору для записи адреса возврата в стек.
Такой вариант требует дополнительного триггера ТМ2 (в качестве счётчика передних фронтов сигнала /WR), но зато позволяет иметь прерывания при любом содержимом указателя стека.
Наличие не использующих ОЗУ 0038...003A прерываний, позволяет встроить прерывания в ROM-BIOS для опроса клавиатуры и счёта времени, аналогично ZX-Spectrum. Особенно это выгодно для Специалиста, потому что у него самая быстрая процедура опроса клавиш среди всех известных в мире 8-ми разрядок с матричной клавиатурой. Т.е опрос клавиатуры 50 раз в секунду не тормознёт прогон программы.
Самый простой аппаратно это вариант с буфером выдающим на шину код CD. Это чисто теоретическая предпосылка, практически я это ещё не проверял. Но как всегда самое главное это наличие оригинальной идеи, а реализацию при желании может сделать каждый.
Препятствием по введению прерываний в Специалист можно считать желание пользователей иметь совместимость со всеми старыми программами. Т.е нельзя ввести в имеющееся ПЗУ опрос клавиш по прерываниям, т.к это нарушит совместимость.
Т.к нет программ использующих прерывания и для прогона имеющихся программ нужен именно ROM-BIOS в ПЗУ совместимый со зверковским загрузчиком и орловским монитором, то пока видится возможным только встроить в ПЗУ загрузчика лишь одну команду JMP на вектор прерывания в системном ОЗУ по адресу CDCD. А опрос клавиш по прерываниям, естественно, откладывается до написания полностью нового несовместимого альтернативного ROM-BIOS для оконного ПЗУ 27256.
К сожалению, я не имею пока собственного эмулятора Специалиста и тем самым лишён возможности модернизировать эмулятор даже под мелкие доработки железа. Это не позволяет разрабатывать ПО использующее эти доработки. А на реальном железе я это отмакетирую не скоро, т.к не люблю возиться с паяльником, хотя без этого не обойтись.
Эмулятор EMU80 поддерживает прерывания 50 ГЦ с обработчиком по RST 38, включаемые битом D7 порта D9. Этого достаточно, чтобы делать программы для вывода музыки с использованием прерываний. А вот драйвер обслуживания мыши с использованием прерываний можно отлаживать только в железе, т.к мышь не эмулируется.
Остаётся вопросом каким образом подключить к Специалисту и РК86 мышь так, чтобы это не создавало проблем тем, у кого мышь отсутствует. Т.е нужен такой интерфейс, чтобы драйвер мыши можно было заменить драйвером для реального джойстика или драйвером джойстика из курсорных клавиш клавиатуры.
Система прерываний на ПК Специалист
Идея добавить прерывания в Специалист витает довольно давно. А в некоторых клонах на Z80 типа Эрика она и вовсе уже давно реализована.
Давайте на данном этапе откинем рассуждения о совместимости со всем предыдущим софтом, о том, что сигнал INTE процессора уже задействован в системе цветности, о том, что всё равно никто уже под это дело ничего писать не будет и т.д. Я предлагаю пока просто пофантазировать какими должны быть идеальные прерывания на Специалисте.
Как я понимаю, ни у кого не возникает сомнений, что прерывания должны быть частотой 50 Hz. Ну хотя бы для того, что можно было синхронизироваться с экраном и использовать, написанную на Спектруме, музыку.
Такие прерывания уже организовал @Pyk в Emu80:
Цитата:
Сообщение от
Pyk
- - -
zx_, для включения периодических прерываний в "Специалисте" добавьте в конец конфигурационного файла следующие строки:
Код:
PeriodicInt8080 periodicInt = &cpu, 7, 50
periodicInt.active = yes
Здесь 7 - это номер вектора прерывания (rst 7), а 50 - частота прерываний
Правда, чтобы не лезть в сам код эмулятора, Виктор сделал эти прерывания независимыми от обновления экрана. То есть прерывания просто приходят 50 раз в секунду, независимо ни от чего. Но и это уже хоть что-то! Я с делом поигрался и уже выкладывал результат:
https://plvideo.ru/watch?v=7adiG7WtPmaC
Отчётливо видно, что бегущая строка периодически рвётся, несмотря на то, что всё выводится по прерываниям и успевает по тактам уложиться между кадрами.
@RW9UAO, готов внедрить правильные прерывания свой FPGA Специалист, а Pyk готов аналогичным образом доработать свой эмулятор. Таким образом можно будет обкатать их. Если всё будет хорошо, то, возможно, кто-то (@Mick?) захочет это воплотить в реальном железе.
Собственно вопрос: Когда должны приходить прерывания и какой длительности сигнал должен быть? Дело в том, что полезность прерывания для, например, отрисовки спрайтов, зависит от того, на каком этапе строения кадра прерывание придёт. При этом не стоит забывать о том, чтобы реализовать в железе это было максимально просто.