Помощь - Поиск - Пользователи - Календарь
Полная версия: эмулятор БК-0011М
MAXIOL > Техника > DEC hardware / software > БК 0010 / 11 / 11M
kazamul
Помню, что в свое время было много отличных эмуляторов под Windows.
У меня Mac, поэтому запустить их нет возможности.
Появилось время, решил написать свой эмулятор на Java.
БК-0010 эмулируется нормально, а с БК-0011М пока проблемы.
Если кто-то сможет глянуть и подсказать, что не так — буду очень признателен.
Могу при необходимости выложить весь код на GitHub.
kazamul
в принципе проблема вот в чем - я загружаю конфигурацию БК-0011М с BASIC
все начинает работать нормально

пишется
Монитор БК-0011 В1.8
бежит снизу вверх - а потом все заканчивается в следующем бесконечном цикле - вот что дает debug

кто-нибудь может объяснить что здесь происходит - исходников не нашел - disassemble BOS.rom не дает нормального понимания

Код
PC=0147454: BIT #040000, 040454 (opcode=0032767)
PC=0147462: BEQ 0147544 (opcode=0001427)
PC=0147542: CLR (R2) (opcode=0005012)
PC=0147544: SEC (opcode=0000261)
PC=0147546: RTS R7 (opcode=0000207)
PC=0142460: BCS 0142502 (opcode=0103407)
PC=0142500: INC @#0152 (opcode=0005237)
PC=0142504: CLR @#0156 (opcode=0005037)
PC=0142510: MOV (R6)+, R0 (opcode=0012600)
PC=0142512: MOV (R6)+, R1 (opcode=0012601)
PC=0142514: MOV (R6)+, R2 (opcode=0012602)
PC=0142516: MOV (R6)+, R3 (opcode=0012603)
PC=0142520: MOV (R6)+, R4 (opcode=0012604)
PC=0142522: MOV (R6)+, R5 (opcode=0012605)
PC=0142524: MOV 040436, @#04 (opcode=0016737)
PC=0142532: MOV 040434, R6 (opcode=0016706)
PC=0142536: MOV @#0114, @#0177716 (opcode=0013737)
PC=0142544: MOV @#0152, (R6) (opcode=0013716)
PC=0142550: MOV @#0150, -(R6) (opcode=0013746)
PC=0142554: BIT #04, @#0156 (opcode=0032737)
PC=0142562: BNE 0142574 (opcode=0001003)
PC=0142564: TST @#0177716 (opcode=0005737)
PC=0142570: RTT (opcode=0000006)
PC=0147576: BCC 0147616 (opcode=0103006)
PC=0147600: MTPS #00 (opcode=0106427)
PC=0147604: NOP (opcode=0000240)
PC=0147606: MTPS #0340 (opcode=0106427)
PC=0147612: BR 0147574 (opcode=0000767)
PC=0147572: JSR R7, 0147410 (opcode=0004767)
PC=0147406: JSR R7, 0142360 (opcode=0004767)
PC=0142356: CLC (opcode=0000241)
PC=0142360: MFPS @#0152 (opcode=0106737)
PC=0142364: MTPS #0340 (opcode=0106427)
PC=0142370: MOV (R6)+, @#0156 (opcode=0012637)
PC=0142374: MOV (R6), @#0150 (opcode=0011637)
PC=0142400: MOV #054002, @#0177716 (opcode=0012737)
PC=0142406: MOV R6, 040434 (opcode=0010667)
PC=0142412: TST @#0177716 (opcode=0005737)
PC=0142416: MOV @#04, 040434 (opcode=0013767)
PC=0142424: MOV #0142602, @#04 (opcode=0012737)
PC=0142432: MOV #044512, R6 (opcode=0012706)
PC=0142436: MOV R5, -(R6) (opcode=0010546)
PC=0142440: MOV R4, -(R6) (opcode=0010446)
PC=0142442: MOV R3, -(R6) (opcode=0010346)
PC=0142444: MOV R2, -(R6) (opcode=0010246)
PC=0142446: MOV R1, -(R6) (opcode=0010146)
PC=0142450: MOV R0, -(R6) (opcode=0010046)
PC=0142452: MOV R6, R2 (opcode=0010602)
PC=0142454: JSR R7, @0160 (opcode=0004777)
PC=0147412: MOV #041714, R5 (opcode=0012705)
PC=0147416: TST (R5)+ (opcode=0005725)
PC=0147420: BEQ 0147456 (opcode=0001415)
PC=0147454: BIT #040000, 040454 (opcode=0032767)
SuperMax
надо более детальное описание
но основное на что надо смотреть - на сколько корректно эмулируются регистры внешних устройств - тут есть отличия от БК-0010
kazamul
Цитата(SuperMax @ 6.2.2026, 11:16) *

