Перейти к содержанию

Карта памяти

Банки памяти

Банк Назначение
0000h Основной банк
0001h–0002h Дополнительные данные
0003h–FEFFh Прочие банки
FF00h–FFFFh Банки XPB

Важно: банк 0001h и XPB-устройство #01 всегда зарезервированы под дисковый контроллер.

BANK 0000h

Основной банк памяти содержит все стандартные регионы системы.

Начало Конец Размер Имя Описание
00000000h 0000FFFFh 64 КБ BIOS/VBIOS ROM Постоянная память с кодом BIOS и видео-BIOS
00010000h 0001FFFFh 64 КБ CMOS Энергонезависимая память конфигурации
00020000h 0002FFFFh 64 КБ MMIO Memory-mapped I/O (регистры устройств)
00030000h 0003FFFFh 64 КБ DEVICE CALLS Точки входа для вызовов устройств
00040000h 0004FFFFh 64 КБ BIOS RAM Оперативная память BIOS
00050000h 0005FFFFh 64 КБ VRAM WINDOW Окно в отдельную видеопамять (64 КБ)
00060000h FFFFFFFFh ~4 ГБ USER RAM Пользовательская оперативная память

Видеопамять (VRAM)

Видеопамять - это отдельное адресное пространство, размер которого настраивается (по умолчанию 512 КБ).

CPU видит VRAM через окно по адресу 0x00050000–0x0005FFFF (64 КБ). Страница окна выбирается регистром BANK (0x00020007): BANK = 0 — окно следует за TERM_BUFFER (устаревшее поведение), BANK = N — явно выбирает страницу N (64 КБ). Видеокарта всегда отображает кадр от TERM_BUFFER (0x00020070), поэтому переключение BANK не двигает картинку.

Такой подход позволяет:

  • Иметь VRAM больше 64 КБ, переключая видимое окно.
  • Заполнять кадры больше 64 КБ (640×480, 800×600) постранично, не сдвигая изображение.
  • Сохранить совместимость: старый код, который двигал TERM_BUFFER, продолжает работать при BANK = 0.

Как читать карту

  1. BIOS/VBIOS ROM - код, выполняемый при старте системы.
  2. CMOS - хранение настроек (например, выбор загрузочного устройства).
  3. MMIO - все регистры устройств. Программы обращаются к ним как к обычной памяти.
  4. DEVICE CALLS - фиксированные адреса, по которым лежат указатели на функции BIOS.
  5. BIOS RAM - рабочая область BIOS.
  6. VRAM WINDOW - окно в видеопамять.
  7. USER RAM - свободная память для программ и данных.

Пример доступа

Чтение регистра RAM_SIZE (адрес 0x0002000C):

LDI.dw A0, 0x0002000C
LOD.dw EX1, [A0]      ; EX1 = размер RAM в байтах