IPB

Здравствуйте, гость ( Вход | Регистрация )

> эмулятор БК-0011М, нужна помощь
kazamul
сообщение 6.2.2026, 11:34
Сообщение #1


Новичок
*

Группа: Участники
Сообщений: 9
Регистрация: 22.6.2016
Пользователь №: 34 773



Помню, что в свое время было много отличных эмуляторов под Windows.
У меня Mac, поэтому запустить их нет возможности.
Появилось время, решил написать свой эмулятор на Java.
БК-0010 эмулируется нормально, а с БК-0011М пока проблемы.
Если кто-то сможет глянуть и подсказать, что не так — буду очень признателен.
Могу при необходимости выложить весь код на GitHub.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
SuperMax
сообщение 6.2.2026, 23:16
Сообщение #2


Администратор
*****

Группа: Root Admin
Сообщений: 6 365
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



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


--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
kazamul
сообщение 7.2.2026, 7:43
Сообщение #3


Новичок
*

Группа: Участники
Сообщений: 9
Регистрация: 22.6.2016
Пользователь №: 34 773



Цитата(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.

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14.2.2026, 15:06