Reconstruir un juego NES perdido a partir de discos de código fuente de 30 años – Video Game History Foundation


Programador de videojuegos Chris Oberth (1953-2012)

Hola a todos, el fundador de VGHF Frank Cifaldi aquí. Hoy me estoy asociando con Rich Whitehouse para contarles cómo nos recuperamos y volvimos a montar Días de tormenta, una canción inédita, nunca antes vista, coescrita por Chris Oberth en Mindscape.

El programador y diseñador Chris Oberth tuvo una carrera larga y diversa en la industria de los videojuegos antes de su muerte en 2012. Creo que para la mayoría de nosotros, el juego final para Chris Oberth fue Oso hormiguero, el título arcade que concibió y diseñó durante su estadía en Stern's (o tal vez conoces el clon que Chris mismo escribió para computadoras personales, Ardy l & # 39; Aardvark – o el que no hizo – Pozo de petróleo) Para otros, podría ser Juego de invierno para el Commodore 64, o quizás su trabajo arcade más tarde en Incredible Technologies como Asesinos del tiempo o Bolos de clase mundial, o el puñado de títulos que desarrolló en su Apple II a fines de la década de 1970 y principios de la década de 1980 (en una Apple II con el número de serie 201, como le gustaba presumir).

A principios de 2020, un amigo de la familia sobreviviente de Oberth se acercó a la Video History History Foundation para ayudarlo a comprender los documentos que había dejado. Durante años, en el sótano de su casa, a menudo trabajaba: pilas de computadoras viejas, copias de seguridad de CD-R, disquetes, notas, cintas, EPROM y cintas de datos subiendo en su primer trabajo con Apple II a finales de los 70, en el que su familia acordó prestarnos para evaluación.

Como suele ser el caso al mirar archivos como este, nuestra primera prioridad era tratar de recuperar todos los trabajos perdidos de Chris, de los juegos que desarrolló que, por una razón u otra, nunca han estado disponibles comercialmente. Desafortunadamente, casi no encontramos restos de su tiempo en Stern, lo que significa que su inédito Caza el wumpus– un juego de arcade inspirado Cripta Probablemente se ha ido para siempre. Pero el resto de la colección nos dio una gran esperanza para su trabajo posterior en computadora y consola.

El misterioso "Hot Rod Taxi" fue nuestro primer indicio de que el archivo de código Oberth puede contener trabajos inéditos.

Un disco en particular nos llamó la atención: un disquete de 5,25 pulgadas con una etiqueta escrita a mano que decía "FINAL DE TAXI NODENDO HOT ROD". No es un título conocido para un juego, pero sabíamos que Chris había desarrollado al menos un juego para Nintendo Entertainment System. Gladiadores americanos. No sabíamos mucho más sobre su carrera en ese momento, pero afortunadamente Oberth ha realizado al menos dos entrevistas en sus últimos años con sitios web apasionados por los juegos retro, uno con Derek & # 39; s Basement Arcade y una de cada tres partes en 2006 para Retrogaming Times (en particular en los números 21, 24 y 27 de "Retrogaming Times Monthly"). Fue en este último que Chris mencionó brevemente un juego de NES inédito, una versión inédita de Días de tormenta hecho para Mindscape (un intento por separado de Gremlin Graphics finalmente se publicó en su lugar). "Hot Rod Taxi" fue nuestro perdido Días de tormenta? Tal vez despojado de su título de licencia de película?

Taxi Hot Rod para el NES, tal como está compilado del código fuente de Oberth. No es un juego, sino una primera demostración tecnológica. Días de tormenta Todavía nos eludió.

La respuesta resultó ser … más o menos. Puede ser. Después de realizar una extracción de secuencia limpia del disco y ensamblar un binario a partir de su código fuente y datos gráficos, terminamos con un juego NES jugable que, aunque históricamente interesante, no era todavía no es un juego. En todo caso, parecía una prueba temprana de trabajo conceptual, tal vez Oberth se estaba mojando los pies por primera vez en una plataforma que era todo nuevo para el

Teníamos otro lugar para buscar: una pila gigante de copias de seguridad de disco duro en su mayoría etiquetadas que abarca varios años en casi 40 disquetes. No se trataba solo de discos en archivos, se hicieron con (múltiples) herramientas de copia de seguridad del disco duro, lo que significa que los archivos se dividieron y cifraron. La única forma de obtener algo de ellos era escanear toda la pila y luego volver a ensamblarlos.

A partir de aquí, pasaré el piso a Rich.

