sábado, 23 de mayo de 2015

SUPERUPGRADE - (EL SUPLEMENTO VITAMINICO DEFINITIVO PARA TU SPECTRUM GOMAS)

SUPERUPGRADE - (EL SUPLEMENTO VITAMINICO DEFINITIVO PARA TU SPECTRUM GOMAS)


¿Imaginas poder ejecutar juegos y programas de un +3 en tu querido Spectrum 16Kb?.
¿Te gustaría convertir tu querído amigo en un +3, un +2 gris, un TK95 o un Jupiter ACE solo haciendo un reset?
¿Y qué tal si dispusieras de 512Kb de RAM en tu pequeño amigo?
Pues deja de imaginar y lee las siguientes líneas y podrás comprobar como hacer todo lo anterior realidad.

El proyecto "SPECTRUM SUPERUPGRADE" consiste en fabricar un interface conectable al bus del Spectrum que convirtiera un Spectrum 16/48Kb en lo más parecido posible a un Spectrum +3, incluso con funcionalidad superiores como 512Kb de RAM o 32 ROMs diferentes seleccionables por soft.

En el caso de un Spectrum 16Kb no habría que tocar el Spectrum para nada, limitándonos a insertar el interface para empezar a disfrutar de las nuevas características.
En el caso de un Spectrum 48Kb habría que hacer una pequeña modificación interna para deshabilitar la RAM alta del Spectrum, osea convertirlo en un 16Kb.

Las características que va a tener el interface son las siguientes:

- Ampliación a 128Kb o 512Kb de RAM, dependiendo del chip que se compre.
- 2 conexiones de joystick multinorma (Kempston/Sinclair, Cursor)
- Botón de Reset
- Botón de NMI
- Incorporación de las ROMs del proyecto +3e para poder conectar un interface IDE.
- Chip de sonido AY.
- Entrada de audio para mezclar el sonido del speaker con el del AY.
- Salida de video compuesto.
- Expansor de bus.

Como podéis ver le queda muy poquito para convertirlo en un +3.
La idea es que funcionen todos los juegos de 128Kb que no necesiten acceso a floppy y que no usen los modos de Shadow RAM (realmente muy pocos).
Si incorporamos un interface IDE o un divIDE, podríamos ejecutar también los juegos de disco.
Con la ampliación a 512Kb es de esperar que puedan ejecutarse algunos juegos de los clones rusos tipo Pentagon.

1. Esquema

2. Layout de la placa

3.Correcciones necesarias

4. Esquema del add-on

5. Fuentes y documentación

6. Manual de Montaje

7. Manual de usuario

Alejandro Valero Sebastián (wilco2009)

SUPERUPGRADE: MANUAL DE USUARIO

SUPERUPGRADE: MANUAL DE USUARIO



Las características del interface son las siguientes:

- Ampliación a 128/256/512Kb de RAM seleccionable por jumpers
- 2 conexiones de joystick multinorma (Kempston,Sinclair, Cursor)
- Botón de Reset
- Botón de NMI
- Memoria flash de 512Kb conteniendo hasta 32 ROMs de diferentes sistemas o juegos.
- Chip de sonido AY.
- Entrada de audio para mezclar el sonido del speaker con el del AY.
- Salida de video compuesto.
- Expansor de bus.
- Compatible con divIDE
- Posibilidad de add-on de ampliación para selección de las ROMs por software.
- Grabación de la memoria flash desde el propio Spectrum.

Como podéis ver le queda muy poquito para convertirlo en un +3. La carencia más evidente es la disquetera, pero todo se andará. ;)

La idea es que funcionen todos los juegos de 128Kb que no necesiten acceso a floppy y que no usen los modos de Shadow RAM.

Si incorporamos un interface IDE o un divIDE, podríamos ejecutar también los juegos de disco.
Con la ampliación a 512Kb es de esperar que puedan ejecutarse algunos juegos de los clones rusos tipo Pentagon.

ROM BIOS Y SELECCIÓN DE LA ROM ACTIVA


La memoria flash de nuestro interface tiene una capacidad de 512Kb. Teniendo en cuenta que las ROMs más pequeñas que existen para Spectrum ocupan 16Kb (como la original el gomas), eso hace que quepan un total de 32 ROMs de ese tamaño.

Pero claro, hay otras versiones como el 128Kb y el +2 gris que ocupan 32Kb e incluso las del +2a/+3 64Kb, por lo que depende del tipo de ROMs que tengamos en el chip la cantidad ROMs que podremos tener variará.

Para poder albergar tanto las memorias 16Kb como las más grandes de 32Kb ó 64Kb, el chip está dividido en trozos de 16Kb cada uno de los cuales podemos grabar con la ROM que deseemos.

Adicionalmente, los bloques de 16kb vienen agrupados en otros bloques más grandes de 64Kb que a partir de ahora llamaremos slots, por lo que tendremos un total de 8 slots en el chip.

A la hora de guardar una ROM de 64Kb, no podemos empezar en donde queramos, tendremos que ocupar un slot, mientras que en el caso de las ROMs de 32Kb deberemos utilizar bien las ROMs 0 y 1 de un slot concreto (semi-slot inferior) o bien las ROMs 2 y 3 del slot (semi-slot superior)

El slot activo es seleccionable con los jumpers, JP3, JP4 y JP5, mientras que para seleccionar el bloque de 16Kb dentro de un slot necesitaremos de la ayuda del software.

El sistena incorpora una ROM BIOS situada en la el primer bloque de 16Kb.
Aunque inicialmente dicha ROM BIOS estaba pensada principalmente para la selección de la ROM por software con la ayuda del add-on (que luego veremos), se han añadido algunas funciones que pueden ser empleadas perfectamente en la versión básica del interface. Entre estas están las herramientas de diagnóstico y una opción muy interesante que nos permitirá seleccionar la ROM activa dentro del slot que tengamos seleccionado con los jumpers.

