Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde...

16
Introducción En este artículo pretendo mostrar los pasos que se han llevado a cabo en la reparación y adecuación del Spectrum +3 de jojo73 así como las “peripecias” que han acaecido para intentar (sin éxito hasta el momento) copiar un juego en concreto a disquete. ©2011 Miguel Angel Rodríguez Jódar (McLeod / IdeaFix). Reparación inicial Recepción del paquete de Correos. En su interior… … un flamante Spectrum +3… … con “sorpresa”: faltaba el conector de RGB, y el de CINTA/SONIDO se había sustituido por otro, pero de forma un tanto chapucera. Por dentro estaba claro qué había pasado: se había quita- do el conector DIN y se había intentado poner un conec- tor DB-15 para VGA, sin resultado positivo como era de esperar (se necesita un monitor multisync que además acepte sincronismo compuesto para que funcione direc- tamente). Por fortuna, el desoldado del conector se había hecho limpiamente y no había pistas saltadas. Así que lo primero es poder ver la imagen que da este ordenador. No uso la salida de RF de los equipos si pue- do evitarlo. En parte es porque sólo tengo un aparato con sintonizador analógico y no lo tengo siempre a mano, así que tengo que arreglármelas para obtener una señal de video compuesto que aunque no sea buena, al menos me permita ver qué estoy haciendo. Para los Spectrum +2A/+2B/+3, el método tradicional de coger la señal de video desde la entrada del modulador no funciona. En el mejor de los casos se verá una señal muy distorsionada y oscura. En cambio, cogiendo la señal del punto indicado en la figura, la imagen es limpia y estable, aunque un poco oscura. Mientras estuve trabajando de esta forma, tuve que subir el nivel de brillo. La resistencia de la que se toma la señal es R53. La masa puede ser por ejemplo, la carcasa del modulador. De esta manera, pude ver qué pasaba al arrancar: imagen estable, calentamiento normal de la ULA, nulo intento de arranque, y poco más.

Transcript of Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde...

Page 1: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Introducción En este artículo pretendo mostrar los pasos que se han llevado a cabo en la reparación y adecuación del Spectrum +3 de jojo73 así como las “peripecias” que han acaecido para intentar (sin éxito hasta el momento) copiar un juego en concreto a disquete. ©2011 Miguel Angel Rodríguez Jódar (McLeod / IdeaFix).

Reparación inicial Recepción del paquete de Correos. En su interior…

… un flamante Spectrum +3…

… con “sorpresa”: faltaba el conector de RGB, y el de CINTA/SONIDO se había sustituido por otro, pero de forma un tanto chapucera.

Por dentro estaba claro qué había pasado: se había quita-do el conector DIN y se había intentado poner un conec-tor DB-15 para VGA, sin resultado positivo como era de esperar (se necesita un monitor multisync que además acepte sincronismo compuesto para que funcione direc-tamente). Por fortuna, el desoldado del conector se había hecho limpiamente y no había pistas saltadas.

Así que lo primero es poder ver la imagen que da este ordenador. No uso la salida de RF de los equipos si pue-do evitarlo. En parte es porque sólo tengo un aparato con sintonizador analógico y no lo tengo siempre a mano, así que tengo que arreglármelas para obtener una señal de video compuesto que aunque no sea buena, al menos me permita ver qué estoy haciendo.

Para los Spectrum +2A/+2B/+3, el método tradicional de coger la señal de video desde la entrada del modulador no funciona. En el mejor de los casos se verá una señal muy distorsionada y oscura.

En cambio, cogiendo la señal del punto indicado en la figura, la imagen es limpia y estable, aunque un poco oscura. Mientras estuve trabajando de esta forma, tuve que subir el nivel de brillo. La resistencia de la que se toma la señal es R53. La masa puede ser por ejemplo, la carcasa del modulador.

De esta manera, pude ver qué pasaba al arrancar: imagen estable, calentamiento normal de la ULA, nulo intento de arranque, y poco más.

Page 2: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Convencido de que sería un fallo de memoria, fui a por la EPROM que uso para testar equipos.

Esta EPROM contiene un programa que escribí para facilitar el diagnóstico de equipos. El programa no usa en la mayoría de los casos la memoria para guardar da-tos, sino que usa solamente los registros. De esta forma el programa puede usarse incluso en equipos sin memo-ria RAM.

Funciona en todos los modelos de Spectrum. Para el Spectrum 48K/Plus tengo grabado el código de la misma en un multicartucho para el Interface 2. De esta forma también puede ser usado en el resto de modelos de Spec-trum hasta el +2 gris. También puede usarse en el +2A/+2B/+3 si antes se retiran las dos ROM’s de sus zócalos.

