Немига
Этот документ создан для 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.
NOTE: Тест TSTVM2 от Titus показывает различия в исполнении команды MUL на Немиге и УКНЦ [1].
- Режимы 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 — прерывание начального пуска
- 160012 — прерывание??
- 000004 — ?? ошибка обращения к каналу?
- 000010 — ?? резерный код команды?
- 000014 — ?? прерывание по T-разряду или команда BPT
- 000020 — команда IOT
- 000030 — команда EMT
- 000034 — команда TRAP
- ?? — INR0
- ?? — INR1
- 000100 — прерывание 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
Результат прогона программы IOSCAN на реальной машине с прошивкой 4.06 [2]:
160000-170014 170020-170032 177100-177106 177560-177574 177600-177776
Видео
Видео-контроллер формирует растр размером 512×312 точек, в котором «полезной» площадью является блок 512×256 точек. Экран хранится в верхней части памяти, доступной по косвенному адресу 140000, занимает 32 КБ. Каждые 8 точек растра занимают 2 соседних байта — каждый байт это отдельный битплан, то есть каждая точка это два бита, лежащие в соседних байтах, что даёт 4 градации яркости на точку.
Знакогенератор содержит символы размером 8×8 точек, при выводе текста между строками оставляют место высотой в два пиксела. Таким образом экран используется как текстовый в 25 строк.
Прошивка 3.03 использует не всю ширину экрана, а только 416 точек — слева и справа остаются пустые полосы по 48 точек. Прошивки 4.05 и 4.06 используют уже всю ширину в 512 точек.
3.03 4.05 и 4.06 ┌─ 512 × 312 ────────────────────────┐ ┌─ 512 × 312 ────────────────────────┐ │ │ │ │ │ │ │ │ │ ┌─ 416 × 256 ────────────────────┐ │ ┌─ 512 × 256 ────────────────────────┐ │ │ │ │ │ │ │ │ 50 символов в строке │ │ │ 64 символа в строке │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────────────────────────────────┘ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ │ └────────────────────────────────────┘ └────────────────────────────────────┘
Клавиатура
Раскладка клавиатуры:
( ) ( ) ( ) ( ) РУС ВЕРХ ЛАТ ЦИФ ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ │Ф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 Гц.
Дисковод
ПЗУ версии 3.03 может загружать диски MD и DX; ПЗУ 4.05 и 4.06 — только диски MD.
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-й бит регистра состояния.
Формат MD
Дисковод формата MD, с кодированием FM (в ТО называется модель TEAC FD-55FV-003). Похож на MX, но использует побайтовую передачу данных. Каждый логический диск занимает только одну сторону физического диска, MD0: и MD1: это первый физический диск, MD2: и MD3: это второй.
Ёмкость диска 459 КБ — 2 стороны по 80 дорожек, сектора по 128 байт, 23 сектора (или меньше) на дорожку. Диск вращается со скоростью 300 оборотов в минуту = 5 оборотов в секунду. Скорость обмена данными — 125 килобит в секунду (FM) = 125000 бит в секунду = 15625 байт в секунду = 3125 за оборот.
- Структура дорожки
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 ...
Формат MX
Используются обе стороны диска, поэтому только два устройства — MX0: и MX1:. Драйвер MX есть в комплекте системы «RT-11SJ V5.02(#)», и этот драйвер может только читать/писать, но не умеет форматировать.
TODO
Таймер и звук
- См. также: Немига/Звук
Схема таймера построен на микросхеме таймера 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
Производительность
Тест SPEED показывает, что Немига работает немного быстрее чем УКНЦ.
Сравнение реальной машины версии 4.06 (MiX [3]) и двух УКНЦ (Alex_K):
Немига УКНЦ1 УКНЦ2 сложение рег-рег 760 624 672 тыс.оп/сек сложение рег-пам 328 240 289 тыс.оп/сек умножение рег-рег 152 80 64 тыс.оп/сек деление рег-рег 256 80 64 тыс.оп/сек
Ссылки
- ТУ 4-ЫД1.700.004ТУ-89 Комплекс вычислительный «Немига»
- Комплекс вычислительный «Немига». Компьютеры персональные ПК 588, ПК 588-01. Техническое описание и инструкция по эксплуатации
- КУВТ «Немига»
- Постановление Совета министров Белорусской ССР «О дополнительных мерах по обеспечению учебных заведений республики электронно-вычислительной техникой»