na_th_an escribió:mcleod_ideafix escribió:Tengo en la recámara un proyecto que llevo postergando desde hace años, muchos años: una implementación del chip Paula de Amiga, para el Spectrum. Es decir, un chisme que permite al Spectrum reproducir 4 canales de audio digital independientes, y con el soft adecuado, reproducir MOD's.
Me suena infinito que alguien ha hecho / idease /estuviese haciendo algo
parecido basado en un Z80 esclavo con su propia RAM en una placa externa. Me suena a ruso y puede que esté mezclando cosas...
Sí. Hace ya bastantes años que se hizo una placa de sonido usando un Z80 esclavo con RAM propia, todo diseñado para reproducir MOD's sin ayuda del Z80 del Spectrum, y que valía para los clones rusos, ya que usaba este otro tipo de bus de expansión que no recuerdo como se llama, y que está presente sólo en esos clones.
Esa tarjeta de sonido no me gusta porque es demasiado independiente: desde el Spectrum sólo le podías enviar comandos del tipo "play", "pause", "stop", etc. Sería como comandar un CD-Audio desde un DivIDE (que se puede, por cierto).
Esto que tengo planeado es "sólo" darle al Spectrum lo mismo que se le da al Amiga: un chip con 4 canales de DMA a memoria "chip", cada canal a una velocidad programable, y la señal de audio generada poder variarla en volumen en 64 pasos. ¿El software? Pues lo que tengo medio hecho es un reproductor de MOD's y un conjunto de funciones para usar esto desde Z88DDK. Son funciones del estilo:
Código: Seleccionar todo
void SetDMAAddress (char channel, char *paddress);
void SetDMALength (char channel, int wlength);
void SetDMALoopAddress (char channel, char *paddress);
void SetDMALoopLength (char channel, int wlength);
void SetDMAPlayRate (char channel, int period);
void SetDMAVolume (char channel, char volume);
void SetDMAState (char channel, char state);
Reproducir un MOD se "limita" a interpretar lo que hay en el fichero MOD y actualizar el estado del chip 50 veces por segundo usando las funciones arriba mencionadas. Esto sería lo que haría el Z80 del Spectrum.
Como la memoria para samples no se coge de la memoria RAM del Spectrum (se podría hacer, pero sólo podría usarse con la memoria no contenida, y eso me limitaría a 32KB en un Spectrum 48K, o 64KB en un Spectrum 128K), este chisme tiene su propia memoria RAM (1MB) que se maneja con las siguientes funciones:
Código: Seleccionar todo
void CopyFromSpectrum (char *paddressto, char *from, int nwords);
void CopyToSpectrum (char *to, char *paddressfrom, int nwords);
Se puede comprobar que estas funciones son un calco de lo que hay que hacer con el 8364 (Paula) del Amiga cuando se programa. Hay más información de ello en las páginas 33 y siguientes del PDF de mi proyecto de fin de carrera. Cuando tengo que manejar direcciones de memoria de la memoria para samples estoy usando un puntero que apunta al valor de la dirección (3 bytes = 24 bits -> 16MB), no un puntero cuyo valor es la dirección (que sólo podría manejar 2 bytes = 16 bits -> 64KB). Las longitudes están expresadas en palabras de 16 bits, no en bytes, con lo que se pueden expresar hasta casi casi 128KB. El periodo es un valor de 16 bits que va directamente al registro de periodo del canal. La frecuencia a la que se reproduce un canal se calcula de la misma forma que en el Amiga, lo cual viene documentado en la página 36 del mencionado PDF.
A muchos se les habrá encendido la lucecita de: "¡eeeeeh! pero ¿cómo voy a meter un MOD de 100-200KB en mi juego? ¡¡El fichero TAP se haría eterno para cargar!!"
Obviamente, si piensas meter un MOD con samples que ocupen tanto (o más), es desesperante usar carga de cinta. Afortunadamente tenemos disponible la carga rápida mediante el DivIDE o el +3e.
¿Que no quieres que tu juego necesite un chisme de estos para poder ser cargado y aún así poder incorporar sonido digital? Pues tienes dos opciones:
- Hacer un MOD con samples "chip": samples de muy poca longitud que sólo tienen una forma de onda. Hay MOD's que ocupan tan poquito como 5KB, y aunque los cargues en memoria de Spectrum, una vez copiados los samples a la memoria de samples, la memoria del Spectrum queda libre para que la sobreescribas con cualquier otro código del juego.
- Usar samples procedurales, es decir, tener al principio del juego una rutina que se encargue de crear los samples que usará el juego (pueden ser una onda cuadrada, una onda triangular, en diente de sierra, una sinosoide, ruido blanco a base de meter valores aleatorios, etc) y luego hacer los efectos de sonido usando estos samples repetidos hasta la saciedad (para eso pueden hacer loop continuo si quieres) a la frecuencia y volumen que quieras.
Sobre la emulación... hace unos años salió en WOS una encuesta sobre qué cosas se echaban en falta en FUSE: yo comenté que para los desarrolladores de hardware sería estupendo contar con algún sistema de plugins que nos permitiera crear dispositivos virtualizados y añadirlos a FUSE como el que pincha un periférico a su Spectrum sólo cuando lo va a usar. Un sistema así tendría que tener una interfaz de aplicación específica, y nos ahorraría tener que empollar todo el código fuente de FUSE para ver cómo hacer "casar" nuestro periférico con el resto del emulador.
Curiosamente, el emulador QemuLator, que emula un QL, ha incorporado un sistema de este estilo, y así he podido crear una versión virtualizada (con algunas limitaciones eso sí) de la interface QLSD para poder desarrollar el driver en el PC y probarlo rápidamente en QemuLator.
Fíjate si llevo tiempo con el tema, que ya desde el año 2009 que lo tenía barruntando en la cabeza, e incluso hice alguna prueba usando un único canal emulando cuatro, usando la misma técnica que usé en el proyecto de fin de carrera, y sacando la salida también por un DAC con resistencias metido dentro del Spectrum usando el mismo puerto del SpecDrum
http://foro.speccy.org/viewtopic.php?f= ... 345#p18345Esa plaquita la diseñé y la puse dentro de un +2A. Varias personas se interesaron, e hice una pequeña tirada para que quien la quisiera, tuviera una:
Cómo comenzó todo.
http://foro.speccy.org/viewtopic.php?f=6&t=1549#p18314Descripción de la placa, montaje, etc.
http://foro.speccy.org/viewtopic.php?f=8&t=1570Lo de reproducir MOD's en el Spectrum es en realidad una espinita que tengo clavada desde el año 1995, cuando presenté el proyecto de fin de carrera. De alguna forma, quisiera "cerrar el círculo"

¿Y por qué 1 MB para memoria de samples? Porque me hace mucha ilusión escuchar el
MOD de "What is love, de Haddaway" que ocupa unos 700KB, en el Spectrum
