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

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


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


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


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


В любой момент выполнение программы можно прервать нажатием УПР+ФСД/СТОП, система переходит в пультовый режим. При этом содержимое всех регистров сохраняется, их можно просмотреть командой 'S'. Команда '/' позволяет просмотреть/изменить отдельные ячейки памяти. А команда 'G' восстанавливает регистры и продолжает выполнение прерванной программы с того же места.
В любой момент выполнение программы можно прервать нажатием УПР+ФСД/СТОП, система переходит в пультовый режим. При этом содержимое всех регистров сохраняется, их можно просмотреть командой 'S'. Команда '/' позволяет просмотреть/изменить отдельные ячейки памяти. А команда 'G' восстанавливает регистры и продолжает выполнение прерванной программы с того же места.
Строка 38: Строка 39:
Процессор реализует систему команд компьютера Электроника-60 (ОСТ 11 305.909-82), за исключением команд FIS (операций с плавающей запятой). Есть команды расширенной арифметики (MUL, DIV, ASH, ASHC), реализуются микрокодом в D4 и умножителем D17.
Процессор реализует систему команд компьютера Электроника-60 (ОСТ 11 305.909-82), за исключением команд FIS (операций с плавающей запятой). Есть команды расширенной арифметики (MUL, DIV, ASH, ASHC), реализуются микрокодом в D4 и умножителем D17.
Набор команд описан в ТО и в справочниках по БИС сериии КР588.
Набор команд описан в ТО и в справочниках по БИС сериии КР588.
'''''NOTE:''''' Тест TSTVM2 от Titus показывает различия в исполнении команды MUL на Немиге и УКНЦ [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570] -- на Немиге три отличия:
  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
Строка 49: Строка 61:
* выполнение команды HALT
* выполнение команды HALT


В режиме HALT область ОЗУ 177600-177777 замещается ОЗУ из другой области (предположительно, эти ячейки памяти лежат <под> системным ПЗУ и поэтому не используются обычным образом).
В режиме HALT область ОЗУ 177600-177777 замещается ОЗУ из другой области (предположительно, эти ячейки памяти лежат «под» системным ПЗУ и поэтому не используются обычным образом).
 
Старший байт регистра 170006 — это регистр фиксации HALT-запросов, отдельные его биты отвечают за различные причины вызова HALT-прерывания. Младший байт регистра 170006 — регистр данных клавиатуры.


'''''NOTE:''''' В документации не описан механизм возврата из режима HALT в USER. По коду прошивки ПЗУ видно, что к этому приводит запись байта 0 по адресу 170006; запись 3 в 170006 приводит к переходу из USER в HALT.
'''''NOTE:''''' В документации не описан механизм возврата из режима HALT в USER. По коду прошивки ПЗУ видно, что к этому приводит запись байта 0 по адресу 170006; запись 3 в 170006 приводит к переходу из USER в HALT.
;Регистр 170006
<pre>
170006  Регистр фиксации HALT и данных клавиатуры
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─0┴─0┼──┴──┴──┴──┴──┴──┴──┴──┤
  │  Н1 │  Н3 │  │      └── Данные клавиатуры ──┘
СБРОС  Н2    Н4 Клавиатура</pre>
Младший байт регистра это байт с клавиатуры (регистр D27); если установлен бит 10, то символ готов для чтения.<br />
Старший байт регистра это регистр фиксации 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 анализирует флаги и эмулирует работу регистров консоли.
<pre>
  177560  Регистр состояния клавиатуры
  177564  Регистр состояния терминала
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
└──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴──┴──┴──┴──┴──┴──┘
                          │  └─ Разрешение прерывания: 1 = разрешено
                          └──── Готовность к приёму/передаче: 0 = готов
</pre>


; Прерывания
; Прерывания
Строка 117: Строка 95:
* 160002 — сигнал/команда HALT
* 160002 — сигнал/команда HALT
* 160006 — прерывание начального пуска
* 160006 — прерывание начального пуска
* 160012 — прерывание??
* 000004 — ?? ошибка обращения к каналу?
* 000004 — ?? ошибка обращения к каналу?
* 000010 — ?? резерный код команды?
* 000010 — ?? резерный код команды?
Строка 125: Строка 104:
* ?? — INR0
* ?? — INR0
* ?? — INR1
* ?? — INR1
* ?? — прерывание INRT/EVNT
* 000100 — прерывание INRT/EVNT