El espacio quedaría distribuido como sigue:



MANEJO DEL BIOS



La pantalla principal del BIOS del superupgrade nos muestra un listado con las ROMs incluidas en la memoria flash.
Para arrancar una de ellas, seleccionaremos la letra correspondiente y pulsaremos "ENTER".

En la versión 0.2 del BIOS se ha añadido un submenú de utilizades, al que se accede pulsando "V" y "ENTER", desde el menú principal.



En dicho menú disponemos de utilidades para testear nuestro interface:
- TEST DEL TECLADO: nos mostrará visualmente las teclas que estamos pulsando y los tres bits superiores de cada semifila.
Para el teclado solo se usan los bits 0 a 4, mientras que el bit 6 es usado para la entrada EAR.
Para terminar el test pulsaremos BREAK.



- TEST DEL JOYSTICK: Nos permitirá hacer un test completo del joystick, pidiendo que pulsemos secuencialmente cada uno de los botones del joystick. Cuando lleguemos al test de Sinclair deberemos pulsar usar los dos joystick simultaneamente.
En el caso de que pulsemos "BREAK" pasaremos al siguiente botón aunque no hayamos pulsado el botón correcto.



- TEST DE RAM: Realizará un test del paginado de la RAM, indicando cuantas páginas de memoria tenemos disponibles.
No se trata de un test completo de la integridad de la RAM, ya que solo comprueba el paginado.


- TEST DE AUDIO: Hará sonar una escala musical por cada uno de los tres canales del AY.



- SELECCIÓN DE PÁGINA DE ROM: Esta opción está pensada para los usuarios que no inserten el add-on.



Recordemos que la memoria está dividida en bloques de 64Kb que son seleccionable por jumpers, y que en cada bloque de 64Kb nos caben 4 páginas de 16Kb.
Pues bien, si después de arrancar el menú cambiamos los jumpers a la ROM deseada, esta opción nos permitirá seleccionar la página de 16Kb que queremos ejecutar.
Una vez selecionada la página deseada, el sistema nos pedirá que pulsemos una tecla, tras lo que el spectrum se reiniciará ejecutando el programa contenido en la página seleccionada.

A modo de ejemplo y para clarificar un poco el tema, vamos a incluir una tabla de posición de los jumpers / rom a seleccionar del set de ejemplo que se ha mandado ya pregrabado en el kit.

Con los jumpers sólo podemos cambiar entre 8 bloques de 64Kb (a partir de ahora slots), por lo que dependiendo de la posición de los jumpers, cuando hagamos reset con los jumpers en una posición determinada, el sistema nos arrancará con la ROM 0 del slot seleccionado.
Para arrancar las otras tres ROMs del slot será necesaria la opción de selección de ROMs del menú de herramientas.

Los jumpers no están en orden por lo que igual resulta un poco confuso su manejo. Seguidamente voy a poner una tabla que intenta clarificarlo.



Como vemos hay ROMs que ocupan varios bloques de 16Kb, por lo que en estos casos solo tendrá sentido arrancar el primer bloque de los que lo componen. Si seleccionamos por ejemplo la segunda ROM del +3 lo más normal es que se cuelgue el sistema.

En la tabla vemos, en las tres primeras columnas, la posición que tenemos que poner en los jumpers para seleccionar un slot determinado.
Por ejemplo, las ROMs del +2 gris están en el Slot 2, por lo que tendremos que poner los jumpers en las posiciones arriba, abajo, arriba, empezando a contar por el jumper superior de los tres de selección de ROM.

Para esta ROM en concreto no será necesario el selector, ya que ocupa la posición 0 de este slot. Será suficiente con poner los jumpers y pulsar reset.

En el caso de una ROM que no ocupe la posición 0 de un Slot, sí necesitaremos el selector. Ese es el caso de la ROM del spectrum, que está en la posición 1 del slot 0, por lo que con los jumpers en la posición abajo abajo arriba, seleccionaremos la opción de selección de ROMs y pulsaremos el 1, y como en este caso no nos hace falta cambiar los jumpers al pulsar una tecla aparecerá la ROM del gomas.

El caso del Planetoids es el mismo, pero en este caso deberemos seleccionar la ROM2 desde el menú de cambio de ROMs y luego de cambiar los jumpers a la posición arriba arriba arriba, pulsar una tecla.


AGREGANDO NUESTRAS PROPIAS ROMS


Las ROMs que vienen grabadas en el chip son solo un ejemplo. 
Nosotros podemos sustituirlas por las que queramos, pero deberemos tener en cuenta las siguientes indicaciones.

Las ROMs deben tener exactamente 16Kb, 32Kb ó 64Kb. Si disponemos de una ROM de un juego que ocupa menos deberemos completarla hasta los 16Kb con un editor hexadecimal.

La primera posición debe siempre ocuparla la ROM BIOS.

Desde dicho BIOS tenemos un menú que nos permitirá arrancar las ROMs por soft solo sí tenemos instalado el add-on.

En el caso de que vayamos a utilizar el add-on, en la ROM 0, tenemos ciertos parámetros que deberemos modificar para cada una de las ROMs y que nos indicaran como se comportará dicho programa. Estos datos ocupan un byte por ROM y se localizan en $020E..$022D correspondiendo con las ROMs 0 a 31 (también se cuenta el propio BIOS).



En la tabla anterior podemos ver que los bits 0 a 4 de cada uno de los bytes nos indica el número orden de la ROM (0..31), mientras los bits 5, 6 y 7 nos van a permitir definir el comportamiento de la ROM.

Los bits 5 y 6 nos permiten desactivar el paginado de la ROM total o parcialmente y están relacionados con el tamaño de la ROM en cuestión.

Por ejemplo para el caso de la ROM de un gomas que ocupa un solo bloque de 16Kb deberíamos desactivar completamente el paginado, ya que no nos interesa que se ejecute nada fuera de ese bloque de 16Kb, por lo que ambos bits deberían estar a 1.

En el caso de una ROM de 32Kb deberemos dejar activa la paginación que se realiza a través del puerto $7FFD que gestiona el cambio entre el bloque 0 y el 1, pero deberemos desactivar el cambio a las ROMs 2 y 3 que se gestionan con el puerto $1FFD. Por tanto el bit 5 lo pondremos a 0 y el 6 a 1.

Por último para el caso de las ROMs del +3 nos interesará dejar activo el paginado al completo, por lo que dejaremos ambos bits a 0.

El bit 7 nos permitirá desactivar el divIDE para los casos en que queramos arrancar una ROM incompatible con divIDE sin necesidad de desconectarlo.

Pogamos como ejemplo contenido de dicho byte para las ROMs del ROMSET de ejemplo:


Los textos que nos aparecerán en el menú se localizan en $000F..$020E y están formados por un byte $0F y el texto de 15 caracteres de longitud para cada una de las opciones.
Hay que tener cuidado no  machacar ni el byte $0F ni el texto de la siguiente opción.

La siguiente tabla nos muestra la posición de comienzo de cada texto del menú.



Una vez tengamos todos los archivos a incluir debemos juntarlos todos en el orden deseado, sumándolos con lo orden "COPY /B" o con un editor hexadecimal asegurandonos que el archivo final tiene exactamente 512Kb (524.288 bytes)

Os pongo como ejemplo el archivo bat que he utilizado yo para generar el archivo .bin a grabar.

del rom*.bin
copy /b BIOS.ROM+48.rom+inves.rom+tk90x.rom rom.bin
copy /b rom.bin+"plus3-spanish.rom" rom.bin
copy /b "rom.bin"+"plus2-spanish.rom"+"128-spanish.rom" "ROM.bin"
copy /b rom.bin+ "sm8es3eE.rom" rom.bin
Copy /b rom.bin+Ace_ROM.bin+tk95.ROM+gw03.rom+OPENSE.ROM rom.bin
Copy /b rom.bin+ZXTESTROM.BIN+backgammon.rom+testrom128.bin rom.bin
copy /b rom.bin+spaceraiders.rom+chess.rom+planetoids.rom+Popeye.rom rom.bin
copy /b rom.bin+qbert.rom+roj.rom+LocoMotion.rom+Gyruss.rom rom.bin
dir rom.bin

Si no os queréis complicar, una manera muy sencilla es utilizar como base el archivo que os he incluido yo como ejemplo y modificarlo con un editor hexadecimal.

Si utilizamos un editor hexadecimal, deberemos tener en cuenta que las ROMs deberán ir en las siguientes posiciones:



GESTION DE LOS PUERTOS DEL INTERFACE


Para la selección de las páginas de ROM y RAM en los Spectrum de 128Kb se utilizan los puertos $7FFD (32765) y $1FFD (8189).

El cambio de página de ROM o RAM se realiza pasando el valor adecuado al puerto correspondiente mediante un OUT, teniendo en cuenta que cada bit de dicho valor tiene el siguiente significado:

Puerto $7FFD



- Los Bits 0..2 componen un número de 3 bits que nos permite seleccionar una página de entre las 8 posibles de la RAM del 128Kb.
- El bit 3 está relacionado con la shadow RAM y permite seleccionar la pantalla que se va a visualizar. Tener el bit 3 a 0 le dirá a la ULA que se muestre la pantalla convencional, mientras que si está a 1 significará que se muestre la Shadow RAM. Esta característica no está soportada en el interface.

- El bit 4 permitirá seleccionar entre las dos ROMs posibles en el Spectrum 128K y el +2 gris. Estando a 1 se selecciona la ROM del 48Kb y a 0 la del 128Kb.
En el caso de los +2A/+3 se tendrá en cuenta también otro bit que veremos luego formando entre los dos un número de 2 bits que nos permitirá seleccionar una de las 4 ROMs disponibles.

- El bit 5 nos permitirá deshabilitar el paginado.

- Los bits 6 y 7 no se usan.

Puerto $1FFD:



- El bit D0 nos permitirá seleccionar entre el modo de gestión de memoria del +3 o de CPM
- Si tenemos seleccionado el modo CPM Los bits D1 y D2 nos permitirán modificar la distribución de la RAM según lo siguiente (Esta característica no está soportada en el interface):



- Si el bit 0 es igual a 0 el bit D2 será la parte alta de selección de la ROM, junto con el D4 del puerto $7FFD. Podemos ver este bit (D2 $1FFD) como selección del chip A ó B dentro del +3 y el D4 de $7FFD como el selector de la parte baja o alta del chip.

- D3 sirve para activar o desactivar el motor del disco.

- D4 es la señal de strobe del puerto paralelo.

- D5 a D7 no se usan.

Paginación en el Pentagon

En el Pentagon se añaden dos bits más para la selección de la página de RAM correspondientes a D6 y D7 del puerto $7FFD, quedando dicho puerto de la siguiente manera.



En nuestro interface se soporta este modo de paginación disponiendo de 5 bits (32 páginas) para la selección de página.

Distribución de las páginas en el espacio de direcciones.

El espacio de direcciones ocupado por la página seleccionada es generalmente $C000-$FFFF, pero existen algunas páginas que tienen un tratamiento especial.

La distrubución exacta se resume a continuación.



- El banco número 2 siempre estará visible en el rango $8000-$C000, pero también será accesible en $C000-$F000 si tenemos seleccionada la página 2.

- El banco número 5 corresponde con la memoria de pantalla $4000-$8000 en un +2/+3. En nuestro interface no está soportado y es un banco más. Esto podría ser implementado en el futuro según las indicaciones de mcleod_ideafix.

