- Memoria a memoria: hasta 64KB de datos, desde cualquier dirección a cualquier dirección, dentro del espacio direccionable por la CPU, con una tasa de transferencia de 6,675 MB/s. Una pantalla estándar (6912 bytes) se transfiere desde cualquier parte de la memoria en menos de 1 milisegundo.
- Memoria a I/O e I/O a memoria: puede transferir un bloque de memoria de hasta 64KB a un único puerto de I/O. La velocidad de transferencia, suponiendo que el periférico no inserte estados de espera, es de 5,34 MB/s. Por ejemplo, leer un sector de una tarjeta SD se haría en menos de 100 microsegundos.
- Todas las transferencias pueden ser o bien en modo ráfaga, en donde el controlador DMA toma el control del bus parando a la CPU durante la transferencia, y haciendo ésta a la máxima velocidad, o bien en modo temporizado, en donde se especifica con qué frecuencia (cuantos bytes por segundo) se hará. Esta frecuencia se programa mediante un preescaler, que opera con la fómula: preescaler = 28000000 / frecuencia
- En el caso de las transferencias temporizadas, se puede especificar si se quiere que el controlador autocomience de nuevo la transferencia una vez que la termina, o no. La ventaja de este método es que no para a la CPU, así que la transferencia DMA y la CPU siguen funcionando a la par.
- También se puede especificar una dirección de memoria, fuente o destino, de tal forma que cuando el controlador de DMA llega a esa dirección de memoria, se activa un flag en un registro de estado que puede ser consultado por el procesador. Esto permite a un programa saber cuándo el DMA ha comenzado, o terminado de transferir una parte de un buffer. Con esta información, y la capacidad de la DMA de autorrecomenzar una transferencia, es posible implementar bufferes DMA circulares que son actualizados por el software a medida que la DMA los va usando.
He escrito un comando ESXDOS que permite reproducir ficheros WAV de 8 bits y que tengan una frecuencia de muestreo de 15.625 kHz usando para ello otra de las novedades que ya de hecho estaba en las últimas revisiones del T24, el SpecDrum. El programa puede mejorarse para que acepte otros formatos, pero de momento, lo que quería era ver que funcionaba. La frecuencia de muestreo es esa porque en su primera encarnación, este comando no usaba DMA para el sonido, sino la interrupción ráster, que puede funcionar con una velocidad máxima de una interrupción por scanline de pantalla, de ahí que fuera esa la frecuencia usada
El nuevo comando (con su código fuente), en el directorio software/dma
El core experimental está en la parte de cores de Spectrum, y es el EXP25 (EXP de experimental). El .ZX1, y .BIT están en v4 como siempre.
Este core es experimental. No deberíais usarlo como core principal, salvo que tengais a mano alguna herramienta para desbrickear el aparato en caso de comportamientos extraños.
Si escuchais chasquidos durante la reproducción, se debe a ESXDOS, que se empeña en usar un registro de E/S del ZX Badaloc, y que aquí no existe, claro está. Lo malo es que el Badaloc usa los mismos puertos que SpecDrum, y colisionan. Se puede solucionar esto usando el UnoDOS de Andrew Owen, que no usa para nada esos puertos, o parcheando la ROM de ESXDOS. Si alguien prefiere seguir usando ESXDOS, le cuento cómo parchearla, que es sencillo.