miércoles, septiembre 30, 2015

Crear imágenes de disco de Amstrad

Más allá del hacking value o de cierta nostalgia de otros tiempos no tiene mucho sentido andar enredando con emuladores de máquinas con micros de 8 bits, que funcionaban a 4 Mhz y tenían 64 o 128 Kb de memoría de RAM, con suerte un disco de 3" o 3.5" y lo más normal un magnetófono de cintas de cassete como medio de almacenamiento. El Amstrad CPC 6128 fue el primer ordenador que tuve. Me lo compraron en las Navidades de 7º de EGB. Junto al mismo, mi padre - sin saber muy bien lo que hacía, sospecho - compró el libro de Código máquina para principiantes con Amstrad de Steve Kramer. Con los años fui aprendiendo, programé algunas cosillas con BASIC y ASM, desemsabléa las ROMs, aprendí algo (poco) sobre el hardware, enredé con CP/M y me divertí bastante con multitud de juegos de la plataforma - sacando también de quicio a mis padres por el camino -. Todo un cóctel que me llevaría a mi actual mundo profesional.

A mis más de cuarenta años, me gusta de vez en cuando, en vez de un partidad a la PS3 , un X-Plane o algún juego de rol online, lanzar el Arnold en el Mac y disfrutar de alguna partitida a algún viejo clásico. En ello estaba, cuando hace unos días pensé, ¿me acordaré de algo de ensamblador de Z80?. ¿De como se programaba la máquina?. Me animé a buscar información y lo primero que me planteé es, ¿se puede trabajar en "cruzado" con las herramientas corriendo nativas en el Mac y luego subiendo al CPC?. Pues la respuesta es sí, por un lado pasmo un ensamblador de Z80 capaz de generar ficheros ejecutables para múltiples plataformas y por otro libdsk y cpmtools que me iban a permitir generar las imágenes que necesito. Esta entrada la voy a centrar, precisamente, en la generación de imágenes. Para ellos necesitamos sólo libdsk y cpmtools. Se compila la primera, se compila la segunda y ya tenemos una serie de programas que nos permiten crear imágenes y acceder a la mismas.

El primer paso es compilar libdsk:

$ wget http://www.seasip.info/Unix/LibDsk/libdsk-1.2.2.tar.gz
$ tar zxvf libdsk-1.2.2.tar.gz
$ cd libdsk-1.2.2
$ ./configure --prefix=/usr/local
$ make
$ su
# make install
# exit

El siguiente paso es compilar cpmtools, pero le vamos a indicar que utilice las librería que hemos compilado en el paso anterior

$ wget http://www.moria.de/~michael/cpmtools/files/cpmtools-2.20.tar.gz
$ tar zxvf cpmtools-2.20.tar.gz
$ cd cpmtools-2.20
$ ./configure --prefix=/usr/local --with-libdsk --with-defformat=cpcdata
$ make
$ su
# make install
# exit

El Amstrad CPC 6128 podía manejar 3 formatos de datos: De sisytema CP/M 3.0, de sistemas CP/M 2.2 y de datos. La diferencia estaba en la reserva de dos pistas en cada cara del disco para el cargador de arranque del sistema y otras propiedades (CP/M 3.0) o para el propio sistema operativo (CP/M 2.2). Además, en el caso del Amstrad, los ficheros podían residir en diferentes areas de usuario, indentificadas por un entero entre 0 y 15 - esto es herencia directa de CP/M -. Decir que por defecto, el CPC sólo es capaz de usar una cara de un disco, aunque el controlador de disco que utilizaba , el NEC 765, el mismo que el de un PC, podía manejar unidades de dos caras simultáneamente sin problemas.

Para crear una imagen de disco de CPC lo único que tenemos es que usar el programa dskform de las libdsk para que nos cree el mismo. Si quiero usar el formato de datos, la orden para generarlo sería la siguiente.

dskform -format cpcdata imagen.dsk

cpmtools instala varias utilidades para manejar ficheros dentro de las imágenes que creemos. En nuestro caso nos interesa las siguientes.

cpmls
Muestra los ficheros que hay en la imagen.
cpmrm
Permite borrar ficheros de la imagen.
cpmcp
Permite copiar ficheros a la imagen.

Por defecto todas estas utilidades están compiladas para usar el formato de datos del Amstrad CPC. Si fuera necesario usar otro, todas admiten el parámetro -f para indicar el formato que se desea usar (usando --help a cualquiera de ellas muestra la lista de formatos soportados).

Copiar un fichero y posteriormente borrarlo se haría con las siguientes órdenes.

$ cpmcp imagen.dsk text.bin 0:text.bin
$ cpmrm imagen.dsk 0:text.bin

Es necesario especificar el área de usuario a la hora de copiar com cpmcp (la que usa el sistema por defecto siempre es la 0). cpmcp no sobreescribe archivos, es necesario borrarlo antes con comrm

No hay comentarios: