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

Материал из Emuverse
Нет описания правки
 
(не показано 58 промежуточных версий 1 участника)
Строка 1: Строка 1:
{{Emuverse}}
{{Emuverse}}
[[Файл:800px-NEMIGA class.jpg|thumb]]
[[Файл:800px-NEMIGA class.jpg|thumb]]
[[Файл:Nemiga PK588 loading.jpg|thumb]]
'''Немига''' — советский 16-разрядный персональный компьютер, выпускался на белорусских предприятиях с 1989 года. Предназначался для поставки в учебные заведения в составе КУВТ. По системе команд совместим с PDP-11 и его советскими клонами — [[Электроника-60]], [[ДВК]].
'''Немига''' — советский 16-разрядный персональный компьютер, выпускался на белорусских предприятиях с 1989 года. Предназначался для поставки в учебные заведения в составе КУВТ. По системе команд совместим с PDP-11 и его советскими клонами — [[Электроника-60]], [[ДВК]].


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


Существовало как минимум три версии Немиги, отличающихся схемотехникой и ПЗУ: 3.03, 4.05, 4.06.
Существовало как минимум три версии Немиги, отличающихся схемотехникой и ПЗУ: 3.03, 4.05, 4.06.
Строка 21: Строка 22:
* <code>УПР+L</code> — очистка экрана
* <code>УПР+L</code> — очистка экрана


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


== Процессор ==
== Процессор ==


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


Начальный пуск: сброс устройств, затем чтение PC и PSW из 160006 и 160010, запуск в режиме HALT.
Начальный пуск: сброс устройств, затем чтение PC и PSW из 160006 и 160010, запуск в режиме HALT.
Строка 40: Строка 41:
Набор команд описан в ТО и в справочниках по БИС сериии КР588.
Набор команд описан в ТО и в справочниках по БИС сериии КР588.


'''''NOTE:''''' Тест TSTVM2 от Titus показывает различия в исполнении команды MUL на Немиге и УКНЦ [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570] -- на Немиге три отличия:
: '''''См. также: [[Немига/EIS]]'''''
  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
Процессор поддерживает работу в двух режимах — USER и HALT.
Процессор поддерживает работу в двух режимах — USER и HALT.


Ситуации перехода в режим HALT:
Ситуации перехода в режим HALT (согласно ТО):
* появление сигнала СБРОС (INIT)
* появление сигнала СБРОС (INIT)
* запрос на обслуживание локальной сети
* запрос на обслуживание локальной сети
Строка 86: Строка 78:
| 0010 || INR3 — Требование прерывания от ВУ || 32 || используется
| 0010 || INR3 — Требование прерывания от ВУ || 32 || используется
|-
|-
| 0011 || INRT — Прерывание по внешнему событию || 35 || используется
| 0011 || EVNT — Прерывание по внешнему событию || 35 || используется
|-
|-
| 0001 || RQ — Запрос прерывания от ВУ || 28 || используется
| 0001 || RQ — Запрос прерывания от ВУ || 28 || используется
Строка 93: Строка 85:


Вектора прерываний:
Вектора прерываний:
* 160002 — сигнал/команда HALT
* 160002 — сигнал/команда HALT в режиме HALT
* 160006 — прерывание начального пуска
* 160006 — прерывание начального пуска
* 160012 — прерывание??
* 160012 — ошибка при приёме вектора прерывания
* 000004 — ?? ошибка обращения к каналу?
* 000004 — нечётный адрес при обращении по слову; ошибка обращения к каналу; HALT в режиме USER; неверная адресация JMP/JSR
* 000010 — ?? резерный код команды?
* 000010 — резерный код команды
* 000014 — ?? прерывание по T-разряду или команда BPT
* 000014 — прерывание по T-разряду или команда BPT
* 000020 — команда IOT
* 000020 — команда IOT
* 000024 — питание
* 000030 — команда EMT
* 000030 — команда EMT
* 000034 — команда TRAP
* 000034 — команда TRAP
* ?? — INR0
* 000060 — терминал клавиатура (вызывается из кода ПЗУ)
* ?? — INR1
* 000064 — терминал дисплей (вызывается из кода ПЗУ)
* 000100 — прерывание INRT/EVNT
* 000100 — прерывание EVNT
 
