Электроника МС 0515

Материал из Emuverse
(перенаправлено с «Электроника МС0515»)
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

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

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

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

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

Процессор

КР1807ВМ1 — аналог процессора DEC T11. См. [1]

Система команд — LSI/11, но без команды MARK. Нет команд FIS (MUL/DIV/ASH/ASHC).

Регистр режима в битах 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..177437 (W) Диспетчер памяти
177440 (R) Клавиатура МС 7004 Регистр данных
177460 (W) Регистр данных
177442 (R) Регистр состояния
177462 (W) Регистр управления
177500 Программируемый таймер Регистр скорости обмена клавиатуры
177502 Регистр скорости обмена ПЧ
177504 Регистр скорости обмена ДИН
177506 (RW) Регистр управления таймера
177540 Параллельный интерфейс
клавиатуры МС 7007
или обмена по ИРПР
Регистр порта A
177542 Регистр порта B
177544 Регистр порта C
177546 (RW) Регистр управления ИРПР
177600 Параллельный интерфейс
системных регистров
Системный регистр A
177602 Системный регистр B
177604 Системный регистр C
177606 (RW) Системный регистр управления
177640 (R) Контроллер НГМД Состояние НГМД
177640 (W) Команда НГМД
177642 (RW) Регистр дорожки
177644 (RW) Регистр сектора
177646 (RW) Регистр данных
177700 (R) Последовательный интерфейс
Стык С2
Регистр данных ПЧ
177720 (W) Регистр данных ПЧ
177702 (R) Регистр состояния ПЧ
177722 (W) Регистр управления ПЧ
177770 (RW) Адрес обслуживания останова и системного таймера

Системные регистры

  177400  Регистр диспетчера памяти
 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
 │15│14 13 12│11 10  9│ 8│ 7  6│ 5  4  3│ 2  1  0│
 └──┴──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
         │  │  │  │  │  │  │  └──┴──┴──┴──┴──┴──┴─ Выбор ОЗУ: 1 - осн., 0 - доп.
 ИРПР-М ─┴──┘  │  │  │  └───── Прерывание от монитора, инициируется программно изменением этого бита
               │  │  └──────── Прерывание от таймера: 1 - разрешено
               ├──┤--------└─ Включение ВОЗУ в основную память: 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 ──┘                           320x200      640x200

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

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

  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)

Интерлив секторов

http://zx-pk.ru/threads/15146-ms-0515.html?p=431954&viewfull=1#post431954 Alex_K

Собственно таблица интерлива:
0 1 2 3 4 5 6 7 8 9
==============
0 5 1 6 2 7 3 8 4 9
4 9 0 5 1 6 2 7 3 8
3 8 4 9 0 5 1 6 2 7
2 7 3 8 4 9 0 5 1 6
1 6 2 7 3 8 4 9 0 5

http://zx-pk.ru/threads/15146-ms-0515.html?p=431962&viewfull=1#post431962 Patron Драйвер DZ переставляет блоки в образе по следующему алгоритму:

int BlockNumber_DZ_Encode( int nBlock )
{
    int track  = nBlock / 10;
    int sector = nBlock % 10;

    int sector_00 = ( track*2 )% 10;

    sector = ( sector_00 + sector*2 )% 10;

    if( nBlock % 10 >= 5 ) sector++;

    track++;
    if( track > 79 ) track=0;
  
    return track*10 + sector;
}

Таймер

Таймер на КР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 -- наличие ноля в одном из битов показывает что клавиша нажата.

ПЗУ

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

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

Усл.название MD5 checksum Примечания
ROM A b92cda2d83117ebbba2340acfadbf130 вначале много 00; есть команда L в пульте; ошибка в подсчёте контрольной суммы ПЗУ
ROM B 3d60d719ca650b3fab27a0daf0a4d317 вначале много FF; нет команды L в пульте

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

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

Эмуляция

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

Ссылки