Электроника МС 0515: различия между версиями

Материал из Emuverse
(Новая страница: «'''Электроника МС0515''' — советский компьютер. == Контроллер НГМД == <pre> 177602 Системный реги…»)
 
(не показано 37 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{emuverse}}
'''Электроника МС0515''' — советский компьютер.
'''Электроника МС0515''' — советский компьютер.
Разработан в Воронеже в 1990 году (в процессе разработки назывался '''Электроника УБПК'''), выпускался на воронежском заводе «Процессор».
== Технические характеристики ==
* Процессор: [[КР1807ВМ1]] на частоте 7,5 МГц — аналог процессора DEC T11, по системе команд совместим с [[PDP-11]], [[Электроника-60]], [[Диалоговый вычислительный комплекс|ДВК]]
* Оперативная память: 128 КБ
* ПЗУ: 16 КБ
* Видео
** видеорежим «среднего разрешения» 320×200, 8 цветов; на каждый горизонтальный октет из 8 точек можно используется 2 цвета из палитры 8 цветов, признаки яркости и мерцания; набор цветов повторяет палитру компьютера [[ZX Spectrum]], имеется также «бордюр» (неиспользуемая область экрана), цвет которого выбирается из той же палитры
** видеорежим «высокого разрешения» 640×200, 2 цвета
* Контроллер дисковода: на основе [[КР1818ВГ93]] (аналог [[WD1793]]), драйвер <code>DZ</code>: 80 дорожек по 10 секторов, 512 байт в секторе
* Клавиатура: Электроника МС7004 (отдельный блок) либо Электроника МС7007 (встроенная)
* Программируемый таймер на [[КР580ВИ53]] (аналог [[i8253]]): каналы 0 и 1 тактируют клавиатуру и порт принтера, канал 2 доступен пользователю
* Параллельный порт
== Процессор ==
КР1807ВМ1
Регистр режима в битах 13-15 имеет 1 1 1, что задаёт адрес старта — 172000 и адрес рестарта 172004.
== Прерывания ==
<pre>
IRQ  CPx  Pri Vec  Device
─────────────────────────────────
11  LHLL  6  100  timer
  9  LHHL  6  110  serial RX
  8  LHHH  6  114  serial TX
  5  HLHL  5  130  7004 keyboard
  3  HHLL  4  060  7007 keyboard
  2  HHLH  4  064  vblank
</pre>
Кроме того, есть ряд зарезервированных векторов прерываний:
<pre>
Vec  Описание
─────────────────────────────────
000  Устройство вызвало прерывание, но не установило адрес вектора
004  Недопустимый режим для команд JMP / JSR
010  Недопустимая/зарезервированная инструкция
014  Инструкция BPT или установлен бит T
020  Инструкция IOT
024  Сбой питания
030  Инструкция EMT
034  Инструкция TRAP
</pre>
== Регистры ==
<pre>
  177400  Регистр диспетчера памяти
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│15│14 13 12│11 10  9│ 8│ 7  6│ 5  4  3│ 2  1  0│
└──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
        │  │  │  │  │  │  │  └──┴──┴──┴──┴──┴──┴─ Выбор ОЗУ: 1 - осн., 0 - доп.
ИРПР-М ─┴──┘  │  │  │  └───── Прерывание от монитора, инициируется программно изменением этого бита
              │  │  └──────── Прерывание от таймера
              ├──┤--------└─ Включение ВОЗУ в основную память: 1 - включено
              0  0 - 000000-037777
              0  1 - 040000-077777
              1  x - 100000-137777
</pre>
<pre>
  177600  Системный регистр A
┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
│15                    8│ 7  6│ 5  4  3│ 2  1  0│
└--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
              Выбор ПЗУ ──┘  │  │  │  └──│──┴──┴─ Выбор привода НГМД
              Запись на НМЛ ──┘  │  │    └─────── Двигатель НГМД вкл/выкл
              Светодиоды 2 и 1 ─┴──┘       
</pre>
<pre>
  177602  Системный регистр B
┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
│15                    8│ 7  6│ 5  4  3│ 2  1  0│
└--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
              Чтение НМЛ ──┘  │  │  │  │  │  │  └─ INTR НГМД
                      ИРПР-М ─┴──┘  │  │  │  └──── DRQ НГМД
                                    ├──┤  └─────── Готовность НГМД: 0 - готов
                  Кадровая частота 0  0 - 50 Гц
                                    0  1 - 72 Гц
                                    1  x - 60 Гц
