Konami's Billiards

Dieciséis kilobytes de los que el juego ocupa ocho: arranca, engancha la interrupción y se queda en un jr $ para siempre. La partida entera cabe dentro del gancho de vídeo, repartida en dieciséis estados, y dentro hay una física de choques con trigonometría, raíces cuadradas y rebotes a cuarenta y cinco grados.

Konami · ©KONAMI 1984 · Cartucho RC-706, 16 KB · MSX1 · página 1 · Volcado 38741612…

Aquí no hay ni una captura de pantalla. Todas las imágenes están reconstruidas: las dibuja una herramienta que repite, instrucción a instrucción, las rutinas de carga y los dos intérpretes de dibujo del cartucho sobre una memoria de vídeo vacía, y luego revela esa VRAM como la revelaría el VDP. Que la mesa salga bien es la prueba de que las rutinas se han entendido bien. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
16estados del juego
333rutinas identificadas
5.343bytes de código
11.041bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

En la mesa sólo hay siete bolas, y la octava entrada no es una bola

La tabla de la mesa (0xE100) tiene ocho registros de dieciséis bytes, pero el bucle de la física sólo recorre siete: se para en 0xE16F. El octavo, 0xE170, es el punto al que se apunta, y de restarle la posición de la bola blanca sale el vector del tiro (0x4CA8).

Se dibuja como los demás —es ese punto pequeño que se ve a la derecha de la mesa— porque el refresco de sprites vuelca dos grupos de cuatro, o sea las ocho entradas.

Dos bolas que no existen, puestas ahí para reaprovechar una rutina

0xE18F y 0xE1EA no guardan nada. Están colocadas para que su byte +7 y su byte +9 caigan justo encima de un par de variables sueltas, que es donde una bola de verdad tiene las dos componentes de su velocidad.

Con eso, la rutina que saca la pendiente y el ángulo de una bola (0x5430) sirve sin cambiarle una línea para medir el ángulo de la recta que une dos centros, en el choque, y el de la blanca a la mira, en el attract. Un puntero bien elegido en vez de una segunda rutina.

El attract juega apretando el botón por dentro

No hay código de juego aparte para la demostración. Lo que hace 0x5EEC es medir el ángulo de la blanca a la primera bola que quede en la mesa, compararlo con el de la mira y, cuando coinciden con un grado de margen, escribir 0x10 en 0xE009.

0xE008 y 0xE009 son las dos variables donde el juego deja las teclas del cuadro anterior y las de este; 0x10 es el bit del botón de tiro. La máquina no llama a la rutina de tirar: finge la pulsación y deja que el juego la lea como si fuera de una persona.

Un rebote a cuarenta y cinco grados, sin una sola multiplicación

Las bocas de las troneras están achaflanadas en diagonal, y el cartucho las resuelve mirando la suma y la resta de las dos coordenadas: sobre una diagonal de 45°, una de las dos vale siempre lo mismo.

Y para rebotar en ella basta con intercambiar las dos componentes de la velocidad (0x5923), o intercambiarlas y cambiarles el signo si es la otra diagonal (0x593B). Reflejar en un espejo a 45° es exactamente eso, y sale gratis.

Una raíz cuadrada que redondea, y no por casualidad

0x5376 saca la raíz por el método de los impares: resta 1, luego 0, luego 2 y 2, luego 4 y 4… y devuelve cuántas vueltas ha aguantado. Es una docena de bytes.

Pasada por los 65.536 valores posibles de entrada, devuelve exactamente round(sqrt(n)): la raíz redondeada al entero más cercano, no la truncada, que es lo que suelen dar estas rutinas. Se usa para la distancia entre la bola y la mira, y medio píxel importa cuando de ahí sale la dirección del tiro.

La barra de fuerza no se ajusta: va y viene sola

El indicador SPEED no responde a las teclas. La misma rutina que lo pinta (0x5314) lo adelanta un paso cada vez que se la llama, y cicla 1, 2, 3, 1, 2, 3… La llamada entra una vez cada sesenta y cuatro cuadros.