* 000104 — адрес обработчика сигнала Н4 от сетевой карты (вызывается из кода ПЗУ)
== Память ==
* 000110 — мелодия закончилась кодом 040 (вызывается из кода ПЗУ)
* Адреса 000000-137777 — ОЗУ
* Адреса 140000-157777 — зарезервированы под дополнительные 8 КБ ПЗУ (D11-D14)
* Адреса 160000-167777 — системное ПЗУ, 4 КБ
* Адреса 170000-177777 — ОЗУ и порты
** Адреса 177600-177777 — окно памяти, включаемое только в режиме HALT
 
Процессору непосредственно доступно 64 КБ памяти. Помимо этого, существует возможность «косвенного» обращения ко всем 128 КБ ОЗУ, через регистры косвенной адресации 177570 (адрес) и 177572 (данные). Адрес косвенной адресации получается сдвигом на один разряд вниз обычного адреса «прямой» адресации.
<pre>
  Адрес                    Косв. адрес
000000 ┌────────────────────┐ 000000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │      О З У        │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
140000 ├────────────────────┤ 060000
        │ Дополнит. ПЗУ 8К  │
        │                    │
160000 ├────────────────────┤ 070000
        │ Системное ПЗУ 4К  │
170000 ├────────────────────┤
        │ ОЗУ и порты        │
200000 ╞════════════════════╡ 100000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        ├────────────────────┤ 140000
        │                    │
        │                    │
        │                    │
        │    Э К Р А Н      │
        │                    │
        │        32К        │
        │                    │
        │                    │
        │                    │
        └────────────────────┘ 200000
</pre>
В аппаратной версии 4.x появилась возможность включить проецирование 32К экрана на нижние 32К обычной памяти (этим управляет новый регистр 177574, бит 0) — сделано это, очевидно, для ускорения вывода на экран.