</pre>
<pre>
  177604  Системный регистр C
┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
│15                    8│ 7  6│ 5  4  3│ 2  1  0│
└--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
            Таймер звука ──┘  │  │  │  │  └──┴──┴─ Цвет бордюра
            Звук вкл/выкл ────┘  │  │  │ 
            Тон звука ───────────┘  │  └─ Разрешение экрана 0 - среднее, 1 - высокое
                      Светодиод 3 ──┘
</pre>


== Контроллер НГМД ==
== Контроллер НГМД ==
Системные регистры имеют ряд флагов, отвечающих за работу НГМД:
<pre>
<pre>
   177602 Системный регистр B
   177600 Системный регистр A
  ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
  ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
  │15                    8│ 7  6│ 5  4  3│ 2  1  0│ Номер  Название
  │15                    8│ 7  6│ 5  4  3│ 2  1  0│ Номер  Название
Строка 12: Строка 108:
                   Двигатель НГМД включен ─┘  1  0    2
                   Двигатель НГМД включен ─┘  1  0    2
                     0 - вкл. 1 - выкл.      1  1    3
                     0 - вкл. 1 - выкл.      1  1    3
  177602  Системный регистр B
┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
│15                    8│ 7  6│ 5  4  3│ 2  1  0│
└--┴--┴--┴--┴--┴--┴--┴--└──┴──┴──┴──┴──┴─┬┴─┬┴─┬┘
                                          │  │  └─ INTR НГМД
                                          │  └──── DRQ НГМД
                                          └─────── Готовность НГМД: 0 - готов
</pre>
</pre>
Регистры контроллера НГМД:
Сам контроллер построен на КР1818ВГ93 (аналог WD1793).
* 177640 — регистр состояния (чтение)
 
* 177640 — регистр команд (запись)
Регистры контроллера НГМД (8-разрядные):
* 177640 (чтение) — регистр состояния
* 177640 (запись) — регистр команд
* 177642 — регистр дорожки
* 177642 — регистр дорожки
* 177644 — регистр сектора
* 177644 — регистр сектора
* 177646 — регистр данных
* 177646 — регистр данных
<pre>
  177640 (чтение)  Регистр состояния
                ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐ 
                │  7      6  │  5      4      3  │  2      1      0  │ 
    Команда      └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘ 
  Тип I          │  Not    Write    Head    Seek    CRC  Track 0  Index    Busy │
                │ ready  protect  loaded  error  error                        │
  Read Address  │  Not      0      0      RNF    CRC    Lost    DRQ    Busy │
                │ ready                          error    data                │
  Read Sector    │  Not      0    Record  RNF    CRC    Lost    DRQ    Busy │
                │ ready            type          error    data                │
  Read Track    │  Not      0      0      0      0      Lost    DRQ    Busy │
                │ ready                                    data                │
  Write Sector  │  Not    Write  Write    RNF    CRC    Lost    DRQ    Busy │
                │ ready  protect  fault          error    data                │
  Write Track    │  Not    Write  Write    0      0      Lost    DRQ    Busy │
                │ ready  protect  fault                    data                │
</pre>
<pre>
  177640 (запись)  Регистр команды                 
┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐ 
│15                    8│ 7  6│ 5  4  3│ 2  1  0│ 
└--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘ 
  Тип    Команда        │  │  │  │  │  │  │  │   
    I      Restore        0  0  0  0  h  V  r1 r0  r1 r0 — Stepping Motor Rate (6/12/20/30 ms)
    I      Seek            0  0  0  1  h  V  r1 r0  V — Track Number Verify Flag (0: no verify, 1: verify on dest track)
    I      Step            0  0  1  T  h  V  r1 r0  h — Head Load Flag (1: load head at beginning, 0: unload head)
    I      Step-In        0  1  0  T  h  V  r1 r0  T — Track Update Flag (0: no update, 1: update Track Register)
    I      Step-Out        0  1  1  T  h  V  r1 r0 
    II    Read Sector    1  0  0  m  S  E  C  0    C — Side Compare Flag (0: disable side compare, 1: enable side comp)
    II    Write Sector    1  0  1  m  S  E  C  a0  a0 — Data Address Mark (0: FB, 1: F8 (deleted DAM))
    III    Read Address    1  1  0  0  0  E  0  0    E — 15 ms delay (0: no 15ms delay, 1: 15 ms delay)
    III    Read Track      1  1  1  0  0  E  0  0    S — Side Compare Flag (0: compare for side 0, 1: compare for side 1)
    III    Write Track    1  1  1  1  0  E  0  0    m — Multiple Record Flag (0: single record, 1: multiple records)   
    IV    Force Interrupt 1  1  0  1  i3 i2 i1 i0  i3 i2 i1 i0 — Interrupt Condition Flags
