viernes, 3 de julio de 2015

SUPERUPGRADE: USER MANUAL

SUPERUPGRADE: USER MANUAL



Interface’s features are the following ones:
  • Expansion 128/256/512kb of selectable RAM with Jumpers 
  • 2 connections of multistandard joysticks (Kempston, Sinclair, cursor)
  • Reset button
  • MNI button
  • 512kb flash memory wich contains a limit of 32 ROMS of different systems and games
  • AY sound chip
  • Audio input to mix the speaker’s sound with the AY’s sound
  • Composite video output
  • Bus expander
  • Compatible with DivIDE
  • Possibility of expanding with Add-on for ROM selection by software
  • Flash memory recording using Spectrum


As you can see, it's very close to convert it into a +3. The disk drive is the clearest lack, but it’ll come soon.

The main idea is making 128kb games which needn’t access to Floppy or which don’t use Shadow RAM work modes.

If we added an IDE interface or a divIDE, we would be able to execute the disk games too. With the expansion to 512kb some of the russian clone's games are likely to be executed.


BIOS ROM AND SELECTION OF ACTIVE ROM


Our interface’s flash memory has a capacity of 512kb. Taking into consideration that the smallest ROMS for Spectrum take up 16kb (as the rubber keys’ original one), that makes a total of 32 ROMs with the same size fit there.

Nevertheless, there are other versions such as the 128kb and the +2 grey which take  32kb and even +2a/+3 64kb, therefore, the quantity of ROMs we can have will change depending on the kind of ROMs we have in the chip.

The chip is divided in pieces of 16kb, each one of them can be recorded with the ROM we want, to keep  16kb memories, as well as the biggest ones of 32kb or 64kb.

Additionally, 16kb blocks come together in other bigger 64kb blocks, which we’ll call slots from now on, so we’ll have a total of 8 slots in the chip.

When it comes to keeping a 64kb ROM, we can’t start wherever we want, we have to take a slot, but with regard to 32kb ROMs, we should use either  the 0 and 1 ROMs of a concrete slot (lower semi-slot) , or the 2 and 3 ROMs of the slot (upper semi-slot)

The active slot is selectable with jumpers, JP3, JP4 and JP5, but we’ll need software aid if we want to select the 16kb block in a slot.

The system adds a ROM BIOS located in the first 16kb block. Although initially that ROM BIOS  was thought especially  for the rom’s selection by software with add-on’s  aid (which we’ll see later), some functions, which can be easily used in the interface’s  basic version, have been added. Among them we find the diagnostic tools and a really interesting option that will allow us to select the active ROM inside the slot we have selected with jumpers.

The space will be distributed as the one below:




BIOS USE



The Superupgrade Bios’ main screen shows us a list with the ROMs included in the flash memory.
To use one of them, we have to select the corresponding letter and press enter.

In  BIOS 0.2 version a tools submenu where we can access by pressing “V” and “ENTER”, from the main menu.



In this menu we have tools to test our interface:
-KEYBOARD TEST: it’ll show us visually the keys we’re pressing and  the three superior bits of each half row.
When it comes to the keyboard, we use bits 0 to 4, whereas bit 6 is used for the ear input. To finish the test we press BREAK.



-JOYSTICK’S TEST: it’ll allow us to make a complete joystick’s test, asking us to press sequentially each one of the joystick’s buttons. When we get to the Sinclair’s test we should press simultaneously both of the joysticks.

In case we press “BREAK” we’ll go on with the next button though we didn’t press the right button.



-RAM TEST: you’ll make the RAM paging test, pointing out how many memory pages are available.


It’s not about a full integrity RAM test, since it just checks the paging.


-AUDIO TEST: It’ll make a musical scale sound for each one of the three AY‘s channels.






-ROM’S PAGE SELECTION: this option is thought to be for those users that don’t insert the add-on.



Remember that the memory is divided in 64kb blocks which are selectable with jumpers, as well as each block of 64kb contents four 64kb pages.
If, after select the option, we change jumpers to the desired ROM, this option will allow us to select the 16kb page that we want to execute.
As soon as we select the desired page, the system will ask us to press a key and then spectrum will be restarted, executing the program contained in the selected page.
As an example to clarify it a little bit, we’ll include a table about jumper/rom’s position to be selected from the example set which has been sent prerecorded in the kit.
We’ll be able to change just around eight 64KB blocks (slots from now on), therefore, depending on jumper’s position, when we reset with the jumpers in a concrete posicion, the system will boot up with the ROM 0 of the selected slot.
To start up the other three slot’s  ROMs,  the ROMs’ selection option from the tools menu will be needed.

The jumpers aren’t in order so it may be a bit confusing its use. I’m adding a table down below in order to make it clearer:



As we can see there are some ROMs which take several 16kb blocks, so in this case it’ll only have sense to start up the first block of them. For instance, if we select the second ROM of the +3 the system will be probably hangs.

We see ,in the three first columns of the table,  The position jumpers must have to select a concrete slot.

For instance, the +2 grey  ROMs are in the Slot 2, so we’ll have to put jumpers in up, down, up positions, starting to count from the superior jumper of the three ones of the ROM’s selection.

For this ROM especially the selector won’t be needed, since it takes the 0 position of this slot. Putting the jumpers and pressing reset will be enough.

When it comes to a ROM which doesn’t take the 0 position of a Slot, we do need the selector. That’s the case of the Spectrum’s ROM, which is in the position 1 of the slot 0, so, with the jumpers in the down down up position, we’ll select the selection ROMs’ option and we’ll press the 1. As, in this case, we don’t need to MOVE jumpers, The 48Kb's ROM will appear pressing a button.

The Planetoids’s case is the same one, but in this case we’ll have to select the ROM2 in the ROMs’ change’s menu and we’ll have to press a button after moving jumpers to up up up position.

ADDING OUR OWN ROMS

The ROMs which are recorded in the chip are just an example.

We can replace them to the ones we want, but we should take into account the following instructions.

The ROMs should have precisely 16kb, 32kb, or 64kb. If we have a ROM of a game which takes up less SPACE, we have to complete it until 16kb with an hexadecimal editor.

The ROM BIOS must always take the first position.

From that BIOS we have a menu which will allow us start up the ROMs BY SOFT just if we have the add-on installed.

In the case we use the add-on, in the 0 ROM, we have certain parameters which we’ll have to modify for each one of the ROMs and they will show us how that programme will behave. 




These datum take a byte for ROM and they’re locared in $020E..$022D corresponding with the ROMs 0 to 31 ( BIOS is counted  too).

In the previous table we can see that the bits 0 to 4 of each one of the bytes show us the ROM’s order number (0…31), whereas the bits 5, 6 and 7 will allow us to define the ROM’s behavior.

The bits 5 and 6 allow us to deactivate the paging of the ROM totally or partly and they’re related to the ROM’s shape.

For instance, in the case of a speccy 48Kb ROM which takes a unique 16kb block we  would have to deactivate the paging completely. As we aren’t interested anymore in executing anything outside of that block of 16kb, so both bits have to be 1.

In the case of a ROM of 32kb we have to keep active the paging related to the $7FFD port which manages the change between block 0 and 1, but we’ll have to deactivate the change to the ROMs 2 and 3 which are managed with $1FFD port. Therefore, we’ll put bit 5 to 0 and bit 6 to 1.

Finally, in case of +3 ROMs, we’d better keep active full paging, so we’ll put both bits to 0.

Bit 7 will allow us to deactivate the divIDE for the cases when we want to start up a ROM , which is incompatible with divIDE, without needing to disconnect it.


Let’s use as an example the mentioned byte’s content for the example ROMSET’s ROMs:



The texts that will appear in the menu are located in $000F..$020E and they are made of a byte $0F and the text of the 15 characters long for each one of the options.

It’s important to be careful not to crush neither byte $0F nor the following option’s text.

The following table show us the beginning position of each one of the menu’s texts.



Once we have every file to include we have to gather them in the desired order, joining all of them with the command “COPY/B” or with a hexadecimal editor, checking that the final file has precisely 512kb (524.288 bytes)

I give you as an example the bat file I used to generate the file .bin to record:
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

If you don’t want to make it complicated, an easy way is using as a base the file that I’ve included as an example and modifying it with a hexadecimal editor.

If we use an hexadecimal editor, we have to take into consideration that the ROMs have to be in the following positions:




INTERFACE’S PORTS’ MANAGEMENT


For selection of ROM and RAM’s paging in 128Kb Specrtums are used $7FFD  (32765) and $1FFD (8189) ports.
The change of the ROM or RAM’s page is done passing the right value to the corresponding port with an OUT, taking into consideration that each bit of that value has the following meaning:


$7FFD port



