Hyper Sports 2

Las tres pruebas de puntería y fuerza de Hyper Sports en un cartucho de 16 KB: tiro al plato, tiro con arco y halterofilia, con el juego entero corriendo dentro de la interrupción de cada cuadro.

Konami · © Konami 1984 · Cartucho RC-717, 16 KB · MSX1 · página 1 · Volcado f4273f52…

Aquí no hay ninguna ilustración ni captura. Las pantallas están dibujadas desde los bytes de la ROM, ejecutando en Python el mismo descompresor de rachas, el mismo pintador de listas y el mismo guión del título que corre el Z80. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
308rutinas bautizadas
3pruebas
6.956bytes de código
9.428bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

Al pulpo hay que darle con el cañón de arriba

El lanzador de 0x5757 sólo sabe poner las posturas 1, 2 y 3: los platos de 100, 500 y 1000. Las posturas 4 y 5 no las pone nadie más que dos rutinas escondidas al final del cartucho, 0x761A y 0x762F, que montan la ranura a mano con nueve bytes escritos en la ROM. La primera suelta el pulpo; la segunda, el pájaro.

0x4F59 las llama cuando una tanda se acaba con las tres ranuras vacías, contando en 0xE19A: la primera vez el pulpo y la segunda el pájaro. Pero 0x762F empieza mirando 0xE179, y ese byte sólo lo marca 0x5AC1 cuando el plato reventado era la postura 4 —el pulpo— y 0xE178 dice que se disparó con el cañón de arriba. Darle al pulpo no basta: hay que darle con el cañón de arriba, que es el de 0xE0C4. El pulpo paga 0x30 en BCD (3000 puntos) y el pájaro 0x10 (1000).

Y hay una forma de quedarse sin los dos: 0xE199. Cada vez que 0x58EF retira un plato sin que 0xE179 esté puesto, 0x591D lo marca, y con él puesto 0x4F59 no llama a ninguna de las dos —ni sube la dificultad—.

Tres flechas en el centro y salen la manzana y el pingüino

0xE145 arranca en 3 (0x4C32). 0x65D1 lo baja de uno en uno, pero sólo cuando la flecha se clavó en el anillo 9, que no es el aro de fuera sino el centro de la diana: es el que paga 600 en la tabla de 0x5D37, donde el aro de fuera es el 0 y paga 10.

Al tercer centro 0xE145 llega a cero, y entonces 0x5C22 no monta el remate de siempre: copia las seis fichas de sprite de 0x5E59, que son la manzana y el pingüino. Acertarle deja el patrón 0x7C —el rótulo 3000— y 0x0030 en BCD en 0xE11D: otros 3000 puntos.

Las flores son tiles, y salen a la quinta pulsación

El tercer secreto no es un sprite. Cuando el jurado da el levantamiento por bueno (0x6F98) y el jugador sigue pulsando el botón, 0x523E sube 0xE132 un punto por cuadro. Al llegar a 5, 0x5065 rellena doce casillas de la fila 16 con el tile 0x91 y doce de la 17 con el 0x92, y sobre el podio aparece el arriate de flores. 0x524B cobra además 2000 puntos en BCD.

Las tres luces del jurado deciden el levantamiento

Con la barra arriba, 0x6F78 enciende una luz cada 0x20 cuadros en la columna 2, debajo del rótulo JUDGE; a la tercera pone 0xE071 y 0xE1A3 a uno y el levantamiento vale. Ese 0xE1A3 es luego el que decide el color de la figura, si se copian unos bytes u otros a la VRAM y qué cifra se pinta: el mismo byte manda en cinco sitios distintos.

El arco acierta con Pitágoras y sin raíz cuadrada

0x5CCF eleva al cuadrado las dos distancias al centro de la diana (0xBC, 0x53) con ocho sumas y desplazamientos, las suma, y compara ese cuadrado contra la tabla de 0x5D03, que son los radios de los nueve anillos ya elevados al cuadrado: 1, 6, 16, 25, 64, 96, 144, 196 y 289. El último no cabe en un byte, y por eso el bucle le pone el 1 de arriba a mano con un xor a / djnz / inc a.

Los platos no salen al azar: están escritos bit a bit

El lanzador lee hacia dónde sale cada plato de la tabla de 0x583E bit a bit, y su altura de la de 0x5866 de dos en dos bits, cada una con su propio contador. No hay ninguna semilla ni ningún reloj de por medio: el cartucho lanza siempre igual.

Una octava de doce notas, y las demás doblando

El reproductor guarda doce periodos en 0x7832 —de 0x6A a 0x38— y saca las otras octavas doblando el periodo en 0x7815, que es exactamente lo que significa bajar una octava. Con el reloj del PSG, el 0x6A da 1.055 Hz y el 0x38 da 1.998: el do y el si de la misma octava.

Ocho categorías de peso, con sus kilos

En 0x7587 hay ocho nombres de catorce tiles —FLY, BANTAM, FEATHER, LIGHT y MIDDLE WEIGHT, MIDDLE HEAVY, HEAVY WEIGHT y SUPER HEAVY— y en 0x6F48 sus ocho pesos en BCD: 150, 165, 180, 195, 210, 225, 240 y 260 kilos. El ángulo del arco, en la otra prueba, sube de 0,28 en 0,28 grados y da la vuelta a los 4,00.

No lleva la marca oculta de Konami

Muchos cartuchos de la casa esconden al final de la ROM su número de catálogo y el título en katakana; lo descubrió Manuel Pazos (@ManuelPazosMSX). Aquí no está: los últimos 25 bytes son 0xFF de relleno, sin el 0xAA que cierra la marca. El RC-717 viene del catálogo, no del binario.

Lo que el cartucho dibuja

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

La pantalla de presentación, montada como la monta el cartucho: los tiles del logotipo salen del flujo de 0x4AB5, el dibujo del guión de 0x4A2F y del flujo de 0x4862, y los rótulos de las listas de 0x480C y 0x47C1. Los tres nombres de prueba son tres filas de dieciséis tiles seguidos desde 0x4791
La pantalla de presentación, montada como la monta el cartucho: los tiles del logotipo salen del flujo de 0x4AB5, el dibujo del guión de 0x4A2F y del flujo de 0x4862, y los rótulos de las listas de 0x480C y 0x47C1. Los tres nombres de prueba son tres filas de dieciséis tiles seguidos desde 0x4791
Tiro al plato. El fondo es el flujo de 0x6C52 descomprimido en la tabla de nombres desde la fila 8; los tiles y sus colores, los dos primeros punteros de su registro en 0x6C3A; y el marcador de arriba, el flujo de 0x4749 con la lista de rótulos de 0x4712 encima
Tiro al plato. El fondo es el flujo de 0x6C52 descomprimido en la tabla de nombres desde la fila 8; los tiles y sus colores, los dos primeros punteros de su registro en 0x6C3A; y el marcador de arriba, el flujo de 0x4749 con la lista de rótulos de 0x4712 encima
Tiro con arco, con sus tres marcadores: <code>ANGLE</code> en la fila 10, <code>WIND</code> abajo y <code>SCORE</code> a su lado. La diana está centrada en la X 0xBC y la Y 0x53, que son exactamente las dos constantes contra las que 0x5CCF mide cada flecha
Tiro con arco, con sus tres marcadores: ANGLE en la fila 10, WIND abajo y SCORE a su lado. La diana está centrada en la X 0xBC y la Y 0x53, que son exactamente las dos constantes contra las que 0x5CCF mide cada flecha
Halterofilia. A la izquierda, debajo de <code>JUDGE</code>, la columna de las tres luces que enciende 0x6F78; abajo la barra <code>POWER</code> que pinta 0x6E24 en la fila 23; en el centro el cartel <code>CHOOSE CLASS</code> donde 0x756D escribe la categoría; y a la derecha el de los kilos
Halterofilia. A la izquierda, debajo de JUDGE, la columna de las tres luces que enciende 0x6F78; abajo la barra POWER que pinta 0x6E24 en la fila 23; en el centro el cartel CHOOSE CLASS donde 0x756D escribe la categoría; y a la derecha el de los kilos
Los sprites de la halterofilia, descomprimidos en la tabla de patrones de sprites tal como los deja el cartucho. Los dos primeros son <b>los dos discos de la barra</b>: son los que 0x6FCE deja cayendo desde la Y 0x4A cuando el levantamiento se acaba
Los sprites de la halterofilia, descomprimidos en la tabla de patrones de sprites tal como los deja el cartucho. Los dos primeros son los dos discos de la barra: son los que 0x6FCE deja cayendo desde la Y 0x4A cuando el levantamiento se acaba
Los dos bichos del tiro al plato, <b>con su color</b>. De izquierda a derecha: el plato normal, el pulpo, el pájaro y su segundo patrón —los dos que 0x50FC alterna cada cuatro cuadros para que bata las alas— y la segunda ranura del pájaro. Un patrón de sprite del MSX1 no lleva color: el color de cada uno sale de la tabla de parejas de 0x511D, que 0x5108 indexa por la postura de la ranura
Los dos bichos del tiro al plato, con su color. De izquierda a derecha: el plato normal, el pulpo, el pájaro y su segundo patrón —los dos que 0x50FC alterna cada cuatro cuadros para que bata las alas— y la segunda ranura del pájaro. Un patrón de sprite del MSX1 no lleva color: el color de cada uno sale de la tabla de parejas de 0x511D, que 0x5108 indexa por la postura de la ranura
La manzana y el pingüino, montados desde las seis fichas de sprite de 0x5E59. El pingüino <b>son tres sprites superpuestos en la misma casilla</b>, cada uno con su color: el patrón 0x68 en azul, el 0x6C en blanco y el 0x70 en amarillo. Así se pinta una figura de tres colores en una máquina donde cada sprite es de un color solo. A la derecha, el otro paso —0x5E35 alterna el cuerpo y las patas— y las tres capas por separado
La manzana y el pingüino, montados desde las seis fichas de sprite de 0x5E59. El pingüino son tres sprites superpuestos en la misma casilla, cada uno con su color: el patrón 0x68 en azul, el 0x6C en blanco y el 0x70 en amarillo. Así se pinta una figura de tres colores en una máquina donde cada sprite es de un color solo. A la derecha, el otro paso —0x5E35 alterna el cuerpo y las patas— y las tres capas por separado
Las flores de la halterofilia, que no son sprites sino tiles: los doce 0x91 de la fila 16 y los doce 0x92 de la 17 que 0x5065 rellena cuando 0xE132 llega a 5
Las flores de la halterofilia, que no son sprites sino tiles: los doce 0x91 de la fila 16 y los doce 0x92 de la 17 que 0x5065 rellena cuando 0xE132 llega a 5
El arquero de 0x4C3D y la escopeta de 0x4BF3, montados con las capas y los colores de sus propias fichas. El arquero son <b>tres pisos de dos sprites</b>, uno rojo y otro azul en cada altura
El arquero de 0x4C3D y la escopeta de 0x4BF3, montados con las capas y los colores de sus propias fichas. El arquero son tres pisos de dos sprites, uno rojo y otro azul en cada altura
Los del tiro con arco: los brazos del arco, la flecha y las piezas con las que se arma el tirador. Salen del flujo de 0x6318, que es el tercer puntero de su registro en 0x6C3A
Los del tiro con arco: los brazos del arco, la flecha y las piezas con las que se arma el tirador. Salen del flujo de 0x6318, que es el tercer puntero de su registro en 0x6C3A