Немига

Материал из Emuverse
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Немига — советский 16-разрядный персональный компьютер, выпускался на белорусских предприятиях с 1989 года. Предназначался для поставки в учебные заведения в составе КУВТ. По системе команд совместим с PDP-11 и его советскими клонами — Электроника-60, ДВК.

Процессор машины реализован на наборе микросхем серии 588 — эти микросхемы выпускались на минском ПО «Интеграл».

Существовало как минимум три версии Немиги, отличающихся схемотехникой и ПЗУ: 3.03, 4.05, 4.06.

Пульт

При запуске машины начинается загрузка из сети, но если она не удалась, мы попадаем в пультовый режим с приглашением ПУЛЬТ>.

Пультовый режим воспринимает команды; каждая команда это либо символ, либо 8-ричное число и символ.

Полный набор команд пульта для версии 3.03:

  • S — просмотр регистров
  • / либо 000000/ — просмотр ячеек памяти, c указанием адреса или без; ПС — след адрес, ^ (клавиша Ч) — пред адрес, ВВОД — выход
  • G — продолжить выполнение программы, 10000G — продолжить с заданного адреса
  • D либо 1D — загрузка с диска MD, с указанием номера диска 0..7 либо без
  • X либо 1X — загрузка с диска DX, с указанием номера диска 0..1 либо без (только в прошивке 3.03)
  • N — загрузка из сети, реально просто переход к процедуре холодного старта
  • УПР+L — очистка экрана

В любой момент выполнение программы можно прервать нажатием УПР+ФСД/СТОП, система переходит в пультовый режим. При этом содержимое всех регистров сохраняется, их можно просмотреть командой 'S'. Команда '/' позволяет просмотреть/изменить отдельные ячейки памяти. А команда 'G' восстанавливает регистры и продолжает выполнение прерванной программы с того же места.

Процессор

Процессор реализован на микросхемах серии 588:

  • КР588ВС2 (D1) — арифметическое устройство (АУ), управляется 12-битовыми микрокомандами из КР588ВУ2-0001, −0002, −0004
  • КР588ВУ2 (D2..D6) — управляющая память (УП) — микропрограммы для D1, D17, D18
  • КР588ВГ1 (D18) — системный контроллер (СК) — обеспечивает внутренний интерфейс процессора и его связь с Q-шиной, управляется микрокодом из КР588ВУ2-0005
  • К588ВР2 (D17) — арифметический умножитель 16×16 (УМ), управляется 5-битовыми микрокомандами из КР588ВУ2-0006 (D4); умножение и деление задействует память по адресам 170000-170005
  • КР588ВА1 (D21, D24) — магистральный приёмо-передатчик (МПП)
  • КР588ВГ2 — контроллер запоминающего устройства (КЗУ)

Начальный пуск: сброс устройств, затем чтение PC и PSW из 160006 и 160010, запуск в режиме HALT.

Система команд

Процессор реализует систему команд компьютера Электроника-60 (ОСТ 11 305.909-82), за исключением команд FIS (операций с плавающей запятой). Есть команды расширенной арифметики (MUL, DIV, ASH, ASHC), реализуются микрокодом в D4 и умножителем D17. Набор команд описан в ТО и в справочниках по БИС сериии КР588.

Режимы USER и HALT

Процессор поддерживает работу в двух режимах — USER и HALT.

Ситуации перехода в режим HALT:

  • появление сигнала СБРОС (INIT)
  • запрос на обслуживание локальной сети
  • обращение к области памяти 177560-177566 (регистры системной консоли)
  • нажатие клавиши на клавиатуре
  • выполнение команды HALT

В режиме HALT область ОЗУ 177600-177777 замещается ОЗУ из другой области (предположительно, эти ячейки памяти лежат «под» системным ПЗУ и поэтому не используются обычным образом).

Старший байт регистра 170006 — это регистр фиксации HALT-запросов, отдельные его биты отвечают за различные причины вызова HALT-прерывания. Младший байт регистра 170006 — регистр данных клавиатуры.

NOTE: В документации не описан механизм возврата из режима HALT в USER. По коду прошивки ПЗУ видно, что к этому приводит запись байта 0 по адресу 170006; запись 3 в 170006 приводит к переходу из USER в HALT.

Регистр 170006
 170006  Регистр фиксации HALT и данных клавиатуры
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─0┴─0┼──┴──┴──┴──┴──┴──┴──┴──┤
   │  Н1 │  Н3 │  │      └── Данные клавиатуры ──┘
 СБРОС   Н2    Н4 Клавиатура