-Bits 0..2  form a number of 3bits which allow us to select a page among the 8 possible of the RAM of the 128kb.

-Bit 3 is related with the shadow RAM and it permits to select the screen which will be visualized. Having bit 3 to 0 will ask the ULA to show the conventional screen, whereas if it’s to 1 it’ll mean that Shadow RAM will be shown. This feature isn’t supported in the interface.

-Bit 4 will allow us to select among the two possible ROMs in Spectrum 128k and the +2 GREY.
Remaining to 1 ROM of the 48kb is selected and to 0, 128kb’s.

In the case of the +2A/+3 another bit that we‘ll see later will be taken into account, making with the two of them a number of 2bits that will permit us to select one of the 4 ROMs available.

-Bit 5 will allow us to disable the pages.

-Bits 6 and 7 are not used.

$1FFD port:



-D0 bit will permit us to select the memory model of the +3 or the CPM

-If we have selected the CPM mode D1 and D2 bits will permit us to modify the distribuition of the RAM according to the following FACTS (This feature is not supported in interface):



-If bit 0 is equal to 0, D2 bit will be the high part of the selection of the ROM, with the D4 of the $7FFD port.

We can see this bit (D2 $1FFD) as a selection  of A or B chip inside the +3 and the D4 of the $7FFD as the selector of the chip’s  low or high part.

-D3 is used to activate or deactivate the disk’s motor.
-D4 is the parallel port’s strobe’s signal.
-D5 and D7 are not used.


Pagging in Pentagon

In Pentagon two more bits are added for the RAM’s page’s selection corresponding to D6 and D7 of $7FFD, leaving that port in the following way.



In our interface this page’s mode is supported having 5 bits (32 pages) for the page’s selection.

Pages’ distribution in the address space.

The address space taken by the selected page is generally $C000-$FFFF, but there are some pages that have a special treatment.

The exact distribution is sum up down below:




-Bank number 2 will be always visible in the rank $8000-$C000, but it will be also accessible in $C000-$F000 if we have page 2 selected.

-Bank number 5 corresponds with the $4000-$8000 screen’s memory in a +2/+3. In our interface it is not supported and it is one more bank. This could be implemented in the future according to the mcleod_ideafix instructions.

-Bank number 7 corresponds with ShadowRAM and its content will be visualized if D3 is to 1 in $7FFD port. In our interface is not implemented and bank 7 is not different to another one. Moreover, it’s impossible to implement without cutting some traces and without modify internally the Spectrum. Fortunately, there aren’t so much programs that get advantage of this feature, which in the other hand is really interesting.


Distribution of ROMs in the +3


In the +2/+3  4 ROMs come distributed in two chips (A and B), accumulating two ROMs each one of them.



In our interface, we accumulate the four ROMs in one and only slot, distributing its space in the following way:



It’s important to take into consideration that de table’s addressing is from the chip’s point of view, but the selected ROM will always access with the $0000-$3FFF standard directions’ rank.

Finally, a list about each ROM’s function:




Add-on $43B’s new port’s functionality

To be able to realize its function, add-on uses a new port which has been demanded to the ZXI specification group.
The port given to realize those tasks is $043B port.
This port is an only-wrtiting port and it has as a main functionality being able to select active the ROM inside the 512kb chip, as well as being able to deactivate divIDE and the standard pages with $1FFD and $7FFD ports.
Functionality is sum up in the following table:



Bits 0…1 would correspond with the ROM’s page and bits 2…4 with the slot’s number.

The ROM page’s change with this port will work even though pages were deactivated with $1FFD and $7FFD ports.

Bit 5 will allow us to deactivate pages with $7FFD port.

Bit 6 will permit us to deactivate pages with $1FFD port.

Bit 7 will allow us to deactivate divIDE. Actually what this port makes is screening /MREG and A15 signals avoiding THEM GOING TOWARDS THE EXPANSION BUS (PUTTING +5V), so its effect is that divIDE never detects that we are executing ROM’s directions. Therefore, it will never be activated though we have it connected.


SPECCY’S  SUPERGRADE’S BUS


Supergrade’s bus doesn’t coincide one by one on the front and back. The reason why it is like that is because there are some signals that are transformed to give them to the rest of the peripherals in a more convenient way for interface’s functioning.
I give you some descriptive tables of spectrum and supergrade’s bus down below, where we can see these differences.
Spectrum’s bus images have been borrowed from "El trastero del spectrum". :)








