La cinta

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.

Los siete bloques

bloquebytesdónde vaqué es
1STARDU256el cargador BASIC, texto plano
2TOPO42540x9470el logo animado de la casa
3LOADER3510xD2F0el cargador turbo
412 4680x9B8Cla pantalla de carga, y se ejecuta
546 6630x47A0el juego de naves, zonas 1 a 7
68un descriptor de ocho bytes
729 8610x61D0la 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.

La cadena de carga

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:

  1. Busca RAM y la mapea en las páginas 1 y 2, para tener los 64K planos.
  2. Se copia 300 bytes a sí mismo en 0x4000 y salta allí.
  3. Salva 94 bytes de 0xDAC0 a 0xFDE8 (el buzón de parches) y pone la pila.
  4. Carga el bloque de la pantalla y lo ejecuta.
  5. Carga el bloque del juego encima, machacando al anterior.
  6. Aplica los parches del buzón, si los hay.
  7. Salta a 0xBD85, que es el juego.

El descriptor de ocho bytes y el último bloque no los carga él: los pide el propio juego al superar la última zona.

Los bloques se pisan unos a otros

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.

Cuánto se trajo del Spectrum

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.