</pre>
В основном, в работе используются следующие команды:
* C0 — чтение адреса (Read Address) — контроллер находит следующую метку заголовка сектора, читает 6 байт заголовка сектора; важно, что по завершению команды в регистре сектора 177644 находится номер текущей дорожки.
* 1D — поиск (Seek) — в регистре дорожки 177642 находится номер текущей дорожки, в регистре сектора 177644 — номер дорожки на которую нужно перейти; контроллер перемещает головку на нужную дорожку и обновляет регистр дорожки.
* 43 — шаг вперёд (Step In), скорость шага 30 мс.
* 63 — шаг назад (Step Out), скорость шага 30 мс.
* 80 — запись сектора (Write Sector).
* F4 — запись дорожки (Write Track) — используется при форматировании диска.
Формат дискет: 1 сторона (0), 80 цилиндров (0-79), по 10 секторов (1-10) на трек, 512 байт в секторе.
=== Структура дорожки ===
Структура дорожки восстановлена по коду FORML.SAV с дискеты 059.dsk.<br />
Отсчёт идёт от индексного отверстия. Количество байт указано десятичное, байты — шестнадцатеричные значения, в скобках указано что реально записывается на диск, в особых случаях.
<pre>
  Кол-во байт  Записываемые байты
─────────────────────────────────────────────────
    │  54        4E
    │  12        00
105-┤  4        F6 (записывается C2)
    │  35        4E
  ──── Начало сектора 1..10 ────────────────────┐
    │  8        00                            │
    │  3        F5 (записывается A1)          │
    │  1        FE — маркер заголовка сектора │
    │  1        tt — номер дорожки 0..79      │
    │  1        00 — сторона: 0 - низ        │
    │  1        0s — номер сектора 1..10      │
    │  1        02 — 512 байт на сектор      │
    │  1(2)    F7 (записывается 2 байта CRC) │
    │  22        4E                            │
    │  12        00                            │
    │  3        F5 (записывается A1)          │
    │  1        FB — маркер данных            │
612-┤ 512        xx — данные сектора          │
(614)│  1(2)    F7 (записывается 2 байта CRC) │
    │  44        4E                            │
  ──── Конец сектора ───────────────────────────┘
    │ 352        4E — до конца дорожки