FLASH MEMORY RECORDING FROM SPECTRUM


We’re now in the middle of  the developing of a flash memory’s recording’s tool  from Spectrum.

The next program has been developed by antoniovillena  and it consists of a command's line software that, since a ROM’s file from up to 64kb, will generate a tap file ready to be executed in our Spectrum.


That tap file can be made into wav and charged by audio, or it can also be charged directly from divIDE.

If we decide to go for the charge by audio, a great idea would be update spectrum’s ROM (that it’s installed in 0 block, rom 1, in the example) with the cargandoleches ROM as a first step, and from that moment use it always to charge roms’ taps that we’re going to BURN in our flash.

In the folder we should have “SuperUpgrade.exe” file and “SuperUpgrade.bin” file.

Program’s syntax is in the following way:
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
That is, to generate a tap with +3 ROMS we would do the following:
SuperUpgrade hola.tap 0123 plus3en41.rom

Once the tap is generated, I can pass it to my divIDE’s CF or charge it by audio, and once the  spectrum is charged, a screen like the one below will appear:



In the case we have “Add-on”, we just have to press a key between 0 and 7 coinciding with the slot where we want to record ROM/s.

If, on the opposite, we don’t have Add-on , we have to change jumpers to the desired position and press a key.

Currently, our mate pachuquín is developing a frontend that firstly was thought to make easy the ROMSETs’ generation to record from a EPROMs’ recorder, but it will soon add antoniuovillena’s utility and it will permit us generate taps from a more friendly graphic interface.

viernes, 5 de junio de 2015

Reparando la ULA de un ZX-Interface 2

Hace algún tiempo que el amigo Fermars disponía de un IF2 con la ULA averiada, y comentándo en Va-De-Retro nos propusimos crear una ULA casera para poder sustituir este chip que es prácticamente imposible de conseguir hoy en día.

Dejamos el tema en espera durante algún tiempo, y el otro día retomamos el tema. Después de algunas pruebas a distancia, Fermars me envió el IF2 y este es el resultado.   :D



Y esta la caja cerrada con el conjunto dentro:


Lo primero que se necesita para poder abordar el tema es el esquema del interface:




Como se puede ver en el esquema anterior, el circuito es muy simple. Consta de una ULA que controla la gestión de los joysticks y el simple cableado para enrutar el slot de los cartuchos y la expansión del bus para la conexión de una zx-printer.

La gestión del joystick consiste en leer el estado de pulsación de los botones y direcciones del joystick y convertirlos en pulsaciones de teclas. Como decía antes, de esto se encarga la ULA, no interviniendo ningún otro circuito en el tema, por lo que utilizando una GAL, quizás podamos emular su funcionalidad..
La idea inicial era utilizar una GAL20v8 para sustituir a la ULA, pero al final me han hecho falta también algunas resistencias y diodos.

El esquema final es este (abrir en una pestaña nueva para ver en detalle):


Estos los archivos Eagle: Descargar

Y el archivo JED este otro: Descargar

Aquí tenéis los fuentes en ABEL HDL: Descargar

Lo primero que hice fue probar en una placa de entrenamiento casera.



Y después de algunos cambios las pruebas fueron satisfactorias.
La idea inicial era utilizar solo la GAL sin ningún componente adicional, pero enseguida me encontré con algunas dificultades.

La primera de ellas fue que la distribución lógica de la GAL no permitía dejar cada una de las salidas por separado en estado de alta impedancia sin consumir una patilla adicional. Esto era necesario, para no bloquear las semifilas superiores del teclado.
El tema es que hay que forzar solo los bits que son cero del bus de datos, que correponden con una tecla pulsada, ya que si forzamos los unos el teclado no podrá poner ceros en el bus y no nos funcionarán las dos semifilas superiores.

Este hecho me obligó a añadir diodos para dejar pasar únicamente los ceros. El resultado debería ser un OR entre las pulsaciones del bus y el teclado.

Otra conclusión es que no te puedes fiar de las resistencias internas de pull-up, porque si dejas desconectada una patilla se comporta como si fuera un registro, es decir conserva su último estado. Pienso que esto debe ser configurable por algún sitio pero no he encontrado la opción. Son por tanto necesarias las resistencias de pull-up de entrada correspondientes a las direcciones de los dos joystick.

Voy a exponer el comportamiento teórico que debe tener:

