DMA en la SNES

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

Are you human? Please solve:Captcha