Konami's Synthesizer

Un sintetizador que calcula cada nota muestra a muestra en el Z80 y la toca por un DAC de 8 bits: catorce ondas, dieciséis timbres, tres envolventes, un filtro con resonancia y un teclado de 48 teclas. Todo dibujado desde la ROM, y el sonido reconstruido byte a byte.

Konami - (c) Konami 1986 - Cartucho RC-741 de 32 KB con DAC - MSX - Volcado a2eea29f...

Aquí no hay ninguna captura. Todas las imágenes están dibujadas desde los bytes de la ROM con las tablas del propio cartucho: los logotipos, el título, las siete pantallas y los dieciséis TONE EDIT, y las catorce ondas. Veintitrés pantallas están cotejadas contra openMSX byte a byte, con 0 diferencias. El sonido sale de un motor escrito de nuevo que da los dieciséis timbres iguales a los del cartucho, y lo que llega al DAC está cotejado: 22.273 bytes, 0 distintos. El listado y las cifras se reproducen con make, y el reensamblado devuelve la ROM byte a byte.

El cartucho en cifras

100 %del binario explicado
1.187rutinas con nombre
43,6 %del listado comentado
16.229bytes de código
16.539bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

Un sintetizador dentro del Z80

El cartucho no lleva chip de sonido: lleva un DAC de 8 bits en 0x4000, y el programa calcula la nota muestra a muestra (0x5767): oscilador, filtro de dos etapas con resonancia, amplificador, tres envolventes ADSR y LFO.

Medido en openMSX: el motor escrito de nuevo da los dieciséis timbres byte a byte iguales.

La altura de la nota es un bucle de ciclos

PLAY manda el sample al DAC byte a byte y espera entre uno y otro: cada tecla tiene una rutina de trece y un retardo D (0x5DA9), y la rutina r cuesta 59 + r + 14 × D ciclos. Una tecla cada vez.

Medido: 254,37 ciclos de media en LA3, 254 y 255.

El sample vive en la RAM del ordenador

El cartucho no tiene RAM: 0x4105 pone la RAM del ordenador en 0x8000-0xBFFF para sintetizar y tocar, y 0x410D devuelve el cartucho para pintar.

Medido: A8 = 0xF4 durante SYN.

El ruido viene de la BIOS

La onda 16 y el muestreo y retención del LFO leen la ROM de la BIOS desde 0x0000 (0x5AD4): el timbre 14 suena distinto en cada ordenador.

Sale del código.

El DAC arranca sin golpe

La primera interrupción (0x4118) solo sube el DAC de 0 a 0x80, un paso por vez, 129 veces, y luego cede el gancho.

Sale del código.

TONE, LAYOUT y SAMP

Tres ficheros de cinta: los dieciséis timbres con sus dieciséis ondas (4.608 bytes), la nota de cada tecla (176) y el sample con su página de bucle (hasta 16 KB).

Sale del código, y la cinta que venía con el cartucho lo confirma: siete SAMP.

La segunda página del menú

SHIFT cambia el menú: copiar un timbre con su onda, la lista de los dieciséis, imprimir la pantalla y LAYOUT, donde cada tecla recibe su nota.

Sale del código; estas pantallas no están montadas.

Lo que nadie llama, y la marca

Diez trozos de código sin nadie que los llame, entre ellos un cargador de gráficos por una tabla que no existe (0x49CD) y tres ld hl que no sirven en las envolventes; RC741 86 5 31 en 0xBF62, y la marca oculta de Konami al final: シンセサイザー, RC-741 (formato de Manuel Pazos).

Lo que el cartucho dibuja

Debajo de cada imagen está de dónde sale y qué se está viendo.

El título: el rótulo (133 tiles de 0x9E97, pintados a pinceladas), PUSH SPACE KEY y el (c) KONAMI 1986 de 0xBE75. Cotejado contra openMSX: 0 diferencias.
El título: el rótulo (133 tiles de 0x9E97, pintados a pinceladas), PUSH SPACE KEY y el (c) KONAMI 1986 de 0xBE75. Cotejado contra openMSX: 0 diferencias.
TONE EDIT con el timbre 1, EBASS1: los 29 campos pintados desde los 32 bytes de 0xA3AA, las cifras, las barras y los conmutadores. Cotejado: 0 diferencias.
TONE EDIT con el timbre 1, EBASS1: los 29 campos pintados desde los 32 bytes de 0xA3AA, las cifras, las barras y los conmutadores. Cotejado: 0 diferencias.
Los dieciséis TONE EDIT, uno por timbre de fábrica. Los dieciséis cotejados: 0 diferencias.
Los dieciséis TONE EDIT, uno por timbre de fábrica. Los dieciséis cotejados: 0 diferencias.
WAVE EDIT con la onda del usuario del timbre 1, el seno de 0x7200 trazado columna a columna como lo traza 0xB0AB. Cotejado: 0 diferencias.
WAVE EDIT con la onda del usuario del timbre 1, el seno de 0x7200 trazado columna a columna como lo traza 0xB0AB. Cotejado: 0 diferencias.
SYN: el teclado dibujado (0x925A), la nota de cada tecla según el LAYOUT y el cursor de la síntesis. Cotejado: 0 diferencias.
SYN: el teclado dibujado (0x925A), la nota de cada tecla según el LAYOUT y el cursor de la síntesis. Cotejado: 0 diferencias.
PLAY: el mismo teclado con la mano. Cotejado: 0 diferencias.
PLAY: el mismo teclado con la mano. Cotejado: 0 diferencias.
FILE MODE con las opciones de fábrica, TAPE, SAVE y TONE, y la flecha en OK. Cotejado: 0 diferencias.
FILE MODE con las opciones de fábrica, TAPE, SAVE y TONE, y la flecha en OK. Cotejado: 0 diferencias.
Las catorce ondas del oscilador, 256 muestras con signo cada una, de 0x7200 a 0x8000.
Las catorce ondas del oscilador, 256 muestras con signo cada una, de 0x7200 a 0x8000.
El logotipo de Konami que se destapa línea a línea al encender (0x45B9, 0x4585). Cotejado: 0 diferencias.
El logotipo de Konami que se destapa línea a línea al encender (0x45B9, 0x4585). Cotejado: 0 diferencias.