Младший байт регистра это байт с клавиатуры (регистр D27); если установлен бит 10, то символ готов для чтения.
Старший байт регистра это регистр фиксации HALT (D28, биты регистра идут в обратном порядке) — определяет причину появления прерывания HALT.

  • бит 15 — признак канального сигнала СБРОС;
  • бит 14 — сигнал Н1 — ??;
  • бит 13 — сигнал Н2 — обращение к регистру данных клавиатуры;
  • бит 12 — сигнал Н3 — ??;
  • бит 11 — сигнал Н4 от платы адаптера локальной сети;
  • бит 10 — сигнал готовности очередного байта с клавиатуры, поступает с триггера D37.2;
  • биты 8,9 заземлены = 0.

NOTE: В коде прошивки ПЗУ регистр 170006 также используют на запись, записывая в него байтовое значение 3 для перехода в HALT и значение 0 для возврата в USER. По записи в 170006 сбрасывается регистр D27 (видно по схеме).

Регистры системной консоли

При разработке Немиги предусмотрели совместимость с «Электроника-60» по адресам и работе регистров системной консоли — это регистры 177560/177562 (адрес/данные клавиатуры) и 177564/177566 (адрес/данные терминала). Это просто ячейки ОЗУ, но обращение к ним приводит к вызову прерывания HALT с установкой соответствующих флагов в регистре 177006. Программа обработки прерывания HALT анализирует флаги и эмулирует работу регистров консоли.

  177560  Регистр состояния клавиатуры
  177564  Регистр состояния терминала
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴──┴──┴──┴──┴──┴──┘
                           │  └─ Разрешение прерывания: 1 = разрешено
                           └──── Готовность к приёму/передаче: 0 = готов
Прерывания

Прерывания по описанию КР588ВГ1 (D18), в порядке убывания приоритета, использование определено по схеме:

Code Прерывание pin Использование
1010 Режим начального пуска / двойная ошибка канала
1110 Прерывание по T-разряду / ошибка канала
1111 Пропадание питания / ошибка канала 30 НЕ используется
0111 HLT — Прерывание по входу ОСТАНОВ / ошибка канала 36 используется
0101 INR0 — Требование прерывания от ВУ 31 НЕ используется
0100 INR1 — Требование прерывания от ВУ 34 НЕ используется
0110 INR2 — Требование прерывания от ВУ 33 используется
0010 INR3 — Требование прерывания от ВУ 32 используется
0011 INRT — Прерывание по внешнему событию 35 используется
0001 RQ — Запрос прерывания от ВУ 28 используется

Вектора прерываний:

  • 160002 — сигнал/команда HALT
  • 160006 — прерывание начального пуска
  • 000004 — ?? ошибка обращения к каналу?
  • 000010 — ?? резерный код команды?
  • 000014 — ?? прерывание по T-разряду или команда BPT
  • 000020 — команда IOT
  • 000030 — команда EMT
  • 000034 — команда TRAP
  • ?? — INR0
  • ?? — INR1
  • ?? — прерывание INRT/EVNT

Память

  • Адреса 000000-137777 — ОЗУ
  • Адреса 140000-157777 — зарезервированы под дополнительные 8 КБ ПЗУ (D11-D14)
  • Адреса 160000-167777 — системное ПЗУ, 4 КБ
  • Адреса 170000-177777 — ОЗУ и порты
    • Адреса 177600-177777 — окно памяти, включаемое только в режиме HALT

Процессору непосредственно доступно 64 КБ памяти. Помимо этого, существует возможность «косвенного» обращения ко всем 128 КБ ОЗУ, через регистры косвенной адресации 177570 (адрес) и 177572 (данные). Адрес косвенной адресации получается сдвигом на один разряд вниз обычного адреса «прямой» адресации.

  Адрес                     Косв. адрес
 000000 ┌────────────────────┐ 000000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │       О З У        │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
 140000 ├────────────────────┤ 060000
        │ Дополнит. ПЗУ 8К   │
        │                    │
 160000 ├────────────────────┤ 070000
        │ Системное ПЗУ 4К   │
 170000 ├────────────────────┤
        │ ОЗУ и порты        │
 200000 ╞════════════════════╡ 100000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        ├────────────────────┤ 140000
        │                    │
        │                    │
        │                    │
        │     Э К Р А Н      │
        │                    │
        │        32К         │
        │                    │
        │                    │
        │                    │
        └────────────────────┘ 200000

В аппаратной версии 4.x появилась возможность включить проецирование 32К экрана на нижние 32К обычной памяти (этим управляет новый регистр 177574, бит 0) — сделано это, очевидно, для ускорения вывода на экран.

