Немига: различия между версиями

Материал из Emuverse
Строка 202: Строка 202:


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

Версия от 10:41, 5 мая 2020

Этот документ создан для 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-шиной (МПИ, OCT 11305.903-80), управляется микрокодом из КР588ВУ2-0005
  • К588ВР2 (D17) — арифметический умножитель 16×16 (УМ), управляется 5-битовыми микрокомандами из КР588ВУ2-0006 (D4); умножение и деление задействует память по адресам 170000-170005
  • КР588ВА1 (D21, D24) — 8-разрядный магистральный приёмо-передатчик (МПП)
  • КР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] — на Немиге три отличия:

 MUL (even/odd) - ERROR: 0xD23D / 0x99EE
 MUL (odd/even) - ERROR: 0x35BA / 0xFDE3
 MUL (table)    - ERROR: 0x1C2B / 0x242B

Тест MULRR от Alex_K выявил лишнее выставление флага C в следующих случаях:

  MUL R0,R1    R0   R1    R1' PSW'
 000000670E:  FFFF 8001  7FFF 0001   (-32767) * (-1) = 32767
 00000180EE:  8001 FFFF  7FFF 0001   (-1) * (-32767) = 32767
 0000026F0E:  7FFF 0001  7FFF 0001   32767 * 1 = 32767
 00000388EE:  0001 7FFF  7FFF 0001   1 * 32767 = 32767
Режимы USER и HALT

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

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

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

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

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

Прерывания

Прерывания по описанию КР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 EVNT — Прерывание по внешнему событию 35 используется
0001 RQ — Запрос прерывания от ВУ 28 используется

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

  • 160002 — сигнал/команда HALT
  • 160006 — прерывание начального пуска
  • 160012 — прерывание??
  • 000004 — ?? ошибка обращения к каналу?
  • 000010 — ?? резерный код команды?
  • 000014 — ?? прерывание по T-разряду или команда BPT
  • 000020 — команда IOT
  • 000030 — команда EMT
  • 000034 — команда TRAP
  • 000060 — терминал клавиатура (вызывается из кода ПЗУ)
  • 000064 — терминал дисплей (вызывается из кода ПЗУ)
  • 000100 — прерывание EVNT
  • 000110 — мелодия закончилась кодом 040 (вызывается из кода ПЗУ, с адреса 000110 берётся только PC, без PSW)

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

Регистр Назначение Примечание Значение в пульте 4.06
170000 Память Используются микросхемой,
выполняющей операции умножения/делениия
000000
170002 000000
170004 047764
170006 Регистр данных клавиатуры (байт 170006),
регистр фиксации HALT-запросов (байт 170007, D27)
001412
170010 Адаптер
локальной сети
состояние 074010
170012 данные 000000
170014 ??? 000000
170020 Таймер и звук состояние программируемого таймера 001261
170022 первый счётчик 000000
170024 второй счётчик 000000
170026 включение звука 000000
170030 управляющее слово выбора громкости и октавы 000000
170032 отключение звука 000000
177100 Контроллер
дисковода MD
состояние 000271
177102 данные 000377
177104 управление 000127
177106 таймер 000106
177170* Контроллер
дисковода DX*
состояние
177172* данные
177514 Устройство
сопряжения
состояние параллельного порта
177516 данные параллельного порта
177560 Регистры
системной консоли
состояние клавиатуры 000000
177562 данные клавиатуры 000012
177564 состояние терминала 000200
177566 данные терминала 000000
177570 Косвенный доступ
к памяти
данные 000000
177572 адрес 000000
177574** включение маппинга экрана на нижнюю память 000000

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

Результат прогона программы IOSCAN на реальной машине с прошивкой 4.06 [2] (здесь детектируется регистр 170014, которого нет в документации):

160000-170014
170020-170032
177100-177106
177514-177516
177560-177574
177600-177776

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

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

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

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

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

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

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

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

Память

  • Адреса 000000-137777 — ОЗУ
  • Адреса 140000-157777 — зарезервированы под дополнительные 8 КБ ПЗУ (D11-D14)
  • Адреса 160000-167777 — системное ПЗУ, 4 КБ (D9-D10)
  • Адреса 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) — сделано это, очевидно, для ускорения вывода на экран.

Видео

Видео-контроллер формирует растр размером 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 Гц.

Дисковод MD/MX

ПЗУ версии 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 за оборот. Длительность одного цикла обмена: 1с / 5об / 3125 = 64 мкс.

Структура дорожки
  ──── Заголовок дорожки (10 байт) ─────────────
        1    343 — маркер
        1    xxx — номер дорожки
        1    023 — секторов на дорожку
        1    000 *
        2    xxx — первый сектор
        1    377 *
        1    377 *
        2    xxx — контрольная сумма
  ──── Начало сектора 1..23 (130 байт на сектор) ─┐
      128    xxx — данные сектора                 │
        2   xxxx — контрольная сумма              │
  ──── Конец сектора ─────────────────────────────┘
...