Solo una muestra de los cientos de registros que dejó Chris Oberth. Este Días de tormenta en algún lugar de este montón?

Recuperación de almacenamiento

Nuestra primera tarea para encontrar lo que quedaba de Días de tormenta fue recuperar la mayor cantidad de datos posible de los medios de almacenamiento disponibles, que consistían principalmente en discos viejos de 5,25 pulgadas. Algunos de estos discos tenían sectores ilegibles, pero muchos todavía estaban completamente intactos. Algunos discos también se podían leer de inmediato, con sistemas de archivos FAT12 creados bajo MS-DOS. Sin embargo, el conjunto más prometedor del grupo fue una colección de 21 discos que contienen copias de seguridad de 4 particiones separadas del disco duro, en un formato propietario generado por PC Tools 5.1. Tuvimos ayuda para comprender esta parte: "PCTools 5.10. Copia de seguridad "estaba escrito en las etiquetas.

Nuestro primer intento de reconstruir el disco duro de Oberth 1989 utilizando su herramienta de copia de seguridad original no tuvo éxito, ya que la emulación a través de DOSBox no funcionó. No estaba a la altura.

Inicialmente, intenté ejecutar el programa de copia de seguridad de PC Tools a través de DOSBox con la esperanza de poder restaurar las copias de seguridad a través de la emulación. No tuve la suerte de que el programa reconociera imágenes de disco en DOSBox, y pensé que tal vez debería hacer algunos cambios en el emulador para seguir este camino . En este punto, decidí desviarme hacia la comprensión directa de los datos y excavar los datos del sector en bruto en estas imágenes de disco de respaldo.

La estructura de datos no fue demasiado complicada. Cada directorio y registro de archivo se almacenó en una secuencia comprimida, donde los bytes de comando se usaron para indicar 1 de 3 cosas. 0xDA significa "registro de directorio", que se agregará a la pila de directorios actual. 0xDB significa "registro de archivo", seguido inmediatamente por los datos reales en el archivo. 0xDC significa "directorio pop", que elimina el directorio más reciente de la pila de directorios. En las grabaciones, también pude identificar palabras de fecha / hora de estilo MS-DOS, lo que nos permitió poner fechas específicas en cada uno de los archivos de la copia de seguridad.

Fue un comienzo prometedor y nos permitió generar una lista de archivos contenidos en las copias de seguridad. Rápidamente vimos una gran cantidad de código fuente y datos que casi seguramente parecían representar el premio gordo: Días de tormenta. Desafortunadamente, todavía había un problema. Aunque pude generar una lista completa de rutas a partir de las copias de seguridad, la mayoría de los datos que buscábamos se comprimieron utilizando un algoritmo patentado. Puede haber sido bastante fácil controlar la compresión utilizada aquí, pero el cifrado también se ha aplicado sobre los datos ya comprimidos. Afortunadamente, el cifrado aplicado a los datos fue genérico y no se basó en una clave especificada por el usuario, ¡o probablemente aún estaría reduciendo la recuperación de datos en lugar de escribir esto!

Entonces, desde aquí, imaginé algunos enfoques. El primer enfoque fue crear una versión personalizada de DosBox para ejecutar correctamente el programa de copia de seguridad de PC Tools en emulación con las imágenes de copia de seguridad originales. El segundo enfoque consistía en aplicar ingeniería inversa al cifrado y la compresión utilizados por PC Tools, lo que significaría tomar mucho tiempo para desmontar (e idealmente depurar) el programa original. No soy ajeno a desarmar sistemas más grandes y más complicados que eso, pero pensé que una compilación personalizada de DosBox sería una herramienta útil en este enfoque de todos modos, por lo que solo debería tener ir tan lejos en el caso de que los datos de la copia de seguridad estuvieran dañados de una forma u otra. En este caso, debería entender cada parte para recuperar todo lo posible de los restos.

El voluntario VGHF Foone vino al rescate, reconstruyendo un entorno de hardware adaptado a la era para recuperar correctamente la copia de seguridad del disco duro de Oberth.

El tercer enfoque fue mucho más fácil que uno de los dos anteriores: ¡use equipo real! Desafortunadamente, no tenía el equipo necesario a la mano, pero pudimos obtener ayuda inmediata de alguien que lo tenía. Foone pudo obtener una solución operativa y de hardware, y aunque tuvimos que volver a extraer uno de los conjuntos de discos de respaldo para que PC Tools se los tragara, finalmente pudimos restaurar cada bit de datos a cada una de estas 4 particiones del disco duro.

Debido a que el tercer enfoque funcionó, nunca entré en las trincheras de ingeniería inversa del algoritmo de compresión utilizado por PC Tools. Para el registro, sin embargo, parecía ser algo similar a LZSS. Hice pruebas simples usando pcsecure.exe de la colección PC Tools, que parecía utilizar una compresión muy similar (aunque no idéntica, basada en los resultados obtenidos al comprimir los datos correspondientes) a la compresión utilizada por el programa de copia de seguridad. También noté que la compresión se redujo y produjo resultados finales más grandes para algunos de los casos que normalmente esperaría que fueran malos para LZSS, como una serie de bytes completamente única, que produce el tipo de sobrecarga que esperaría salpicar los datos con bytes de control.

Construye la fuente

A primera vista, no vimos nada que destacara como una imagen ROM preconstruida. Por supuesto, eso hubiera sido demasiado fácil. Entonces, con 4 particiones del disco duro que valen datos para explorar, comencé en un directorio llamado C: ROMX BTR, que es el directorio que más ansiamos ver cuando solo estábamos mirando una lista de nombres de archivos. Este directorio parecía contener todo el código fuente y algunos datos, por ejemplo Días de tormenta. Muchas de las herramientas utilizadas originalmente para desarrollar el juego, incluido el enlazador / ensamblador, también se han guardado en C: UTIL. El ensamblador original era X6502, un ensamblador cruzado 6502 de 2500 A.D. Software, Inc. El ensamblador y el enlazador aquí se marcaron como versión 4.03b.

Construí la fuente y vinculé todos los objetos, lo que generó 6 binarios separados. Esto nos lleva a la siguiente parte del proceso, un programa llamado ROMX. Este programa es parte de un paquete ROMulator de GTEK, Inc. El sitio web de la compañía realmente notable todavía está en vigencia en el momento de este escrito. En nuestro caso, el programa ROMX se utilizó para comunicarse a través del puerto RS232 de la PC, colocando los datos directamente en la memoria PRG / CHR de un cartucho de desarrollo NES. Esto permitió a los desarrolladores actualizar y probar rápidamente su código y / o cambios gráficos en hardware real. Aún más convenientemente, pudieron actualizar selectivamente solo un conjunto particular de bancos para reducir los tiempos de iteración al actualizar un fragmento de código o un conjunto de azulejos particulares. Hay algunos archivos por lotes en la fuente que ejecutan comandos ROMX para descargar archivos específicos a ubicaciones específicas en PRG / CHR. Aquí hay uno que explica exactamente cómo se presenta todo el PRG ROM:

ROMX PB0.TSK (TS, M , %% 0000, @ 0000-ffff)
ROMX PB1.TSK (%% 0000, @ 4000-7fff)
ROMX PB2.TSK (%% 0000, @ 8000-bfff)
ROMX PB3.TSK (%% 0000, @ C000-ffff)
ROMX PB4.TSK (%% 0000, @ 10000-13fff)
ROMX PB7.tsk (%% 0000, @ 1C000-1ffff)
ROMX CRASHL2.SND (%% 0000, @ 1F000-1ffff)
ROMX SKIDF.SND (%% 0030, @ 1FC80-1fff0, TE)

Lo anterior nos dice dónde colocar los 6 binarios de código (los que acabo de mencionar sobre la vinculación anterior), así como 2 binarios de audio pregenerados. Cuando uno de los desarrolladores quería producir un binario plano de la memoria PRG o CHR, en lugar de replicar toda esta información en otro proceso en el lado de la PC, simplemente ejecutó ROMX con parámetros para eliminar todos los datos directamente de materiales y almacenarlos. en un archivo

En este punto de la construcción del juego, estaba claro que necesitábamos algún tipo de mapeador basado solo en el número de bancos PRG, así que revisé la fuente y vi algunos código que funcionó explícitamente con registros MMC1. Construí un encabezado iNES con mi ROM PRG de 128K, configuré los bits del mapeador en consecuencia y simplemente tiré basura aleatoria en la ROM CHR para probar. El juego comenzó con éxito en un emulador y comenzó a reproducir música en un gran lío de datos de mosaicos aleatorios que creo que probablemente se suponía que era una pantalla de título.

Personajes faltantes