- Para que se habiliten las salidas debemos tener 0v en las siguientes señales: /RD, /IORQ, A0 y al menos una entre A11 y A12.

- La semifila de la izquierda "12345" es el primer joystick y utiliza el puerto $F7FE (1111 0111 1111 1110). Se identifica con la decodificación parcial A11=0 y A0=0. Se corresponden las siguientes teclas y botones de joystick:

- D0  = "Tecla 1" = LEFT1
- D1  = "Tecla 2" = RIGHT1
- D3  = "Tecla 3" = DOWN1
- D4  = "Tecla 4" = UP1
- D5  = "Tecla 5" = FIRE1

- La semifila de la derecha "67890" es el segundo joystick y utiliza el puerto $EFFE (1110 1111 1111 1110). Se identifica con la decodificación parcial A12=0 y A0=0. Se corresponden las siguientes teclas y botones de joystick:
- D0  = "Tecla 0" = FIRE2
- D1  = "Tecla 9" = UP2
- D3  = "Tecla 8" = DOWN2
- D4  = "Tecla 7" = RIGHT2
- D5  = "Tecla 6" = LEFT2

Si tenemos las resistencias colocadas en las entradas entre +5v y cada patilla, las entradas se mantienen a +5v en estado de reposo. Estos +5v son débiles gracias a la resistencia que hemos intercalado, por lo que cualquier pulsación de una de las direcciones o del botón de fuego conecta el pin con masa y lo lleva a 0v.
Mientras el ordenador no está consultando el teclado, la GAL mantiene en alta impedancia las salidas ya que no se cumple /RD=/IORQ=A0=0. En el momento en el que consulta, por ejemplo, la semifila izquierda /RD=/IORQ=A0=A11=0, momento en el cual las salidas copian el estado de las entradas, es decir, si teníamos pulsado LEFT1, tendremos su patilla a 0V y D0 tendrá 0V mientras que el resto de las entradas estarán a +5v gracias a las resistencias de pull-up, y por tanto las salidas D1,D2,D2 y D4 tendrán 5v (o algo parecido mayor que 2,5V).

Para la otra semifila será lo mismo pero se deberá cumplir /RD=/IORQ=A0=A12=0.

Al final, la lógica de la GAL se resume en lo siguiente:

DATAOE = (A0
     # IORQ
     # RD
     # A11 & A12);
D4 = (!RD & !IORQ & !A0 & A11 & !A12 & LEFT2
     # !RD & !IORQ & !A0 & !A11 & FIRE1);
D4.OE = (!DATAOE);
D3 = (!RD & !IORQ & !A0 & A11 & !A12 & RIGHT2
     # !RD & !IORQ & !A0 & !A11 & UP1);
D3.OE = (!DATAOE);
D2 = (!RD & !IORQ & !A0 & A11 & !A12 & DOWN2
     # !RD & !IORQ & !A0 & !A11 & DOWN1);
D2.OE = (!DATAOE);
D1 = (!RD & !IORQ & !A0 & A11 & !A12 & UP2
     # !RD & !IORQ & !A0 & !A11 & RIGHT1);
D1.OE = (!DATAOE);
D0 = (!RD & !IORQ & !A0 & A11 & !A12 & FIRE2
     # !RD & !IORQ & !A0 & !A11 & LEFT1);
D0.OE = (!DATAOE);
Lo anterior, en un lenguaje de descripción un poco más inteligible quedaría como sigue:
!DATAOE = !(RD#IORQ) & (!A0&!A11 # !A0&!A12);
Data.oe = !DATAOE;
when !(RD # IORQ) then {
"Sinclair Left
when !A11 & !A0 then {
Data = [FIRE1,UP1,DOWN1,RIGHT1,LEFT1];
}
"Sinclair Right
else when !A12 & !A0 then {
Data = [LEFT2,RIGHT2,DOWN2,UP2,FIRE2];
}
}

Como veis, la solución es bastante sencilla, pero no por ello menos interesante.

Espero que hayáis disfrutado con esta entrega, yo la verdad es que he aprendido bastante, y sobre todo he disfrutado con el desarrollo.

Ahora, por fin mi amigo Fermars puede volver a disfrutar de su Interface 2. 
Con lo anterior ya me doy por satisfecho, pero me encantaría saber que la publicación de estas líneas pueda ayudar a devolver a la vida a algún Interface 2 más que ya se había dado por muerto.

Un saludo y hasta la próxima.

Alejandro Valero (wilco2009)

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.