Прошивка 4.06 имеет поддержку «защиты» дискет. Три байта в заголовке дорожки (помечены «*») используются для перекодирования секторов при чтении — это встроено в цикл расчёта контрольной суммы сектора. При значениях этих байт 0/0xff/0xff — перекодирования не происходит.

Первый сектор нулевой дорожки содержит информацию о количестве секторов на каждой дорожке, начиная с нулевого байта каждый байт описывает одну дорожку.

Формат MX

См. Немига/System V502#MX.HLP — описание драйвера MX.SYS

Используются обе стороны диска, поэтому только два устройства — MX0: и MX1:. На каждой дорожке 11 секторов по 128 слов = 256 байт. Односторонний диск = 256 * 11 * 80 = 225280 байт, двусторонний диск = 450560 байт.
Драйвер MX есть в комплекте системы «RT-11SJ V5.02(#)», и этот драйвер может только читать/писать, но не умеет форматировать.

Структура дорожки для драйвера MX.SYS, называющего себя «ДРАЙВЕР ГМД ФОРМАТА MX40/80 МИКРОЦОС LTD. V2.2»:

Заголовок, 3 байта:
  Маркер 0363.
  Байт 0 (его можно рассматривать как старший байт от слова номера дорожки).
  Байт номер дорожки.
Данные секторов, всего 11 секторов по 256+2 байт на сектор:
  128 слов = 256 байт данные секторов
  Слово контрольной суммы, полученное обычным сложением всех слов сектора.
Концевик
  4 байта: 20 4F 54 01 (hex)
  Слово: номер дорожки * 2

Все слова данных сектора, а также слово контрольной суммы, записываются в формате старший байт затем младший байт, что отличается от обычного представления слов в памяти (младший потом старший), поэтому после чтения сектора и перед записью выполняется SWAB над всеми словами.
Без концевика получается 3 + 11 * (256 + 2) = 2841 байт, именно столько читает драйвер, остальные байты до конца дорожки игнорируются (длина дорожки примерно 3125 байт).
При записи дорожки кроме заголовка и данных секторов пишется ещё 6 байт концевика.

Дисковод DX

Загрузка с дисков формата DX предусмотрена только в прошивке 3.03 — команда «X».

DX — драйвер накопителя на гибких магнитных дисках ГМД-70 или ГМД-7012. Полный объем устройства 494 блока.

  177170  Регистр команд и состояний КНГМД (R/W)
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐    ┌ 000 Заполнение буфера
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│    │ 001 Разгрузка буфера
 └─┬┴─┬┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘    │ 010 Запись сектора
  ОШБ └─ ПСБ          ТРБ ─┘  │  │ ВБР │  │  │ ПСК    │ 011 Чтение сектора
                            РПР  КОП   └──┴──┴── КОМ ─┤ 100 Форматирование дорожки
                                                      │ 101 Чтение регистра ошибок и состояний
  177172  Регистр буфер данных КНГМД (R/W)            │ 110 Запись сектора стертых данных
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐    └ 111 Чтение регистра ошибок
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┤
                         └──────── Данные ───────┘

На диске 77 дорожек 0..76, на каждой 26 секторов 1..26, по 128 байт на сектор, итого 77×26×128 = 256256 байт. Формат дорожки (из описаний [3] и [4]):

Промежуток              46b
Индексный маркер FC D7
Начало сектора 1..26
  Преамбула             32/33b
  Идентификатор
  Преамбула             17b
  Данные               131b
Конец сектора

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).

NOTE: Значения задержек для нот на прошивке 4.05 отличаются от 3.03 ровно в 1,6 раза. Вероятно, таймер 1 на новых моделях работает на частоте 6,4 МГц против 4 МГц на старой модели.

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

ИРПР построен на микросхеме КР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

ПЗУ

Версия MD5 checksum SHA1 checksum Размер Примечания
3.03 9023be6bcac0535b9dea95eeda5ef1f3 ecb2a5cf3d0af678ad44d87c524eaa8726ea1243 4 КБ
4.05 cbd626766fac3d80c9c786642277f00a 97e4ebbe88daedf0eed42ede5ff4c0c0e256316a 4 КБ
4.06 2b6d7eaf21e8201c434743991a2f9228 a6cb2c8a401bbcbe434320a883021fc32fa9bba4 4 КБ
Клавиатура b6a893d3e603eed3e41d39ca8006abf2 a530598653f5de87cc730ac0350a19c51f9e0799 2 КБ

Производительность

Тест SPEED показывает, что Немига работает немного быстрее чем УКНЦ.

Сравнение реальной машины версии 4.06 (MiX [5]) и двух УКНЦ (Alex_K):

                   Немига УКНЦ1 УКНЦ2
сложение рег-рег     760   624   672    тыс.оп/сек
сложение рег-пам     328   240   289    тыс.оп/сек
умножение рег-рег    152    80    64    тыс.оп/сек
деление рег-рег      256    80    64    тыс.оп/сек

Ссылки