Важная информация

User Tag List

Показано с 1 по 10 из 18

Тема: Прерывания IM2 в Специалисте на КР580

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Banned
    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Прерывания 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 мышь так, чтобы это не создавало проблем тем, у кого мышь отсутствует. Т.е нужен такой интерфейс, чтобы драйвер мыши можно было заменить драйвером для реального джойстика или драйвером джойстика из курсорных клавиш клавиатуры.
    Последний раз редактировалось barsik; 10.03.2018 в 12:19.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Разработка системы на КР580 серии
    от Viktor2312 в разделе Разное
    Ответов: 45
    Последнее: 21.10.2015, 23:58
  2. КР580 - 2,5 Мгц only?
    от alex-eller в разделе Разное
    Ответов: 88
    Последнее: 09.05.2015, 08:41
  3. IM2 в TR-DOS
    от VELESOFT в разделе Софт
    Ответов: 1
    Последнее: 02.02.2013, 19:17
  4. im2 и call 3d13
    от moroz1999 в разделе Программирование
    Ответов: 36
    Последнее: 20.01.2007, 13:00
  5. IM2, вектор прерывания
    от Jukov в разделе Программирование
    Ответов: 18
    Последнее: 20.09.2006, 09:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •