Introducción Reparación inicial

Transcripción

Introducción Reparación inicial
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…
Así que lo primero es poder ver la imagen que da este
ordenador. No uso la salida de RF de los equipos si puedo 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.
… 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 quitado el conector DIN y se había intentado poner un conector 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 directamente). Por fortuna, el desoldado del conector se había
hecho limpiamente y no había pistas saltadas.
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.
Convencido de que sería un fallo de memoria, fui a por
la EPROM que uso para testar equipos.
Esta EPROM se enchufa en uno de los zócalos destinados 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 equipo.
Al arrancar de nuevo con la ROM de testeo, obtuve lo
siguiente:
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 datos, sino que usa solamente los registros. De esta forma
el programa puede usarse incluso en equipos sin memoria 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 Spectrum 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 operació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 modificada 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.
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 realidad, 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.
En el Spectrum que nos ocupa, los dispositivos que podrían interferir son, además de la propia ROM, la memoria 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 cuando 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.
-
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 contenida.
-
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. Esta opción no existe en la versión de la ROM para
Spectrum 48K, sólo en las versiones para 128K.
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 cambiar 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á fallando, 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:
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áginas (testando a partir de las direcciones 49152 en adelante): 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.
Llegados a este punto, el equipo debería funcionar. Se
volvieron a colocar las ROM’s originales en sus respectivos 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 conector CINTA/SONIDO del cuál debería poder obtener
dicha señal, estaba mudo, así que tomé el sonido directamente 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 exteriores.
Actualización a +3E v1.38
El primer paso es borrar las EPROM’s que tenía el equipo. Éstas son de borrado por luz ultravioleta, así que
retiramos la cinta adhesiva que tapa la ventana de borrado, y metemos ambas EPROM’s en la cajita del borrador
UV.
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á…
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.
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ática, y el de RGB, que es un conector DIN de 8 pines,
hembra, para PCB.
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á encendido.
Se quita el otro conector estéreo que estaba puesto, y se
limpia con malla de desoldar los pads de ambos conecto-
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)
El grabador de EPROM’s que uso. No es nada moderno,
ya que usa el puerto paralelo. En el mercado hay modelos más modernos y portátiles que usan el puerto USB.
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 dispositivo 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: comprobación de que la EPROM está borrada, grabación propiamente dicha (programación), y verificación de lectura
usando las dos tensiones límites de alimentación: 4,75V
y 5,25V.
Y el resultado, tras volver a tapar las ventanas de borrado de las EPROM’s y volverlas a poner en sus correspondientes 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 versión ha cambiado a la última hasta ahora, la 1.38 .
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.
Los pines COLECTOR y BASE se sueldan en los puntos
indicados. El pin EMISOR se deja “al aire”.
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.
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 pequeñ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 carcasa. Es ahora cuando podemos soldar un extremo de la
resistencia a ese “pegote”, y soldar el otro extremo al pin
EMISOR 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 alambre para hacerles una especie de “piececitos”, para que
suelden mejor en los puntos marcados en la figura anterior. El transistor está orientado con la serigrafía al frente.
Por último, el condensador. El extremo positivo del
mismo (el que no está marcado en el costado con el símbolo “-“) se soldará al mismo punto de unión del
EMISOR con la resistencia. El otro extremo (el negativo) es nuestra salida de video.
Dado que hay partes metálicas de este añadido que quedan 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 macarrón termorretractil que he puesto antes de soldar la
resistencia, pero la cinta aislante también vale.
que instalar un nuevo conector RCA hembra en una
localización en la que no “choque” con otros componentes 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í:
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 central RCA que hay dentro del modulador. Previamente se
habrá cortado o desoldado el componente que va conectado a dicha toma central tal como indica la siguiente
figura.
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 cable apantallado para esta conexión.
En nuestro caso se pide una salida separada de video
compuesto, sin “mutilar” la existente de RF, así que hay
Con esto quedaría el equipo completamente restituído a
todas sus funciones: conector CINTA/SONIDO, RGB, y
video compuesto.
Imagen con salida de 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 VGABox) la calidad de la señal de video compuesto es más
que suficiente.
Imagen con salida RGB
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 realidad 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 particiones 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 sitios 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ó problemas desde el principio: es el juego “Where Time
Stood Still”.
Para intentar copiarlo y ejecutarlo con éxito se intentaron 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 versión no usa ningún tipo de carga “custom” y presumiblemente será más fácil de manipular.
Este es el contenido de la cinta visto con ZX BlockEditor:
Su cargador BASIC es bastante sencillo. Carga 5 bloques 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.
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.
Para pasar el contenido de esta cinta a CF, se ha usado la
utilidad “3e” a través de su front-end gráfico, “StrowSaw”, que puede descargarse desde la página del proyecto +3E. StrowSaw descarga a su vez la utilidad “3e” que
es de línea de comandos. Aunque StrowSaw sólo funciona 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.
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 izquierda, se ven los ficheros que contiene a su derecha.
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ñadir 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.
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 contenido de la cinta en la unidad D: y mostramos su contenido.
Desde este menú elegimos la opción de importar el contenido de un TAP y escogemos el fichero a continuació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 destacable es que dicho nombre no puede tener más de 8 caracteres, y hay 3 caracteres para especificar una extensió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ácter que no sean letras o números. Mientras que esta limi-
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 innecesariamente 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.
Creación de una versión cargable
desde un snapshot
Una de las nuevas características de la ROM del proyecto +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 juego justo antes de que comience.
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)
Para ello, y desde un emulador (en mi caso, Spectaculator) 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 terminado la carga y está a punto de ejecutarse el programa
(línea 30).
Ya de vuelta en el Spectrum, si cargamos desde la compact 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:
En Spectaculator hay que especificar que queremos que
los snapshots Z80 los cree sin comprimir.
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.
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.
Copia desde la imagen DSK a un disco físico usando la utilidad DU54
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 resultado de su ejecución (la entrada del usuario está en negrita):
StrowSaw permite importar el contenido de una imagen
DSK, siempre y cuando su contenido sean ficheros grabados de la forma habitual en el disco, y la imagen esté
Esta utilidad está en formato imagen de disco DSK en
uno de los enlaces del proyecto +3E. Desafortunadamente 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.
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 interesa es la 4: Disc-to-disc copy.
Especificamos como fuente el fichero DSK que habremos copiado previamente a la misma partición de la
compact flash donde tenemos el DU54, usando el modo
binario sin cabecera.
Como destino, la unidad de disco A:
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:
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 formateado 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:
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
ld hl,32768
ld de,49152
ld bc,16384
ldir
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 variables 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 rutinas 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 durante 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 temporalmente en la página 1. Por otra parte, el resto del contenido del bloque 7 se ha alojado en la pantalla, emborronando la misma por unos segundos.
El cargador se ha modificado para que llame primero a
una rutina que desactiva la caché de disco (TurnOFFCache). Luego, para cada bloque cargado, se llama a otra
rutina que lo ubica en su posición y página final (PonPagina), y por último, tras cargar todos los bloques en
todas las páginas menos la 7, se llama a otra rutina (PreparaExec) 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.
ld a,(23388)
ld bc,7ffdh
out (c),a
ei
ret
PreparaExec
Copia1a7
di
ld a,4
ld bc,1ffdh
out (c),a
ld hl,49152
ld ix,56064
ld de,4096
ld bc,7ffdh
ld a,1
out (c),a
ld a,(hl)
ld (hl),0
ex af,af'
ld a,7
out (c),a
ex af,af'
ld (ix),a
inc hl
inc ix
dec de
ld a,d
or e
jr nz,Copia1a7
TurnOFFCache
;transferimos bloque cargado de disco
;a pagina destino
;restituimos pagina
;Parar motor de la disquetera
;copiamos de la pagina 1
;a la 7
;esta cantidad de bytes
;puerto de paginacion
;leemos byte en pagina 1
;una vez leido, lo borramos de la
;pagina 1
;y lo copiamos en la 7
ld hl,16384
ld de,60160
ld bc,5376
ldir
;copiamos desde la pantalla
;hasta esta direccion en pagina 7
;todos estos bytes
jp 34081
;comienzo del juego!!
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
Este es el código fuente de la última versión que escribí:
port1
bankm
dos_set_1346
PonPagina
equ 7FFDh
equ 5B5Ch
equ 013fh
org 25001
di
ld a,(23670)
ld bc,7ffdh
out (c),a
;pagina destino a copiar
;conmutamos página
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

Documentos relacionados