- El banco número 7 corresponde con la ShadowRAM y su contenido se visualizará si D3 está a uno en el puerto $7FFD. En nuestro interface no está implementado y el banco 7 es una página más. Además es imposible de implementar sin cortar bastantes pistas y modificar interiormente el Spectrum. Afortunadamente no hay muchos programas que aprovechen esta característica, por otro lado muy interesante.

Distribución de las ROMs en el +3

En el +2/+3 las 4 ROMs vienen repartidas en dos chips (A y B) almacenando dos ROMs cada uno de ellos.



En nuestro interface almacenamos las cuatro ROMs en un solo slot distribuyendose su espacio de la siguiente manera:



Hay que tener en cuenta que el direccionamiento de la tabla es desde el punto de vista del chip, pero la ROM seleccionada siempre se accederá mediante el rango de direcciones estándar $0000-$3FFF.

Por último un listado de qué función tiene cada ROM:



Funcionamiento del puerto nuevo puerto del add-on $43B

Para poder realizar su función, el add-on hace uso de un nuevo puerto que ha sido solicitado al ZXI specification group.

El puerto concedido para dichas tareas es el puerto $043B. 
Dicho puerto es un puerto de solo escritura y tiene como funcionlidad principal poder seleccionar activa la ROM dentro del chip de 512Kb, además de poder desactivar el divIDE y el paginado estándard a través de los puertos $1FFD y $7FFD.

En la tabla siguiente se resume la funcionalidad.



Los bits 0..1 correspondería con la página de ROM y los bits 2..4 con el número del slot.

El cambio de página ROM a través de este puerto funcionará aún en el caso de que se haya desactivado el paginado a través de los puertos $1FFD y $7FFD.

El bit 5 nos permitirá desactivar el paginado a través del puerto $7FFD.

El bit 6 nos permitirá desactivar el paginado a través del puerto $1FFD.

El bit 7 nos permitirá desactivar el divIDE. Realmente este puerto lo que hace es filtrar las señales /MREQ y A15 no dejándolas pasar hacia el bus de expansión (poniendolas a +5V), teniendo como efecto que el divIDE nunca detecta que estamos ejecutando direcciones de la ROM, por lo que nunca se activará aunque lo tengamos conectado.

EL BUS DEL SPECCY SUPERUPGRADE


El bus del superupgrade no coincide uno a uno en su parte trasera y delantera. Esto es así debido a que hay algunas señales que son tranbsformadas para entregarlas a los demás periféricos de una manera más conveniente para el funcionamiento del interface.

Abajo dejo unas tablas descriptivas del bus del spectrum y del superupgrade, en las que podemos ver estas diferencias.

Las imágenes del bus del spectrum han sido tomadas prestadas del trastero del spectrum. :)







GRABACIÓN DE LA MEMORIA FLASH DESDE EL SPECTRUM


Actualmente estamos en pleno desarrollo de una herramienta de grabación de la memoria flash desde el propio spectrum.

El siguiente programa lo ha desarrollado antoniovillena y consiste en un software de línea de comandos que, a partir de un archivo de ROM de hasta 64Kb nos generará un archivo tap listo para ejecutar en nuestro spectrum.


Dicho archivo tap puede ser convertido a wav y cargado por audio, o bien también puede ser cargado directamente desde el divIDE.
Si se decide utilizar la carga por audio, una buena idea podría ser actualizar la ROM del spectrum (que en el ejemplo está instalada en el bloque 0, rom 1) con la ROM cargandoleches como primer paso, y a partir de ese momento utilizarla siempre para cargar los taps de las roms que vamos a quemar en nuestra flash.

En la carpeta deberemos tener el archivo "SuperUpgrade.exe" y  el archivo "SuperUpgrade.bin". 

La sintaxis del programa es como sigue:

SuperUpgrade <outputfile> <roms> <inputfile1> <inputfile2> .. <inputfilen>
<outputfile>  Output TAP file
<roms>        4 digit number, X to preserve. 0123 full 64K, XXX3 only ROM3
<inputfileX>  Input binary file/s


Es decir, para generar un tap con las ROMs del +3 hariamos lo siguiente:

SuperUpgrade hola.tap 0123 plus3en41.rom

Una vez generado el tap, puedo pasarlo a la CF de mi divIDE o bien cargarlo por audio, y una vez cargado en el spectrum, nos aparecerá una pantalla como la siguiente:



En el caso de que tengamos el "Add-on", simplemente deberemos pulsar una tecla entre 0 y 7 coincidiendo con el slot donde queramos grabar la/s ROM/s.

Si por el contrario no disponemos del "Add-on", deberemos cambiar los jumpers a la posición deseada y entonces pulsar una tecla.

Actualmente, nuestro compañero pachuquín, está desarrollando un frontend que en principio estaba pensada para facilitarnos la generación de ROMSETs para grabar desde una grbadora de EPROMs, pero que pronto incorporará también la utilidad de antoniovillena y nos permitirá generar los taps desde un entorno gráfico más amigable.

SUPERUPGRADE: MANUAL DE MONTAJE

SUPERUPGRADE

MANUAL DE MONTAJE

Si ya tenéis experiencia con estas cosas os aconsejo que al menos os leáis la lista de erratas que viene al final, ya sabéis cosas que pasan con los prototipos que salen fallos.

Para los que no la tengáis, supongo que os vendrá esta guía de montaje.

Empezaremos con un par de imágenes que nos van a servir de guía durante el montaje.

La primera de ellas es el layout de los componentes:



Y la segunda es el esquema del circuito, para verlo en grande pinchar sobre la imagen.



Otros dos secciones muy a tener en cuenta están al final del tutorial y son el listado de componentes, y la Fe de Erratas.