== Память ==
== Память ==
Строка 134: Строка 113:
** Адреса 177600-177777 — окно памяти, включаемое только в режиме HALT
** Адреса 177600-177777 — окно памяти, включаемое только в режиме HALT


Процессору непосредственно доступно 64 КБ памяти. Помимо этого, существует возможность <косвенного> обращения ко всем 128 КБ ОЗУ, через регистры косвенной адресации 177570 (адрес) и 177572 (данные). Адрес косвенной адресации получается сдвигом на один разряд вниз обычного адреса <прямой> адресации.
Процессору непосредственно доступно 64 КБ памяти. Помимо этого, существует возможность «косвенного» обращения ко всем 128 КБ ОЗУ, через регистры косвенной адресации 177570 (адрес) и 177572 (данные). Адрес косвенной адресации получается сдвигом на один разряд вниз обычного адреса «прямой» адресации.
<pre>
<pre>
   Адрес                    Косв. адрес
   Адрес                    Косв. адрес
Строка 179: Строка 158:
         └────────────────────┘ 200000
         └────────────────────┘ 200000
</pre>
</pre>
В аппаратной версии 4.x появилась возможность включить проецирование 32К экрана на нижние 32К обычной памяти (этим управляет новый регистр 177574, бит 0) — сделано это, очевидно, для ускорения вывода на экран.


== Регистры (порты) ==
== Регистры (порты) ==
{| class=standard
{| class=standard
|-
| 170000 ||rowspan=3| Память ||rowspan=3| Используются микросхемой, выполняющей операции умножения/делениия
|-
| 170002
|-
| 170004
|-
|-
| 170006 || || Регистр данных клавиатуры (байт 170006),<br /> регистр фиксации HALT-запросов (байт 170007)
| 170006 || || Регистр данных клавиатуры (байт 170006),<br /> регистр фиксации HALT-запросов (байт 170007)
Строка 188: Строка 174:
|-
|-
| 170012 || данные
| 170012 || данные
|-
| 170014 || ??? ||
|-
|-
| 170020 ||rowspan=6| Таймер и звук || состояние программируемого таймера
| 170020 ||rowspan=6| Таймер и звук || состояние программируемого таймера
Строка 195: Строка 183:
| 170024 || второй счётчик
| 170024 || второй счётчик
|-
|-
| 170026
| 170026 || включение звука
|-
|-
| 170030 || управляющее слово выбора громкости и октавы
| 170030 || управляющее слово выбора громкости и октавы
|-
|-
| 170032
| 170032 || отключение звука
|-
|-
| 177100 ||rowspan=4| Контроллер<br />дисковода MD || состояние
| 177100 ||rowspan=4| Контроллер<br />дисковода MD || состояние
Строка 228: Строка 216:
|-
|-
| 177572 || адрес
| 177572 || адрес
|-
| 177574** || || включение маппинга экрана на нижнюю память
|-
|-
|}
|}
 * — код загрузки с дисковода формата DX обнаружен в прошивке версии 3.03; для загрузки с него используется команда <X>.
<nowiki>*</nowiki> — код загрузки с дисковода формата DX обнаружен в прошивке версии 3.03; для загрузки с него используется команда «X».<br />
<nowiki>**</nowiki> — аппаратная версия 4.x
 
Результат прогона программы IOSCAN на реальной машине с прошивкой 4.06 [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570] (здесь детектируется регистр 170014, которого нет в документации):
<pre>160000-170014
170020-170032
177100-177106
177514-177516
177560-177574
177600-177776</pre>
 
Старший байт регистра 170006 — это регистр фиксации HALT-запросов, отдельные его биты отвечают за различные причины вызова HALT-прерывания. Младший байт регистра 170006 — регистр данных клавиатуры.
 
;Регистр 170006
<pre>
170006  Регистр фиксации HALT и данных клавиатуры
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─0┴─0┼──┴──┴──┴──┴──┴──┴──┴──┤
  │  Н1 │  Н3 │  │      └── Данные клавиатуры ──┘
СБРОС  Н2    Н4 Клавиатура</pre>
Младший байт регистра это байт с клавиатуры (регистр D27); если установлен бит 10, то символ готов для чтения.<br />
Старший байт регистра это регистр фиксации 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 анализирует флаги и эмулирует работу регистров консоли.
<pre>
  177560  Регистр состояния клавиатуры
  177564  Регистр состояния терминала
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
└──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴──┴──┴──┴──┴──┴──┘
                          │  └─ Разрешение прерывания: 1 = разрешено
                          └──── Готовность к приёму/передаче: 0 = готов
</pre>


== Видео ==
== Видео ==


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


┌─ 512 x 312 ────────────────────────┐
Знакогенератор содержит символы размером 8×8 точек, при выводе текста между строками оставляют место высотой в два пиксела. Таким образом экран используется как текстовый в 25 строк.
│                                    │
│                                    │
┌────────────────────────────────────┐
│ 512 x 256                          │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
│                                    │
└────────────────────────────────────┘
│                                    │
│                                    │
└────────────────────────────────────┘


Знакогенератор содержит символы размером 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 символа в строке              │
│ │                                │ │      │                                    │
│ │                                │ │      │                                    │
│ │                                │ │      │                                    │
│ │                                │ │      │                                    │
│ │                                │ │      │                                    │
│ │                                │ │      │                                    │
│ └────────────────────────────────┘ │      └────────────────────────────────────┘
│                                    │      │                                    │
│                                    │      │                                    │
└────────────────────────────────────┘      └────────────────────────────────────┘


== Клавиатура ==
== Клавиатура ==
Строка 261: Строка 298:
                         РУС        ВЕРХ    ЛАТ    ЦИФ
                         РУС        ВЕРХ    ЛАТ    ЦИФ
  ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐      ┌───┬───┬───┐
  ┌───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐      ┌───┬───┬───┐
  │Ф1 │Ф2 │ │Клю│ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ~ │ │      │ЦИФ│СТП│ ─ │
  │Ф1 │Ф2 │ │Клю│ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ~ │<─ │      │ЦИФ│СТП│ ─ │
  ├───┼───┤ └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐    ├───┼───┼───┤
  ├───┼───┤ └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐    ├───┼───┼───┤
  │Ф3 │Ф4 │  │  │ Й │ Ц │ У │ К │ Е │ Н │ Г │ Ш │ Щ │ З │ Х │ : │ Ъ │ ПС│    │ 7 │ 8 │ 9 │
  │Ф3 │Ф4 │  │  │ Й │ Ц │ У │ К │ Е │ Н │ Г │ Ш │ Щ │ З │ Х │ : │ Ъ │ ПС│    │ 7 │ 8 │ 9 │
Строка 278: Строка 315:
При включении установлены режимы: ЛАТ, ВЕРХ, ЦИФ.
При включении установлены режимы: ЛАТ, ВЕРХ, ЦИФ.


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


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


Дисковод формата MD, с кодированием FM (в ТО называется модель TEAC FD-55FV-003). Похож на MX, но использует побайтовую передачу данных.
Каждый логический диск занимает только одну сторону физического диска, MD0: и MD1: это первый физический диск, MD2: и MD3: это второй.
Ёмкость диска 459 КБ — 2 стороны по 80 дорожек, сектора по 128 байт, 23 сектора (или меньше) на дорожку. Диск вращается со скоростью 300 оборотов в минуту = 5 оборотов в секунду. Скорость обмена данными — 125 килобит в секунду (FM) = 125000 бит в секунду = 15625 байт в секунду = 3125 за оборот.
;Регистры
<pre>
<pre>
   177100  Регистр состояния КНГМД (R/W)
   177100  Регистр состояния КНГМД (R/W)
Строка 323: Строка 355:
</pre>
</pre>
Контроллер дисковода управляется на основе операций. Операция выполняется в два шага: (1) подготовка операции установкой в регистре управления битов операции и включения мотора; (2) запуск операции записью «1» в 0-й бит регистра состояния.
Контроллер дисковода управляется на основе операций. Операция выполняется в два шага: (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 за оборот.


; Структура дорожки
; Структура дорожки
Строка 330: Строка 369:
   Track number 1b
   Track number 1b
   023 Sectors on Track 1b
   023 Sectors on Track 1b
   0 ?? 1b
   0 1b   *
   First Sector 2b
   First Sector 2b
   0xff 1b
   0xff 1b   *
   0 1b
   0xff 1b   *
   Checksum 2b
   Checksum 2b
Sector 130b
Sector 130b
Строка 340: Строка 379:
...
...
</pre>
</pre>
Прошивка 4.06 имеет поддержку «защиты» дискет. Три байта в заголовке дорожке (помечены «*») используются для перекодирования секторов при чтении — это встроено в цикл расчёта контрольной суммы сектора. При значениях этих байт 0/0xff/0xff — перекодирования не происходит.
=== Формат MX ===
: ''См. [[Немига/System V502#MX.HLP]]'' — описание драйвера MX.SYS
Используются обе стороны диска, поэтому только два устройства — MX0: и MX1:.
Драйвер MX есть в комплекте системы «RT-11SJ V5.02(#)», и этот драйвер может только читать/писать, но не умеет форматировать.
=== Формат DX ===
Загрузка с дисков формата DX предусмотрена только в прошивке 3.03 — команда «X».
'''''TODO'''''


== Таймер и звук ==
== Таймер и звук ==
Есть два таймера.
: ''См. также: [[Немига/Звук]]''
 
Схема таймера построен на микросхеме таймера 588ВИ1. Микросхема имеет два независимых 16-разрядных счётчика.


Таймер 1 — на 8 МГц, задержка задаётся в регистре 170022. Плюс для этого таймера есть делитель на степени двойки, задаваемый битами 0..2 регистра 170030 — это «октава». Так, например, для получения ноты A4 («ля» первой октавы, 440 Гц) мы задаём октаву 4 и задержку 1136, получаем: <code>8000000 / 2/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>


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


<pre>
<pre>
Строка 365: Строка 416:
                                 1  0  запуск по CO2
                                 1  0  запуск по CO2
                                 1  1  запуск по C2
                                 1  1  запуск по C2
</pre>
Громкость 0..3 задаётся битами 4..3 регистра 170030.
<pre>
  170030  Регистр октавы и громкости
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8  7  6│ 5  4  3│ 2  1  0│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┘
                                    │  │  └──┴──┴─ Октава 1..7
                                    └──┴─ Громкость 0..3
</pre>
</pre>


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


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


== Порт принтера ==
== Порт принтера ==
Строка 393: Строка 456:
</pre>
</pre>
'''''TODO'''''
'''''TODO'''''
== Производительность ==
Тест SPEED показывает, что Немига работает немного быстрее чем УКНЦ.
Сравнение реальной машины версии 4.06 (MiX [http://zx-pk.ru/threads/20590-emulyator-nemiga.html?p=891570&viewfull=1#post891570]) и двух УКНЦ (Alex_K):
                    Немига УКНЦ1 УКНЦ2
сложение рег-рег    760  624  672    тыс.оп/сек
сложение рег-пам    328  240  289    тыс.оп/сек
умножение рег-рег    152    80    64    тыс.оп/сек
деление рег-рег      256    80    64    тыс.оп/сек


== Ссылки ==
== Ссылки ==
* ТУ 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. Техническое описание и инструкция по эксплуатации]
* [http://myadel-gimnaz.by/node/107 КУВТ <Немига>]
* [http://myadel-gimnaz.by/node/107 КУВТ «Немига»]
* [http://www.kaznachey.com/doc/5r1Jfo7tA6r/ Постановление Совета министров Белорусской ССР дополнительных мерах по обеспечению учебных заведений республики электронно-вычислительной техникой>]
* [http://www.kaznachey.com/doc/5r1Jfo7tA6r/ Постановление Совета министров Белорусской ССР «О дополнительных мерах по обеспечению учебных заведений республики электронно-вычислительной техникой»]
 
[[Категория:Немига|*]]

Версия от 16:01, 25 июля 2017

Этот документ создан для 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] -- на Немиге три отличия:

 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 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) — сделано это, очевидно, для ускорения вывода на экран.

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

170000 Память Используются микросхемой, выполняющей операции умножения/делениия
170002
170004
170006 Регистр данных клавиатуры (байт 170006),
регистр фиксации HALT-запросов (байт 170007)
170010 Адаптер
локальной сети
состояние
170012 данные
170014 ???
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] (здесь детектируется регистр 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│
 └─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─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 = готов

Видео

Видео-контроллер формирует растр размером 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    *
  0xff			1b    *
  Checksum		2b
Sector			130b
  Data			128b
  Checksum		2b
...

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

Формат MX

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

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

Формат DX

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

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

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

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

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

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

Ссылки