Además, y dado que los modelos de 128K usan todos chips ROM’s cuyo patillaje coincide con las EPROM’s de 32K, y que dichas ROM’s van en zócalo, en estos modelos tengo la opción de usar directamente una EPROM. Esta EPROM de 32K tiene un modo de opera-ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada para que no intente usar la memoria superior a los 16K de RAM. Esto es para poder arrancar el equipo aunque tenga fallos intermitentes de RAM no contenida.

Esta EPROM se enchufa en uno de los zócalos destina-dos a las ROM’s, concretamente, el izquierdo. Para los modelos anteriores de 128K, esta EPROM se pondría lógicamente en lugar de la única ROM que tiene el equi-po.

Al arrancar de nuevo con la ROM de testeo, obtuve lo siguiente:

Exactamente el mismo patrón, es decir, el programa de pruebas no se estaba ejecutando. El principal sospechoso en este caso es el Z80A, aunque no es el único. En reali-dad, cualquier dispositivo que esté conectado al bus de datos del procesador y funcione mal, podría interferir en los datos que aparecen en dicho bus e impedir que la CPU lea el programa de testeo de la ROM.

Page 3: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

En el Spectrum que nos ocupa, los dispositivos que po-drían interferir son, además de la propia ROM, la memo-ria no contenida (IC5 e IC6), el sintetizador de sonidos AY-8912, la ULA, y para los +3, la controladora de disco. Si cualquiera de éstos falla, y el fallo consiste en que su bus de datos no se pone en alta impedancia cuan-do no están seleccionados, volcarán datos aleatorios al bus de datos todo el rato, impidiendo que el resto de dispositivos pueda comunicarse con el procesador.

Se cambió el Z80A, y al arrancar con el nuevo puesto sí que funcionó el programa de testeo.

El programa muestra el patrón que se ve en la foto, y alterna el color del borde de negro a blanco a la vez que hace sonar un chasquido por el altavoz. El patrón de memoria me permite averiguar rápidamente qué chip de memoria está estropeado. Así, viendo el comportamiento de este programa se puede averiguar:

- Si el procesador funciona: en ese caso, debe cam-biar el color del borde alternativamente entre negro y blanco. Aunque no haya nada de memoria, si en el equipo hay un Z80A y una ULA lo suficientemente “vivos” como para ejecutar programas y producir una imagen, se verá esta alternancia.

- Si el altavoz funciona: si lo hace, también lo hará el puerto 254 de la ULA, y los componentes asociados al altavoz, además del propio altavoz.

- Si la memoria baja funciona: si en alguno de los dos primeros patrones falta una línea vertical, o aparece una línea vertical donde no corresponde, el bit al que corresponde esa línea que sobra o falta está fa-llando, y a partir del bit, recurriendo a los esquemá-ticos, se puede saber qué chip de memoria falla. Una versión de este mismo test prueba la memoria no contenida (la memoria alta).

El programa puede funcionar incluso sin teclado, ya que a los distintos tests se accede cortocircuitando momentá-neamente cada uno de los 5 pines del conector pequeño del teclado, a masa. Alternativamente, en el +2A/+3 se puede usar las teclas del 1 al 5 para elegir los tests, que son:

- Tras un reset: testeo de la memoria de pantalla.

- Pulsando 1, o cortocircuitando el contacto de más a la izquierda con masa: testeo de la memoria no con-tenida.

- Pulsando 2, o cortocircuitando el contacto siguiente: testeo de la memoria contenida (tanto la pantalla como fuera de ella)

- Pulsando 3, o cortocircuitando el contacto siguiente: grabación en cinta del contenido de la memoria de pantalla.

- Pulsando 4, o cortocircuitando el contacto siguiente: carga de un bloque de bytes desde cinta y posterior ejecución a partir de la dirección de carga. De esta forma, desde esta ROM se pueden cargar rutinas que el usuario haya escrito para realizar cualquier otro tipo de test. Para esta opción y la anterior es necesario que la memoria no contenida funcione.

- Pulsando 5, o cortocircuitando el contacto siguiente: realiza un test más exhaustivo de la memoria no contenida, para buscar fallos intermitentes. Muestra el resultado (los bits que fallan) mediante líneas en el borde.

- Pulsando simultánetamente 1 y 5, o cortocircuitando el primer y último contacto a masa: conmuta a la ROM de arranque básica. Esta ROM es una ROM idéntica a la del Spectrum 48K, pero las rutinas de testeo se han modificado para que en ningún caso se testee más allá de los primeros 16K. Si el equipo tiene correcta la RAM contenida (RAM baja), debe ser posible arrancar esta segunda ROM, desde la cuál se tiene todo el entorno BASIC disponible. Es-ta opción no existe en la versión de la ROM para Spectrum 48K, sólo en las versiones para 128K.

Dado que para este caso, el test inicial tras el reset y el test 2 funcionaron, se procedió a conmutar a la ROM BASIC de 16K, y se ejecutó este sencillo programa para comprobar algunas posiciones de la RAM no contenida.

Con este resultado, que se repitió para el resto de pági-nas (testando a partir de las direcciones 49152 en adelan-te): la memoria no contenida también funciona. Otra prueba que se puede hacer es forzar a que se usen los 48K de RAM aunque la ROM modificada en principio no lo admita. Para ello basta hacer POKE 23733,255: CLEAR 65367: NEW y el reinicio será el mismo que haría la ROM normal. De esta forma se pueden cargar juegos de 48K e incluso de 128K desde cinta y hacer más pruebas.

Page 4: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Llegados a este punto, el equipo debería funcionar. Se volvieron a colocar las ROM’s originales en sus respec-tivos zócalos y se procedió al arranque, con el resultado esperado:

El dueño me pidió saber qué contenía la ROM que lleva el equipo, puesto que en realidad lo que lleva son dos EPROM’s. La respuesta, ahí está: son las ROM’s del proyecto +3E, versión 1.11, y seguramente, la versión para DivIDE.

A todo esto: el equipo funcionaba, pero aún no había podido probar que el sonido también funciona. Para probarlo hice un programa muy sencillo, que toca un acorde de DO mayor una y otra vez.

La salida de video compuesto no da sonido, y el conec-tor CINTA/SONIDO del cuál debería poder obtener dicha señal, estaba mudo, así que tomé el sonido direc-tamente de la salida del AY-8912.

Hay sonido. La última cosa que quedaba por probar era la carga de disco. La unidad de disco tenía la correa de goma en condiciones, así que todo consistía en cargar un juego y ver si se ejecuta bien. Probé con el recopilatorio de CEZ para disco +3, que cargo sin problemas.

Y entre los juegos a probar, usé el Moggy. Suelo probar con éste porque está grabado en las pistas más interiores, que son las más sensibles a errores de calibración de la disquetera. Si este juego carga bien, entonces es que el cabezal llega a su sitio correcto en las pistas interiores, y si lo hace, lo hará con mayor precisión en las pistas exte-riores.

Page 5: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Actualización a +3E v1.38 El primer paso es borrar las EPROM’s que tenía el equi-po. Éstas son de borrado por luz ultravioleta, así que retiramos la cinta adhesiva que tapa la ventana de borra-do, y metemos ambas EPROM’s en la cajita del borrador UV.

El borrador tiene un temporizador dividido en tramos de 5 minutos. Con el selector en la posición indicada, el tiempo de borrado será de unos 20-25 minutos.

La luz UV empleada es peligrosa para la retina humana, así que todo el aparato es opaco, a excepción de una ventanita por la que se puede apreciar el resplandor de la lámpara UV y así cercionarse de que el equipo está en-cendido.

A través del objetivo de la cámara, podemos acercanos y ver cómo las dos EPROM’s están “tomando el sol”. Es mucho menos peligroso que acercar el ojo a la ventanita, claro está…

Mientras el borrador está en lo suyo, aprovecharemos para restituir los conectores desaparecidos. Son estos dos: el de CINTA/SONIDO, que es un conector 3,5’’ estéreo para PCB, sin circuito de desconexión automáti-ca, y el de RGB, que es un conector DIN de 8 pines, hembra, para PCB.

Se quita el otro conector estéreo que estaba puesto, y se limpia con malla de desoldar los pads de ambos conecto-

Page 6: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

res. Tras esto sólo hay que volver a soldar cada conector en su sitio.

Las EPROM’s ya han terminado su baño de sol. Para cercionarnos, leemos el contenido de una de ellas. Una EPROM “virgen” da como valor siempre FFh (255)

Ya estamos listos para grabar un nuevo firmware en estas dos EPROM’s. Las ROM’s del proyecto +3E se suministran todas en un único archivo que se actualiza en cada nueva revisión del proyecto. En la página del mismo hay información sobre la nomenclatura utilizada para elegir las que necesitamos. En nuestro caso, para un Spectrum con teclado español y que usará como disposi-tivo de almacenamiento masivo un DivIDE, los ficheros a grabar son dives3eA.rom y dives3eB.rom .

Tras esto comienza el proceso de grabación, que en mi grabador se divide en las siguientes etapas: comproba-ción de que la EPROM está borrada, grabación propia-mente dicha (programación), y verificación de lectura usando las dos tensiones límites de alimentación: 4,75V y 5,25V.

El grabador de EPROM’s que uso. No es nada moderno, ya que usa el puerto paralelo. En el mercado hay mode-los más modernos y portátiles que usan el puerto USB.

Y el resultado, tras volver a tapar las ventanas de borra-do de las EPROM’s y volverlas a poner en sus corres-pondientes zócalos, es éste. Aquí también ya se ha usado la salida RGB en lugar de la conexión temporal para el video compuesto. Como se aprecia, el número de ver-sión ha cambiado a la última hasta ahora, la 1.38 .

Page 7: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Adición de salida de video compuesto El dueño de este equipo pidió tener una salida de video compuesto, sin renunciar a la salida RF. Para ello, se necesitan los siguientes componentes: un transistor BC337, una resistencia de entre 68 y 100 ohmios, y un condensador electrolítico de al menos 100uF y 16V.

Estos son los dos puntos a soldar en la placa del +3. En la placa “recortada” del +2B los puntos están casi en el mismo sitio, quizás un poco más separados uno del otro. Cada punto se ha etiquetado con el nombre del pin del transistor que irá en el mismo. Conviene estañar antes cada uno de los puntos para facilitar la soldadura del transistor.

El transistor se prepara de la siguiente forma: se separa el pin EMISOR de los otros dos. A los pines BASE y COLECTOR se les dobla el último milímetro de alam-bre para hacerles una especie de “piececitos”, para que suelden mejor en los puntos marcados en la figura ante-rior. El transistor está orientado con la serigrafía al fren-te.

Los pines COLECTOR y BASE se sueldan en los puntos indicados. El pin EMISOR se deja “al aire”.

Ahora le toca el turno a la resistencia. Uno de los bornes de la misma está conectado a masa, y el mejor sitio para tomarla es la carcasa del modulador. Con lija de metal o la punta de un destornillador plano, arañamos una pe-queña zona del modulador, hasta que pierda el brillo y se quede mate. Entonces aplicamos estaño hasta formar un pequeño “pegote” que se quede bien soldado a la carca-sa. Es ahora cuando podemos soldar un extremo de la resistencia a ese “pegote”, y soldar el otro extremo al pin EMISOR del transistor.

Page 8: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Por último, el condensador. El extremo positivo del mismo (el que no está marcado en el costado con el sím-bolo “-“) se soldará al mismo punto de unión del EMISOR con la resistencia. El otro extremo (el negati-vo) es nuestra salida de video.

Dado que hay partes metálicas de este añadido que que-dan al aire, es buena idea, una vez esté terminado, forrar con cinta aislante las partes metálicas que queden al descubierto. Concretamente, todo lo que está conectado al pin EMISOR del transistor. En mi caso he usado ma-carrón termorretractil que he puesto antes de soldar la resistencia, pero la cinta aislante también vale.

Si se quiere reutilizar la salida de RF como salida de video, basta llevar con un cable la señal de video desde el extremo positivo del condensador, hasta la toma cen-tral RCA que hay dentro del modulador. Previamente se habrá cortado o desoldado el componente que va conec-tado a dicha toma central tal como indica la siguiente figura.

En nuestro caso se pide una salida separada de video compuesto, sin “mutilar” la existente de RF, así que hay

que instalar un nuevo conector RCA hembra en una localización en la que no “choque” con otros componen-tes al juntar las dos mitades de la carcasa del Spectrum. En el +3 es la mitad superior de la carcasa en donde se puede instalar este conector, mientras que en el +2A/B es en la mitad inferior. Así que elegimos la localización y taladramos el plástico con el calibre requerido para el nuevo conector.

Una vez instalado, queda así:

Con un cable de par trenzado extraído de un latiguillo ethernet, conectamos la toma central del conector RCA con el extremo libre del condensador, y el chasis del conector con el punto del modulador donde está soldada la resistencia. Dado que la distancia es corta y que la impedancia de la señal es baja, no es necesario usar ca-ble apantallado para esta conexión.

Page 9: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Con esto quedaría el equipo completamente restituído a todas sus funciones: conector CINTA/SONIDO, RGB, y video compuesto.

La salida de video compuesto ahora, y a diferencia de cómo estaba originalmente en la toma provisional que se hizo al principio durante la reparación, es mucho más brillante. Tanto que ahora en este caso es conveniente bajar un poco el nivel de brillo para que los matices de brillo/no brillo de los colores no se “maten”. No es la calidad que da el RGB, pero en muchas ocasiones en las que no es posible usar el RGB (por ejemplo, para usar una tarjeta de captura de video para PC, o una VGA-Box) la calidad de la señal de video compuesto es más que suficiente.

Imagen con salida de video compuesto. Imagen con salida RGB

Page 10: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Uso del DivIDE y el +3E para pasar información desde y hacia un disquete

Esta última sección del artículo muestra las diferentes técnicas que puse en marcha para pasar a disco algunas aplicaciones y juegos, en la mayoría de los casos con éxito y en uno concreto, no.

Para ello se ha usado una unidad DivIDE v57c, para la cuál está diseñada la ROM +3E de este equipo. En reali-dad funcionará tanto con el DivIDE “clásico” como con los nuevos DivIDE+ o DiwIDE.

En cualquiera de los casos, es necesario desactivar el arranque del firmware del DivIDE, ya que lo usaremos desde el +3E. Para ello basta con retirar el puente E de la placa. El DivIDE usado tiene un adaptador IDE-CF con una pequeña Compact Flash previamente particionada y formateada según el manual de “setup” del proyecto +3E. Al iniciar el sistema se oberva este cambio en la pantalla de arranque:

El sistema ha detectado la unidad DivIDE, ha leído la tabla de particiones de la Compact Flash, donde también está la configuración inicial, y ha añadido dos nuevas letras de unidad, C y D, a la lista de unidades lógicas del sistema. También ha determinado que es la C la unidad por defecto. Si ahora pulsara la opción “Cargador” se intentaría leer y ejecutar el programa “DISK” ubicado en la unidad C.

Estas son las asignaciones de letras de unidad a particio-nes de la Compact Flash. Esta CF tiene más particiones, pero este listado sólo muestra las asignaciones actuales. Se muestra con el comando: CAT ASN

Copiar programas entre cualquiera de las particiones asignadas a letras de unidad en la Compact Flash, y un disquete, es tan sencillo como usar la orden COPY. Eso sí, teniendo en cuenta que una partición en la CF puede ser de hasta 16MB, mientras que el espacio en el disco es de unos 173KB.

En la misma página del proyecto +3E hay enlaces a si-tios con versiones de programas populares adaptados para ser usados en el +3E. En otros casos he sido yo mismo quien ha adaptado el software para que se pueda cargar desde disquete o unidad compatible +3E. Como ejemplo, este es el juego “All Present And Correct” en una versión que modifiqué para que cargara de disco.

De esta misma forma he podido copiar el Art Studio y algunos juegos. Sin embargo, uno de ellos planteó pro-blemas desde el principio: es el juego “Where Time Stood Still”.

Para intentar copiarlo y ejecutarlo con éxito se intenta-ron las siguientes estrategias:

Creación de una versión cargable desde disco a partir de la versión cargable desde cinta El disco del juego está preservado en WOS, con sus protecciones originales. Esto significa que en principio, no es factible leer ficheros del disco y copiarlos a la CF. En el mismo repositorio se encuentra una versión en cinta, y en formato TAP. Esto significa que dicha ver-sión no usa ningún tipo de carga “custom” y presumi-blemente será más fácil de manipular.

Page 11: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Este es el contenido de la cinta visto con ZX BlockEdi-tor:

Su cargador BASIC es bastante sencillo. Carga 5 blo-ques desde cinta, y los va alojando en las páginas 1, 3, 4, 6 y 7. Por último carga un bloque más largo en memoria principal (páginas 2, 5 y 0). Por último, salta al juego.

Para pasar el contenido de esta cinta a CF, se ha usado la utilidad “3e” a través de su front-end gráfico, “Strow-Saw”, que puede descargarse desde la página del proyec-to +3E. StrowSaw descarga a su vez la utilidad “3e” que es de línea de comandos. Aunque StrowSaw sólo funcio-na en Windows, “3e” es multiplataforma y funciona en Windows, Linux y OS X.

Desde StrowSaw podemos usar una tarjeta de memoria particionada para +3E en nuestro PC y manipular los ficheros de su interior. Esta es la ventana principal de la aplicación.

Si insertamos la CF en un lector de tarjetas convencional y damos la orden “Scan”, buscará todas las unidades de disco que contengan datos compatibles con el sistema de particiones de +3E.

Con la opción “Open physical device” se nos presentará un desplegable con todas las unidades que contienen particiones IDEDOS. También es posible abrir imágenes de disco en formato HDF. En este momento, “3e” no es compatible con dispositivos de almacenamiento masivo que usen “la mitad” de un sector para almacenar datos.

StrowSaw organiza la información del disco abierto mostrando cada partición como si fuera un directorio. Haciendo clic en el nombre de una partición a la iz-quierda, se ven los ficheros que contiene a su derecha.

Page 12: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

StrowSaw permite importar información desde imágenes de cinta TAP y disco DSK. Para el caso de los DSK soporta solamente la versión “Standard DSK”. Para aña-dir archivos se usa el menú “Device”. Es una lástima que hasta el momento StrowSaw no soporte el método de drag’n’drop para manipular los archivos que contiene.

Desde este menú elegimos la opción de importar el con-tenido de un TAP y escogemos el fichero a continua-ción.

El resultado es el que se muestra a continuación. Para cada fichero contenido en el TAP, se detecta de qué tipo es (programa BASIC, bytes, etc.) y se graba en la tarjeta de memoria con la cabecera +3DOS adecuada.

Sin embargo, +3DOS tiene algunas limitaciones sobre los nombres que puede tener un fichero. La más desta-cable es que dicho nombre no puede tener más de 8 ca-racteres, y hay 3 caracteres para especificar una exten-sión. Por otra parte, los nombres en cinta pueden ser de hasta 10 caracteres. La otra limitación, que aparece al intentar copiar ficheros de un sitio a otro, es que los nombres no deben tener espacios ni cualquier otro carác-ter que no sean letras o números. Mientras que esta limi-

tación se implementa en “3e” o en StrowSaw, la única opción para cambiar los nombres es volcar los ficheros al PC, cambiarles el nombre, y volver a ponerlos de nuevo en la tarjeta de memoria. Este es el resultado.

De nuevo con la tarjeta de memoria en el DivIDE, se monta la partición “snaps” donde se ha grabado el con-tenido de la cinta en la unidad D: y mostramos su conte-nido.

Falta modificar el cargador BASIC para que cargue los nombres de archivos correctos. El POKE 23399,4 hace que la ROM escriba ese valor en el puerto 1FFDh. En concreto, este poke apaga el motor del disco justo antes de que comience el juego. Esto es necesario hacerlo en juegos que se portan a disco ya que en circunstancias normales (con la ROM controlando las interrupciones), el motor del disco se para tras unos segundos, y esto se controla a través de un contador que se actualiza desde el gestor de interrupciones de la ROM. Si ese gestor se anula, como suele ser habitual en los juegos, el motor del disco sigue dando vueltas, desgastando innecesaria-mente los cabezales y el propio disco.

De esta forma, el WTSS consigue arrancar, pero después de elegir controles y comenzar el juego, éste se bloquea o se resetea el ordenador.

Page 13: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Creación de una versión cargable desde un snapshot Una de las nuevas características de la ROM del proyec-to +3E es la posibilidad de cargar snapshots de juegos con el comando SPECTRUM que ahora tiene una nueva sintaxis:

SPECTRUM “nombre del snapshot”

Soporta snapshots en formato SNA y Z80. Este último, sin comprimir. Para un snapshot de 128K hay que usar el formato Z80, así que vamos a crear un snapshot del jue-go justo antes de que comience.

Para ello, y desde un emulador (en mi caso, Spectacula-tor) usaremos la versión de cinta. Se carga el cargador BASIC sin autoejecutar, y se añade una pausa junto con un pitido, para que sepamos en qué momento ha termi-nado la carga y está a punto de ejecutarse el programa (línea 30).

En Spectaculator hay que especificar que queremos que los snapshots Z80 los cree sin comprimir.

Para copiarlos a la compact flash que usamos con el DivIDE y el +3E, usaremos StrowSaw con la opción de colocar fichero en modo binario (sin cabecera +3DOS)

Ya de vuelta en el Spectrum, si cargamos desde la com-pact flash el snapshot, éste funciona sin problemas. ¿Lo hará si se carga desde disquete? Copiamos el snapshot al disquete…

Y lo cargamos, con la orden SPECTRUM:

Page 14: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Lamentablemente, la carga de snapshots desde disquete no está soportada. La razón es que las rutinas de disquete usan memoria RAM de varias páginas como caché, y esto interfiere con la carga del propio snapshot. De todas formas, sí que se puede cargar desde la compact flash, por lo que este método garantiza que cualquier juego que no sea multicarga funcione en una unidad compatible +3E.

Copia desde la imagen DSK a un dis-co físico usando la utilidad DU54 StrowSaw permite importar el contenido de una imagen DSK, siempre y cuando su contenido sean ficheros gra-bados de la forma habitual en el disco, y la imagen esté

en el formato “Standard DSK”. El disco de WTSS no cumple nada de esto, así que lo intentaremos con esta utilidad, que funciona en CP/M y en un +3.

Esta utilidad está en formato imagen de disco DSK en uno de los enlaces del proyecto +3E. Desafortunadamen-te no está en el formato estándar, sino en el extendido, así que no podemos importar su contenido directamente a la compact flash desde StrowSaw.

Lo que se ha hecho es usar otra utilidad, CPCXFS, para leer y extraer los ficheros desde la imagen DSK. CPCXFS sí es capaz de leer el formato extendido DSK. Es una utilidad de línea de comandos, y este es el resul-tado de su ejecución (la entrada del usuario está en ne-grita):

C:\CPCXFS>cpcxfsw ┌─────────────────────────────────────────────────────────────────────────────┐ │ CPCfs --- CPCEmu Filesystem Maintenance │ │ │ │ 0.85pl0 (Compiled: Feb 16 2003 07:02:41, by Kevin Thacker.) │ └─────────────────────────────────────────────────────────────────────────────┘ Page length set to 25 Type HELP for an overview of CPCfs #/#> open du54.dsk Found format "ZX0" matching disk image format du54.dsk/0> dir Directory of Image: DU54.DSK , User 0 Used Users: 0 with 7 files U Name Size Attr Ent | U Name Size Attr Ent ---------------------------------------+------------------------------------- 0 DISK. 256 1 | 0 DU54.COM 26752 2 0 DU54.DOC 32640 2 | 0 DU54.PMA 55424 4 0 DU54CON.COM 13568 1 | 0 DU54P3. 256 1 0 DU54P3.HED 18560 2 | 7 files in 147456 Bytes (23552 Bytes free, 154624 Bytes allocated, 13 entries of 64) du54.dsk/0> mget *.* Getting "0:DU54.PMA": 55424 Bytes Getting "0:DU54.COM": 26752 Bytes Getting "0:DU54P3.": 256 Bytes Getting "0:DU54P3.HED": 18560 Bytes Getting "0:DU54.DOC": 32640 Bytes Getting "0:DU54CON.COM": 13568 Bytes Getting "0:DISK.": 256 Bytes Total: 147456 Bytes, 7 files

Estos ficheros, ya en el PC, se grabarán en la compact flash usando el modo binario sin cabecera. A partir de ahí, ya se puede ejecutar en el +3E.

DU54 muestra un pequeño menú, estilo LocoScript, en la parte superior de la pantalla. La opción que nos inter-esa es la 4: Disc-to-disc copy.

Especificamos como fuente el fichero DSK que habre-mos copiado previamente a la misma partición de la compact flash donde tenemos el DU54, usando el modo binario sin cabecera.

Page 15: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

Como destino, la unidad de disco A:

Insertamos un disco formateado en la unidad A: …

Y el disco comenzará a copiarse con los contenidos del DSK.

Pero hay un problema (bueno, varios): la copia que hace DU54 no incluye el formateo: el disco debe estar forma-teado previamente con el mismo formato que tenga el disco fuente, y en el caso del WTSS este formato es especialmente extraño. La utilidad SamDisk 3.0 puede darnos un mapa de dicho formato:

C:\>samdisk scan wtss.dsk [wtss.dsk] Fixed: added suitable second copy of +3 Speedlock weak 42 Cyls, Head 0: 250Kbps MFM, 9 sectors, 512 bytes/sector: 0.0 1 2[m2,dc] 3d 4d 5d 6d 7d 8d 9d diff(2): =5 -445 +4 -58 250Kbps MFM, 5 sectors, 1024 bytes/sector: 1.0 1d 2d 3d 4d 5d 2.0 1d 2d 3d 4d 5d 3.0 1d 2d 3d 4d 5d 4.0 1d 2d 3d 4d 5d 5.0 1d 2d 3d 4d 5d

...

...

... 22.0 1d 2d 3d 4d 5d 23.0 1d 2d 3d 4d 5d 24.0 1d 2d 3d 4d 5 25.0 1 2 3 4 5 26.0 1 2 3 4 5 27.0 1 2 3 4 5 28.0 1 2 3 4 5 29.0 <blank> etc...

A causa de este formato, al llegar a la pista 29, DU54 produce el siguiente error:

Lamentablemente, ninguno de los formatos que soporta DU54 puede usarse en este caso:

Este método sin embargo sí ha podido ser usado para copiar a un disco físico el contenido de la imagen de disco donde inicialmente estaba la utilidad DU54, y también puede usarse para cualquier disco que tenga un formato compatible con +3DOS, es decir, que no tenga protecciones que impliquen un número no estándar de sectores, o pistas.

Creación de un cargador custom que evite usar la página 7 de RAM Hasta donde he podido averiguar, una de las razones por las que ninguno de los métodos que he usado hasta ahora