Регистры (порты)

170006 Регистр данных клавиатуры (байт 170006),
регистр фиксации HALT-запросов (байт 170007)
170010 Адаптер
локальной сети
состояние
170012 данные
170020 Таймер и звук состояние программируемого таймера
170022 первый счётчик
170024 второй счётчик
170026 включение звука
170030 управляющее слово выбора громкости и октавы
170032 отключение звука
177100 Контроллер
дисковода MD
состояние
177102 данные
177104 управление
177106 таймер
177170* Контроллер
дисковода DX*
состояние
177172* данные
177514 Устройство
сопряжения
состояние параллельного порта
177516 данные параллельного порта
177560 Регистры
системной консоли
состояние клавиатуры
177562 данные клавиатуры
177564 состояние терминала
177566 данные терминала
177570 Косвенный доступ
к памяти
данные
177572 адрес
177574** включение маппинга экрана на нижнюю память

* — код загрузки с дисковода формата DX обнаружен в прошивке версии 3.03; для загрузки с него используется команда «X».
** — аппаратная версия 4.x

Видео

Видео-контроллер формирует растр размером 512×312 точек, в котором «полезной» площадью является блок 512×256 точек. Экран хранится в верхней части памяти, доступной по косвенному адресу 140000, занимает 32 КБ. Каждые 8 точек растра занимают 2 соседних байта — каждый байт это отдельный битплан, то есть каждая точка это два бита, лежащие в соседних байтах, что даёт 4 градации яркости на точку.

┌─ 512 x 312 ────────────────────────┐
│                                    │
│                                    │
┌────────────────────────────────────┐
│ 512 x 256                          │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
└────────────────────────────────────┘
│                                    │
│                                    │
└────────────────────────────────────┘

Знакогенератор содержит символы размером 8×8 точек, при выводе текста между строками оставляют место высотой в два пиксела. Таким образом экран используется как текстовый в 25 строк.

Клавиатура

Раскладка клавиатуры:

                        ( )         ( )     ( )     ( )
                        РУС         ВЕРХ    ЛАТ     ЦИФ
 ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐       ┌───┬───┬───┐
 │Ф1 │Ф2 │ │Клю│ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ~ │<─ │       │ЦИФ│СТП│ ─ │
 ├───┼───┤ └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐     ├───┼───┼───┤
 │Ф3 │Ф4 │   │   │ Й │ Ц │ У │ К │ Е │ Н │ Г │ Ш │ Щ │ З │ Х │ : │ Ъ │ ПС│     │ 7 │ 8 │ 9 │
 ├───┼───┤   └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐   ├───┼───┼───┤
 │Ф5 │Ф6 │     │УПР│ Ф │ Ы │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э │ . │ Ё │ВВО│   │ 4 │ 5 │ 6 │
 ├───┼───┤     └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐ ├───┼───┼───┤
 │Ф7 │Ф8 │       │   │ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б │ Ю │ , │ / │ _ │   │ФПБ│ │ 1 │ 2 │ 3 │
 ├───┼───┤   ┌───┼───┼───┼───┴───┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┘ ├───┼───┼───┤
 │Ф9 │Ф10│   │РУС│Р/Л│АЛТ│                               │Р/Л│ЛАТ│ ЗБ│ДОП│     │ 0 │ . │ + │
 └───┴───┘   └───┴───┴───┴───────────────────────────────┴───┴───┴───┴───┘     └───┴───┴───┘

Клавиатура формирует 8-разрядный код клавиши (КОИ-8Р) и передаёт его в процессорный блок по последовательному каналу. Байт данных формируется в регистре D28 и затем передаётся в регистр D27.

Текущие режимы хранятся в блоке клавиатуры и не могут быть установлены извне. При включении установлены режимы: ЛАТ, ВЕРХ, ЦИФ.

Все клавиши кроме служебных составляют матрицу 8×12 контактов, «адрес» каждой клавиши выражается 7-битным значением (3 бита на номер места, 4 бита на номер строки). ПЗУ блока клавиатуры (D17) объёмом 2048 байт содержит 16 блоков по 128 байт — каждый блок соответствует одной из 16-ти комбинаций режимов. Код символа, соответствующий нажатой клавише, выбирается по адресу клавиши, из блока, определяемого текущим режимом.

Автоповтор срабатывает через 1 секунду, с частотой 15 Гц.

Дисковод

Дисковод формата MD, с кодированием FM (в ТО называется модель TEAC FD-55FV-003). Похож на MX, но использует побайтовую передачу данных. Каждый логический диск занимает только одну сторону физического диска, MD0: и MD1: это первый физический диск, MD2: и MD3: это второй.