надо более детальное описание
но основное на что надо смотреть - на сколько корректно эмулируются регистры внешних устройств - тут есть отличия от БК-0010

да вроде как корректно - я по крайней мере ничего не нашел
вот что мне удалось понять

1. Ядро цикла ожидания (Idle Loop)

Этот участок кода — «сердце» простоя. Процессор разрешает прерывания, ждет одну инструкцию и снова запрещает их, чтобы проверить флаги.

Код
PC=0147600: MTPS #00    ; Разрешить прерывания (Priority 0). Здесь может сработать таймер или клавиатура.
PC=0147604: NOP         ; Пустая операция. Дает "окно" для срабатывания прерывания.
PC=0147606: MTPS #0340  ; Запретить прерывания (Priority 7). Начало критической секции.
PC=0147612: BR 0147574  ; Переход на проверку диспетчера.


2. Вызов диспетчера задач (Polling)

Система прыгает в подпрограмму, чтобы узнать: «Есть ли работа?»

Код
PC=0147572: JSR R7, 0147410 ; Вызов подпрограммы проверки очереди задач.
...
PC=0147412: MOV #041714, R5 ; R5 указывает на структуру данных (очередь задач или буфер).
PC=0147416: TST (R5)+       ; Проверка: есть ли задачи в очереди?
PC=0147420: BEQ 0147456     ; Если 0 (пусто), идем проверять системные флаги.


3. Проверка системных флагов
Здесь проверяется конкретный бит в системной переменной (вероятно, статус клавиатуры или запрос на переключение задач).

Код
PC=0147454: BIT #040000, 040454; Проверка бита 14 в ячейке 040454.
                               ; В БК-0011М это часто связано с флагами консоли или драйверов.
PC=0147462: BEQ 0147544        ; Если бит не установлен (событий нет), уходим на выход.


4. Возврат с неудачей (Nothing to do)
Так как задач нет и флаги чисты, подпрограмма возвращает управление с установленным флагом переноса (CARRY), сигнализируя: «Работы нет».

Код
PC=0147544: SEC     ; Set Carry (Установить флаг C).
PC=0147546: RTS R7  ; Возврат из подпрограммы.


5. Переключение контекста (Overlay/Paging)

БК-0011М имеет страничную организацию памяти. Код по адресу 0142xxx — это системный код (скорее всего, в ПЗУ или скрытой странице ОЗУ), который управляет переключением страниц.

Видно активное взаимодействие с регистром управления памятью:

Код
PC=0142536: MOV @#0114, @#0177716; Восстановление страницы памяти (запись в регистр управления страницами 177716).
...
PC=0142400: MOV #054002, @#0177716; Включение системной страницы памяти (054002 — управляющее слово).