Mientras ejecutaba el juego con un montón de datos aleatorios en CHR ROM, pude ver que estábamos viendo un poco de datos de mosaico únicos. Algunos rastros de estos datos permanecieron dentro y alrededor de la fuente. En particular, había una herramienta personalizada diseñada para analizar los bloques de mosaico de archivos Pictor CLP, escribirlos en un archivo temporal y subirlos a direcciones CHR explícitas a través de ROMX. Este proceso se utilizó para algunos conjuntos pequeños de fichas y llaves de automóviles. Sin embargo, en su mayor parte, no se contabilizaron muchos datos de CHR y no había signos de cómo esos datos de CHR se descargaban normalmente a través de ROMX.

En otro directorio, C: ROMX CHEDIT, Encontré un editor de mosaico NES personalizado con restos de datos que parecían pertenecer a Días de tormenta. Pude hacer coincidir algunos de los datos .map y .pal que se habían exportado aquí a los datos que se ensamblaron en PRG, y porque coincidían, pensé que los archivos .chr aquí también irían coincidir con todo lo que pertenecía a CHR. Empecé con un archivo llamado CAR.CHR, y traté de averiguar exactamente dónde pertenecía en la memoria del CHR. La respuesta a eso fue 0x3000, que logré verificar mirando la pantalla del título incluso con el resto de CHR lleno de datos aleatorios:

Hemos localizado y compilado los datos del programa, ¡pero faltaba la mayor parte del arte! Haber estado tan cerca y no haber cruzado la línea de meta fue muy frustrante.

Fue bueno verificar que estos datos en particular pertenecían a CHR ROM, pero todavía me faltaban muchos datos, y había descubierto referencias en los scripts para una utilidad de animación que apuntaba al seguimiento y al mosaico de imágenes en rutas de disco que realmente no existían en la copia de seguridad que habíamos restaurado. Temía que lo peor era que nos faltaban un montón de datos CHR con los datos de origen para reconstruirlo.

Sabiendo que ya tenía un candidato probable para un gran pedazo de CHR ROM, tomé una cadena de un solo byte de CAR.CHR y binario lo buscó en cada archivo de la copia de seguridad, esperando tener suerte y llegar a una pieza preconstruida de CHR ROM. Sin suerte la primera vez. En este punto, fui por la opción nuclear. Extraje todos los archivos en todos los formatos conocidos en cada una de las copias de seguridad de la unidad, e hice lo mismo para todas las otras imágenes de disco que habíamos logrado recuperar. Hice otra búsqueda en todo el asunto, y solo hubo un hit en un archivo binario de 128 KB. Oh sí.

Poniendolo todo junto

Fui cauteloso, sin saber si este archivo binario de 128 kb de tamaño adecuado coincidiría realmente con los mapas de origen y mosaico con los que estaba trabajando, especialmente porque el éxito provino de un conjunto separado de discos. Sin embargo, al no ver otras opciones en este momento, tomé el archivo y lo usé para ocupar toda la ROM CHR en mi ROM NES construida, y estaba allí. ¡Todo parecía estar exactamente donde debería estar!

Finalmente por mucho tiempo Días de tormenta, visto aquí por primera vez en más de treinta años!

Con esto, logramos nuestra misión. Parece que, por desgracia, nos faltaban muchos datos de origen, y todavía sospecho que estos datos estaban viviendo en algún lugar de esas otras particiones del disco duro que no estaban incluidas en la copia de seguridad principal que restauramos. Sin el hecho de que logramos obtener un éxito en el binario CHR desde un conjunto de datos aparentemente no relacionado, es posible que nunca hubiéramos podido restaurar este juego en su totalidad, o habríamos tenido tal vez terminamos creando nuestros propios mosaicos solo para ver una apariencia de la experiencia jugable esperada. Se nota, cada disco cuenta!

¡Construye y juega tú mismo!

Con el permiso de la familia de Chris Oberth, pronto publicaremos el código fuente para construir en GitHub. Mientras tanto, un grupo de entusiastas de los juegos retro ha reunido una pequeña serie de Días de tormenta cartuchos, compatibles con el sistema de entretenimiento de Nintendo, como una recaudación de fondos para la viuda de Oberth. Está disponible aquí

¡Lo hiciste posible!

¡Hemos podido pasar semanas concentrándonos en los Archivos de Oberth gracias a sus generosas donaciones caritativas! Este nivel de trabajo realmente no hubiera sido posible sin personas como tú. Si eres nuevo en VGHF, o si simplemente disfrutas el trabajo que hacemos, considera donar si puedes. Cada dólar ayuda.

Conservamos la historia de los videojuegos, un byte a la vez.Done ahora



Be the first to comment

Deja un comentario