Карта памяти
Next поддерживает две модели управления памятью, работающие в тандеме. Одна - это уникальная система управления памятью для Next. Другая - расширенная версия менеджера памяти из оригинальных Spectrum 128 и +2/+3 серий.
Глобальная карта памяти
Общий объем доступной оперативной памяти (RAM) в Next составляет 768 КБ на Next без расширения или 1792 КБ на Next, расширенном до 2 МБ. (Базовая версия Next имеет 1 МБ памяти, но 256 КБ из них зарезервированы для ROM и прошивки.)
Процессор Z80 в Next может обращаться только к 64 КБ памяти за раз, поэтому память разделена на банки, которые используются для определения того, какую память он видит. Управление памятью Spectrum 128k и NextBASIC используют 16 КБ банки. Управление памятью Next посредством машинного кода использует 8 КБ банки.
16k-банк | 8k-банк | Реальный адрес | Размер | Описание |
---|---|---|---|---|
- | - | $000000-$00ffff | 64K | ZX Spectrum ROM |
- | - | $010000-$013fff | 16K | EsxDOS ROM |
- | - | $014000-$017fff | 16K | Multiface ROM |
- | - | $018000-$01bfff | 16K | Multiface Extra ROM |
- | - | $01c000-$01ffff | 16K | Multiface RAM |
- | - | $020000-$03ffff | 128K | DivMMC RAM |
0-7 | 0-15 | $040000-$05ffff | 128K | Стандартная 128K RAM |
8-15 | 16-31 | $060000-$07ffff | 128K | Дополнительная RAM |
16-47 | 32-95 | $080000-$0fffff | 512K | 1-я дополнительная IC RAM (доступна на Next без расширения) |
48-79 | 96-159 | $100000-$17ffff | 512K | 2-я дополнительная IC RAM (доступна только на расширенном Next) |
80-111 | 160-223 | $180000-$1fffff | 512K | 3-я дополнительная IC RAM (доступна только на расширенном Next) |
Кроме того, первые несколько страниц имеют определенные варианты использования и особенности, обобщенные ниже:
16k-банки | 8k-банки | Описание |
---|---|---|
0 | 0-1 | Стандартная RAM, может использоваться EsxDOS. Изначально отображается на $c000-$ffff. |
1 | 2-3 | Стандартная RAM, конфликтная на 128, может использоваться EsxDOS, RAM-диск на NextZXOS. |
2 | 4-5 | Стандартная RAM. Изначально отображается на $8000-$bfff. |
3 | 6-7 | Стандартная RAM, конфликтная на 128, может использоваться EsxDOS, RAM-диск на NextZXOS. |
4 | 8-9 | Стандартная RAM, конфликтная на +2/+3, RAM-диск на NextZXOS. |
5 | 10-11 | Экран ULA, конфликтный, кроме Pentagon, не может использоваться командами NextBASIC. Изначально отображается на $4000-$7fff. |
6 | 12-13 | Стандартная RAM, конфликтная на +2/+3, RAM-диск на NextZXOS. |
7 | 14-15 | Теневой экран ULA, конфликтный, кроме Pentagon, рабочее пространство NextZXOS, не может использоваться командами NextBASIC |
8 | 16-17 | Next RAM, Layer 2 по умолчанию, экран NextZXOS и дополнительные данные, не может использоваться командами NextBASIC |
9-10 | 18-21 | Next RAM, остальное для Layer 2 по умолчанию |
11-13 | 22-27 | Next RAM, теневой экран Layer 2 по умолчанию |
Обратите внимание, что NextZXOS перемещает назначения банков Layer 2. Следовательно, Layer 2 после загрузки NextZXOS отображается на 16k-банки 9-11 (8k-банки 18-23). Теневая память Layer 2 также назначается 16k-банкам 9-11 (8k-банки 18-23).
Карта памяти, видимая Z80
При запуске 16-битное адресное пространство Z80 отображается в память следующим образом:
Область | 16k-слот | 8k-слот | 16k-банк по умолчанию | 8k-банк по умолчанию | Описание |
---|---|---|---|---|---|
$0000-$1fff | 1 | 0 | ROM | ROM (255) | Обычно ROM. Перенаправление R/W с помощью Layer 2. Здесь находятся подпрограммы IRQ и NMI. |
$2000-$3fff | 1 | 1 | ROM | ROM (255) | Обычно ROM. Перенаправление R/W с помощью Layer 2. |
$4000-$5fff | 2 | 2 | 5 | 10 | Обычно используется для нормального/теневого экрана ULA. |
$6000-$7fff | 2 | 3 | 5 | 11 | Расширенная область атрибутов/графики Timex ULA. |
$8000-$9fff | 3 | 4 | 2 | 4 | Свободная RAM. |
$a000-$bfff | 3 | 5 | 2 | 5 | Свободная RAM. |
$c000-$dfff | 4 | 6 | 0 | 0 | Свободная RAM. Только эта область может быть переназначена управлением памятью 128. |
$e000-$ffff | 4 | 7 | 0 | 1 | Свободная RAM. Только эта область может быть переназначена управлением памятью 128. |
Порядок декодирования памяти
(проверьте также текущий VHDL source)
Область 0-16k может быть переназначена несколькими различными механизмами, приоритетный порядок которых (от самого высокого приоритета к самому низкому):
- bootrom
- multiface
- divmmc
- отображение Layer 2
- mmu
- режим конфигурации
- шина расширения romcs
- rom
Область 16k-48k либо отображается MMU, либо затенена отображением Layer2:
- отображение Layer 2
- mmu
Наконец, оставшиеся верхние 16k, область 48k-64k, отображаются только MMU.
Методы страничной организации памяти
Управление памятью в стиле 128
Управление памятью в стиле 128 может изменять только банк, адресуемый по адресу $c000 (16k-слот 4 или 8k-слот 7-8). Активный 16k-банк в $c000 выбирается путем записи 3 младших битов номера 16k-банка в нижние 3 бита Memory Paging Control ($7FFD / 32765) и 3 старших бита в нижние 3 бита Next Memory Bank Select ($DFFD / 57341). (Причина разделения заключается в том, что оригинальному Spectrum 128, имеющему только 128 КБ памяти, требовалось только 3 бита.)
На Next без расширения это позволяет переключать любой 16k-банк в $c000. На расширенном Next недостаточно доступных битов для доступа к банкам в нижней части расширенной памяти, поэтому для доступа к ним необходимо использовать управление памятью Next.
Если вы используете стандартный обработчик прерываний или подпрограммы ОС, то каждый раз, когда вы записываете в Memory Paging Control ($7FFD / 32765), вам также следует сохранять значение в $5B5C. Каждый раз, когда вы записываете в Plus 3 Memory Paging Control ($1FFD / 8189), вам также следует сохранять значение в $5B67. Не существует соответствующей системной переменной только для Next Next Memory Bank Select ($DFFD / 57341), и стандартные подпрограммы ОС могут неправильно поддерживать расширенные банки.
Специальный режим подкачки 128
“Специальный режим подкачки” (также называемый “режим AllRam” или “режим CP/M”) включается путем записи значения с установленным LSB в Plus 3 Memory Paging Control ($1FFD / 8189). В зависимости от 3 младших битов этого значения выбирается конфигурация памяти следующим образом:
Биты | Слот 1 | Слот 2 | Слот 3 | Слот 4 |
---|---|---|---|---|
%001 | 0 | 1 | 2 | 3 |
%011 | 4 | 5 | 6 | 7 |
%101 | 4 | 5 | 6 | 3 |
%111 | 4 | 7 | 6 | 3 |
Переключение Layer 2
Переключение Layer 2 может позволить записывать или читать один из 16k-банков в 16k-слоте 1, записав номер 16k-банка в Layer 2 RAM Page Register ($12), а затем включив страничную организацию Layer 2, установив биты страничной организации в Layer 2 Access Port ($123B / 4667). Вы также можете использовать Layer 2 RAM Shadow Page Register ($13) для той же цели (изменение регистра $12 сразу же видно на дисплее, в то время как регистр $13 никак не связан с дисплеем, он работает только как селектор банка для записи в слот 1). Начиная с ядра 3.0, вы можете переключать не только первые 16 КБ, но и все 48 КБ Layer 2 в область адресов $0000..$BFFF).
Запись/чтение из этой области страничной организации затем будет записывать/читать соответствующую область памяти, в то время как другая операция может оставаться незатронутой и использовать область, отображаемую другим управлением памятью.
Layer 2 на самом деле состоит из 3 больших банков, поэтому использование элементов управления Layer 2 для доступа к различным “секциям” Layer 2 может получить доступ к двум следующим банкам после того, который выбран в регистре $12/$13.
Управление памятью Next
8k-банк, доступ к которому осуществляется в 8k-слоте, выбирается путем записи номера 8k-банка в биты 7-0 8 регистров Next из Memory management slot 0 bank ($50) и выше. $50 адресует 8k-слот 0, $51 адресует 8k-слот 1 и так далее.
Кроме того, в 8k-слотах 0 и 1 можно подключить ROM, выбрав несуществующую страницу $FF размером 8k. Верхние или нижние 8k ROM будут отображаться в зависимости от того, какой 8k-слот используется.
Взаимодействие между методами подкачки
В нормальном режиме изменения, внесенные в управлении памятью в стиле 128 и в стиле Next, синхронизируются. Самое последнее изменение всегда имеет приоритет. Это означает, что использование управления памятью в стиле 128 для выбора нового 16k-банка в 16k-слоте 4 обновит регистры MMU для двух 8k-слотов с соответствующими номерами 8k-банков.
Однако включение специального режима подкачки 128 (режим AllRam) переопределит MMU Next. Выбор банка из таблицы режима AllRam переопределит установленные страницы в регистрах Next. Регистры MMU все еще можно изменить, но они не будут иметь никакого эффекта до тех пор, пока специальный режим подкачки не будет отключен.
Поскольку порты управления памятью в стиле 128 не читаются, в другом направлении синхронизация невозможна.
Страничная организация и выбор ROM
$0000-$3fff обычно отображается в ROM. Эту область можно полностью переназначить только с помощью управления памятью Next. ROM не считается одним из пронумерованных банков; по умолчанию он отображается на два банка по 8 КБ или путем установки их номеров банков по 8 КБ равными 255.
128k Spectrum имеет 2 страницы ROM. Какая из них сопоставлена, выбирается путем изменения бита 4 Memory Paging Control ($7FFD / 32765). +2a/+3 имеет 4 страницы ROM; Дополнительный бит, необходимый для выбора между ними, - это бит 2 Plus 3 Memory Paging Control ($1FFD / 8189). Это обеспечивает совместимость с подкачкой ROM оригинальных машин до тех пор, пока ROM не будет выгружен.
Выгрузка ROM
ROM можно выгрузить, включив режим AllRam или используя управление памятью Next. Имейте в виду, что некоторые программы могут предполагать, что они могут найти подпрограммы обслуживания ROM по фиксированным адресам между $0000-$3fff. Что еще более важно, если установлен режим прерывания по умолчанию (IM 1), Z80 будет переходить в счетчик программ по адресу $0038 каждый кадр, ожидая найти там обработчик прерывания. Если этого не произойдет, вполне вероятно, возникнут боль и страдания. DI - ваш друг. С другой стороны, это позволяет вам написать свой собственный обработчик прерываний без необходимости использования IM 2.
Активация страничной организации Layer 2 не повлияет на работу ROM, поскольку она переназначает только записи, но не чтение. С ядром 3.0 теперь вы можете включить эту подкачку также для операции чтения, которая скроет данные ROM, и, например, запрос прерывания IM 1 выполнит данные из банка Layer 2.
Экран
16k-банк 5 - это банк, считываемый ULA для определения того, что показывать на экране. ULA подключается напрямую к большему пространству памяти, игнорируя отображение; экран всегда 16k-банк 5, независимо от того, где он находится в памяти (или если он вообще включен). Установка бита 3 Memory Paging Control ($7FFD / 32765) приведет к тому, что ULA будет считывать данные из 16k-банка 7 (“теневой экран”), который можно использовать в качестве альтернативного экрана. Имейте в виду, что это не отображает 16k-банк 7 в RAM; чтобы изменить 16k-банк 7, его необходимо сопоставить другими способами.