Page 16: Introducción · ción que no existe en la versión para Interface 2, y es el poder conmutar desde la ROM de testeo a otra en la que hay una copia de la ROM 48K, pero levemente modifi-cada

ha funcionado, es que el juego usa toda la RAM de un 128K, y eso entra en conflicto con las rutinas de disco que por una parte usan la página 7 para mantener varia-bles del estado del mismo, y las páginas 1, 3, 4 y 6 como caché de disco.

Con esta configuración inicial, no es de extrañar que el juego no funcione. En cuanto se carga un bloque a una de estas páginas, subsiguientes cargas de otros bloques corrompen la información ya cargada anteriormente.

Mi último intento para conseguir una versión cargable de este juego ha consistido en escribir una serie de ruti-nas para facilitar la copia de bloques entre páginas de RAM, y particularmente, usar “huecos” en la memoria para almacenar temporalmente porciones del bloque que irá en la página 7.

Para evitar que las páginas 1, 3, 6 y 7 se corrompan du-rante el uso del disco, es necesario deshabilitar la caché. Esto se hace con una llamada al +3DOS: dos_set_1346 . Para evitar usar la página 7 en la carga, aprovecharemos que el bloque que se carga en la página 1 no ocupa 16K sino 12K, así que 4K del bloque 7 pueden ir temporal-mente en la página 1. Por otra parte, el resto del conteni-do del bloque 7 se ha alojado en la pantalla, emborro-nando la misma por unos segundos.

El cargador se ha modificado para que llame primero a una rutina que desactiva la caché de disco (TurnOFFCa-che). Luego, para cada bloque cargado, se llama a otra rutina que lo ubica en su posición y página final (Pon-Pagina), y por último, tras cargar todos los bloques en todas las páginas menos la 7, se llama a otra rutina (Pre-paraExec) que coge los trozos que hay en la pantalla y en la página 1 para restituir el contenido del bloque 7, se apaga el disco, y se salta al programa.

Este es el código fuente de la última versión que escribí: port1 equ 7FFDh bankm equ 5B5Ch dos_set_1346 equ 013fh org 25001 PonPagina di ld a,(23670) ;pagina destino a copiar ld bc,7ffdh out (c),a ;conmutamos página

ld hl,32768 ld de,49152 ld bc,16384 ldir ;transferimos bloque cargado de disco ;a pagina destino ld a,(23388) ld bc,7ffdh out (c),a ;restituimos pagina ei ret PreparaExec di ld a,4 ;Parar motor de la disquetera ld bc,1ffdh out (c),a ld hl,49152 ;copiamos de la pagina 1 ld ix,56064 ;a la 7 ld de,4096 ;esta cantidad de bytes ld bc,7ffdh ;puerto de paginacion Copia1a7 ld a,1 out (c),a ld a,(hl) ;leemos byte en pagina 1 ld (hl),0 ;una vez leido, lo borramos de la ;pagina 1 ex af,af' ld a,7 out (c),a ex af,af' ld (ix),a ;y lo copiamos en la 7 inc hl inc ix dec de ld a,d or e jr nz,Copia1a7 ld hl,16384 ;copiamos desde la pantalla ld de,60160 ;hasta esta direccion en pagina 7 ld bc,5376 ;todos estos bytes ldir jp 34081 ;comienzo del juego!! TurnOFFCache di ld bc,port1 ld a,(bankm) push af ld a,7 ;ROM 2, RAM bank 7 para poder llamar a ;las rutinas del +3DOS ld (bankm),a out (c),a ;conmuta ei ld de,0 ;queremos 0 sectores de caché de disco ld hl,4 ;y 4 sectores (lo mínimo) de RAM disk. call dos_set_1346 di pop af ld (bankm),a ld bc,port1 out (c),a ei ret end

Pero al parecer, al +3DOS no le gusta nada que lo dejen sin caché, y al llamar a dos_set_1346, se resetea si se están haciendo operaciones de disco. Sin embargo, si el programa se carga desde la compact flash, funciona sin problemas.

Referencias - Página del proyecto +3E: http://www.worldofspectrum.org/zxplus3e/

- Utilidad DU54: http://www.seasip.demon.co.uk/Cpm/software/amstrad.html

- SamDisk 3.0: http://simonowen.com/samdisk/

- Utilidad “3e”: http://www.zxprojects.com/images/stories/3e_card_manager/3e.zip

- Front-end StrowSaw para 3e: http://www.angelfire.com/games6/atari2600/spxfr/3eStrowSaw.html

- Imagen de la ROM de testeo: http://www.zxprojects.com/images/stories/testrom128/testrom128.bin