Tutorial: Conversión de aventuras de Spectrum a Amstrad CPC con InPAWS

Desde la versión 1RC2, Inpaws puede generar ficheros .SCE compatibles con el formato de PAW-CPM, usando la misma sintaxis que para cualquier aventura creada para el Spectrum. Esto supone que se pueden crear aventuras multiplataforma sin necesidad de escribirlas para cada versión. Sólamente es necesario tener en cuenta las pequeñas diferencias existentes entre los distintos PAW, y plasmarlas en el código mediante el uso de las directivas de compilación condicional, disponibles también desde la versión 1RC2. Otra aplicación interesante de esta característica, que es la que voy a intentar explicar aquí, es la adaptación de las viejas aventuras de Spectrum para funcionar en un Amstrad.

Vamos a convertir a CPC la aventura "Historias de Medialand", cuyo autor, Javier San José, se ha prestado amablemente a que la pongamos en la mesa de experimentos. Espero hacer justicia a esta estupenda aventura y sacar una versión Amstrad aceptable.

Necesitaremos:

Los pasos a seguir serán los mismos en todas las aventuras:

1) Extraer código fuente

Para ello ejecutamos: inpaws e medland1.z80 -o medland1.paw

Ya tenemos en un fichero .paw el fuente de la aventura, sobre el que vamos a trabajar para elaborar la conversión.

2) Adaptar caracteres en español

Lo primero que nos sorprende al abrir el fuente, es que en los mensajes hay ciertos caracteres extraños, como $, # o & en lugar de las vocales acentuadas y el resto de caracteres propios de la lengua española. Esto es por que el autor ha utilizado esos códigos ASCII, redefiniendo su forma en el editor de PAW Spectrum para representar los caracteres del idioma patrio. Si compiláramos este archivo para generar un .SCE de Amstrad, lo que obtendríamos sería... pues los caracteres extraños, ya que el PAW de amstrad no admite juegos de caracteres a medida.

Lo que vamos a hacer, descartando el sustituirlos uno a uno a mano, es decirle a Inpaws que esos caracteres tiene que sustituirlos por otros antes de generar la aventura para CPC. Una observación somera de las primeras descripciones nos revela que:

  • El carácter ']' en la aventura se utiliza como '¿', que en Amstrad sería el código ASCII 174.
  • '@' se utiliza como 'á', que en Amstrad sería el 224.
  • '#' es la 'é', 225 en Amstrad
  • etc...

Lo anterior se traduce en que al principio del fichero vamos a incluir un bloque de SUBCHAR de esta guisa:

  • SUBCHAR "]" "{174}"; // ¿
  • SUBCHAR "@" "{224}"; // á
  • SUBCHAR "#" "{225}"; // é
  • SUBCHAR "$" "{226}"; // í
  • SUBCHAR "%" "{227}"; // ó
  • SUBCHAR "&" "{228}"; // ú
  • SUBCHAR "[" "{175}"; // ¡
  • SUBCHAR "|" "{249}"; // ñ
  • SUBCHAR "\\" "{217}"; // Ñ
  • SUBCHAR "{144}" "{244}"; // ü

Pues ya podemos hacer una primera tentativa de compilación, a ver que sale:

inpaws cm medland1.paw -o medland1.SCE, a lo que nos responde con:

":las versiones de PAW para disco requieren un mínimo de 61 mensajes del sistema". Veamos como solucionar este escollo.

3) Adaptar los mensajes del sistema

El PAW para Spectrum tiene definidos 55 (del 0 al 54) mensajes del sistema para uso del parser. Si intentamos compilar una aventura para el Spectrum con menos de ese número, el compilador se negará en redondo. El PAW-CPM amplía ese número a 61, ya que incluye una serie de mensajes relativos al manejo del disco en los procesos de carga, grabación y recuperación de una partida. El resto de mensajes no reservados por el sistema se pueden definir como mensajes de usuario (tanto en Spectrum como en CPM).

Volviendo a Medialand, debemos definir esos 6 mensajes extra, o de lo contrario PAW/CPM se negaría a compilar nuestro fichero resultante. Los mensajes necesarios (que incluimos en nuestro fuente, detrás del 53) serán:

  • 54: "Archivo no encontrado."; // Borramos anterior 54
  • 55: "Archivo corrupto.";
  • 56: "Error E/S! Archivo no grabado!";
  • 57: "Directorio lleno.";
  • 58: "Disco lleno.";
  • 59: "Error en el nombre del archivo.";
  • 60: "Escriba el nombre del archivo. ";

También observad que el 54 ha cambiado de texto, ya no es el que pregunta por el nombre del fichero, en Amstrad es para indicar que no se encuentra el archivo.

En esta aventura hemos tenido suerte, ya que el autor no ha utilizado esos 6 mensajes para otros asuntos. Si esto hubiera pasado, nos hubiera obligado a trabajar un poco más.

Lo que haríamos sería sustituir los nombres de los mensajes del 55 al 60 originales por Sis_55 al Sis_60, y definir los 55 al 60 "reales" como he indicado. Quedaría algo como lo siguiente:

  • 54: "Archivo no encontrado.";
  • Sis_55: "Mensaje 55 del autor";
  • Sis_56: "Mensaje 56 del autor";
  • Sis_57: "Mensaje 57 del autor";
  • Sis_58: "Mensaje 58 del autor";
  • Sis_59: "Mensaje 59 del autor";
  • Sis_60: "Mensaje 60 del autor ";
  • 55: "Archivo corrupto.";
  • 56: "Error E/S! Archivo no grabado!";
  • 57: "Directorio lleno.";
  • 58: "Disco lleno.";
  • 59: "Error en el nombre del archivo.";
  • 60: "Escriba el nombre del archivo. ";

Acto seguido es necesario buscar en las tablas de respuestas y procesos, todos los condactos SYSMESS 55 a SYSMESS 60 y sustituirlos por los mensajes con los nuevos nombres SYSMESS Sis_55...SYSMESS Sis_60. Esto es un proceso manual, pero como lo más probable es que se utilicen una vez o dos cada uno, no debería llevar mucho tiempo. Ahora sí que vamos a poder compilar y ejecutar una primera prueba:

inpaws cm medland1.paw -o medland1.SCE

Nos genera el fichero SCE sin problemas, pero antes de probarla, vamos a realizar una última comprobación.

4) Adaptar tablas de procesos

La búsqueda de entradas dentro de las tablas de procesos de PAW de Spectrum difiere sensiblemente de la que utiliza la versión CPM y PC. En una tabla de procesos de Spectrum, el verbo y nombre asociado a cada entrada no se utilizan para buscar la entrada adecuada. Esto quiere decir que si hemos tecleado en la aventura "COGE PLATANO", y llegamos a una entrada de procesos con el encabezado "_ PERA: ...", la va a procesar igual. Al PAW de Spectrum no le importa lo que haya en el verbo y el nombre de las entradas de los procesos (en las respuestas sí). La excepción sería en las entradas que siguen a un condacto PARSE, que sí se van a intentar encajar, pero con lo que el jugador haya tecleado entre comillas. En el PAW de CPC y PC todas las entradas de procesos son comprobadas antes de procesarse, independientemente de que haya o no un condacto PARSE anterior. Tradicionalmente, el verbo y nombre en las entradas de proceso no asociadas a un condacto PARSE en Spectrum se utilizaban como forma de "comentar" o para luego poder buscarlas en el editor, pero no como verbos-nombre que el parser deba encajar con lo que ha tecleado el usuario.

Esto nos lleva a que va a ser necesario revisar todos los procesos, y convertir esas entradas/comentario en la pareja _ _ (verbo y nombre nulo). Cuidado con no hacerlo en aquellas entradas posteriores a un PARSE.

En la aventura que nos ocupa no lo voy a hacer. Aunque existen entradas de procesos con verbo y nombre, me da la impresión (y digo impresión por que no he hecho un análisis en profundidad) que, o bien se trata de entradas posteriores a un PARSE, o bien por la forma de llegar el parser a esas entradas, nos va a coincidir el nombre que ha tecleado el jugador con lo que tiene definido la entrada. En caso de duda, no obstante,siempre será mejor convertirlas a _ _.

Ahora sí compilamos (si no lo hemos hecho), y con el fichero .SCE en ristre nos trasladamos al mundo CPC.

5) Generación de la aventura en CPC

He utilizado el emulador de Amstrad CPC WinAPE, por que me va a permitir meterle nuestro fichero .SCE dentro del disco de PAW sin necesidad de utilizar ninguna otra herramienta.

Abrimos el .DSK con el PAW, y le metemos nuestro medland.SCE. También he borrado algunos ficheros innecesarios para tener más espacio. Nuestro disco quedará así:

Volvemos a WinApe, cargamos el CPM, insertamos el disco de PAW con nuestra aventura y tecleamos:

pawcomp medland1

Nos va a soltar un warning por cada carácter acentuado, eñe o interrogación que se encuentre en el fichero. Pasamos de los warning y esperamos que termine. Probamos la aventura con

pawint medland1

Y obtenemos esto:

¡Funciona! Además muestra correctamente los acentos y otros caracteres del español. Pero aparecen ciertos símbolos extraños rodeando los mensajes. Esto es por que el autor ha enriquecido la apariencia, tanto de la pantalla de presentación, como del prompt con caracteres definidos por el usuario UDG, que no son trasladables a CPC. Aquí entra ya una labor de retoque y revisión para la que no hay procesos automatizados. He eliminado el borde en la presentación y modificado el prompt, y ya me queda algo más normalito:

6) Finalización y últimos retoques:

Ya tenemos el texto de la aventura funcionando en nuestro emulador de CPC, y si no hemos cometido ningún error se comportará exactamente como la original. Ahora es el momento de añadirle gráficos o cualquier otra mejora, ya dentro del mundo CPC y con las herramientas que PAW-CPM provee.

Si te has fijado no he hablado en ningún momento de códigos de color o Condactos para modificar el color o el juego de caracteres: no es necesario, ya que Inpaws se encarga de ignorarlos al generar una aventura en formato .SCE. Todos los códigos ESCC así como los condactos que no existen en la versión CPC serán ignorados como si no existieran (eso también tendrás que tenerlo en cuenta en tu conversión). De igual forma ignorará cualquier bloque GRAPHICS o CHARACTERS que haya en el código fuente original.

Puedes descargarte el fuente Inpaws de la versión convertida aquí. Hasta otra