EL SITIO DEL CDT - Como transformar un juego de disco a CDT.

En su momento remodelaré esta sección. Ahora copio una explicación que hice para una persona con un juego concreto.
Se que hay que cumpletarlo enormemente y algunas explicaciones ya han sido explicadas en los apartados anteriores, pero de momento, mejor esto que nada, y como ya lo tenía hecho...

Para convertir un juego a CDT hay que realizar varios pasos.
1- Determinar que estado requiere el juego para funcionar
   Dirección de memoria de carga, longitud, estado inicial de interrupciones,
   registros, etc.
   2- Extracción de los datos así como la pantalla de carga y aquello que haga falta
   3- Creación de un cargador adecuado
   4- Montaje del cdt y ajustes de velocidad.

   Veamos el caso concreto de la transformación de la versión de disco del juego 1942.

   FASE 1
   El juego se inicia con Run"1942
   Con un CAT podemos observar que el cargador es un .BAS
   Cargamos el programa y realizamos un Listado del programa
   Tan solo muestra...
   1 '? BUSCA VD. ALGO
   Sin embargo si lo ejecutamos (RUN) el programa comienza.
   Eso es que este programa Basic ha sido manipulado para esconder el listado.

   Como puedes leer en
   http://andercheran.aiind.upv.es/~amstrad/docs/bastech.html

   El programa Basic, tal y como es almacenado contiene un conjunto de líneas de una
   determinada longitud y número.
   Si se modifica el código aumentando la longitud de la línea, el parser de ejecución sigue
   funcionando pero el listado queda truncado hasta el final de la primera linea.
   Usando el WinApe resulta fácil revertir el proceso desde el debugger (pulsando F7).
   Por lo visto, el byte alto de cada línea es alterado. Tan solo hay que ponerlos a cero y
   a su vez, dar números de línea a cada una de ellas

   Este es el resultado...
   1 '? BUSCA VD. ALGO
   2 '
   3 MEMORY 19999:BORDER 2:MODE 0
   4 FOR a=0 TO 15:READ b:INK a,b:NEXT
   5 LOAD"A",&C000:RUN"B
   6 DATA 0,13,26,12,24,9,18,10,20,1,2,11,4,15,3,6

   Ya tenemos el cargador.
   En realidad, este cargador es el más simple posible. Tan solo pone unos colores,
   el modo 16 colores del CPC, carga el archivo A como pantalla introductoria y arranca
   B directamente.
   Por tanto tendremos que consultar a ver que características tiene dicho archivo.
   Usando las Disk Utilities 1.3
   http://andercheran.aiind.upv.es/ftp/pub/cpc/ftp.lip6.fr/disk/discut13.zip
   se puede obtener fácilmente esa información

   Posición en memoria inicial &258
   Longitud &A410
   Dirección de ejecución al comienzo &89B3

   FASE 2
   Para extraer la información se pueden seguir muy diversos procedimientos.
   Afortunadamente el WinApe lo pone muy fácil

   Usando la versión "desprotegida" del cargador de disco y manípulándolo, resulta fácil capturar
   los datos del dibujo de la pantalla de carga.
   Por ejemplo...
   Cambiar línea 5 por
   5 LOAD"A",&C000:WHILE INKEY$="":WEND
   Y ejecutamos
   Después de cargar la pantalla de inicio, se para.
   Es el momento de pasar a modo Debug
   En la zona de datos se selecciona modo "Any" y se desactivan las ROMS para ver solo la RAM
   Se va a la posición C000 y se selecciona hasta FFFF y se graba en un archivo.
   Ya tenemos el contenido de la pantalla de carga
   Ahora nos vamos a la posición de ejecución (&89B3) y ponemos un punto de ruptura (Breakpoint)
   Salimos del modo debug (se cierra esa ventana) y ejecutamos el juego
   Run"b"
   Saltará el debugger justo en dicha posición.
   Momento para ir a la pantalla de datos y seleccionar el área comprendida entre la posición &0258 y
   &A667 inclusive (&258+$a410-1) y salvarla a disco.

   FASE 3
   Ahora que ya tenemos toda la información correctamente salvada es el momento de crear un cargador
   adecuado. Esto se puede (y debe) combinar con un  montaje parcial del CDT.
   Yo he elegido mi cargador favorito como Base :). Una versión ligeramente adaptada del cargador
   de Karnov.
   Este cargador lee bloques del mismo tipo que la rutina &BCA1 del firmware si bien es completamente
   independiente de este por lo que puede funcionar incluso con todo el firmware sobreescrito.
   Además, tiene barras de color :)
   Los bloques de este tipo, comienzan por un bloque de sincronización que determina la frecuencia
   para el BIT 1 (el 0 será justo el doble), y tras un Bit 0 viene un Byte que indica el tipo
   de bloque.
   Después de esto vienen los datos, más un CRC16 cada 256 bytes para asegurarse que los datos
   están íntegros.

   Existe un programa llamado 2cdt (http://andercheran.aiind.upv.es/~amstrad/download/2cdt.zip)
   para convertir archivos a formato CDT (les crea igual que si se hiciese desde un "SAVE" a cinta)
   Estos se segmentan en bloques de 2048 bytes como máximo cada uno los cuales tienen a su vez
   2 bloques del tipo anterior (los que se pueden hacer con &BCA1) de tipos &2C y &16 cada uno
   El primer bloque de 512 bytes contiene el nombre del fichero, número de bloque, posición de carga
   , si es el primer bloque y/o último, etc.etc. El segundo son los datos en si mismos.
   Modificando el código fuente (que pasaré a denominar 2cdthack) se puede modificar fácilmente
   el tamaño máximo de bloque para que en vez de 2048 sea 65536 (o sea que siempre generará un
   solo bloque). Esto nos permitirá crear con facilidad los bloques de tipo BCA1 de la 
   longitud máxima con facilidad.

   Convertimos los binarios extraidos de la memoria anterior a 2 CDTs que representan archivos
   con sus bloques de cabecera más los datos en un solo bloque (esos datos son lo que nos interesa)
   A partir del código cargador inicial, y con algunos conocimientos de ensamblador se realiza
   un cargador que sustituye al BASIC anterior. Pone modo 0, cambia las tintas, y carga los datos
   en las posiciones requeridas.
   Adjunto el cargador inicial + modificado. Este requeriría un estudio algo más detallado.
   Si el cargador solo lee los bloques de tipo 16 resulta fácil hacer las pruebas.
   Una vez que el cargador funciona, se salva a disco.

   FASE 4
   El cargador se extrae a un archivo usando el cpcxfs 
   http://andercheran.aiind.upv.es/~amstrad/download/cpcxfs.zip
   y se pasa a CDT usando el 2cdt (el original)
   Ahora ya tenemos el CDT, aunque segmentado en varios CDTs.
   Para unirlos y retocarlos, "taper"
   http://www.worldofspectrum.org/taper.html
   resulta un herramienta de gran ayuda. (se creó para las cintas de spectrum así que requiere
   renombrar los CDT a TZX)
   Añadimos un bloque de Hardware (Amstrad CPC 464), una pausa inicial (5  segundos), agregamos
   el cargador y los otros 2 bloques 16 (los 2C prescindimos de ellos). Modificamos las
   pausas al final de ellos y ajustamos la velocidad cambiando los T-States.

Enlaces:
Disk Utilities 1.3: ftp://andercheran.aiind.upv.es/pub/cpc/ftp.lip6.fr/disk/DISCUT13.ZIP (Mirror)
Para saber cierta información relativa a un archivo de un disco como su longitud, dirección de carga por defecto, punto de comienzo de la ejecución en caso de binario, etc. etc.

2CDT: http://andercheran.aiind.upv.es/~amstrad/download/2cdt.zip (Mirror)
Permite convertir un archivo en un CDT en formato estandar de grabación de archivos del Firmware del Amstrad.

CPCXFS: http://andercheran.aiind.upv.es/~amstrad/download/cpcxfs.zip (Mirror)
Esta utilidad permite desde tu Sistema Operativo trabajar con imágenes de disco (.DSK) para transferir archivos desde el SO a la imagen, de la imagen al SO, formatear la imagen a una capacidad concreta, etc. etc.

TAPER v2.07: ftp://ftp.worldofspectrum.org/pub/sinclair/tools/pc/taper207.zip (Mirror)
Este programa permite trabajar con cintas del Spectrum TZX. Las cintas del Amstrad (CDT) usan el mismo formato así que si renombras el archivo a .TZX puedes trabajar con él.

CDThack (solo fuente): 2cdthack.c
Versión modificada del fuente del 2cdt para que cree un solo bloque grande en vez de varios de 2048 bytes. Tan solo modifico una constante que guarda dicho valor.
Tendrás que compilarlo por tu cuenta.
Por petición incluyo también un binario . Requiere Windows pero es para consola.
2cdthack.exe

Cargador creado (fuente): 1942.asm
Este es el cargador del karnov modificado, con algún comentario, para cargar el 1942 creado.
Puedes compilarlo usando el WinAPE y guardarlo directamente en la RAM del CPC emulado.

Versión disco del juego: 1942.zip
Esta es la versión de disco de la que se partió.

Versión CDT resultante: 1942.cdt
El CDT obtenido finalmente. Que lo disfrutes :-)