Орион-Про/Организация памяти

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: (C) 1990-1996 ORIONSOFT

1. Организация оперативной памяти

1.1. Страничная и сегментная организация

Оперативная память компьютера «Orion-Pro» имеет страничную и сегментную организацию. Управление режимами памяти осуществляется с помощью порта диспетчера.

Одна страница ОЗУ имеет размер 64 Кбайта и соответствует максимально возможному объему памяти, непосредственно адресуемому процессором Z80. Каждую страницу условно можно разделить на 4 сегмента размером по 16 Кбайт.

Количество страниц ОЗУ на основной плате равно 8 (их номера 0..7), что соответствует 32 сегментам и объему основной памяти 512 Кбайт. Для выбора номера рабочей (текущей) страницы используется порт с адресом 08H (для режима «Орион-128» — 0F900H). Все страницы равносильны, и нет необходимости работать именно в нулевой (только для режима Pro). В режиме «Орион-128» для переключения страниц ОЗУ можно использовать порт с адресом 0F9H.

Распределение сегментов по страницам основного ОЗУ:

        Стр.0  Стр.1  Стр.2  Стр.3  Стр.4  Стр.5  Стр.6  Стр.7
FFFFH ┌──────╥──────╥──────╥──────╥──────╥──────╥──────╥──────┐
      │   3  ║   7  ║  11  ║  15  ║  19  ║  23  ║  27  ║  31  │
C000H ├──────╫──────╫──────╫──────╫──────╫──────╫──────╫──────┤
      │   2  ║   6  ║  10  ║  14  ║  18  ║  22  ║  26  ║  30  │
8000H ├──────╫──────╫──────╫──────╫──────╫──────╫──────╫──────┤
      │   1  ║   5  ║   9  ║  13  ║  17  ║  21  ║  25  ║  29  │
4000H ├──────╫──────╫──────╫──────╫──────╫──────╫──────╫──────┤
      │   0  ║   4  ║   8  ║  12  ║  16  ║  20  ║  24  ║  28  │
0000H └──────╨──────╨──────╨──────╨──────╨──────╨──────╨──────┘

Доступ к сегментам ОЗУ осуществляется через три независимых окна, которые можно «открыть» в адресном пространстве процессора в пределах рабочей страницы ОЗУ:

  • Окно ОЗУ «RAM2» — 8000-BFFFH
  • Окно ОЗУ «RAM1» — 4000-7FFFH
  • Окно ОЗУ «RAM0» — 0000-3FFFH

Включение (открытие) каждого из окон осуществляется установкой соответствующего разряда D0, D1, D2 порта диспетчера 0AH в единицу, а отключение (закрытие) — установкой разряда в 0.

Назначение разрядов порта 0AH следующее:

  • D0 — включить окно ОЗУ «RAM0»
  • D1 — включить окно ОЗУ «RAM1»
  • D2 — включить окно ОЗУ «RAM2»
  • D3 — включить окно ПЗУ «ROM2-BIOS»
  • D4 — включить окно ПЗУ «ROM1-BIOS»
  • D5 — включить тактовую частоту процессора 2.5 МГц
  • D6 — отключить переключение ОЗУ 0F000H..0FFFFH (в режиме «Orion-128» игнорируется)
  • D7 — включить режим «Orion-128» (область 0F000H..0FFFFH недоступна для записи).

Использование разрядов D3..D7 будет описано ниже.

Для выбора сегментов в каждом из окон «RAM0», «RAM1», «RAM2» в компьютере предусмотрены три порта с адресами соответственно 04H, 05H, 06H, в которые могут быть записаны номера сегментов ОЗУ. Разрядность портов позволяет управлять переключением 256 сегментов, что составляет 4 Мбайта памяти. Это предел для расширения памяти на «Orion-Pro».

Заметим, что порты диспетчера 04H, 05H, 06H, 08H, 0AH доступны как для записи, так и для чтения.

Сегмент памяти, включенный в окне, имеет более высокий приоритет, чем основная память в рабочей странице. Так, например, если в рабочей странице 2 открыть окно «RAM1» (установкой разряда D1 порта 0AH в единицу) и включить в нем сегмент 16 (записью в порт 05H значения 16), то адресное пространство процессора будет распределено следующим образом:

                 Стр.2
    FFFFH ┌─────────────────┐                         Порт 0AH
    F000H ├ ─ ─ ─ ─ ─ ─ ─ ─ ┤                         -----
          │       11        │                         D2 D1 D0
    C000H ├─────────────────┤                          0  1  0
          │                 │                          │  │  │
          │       10        │       Окно «RAM2»  ──────┘  │  │
    8000H ├─────────────────┤                             │  │
          │┌────────────────┴┐                            │  │
          ││       16 ->(05H)│    < Окно «RAM1»  ─────────┘  │
    4000H ├┤                 │                               │
          │└────────────────┬┘                               │
          │        8        │       Окно «RAM3»  ────────────┘
    0000H └─────────────────┘


Таким образом, при доступе к памяти через окна ОЗУ над основной памятью страницы (тоже сегменты, но приписанные к данной странице) образуется как бы второй «слой».

Заметим, что область памяти 0F000H..0FFFFH только в режиме «Orion-Pro» (разряд D7 порта 0AH установлен в 0) доступна как для чтения, так и для записи. Кроме того, программно можно установить режим, при котором указанная область или переключается вместе с переключением страниц (D6=0), или не переключается (D6=1).

Если область памяти 0F000H..0FFFFH находится в не переключаемом режиме, то физически (аппаратно) там проектируется соответствующая часть 31 сегмента. Это позволяет весь сегмент 3 отдать под экран и иметь экран-0 так же 16 Кбайт, то есть 512х256 точек. Учитывая выше сказанное, программы пользователя не должны использовать 31 (1FH) сегмент. Недоступны для пользователя и сегменты 1B-1EH, которые использует для своих целей «TV-PRO».

В режиме «Orion-128» (разряд D7 порта 0AH установлен в 1) указанная область памяти является не переключаемой независимо от значения разряда D6, к тому же ячейки с адресами 0F400H..0FA00H доступны как порты (причем порты 0F800H..0FA00H доступны только на запись, так как при чтении по адресам 0F800H..0FFFFH включается ОЗУ).

Заметим, что разряд D5 порта диспетчера 0AH управляет выбором тактовой частоты компьютера: для D5=0 она составляет 10 МГц (5 МГц при перестановке перемычки J1/23), для D5=1 — 2.5 МГц. Режим с тактовой частотой 2.5 Мгц используется только для старых программ (игрушек) от «Орион-128».

Доступ к расширенной памяти, находящейся на внешней интерфейсной плате, в пределах первых 512 Кбайт также может быть как постраничным (страницы 8..15), так и посегментным (сегменты 32..63). Остальная расширенная память (свыше 1 Мбайта) не может переключаться страницами и доступна как сегменты через RAM-окна (номера сегментов 64..256).

1.2. Организация экранной памяти

Экранная память располагается в 0 и 1 страницах ОЗУ, причем количество экранов и распределение сегментов в них зависит от текущего цветового режима, задаваемого разрядами порта 0F8H:

   D4  D3  D2  D1  D0
    0   x   0   0   0   – монохромный, палитра 1
    0   x   0   0   1   – монохромный, палитра 2
    0   x   0   1   x   – запрет видеосигнала
    0   x   1   0   0   – 2-битный (4-цветный), палитра 1
    0   x   1   0   1   – 2-битный (4-цветный), палитра 2
    0   x   1   1   x   – 16-цветный с групповым кодированием
    0   1   1   1   x   – псевдо-цветной (цвет – в порт 0FCH)
    1   x   0   x   x   – 3-битный (8-цветный RGB)
    1   x   1   x   x   – 4-битный (16-цветный RGBI)

В монохромном режиме палитре 1 соответствует комбинация цветов — (черный, зеленый), палитре 2 — (белый, зеленый). В 4-цветном (2-х битовом) режиме палитре 1 соответствуют цвета — (черный, синий, зеленый, красный), палитре 2 — (белый, синий, зеленый, красный).

Код палитры для псевдо-цветного режима записывается в порт с адресом 0FCH.

Выбор на отображение одного из 4-х экранов выполняется путем записи номера экрана в порт 0FAH:

D0 \ номер экрана
D1 /
D6 – выключение регенерации ОЗУ
D7 – включение широкого экрана

Разряды D2D5 являются резервными.

Если разряд D7 установлен в единицу, то ширина экрана составляет 512 точек (64 байта), что при высоте 256 байт соответствует объему памяти 16 Кбайт. В противном случае экранная плоскость ОЗУ имеет ширину 384 точки (48 байт) и занимает объем 12 Кбайт.

В 3х битном и 4-х битном (EGA-режим) цветовых режимах допускается использование только двух экранов, поэтому разряд D0 порта 0FAH игнорируется.

Рассмотрим распределение сегментов экранного ОЗУ в различных цветовых режимах.

1.2.3 монохромный и псевдо-цветной режимы

В монохромном и псевдо-цветном режимах возможно использование до 4-х экранов, занимающих только сегменты 0-й страницы ОЗУ:

                Стр.0         Экран 12 К      Экран 16 К
              ┌───────┐        --------        --------
     Экран 0 >│   3   │      C000H..EFFFH    C000H..FFFFH
              ╞═══════╡
     Экран 1 >│   2   │      8000H..AFFFH    8000H..BFFFH
              ╞═══════╡
     Экран 2 >│   1   │      4000H..6FFFH    4000H..7FFFH
              ╞═══════╡
     Экран 3 >│   0   │      0000H..2FFFH    0000H..3FFFH
              └───────┘

В монохромном режиме единичному значению некоторого бита экранного сегмента ОЗУ соответствует засветка изображаемой точки, нулевому — гашение.

В псевдо-цветном режиме цвет отображаемых точек зависит от кода палитры, записанного в порт 0FCH. Старшие 4 бита значения этого порта определяют один из 16 цветов фона (для погашенных точек), младшие 4 бита — один из 16 цветов переднего плана (для засвеченных точек).

Заметим, что при широком экране-0 область 0F000H..0FFFFH экрана (не путать с системной областью 0F000H..0FFFFH) доступна только через окно. Прямой доступ к экрану возможен только по адресам 0C000-0EFFFH. Это относится ко всем цветовым режимам.

1.2.4. 4-цветный режим

В 4-цветном (2-битном) режиме цвет каждой отображаемой точки зависит от соответствующих битов двух экранных плоскостей (сегментов), находящихся в страницах 0 и 1 ОЗУ:

                Стр.0   Стр.1
              ┌───────┬───────┐
     Экран 0 >│   3   │   7   │
              ╞═══════╪═══════╡
     Экран 1 >│   2   │   6   │
              ╞═══════╪═══════╡
     Экран 2 >│   1   │   5   │
              ╞═══════╪═══════╡
     Экран 3 >│   0   │   4   │
              └───────┴───────┘
                  └──┐ ┌──┘
                     0 0  >  черный (белый)
                     0 1  >  красный
                     1 0  >  зеленый
                     1 1  >  синий

1.2.5. 8-цветный и 16-цветный режимы

Это новый графический режим. Функционально он тождествен EGA режиму на IBM PC AT (был широко распространен на 286 моделях). В 8-цветном (3-битном) и 16-цветном (4-битном) режимах для формирования отображаемой точки в каждом из двух экранов используются соответственно 3 и 4 плоскости экранного ОЗУ:

                Стр.0   Стр.1
              ┌───────┬───────┐
              │  3 (G)│  7 (I)│
     Экран 0 >├───────┼───────┤
              │  2 (R)│  6 (B)│
              ╞═══════╪═══════╡
              │  1 (G)│  5 (I)│
     Экран 1 >├───────┼───────┤
              │  0 (R)│  4 (B)│
              └───────┴───────┘

Сегментам 3 и 1 соответствует зеленый цвет (G), 2 и 0 — красный (R), 6 и 4 — синий (B), 7 и 5 (в 3-битном режиме не используются) — управление яркостью (I).

Путем записи комбинации битов в соответствующие сегменты экрана можно получить точку заданного цвета.

1.2.6. Режим с групповым кодированием цвета

В 16-цветном режиме с групповым кодированием каждый из 4-х экранов формируется из содержимого двух сегментов памяти: из плоскости изображения (0 страница ОЗУ) и плоскости цветовых атрибутов (1 страница ОЗУ), причем восьми соседним точкам плоскости изображения, расположенным в пределах одного байта, соответствует один байт из плоскости цветовых атрибутов.

Старшие 4 бита в байте цветового атрибута определяют цвет фона (для погашенных точек), младшие 4 бита — цвет переднего плана (для засвеченных точек) в пределах одного экранного байта.

                Стр.0    Стр.1
               (изобр)  (цвет)
              ┌───────┬───────┐
     Экран 0 >│   3   │   7   │
              ╞═══════╪═══════╡
     Экран 1 >│   2   │   6   │
              ╞═══════╪═══════╡
     Экран 2 >│   1   │   5   │
              ╞═══════╪═══════╡
     Экран 3 >│   0   │   4   │
              └───────┴───────┘

Для всех цветовых режимов действует ограничение на использование широкого экрана с номером 0, описанное в П.1.2.3.

Следует помнить, что экраны аппаратно привязаны к конкретным сегментам ОЗУ, а не к окнам, то есть отображение информации экрана не зависит от рабочей страницы ОЗУ и включения / выключения окон.

2. Организация постоянной памяти

Постоянная память, расположенная на основной плате, состоит из двух частей:

  • «ROM1-BIOS» — стартовое ПЗУ объемом 8 Кбайт;
  • «ROM2-BIOS» — ПЗУ пользователя объемом 864 Кбайт.

Для доступа к постоянной памяти в адресном пространстве процессора предусмотрено включение соответственно двух ROM-окон ПЗУ.

Окно для «ROM1-BIOS» включается по адресам 0000H..1FFFH при аппаратном сбросе компьютера, тем самым обеспечивая доступ к стартовым и другим подпрограммам.

Для управления включением и выключением окна «ROM1-BIOS» предназначен бит D4 порта диспетчера 0AH.

Включением окна «ROM2-BIOS» по адресам 2000H..3FFFH управляет бит D3 порта 0AH (независимо от окна «ROM1-BIOS»), причем доступ к ПЗУ в этом окне осуществляется по сегментам размером 8 Кбайт (отсюда и минимальный размер ПЗУ). Номер сегмента «ROM2-BIOS» записывается в специальный порт с адресом 09H, допускающий как запись, так и чтение информации.

Окна ПЗУ имеют самый высокий приоритет: если окно «ROM1-BIOS» и/или «ROM2-BIOS» включено, то доступ к нему обеспечивается из любой текущей страницы, в том числе при «открытом» окне ОЗУ «RAM0». Например, если во 2-й странице ОЗУ в любом порядке открыть окно «RAM0» с сегментом 10 (путем записи значения 10 в порт 04H и установкой разряда D0 порта 0AH в единицу) и окно «ROM1» (установкой разряда D4 порта 0AH в единицу), то распределение памяти будет следующим:

                  Стр.2
                  ...                                 Порт 0AH
         │         9        │                         -----
   4000H ├──────────────────┤                         D0....D4
         │┌─────────────────┴┐                         │     │
         ││        10 ->(04H)│         < Окно «RAM0» ──┘     │
   0000H ││                  │                               │
         └┤┌─────────────────┴┐ 2000H                        │
          └┤       ROM1       │        < Окно «ROM1» ────────┘
           └──────────────────┘ 0000H

По адресам 0000H..1FFFH будет доступно ПЗУ «ROM1», а по адресам 2000H..3FFFH — «верхняя» часть 10-го сегмента ОЗУ.

Если в приведенном выше примере открыть еще и окно ПЗУ «ROM2» (установкой бита D3 порта 0AH в единицу и записью в порт 09H номера требуемого сегмента «ROM2»), то 10-й сегмент ОЗУ в окне «RAM0» будет полностью затенен и недоступен:

                  Стр.2
                  ...                                Порт 0AH
         │         9        │                        ------
   4000H ├──────────────────┤                        D0..D3 D4
         │┌─────────────────┴┐         < Окно «RAM0» ─┘   │  │
         ││┌─────────────────┴┐ 4000H                     │  │
   0000H │││ сегм.ROM2 ->(09H)│        < Окно «ROM2» ─────┘  │
         └┤╞══════════════════╡ 2000H                        │
          └┤      ROM1        │        < Окно «ROM1» ────────┘
           └──────────────────┘ 0000H

Можно сказать, что при включении окон ПЗУ образуется как бы третий «слой» памяти в пределах адресного пространства процессора.

ВНИМАНИЕ: Программист должен сам следить за тем, чтобы коды программы, область стека и используемые данные не оказались в переключаемой части страницы или в одном из переключаемых окон ОЗУ (ПЗУ) для исключения их «потери».

3. Порты ввода-вывода

В режиме «Orion-128» (бит D7 порта 0AH установлен в 1) разрешен доступ к портам 0F400H..0FA00H, адресуемым через область памяти, и к портам 10H..14H, 18H..1BH, 0F8H..0FFH, а также портам периферии — с помощью команд процессора IN, OUT.

В режиме «Orion-Pro» (бит D7 порта 0AH установлен в 0) доступ к портам как к ячейкам ОЗУ запрещен.

Кратко перечислим назначение портов:

    00H      – состояние DIP-переключателей (SW), определяющих конфигурацию системы;
    01H      – данные принтера «Centronics»;
    02H      – сигналы управления принтером;
    03H      – регистр настройки портов 00H..02H;
    04H      – регистр сегментов для окна «RAM0»;
    05H      – регистр сегментов для окна «RAM1»;
    06H      – регистр сегментов для окна «RAM2»;
    07H      – регистр настройки портов 04H..06H;
    08H      – регистр страниц ОЗУ;
    09H      – регистр сегментов «ROM2-BIOS»;
    0AH      – диспетчер управления конфигурацией памяти;
    0BH      – регистр настройки портов 08H..0AH;
    0CH..0FH – системный резерв;
    10H..13H – порты контроллера дисковода КР1818ВГ93 (в режиме  
               «Orion-128» доступны также через ячейки памяти 0F700H..0F703H, 
               0F710H..0F714H, 0F720H):
    10H      – регистр команд;
    11H      – регистр дорожек;
    12H      – регистр секторов;
    13H      – регистр данных;
    14H      – регистр управления контроллером дисковода;
               в режиме «Orion-128» доступен также через ячейки 
               0F704H, 0F714H, 0F720H;
    18H..1BH – универсальный порт,  используемый как порт клавиатуры; 
               в режиме «Orion-128» может быть переключен (параллельно с         
               обращением 181BH) на  адреса одного из портов 0F4XXH, 0F5XXH, 0F6XXH 
               по выбору пользователя;
    1CH..1FH – резерв для мультикарты (джойстик, мышь);
    300AFH   – резерв для плат расширения (будет объявляться с
               выходом конкретной интерфейсной платы).
    0B00DFH  – область портов выделенная пользователю.
    0E00EFH  – резерв для плат расширения (будет объявляться с
               выходом конкретной интерфейсной платы).
    0F8H     – регистр управления цветовым  режимом  дисплея;
               в режиме  «Orion-128» доступен также как ячейка
               0F800H;
    0F9H     – регистр страниц;  для режима «Orion-128» доступен 
               также как ячейка 0F900H;
    0FAH     – регистр  номера  и  размера  экрана;  в  режиме
               «Orion-128» доступен также как ячейка 0FA00H;
    0FBH     – регистр включения прерываний от таймера (D6);
    0FCH     – регистр цвета для псевдо-цветного режима;
    0FDH     – резерв  для двухбайтовых адресов  портов расширений «ZX»;
    0FEH     – порт четырехразрядного ЦАП;
    0FFH     – порт звука.