== Регистры (порты) ==
== Регистры (порты) ==
{| class=standard
{| class=standard
! Регистр !! Назначение !! Примечание !! Значение в пульте 4.06
|-
|-
| 170000 ||rowspan=3| Память ||rowspan=3| Используются микросхемой, выполняющей операции умножения/делениия
| 170000 ||rowspan=3| Память ||rowspan=3| Используются микросхемой,<br />выполняющей операции умножения/делениия || 000000
|-
|-
| 170002
| 170002 || 000000
|-
|-
| 170004
| 170004 || 047764
|-
|-
| 170006 || || Регистр данных клавиатуры (байт 170006),<br /> регистр фиксации HALT-запросов (байт 170007)
| 170006 || || Регистр данных клавиатуры (байт 170006),<br /> регистр фиксации HALT-запросов (байт 170007, D27) || 001412
|-
|-
| 170010 ||rowspan=2| Адаптер<br />локальной сети || состояние
| 170010 ||rowspan=2| Адаптер<br />локальной сети || состояние || 074010
|-
|-
| 170012 || данные
| 170012 || данные || 000000
|-
|-
| 170014 || ??? ||
| 170014 || ??? || || 000000
|-
|-
| 170020 ||rowspan=6| Таймер и звук || состояние программируемого таймера
| 170020 ||rowspan=6| Таймер и звук || состояние программируемого таймера || 001261
|-
|-
| 170022 || первый счётчик
| 170022 || первый счётчик || 000000
|-
|-
| 170024 || второй счётчик
| 170024 || второй счётчик || 000000
|-
|-
| 170026 || включение звука
| 170026 || включение звука || 000000
|-
|-
| 170030 || управляющее слово выбора громкости и октавы
| 170030 || управляющее слово выбора громкости и октавы || 000000
|-
|-
| 170032 || отключение звука
| 170032 || отключение звука || 000000
|-
|-
| 177100 ||rowspan=4| Контроллер<br />дисковода MD || состояние
| 177100 ||rowspan=4| Контроллер<br />дисковода MD || состояние || 000271
|-
|-
| 177102 || данные
| 177102 || данные || 000377
|-
|-
| 177104 || управление
| 177104 || управление || 000127
|-
|-
| 177106 || таймер
| 177106 || таймер || 000106
|-
|-
| 177170* ||rowspan=2| Контроллер<br />дисковода DX* || состояние
| 177170* ||rowspan=2| Контроллер<br />дисковода DX* || состояние
Строка 205: Строка 147:
| 177516 || данные параллельного порта
| 177516 || данные параллельного порта
|-
|-
| 177560 ||rowspan=4| Регистры<br />системной консоли || состояние клавиатуры
| 177560 ||rowspan=4| Регистры<br />системной консоли || состояние клавиатуры || 000000
|-
|-
| 177562 || данные клавиатуры
| 177562 || данные клавиатуры || 000012
|-
|-
| 177564 || состояние терминала
| 177564 || состояние терминала || 000200
|-
|-
| 177566 || данные терминала
| 177566 || данные терминала || 000000
|-
|-
| 177570 ||rowspan=2| Косвенный доступ<br />к памяти || данные
| 177570 ||rowspan=2| Косвенный доступ<br />к памяти || данные || 000000
|-
|-
| 177572 || адрес
| 177572 || адрес || 000000
|-
|-
| 177574** || || включение маппинга экрана на нижнюю память
| 177574** || || Регистр управления || 000000
|-
|-
|}
|}
Строка 223: Строка 165:
<nowiki>**</nowiki> — аппаратная версия 4.x
<nowiki>**</nowiki> — аппаратная версия 4.x


Результат прогона программы IOSCAN на реальной машине с прошивкой 4.06 [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570] (здесь детектируется несколько регистров, которых нет в документации — 170000, 170002, 170004, 170014):
Результат прогона программы IOSCAN на реальной машине с прошивкой 4.06 [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570] (здесь детектируется регистр 170014, которого нет в документации):
<pre>160000-170014
<pre>160000-170014
170020-170032
170020-170032
Строка 231: Строка 173:
177600-177776</pre>
177600-177776</pre>


;Регистр 170006
Старший байт регистра 170006 — это регистр фиксации HALT-запросов, отдельные его биты отвечают за различные причины вызова HALT-прерывания. Младший байт регистра 170006 — регистр данных клавиатуры.
Старший байт регистра 170006 — это регистр фиксации HALT-запросов, отдельные его биты отвечают за различные причины вызова HALT-прерывания. Младший байт регистра 170006 — регистр данных клавиатуры.
;Регистр 170006
<pre>
<pre>
  170006 Регистр фиксации HALT и данных клавиатуры
  170006 (R) Регистр фиксации HALT и данных клавиатуры
  ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
  ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
  │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
  │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
  └─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─0┴─0┼──┴──┴──┴──┴──┴──┴──┴──┤
  └─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─1┴─1┼──┴──┴──┴──┴──┴──┴──┴──┤
  │  Н1 │  Н3 │  │      └── Данные клавиатуры ──┘
СБРОС│  │  │  │  │      └── Данные клавиатуры ──┘
СБРОС  Н2   Н4 Клавиатура</pre>
      Н1 Н2 Н3 Н4 Клавиатура
</pre>
Младший байт регистра это байт с клавиатуры (регистр D27); если установлен бит 10, то символ готов для чтения.<br />
Младший байт регистра это байт с клавиатуры (регистр D27); если установлен бит 10, то символ готов для чтения.<br />
Старший байт регистра это регистр фиксации HALT (D28, биты регистра идут в обратном порядке) — определяет причину появления прерывания HALT.
Старший байт регистра это регистр фиксации HALT (D28, биты регистра идут в обратном порядке) — определяет причину появления прерывания HALT.
* бит 15 — признак канального сигнала СБРОС;
* бит 15 — признак канального сигнала СБРОС;
* бит 14 — сигнал Н1 — ??;
* бит 14 — сигнал Н1 — обращение к регистру данных терминала 177566;
* бит 13 — сигнал Н2 — обращение к регистру данных клавиатуры;
* бит 13 — сигнал Н2 — обращение к регистру данных клавиатуры 177562;
* бит 12 — сигнал Н3 — таймер;
* бит 12 — сигнал Н3 — кадровый синхроимпульс, 50 Гц
* бит 11 — сигнал Н4 от платы адаптера локальной сети;
* бит 11 — сигнал Н4 от платы адаптера локальной сети;
* бит 10 — сигнал готовности очередного байта с клавиатуры, поступает с триггера D37.2;
* бит 10 — сигнал готовности очередного байта с клавиатуры, поступает с триггера D37.2;
* биты 8,9 заземлены = 0.
* биты 8,9 заземлены = 1.


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


;Регистры системной консоли
;Регистры системной консоли
При разработке Немиги предусмотрели совместимость с «Электроника-60» по адресам и работе регистров системной консоли — это регистры 177560/177562 (адрес/данные клавиатуры) и 177564/177566 (адрес/данные терминала). Это просто ячейки ОЗУ, но обращение к ним приводит к вызову прерывания HALT с установкой соответствующих флагов в регистре 177006. Программа обработки прерывания HALT анализирует флаги и эмулирует работу регистров консоли.
При разработке Немиги предусмотрели совместимость с «Электроника-60» по адресам и работе регистров системной консоли — это регистры 177560/177562 (состояние/данные клавиатуры) и 177564/177566 (состояние/данные терминала). Это просто ячейки ОЗУ, но обращение к ним приводит к вызову прерывания HALT с установкой соответствующих флагов в регистре 177006 (чтение регистра данных клавиатуры 177562, запись в регистр данных терминала 177566). Программа обработки прерывания HALT анализирует флаги и эмулирует работу регистров консоли, а также выполняет прерывания по векторам 60 и 64, если стоят соответствующие флаги в регистрах состояния.
<pre>
<pre>
   177560  Регистр состояния клавиатуры
   177560  Регистр состояния клавиатуры
Строка 264: Строка 207:
                           └──── Готовность к приёму/передаче: 0 = готов
                           └──── Готовность к приёму/передаче: 0 = готов
</pre>
</pre>
; Регистр управления 177574 (только 4.xx)
* бит 0 — специальная адресация памяти: экран проецируется на нижнюю память.
== Память ==
* Адреса 000000-137777 — ОЗУ
* Адреса 140000-157777 — зарезервированы под дополнительные 8 КБ ПЗУ (D11-D14)
* Адреса 160000-167777 — системное ПЗУ, 4 КБ (D9-D10)
* Адреса 170000-177777 — ОЗУ и порты
** Адреса 177600-177777 — окно памяти, включаемое только в режиме HALT
Процессору непосредственно доступно 64 КБ памяти. Помимо этого, существует возможность «косвенного» обращения ко всем 128 КБ ОЗУ, через регистры косвенной адресации 177570 (адрес) и 177572 (данные). Адрес косвенной адресации получается сдвигом на один разряд вниз обычного адреса «прямой» адресации.
<pre>
  Адрес                    Косв. адрес
000000 ┌────────────────────┐ 000000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │      О З У        │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
140000 ├────────────────────┤ 060000
        │ Дополнит. ПЗУ 8К  │
        │                    │
160000 ├────────────────────┤ 070000
        │ Системное ПЗУ 4К  │
170000 ├────────────────────┤
        │ ОЗУ и порты        │
200000 ╞════════════════════╡ 100000
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        │                    │
        ├────────────────────┤ 140000
        │                    │
        │                    │
        │                    │
        │    Э К Р А Н      │
        │                    │
        │        32К        │
        │                    │
        │                    │
        │                    │
        └────────────────────┘ 200000
</pre>
В аппаратной версии 4.x появилась возможность включить проецирование 32К экрана на нижние 32К обычной памяти (этим управляет новый регистр 177574, бит 0) — сделано это, очевидно, для ускорения вывода на экран.


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


Строка 278: Строка 278:
  │                                    │      │                                    │
  │                                    │      │                                    │
  │                                    │      │                                    │
  │                                    │      │                                    │
  │ ┌─ 416 × 256 ────────────────────┐ │       ┌─ 512 × 256 ────────────────────────┐
  ┌─┌─ 416 × 256 ────────────────────┐─┐       ┌─ 512 × 256 ────────────────────────┐
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │ 50 символов в строке          │      │  64 символа в строке              │
  │ | 50 символов в строке          | │      │  64 символа в строке              │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │                               │      │                                    │
  │ |                               | │      │                                    │
  │ └────────────────────────────────┘ │       └────────────────────────────────────┘
  └─└────────────────────────────────┘─┘       └────────────────────────────────────┘
  │                                    │      │                                    │
  │                                    │      │                                    │
  │                                    │      │                                    │
  │                                    │      │                                    │
  └────────────────────────────────────┘      └────────────────────────────────────┘
  └────────────────────────────────────┘      └────────────────────────────────────┘
[[Файл:Nemiga 303 pult.png|341px]] [[Файл:Nemiga 406 pult.png|341px]]


== Клавиатура ==
== Клавиатура ==
[[Файл:Nemiga-keyboard.jpg|thumb]]
Раскладка клавиатуры:
Раскладка клавиатуры:
<pre>
<pre>
                        ( )         ( )     ( )    ( )
                      ( )         ( )   ( )    ( )
                        РУС         ВЕРХ   ЛАТ    ЦИФ
                      РУС         ВЕРХ   ЛАТ    ЦИФ
  ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐      ┌───┬───┬───┐
  ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐      ┌───┬───┬───┐
  │Ф1 │Ф2 │ │Клю│ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ~ │<─ │      │ЦИФ│СТП│ ─ │
  │Ф1 │Ф2 │ │Клю│ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ~ │<─ │      │ЦИФ│СТП│ ─ │
Строка 304: Строка 307:
  │Ф5 │Ф6 │    │УПР│ Ф │ Ы │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э │ . │ Ё │ВВО│  │ 4 │ 5 │ 6 │
  │Ф5 │Ф6 │    │УПР│ Ф │ Ы │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э │ . │ Ё │ВВО│  │ 4 │ 5 │ 6 │
  ├───┼───┤    └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐ ├───┼───┼───┤
  ├───┼───┤    └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐ ├───┼───┼───┤
  │Ф7 │Ф8 │      │   │ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б │ Ю │ , │ / │ _ │   │ФПБ│ │ 1 │ 2 │ 3 │
  │Ф7 │Ф8 │      │ │ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б │ Ю │ , │ / │ _ │ │ФПБ│ │ 1 │ 2 │ 3 │
  ├───┼───┤  ┌───┼───┼───┼───┴───┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┘ ├───┼───┼───┤
  ├───┼───┤  ┌───┼───┼───┼───┴───┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┘ ├───┼───┼───┤
  │Ф9 │Ф10│  │РУС│Р/Л│АЛТ│                              │Р/Л│ЛАТ│ ЗБ│ДОП│    │ 0 │ . │ + │
  │Ф9 │Ф10│  │РУС│Р/Л│АЛТ│                              │Р/Л│ЛАТ│ ЗБ│ДОП│    │ 0 │ . │ + │