─────────────────────────────────────────────────
Всего 6575(6577)
</pre>
== Таймер ==
Таймер на КР580ВИ53 — трёхканальный.
Все регистры — 8-разрядные:
{|class=standard style="text-align: center"
! Канал !! Регистр чтения !! Регистр записи !! Использование
|-
| канал 0 || 177500 || 177520 || Тактирует клавиатуру
|-
| канал 1 || 177502 || 177522 || Порт принтера
|-
| канал 2 || 177504 || 177524 || Звук и отсчёт интервалов
|-
| упр. слово || 177506 || 177526 ||
|}
В процессе загрузки после начальных тестов выдаются звуки (здесь в начале значение задержки таймера, затем вычисленные частоты):
<pre>
1798 = 6040. = 331.126 Гц ~= 329,63 Гц E  1 октавы
12b9 = 4793. = 417.275 Гц ~= 415,30 Гц G♯ 1 октавы
0fbf = 4031. = 496.155 Гц ~= 493,88 Гц B  1 октавы
0bcc = 3020. = 662.252 Гц ~= 659,26 Гц E  2 октавы
1798 = 6040. = 331.126 Гц ~= 329,63 Гц E  1 октавы
</pre>
Подпрограмма генерации звука, R3 задаёт задержку для таймера:
<pre>
174550: BIC    #000340, @#177604    ; таймер звука выкл, звук выкл, тон звука выкл
174556: MOVB  #000266, @#177526    ; канал 2: будет загрузка младшего и старшего байта, режим 3 (генератор меандра)
174564: MOV    #000140, R4          ; значение счётчика = 96.
174570: MOVB  R3, @#177524        ; передаём младший байт
174574: SWAB  R3                  ;
174576: MOVB  R3, @#177524        ; передаём старший байт
174602: BIS    #000300, @#177604    ; таймер звука вкл, звук вкл
174610: MOV    174652, R0          ; значение малого счётчика = 005777
174614: SOB    R0, 174614          ; ожидаем
174616: SOB    R4, 174610          ; ожидаем
174620: BIC    #000340, @#157706    ; таймер звука выкл, звук выкл, тон звука выкл
174626: MOV    @#157706, @#177604
174634: MOV    #000002, R4          ; счётчик = 2
174640: MOV    174654, R0          ; значение малого счётчика = 017777
174644: SOB    R0, 174644          ; ожидаем
174646: SOB    R4, 174640          ; ожидаем
174650: RETURN
174652: .WORD  005777
174654: .WORD  017777
</pre>
== Клавиатура ==
Порты 177542/177544 должны возвращать 177777 -- наличие ноля в одном из битов показывает что клавиша нажата.
== Процесс загрузки ==
[[Файл:Elektronika MS0515 boot screen interlaced.png|thumb|Экран в процессе загрузки]]
# Тесты процессора, памяти
# Тест клавиатуры
# Тест НГМД:
## команда C0, команда 1D (переход на track 1)
## 5 команд 43 (переход на track 6), команда C0, проверка того что в регистре сектора появился номер дорожки 6
## 5 команд 63 (возврат на track 1), команда C0
# Чтение track 1 sector 1: команда C0, команда 80 — читаются 512 байт начиная с адреса 000000
# Запуск с адреса 000000
== ПЗУ ==
ПЗУ размером 16 Кбайт.
Известны две версии ПЗУ:
{| class="standard"
! MD5 checksum !! Примечания
|-
| 3d60d719ca650b3fab27a0daf0a4d317 || вначале много FF
|-
| b92cda2d83117ebbba2340acfadbf130 || вначале много 00
|}
== Эмуляция ==
Существует несколько эмуляторов этого компьютера:
* Мультисистемный эмулятор MESS содержит драйвер <code>ms0515</code> [https://github.com/mamedev/mame/blob/master/src/mame/drivers/ms0515.cpp]
* [http://zx-pk.ru/threads/19698-emulyator-ms-0515-emustudio.html Эмулятор МС-0515 EmuStudio]
* [https://github.com/nzeemin/ms0515btl MS0515BTL]


== Ссылки ==
== Ссылки ==
* [https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0_%D0%9C%D0%A1_0515 Электроника МС 0515 в Википедии]
* [http://zx-pk.ru/threads/15146-ms-0515.html Тема «МС-0515» на zx-pk.ru]
* [http://bitsavers.trailing-edge.com/pdf/dec/pdp11/t11/T11_UsersMan.pdf] — описание процессора T11, оригинала КР1807ВМ1
* [http://msx.hansotten.com/technical-info/wd1793/ WD1793] на MSX Info Pages
* [http://www.tis.kz/forum/topic.php?forum=31&topic=3 Электроника МС0585, МС0515 — Документация]
[[Категория:Электроника МС 0515]]

Версия от 22:37, 2 июля 2018

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

Электроника МС0515 — советский компьютер.

Разработан в Воронеже в 1990 году (в процессе разработки назывался Электроника УБПК), выпускался на воронежском заводе «Процессор».

Технические характеристики

  • Процессор: КР1807ВМ1 на частоте 7,5 МГц — аналог процессора DEC T11, по системе команд совместим с PDP-11, Электроника-60, ДВК
  • Оперативная память: 128 КБ
  • ПЗУ: 16 КБ
  • Видео
    • видеорежим «среднего разрешения» 320×200, 8 цветов; на каждый горизонтальный октет из 8 точек можно используется 2 цвета из палитры 8 цветов, признаки яркости и мерцания; набор цветов повторяет палитру компьютера ZX Spectrum, имеется также «бордюр» (неиспользуемая область экрана), цвет которого выбирается из той же палитры
    • видеорежим «высокого разрешения» 640×200, 2 цвета
  • Контроллер дисковода: на основе КР1818ВГ93 (аналог WD1793), драйвер DZ: 80 дорожек по 10 секторов, 512 байт в секторе
  • Клавиатура: Электроника МС7004 (отдельный блок) либо Электроника МС7007 (встроенная)
  • Программируемый таймер на КР580ВИ53 (аналог i8253): каналы 0 и 1 тактируют клавиатуру и порт принтера, канал 2 доступен пользователю
  • Параллельный порт

Процессор

КР1807ВМ1

Регистр режима в битах 13-15 имеет 1 1 1, что задаёт адрес старта — 172000 и адрес рестарта 172004.

Прерывания

 IRQ  CPx  Pri Vec  Device
─────────────────────────────────
 11   LHLL  6  100  timer
  9   LHHL  6  110  serial RX
  8   LHHH  6  114  serial TX
  5   HLHL  5  130  7004 keyboard
  3   HHLL  4  060  7007 keyboard
  2   HHLH  4  064  vblank

Кроме того, есть ряд зарезервированных векторов прерываний:

 Vec  Описание
─────────────────────────────────
 000  Устройство вызвало прерывание, но не установило адрес вектора
 004  Недопустимый режим для команд JMP / JSR
 010  Недопустимая/зарезервированная инструкция
 014  Инструкция BPT или установлен бит T
 020  Инструкция IOT
 024  Сбой питания
 030  Инструкция EMT
 034  Инструкция TRAP

Регистры

  177400  Регистр диспетчера памяти
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8│ 7  6│ 5  4  3│ 2  1  0│
 └──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
         │  │  │  │  │  │  │  └──┴──┴──┴──┴──┴──┴─ Выбор ОЗУ: 1 - осн., 0 - доп.
 ИРПР-М ─┴──┘  │  │  │  └───── Прерывание от монитора, инициируется программно изменением этого бита
               │  │  └──────── Прерывание от таймера
               ├──┤--------└─ Включение ВОЗУ в основную память: 1 - включено
               0  0 - 000000-037777
               0  1 - 040000-077777
               1  x - 100000-137777
  177600  Системный регистр A
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│
 └--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
               Выбор ПЗУ ──┘  │  │  │  └──│──┴──┴─ Выбор привода НГМД
              Запись на НМЛ ──┘  │  │     └─────── Двигатель НГМД вкл/выкл
               Светодиоды 2 и 1 ─┴──┘         
  177602  Системный регистр B
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│
 └--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
              Чтение НМЛ ──┘  │  │  │  │  │  │  └─ INTR НГМД
                      ИРПР-М ─┴──┘  │  │  │  └──── DRQ НГМД
                                    ├──┤  └─────── Готовность НГМД: 0 - готов 
                   Кадровая частота 0  0 - 50 Гц
                                    0  1 - 72 Гц
                                    1  x - 60 Гц
  177604  Системный регистр C
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│
 └--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
            Таймер звука ──┘  │  │  │  │  └──┴──┴─ Цвет бордюра
            Звук вкл/выкл ────┘  │  │  │  
            Тон звука ───────────┘  │  └─ Разрешение экрана 0 - среднее, 1 - высокое
                      Светодиод 3 ──┘

Контроллер НГМД

Системные регистры имеют ряд флагов, отвечающих за работу НГМД:

  177600  Системный регистр A
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│ Номер   Название
 └--┴--┴--┴--┴--┴--┴--┴--└──┴──┴──┴──┴─┬┴─┬┴─┬┴─┬┘ привода устройства
                                       │  │  └──┴─ физич.  логическое
                  Поверхность НГМД ────┘  │  0  0     0     DZ0 (низ), DZ2 (верх)
                    0 - низ 1 - верх      │  0  1     1     DZ1 (низ), DZ3 (верх)
                  Двигатель НГМД включен ─┘  1  0     2
                    0 - вкл. 1 - выкл.       1  1     3

  177602  Системный регистр B
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│
 └--┴--┴--┴--┴--┴--┴--┴--└──┴──┴──┴──┴──┴─┬┴─┬┴─┬┘
                                          │  │  └─ INTR НГМД
                                          │  └──── DRQ НГМД
                                          └─────── Готовность НГМД: 0 - готов 

Сам контроллер построен на КР1818ВГ93 (аналог WD1793).

Регистры контроллера НГМД (8-разрядные):

  • 177640 (чтение) — регистр состояния
  • 177640 (запись) — регистр команд
  • 177642 — регистр дорожки
  • 177644 — регистр сектора
  • 177646 — регистр данных
  177640 (чтение)  Регистр состояния
                 ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐   
                 │   7       6   │   5       4       3   │   2       1       0   │   
    Команда      └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘   
  Тип I          │  Not    Write    Head    Seek    CRC   Track 0  Index    Busy │
                 │ ready  protect  loaded  error   error                         │
  Read Address   │  Not      0       0      RNF     CRC     Lost    DRQ     Busy │
                 │ ready                           error    data                 │
  Read Sector    │  Not      0     Record   RNF     CRC     Lost    DRQ     Busy │
                 │ ready            type           error    data                 │
  Read Track     │  Not      0       0       0       0      Lost    DRQ     Busy │
                 │ ready                                    data                 │
  Write Sector   │  Not    Write   Write    RNF     CRC     Lost    DRQ     Busy │
                 │ ready  protect  fault           error    data                 │
  Write Track    │  Not    Write   Write     0       0      Lost    DRQ     Busy │
                 │ ready  protect  fault                    data                 │
  177640 (запись)  Регистр команды                   
 ┌--┬--┬--┬--┬--┬--┬--┬--┌──┬──┬──┬──┬──┬──┬──┬──┐   
 │15                    8│ 7  6│ 5  4  3│ 2  1  0│   
 └--┴--┴--┴--┴--┴--┴--┴--└─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘   
   Тип     Команда         │  │  │  │  │  │  │  │    
    I      Restore         0  0  0  0  h  V  r1 r0   r1 r0 — Stepping Motor Rate (6/12/20/30 ms)
    I      Seek            0  0  0  1  h  V  r1 r0   V — Track Number Verify Flag (0: no verify, 1: verify on dest track)
    I      Step            0  0  1  T  h  V  r1 r0   h — Head Load Flag (1: load head at beginning, 0: unload head)
    I      Step-In         0  1  0  T  h  V  r1 r0   T — Track Update Flag (0: no update, 1: update Track Register)
    I      Step-Out        0  1  1  T  h  V  r1 r0   
    II     Read Sector     1  0  0  m  S  E  C  0    C — Side Compare Flag (0: disable side compare, 1: enable side comp)
    II     Write Sector    1  0  1  m  S  E  C  a0   a0 — Data Address Mark (0: FB, 1: F8 (deleted DAM))
    III    Read Address    1  1  0  0  0  E  0  0    E — 15 ms delay (0: no 15ms delay, 1: 15 ms delay)
    III    Read Track      1  1  1  0  0  E  0  0    S — Side Compare Flag (0: compare for side 0, 1: compare for side 1)
    III    Write Track     1  1  1  1  0  E  0  0    m — Multiple Record Flag (0: single record, 1: multiple records)     
    IV     Force Interrupt 1  1  0  1  i3 i2 i1 i0   i3 i2 i1 i0 — Interrupt Condition Flags	

В основном, в работе используются следующие команды:

  • C0 — чтение адреса (Read Address) — контроллер находит следующую метку заголовка сектора, читает 6 байт заголовка сектора; важно, что по завершению команды в регистре сектора 177644 находится номер текущей дорожки.
  • 1D — поиск (Seek) — в регистре дорожки 177642 находится номер текущей дорожки, в регистре сектора 177644 — номер дорожки на которую нужно перейти; контроллер перемещает головку на нужную дорожку и обновляет регистр дорожки.
  • 43 — шаг вперёд (Step In), скорость шага 30 мс.
  • 63 — шаг назад (Step Out), скорость шага 30 мс.
  • 80 — запись сектора (Write Sector).
  • F4 — запись дорожки (Write Track) — используется при форматировании диска.

Формат дискет: 1 сторона (0), 80 цилиндров (0-79), по 10 секторов (1-10) на трек, 512 байт в секторе.

Структура дорожки

Структура дорожки восстановлена по коду FORML.SAV с дискеты 059.dsk.
Отсчёт идёт от индексного отверстия. Количество байт указано десятичное, байты — шестнадцатеричные значения, в скобках указано что реально записывается на диск, в особых случаях.

  Кол-во байт   Записываемые байты
─────────────────────────────────────────────────
     │  54        4E
     │  12        00
 105-┤   4        F6 (записывается C2)
     │  35        4E
  ──── Начало сектора 1..10 ────────────────────┐
     │   8        00                            │
     │   3        F5 (записывается A1)          │
     │   1        FE — маркер заголовка сектора │
     │   1        tt — номер дорожки 0..79      │
     │   1        00 — сторона: 0 - низ         │
     │   1        0s — номер сектора 1..10      │
     │   1        02 — 512 байт на сектор       │
     │   1(2)     F7 (записывается 2 байта CRC) │
     │  22        4E                            │
     │  12        00                            │
     │   3        F5 (записывается A1)          │
     │   1        FB — маркер данных            │
 612-┤ 512        xx — данные сектора           │
(614)│   1(2)     F7 (записывается 2 байта CRC) │
     │  44        4E                            │
  ──── Конец сектора ───────────────────────────┘
     │ 352        4E — до конца дорожки
─────────────────────────────────────────────────
Всего 6575(6577)

Таймер

Таймер на КР580ВИ53 — трёхканальный. Все регистры — 8-разрядные:

Канал Регистр чтения Регистр записи Использование
канал 0 177500 177520 Тактирует клавиатуру
канал 1 177502 177522 Порт принтера
канал 2 177504 177524 Звук и отсчёт интервалов
упр. слово 177506 177526

В процессе загрузки после начальных тестов выдаются звуки (здесь в начале значение задержки таймера, затем вычисленные частоты):

1798 = 6040. = 331.126 Гц ~= 329,63 Гц E  1 октавы
12b9 = 4793. = 417.275 Гц ~= 415,30 Гц G♯ 1 октавы
0fbf = 4031. = 496.155 Гц ~= 493,88 Гц B  1 октавы
0bcc = 3020. = 662.252 Гц ~= 659,26 Гц E  2 октавы
1798 = 6040. = 331.126 Гц ~= 329,63 Гц E  1 октавы

Подпрограмма генерации звука, R3 задаёт задержку для таймера:

174550: BIC    	#000340, @#177604    ; таймер звука выкл, звук выкл, тон звука выкл
174556: MOVB   	#000266, @#177526    ; канал 2: будет загрузка младшего и старшего байта, режим 3 (генератор меандра)
174564: MOV    	#000140, R4          ; значение счётчика = 96.
174570: MOVB   	R3, @#177524         ; передаём младший байт
174574: SWAB   	R3                   ;
174576: MOVB   	R3, @#177524         ; передаём старший байт
174602: BIS    	#000300, @#177604    ; таймер звука вкл, звук вкл
174610: MOV    	174652, R0           ; значение малого счётчика = 005777
174614: SOB    	R0, 174614           ; ожидаем
174616: SOB    	R4, 174610           ; ожидаем
174620: BIC    	#000340, @#157706    ; таймер звука выкл, звук выкл, тон звука выкл
174626: MOV    	@#157706, @#177604
174634: MOV    	#000002, R4          ; счётчик = 2
174640: MOV    	174654, R0           ; значение малого счётчика = 017777
174644: SOB    	R0, 174644           ; ожидаем
174646: SOB    	R4, 174640           ; ожидаем
174650: RETURN
174652: .WORD   005777
174654: .WORD   017777

Клавиатура

Порты 177542/177544 должны возвращать 177777 -- наличие ноля в одном из битов показывает что клавиша нажата.

Процесс загрузки

Экран в процессе загрузки
  1. Тесты процессора, памяти
  2. Тест клавиатуры
  3. Тест НГМД:
    1. команда C0, команда 1D (переход на track 1)
    2. 5 команд 43 (переход на track 6), команда C0, проверка того что в регистре сектора появился номер дорожки 6
    3. 5 команд 63 (возврат на track 1), команда C0
  4. Чтение track 1 sector 1: команда C0, команда 80 — читаются 512 байт начиная с адреса 000000
  5. Запуск с адреса 000000

ПЗУ

ПЗУ размером 16 Кбайт.

Известны две версии ПЗУ:

MD5 checksum Примечания
3d60d719ca650b3fab27a0daf0a4d317 вначале много FF
b92cda2d83117ebbba2340acfadbf130 вначале много 00

Эмуляция

Существует несколько эмуляторов этого компьютера:

Ссылки