Эмулятор Союз-Неон ПК-11/16 - NEONBTL
Благодаря совместным усилиям участников этого форума - @xolod, @Alex_K, @Titus и моих - создаётся второй эмулятор Союз-Неона!
Репо: https://github.com/nzeemin/neonbtl
Скачать: https://github.com/nzeemin/neonbtl/releases
https://pic.maxiol.com/thumbs2/16731...7142419106.png https://pic.maxiol.com/thumbs2/16737...4124847911.png
Состояние:
Загружается до командной строки RT-11. Заработала запись на диск. Загружаемся в Аспект.
Есть поддержка IDE HDD (драйвер HZ).
Заработал Covox.
Недоделки:
- Зависает на демо на передаче файла мелодии в устройство SN.
- Звук с ВИ53 пока не работает.
- Не сделана запись в память по маске - проявляется на демо в тенях надписей, в игре Tetris.
Маппинг клавиатуры:
К1..К5 = F1..F5
ПОМ УСТ ИСП = F6..F8
СБРОС = F11, СТОП = F12
АР2 = Esc, ЗБ = Backspace
Таб = Tab, ВВОД = Enter
НР = LShift, УПР = LCtrl
АЛФ = RShift, ГРАФ = RCtrl
Руководство пользователя эмулятора:
https://github.com/nzeemin/neonbtl/b...r-manual-ru.md — русский
https://github.com/nzeemin/neonbtl/b...r-manual-en.md — английский
Веб-версия эмулятора: https://nzeemin.github.io/neonbtl-wasm/index.html?run=1
Борьба с переходом через границу памяти в прошивке ПЛМ P3.
Собственно известно, что в Союз-НЕОН 22-разрядный физический адрес памяти образуется сложением соответствующего регистра диспетчера памяти, где располагаются разряды с 21 по 12, и виртуального адреса, откуда берутся разряды с 12 по 0. Как видим, общими являются разряды 12, а значит при сложении возможен перенос. В ТО написано, что перенос осуществляется в разряды 13-19, но по анализу прошивки P3 это не так. Сам перенос осуществляется в разряды с 13 по 20. А вот с последним 21-м разрядом интересная ситуация. Если в нём будет реализован полноценный перенос, то он может очистится и физический адрес будет указывать на самое начало памяти, что может привести к её порче, а там находятся регистры виртуальных устройств. Поэтому разработчики поступили следующим образом, вот логическое выражение формирования 21 разряда физического адреса: MMBA21*/PG7+MMBA15*MMBA14*MMBA20*/PG7*CA14*MMBA17*MMBA16*MMBA19*MMBA18. Суть в том, что он будет в единице в том случае, если он уже был в единичном состоянии или был перенос в него. В нулевом состоянии он останется, если он уже был в нулевом состоянии и не было переноса в него. Таким образом не будет портится самое начало памяти, а будет портится, в случае чего, самое начало 2 Мб.