1. ¿Cómo funciona?
El DMA (Direct Memory Access) transfiere bloques de datos sin que la CPU tenga que copiar cada byte individualmente.
La SNES tiene 8 canales DMA (0–7). Todos son configurables y tienen sus propios registros. Ningún canal tiene un destino fijo: puedes configurar cada uno para transferir datos a distintos registros de hardware.
2. Registros principales
Los registros de cada canal siguen el mismo patrón. El canal 0 utiliza $4300, el canal 1 $4310, el canal 2 $4320, etc.
| Registro (canal 0) | Función |
|---|---|
$4300 |
Modo y comportamiento de la transferencia. |
$4301 |
Registro de destino del bus B. |
$4302–$4303 |
Dirección de origen de 16 bits. |
$4304 |
Banco de origen. |
$4305–$4306 |
Longitud a copiar en bytes. |
$420B |
Activa los canales de DMA normal. |
$420C |
Habilita los canales de HDMA. |
El HDMA transfiere datos durante el intervalo H-Blank de cada scanline.
La diferencia principal es que el DMA normal transfiere un bloque de datos cuando lo activas, mientras que el HDMA realiza transferencias sincronizadas con el dibujado de la pantalla.
3. ¿Cómo se asignan las direcciones?
Origen (bus A)
La dirección se construye combinando el banco y la dirección de 16 bits.
Ejemplo:
$4302 = $00: byte bajo.$4303 = $02: byte alto.$4304 = $00: banco.
Origen resultante: $00:0200.
Destino (bus B)
$4301 selecciona el registro de destino del bus B. Para los registros del PPU, se calcula sumando $2100 al valor de $4301.
$4301 |
Destino | Función |
|---|---|---|
$04 |
$2104 |
OAMDATA: escritura en OAM. |
$18 |
$2118 |
VMDATAL: escritura en VRAM. |
$22 |
$2122 |
CGDATA: escritura en CGRAM. |
4. ¿Cómo se calcula la longitud?
La longitud combina $4305 (byte bajo) y $4306 (byte alto).
Ejemplo:
$4305 = $20.$4306 = $02.
Longitud resultante: $0220 = 544 bytes.
En DMA normal, una longitud de $0000 representa 65.536 bytes.
5. Ejemplo de código
STZ $2102 ; Pone a cero el byte bajo de la dirección OAM.
STZ $2103 ; Pone a cero el byte alto y sus bits de configuración.
; Así, la dirección inicial de OAM queda en $0000.
; El DMA empezará a escribir los datos desde esa posición de OAM.
LDX #$00
STX $4300 ; Modo DMA 0
LDX #$04
STX $4301 ; Destino: $2104 (OAMDATA)
LDA #$0200
STA $4302 ; Dirección de origen: $0200
LDX #$00
STX $4304 ; Banco de origen: $00
LDA #$0220
STA $4305 ; Longitud: 544 bytes
LDX #$01
STX $420B ; Activa el canal DMA 0
Resultado
| Parámetro | Valor |
|---|---|
| Canal | 0 |
| Modo | 0 |
| Origen | $00:0200 |
| Destino | $2104 (OAMDATA) |
| Longitud | $0220 = 544 bytes |
El DMA lee 544 bytes desde $00:0200 y los envía al puerto de escritura OAM $2104.