Просмотр полной версии : Эмулятор Союз-Неон ПК-11/16 - NEONBTL
Благодаря совместным усилиям участников этого форума - xolod, Alex_K, Titus и моих - создаётся второй эмулятор Союз-Неона!
Репо: https://github.com/nzeemin/neonbtl
Скачать: https://github.com/nzeemin/neonbtl/releases
https://pic.maxiol.com/thumbs2/1673101485.1565642383.20230107142419106.png (https://pic.maxiol.com/?v=1673101485.1565642383.20230107142419106.png&dp=2) https://pic.maxiol.com/thumbs2/1673729851.1565642383.20230114124847911.png (https://pic.maxiol.com/?v=1673729851.1565642383.20230114124847911.png&dp=2)
Состояние:
Загружается до командной строки 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/blob/master/docs/user-manual-ru.md — русский
https://github.com/nzeemin/neonbtl/blob/master/docs/user-manual-en.md — английский
Веб-версия эмулятора: https://nzeemin.github.io/neonbtl-wasm/index.html?run=1
Не грузится диск System.dsk, который я передавал с IOSCAN. Сначала ошибка записи файла LD.SYS потом вообще останов по ошибке загрузки системы. Сам образ диска чуть больше 800 Кб.
Не различает устройства FD0 и FD1, идёт обращение на FD0.
- - - Добавлено - - -
Да, если была попытка записи, то она завершается с ошибкой, а после перестаёт работать и чтение.
Не грузится диск System.dsk, который я передавал с IOSCAN. Сначала ошибка записи файла LD.SYS потом вообще останов по ошибке загрузки системы. Сам образ диска чуть больше 800 Кб.
Сделал заглушку на запись, получил результат IOSCAN под эмулятором. Для сравнения, справа реал.
Но под эмулятором я не делал Ctrl+C, Ctrl+C - потому что не размаплено ещё )
https://pic.maxiol.com/thumbs2/1673138316.1565642383.20230108003757297.png (https://pic.maxiol.com/?v=1673138316.1565642383.20230108003757297.png&dp=2) https://pic.maxiol.com/thumbs2/1672935710.1565642383.photo2023010519192.jpg (https://pic.maxiol.com/?v=1672935710.1565642383.photo2023010519192.jpg&dp=2)
В эмуляторе с убраным STARTS.COM:
https://pic.maxiol.com/thumbs2/1673180066.1565642383.20230108121359996.png (https://pic.maxiol.com/?v=1673180066.1565642383.20230108121359996.png&dp=2)
И для комплекта ещё - как в эмуляторе Титуса:
https://pic.maxiol.com/thumbs2/1673179902.1565642383.iosncanoptitus.png (https://pic.maxiol.com/?v=1673179902.1565642383.iosncanoptitus.png&dp=2)
Похоже, "неиспользуемые" регистры в диапазоне 161000-161776 при запросе отдают младший байт адреса:
https://pic.maxiol.com/thumbs2/1673181751.1565642383.photo2023010815401.jpg (https://pic.maxiol.com/?v=1673181751.1565642383.photo2023010815401.jpg&dp=2)
В эмуляторе с убраным STARTS.COM:
Да, есть ещё куда работать. И особенно с сигналами внешних прерываний - ACLO, EVNT, HALT и VIRQ. Особенно с сигналами радиальных прерываний (которые по уровню) HALT и VIRQ. ACLO и EVNT защёлкиваются по обратному фронту и с ними таких проблем нету. А вот с HALT и VIRQ есть проблема в том, что процессор начинает их обрабатывать с запаздыванием на одну команду. Если я не ошибаюсь, регистр прерываний формируется в начале исполнения команды и уже после исполнения команды, когда происходит обработка прерываний с учётом маскирования, то используется этот регистр. Т.е. командой выставили требование HALT или VIRQ, то оно не исполнится сразу после команды, а после следующей. Вот поэтому при обращении к эмулируемым регистрам после команд, стоят NOP. Это кстати не сделано и в UKNCBTL, поэтому там и отсутствует прерывание по неполучению адреса вектора прерывания (SEL274).
И кстати, IOSCAN-а лучше сделать два. Один классический без NOP, а второй с NOP, чтобы видеть разницу между аппаратным TRAP4 и эмулируемым.
- - - Добавлено - - -
Похоже, "неиспользуемые" регистры в диапазоне 161000-161776 при запросе отдают младший байт адреса:
А точно из всего диапазона? 1610XX - это реально присутствующее оборудование, 1612XX - регистры UR и HR, 1614XX - RTC. Сигналы для выбора диапазонов 1611XX, 1613XX, 1615XX заводятся на внешние разъёмы. В схеме есть формирование сигнала 161XXX, а вот сигналов 1616XX, 1617XX нет.
Да, есть ещё куда работать. И особенно с сигналами внешних прерываний - ACLO, EVNT, HALT и VIRQ
Как ни странно, софт на ПК11 оказался гораздо менее критичным, чем на УКНЦ.
Даже на моем эмуляторе работает весь софт, который имеется в наличии, хотя эмуляция далека от точного повторения железа.
https://github.com/nzeemin/neonbtl/releases/download/preview-99/NEONBTL-preview-99.zip
Клавиатура размаплена на клавиатуру PC почти полностью.
Экранная клавиатура размаплена полностью.
Сделана заглушка на запись на диск, чтобы не давало ошибок.
https://pic.maxiol.com/thumbs2/1673300268.1565642383.20230109213737721.png (https://pic.maxiol.com/?v=1673300268.1565642383.20230109213737721.png&dp=2)
Ну, в общем, на Союз-Неон можно поиграть в патченую версию Сталкера.
В начале я воткнул Esc-последовательность для переключения VT100 -> VT52, так оно всё показывает.
Единственное только, числовая клавиатура даёт не цифры, а странные коды, поэтому ходить надо обычными цифрами.
Единственное только, числовая клавиатура даёт не цифры, а странные коды, поэтому ходить надо обычными цифрами.
Это дополнительная клавиатура работает в режиме ДКЛ (альтернативный). В VT-52 включается через <Esc>= (Escape равно), выключается - <Esc> > (Escape больше). Но, если судить по документации, у Союз-НЕОН отсутствует команда отключения режима ДКЛ и допклавиатура всегда работает в режиме ДКЛ. Наверное не всё смогли впихнуть в сжатый блок, потому так и сделали. Эту клавиатуру используют редакторы KED/KEX/K52. Редактор KED, который идёт с дисками для Союз-НЕОН на самом деле является адаптированной специально для Союз-НЕОН версией редактора KEY. А сам редактор KEY является расширенной версией оригинальных редакторов KED/K52, писался у нас в СССР.
Собственно известно, что в Союз-НЕОН 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 Мб.
Тесты инструкций MOV MOVB на реале
https://pic.maxiol.com/thumbs2/1673613852.1565642383.photo2023011315434.jpg (https://pic.maxiol.com/?v=1673613852.1565642383.photo2023011315434.jpg&dp=2) https://pic.maxiol.com/thumbs2/1673613864.1565642383.photo2023011315435.jpg (https://pic.maxiol.com/?v=1673613864.1565642383.photo2023011315435.jpg&dp=2)
Тесты инструкций BIS BISB на реале
https://pic.maxiol.com/thumbs2/1673620577.1565642383.bis.jpg (https://pic.maxiol.com/?v=1673620577.1565642383.bis.jpg&dp=2) https://pic.maxiol.com/thumbs2/1673620587.1565642383.bisb.jpg (https://pic.maxiol.com/?v=1673620587.1565642383.bisb.jpg&dp=2)
Тесты инструкций CMP CMPB на реале
https://pic.maxiol.com/thumbs2/1673620766.1565642383.cmp.jpg (https://pic.maxiol.com/?v=1673620766.1565642383.cmp.jpg&dp=2) https://pic.maxiol.com/thumbs2/1673620779.1565642383.cmpb.jpg (https://pic.maxiol.com/?v=1673620779.1565642383.cmpb.jpg&dp=2)
Тесты инструкции ADD на реале
https://pic.maxiol.com/thumbs2/1673620913.1565642383.add.jpg (https://pic.maxiol.com/?v=1673620913.1565642383.add.jpg&dp=2)
НЕ идут тесты на Союз-Неоне: DIV, MUL, ASH, ASHC, MOVPC2, TSSPD.
НЕ идут тесты на Союз-Неоне: DIV, ASH, ASHC, MOVPC2.
В этих тестах Patron зачем-то перешёл на вывод на экран через перехват прерывания 064 и через регистры терминала. А с этим у СОюз-НЕОН имеются большие проблемы, там вроде переделывали RT-11, чтобы выводить без прерываний.
- - - Добавлено - - -
В этих тестах Patron зачем-то перешёл на вывод на экран через перехват прерывания 064 и через регистры терминала. А с этим у СОюз-НЕОН имеются большие проблемы, там вроде переделывали RT-11, чтобы выводить без прерываний.
Даже не для вывода, а для какой-то синхронизации. Используются прерывания 064 (терминал) и таймер (0100). И у Союз-НЕОН где-то идёт неправильно эмуляция всего этого дела, по докам на терминал он всё-таки пытается эмулировать регистры 0177564 и 0177566 в режиме прерываний.
Надо переделывать тест, но написан он очень сложно, такое ощущение, что там целая операционная система.
NEONBTL preview 103
https://github.com/nzeemin/neonbtl/releases/download/preview-103/NEONBTL-preview-103.zip
В этой версии - улучшения по скорости команд (сейчас эмулятор примерно на 10-15% медленнее реала), улучшена эмуляция RTC (правильно показывается дата).
Вроде пропатчил MUL, в UKNCBTL показывает такие же результаты, как и оригинальный тест, только работает побыстрее, нет пауз между тестами.
Исходники и собранный модуль - здесь (https://disk.yandex.ru/d/8Dk8c5rhxyTCAA).
Вроде пропатчил MUL, в UKNCBTL показывает такие же результаты, как и оригинальный тест, только работает побыстрее, нет пауз между тестами.
Исходники и собранный модуль - здесь (https://disk.yandex.ru/d/8Dk8c5rhxyTCAA).
Результаты MUL1 на реале:
https://pic.maxiol.com/thumbs2/1673706448.1565642383.mul1.jpg (https://pic.maxiol.com/?v=1673706448.1565642383.mul1.jpg&dp=2)
NEONBTL preview 107
https://github.com/nzeemin/neonbtl/releases/download/preview-107/NEONBTL-preview-107.zip
Первое превью эмулятора с записью на диск. Надо тестировать, проверял только на мелких примерах. Берегите свои образы дисков - делайте бэкапы.
Проверил на копировании файла - что в образе они потом совпадают. Проверил на команде squeeze, что после этого образ остался рабочим.
Образ диска в файле на хосте актуализируется либо по команде остановки мотора, либо после 3-х секунд вращения диска.
Индикатор работы мотора выведен на статусбар - "FD Motor".
P.S. Alex_K уже нашёл пару ошибок, связанных с записью, буду лечить.
Покопался в прошивке ПЛМ P10. Выяснилось, что к адресному пространству контроллера дисковода относятся регистры 0161070 и 0161072. А к адресному пространству контроллера жёсткого диска с 0161040 по 0161056 и 0161076. Сам счетчик буфера сбрасывается любой записью как в регистр 0161054 (HD.SDH), так и в регистр 0161076 (FD.CNT).
По анализу прошивки ПЛМ P10 предусмотрен режим работы буфера - запись или чтение. Соответственно перед работой с буфером его надо перевести в необходимый режим. Перевод в режим чтения осуществляется обращением (чтение или запись) к регистру HD.CSR 0161056, а в режим записи - обращением к регистру HD.SDH 0161054. Это также отражено в исходника ВПО в процессе P16HDC:
;----------------------------------------
; bdir = wr : rd/wr hdsdh ;
; bdir = rd : rd/wr hdcsr ;
;----------------------------------------
В режим записи может его так же перевести контроллер HDD, но только в режим записи, т.к. в режим чтения буфер переводится при записи команды в регистр HD.CSR. Для всех других операций, как адресное чтение и запись буфера, а также для работы дисковода, его необходимо выставить. Для дисковода при чтении данных буфер должен быть в режиме записи, а для записи данных - в режиме чтения.
Также в ПЛМ P10 предусмотрена защита от неправильного использования буфера во время адресного обмена через регистр HD.BUFF 0161040. Т.е. если буфер установили в режим чтения, то запись в него идти не будет и счетчик не будет переходить на следующий адрес. Так же, при установке буфера в режим записи, не будет идти чтение и счетчик не будет переходить на следующий адрес. Это такая защита при исполнении команды MOVB, у которой в цикле записи источника делается пустое чтение этого источника, а затем запись.
Во время обмена с буфером контроллеров FDD и HDD такой полной защиты нет, т.е. операция чтения и записи в память не будет исполняться, но счетчик будет переходить на следующий адрес.
В дополнение по прошивке ПЛМ P10. Ранее я писал, что данная прошивка формирует сигналы для выбора контроллера дисковода /CS-FL (адреса 0161070-0161073) и контроллера жёсткого диска /CS-HD (адреса 0161040-0161057 и 0161076-0161077). Также в этой ПЛМ находится бит выбора режима буфера bdir /BUF_WR.
Выбор контроллера дисковода, выбор осуществляется при проведении операций чтения или записи при условии, что оба контроллера не работают в режиме ПДП:
/HD-BCS*/FL-DRQ*IOR*&O1610XX*A05*A04*A03*/A02
/HD-BCS*/FL-DRQ*IOW*&O1610XX*A05*A04*A03*/A02
Такой же выбор контроллера жёсткого диска:
/HD-BCS*/FL-DRQ*IOR*&O1610XX*A05*/A04
/HD-BCS*/FL-DRQ*IOW*&O1610XX*A05*/A04
IOW*&O1610XX*A05*A04*A03*A02*A01
Дополнительный регистр 0161076 выбирается только при записи в него, независимо от режима работы контроллеров.
А вот и установка бита режима буфера:
CS-HD*/A04*A03*A02*/A01
BUF-WR*/A01
BUF-WR*/A02
BUF-WR*/A03
BUF-WR*A04
BUF-WR*/CS-HD
HD-BCS*FL-WR
Первое условие настроено на обращение к регистру 161054 и переводит буфер в режим записи. Следующие пять условий являются условиями удержания сигнала, что-то типа триггера. Но все эти условия перестают выполняться при обращении к регистру 0161056 и буфер переводится в режим чтения. Последнее условие служит для перевода в режим записи буфера самим контроллером жёсткого диска. Это необходимо, т.к. команда в контроллер HDD записывается в регистр 0161056, переводя одновременно буфер в режим чтения, так что далее сам контроллер переводит его в режим записи при необходимости.
Эта ПЛМ также формирует ответ для контроллера FDD в ответ на запрос обмена ПДП, сигнал /FL-DACK:
FL-DRQ
FL-DACK*HDBUFCS
Сигнал также удерживается, если активен выбор буфера.
А вот и интересный сигнал выбора буфера /HDBUFCS. Сигнал выбора режима чтения/записи буфера /BUF-WR подаётся постоянно, поэтому сама операция работы с буфером делается сигналом /HDBUFCS, который подключен к выводу /CS статического ОЗУ. Также после выдачи этого сигнала осуществляется переход к следующему адресу в счётчике:
/HD-BCS*/FL-DRQ*IOW*BUF_WR*CS_HD*A05*/A04*/A03*/A02*/A01
/HD-BCS*/FL-DRQ*IOR*/BUF_WR*CS_HD*A05*/A04*/A03*/A02*/A01
HD-BCS*FL-RD
HD-BCS*FL-WR
FL-DRQ*FL-DACK
Первые два условия отвечают за адресный обмен с буфером и содержат защиту от его неправильного использования. Видно, что условия выполняются, если осуществляется запись и буфер в режиме записи, а также если осуществляется чтение и буфер в режиме чтения. Если условия не будут выполняться, то буфер не будет выбран, соответственно не осуществится операция чтения/записи и не будет осуществлён переход на следующий адрес.
Третье и четвертое условие выполняются при обмене контроллера HDD с буфером, а пятое - при обмене контроллера FDD. Здесь нет ограничений от неправильного использования. При работе контроллера HDD такого быть не может, т.к. он сам переключает буфер в необходимый режим. А вот при работе контроллера FDD такое возможно, если перед операцией режим буфера был неправильно выставлен. В любом случае переход на следующий адрес всегда будет выполняться, но при записи в буфер в режиме чтения ничего записываться не будет, будет оставаться старое значение, а при чтении с буфера в режиме записи будет читаться всякая ерунда и эта же ерунда записываться в буфер.
Здесь также осуществляется выработка сигналов чтения и записи регистров контроллеров /FL-RD и /FL-WR.
Сигнал /FL-RD:
/HD-BCS
/FL-DRQ*IOR*&O1610XX*A05*/A04
/FL-DRQ*IOR*&O1610XX*A05*A04*A03*/A02
FL-DRQ*FL-DACK*HDBUFCS*BUF-WR
Сигнал /FL-WR:
/HD-BCS
/FL-DRQ*IOW*&O1610XX*A05*/A04
/FL-DRQ*IOW*&O1610XX*A05*A04*A03*/A02
FL-DRQ*FL-DACK*HDBUFCS*/BUF-WR
Видно, что сигналы формируются не только для адресного обмена, но и при работе контроллера FDD в режиме ПДП.
Ну и последний сигнал очистки счетчика CL-CNT. Он используется не только для очистки счётчика буфера, но и в качестве условия для записи в регистры 0161054 и 0161076, т.к. в этих регистрах содержатся биты во внешней логике:
/A04*A01
/A02*/A04
/A03*/A04
/IOW
/CS-HD
Условий много, но они должны все не выполнится, т.к. выход у ПЛМ инверсный, а сигнал нужен прямой. Поэтому по этим условиям выбирают все регистры, кроме 0161054 и 0161076. По остальным регистрам хоть одно условие будет истинным и сигнал очистки не выработается. А при выборе регистров 0161054 и 0161076 все условия будут ложными и выработается сигнал очистки.
Про ПЛМ P11. Данная ПЛМ содержит в себе биты 0 (HN0), 1 (HN1), 4 (RUN) регистра HD.SDH(0161054), бит 8 счётчика буфера(HDBUFA08) и биты 4 (FD-RESET), 1 (HDBUFA10), 0 (HDBUFA09) регистра FD.CNT(0161076). В регистре 0161076 биты 0 и 1 являются не только выбором части буфера, но и 9-м и 10-м разрядами счётчика буфера. В самой ПЛМ четыре логических вывода, в которых логические произведения складываются по ИЛИ-НЕ, а также четыре регистровых вывода, на выходе которых стоит по D-триггеру, информация в котором защелкивается по переднему фронту на входе CLK, в триггере затем используется инверсный выход. На логических выводах находятся сигналы HN1, HN0, RUN и CLK-P11. Вывод CLK-P11 используется для формирования переднего фронта, который подаётся на вход CLK. Выводы FD-RESET, HDBUFA08, HDBUFA09 и HDBUFA10 являются регистровыми, актуальная информация на них появляется после защелкивания по переднему фронту на входе CLK.
Пока рассмотрим логические выводы HN0, HN1 и RUN.
Вывод RUN:
DB4*CL-CNT*/A01
RUN*DB4
RUN*A01
RUN*/CL-CNT
Первое условие обеспечивает выбор бита 4 регистра 0161054. Сигнал CL-CNT является не только сигналом сброса счётчика буфера, но и условием записи в регистры 0161054 и 0161076. Различаются эти регистры в по адресной линии A01, если ноль, то это 0161054, если единица - 0161076. В данном случае формируется условие, равное записываемому биту 4 в регистр 0161054. Остальные три условия являются условиями удержания, реализуя функции триггера. Так как выход инверсный, то на выводе появляется инвертированное значение записанного бита. Оно подаётся на входы запуска мотора интерфейсов дисковода и жёсткого диска MFM. Т.к. шина дисковода и диска MFM также инверсная, то запись единицы обеспечивает запуск мотора, запись нуля - остановка мотора.
Вывод HN1:
DB1*CL-CNT*/A01
HN1*DB1
HN1*A01
HN1*/CL-CNT
Всё точно так же, как и битом 4 (RUN), но только бит 1 регистра 0161054. Этот вывод подаётся на вход HN1 интерфейса жёсткого диска, обеспечивает бит 1 выбора головки, а также на вход 2 интерфейса дисковода, обеспечивает выбор плотности, при операции с диском двойной плотности DD устанавливается в один.
Вывод HN0:
DB0*CL-CNT*/A01
HN0*DB0
HN0*A01
HN0*/CL-CNT
Всё точно так же, как и битом 4 (RUN), но только бит 0 регистра 0161054. Этот вывод подаётся на вход HN0 интерфейса жёсткого диска, обеспечивает бит 0 выбора головки, а также на вход 32 интерфейса дисковода, обеспечивает выбор стороны.
Потом будут описаны другие выводы, которые обеспечивают формирование сигнала CLK и работу трёх старших бит счётчика.
- - - Добавлено - - -
Далее по работу ПЛМ P11.
Для запоминания информации на регистровых выводах необходимо формирование переднего фронта сигнала CLK. Этот сигнал формируется на выводе CLK-P11, который соединён с выводом CLK самой ПЛМ. По схеме там ещё стоит конденсатор C16 на 330 пФ, служащий для формирования длительности импульса. У формирователя импульса и счётчика два режима работы - обычный и под управлением контроллера жёсткого диска. Обычный режим работы это адресный обмен с буфером и обмен с буфером контроллера дисковода.
Здесь необходимо рассмотреть два вывода сразу - P11-CLK и HDBUFA08, т.к. они взаимосвязаны в работе.
Вывод формирования импульса CLK-P11:
HDBUFA07
/HDBUFA08*HD-BDRQ*P11-CLK
HDBUFA08*HD-BDRQ
Вывод восьмого бита счётчика буфера HDBUFA08:
/HD-BDRQ*HDBUFA08
CL-CNT
Рассмотрим работу в обычном режиме. В данном случае сигнал HD-BDRQ имеет низкий уровень, а значит два последних условия при формировании P11-CLK не будут выполняться. В первом условии сигнала HDBUFA08 подаётся инвертированное значение /HD-BDRQ, поэтому оно всё время будет в единичном состоянии. Так как в данном случае на формирование сигнала P11-CLK влияет только вход HDBUFA07, то при очистке счётчика, если он был в единичном состоянии, то он переходит в нулевое. Также он переходит в нулевое состояние во время счёта, что является одновременно сигналом переноса в старшие разряды. Так как выход у ПЛМ инверсный, то на выходе будет изменение с нулевого на единичное состояние и сформируется передний фронт. Но при ситуации, когда HDBUFA07 был в нулевом состоянии, то формирование фронта при очистке происходить не будет. Но в данном случае разработчики между сигналами очистки буфера CL-CNT и выводом HDBUFA07 со счётчика поставили конденсатор C15 на 75 пФ. Во время очистки счётчика CL-CNT принимает высокий уровень и выводе HDBUFA07 возникает импульс, этакий аналоговый одновибратор. Длительности этого импульса должно хватить на формирование переднего фронта на выходе P11-CLK. Таким образом передний фронт будет сформирован либо во время очистки, либо во время счёта при переходе из единичного состояния в нулевое.
Во время обычного режима работы по сигналу CLK меняется состояние вывода HDBUFA08. Сигнал /HD-BDRQ в единичном состоянии, а вывод у ПЛМ инверсный, поэтому HDBUFA08 будет переключаться на противоположное значение. Т.к. импульс происходит при переносе из HDBUFA07, то просто меняется состояние HDBUFA08 на противоположное. Но импульс CLK может возникать и во время очистки счётчика, поэтому вторым условием стоит состояние сигнала CL-CNT, во время очистки он в единичном состоянии, поэтому на выводе HDBUFA08 возникает нулевое состояние, разряд очистился.
Более сложная работа происходит при управлении с контроллера жёсткого диска. Там при операциях записи перед каждым сектором и при форматировании перед запросом буфера выдаётся сигнал HD-BDRQ, этот же сигнал выдаётся после чтения одного сектора. Почему то разработчики решили переключать страницы адреса буфера (биты 9 и 10) только по этому сигналу, наверное от того, что контроллер после операции с каждым сектором требует подтверждения. Остальные биты с 0 по 8 считаются как обычно, т.к. сигнал HD-BDRQ отсутствует. Но бит 8 HDBUFA08 всё равно принудительно дёргается при смене страницы. При выдаче HD-BDRQ контроллер ждёт ответного сигнала на вход BRDY, но в Союз-НЕОН эти выводы соединены. Таким образом выдаётся HD-BDRQ, он поступает на вход BRDY, контроллер в ответ снимает HD-BDRQ и операция продолжается далее, возникает импульс.
При подаче HD-BDRQ вывод счётчика HDBUFA07 обязательно должен быть очищен, иначе ничего не произойдёт. Состояние вывода HDBUFA08 роли не играет, но рассмотрим ситуацию, когда оно нулевое, что и должно быть.
Диаграмма работы:
HDBUFA07 _________________________
_______
HDBUFA08 _________/ \_______
_________
HD-BDRQ __/ \____________
____ __ _________
P11-CLK \__/ \____/
При подаче сигнала HD-BDRQ выполняется условие /HDBUFA08*HD-BDRQ*P11-CLK и на выводе P11-CLK появляется низкий уровень. Инвертированное значение P11-CLK с учётом задержек снова поступает на вход и условие /HDBUFA08*HD-BDRQ*P11-CLK уже выполняться не будет и на выходе P11-CLK снова появляется высокий уровень и формируется передний фронт на входе CLK. По этому фронту отрабатывает правило /HD-BDRQ*HDBUFA08 для вывода HDBUFA08. Но т.к. /HD-BDRQ у нас в нуле, то на выходе HDBUFA08 защелкивается единица, т.к. используется инверсный выход триггера. После появления единичного сигнала HDBUFA08 для формирования P11-CLK срабатывает правило HDBUFA08*HD-BDRQ, на выходе появляется низкий уровень и ситуация стабилизируется. После исчезновения HD-BDRQ все условия для формирования P11-CLK становятся ложными и вывод переводится в единичное состояние с выдачей переднего фронта. По этому переднему фронту меняется состояние HDBUFA08 с единичного на нулевое, что также приводит к изменению разрядов HDBUFA09 и HDBUFA10 и переключению на следующую страницу. В данном режиме работы длительность импульса HD-BDRQ должна быть больше, чем длительность импульса P11-CLK, иначе будет только один фронт, HDBUFA08 переведется в единичное состояние и переключения страниц не произойдёт.
Осталась третья часть про старшие разряды счётчика HDBUFA09 и HDBUFA10.
Про старшие разряды счётчика HDBUFA09 и HDBUFA10 в ПЛМ P11.
Разряды имеют регистровый выход и информация на них защёлкивается по переднему фронту на входе CLK. Передний фронт возникает во время счёта при переносе из 7-ого разряда или во время очистки счётчика. Очистка счётчика возможна при записи в регистры 0161054 и 0161076. При записи в регистр 0161076 должны записаться новые значения 9-го и 10-го разрядов счётчика, которые выступают в качестве выбора банка в СОЗУ. Также передний фронт формируется два раза при выдаче сигнала HD-BDRQ с контроллера жёсткого диска, эти правила срабатывают для обычного счёта.
Правила формирования новых значений разрядов HDBUFA09 и HDBUFA10.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/CL-CNT
/HDBUFA08*/HDBUFA09*/A01
CL-CNT*/DB0*A01
HD-BCS*/HDBUFA09
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
/HDBUFA09*/HDBUFA10*/A01
/HDBUFA08*/HDBUFA10*/A01
DB1*CL-CNT*A01
HD-BCS*/HDBUFA10
Рассмотрим вариант обычного счёта при работе с регистром 0161040 и при работе контроллера FDD в режиме ПДП, а также при подаче сигнала HD-BRRQ с контроллера жёсткого диска (два фронта CLK). В данном варианте активны следующие сигналы /HD-BCS, /CL-CNT. Значение сигнала /A01 не имеет значение, т.к. правила с ним повторяют правила с /CL-CNT. Сигналы CL-CNT и HD-BCS неактивны. Итого у нас получаются для исполнения следующие правила.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/CL-CNT
Первое правило исполняется при равенстве единице разрядов HDBUFA08 и HDBUFA09. Второе правило при равенстве нулю разрядов HDBUFA08 и HDBUFA09. Если эти разряды имеют разные значения, то ни одно правило не исполняется. Не забываем про инверсный выход с триггера. Итого получается 00>0, 01>1, 10>1, 11>0. Получается, что если 8-й разряд был равен нулю, то 9-й разряд сохраняет своё старое значение, а при равенстве 8-го разряда единице происходит перенос и 9-й разряд меняет своё значение на противоположное.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
В случае с 10-м разрядом правила такие же, только участвуют уже три разряда. Изменяться 10-й разряд будет уже только при равенстве единице 8-го и 9-го разрядов из-за переноса. В остальных случаях он сохраняет своё значение. Итог: 000>0, 001>0, 010>0, 011>1, 100>1, 101>1, 110>1, 111>0.
Следующий случай - это очистка счётчика через запись в регистр 0161054. В данном случае активны сигналы /HD-BCS, CL-CNT, /A01. Неактивны /CL-CNT, A01 и HD-BCS.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
/HDBUFA08*/HDBUFA09*/A01
Первое правило исполняется при равенстве единице разрядов HDBUFA08 и HDBUFA09. Второе правило при равенстве нулю разрядов HDBUFA08 и HDBUFA09. Если эти разряды имеют разные значения, то ни одно правило не исполняется. Не забываем про инверсный выход с триггера. Итого получается 00>0, 01>1, 10>1, 11>0. В данном варианте 9-й разряд не должен трогаться, но он изменяется, если перед этим был установлен 8-й разряд. Такого по идее не должно быть, т.к. после каждого счёта разряды с нулевого по восьмой должны быть сброшены.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
/HDBUFA09*/HDBUFA10*/A01
/HDBUFA08*/HDBUFA10*/A01
Всё точно так же, как и в предыдущем счучае, но здесь в сравнении уже участвуют три разряда. Итог: 000>0, 001>0, 010>0, 011>1, 100>1, 101>1, 110>1, 111>0. Так же видим, что мешает 8-й разряд.
Далее установка этих разрядов через запись в регистр 0161076. В данном случае активны сигналы /HD-BCS, CL-CNT, A01. Неактивны /CL-CNT, /A01 и HD-BCS.
Разряд HDBUFA09:
/HD-BCS*HDBUFA08*HDBUFA09
CL-CNT*/DB0*A01
В случае равенства единице 8-го и 9-го разрядов срабатывает верхнее правило и записывается ноль, что есть неправильно. Если же 8-й разряд равен нулю, как и должно быть, то срабатывает нижнее правило и осуществляет запись нового значения разряда из нулевого бита. Т.к. выход триггера инверсный, то для получения прямого значения записывается инвертированный бит.
Разряд HDBUFA10:
/HD-BCS*HDBUFA08*HDBUFA09*HDBUFA10
DB1*CL-CNT*A01
Здесь почти всё точно так же, портят картину три одновременно установленных разряда с 8-го по 10-й, запишется ноль. А вот если какой-то из тех разрядов был равен нулю, то срабатывает нижнее правило и записывает первый бит. Но здесь в правиле он прямой, а на выходе появляется инверсный, наоборот. Для чего это делается, будет объяснено ниже.
Ну и наконец счёт в режиме обмена с буфером контроллера жёсткого диска. Здесь активны сигналы HD-BCS, /CL-CNT. Неактивны соответственно /HD-BCS, CL-CNT. Значение A01 и /A01 не играет роли.
Разряд HDBUFA09:
/HDBUFA08*/HDBUFA09*/CL-CNT
HD-BCS*/HDBUFA09
Верхнее правило работает при равенстве разрядов 8 и 9 нулю, в результате получается ноль. В других случаях выполняется нижнее правило. Текущее значение инвертируется и опять же в инверсном виде поступает на выход, т.е. в итоге не меняет значения. При работе верхнего правила значение также не будет изменено.
Разряд HDBUFA10:
/HDBUFA09*/CL-CNT*/HDBUFA10
/HDBUFA08*/CL-CNT*/HDBUFA10
HD-BCS*/HDBUFA10
Из-за трёх разрядов ситуация более сложная, но в итоге 10-й разряд не меняется.
Из-за того, что 9-й и 10-й разряды не меняются во время обмена с буфером контроллера HDD (сигнал HD-BCS), переключение на следующий банк осуществляется обработкой сигнала HD-BDRQ от контроллера жесткого диска. При записи сектора или форматировании сначала подаётся сигнал HD-BDRQ, а уже потом во время операции используется буфер. В случае с чтением сначала заполняется буфер, а уже потом подаётся HD-BDRQ. Из-за этого при записи возникает небольшая коллизия, из-за того что сначала делается переход на следующий банк. Поэтому при операциях записи и форматирования необходимо после заполнения буфера выставить номер предыдущего банка. Это дело учтено в ВПО в процессе P16HDC:
bitb #10, h.err+1 ; Это дисковод?
bne F.RW ; На работу с дисководом
bitb #20, (r2) ; Запись?
beq 20$ ; Нет
decb bcnt ; На предыдущий банк
bicb #^C3, bcnt ;
20$:
Это надо учесть при эмуляции контроллера жёсткого диска. При работе с жёстким диском начальный адрес банка не имеет значения.
В случае работы с контроллером дисковода необходимо после чтения или записи заданного количества секторов подавать сигнал TC на контроллер дисковода. Для этой цели и записывают инверсное значение бита 1. Также для дисковода имеет значение номер устанавливаемого банка, в зависимости от количества секторов: 11 - один сектор, 10 - два сектора, 01 - три сектора, 00 - четыре сектора. Т.к. бит 1 у нас записывается в инверсном значении, то получается следующая картина. Первая колонка - записываемые значения, вторая колонка - они же с инверсией первого бита, далее изменение при счёте:
11 01 -> 10
10 00 -> 01 10
01 11 -> 00 01 10
00 10 -> 11 00 01 10
Во всех случаях видим, что после чтения последнего сектора 10-й разряд переходит из нуля в единицу. Для этого к выводу HDBUFA10 подсоединён конденсатор C17 (330 пФ) и резистор R41 (56 кОм). Это аналоговый одновибратор, подающий импульс на вход контроллера TC для прекращения считывания или записи.
Остался один сигнал HD-RESET. Логического выхода для него не нашлось, поэтому сделали на регистровом:
Сигнал FD-RESET:
/DB4*CL-CNT*A01
/FD-RESET*/DB4
/FD-RESET*/A01
/FD-RESET*/CL-CNT
Если при записи в регистр 0161076 установлен бит 4, то на контроллера FDD подаётся сигнал сброса. После сброса необходимо записать в этот бит нулевое значение.
https://github.com/nzeemin/neonbtl/releases/download/preview-109/NEONBTL-preview-109.zip
Убран хак в процессоре на команде MOVB.
Введён флаг HDbuffdir и его переключение по обращению к регистрам.
Максимальное количество дорожек увеличено до 83.
dir/bad/fil теперь отрабатывает без ошибок
https://github.com/nzeemin/neonbtl/releases/download/preview-111/NEONBTL-preview-111.zip
Версия с начальной поддержкой MSX Mouse.
Пока вот так - мышь реагирует на движение, где бы не находился курсор. Принципиально не хочу делать захват мыши эмулятором.
UPDATE: Есть бага, перепутано состояние битов для кнопок, и ещё надо убрать контекстное меню - поправлю.
Принципиально не хочу делать захват мыши эмулятором.
Это почему это? )
Это почему это? )
Потому что с захватом мыши неудобно. Это вводит отдельный режим, в него надо входить, из него надо выходить.
Хочу сделать без отдельного режима - что-то вроде "когда водим мышь над эмулятором, тогда она бегает в эмулируемой машинке".
Это вводит отдельный режим, в него надо входить, из него надо выходить.
Ну не знаю, все так делают, и очень удобно.
Входить - кликнуть мышкой.
Выходить - кликнуть средней кнопкой, или же нажать комбинацию клавиш.
Зато пользоваться внутри эмулируемой системы очень удобно.
В этой версии исправления ошибок по мыши и улучшения работы с ней, должно стать немного комфортнее. Добавился флаг отключения мыши в меню.
Синхронизация курсора с эмулируемой машиной несколько страдает. Можно сделать идеально, если брать из памяти координаты курсора - но это будет зависимо от драйвера.
UPDATE: Антивирус возбуждается на этот EXE. Вероятнее всего, ложно-положительное срабатывание, но удалил на всякий случай.
а где 113 релиз ? не могу скачать.
https://github.com/nzeemin/neonbtl/releases/download/preview-114/NEONBTL-preview-114.zip
Версия с экспериментальной поддержкой IDE HDD драйвера HZ от S_V_B.
Пока особо не тестировал.
Прикладываю к сообщению диск с работающим драйвером HZ.
Образ винчестера можно взять здесь: https://forum.pk-fpga.ru/viewtopic.php?f=15&t=6079 - архив Soyuz-Neon-IDE.zip файл PK11_16.img
P.S. На Virus Total 3 антивируса считают эмулятор вирусом, но я думаю что это false positive
https://www.virustotal.com/gui/file/f89e6636b942fb751f0745d73798cfda9206aea7dc918129cc a9f8f5a7d5c965/detection
С некоторым опозданием выкладываю версию 118 эмулятора.
В этой версии работает Covox.
Загружаемся с приложенной дискеты, вводим dmp delta.stm, переключаем каналы клавишами K1-K5.
Первый экспериментальный релиз NeonBTL Qt под Linux, в формате AppImage - https://github.com/nzeemin/neonbtl-qt/releases/tag/preview-38
Собиралось под Ubuntu 18.04, так что (по-видимому) должно работать под этой версией и выше.
AppImage это формат, в котором поставляется бинарник со всеми библиотеками, поэтому ничего дополнительно ставить не нужно - может только права на запуск файла дать.
Интересует работоспособность под различными дистрибутивами и версиями линукса - пишите.
Обновил rt11dsk -- https://zx-pk.ru/attachment.php?attachmentid=78657&d=1679831097
Добавлена опция /hd32, позволяет работать с образами винчестера с разделами в 32 МБ.
Например:
rt11dsk.exe hl /hd32 PK11_16.img — получить список разделов
rt11dsk.exe hpl /hd32 PK11_16.img 0 — получить список файлов 0-го раздела
Для тех кто использует Линукс — можно собрать из исходников: https://github.com/nzeemin/ukncbtl-utils/tree/master/rt11dsk
Начал делать веб-версию NeonBTL на базе WebAssembly, пока на уровне прототипа, почти ничего не умеет.
Будет жить здесь: https://nzeemin.github.io/neonbtl-wasm/index.html?run=1
Репо: https://github.com/nzeemin/neonbtl-wasm
Update: Размапил клавиатуру. Диски тоже работают.
NeonBTL preview 130
https://github.com/nzeemin/neonbtl/releases/tag/preview-130
В этой версии:
- Memory в отдадчике - режимы CPU/HALT/USER
- Команды File > Save State / Load State, состояние сжимается через LZ4
- Пара фиксов в маппинге клавиатуры
- Ключи командной строки и справка по ним
Ключи командной строки (см. Help > Command Line Help
Usage: NEONBTL [options]
Command line options:
/h /help
Show command line options (this box)
/autostart /autostarton
Start emulation on window open
/noautostart /autostartoff
Do not start emulation on window open
/debug /debugon /debugger
Switch to debug mode
/nodebug /debugoff
Switch off the debug mode
/sound /soundon
Turn sound on
/nosound /soundoff
Turn sound off
/diskN:filePath
Attach disk image, N=0..1
/hard:filePath
Attach hard disk image
- - - Updated - - -
Частично написано Руководство пользователя эмулятора:
https://github.com/nzeemin/neonbtl/blob/master/docs/user-manual-ru.md — русский
https://github.com/nzeemin/neonbtl/blob/master/docs/user-manual-en.md — английский
- Пара фиксов в маппинге клавиатуры
Надо ещё фикс с клавишей <Enter> на дополнительной клавиатуре, срабатывает как основная. Из-за этого в KED надо пользоваться экранной клавиатурой.
Надо ещё размапить запятую на дополнительной клавиатуре, клавишу Ч/^ и ФИКС.
UncleDim
07.08.2023, 21:59
он будет в единице в том случае, если он уже был в единичном состоянии или был перенос в него. В нулевом состоянии он останется, если он уже был в нулевом состоянии и не было переноса в него
т.е. просто 23-битный результат сложения с объединением двух старших битов по или, так?
т.е. просто 23-битный результат сложения с объединением двух старших битов по или, так?
Там адрес ОЗУ 22-битный (4 Мб). При сложении делается так, чтобы самый старший 21-й разряд случайно не очистился и не запортилось самое начало ОЗУ. Т.е. если он уже был установлен в регистре менеджера памяти, то при прибавлении смещения он так и остаётся установленным, даже если при сложении он должен быть очищен.
UncleDim
08.08.2023, 08:16
так и остаётся установленным, даже если при сложении он должен быть очищен
Это вроде как понятно, в этом случае вторая половина установленной "на самом верху" страницы отобразится ээээ... в середину, в самое начало третьего (если считать с единицы) мегабайта. Мне сам смысл операции сложения этого 12-го бита не понятен, оно чтобы что? просто затем, чтобы восьмикилобайтные страницы могли располагаться не на 8-, а на 4-килобайтных границах? От этого какой-то реальный бонус есть?
Мне сам смысл операции сложения этого 12-го бита не понятен, оно чтобы что? просто затем, чтобы восьмикилобайтные страницы могли располагаться не на 8-, а на 4-килобайтных границах? От этого какой-то реальный бонус есть?
Да, дискретность составляет 4 Кб. К тому же запросы ВПО при создании плоскости с таблицей ТАС требуют, чтобы смещение адреса видеостроки было меньше 010000.
И есть запросы выделения памяти, либо 8 Кб страницами, либо 4 Кб страницами.
UncleDim
09.08.2023, 22:35
дискретность составляет 4 Кб
ну т.е. в угоду совместимости, видимо какое-то наследие, так?
запросы ВПО при создании плоскости с таблицей ТАС требуют, чтобы смещение адреса видеостроки было меньше 010000.
речь о процессорном адресе или физическом? (по разрядности -о процессорном, ну нулей мало в начале)
я может много глупостей спрошу, опыт с pdp уровня "в школе была БКшка на информатике", в схему вникать тяжко (вот только даташит на эти видеоуказатели добыл, хоть что-то проясняется))
Машинка уж больно заинтересовала, видеоконтроллером конечно (но и удручила. бордюры, дискретность отрезков, вот это всё)
Она скорее эмуляторная конечно. Ну кто сейчас "в быту" нарисует в видимой области 52 мкс в строке? 300 строк? Всё ж обрежется нещадно..
ну т.е. в угоду совместимости, видимо какое-то наследие, так?
Да никакое не наследие. Запросы ВПО по обработке, такие как HBMOVE и WPRINT работают с описанием строк при выводе информации. Соответственно нужно, чтобы информация строки умещалась в одном сегменте. Если бы дискретность была равна 8 Кб, то строка могла начинаться в самом конце одного сегмента, а заканчиваться в другом. С дискретностью 4 Кб начало строки может быть в самом конце первой половины сегмента, а уж 4 Кб она вряд ли превысит. С этим и связано, чтобы строки в таблице ТАС начинались со смещения меньшим 010000.
- - - Добавлено - - -
речь о процессорном адресе или физическом? (по разрядности -о процессорном, ну нулей мало в начале)
В таблице ТАС при создании плоскости адрес состоит из двух половин. Старшая часть загружается в соответствующий регистр URx при обработке, младшая часть используется, как смещение в сегменте. Но когда окно выводится на экран, то в таблицу отрезков для видеоадаптера записывается уже физический адрес делённый на четыре. Также физический ОЗУ адрес получается при сложении соответствующего регистра менеджера памяти и адреса с процессора.
Выложил версию 136 эмулятора.
Скачать: https://github.com/nzeemin/neonbtl/releases/download/preview-136/NEONBTL-preview-136.zip
Что нового:
- Сделана запись в память по маске
- DebugView: показываем PC и SP на карте памяти
- MemoryView: переключение режимов octal/hex
Выложил версию 165 эмулятора.
Скачать: https://github.com/nzeemin/neonbtl/releases/download/preview-165/NEONBTL-preview-165.zip
До этого была промежуточная версия 155 - экспериментальная версия с более правильной работой с банками памяти.
Новое в версии 165:
- Memory view: при переходе на адрес за экраном, целевой адрес становится вверху окна
- Отладчик: точки останова теперь ставятся с учётом режима HALT/USER
В консоли команды bXXXXXX и bcXXXXXX ставят точку останова с учётом текущего режима H/U процессора.
Плюс полявились новые команды: bUXXXXXX / bHXXXXXX и bcUXXXXXX / bcHXXXXXX
При останове на точке останова в сообщении также показывается режим H/U.
Выложил версию 170 эмулятора.
Скачать: https://github.com/nzeemin/neonbtl/releases/download/preview-170/NEONBTL-preview-170.zip
Новое в версии 170:
- Определяем разницу между Enter и NumPad Enter
- Стабилизирована скорость эмуляции, добавлены скорости 10% и 400%
- Ограничение скорости мыши, когда она за пределами экрана, не двигаем мышь если она за пределами экрана и не двигается
nzeemin, скажи пожалуйста, а будет обновление эмуля mk90btl ?
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot