7.6 KiB
7.6 KiB
DMA (Direct Memory Access) в PlayStation 1
DMA в PS1 — это механизм, позволяющий устройствам (GPU, CD-ROM, SPU и др.) передавать данные напрямую в RAM без участия CPU. Это ускоряет работу системы, освобождая процессор для других задач.
1. Для чего нужен DMA в PS1?
- Ускорение передачи данных: CPU (R3000A) слишком медленный для копирования больших объёмов данных.
- Разгрузка CPU: Позволяет играм одновременно:
- Рендерить графику (GPU).
- Загружать уровни с CD-ROM.
- Проигрывать музыку (SPU).
- Параллельная работа устройств: Например, CD-ROM может грузить данные, пока GPU рисует кадр.
2. Как работает DMA?
2.1. Общий принцип
- CPU настраивает DMA: Указывает источник, приёмник и размер данных.
- DMA-контроллер берёт управление шиной: CPU временно "засыпает".
- Данные копируются напрямую из устройства в RAM (или наоборот).
- DMA завершает работу и сообщает CPU через прерывание.
2.2. Регистры DMA
Главный контроллер DMA находится по адресу 0x1F8010F0, но каждый канал имеет свои регистры:
| Адрес | Назначение |
|---|---|
0x1F8010F0 |
DPCR (Управление каналами) |
0x1F8010F4 |
DICR (Статус/прерывания) |
0x1F8010__ |
Регистры конкретных каналов |
3. Каналы DMA и их назначение
В PS1 есть 6 каналов DMA, каждый закреплён за конкретным устройством:
| Канал | Устройство | Назначение |
|---|---|---|
| 0 | MDEC (IN) | Декодирование видео (например, FMV из MPEG). |
| 1 | MDEC (OUT) | Вывод декодированных данных. |
| 2 | GPU | Передача команд и данных в видеопроцессор (например, списки отображения). |
| 3 | CD-ROM | Чтение данных с диска. |
| 4 | SPU | Загрузка семплов и команд в звуковой процессор. |
| 5 | PIO (EXT) | Расширенный порт (редко используется). |
| 6 | OTC | Очистка RAM (используется для Ordering Table в GPU). |
4. Как настроить и запустить DMA?
4.1. Общий алгоритм
Для любого канала DMA нужно:
-
Установить источник и приёмник:
- Если передача из RAM в устройство (например, GPU):
- Источник: Адрес в RAM.
- Приёмник: Регистр устройства (например,
0x1F801810для GPU).
- Если передача из устройства в RAM (например, CD-ROM):
- Источник: Данные устройства (буфер CD-ROM).
- Приёмник: Адрес в RAM.
- Если передача из RAM в устройство (например, GPU):
-
Задать размер блока и режим DMA:
- Размер: Сколько слов (4 байта) передать.
- Режим:
0x01000000— одношаговый (по одному слову).0x01000200— пакетный (пачками, быстрее).
-
Включить канал через DPCR и DICR.
4.2. Примеры кода
Пример 1: Передача данных в GPU (канал 2)
; Настройка DMA для GPU
li a0, 0x1F8010A0 ; Адрес регистра DMA2 (GPU)
la a1, command_list ; Адрес данных в RAM
sw a1, 0(a0) ; Источник = command_list
li a0, 0x1F8010A4
li a1, 0x01000200 ; Размер + режим (пакетный)
sw a1, 0(a0)
li a0, 0x1F8010A8
li a1, 0x01000001 ; Включить DMA
sw a1, 0(a0)
Пример 2: Чтение CD-ROM (канал 3)
#include <libcd.h>
void cd_read_sectors(int lba, int num_sectors, void *buffer) {
CdRead(num_sectors, (CdlLOC*)&lba, CD_READ_SPEED, buffer);
CdReadSync(0); // Ожидать завершения DMA
}
5. Важные нюансы
5.1. Синхронизация
- DMA работает асинхронно. Нужно ждать завершения:
- Через прерывание (если настроено в DICR).
- Через опрос флага (например,
CdReadSyncдля CD-ROM).
5.2. Ограничения
- Размер блока: Не более 64 КБ за одну передачу.
- Выравнивание: Адреса в RAM должны быть кратны 4.
5.3. Конфликты
- Если два устройства пытаются использовать DMA одновременно, возможны задержки.
- Решение: планировать передачу данных между кадрами (например, в VBlank).
6. DMA и Ordering Table (GPU)
Для 3D-рендеринга DMA используется для передачи Ordering Table (OT):
- CPU формирует список примитивов в RAM.
- DMA (канал 2) копирует OT в GPU.
- GPU рендерит кадр, соблюдая порядок из OT.
Пример очистки OT через DMA (канал 6):
li a0, 0x1F8010E0 ; DMA6 (OTC)
la a1, ot_buffer ; Адрес OT
sw a1, 0(a0)
li a0, 0x1F8010E4
li a1, 0x00010000 ; Размер (например, 256 слов)
sw a1, 0(a0)
li a0, 0x1F8010E8
li a1, 0x11000002 ; Режим: очистка OT
sw a1, 0(a0)
7. Итог
- DMA в PS1 — это ключевой механизм для быстрой передачи данных между устройствами и RAM.
- 6 каналов, каждый закреплён за конкретным устройством (GPU, CD-ROM, SPU и др.).
- Настройка требует указания источника, приёмника и режима работы.
- Оптимизация DMA критична для производительности (например, загрузка уровней без лагов).
Для глубокого понимания изучите:
Это основа для создания плавных игр вроде Crash Bandicoot или Tekken 3! 🚀