Помощь - Поиск - Пользователи - Календарь
Полная версия: эмулятор БК-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М в той же теме, смотрите внимательно
kazamul
ну что - небольшое обновление - уже почти все работает
диск читается/МТСД - тесты проходят кроче клавиатуры
диск читается - но не пишется biggrin.gif
проблемы с клавиатурой

если кто хочет/может помочь - могу выложить все куда-нибудь (github или еще куда)
SuperMax
Цитата(kazamul @ 22.2.2026, 11:33) *
ну что - небольшое обновление - уже почти все работает
диск читается/МТСД - тесты проходят кроче клавиатуры
диск читается - но не пишется biggrin.gif
проблемы с клавиатурой

если кто хочет/может помочь - могу выложить все куда-нибудь (github или еще куда)

супер!
могу предоставить поддомен на https://pdp-11.ru/ и соответственно бесплатный хостинг под проект
kazamul
Цитата(SuperMax @ 23.2.2026, 0:44) *

супер!
могу предоставить поддомен на https://pdp-11.ru/ и соответственно бесплатный хостинг под проект


спасибо - но я просто пока могу WIP (work in progress) код выкладывать - на самом деле клавиатуру починил - а вот с диском проблемы - читает нормально но каждый раз когда пишет все портит - я уже об стену убился не понимаю как это должно работать на самом деле
kazamul
диск вроде тоже починил - andos и mkdos грузятся нормально - читают и пишут на диск тоже нормально
вот с rt-11 какие-то проблемы - там что другой формат диска?
*.dsk отличается от *.img?
SuperMax
Цитата(kazamul @ 25.2.2026, 11:24) *
диск вроде тоже починил - andos и mkdos грузятся нормально - читают и пишут на диск тоже нормально
вот с rt-11 какие-то проблемы - там что другой формат диска?
*.dsk отличается от *.img?

нет не отличаются
kazamul
а тогда такой вопрос - что в БК11М происходит когда пытаются писать в ROM?

у меня у эмуляторе вижу вот такие логи:
Код
02:13:36.272 TRACE Kbd177660 - [KBD177660] write 0000000 (masked 0000000)
02:13:36.272 DEBUG KeyboardDevice - [KBDDEV] IE enabled, triggering pending interrupt
02:13:38.597 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 0
02:13:39.770 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 0
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0140000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0144000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0150000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0154000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0160000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0164000] BOS/EXT ROM write error
02:13:41.704 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 1
02:13:41.755 INFO  FloppyDrive - [FloppyDrive] Preparing track 1 side 1
02:13:41.799 INFO  FloppyDrive - [FloppyDrive] Preparing track 2 side 1
02:13:41.847 INFO  FloppyDrive - [FloppyDrive] Preparing track 3 side 1
02:13:41.901 INFO  FloppyDrive - [FloppyDrive] Preparing track 4 side 1
02:13:41.956 INFO  FloppyDrive - [FloppyDrive] Preparing track 5 side 1
02:13:42.910 ERROR PagedMemoryStrategy - [MEM 0165724] BOS/EXT ROM write error
02:13:42.910 ERROR PagedMemoryStrategy - [MEM 0165726] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165730] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165732] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165734] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165736] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165740] BOS/EXT ROM write error
02:13:42.912 ERROR PagedMemoryStrategy - [MEM 0165742] BOS/EXT ROM write error
и так далее


в конце получаю
Код
?Boot-U-Conflicting SYSGEN options

что там вообще происходит?
SuperMax
Цитата(kazamul @ 28.2.2026, 14:18) *
а тогда такой вопрос - что в БК11М происходит когда пытаются писать в ROM?

у меня у эмуляторе вижу вот такие логи:
Код
02:13:36.272 TRACE Kbd177660 - [KBD177660] write 0000000 (masked 0000000)
02:13:36.272 DEBUG KeyboardDevice - [KBDDEV] IE enabled, triggering pending interrupt
02:13:38.597 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 0
02:13:39.770 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 0
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0140000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0144000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0150000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0154000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0160000] BOS/EXT ROM write error
02:13:40.504 ERROR PagedMemoryStrategy - [MEM 0164000] BOS/EXT ROM write error
02:13:41.704 INFO  FloppyDrive - [FloppyDrive] Preparing track 0 side 1
02:13:41.755 INFO  FloppyDrive - [FloppyDrive] Preparing track 1 side 1
02:13:41.799 INFO  FloppyDrive - [FloppyDrive] Preparing track 2 side 1
02:13:41.847 INFO  FloppyDrive - [FloppyDrive] Preparing track 3 side 1
02:13:41.901 INFO  FloppyDrive - [FloppyDrive] Preparing track 4 side 1
02:13:41.956 INFO  FloppyDrive - [FloppyDrive] Preparing track 5 side 1
02:13:42.910 ERROR PagedMemoryStrategy - [MEM 0165724] BOS/EXT ROM write error
02:13:42.910 ERROR PagedMemoryStrategy - [MEM 0165726] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165730] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165732] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165734] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165736] BOS/EXT ROM write error
02:13:42.911 ERROR PagedMemoryStrategy - [MEM 0165740] BOS/EXT ROM write error
02:13:42.912 ERROR PagedMemoryStrategy - [MEM 0165742] BOS/EXT ROM write error
и так далее


в конце получаю
Код
?Boot-U-Conflicting SYSGEN options

что там вообще происходит?


важный момент - обычная RT11 на БКшке не пойдет - нужна патченая под БК11М - см мои архивы и образы для AZБК
kazamul
Цитата(SuperMax @ 28.2.2026, 11:42) *

важный момент - обычная RT11 на БКшке не пойдет - нужна патченая под БК11М - см мои архивы и образы для AZБК

да я знаю - ее и запускаю
kazamul
Цитата(SuperMax @ 28.2.2026, 11:42) *

важный момент - обычная RT11 на БКшке не пойдет - нужна патченая под БК11М - см мои архивы и образы для AZБК

добавил прерывание по вектору 4-ре при обращении на запись в ROM
стало лучше но не намного
теперь вижу
Код
BY V3.3 Саяпин А.А.+Лобанов А.Ю. (C) 1994

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