Es importante que os deis cuenta que, una vez enchufado el interface en el spectrum, los componentes van en el lado del televisor, quedando hacia nosotros el lado de las pistas. Esto se hace así para que los componentes que sobresalen no tropiecen con el Spectrum al conectar el interface.

Luego veremos que está indicado en la placa, pero desde ya os aviso que por lo anterior, el conector hay que soldarlo en el lado de las pistas y no en el de los componentes.

Echémosle ahora un vistazo a la placa.

Aquí os presento la cara de los componentes.


Y esta es la cara de las pistas.



¿A que ha quedado chula eh?

Bueno pues vamos a ponernos la ropa de faena, el soldador a calentar, los componentes a mano y el estaño a nuestra vera.

Empezaremos por soldar lo que menos altura tenga y acabaremos por lo más alto, de esta manera podremos apoyar la placa tranquilamente en la mesa para poder hacer la soldaduras con tranquilidad.

Siguiendo esa norma empezaremos por los diodos.



Doblaremos un poco las patas de los componentes para que se sujeten bien cuando le demos la vuelta a la placa no se salgan.



Una vez soldados, cogemos la herramienta de matar de la foto y nos liamos a cortar lo que sobra.



Vaya, si no me han quedado mal del todo, jejejeje.

Seguimos con las resistencias....



Tened cuidado cuando lleguéis a este punto, ya que, tal y como dice en la fe de erratas, la placa tiene dos errores de rotulado.
Con tanto mareo de componentes de arriba para abajo, R32 no tiene rótulo, y a R14 se le ha quedado el rotulo desplazado por encima del diodo que tiene inmediatamente arriba.



Ya os digo, se ve que me había fumado un canuto y me bailaron un poco los cartelitos.  :))

Y después seguimos con los zócalos.



Y tras los zócalos soldamos el cristal, los condensadores de lenteja y los conectores de audio.



Por comodidad, y como una vez conectado el interface, la cara de las pistas queda de cara al usuario, he decidido colocar los jumpers, el led y los selectores del lado de las pistas. Podéis hacerlo así o del otro lado, pero si lo hacéis como yo, tened cuidado y no cometáis el mismo error que yo.



Los dos jumpers de más abajo se tienen que soldar obligatoriamente del lado de los componentes, ya que si no, después tropiezan con el Spectrum y no dejan insertar el interface.

Hala, pues a mí me toca desoldar esos dos jumpers y soldarlos por el lado contrario.

Vamos ahora con el conector EDGE y la plaquita de expansión.

El diseño que tenemos entre manos, tiene la particularidad de que no replica pin a pin el puerto del Spectrum con la placa de expansión, por lo que no podemos soldar la plaquita de expansión directamente a las soldaduras del conector EDGE.
Por ello tenemos punto de soldadura diferentes para cada cosa.
En la placa viene un cartelito de ayuda que indica en qué lado y a qué altura tenemos que soldar el puerto de expansión o el conector EDGE.

Para soldar la plaquita de expansión cortaremos dos tiras de 28 pines y empujaremos el pin número 5 para sacarlo de la tira. Este pin es el que coincidirá luego con la posición de la ranura del Spectrum.
Una vez tenemos cortadas las tiras, cogemos una de ellas y la insertamos en donde pone expansión en el lado de los componentes.





Es muy importante soldar esta tira antes que el conector EDGE, ya que si no luego no tendremos acceso para soldar los pines de esta tira.

Quedará así:



Una vez tenemos esta tira soldada, podemos pasar a mecanizar el conector EDGE.
Sinclair ha hecho un tutorial muy completo dedicado solo a este punto al que podéis acceder aquí

Lo primero sacamos los pines correspondientes a la posición número 5 empujándolos desde abajo.



Posteriormente cortaremos los laterales con una sierra, teniendo mucho cuidado de no romper el conector, tras lo cual ya podemos pasar a soldar el conector en la placa.



Una vez soldado el conector soldaremos la otra tira de pines.



Vamos ahora con el conector de vídeo.



Aquí es donde me doy cuenta del primer fallo gordo. El conector de vídeo tiene intercambiados el vivo por la masa, es lo que tiene hacer la huella de los componentes fijándose solo en una foto y alguna medida que figura en el anuncio de ebay, que al final pasan estas cosas.

No nos queda más remedio que convertir este conector en aereo.

Así es como debería haber quedado.



Y así es como queda.



Os habéis dado cuenta en las fotos anteriores, que ahora es un buen momento para soldar los conectores DB9 para los joysticks e insertar los chips en sus zócalos.

Al insertar los chips en sus zócalos tener mucho cuidado en que la muesca quede en la misma posición que en la placa, y fijaos bien porque las GAL no son intercambiables entre sí, ya que cada una tiene unas funciones diferentes.
En el paquete que os envíe irán perfectamente rotuladas como IC10 y IC5 y programadas para que sea pinchar y listo.

Vamos a soldar ahora la placa de expansión. Para ello doblamos ligeramente los pines que hemos soldado para que la placa quede sujeta en el hueco resultante.



Fijaos bien que la plaquita quede alineada antes de soldarla.









Pasamos a soldar la plaquita tanto por arriba como por abajo.



Y tras esto ya solo nos queda poner los jumpers en la posición correcta y pasar a probar el invento.



La Flash ROM os la envío con un set de prueba, pero si queréis meterle otras ROMs diferentes, solo tenéis que hacerlo con la programadora.

POSICIÓN DE LOS JUMPERS


JP2 - Con el jumper en la posición 1-2 queda habilitada la memoria del interface, y en la posición 2-3 queda habilitada la memoria interna del spectrum

JP1 y JP6 - Sirven para habilitar la memoria de 512Kb o deshabilitarla. Con ambos jumpers en la posición 2-3 se el interface tendrá 128Kb y si están en la posición 1-2 tendrá 512Kb.

JP3 (bit bajo), JP4 (bit intermedio) y JP5 (bit superior) - Sirven para seleccionar uno de los 8 bloques de 64Kb de la memoria flash. Dichos jumpers en la posición 2-3 corresponden con un 0 y en la posición 1-2 corresponden con un 1.
Con estos tres jumpers formamos un número de 8 bits que corresponde con el bloque de 64Kb que está activo.

DESHABILITACIÓN DE LA RAM INTERNA EN NUESTRO 48Kb


Si disponemos de un Spectrum 16Kb no necesitaremos tocarlo para nada a la hora de usar nuestro interface, pero si por el contrario es un 48Kb necesitaremos hacer un pequeño cambio interno en nuestro spectrum que permita al interface deshabilitar la memoria alta.

Tenemos dos casos diferentes dependiente de la versión de la placa.

Para todos los modelos desde la Issue 1 hasta la Issue 4:

Para deshabilitar la memoria alta de un tenemos que meter 5v en el pin 5 de IC23.

En condiciones normales esto se puede conseguir puenteandolo con el pin 14 del mismo chip, pero en nuestro montaje hemos habilitado el pin 4A que estaba sin usar del bus para suministrar esos 5V. De esa manera cuando está insertado el interface y el jumper en la posición adecuada se deshabilita automáticamente la memoria alta, y si lo desenchufas se vuelve a habilitar sola.

Debemos por tanto soldar un cable entre el pin 5 de IC23 y el pin 4A del slot de expansión.



En el caso de que nuestro spectrum sea una Issue 5 o 6 deberemos conectar la patilla 35 de IC27 con la patilla 4A del bus de expansión.

En la imagen no se ve porque queda debajo del disipador metálico, pero es la patilla que hace quince si empezamos a contar desde abajo a la derecha.



FE DE ERRATAS 

- R32 no tiene rótulo, es la única que no lo tiene por lo que no os costará encontrarla. Es la resistencia de - 1K8 que está situada justo a la izquierda de la memoria flash.
- R14 tiene el rótulo desplazado hacia arriba, por encima del diodo D7, es decir, es la resistencia situada entre D7 y D13.
- El conector de video está al revés teniendo cambiada la masa por el vivo. Este es el fallo más gordo y obliga a convertir en aéreo lo que debía ser soldado en placa. Es lo que hay, uno no es infalible.  :(
- JP2 no debe llamarse DISA17 tal y como pone en la placa, sino DISRAM, este es el jumper para deshabilitar la RAM del interface y habilitar la interna sin desconectar el interface.

CORRECCIONES NECESARIAS

Seguidamente os voy a exponer las correcciones necesarias para que el circuito funcione adecuadamente.

La primera corrección va encaminada a permitir la grabación de la memoria flash y consiste en la adición de un diodo que pone a nivel alto la señal /OE del chip cuando estamos intentando escribir. En el diseño original se ponía siempre a 0 cuando se accedía al chip y esto no es correcto en el caso de la escritura.

La segunda corrección es necesaria para añadir un reset a la GAL que controla la paginación. Como todas las patillas de dicha GAL estaban ocupadas he sacado fuera la funcionalidad que deshabilitaba la ROM con las señales A14, A15 y MREQ.

Por último es necesario puentear R27 para que funcione la deshabilitación de la RAM externa. Esto no es necesario si no os hace falta esta opción.

Al final las modificaciones consisten en la adición de 3 diodos (D17, D18 y D19) y unos cuantos cables que afean un poco el circuito.

Visto desde la parte de los componentes los cambios quedarían como sigue:



Si lo miramos desde la parte de las pistas, que es donde tenemos que soldar, los cambios quedarían así:



El listado de operaciones a realizar es el siguiente:

- Desoldar el ánodo de D15 y soldar un cablecillo desde el ánodo hasta la patilla 4 de IC10.
- Soldar el ánodo de D17 con el ánodo de D6 y el cátodo de D17 con el cátodo de D15.
- Soldar el ánodo de D18 con la patilla 13 de IC10 y el cátodo de D18 con el cátodo de D15.
- Soldar el ánodo de D19 con la patilla 7 de IC10 y el cátodo de D18 con el cátodo de D15.
- Soldar un cablecillo entre la patilla 14 de IC10 y la patilla 1 de IC3.
- Soldar un cablecillo entre los dos extremos de R27.

Las ecuaciones de lC10 ya están modificadas para incorporar estos cambios.

POSIBLES PROBLEMAS QUE NOS PODEMOS ENCONTRAR


He detectado que en algunos Spectrums, cuando conectamos el interface dejan de funcionar las dos semifilas superiores. Es decir, las teclas 1234567890.
El problema está provocado por el interface de joystick.
Como sabéis el protocolo Sinclair y el Protek/cursor, comparten puerto con las semifilas superiores, traduciendo los botones del joystick en teclas. Pues bien, los botones del joystick pulsados ponen el bit correspondiente a 0, mientras el resto se lleva a 1.

Estos unos son intencionadamente débiles para que si se pulsa una tecla en el spectrum esta pueda poner ese bit a 0. La forma en que se fuerza esa debilidad de los unos es mediante las resistencias R11, R12, R13, R14 y R23 de 1K5.
Este valor de 1K5 es el que se utilizaba en el interface comercial MHT Ingenieros y funciona en la mayoria de los spectrums, pero resulta que me he encontrado con algunos spectrums que este valor es insuficiente.

Supongo que debe ser problema de impedancia en la membrana, bien porque esté deteriorada o bien porque haya sido sustituida por otra de mayor impedancia.

La solución a este problema (solo en el caso de que aparezca) pasa por sustituir dichas resistencias por resistencias de 10K. En las pruebas empíricas que he hecho esto ha funcionado perfectamente.
Evidentemente yo no puedo probar con todos los spectrums existentes, pero en el caso de que dejara de funcionaros el joystick al hacer esta sustitución probad con un valor algo inferior, por ejemplo 4K7.


ADD-ON DE SELECCIÓN POR SOFTWARE


El add-on de selección por software consiste básicamente en sustituir la función de los jumpers JP3, JP4 y JP5 por una GAL que permita cambiar la ROM activa a través del puerto $043B (1083) mediante la decodificación parcial (bits A15,A7,A5,A1 y A0).

Es muy importante quitar los jumpers para pemitir que el add-on funcione.

En principio la idea era que el add-on consistiera sólo en una GAL con toda la lógica necesaria, pero debido a los conflictos que el divIDE tenía con el add-on se ha tenido que añadir circuitería adicional, que consiste básicamente en un chip de 4 puertas OR (74LS32), tres diodos y una resistencia de 4k7.

La plaquita se ha planteado para pinchar sobre el zócalo de la memoria flash, ya que allí tenemos la mayoría de las señales que necesitamos. Aun así hay algunas señales que tenemos que tomar de otros puntos de la placa, como son (A15, /WR, /IORQ, /RESET, /MREQ, BACK_MREQ, BACK_A15).

Empezaremos con el esquema de la plaquita y luego continuaremos con el cableado a la placa principal.





El método a utilizar será poner dos tiras de 16 pines en la parte inferior de un trozo de placa de prototipo para permitirnos pinchar sobre el zócalo de la memoria Flash.

En la parte superior desplazado ligeramente sobre las anteriores, soldaremos otras dos tiras de pines, pero esta vez hembra, para actuar de zócalo para la memoria flash.
Habrá que soldar ambos pares, pin a pin para asegurar la continuidad entre la memoria flash y su zócalo original.

Los pines los soldaremos entre si todos (los del zócalo superior con los de los pines de abajo), uno a uno excepto las señales ROMA14 y ROMA15 (patillas 29 y 3 de la memoria) que, como se ve en el esquema deben quedar separadas, ya que las filtraremos en la GAL generando dos nuevas señales ROMA14', ROMA15'
Una foto por debajo de cómo nos debería quedar (disculpad las feas soldaduras  =) ):





En el caso de las señales ROMA14 (patilla 29) , y ROMA15 (patilla 3), las señales que vienen de la placa deben conectarse a las patillas 8 y 9 de la GAL respectivamente, mientras que las señales que van a la memoria (ROMA14' y ROMA15') van a las patillas 18 y 19 de la GAL.

Una vez hecho esto, ya tenemos la posibilidad de soldar los cables necesarios entre un zócalo de 24 pines estrecho que soldaremos para la GAL y el nuevo zócalo que hemos improvisado para la memoria flash.
Para ello, seguiremos el esquema expuesto anteriormente.

Una vez hecho esto, ya pasaremos a hacer las conexiones de las señales que nos faltan con la placa principal.
El esquema a seguir para esos hilos es el siguiente:


Para permitir conectar y desconectar la placa yo he añadido una pequeña tira de 7 pines hembra que nos permitirá conectar un cable plano al que le he soldado unos pines al efecto.



No os añado una foto de como ha quedado el mío por no confundiros, ya que tengo muchas cosas innecesarias de tanto probar unas cosas y otras.

Algo que debéis tener en cuenta es que las señales A15 y /MREQ, al añadir el add-on, hay que desconectarlas del bus de expansión trasero, ya que la gal del add-on generará nuevas señales BACK_A15 y BACK_MREQ para conectar en el bus de expansión trasero.


Disculpad la mala calidad de la imagen, pero no he sido capaz de sacar una foto mejor desde tan cerca.

La idea es conectar las señales A15 y /MREQ en los pines que hemos levantado y BACK_A15 y /BACK_MREQ directamente sobre las pistas del bus de expansión.
Yo le he añadido un trocito de cinta termoretráctil al cable que va al pin para evitar que hagan contacto.

Por último deberéis grabar las ecuaciones en la gal del add-on.

Las ecuaciones de esta nueva GAL las tenéis aquí:


LISTADO DE COMPONENTES


JACK3,5mm_______________________________________SPEAKER IN, AUDIO OUT
C1-C9______________100nF________________________Condensadores cerámicos
C10-C12____________10µF_________________________Condensadores electrolíticos
C13,C14____________33pF_________________________Condensadores cerámicos
D1-D16_____________1N4148_______________________Diodo
IC1________________74HC138N__________DIL16______Decodificador 3 a 8 líneas
IC2________________74HC132N__________DIL14______4 puertas NAND de dos entradas
IC3________________74HC273N__________DIL20______FLIP-FLOP octal (tipo D)
IC4________________74HC74N___________DIL14______FLIP-FLOP dual (tipo D)
IC5,IC10___________GAL22V10D_________DIL24-3____Circuito lógico programable
IC6 _______________AM29F040B_________DIL32______MEMORIA FLASH 512Kb
IC7________________AY-3-8912_________DIL28______CHIP DE SONIDO
IC8________________BS62LV4007PC-70___DIL32______SRAM 512Kx8
J2,J3______________DB9-HEMBRA___________________CONECTORES DE JOYSTICK
JP1________________JUMPER____________DISA17_____DESHABILITACIÓN RAM 256KB (A17)
JP2________________JUMPER____________DISRAM_____DESHABILITACIÓN RAM DEL INTERFACE
JP3________________JUMPER____________ROMA16_____SELECTOR LINEA A16 DE LA ROM
JP4________________JUMPER____________ROMA17_____SELECTOR LINEA A17 DE LA ROM
JP5________________JUMPER____________ROMA18_____SELECTOR LINEA A18 DE LA ROM
JP6________________JUMPER____________DISA18_____DESHABILITACIÓN RAM 512KB (A18)
K3_________________PULSADOR__________NMI________PULSADOR DE NMI
K4_________________PULSADOR__________RESET______PULSADOR DE RESET
LED1_______________LED__________________________INDICADOR ESCRITURA ROM
QG3________________OSCILADOR_________DIL14S_____3_579545MHZ
R1,R32_____________1K8__________________________RESISTENCIA 1/4W
R2_________________820__________________________RESISTENCIA 1/4W
R3,15..22,29..31_____4K7__________________________RESISTENCIA 1/4W
R4,9________________1K___________________________RESISTENCIA 1/4W
R7,10,25,26_________10K___________________________RESISTENCIA 1/4W
R5,6______________100K___________________________RESISTENCIA 1/4W
R8,24______________470___________________________RESISTENCIA 1/4W
R11..14,23,27_______1K5___________________________RESISTENCIA 1/4W
S1_______________SPDT___________________________SELECTOR 1 POLO 2 VIAS
S2_______________DPDT___________________________SELECTOR 2 POLO 2 VIAS
VIDEO IN_________________________________________RCA HEMBRA
X1______________________________________________CONECTOR EDGE 28 PISTAS X 2
X2______________________________________________PLACA EXPANSORA DE BUS

ARCHIVOS DEL SISTEMA

Del siguiente enlace os podéis descargar los archivos que necesitaréis para programar las GAL y la memoria Flash.

También tenéis los esquemas y todos los fuentes de la versión.
Adjunto también las principales ROMs del +3 parcheadas para funcionar con el superupgrade.

Descargar

Hay que tener en cuenta que las ecuaciones de IC10 cambian desde la versión 0.4 que es la que corresponde a la placa. Es por ello que es imprescindible hacer las modificaciones en la placa para que funcione.

En la carpeta ROMs tenéis dos ROMSETs diferentes, además de los fuentes del BIOS.

En el caso de que hayamos fabricado el add-on podremos aprovechar al máximo las características de dichos ROMSETs, aunque de todas formas hay funciones que podemos aprovechar aun en el caso de que no hagamos el add-on

- ROMSET de testeo. Esta ROM nos permitirá realizar las pruebas iniciales para comprobar que todo funciona bien.
Consiste en un menú inicial y 31 copias de una ROM del Spectrum original. Si tenemos el add-on conectado, cuando arranquemos aparecerá el menú que nos permitirá seleccionar con que ROMSET y con con que ROM queremos arrancar.
En el caso de que no tengamos el add-on podremos seleccionar la ROM activa con los jumpers y pulsaremos reset.
El mensaje de inicio de las ROMs está modificado para mostrarnos que ROMSET y que ROM está activo.

- ROMSET de ejemplo. Este ROMSET tiene el BIOS instalado en la ROM0 y una serie de sistemas diferentes ya copiados. Si tenemos conectado el add-on podremos arrancar el sistema que queramos simplemente seleccionando la letra correspondiente a dicho sistema y luego pulsando Enter.
El conjunto BIOS/add-on no funciona bien todavía si tenemos conectado el divIDE y es muy probable que salga una nueva versión con modificaciones tanto en el hardware como en el software.
Para funcionar con los jumpers deberemos tener en cuenta que solo dispondremos de 8 sistemas simultáneos, aunque en este caso tendremos completa compatibilidad con el divIDE siempre que tengamos en cuenta lo siguiente:
- Cada ROM debe ocupar 64Kb.
- En el caso de las ROMs de 32Kb deberemos copiarlas dos veces en el SLOT deseado.
- En el caso de las ROMs de 16Kb deberemos hacer 4 copias.

Los juegos y sistemas incompatibles con el divIDE (como el Júpiter ACE) necesitarán desconectar o desactivar éste antes de arrancarlos.

MANEJO DEL BIOS



La pantalla principal del BIOS del superupgrade nos muestra un listado con las ROMs incluidas en la memoria flash.
Para arrancar una de ellas, seleccionaremos la letra correspondiente y pulsaremos "ENTER".

En la versión 0.2 del BIOS se ha añadido un submenú de utilizades, al que se accede pulsando "V" y "ENTER", desde el menú principal.



En dicho menú disponemos de utilidades para testear nuestro interface:
- TEST DEL TECLADO: nos mostrará visualmente las teclas que estamos pulsando y los tres bits superiores de cada semifila.
Para el teclado solo se usan los bits 0 a 4, mientras que el bit 6 es usado para la entrada EAR.
Para terminar el test pulsaremos BREAK.



- TEST DEL JOYSTICK: Nos permitirá hacer un test completo del joystick, pidiendo que pulsemos secuencialmente cada uno de los botones del joystick. Cuando lleguemos al test de Sinclair deberemos pulsar usar los dos joystick simultaneamente.
En el caso de que pulsemos "BREAK" pasaremos al siguiente botón aunque no hayamos pulsado el botón correcto.



- TEST DE RAM: Realizará un test del paginado de la RAM, indicando cuantas páginas de memoria tenemos disponibles.
No se trata de un test completo de la integridad de la RAM, ya que solo comprueba el paginado.



- TEST DE AUDIO: Hará sonar una escala musical por cada uno de los tres canales del AY.



- SELECCIÓN DE PÁGINA DE ROM: Esta opción está pensada para los usuarios que no inserten el add-on.



Recordemos que la memoria está dividida en bloques de 64Kb que son seleccionable por jumpers, y que en cada bloque de 64Kb nos caben 4 páginas de 16Kb.
Pues bien, si después de arrancar el menú cambiamos los jumpers a la ROM deseada, esta opción nos permitirá seleccionar la página de 16Kb que queremos ejecutar.
Una vez selecionada la página deseada, el sistema nos pedirá que pulsemos una tecla, tras lo que el spectrum se reiniciará ejecutando el programa contenido en la página seleccionada.

Alejandro Valero Sebastián (wilco2009)