Ёмкость диска 459 КБ — 2 стороны по 80 дорожек, сектора по 128 байт, 23 сектора (или меньше) на дорожку. Диск вращается со скоростью 300 оборотов в минуту = 5 оборотов в секунду. Скорость обмена данными — 125 килобит в секунду (FM) = 125000 бит в секунду = 15625 байт в секунду = 3125 за оборот.

Регистры
  177100  Регистр состояния КНГМД (R/W)
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴──┴─┬┴─┬┴──┴─┬┘
                       TR ─┘  │  │     │ INDEX  └─ RELOAD (R) / RUN/STEP (W)
                   LOST-DATA ─┘  │     └──── TR00/WRPRT
                               OP-FAILED   

  177102  Регистр данных КНГМД (R/W)
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┤
                         └──────── Данные ───────┘

                                      
  177104  Регистр управления КНГМД (W)                 Операция  5  4
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐             ┴──┴──┴ 
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│               0  0  ЧТЕНИЕ дорожки
 └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘               1  0  ЗАПИСЬ дорожки
                       Операция ─┴──┘  │  │  └──┴─ Привод        0  1  ШАГ НАЗАД  от центра диска
                                    Мотор └─ Поверхность         1  1  ШАГ ВПЕРЕД  к центру диска


  177106  Регистр таймера КНГМД (R/W)
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─┬┘
                                                └─ Пуск (W) / состояние (R)

Контроллер дисковода управляется на основе операций. Операция выполняется в два шага: (1) подготовка операции установкой в регистре управления битов операции и включения мотора; (2) запуск операции записью «1» в 0-й бит регистра состояния.

Структура дорожки
Track Header		10b
  0343 Marker		1b
  Track number		1b
  023 Sectors on Track	1b
  0 ??			1b
  First Sector		2b
  0xff			1b
  0			1b
  Checksum		2b
Sector			130b
  Data			128b
  Checksum		2b
...

Таймер и звук

Схема таймера построен на микросхеме таймера 588ВИ1. Микросхема имеет два независимых 16-разрядных счётчика.

Таймер 1 — входная частота 4 МГц, задержка задаётся в регистре 170022. Плюс для этого таймера есть делитель на степени двойки, задаваемый битами 0..2 регистра 170030 — это «октава». Так, например, для получения ноты A4 («ля» первой октавы, 440 Гц) мы задаём октаву 4 и задержку 1136, получаем: 4000000 / 2/2/2 / 1136 ~= 440.14 Гц

Таймер 2 — на 50 Гц, задержка задаётся в регистре 170024. Используется для контроля длительности ноты.

  170020  Регистр состояния программируемого таймера
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
  Фикс прерывания 2 ─┘  │  │  │  │  │  │  │  │  └─ ??
     Фикс прерывания 1 ─┘  │  │  │  │  │  │  └ Режим работы 1-го счётчика
          Блокировка ЗПР2 ─┘  │  │  │  └──┴─ Режим пуска 1-го счётчика
             Блокировка ЗПР1 ─┘  │  │  0  1  блокировка счётчика
                                 │  │  1  0  запуск по CO1
                                 │  │  1  1  запуск по C1
                                 └──┴─ Режим пуска 2-го счётчика
                                 0  1  блокировка счётчика
                                 1  0  запуск по CO2
                                 1  1  запуск по C2

Громкость 0..3 задаётся битами 4..3 регистра 170030.

  170030  Регистр октавы и громкости
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┘
                                    │  │  └──┴──┴─ Октава 1..7
                                    └──┴─ Громкость 0..3

Обращение к 170026 — включает звук. Обращение к 170032 — переключает состояние звука вкл/выкл. При этом таймер работает независимо от того, включен ли звук. Судя по схеме, звук также выключается по сигналу RESET, либо по окончанию счёта таймера 2 (сигнал ЗПР2).

TODO

Порт принтера

ИРПР построен на микросхеме КР1801ВП1-033.

При включенном бите разрешения прерывания используется вектор прерывания 0200.

  177514  Регистр состояния устройства сопряжения
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └─┬┴──┼──┴──┴──┴──┴──┴──┼─┬┴─┬┴─┬┴──┴──┴──┴──┴──┘
   │   └─ Нач.уст-ка (W)─┘ │  │  └─ Завершено (R)
   └─ Ошибка (R)           │  └─ Разрешение прерывания (R/W)
  Требование передачи (R) ─┘

  177516  Регистр данных устройства сопряжения  
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┤
                         └────── Данные (W) ─────┘

TODO

Ссылки