Строка 321: Строка 324:
Автоповтор срабатывает через 1 секунду, с частотой 15 Гц.
Автоповтор срабатывает через 1 секунду, с частотой 15 Гц.


== Дисковод ==
== Дисковод MD/MX ==
ПЗУ версии 3.03 может загружать диски MD и DX; ПЗУ 4.05 и 4.06 — только диски MD.
ПЗУ версии 3.03 может загружать диски MD и DX; ПЗУ 4.05 и 4.06 — только диски MD.


Строка 361: Строка 364:
Каждый логический диск занимает только одну сторону физического диска, MD0: и MD1: это первый физический диск, MD2: и MD3: это второй.
Каждый логический диск занимает только одну сторону физического диска, MD0: и MD1: это первый физический диск, MD2: и MD3: это второй.


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


; Структура дорожки
; Структура дорожки
<pre>
<pre>
Track Header 10b
  ──── Заголовок дорожки (10 байт) ─────────────
  0343 Marker 1b
        1    343 — маркер
  Track number 1b
        1    xxx — номер дорожки
  023 Sectors on Track 1b
        1    023 — секторов на дорожку
  0 1b   *
        1   000 *
  First Sector 2b
        2    xxx — первый сектор
  0xff 1b   *
        1   377 *
  0xff 1b   *
        1   377 *
   Checksum 2b
        2    xxx — контрольная сумма
Sector 130b
   ──── Начало сектора 1..23 (130 байт на сектор) ─┐
   Data 128b
      128    xxx — данные сектора                │
   Checksum 2b
        2   xxxx — контрольная сумма              │
   ──── Конец сектора ─────────────────────────────┘
...
...
</pre>
</pre>


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


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


=== Формат DX ===
Структура дорожки для драйвера MX.SYS, называющего себя «ДРАЙВЕР ГМД ФОРМАТА MX40/80 МИКРОЦОС LTD. V2.2»:
<pre>
  ──── Заголовок дорожки (3 байта) ─────────────
        1    Маркер 0363
        1    0 (этот байт можно рассматривать как старший байт от слова номера дорожки)
        1    Номер дорожки
  ──── Начало сектора 1..11 (258 байт на сектор)
      256    128 слов, данные сектора
        2    Слово контрольной суммы, полученное обычным сложением всех слов сектора
  ──── Конец сектора ───────────────────────────
      ...
  ──── Концевик  ───────────────────────────────
        4    20 4F 54 01 (hex)
        2    Слово: номер дорожки * 2
</pre>
Все слова данных сектора, а также слово контрольной суммы, записываются в формате старший байт затем младший байт, что отличается от обычного представления слов в памяти (младший потом старший), поэтому после чтения сектора и перед записью выполняется SWAB над всеми словами.<br />
Без концевика получается 3 + 11 * (256 + 2) = 2841 байт, именно столько читает драйвер, остальные байты до конца дорожки игнорируются (длина дорожки примерно 3125 байт).<br />
При записи дорожки кроме заголовка и данных секторов пишется ещё 6 байт концевика.
 
== Дисковод DX ==
Загрузка с дисков формата DX предусмотрена только в прошивке 3.03 — команда «X».
Загрузка с дисков формата DX предусмотрена только в прошивке 3.03 — команда «X».
DX — драйвер накопителя на гибких магнитных дисках [[ГМД-70]] или [[ГМД-7012]]. Полный объем устройства 494 блока.
<pre>
  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│
└──┴──┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┤
                        └──────── Данные ───────┘