Что происходит в блоке 0142xxx:
  1. Сохранение регистров: MOV R0...R5, -(R6) — все регистры сохраняются в стек.
  2. Переключение страницы: Система подменяет кусок памяти, чтобы выполнить код ядра или драйвера.
  3. Выполнение системного вызова: JSR R7, @0160 (вектор EMT/Trap).
  4. Восстановление: Так как диспетчер вернул SEC (работы нет), система восстанавливает старую страницу памяти (MOV @#0114, @#0177716), восстанавливает регистры из стека и делает RTT (Return From Trap).


Итог
холостой ход (Idle Loop) БК-0011М.
  1. Процессор открывает прерывания (NOP).
  2. Если прерываний нет, он вызывает тяжелую процедуру диспетчера.
  3. Диспетчер сохраняет контекст, переключает страницы памяти (177716), проверяет ячейки 041714 и 040454.
  4. Ничего не находит.
  5. Восстанавливает контекст и страницу памяти.
  6. Возвращается к пункту 1.

kazamul
Цитата(SuperMax @ 6.2.2026, 11:16) *

надо более детальное описание
но основное на что надо смотреть - на сколько корректно эмулируются регистры внешних устройств - тут есть отличия от БК-0010


Вероятное предназначение 041714 и 040454

1. Адрес 041714 (Очередь задач / Буфер клавиатуры)
В трассировке мы видим:
Код
MOV #041714, R5
TST (R5)+      ; Проверка: не ноль ли там?


Это классическая проверка кольцевого буфера ввода или очереди сообщений.
  1. Кто туда пишет? Скорее всего, прерывание клавиатуры (вектор 060). Когда ты нажимаешь клавишу, происходит аппаратное прерывание. Процессор останавливает этот бесконечный цикл, переходит в обработчик прерывания клавиатуры, считывает код клавиши из регистра данных (177562) и кладет его в буфер, на который указывает или который начинается с 041714.
  2. Что происходит в цикле? Диспетчер проверяет: «Появились ли новые символы?». Если TST показывает ноль — буфер пуст. Если не ноль — система забирает символ и начинает его обрабатывать (выводит на экран, передает программе и т.д.).

2. Адрес 040454 (Системные флаги / Статус)
Код проверяет конкретный бит:
Код
BIT #040000, 040454; Бит 14 (восьмеричное 040000 = бинарное 0100 0000 0000 0000)


Это Слово Состояния Системы (System Status Word). В БК-0011М системные переменные часто лежат в области 04xxxx, когда подключена системная страница.

Кто туда пишет? Сюда пишут асинхронные события (прерывания), которые происходят «за кадром»:
  1. Сетевой таймер (50 Гц, вектор 100): Каждые 20 мс таймер обновляет счетчики времени и может выставлять флаги (например, для мигания курсора или повтора клавиши).
  2. Кнопка СТОП: Нажатие кнопки СТОП часто устанавливает отдельный флаг, чтобы система знала, что нужно прервать текущий процесс. Бит 14 (040000) — очень "высокий" бит, часто используемый для флагов типа "Запрос на прерывание программы" или "Ошибка ввода-вывода".
  3. Драйвер дисковода: Если была запущена операция чтения/записи, драйвер по завершении (по прерыванию) выставляет флаг "Готово".
kazamul
могу подтвердить что 041714 это кольцевой буффер клавиатуры - но кто и что может писать по адресу 040454 - не могу понять
kazamul
у меня есть подозрение что я не правильно делаю сборку ROM
есть где-нибудь конкретная документация что где должно располагаться в зависимости от конфигурации БК-0011М
например ничего не подключено
140000 - БОС + EXT
160000 - ????
где должен располагаться бейсик? там есть 3 файла по 8кб
100000 - basic1 + ????
100000 - basic2 + basic3

подключен дисковод FDD
140000 - BOS + EXT
160000 - FDD

и т/д/
вообще ничего не могу найти
SuperMax
Цитата(kazamul @ 9.2.2026, 10:02) *
у меня есть подозрение что я не правильно делаю сборку ROM
есть где-нибудь конкретная документация что где должно располагаться в зависимости от конфигурации БК-0011М
например ничего не подключено
140000 - БОС + EXT
160000 - ????
где должен располагаться бейсик? там есть 3 файла по 8кб
100000 - basic1 + ????
100000 - basic2 + basic3

подключен дисковод FDD
140000 - BOS + EXT
160000 - FDD

и т/д/
вообще ничего не могу найти


вот к примеру документация
https://forum.maxiol.com/index.php?showtopic=5068

на 160000 всегда ПЗУ FDD (за исключением AZБК, там динамическое управление ПЗУ)
kazamul
спасибо

ссылка на 11 а не на 11М
SuperMax
Цитата(kazamul @ 11.2.2026, 7:33) *
спасибо

ссылка на 11 а не на 11М

11М в той же теме, смотрите внимательно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2026 Invision Power Services, Inc.