Así que la fuerza del tiro no se elige, se caza: hay que apretar el botón en el momento en que la barra está donde interesa. La máquina, en el attract, sólo dispara con la barra al máximo.

Este cartucho no lleva la marca oculta de Konami

Manuel Pazos descubrió que los cartuchos de Konami de esta época esconden al final de la ROM su número de catálogo RC-7xx y el título en katakana. Aquí no está: no hay un solo RC-7 en ASCII en los 16 KB, y el final del chip son 8.269 bytes de 0xFF seguidos desde 0x5FB3.

El RC-706 de la ficha de esta página sale del catálogo, no del binario.

Lo que el cartucho dibuja

Debajo de cada pie está la dirección de donde sale. Todas son reconstruidas: se rehacen con make imagenes y no hace falta emulador.

RECONSTRUIDA — la mesa entera, montada como la monta 0x4A39: el plano de 0x4C59 es una tira de [cuántas filas][bloque comprimido] que se despliega desde la fila 7. Encima, las ocho entradas de 0x461F: la blanca, las seis de color en triángulo y, a la derecha del paño, la mira
RECONSTRUIDA — la mesa entera, montada como la monta 0x4A39: el plano de 0x4C59 es una tira de [cuántas filas][bloque comprimido] que se despliega desde la fila 7. Encima, las ocho entradas de 0x461F: la blanca, las seis de color en triángulo y, a la derecha del paño, la mira
RECONSTRUIDA — la misma mesa sin sprites. Se ven las seis troneras y, en las cuatro esquinas, los chaflanes de 45° que el código resuelve con la suma y la resta de las coordenadas
RECONSTRUIDA — la misma mesa sin sprites. Se ven las seis troneras y, en las cuatro esquinas, los chaflanes de 45° que el código resuelve con la suma y la resta de las coordenadas
RECONSTRUIDA de 0x4A70 — los 59 tiles de la mesa con su color. Los patrones se copian tal cual y los colores vienen comprimidos aparte, en 0x4C40, con el mismo formato que el resto de los dibujos
RECONSTRUIDA de 0x4A70 — los 59 tiles de la mesa con su color. Los patrones se copian tal cual y los colores vienen comprimidos aparte, en 0x4C40, con el mismo formato que el resto de los dibujos
RECONSTRUIDA de 0x4B30 — los dibujos de sprite de 16×16: la bola blanca, las seis numeradas y el punto de la mira. El noveno no es un dibujo: los 288 bytes que se copian se pasan del final y caen sobre los colores comprimidos de la mesa
RECONSTRUIDA de 0x4B30 — los dibujos de sprite de 16×16: la bola blanca, las seis numeradas y el punto de la mira. El noveno no es un dibujo: los 288 bytes que se copian se pasan del final y caen sobre los colores comprimidos de la mesa
RECONSTRUIDA de 0x5788 — el BILLIARDS verde del título. Son quince columnas de dos tiles, no quince letras: la animación de 0x48B8 suelta una columna por llamada
RECONSTRUIDA de 0x5788 — el BILLIARDS verde del título. Son quince columnas de dos tiles, no quince letras: la animación de 0x48B8 suelta una columna por llamada
RECONSTRUIDA de 0x4136 — los 48 glifos que el cartucho lleva propios, cargados en los tiles 0x30 a 0x5F. Como esos números coinciden con el ASCII, las listas de texto escriben las palabras tal cual
RECONSTRUIDA de 0x4136 — los 48 glifos que el cartucho lleva propios, cargados en los tiles 0x30 a 0x5F. Como esos números coinciden con el ASCII, las listas de texto escriben las palabras tal cual
RECONSTRUIDA de 0x498D — los 26 tiles del logotipo KONAMI, descomprimidos y montados en las tres filas de 3, 11 y 12 tiles que reparte 0x491E al hacerlo subir por la pantalla del título
RECONSTRUIDA de 0x498D — los 26 tiles del logotipo KONAMI, descomprimidos y montados en las tres filas de 3, 11 y 12 tiles que reparte 0x491E al hacerlo subir por la pantalla del título