El SID, igual que el VIC y otros chips del C64, consta de una serie de registros. Y programar el SID consiste en leer y escribir valores en esos registros.
Más concretamente, el SID tiene 29 registros. Ocupan desde la dirección $d400 hasta la dirección $d41c, ambas incluidas.
Una curiosidad de estos 29 registros es que 25 de ellos son de sólo escritura, mientras que los otros 4 son de sólo lectura. Normalmente los registros, igual que las posiciones de memoria normales, son de lectura – escritura.
Cuando se escribe sobre un registro de sólo lectura, la escritura no tiene ningún efecto. Análogamente, cuando se lee de un registro de sólo escritura, la lectura no tiene ningún efecto.
Una consecuencia de lo anterior (que la mayoría de los registros del SID sean de sólo escritura) es que se suele trabajar sobre una “imagen” de esos registros, y luego esa imagen se transfiere al SID. Es decir, en vez de escribir directamente sobre los registros del SID, se suele escribir sobre unas posiciones de memoria normales que conforman una copia de trabajo del SID, y luego esa copia se transfiere al SID. Esto no es estrictamente obligatorio, pero se hace así por comodidad.
Lo normal, en todo caso, suele ser empezar por inicializar el SID (los 25 registros de sólo escritura), lo cual se consigue inicializando la imagen y luego transfiriendo la imagen al SID. Véanse los programas de ejemplo al final de esta entrada.
En cualquier caso, los registros del SID son los que siguen, que corresponden a siete registros por cada una de las tres voces, cuatro registros relacionados con los filtros, y cuatro registros adicionales (total 7×3+4+4=29 registros):
REGISTRO | DIRECCIÓN | FUNCIÓN |
-VOZ 1 (SÓLO ESCRITURA)- |
||
FRELO1 | $d400 | Frecuencia de la nota. Parte menos significativa (low). |
FREHI1 | $d401 | Frecuencia de la nota. Parte más significativa (high). |
PWLO1 | $d402 | Ancho de pulso. Parte menos significativa (low). Sólo cuando la forma de onda es cuadrada. |
PWHI1 | $d403 | Ancho de pulso. Parte más significativa (high). Sólo cuando la forma de onda es cuadrada. |
VCREG1 | $d404 | Bit 0: Gate. Activa (1) / desactiva (0) la nota.
Bit 1: Sincronizar con la voz 3. Bit 4: Forma de onda triangular. Bit 5: Forma de onda en rampa. Bit 6: Forma de onda cuadrada. Bit 7: Forma de onda ruido. |
ATDCY1 | $d405 | Bits 0, 1, 2 y 3: Decaimiento (decay).
Bits 4, 5, 6 y 7: Ataque (attack). |
SUREL1 | $d406 | Bits 0, 1, 2 y 3: Liberación (release).
Bits 4, 5, 6 y 7: Sostenimiento (sustain). |
-VOZ 2 (SÓLO ESCRITURA)- |
||
FRELO2 | $d407 | Frecuencia de la nota. Parte menos significativa (low). |
FREHI2 | $d408 | Frecuencia de la nota. Parte más significativa (high). |
PWLO2 | $d409 | Ancho de pulso. Parte menos significativa (low). Sólo cuando la forma de onda es cuadrada. |
PWHI2 | $d40a | Ancho de pulso. Parte más significativa (high). Sólo cuando la forma de onda es cuadrada. |
VCREG2 | $d40b | Bit 0: Gate. Activa (1) / desactiva (0) la nota.
Bit 1: Sincronizar con la voz 3. Bit 4: Forma de onda triangular. Bit 5: Forma de onda en rampa. Bit 6: Forma de onda cuadrada. Bit 7: Forma de onda ruido. |
ATDCY2 | $d40c | Bits 0, 1, 2 y 3: Decaimiento (decay).
Bits 4, 5, 6 y 7: Ataque (attack). |
SUREL2 | $d40d | Bits 0, 1, 2 y 3: Liberación (release).
Bits 4, 5, 6 y 7: Sostenimiento (sustain). |
-VOZ 3 (SÓLO ESCRITURA)- |
||
FRELO3 | $d40e | Frecuencia de la nota. Parte menos significativa (low). |
FREHI3 | $d40f | Frecuencia de la nota. Parte más significativa (high). |
PWLO3 | $d410 | Ancho de pulso. Parte menos significativa (low). Sólo cuando la forma de onda es cuadrada. |
PWHI3 | $d411 | Ancho de pulso. Parte más significativa (high). Sólo cuando la forma de onda es cuadrada. |
VCREG3 | $d412 | Bit 0: Gate. Activa (1) / desactiva (0) la nota.
Bit 1: Sincronizar con la voz 3. Bit 4: Forma de onda triangular. Bit 5: Forma de onda en rampa. Bit 6: Forma de onda cuadrada. Bit 7: Forma de onda ruido. |
ATDCY3 | $d413 | Bits 0, 1, 2 y 3: Decaimiento (decay).
Bits 4, 5, 6 y 7: Ataque (attack). |
SUREL3 | $d414 | Bits 0, 1, 2 y 3: Liberación (release).
Bits 4, 5, 6 y 7: Sostenimiento (sustain). |
-FILTROS (SÓLO ESCRITURA)- |
||
CUTLO | $d415 | Bits 0, 1 y 2: Bits 0, 1 y 2 de la frecuencia de corte / central. |
CUTHI | $d416 | Bits 0 – 7: Bits 3 – 10 de la frecuencia de corte / central. |
RESON | $d417 | Bits 0, 1 y 2: Voces que pasan por el filtro.
Bits 4, 5, 6 y 7: Efecto de resonancia. |
SIGVOL | $d418 | Bits 0, 1, 2 y 3: Volumen global, desde 0 hasta 15.
Bits 4, 5 y 6: Filtros paso bajo (bit 4=1), paso banda (bit 5=1) y paso alto (bit 6 = 1). Bit 7: Desconecta la voz 3 de la salida de audio. |
-VARIOS (SÓLO LECTURA)- |
||
POTX | $d419 | Conversor analógico digital X. |
POTY | $d41a | Conversor analógico digital Y. |
RANDOM | $d41b | Salida de la voz 3. Si la forma de onda es ruido, sirve para generar valores aleatorios. |
ENV3 | $d41c | Salida de la “envolvente” ADSR para la voz 3. |
La forma habitual de trabajar con estos registros será como sigue (el orden puede cambiar):
- Configurar el volumen.
- Configurar la frecuencia de la nota.
- Configurar la envolvente ADSR.
- Seleccionar la forma de onda.
- Activar la nota.
- Esperar un tiempo (duración de la nota).
- Desactivar la nota.
Lo anterior se puede hacer para una, dos o tres voces. Todo esto se irá viendo en detalle en las entradas que siguen.
Programa de ejemplo: Prog48