</pre>
На диске 77 дорожек 0..76, на каждой 26 секторов 1..26, по 128 байт на сектор, итого 77×26×128 = 256256 байт.
Формат дорожки (из описаний [http://hobot.pdp-11.ru/BIBLIOTEKA/SM5631_3_060_205_IE_TO/SM5631_3_060_205_TO.rar] и [http://doc.pdp-11.org.ru/DVK/GMD7012/Format_GMD7012.pdf]):
<pre>
Промежуток              46b
Индексный маркер FC D7
Начало сектора 1..26
  Преамбула            32/33b
  Идентификатор
  Преамбула            17b
  Данные              131b
Конец сектора
</pre>


'''''TODO'''''
'''''TODO'''''
Строка 394: Строка 450:
: ''См. также: [[Немига/Звук]]''
: ''См. также: [[Немига/Звук]]''


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


Таймер 1 — входная частота 4 МГц, задержка задаётся в регистре 170022. Плюс для этого таймера есть делитель на степени двойки, задаваемый битами 0..2 регистра 170030 — это «октава». Так, например, для получения ноты A4 («ля» первой октавы, 440 Гц) мы задаём октаву 4 и задержку 1136, получаем: <code>4000000 / 2/2/2 / 1136 ~= 440.14 Гц</code>
Таймер 1 — входная частота 4 МГц, задержка задаётся в регистре 170022. Плюс для этого таймера есть делитель на степени двойки, задаваемый битами 0..2 регистра 170030 — это «октава». Так, например, для получения ноты A4 («ля» первой октавы, 440 Гц) мы задаём октаву 4 и задержку 1136, получаем: <code>4000000 / 2/2/2 / 1136 ~= 440.14 Гц</code>
Строка 455: Строка 511:
</pre>
</pre>
'''''TODO'''''
'''''TODO'''''
== ПЗУ ==
{| class="standard"
! Версия || MD5 checksum !! SHA1 checksum !! Размер !! Примечания
|-
| 3.03 || 9023be6bcac0535b9dea95eeda5ef1f3 || ecb2a5cf3d0af678ad44d87c524eaa8726ea1243 || 4 КБ ||
|-
| 4.05 || cbd626766fac3d80c9c786642277f00a || 97e4ebbe88daedf0eed42ede5ff4c0c0e256316a || 4 КБ ||
|-
| 4.06 || 2b6d7eaf21e8201c434743991a2f9228 || a6cb2c8a401bbcbe434320a883021fc32fa9bba4 || 4 КБ ||
|-
| Клавиатура || b6a893d3e603eed3e41d39ca8006abf2 || a530598653f5de87cc730ac0350a19c51f9e0799 || 2 КБ ||
|}


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


Сравнение реальной машины версии 4.06 (MiX [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570]) и двух УКНЦ (Alex_K):
Сравнение реальных машин версии 4.06 (MiX [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570], Radon17 [https://zx-pk.ru/threads/12828-uchebnyj-kompleks-nemiga.html?p=1180618&viewfull=1#post1180618]) и двух УКНЦ (Alex_K):
                     Немига УКНЦ1 УКНЦ2
                     Немига1 Немига2  УКНЦ1 УКНЦ2
  сложение рег-рег    760   624  672    тыс.оп/сек
  сложение рег-рег    760     768    624  672    тыс.оп/сек
  сложение рег-пам    328   240  289    тыс.оп/сек
  сложение рег-пам    328     328    240  289    тыс.оп/сек
  умножение рег-рег    152   80    64    тыс.оп/сек
  умножение рег-рег    152     168      80    64    тыс.оп/сек
  деление рег-рег      256   80    64    тыс.оп/сек
  деление рег-рег      256     256      80    64    тыс.оп/сек


== Ссылки ==
== Ссылки ==
* [https://emuverse.ru/w/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C+%D0%BF%D0%BE+%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%83+%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F&prefix=%D0%9D%D0%B5%D0%BC%D0%B8%D0%B3%D0%B0%2F&namespace=0 Подстраницы этой страницы в Emuverse]
* ТУ 4-ЫД1.700.004ТУ-89 [http://www.1bm.ru/techdocs/kgs/tu/773/info/150570/ Комплекс вычислительный «Немига»]
* ТУ 4-ЫД1.700.004ТУ-89 [http://www.1bm.ru/techdocs/kgs/tu/773/info/150570/ Комплекс вычислительный «Немига»]
* [http://myadel-gimnaz.by/sites/default/files/Documents/Instruction/Comp/Nemiga_TO_instrukciya.djvu Комплекс вычислительный «Немига». Компьютеры персональные ПК 588, ПК 588-01. Техническое описание и инструкция по эксплуатации]
* [http://myadel-gimnaz.by/sites/default/files/Documents/Instruction/Comp/Nemiga_TO_instrukciya.djvu Комплекс вычислительный «Немига». Компьютеры персональные ПК 588, ПК 588-01. Техническое описание и инструкция по эксплуатации]

Текущая версия от 22:32, 18 сентября 2023

Этот документ создан для 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-0001, −0002, −0006, −0004, −0007 (D2..D6) — управляющая память (УП) — микропрограммы для D1, D17, D18
  • КР588ВГ1 (D18) — системный контроллер (СК) — обеспечивает внутренний интерфейс процессора и его связь с Q-шиной (МПИ, OCT 11305.903-80), управляется микрокодом из КР588ВУ2-0007
  • К588ВР2 (D17) — арифметический умножитель 16×16 (УМ), управляется 5-разрядными микрокомандами из КР588ВУ2-0006 (D4); умножение и деление задействует память по адресам 170000-170005
  • КР588ВА1 (D21, D24) — 8-разрядный магистральный приёмо-передатчик (МПП)
  • КР588ВГ2 (D15, D16) — контроллер запоминающего устройства (КЗУ)

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

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

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

См. также: Немига/EIS
Режимы 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 в режиме HALT
  • 160006 — прерывание начального пуска
  • 160012 — ошибка при приёме вектора прерывания
  • 000004 — нечётный адрес при обращении по слову; ошибка обращения к каналу; HALT в режиме USER; неверная адресация JMP/JSR
  • 000010 — резерный код команды
  • 000014 — прерывание по T-разряду или команда BPT
  • 000020 — команда IOT
  • 000024 — питание
  • 000030 — команда EMT
  • 000034 — команда TRAP
  • 000060 — терминал клавиатура (вызывается из кода ПЗУ)
  • 000064 — терминал дисплей (вызывается из кода ПЗУ)
  • 000100 — прерывание EVNT
  • 000104 — адрес обработчика сигнала Н4 от сетевой карты (вызывается из кода ПЗУ)
  • 000110 — мелодия закончилась кодом 040 (вызывается из кода ПЗУ)

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

Регистр Назначение Примечание Значение в пульте 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 [1] (здесь детектируется регистр 170014, которого нет в документации):

160000-170014
170020-170032
177100-177106
177514-177516
177560-177574
177600-177776
Регистр 170006

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

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

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

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

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

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

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

  177560  Регистр состояния клавиатуры
  177564  Регистр состояния терминала
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
 └──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴──┴──┴──┴──┴──┴──┘
                           │  └─ Разрешение прерывания: 1 = разрешено
                           └──── Готовность к приёму/передаче: 0 = готов
Регистр управления 177574 (только 4.xx)
  • бит 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 байта) ─────────────
        1    Маркер 0363
        1    0 (этот байт можно рассматривать как старший байт от слова номера дорожки)
        1    Номер дорожки
  ──── Начало сектора 1..11 (258 байт на сектор)
      256    128 слов, данные сектора
        2    Слово контрольной суммы, полученное обычным сложением всех слов сектора
  ──── Конец сектора ───────────────────────────
       ...
  ──── Концевик  ───────────────────────────────
        4    20 4F 54 01 (hex)
        2    Слово: номер дорожки * 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 байт. Формат дорожки (из описаний [2] и [3]):

Промежуток              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 [4], Radon17 [5]) и двух УКНЦ (Alex_K):

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

Ссылки