Aquí no hay ninguna ilustración ni captura. La fuente y los tiles están dibujados desde los bytes de la ROM, ejecutando en Python el mismo descompresor de guiones que corre el Z80; hasta la escena de la carretera se monta así, ejecutando los descompresores del cartucho y pintando los coches con sus propios patrones. El listado y las cifras salen del binario y se reproducen con make.
Al final de la ROM, detrás del relleno, Konami escondía en muchos cartuchos su número de catálogo y el título en katakana; lo descubrió Manuel Pazos (@ManuelPazosMSX). Aquí está: los últimos once bytes de 0x7FF5 son el título al revés, su longitud, el 18 del RC-718 en BCD y el 0xAA que la cierra.
INIT engancha la interrupción a 0x4051 y cae en un jr a sí mismo. A partir de ahí el programa principal no hace nada: cada cuadro, la interrupción lee 0xE000 (el estado, de 0 a 8), salta por una tabla de nueve manejadores, y dentro de cada uno el byte 0xE001 reparte los subestados con cadenas de djnz.
No hay geometría: 0x68D0 lee 0xE074 —la curvatura y la posición del trazado— e indexa la tabla de 0x767C para elegir qué forma de carretera dibujar. Las rayas se mueven hacia el jugador desplazando un buffer (0x707A) al ritmo de la velocidad, y el escalado de los objetos por profundidad sale de las tablas de 0x6CD5.
0xE060 va de 1 a 0x0C y con él se elige, por la tabla de 0x481A, el compositor de fondo de cada etapa: ocho rutinas cubren las doce, y el compositor de la 12 llama al de la 5. El parámetro 0xE061 (tabla 0x4372) es un campo de bits con lo que cada etapa tiene de particular: el bit 1 es el suelo resbaladizo de la nieve, 0x01 el túnel, 0x10 la tormenta y 0x08 la noche. En las dos nocturnas, 0x71AC corre un campo de dieciséis estrellas por el cielo, a precisión de píxel y al ritmo de la velocidad del coche.
El motor de 0x5FB7 recorre tres fichas de catorce bytes (0xE010), lee las melodías con su intérprete de órdenes y escribe el PSG por la BIOS. Es el mismo armazón de reproductor que Konami repartía entre sus cartuchos de MSX; 0x5ED9 arranca una melodía o un efecto por su número, mirando antes la prioridad para no pisar lo que ya suena.
El coche se monta con seis sprites (plantilla en 0x66E2) que 0x65FA recoloca cada cuadro según el volante. Los tres rivales llevan sus fichas en 0xE138/48/58; 0x7C34 los ordena por cercanía antes de dibujarlos, y 0x7F89 parte la velocidad por la mitad al chocar contra uno.
0x7CCB estaba en el listado como el impacto, y no toca tu velocidad: lo único que escribe es la posición del rival, y le suma (la velocidad del rival − la tuya) / 16. En una carrera de 45 segundos sin un solo golpe corrió 1329 veces. Y 0xE09C, que el listado llamaba el color del rival, es su velocidad: forzado a 0 te los comes a todos, forzado a 255 se te escapan todos. La cuenta rehecha en Python reproduce 102 de 102 casos leídos dentro de la propia rutina.
En el desierto la carretera no scrollea: 0x707F desvía el scroll a SUBEN_PIRAMIDES. Y no hay una pirámide guardada en ninguna parte: hay una ventana de 32 bytes en 0x7351 —dieciséis ceros y luego el triángulo— que se desliza una posición cada vez que 0xE071 llega a uno de los dieciséis umbrales de 0x7371. La mitad derecha del patrón es la izquierda pasada por INVIERTE_BITS, el mismo truco del coche rival.
No crece: deja de ser sprites y pasa a ser pantalla. La tabla 0x7D94 da veinte escalones, y los dos bits bajos de cada patrón dicen cuántos sprites se encienden —uno de lejos, dos más cerca, y cuatro en dos capas de color superpuestas, que es como se pinta un coche de dos colores con sprites de un color cada uno—. Cuando el byte 0 de la ficha baja de 0x28, 0x7B21 pone Y = 0xE0 en los cuatro sprites y RIVAL_MEDIO (0x7AD1) lo repinta con doce casillas de la tabla de nombres.
Y de esas doce, el cartucho sólo guarda la mitad: 0x2A es 0x24 con los bits del revés, y así hasta 0x2E. La otra mitad la pone DESC_DOBLE (0x44B0), que pasa el mismo bloque dos veces y la segunda por el núcleo reubicado de 0xE310, que cae en INVIERTE_BITS.
Debajo de cada imagen está de dónde sale y qué se está viendo.
tools/graficos.py, descomprimiendo el guión de 0x4DEA con el mismo formato que el Z80. Digitos, símbolos y el alfabeto con el que se escribe todo el juego, incluida la unidad km/h del cuentakilómetros