94 228 bytes de fichero TSX, que al abrirlos dan 93 861 bytes de contenido repartidos en siete bloques. Lo raro empieza en el primer vistazo: dos de ellos están grabados como manda el MSX y cuatro no.
| bloque | bytes | dónde va | qué es | |
|---|---|---|---|---|
| 1 | STARDU | 256 | — | el cargador BASIC, texto plano |
| 2 | TOPO | 4254 | 0x9470 | el logo animado de la casa |
| 3 | LOADER | 351 | 0xD2F0 | el cargador turbo |
| 4 | — | 12 468 | 0x9B8C | la pantalla de carga, y se ejecuta |
| 5 | — | 46 663 | 0x47A0 | el juego de naves, zonas 1 a 7 |
| 6 | — | 8 | — | un descriptor de ocho bytes |
| 7 | — | 29 861 | 0x61D0 | la segunda parte, la de a pie |
Los tres primeros son bloques KCS, el formato de cinta del MSX, con su cabecera y su nombre de fichero. Los cuatro siguientes son bloques del ZX Spectrum: una bandera, los datos y un XOR de comprobación. Los cuatro traen ese XOR correcto, comprobado uno a uno.
Empieza en el cargador BASIC, que son cinco líneas:
10 COLOR 1,1,1:SCREEN 2
20 BLOAD"cas:",R ' el logo, que se ejecuta solo
30 BLOAD"cas:" ' el cargador turbo, que NO se ejecuta
40 CLS:COLOR 0,0,0:SCREEN 2
50 DEFUSR=54000!:A=USR(0) ' 54000 = 0xD2F0: ahora si
Y sigue en el cargador turbo, que hace esto por orden:
El descriptor de ocho bytes y el último bloque no los carga él: los pide el propio juego al superar la última zona.
Esto es lo que obliga a mirar la cinta de otra forma. En memoria, los bloques no conviven:
pantalla de carga 0x9B8C - 0xCC3F
juego de naves 0x47A0 - 0xFDE6 <- machaca a la pantalla entera
segunda parte 0x61D0 - 0xD674 <- cae dentro del juego
O sea que no hay una imagen de 64K que contenga todo el juego, sino tres fotos de la memoria en momentos distintos. Cada listado va con el org de donde se ejecuta de verdad, y el presupuesto de bytes se suma sobre los bloques de la cinta y no sobre el mapa de memoria: si se sumara sobre la memoria, los bytes que se pisan se contarían mal.
Aquí hubo un cuadro de porcentajes que hubo que retirar, porque la herramienta que los calculaba estaba rota: localizaba cada sección del otro binario por sus primeros 32 bytes y se quedaba con la primera coincidencia, sin exigir que fuera única ni que el desplazamiento encajara con el del resto. Como las dos versiones comparten el dibujo, esas agujas caían dentro de la tilería.
Reescrita, la herramienta ya no busca sección por sección: alinea los dos binarios enteros. Indexa las ventanas del binario de Spectrum, cuenta qué desplazamientos aparecen una y otra vez, y con los dominantes extrae las rachas máximas de bytes idénticos. Cada tramo que se da por común trae su prueba: dónde empieza en cada binario, cuánto mide y con qué desplazamiento.
Y lo que sale reformula la idea que uno se hace de esta conversión:
25.015 bytes idénticos al Spectrum 53,6 % del bloque
de esos, CÓDIGO: 81 bytes 0,3 %
de esos, DATOS: 24.934 bytes 99,7 %
El código no se compartió. Se trajeron el dibujo y los datos byte a byte —y en la misma dirección, con desplazamiento cero: los gráficos ocupan 0x6037–0xA55F y 0xA561–0xBD84 en las dos máquinas— y el código se reescribió. Los dos únicos tramos de código que coinciden, de 55 y 24 bytes, son tiras desenrolladas de adc hl,hl: salen iguales porque son la misma instrucción repetida muchas veces, no porque nadie las copiara.
Eso encaja con lo que dice la propia pantalla de créditos, que firma la conversión Carlos Arias mientras los gráficos siguen siendo de los hermanos Arévalo, los mismos del original.
De los nombres del fichero de control del Spectrum, 20 de 138 quedan respaldados por bytes idénticos. Entre ellos los datos de las siete zonas, la geometría de los tiles —«111 tiles at 4x32 bytes per tile», que es exactamente la que habíamos medido aquí— y el mensaje DEMO, justo donde lo habíamos encontrado buscando la cadena.
De la parte de a pie el cotejo no puede decir nada, y no por la herramienta: los autores del desensamblado de Spectrum avisan en su README de que «the entire on-foot second stage of the game also fell outside the scope». No la desensamblaron, y no está en la instantánea con la que se compara.