Ayuda con divIDE y cambio de ROM activa por soft

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Ayuda con divIDE y cambio de ROM activa por soft

Notapor wilco2009 el Mie Ago 13, 2014 8:55 pm

Como totalmente inexperto en ensamblador Z80, quería pediros ayuda sobre un tema un poco peliagudo.

Como algunos de vosotros sabréis estoy inmerso en un proyecto de un interface para convertir un 16Kb en un +3.
Dicho interface lleva además una memoria flash de 512Kb que permite tener múltiples ROMs, de tal manera que mediante selectores o un pequeño programa de arranque puedo arrancar con múltiples sistemas, desde un gomas hasta un +3, pasando por un 128Kb, un TK90 o simplemente un juego de cartucho.

La memoria de 512Kb la tengo dividida en bloques de 64Kb y cada uno de estos bloques, a su vez en subboques de 16Kb. Esto es así para permitir la estructura de un +3 en uno de esos bloques de 64Kb.

El interface lleva 3 jumpers que permiten seleccionar uno cualquiera de esos 8 bloques de 64Kb, pero no es posible seleccionar subbloques mediantes jumpers.

Con un pequeño añadido a la placa se puede hacer la selección de los bloques por software, a través del puerto $043B, con lo que añadiendo un pequeño selector en el subbloque 0,0 se puede cargar cualquier sistema de la Flash ya sea de 16, 32 o 64Kb.

El menú tiene este aspecto:

Imagen

El selector está probado y funcionando.....Bueno, siempre que no conectes un divIDE.

El problema del divIDE es que activa a piñón fijo la ROM3 estés en el bloque que estés, por lo que el sistema funciona bien si está seleccionado un +3 pero no funciona bien con un gomas.
Además el puñetero del divIDE necesita una ROM de sistema válida como ROM activa, por lo que tampoco funcionan los juegos, ni el menú de inicio.

Para salvar este escollo, he intentado hacer una pequeña ñapa.
El tema es dejar una ROM de gomas en el bloque 0,3 modificando el salto que tiene en la ROM para que salte a una zona controlada a partir de $3900 que en principio está sin usar.
En dicha zona copio un pequeño fragmento de código a la RAM y desde ahí hago un par de outs para cambiar a la ROM 0,0, tras lo cual hago un jp 0 para ejecutar mi menú.

Código: Seleccionar todo
ORG $3900

   LD BC,FIN_CAMBIA_ROM-CAMBIA_ROM
   LD HL, CAMBIA_ROM
   LD DE,30100
   LDIR
   CALL 30100

CAMBIA_ROM:
      ld hl,0
      ld a,(hl)
      ld bc,$7FFD
      out (c),a
      
      ld hl,0
      ld a,(hl)
      ld bc,$1FFD
      out (c),a

      ld hl,0
      ld a,(hl)
      ld bc,$043B
      out (c),a
      jp $0
FIN_CAMBIA_ROM:

END



Con este método, en teoría, puedo incluso aprovechar el hueco de la ROM3 ya que cuando selecciono la ROM del gomas simplemente tengo que saltar a la rutina de NEW directamente en lugar de a la posición 0.

Pues bién, para depurar esto estoy utilizando un emulador, con la ROM del +3 y emulando el divIDE

He hecho la prueba y medio funciona, pero no va bien.
Después de inicializar el divIDE me sale la imagen siguiente:

Imagen

Si selecciono la ROM 3 (la única que puedo probar por este método), el sistema arranca correctamente como un gomas, pero no funciona el botón de NMI.

¿Tenéis idea de las direcciones de la ROM que tengo que respetar para que me siga funcionando el divIDE?

¿Qué es lo que debería tener en cuenta para conseguir que me funcione como yo quiero?

Os agradecería muchísimo que me echarais un cable.
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Ayuda con divIDE y cambio de ROM activa por soft

Notapor wilco2009 el Jue Ago 14, 2014 3:23 pm

Al final he conseguido que me arranque el menú, pero dándole un montón de vueltas al asunto y enrevesandolo demasiado.

Lo que he hecho es tener una copia del menú de arranque en la ROM1 y modificar la ROM3 para que llame a la posición $3900.
En la posición 3900 copio a RAM un pequeño programita que se encarga de cambiar a la página 1 y copiar el menú de arranque integro en RAM.

Hasta ahí bien, he conseguido que arranque el menú.
Arranca primero el kernel del divIDE, me cambia a la página 3 y cuando llega a la posición $0005 llama a mi programita instalado en $3900, el cual se encarga de cambiar de página, copiar a RAM y arrancar el menú.

Pero me sigue dando incompatibilidad cuando intento arrancar desde el menú ROMs tipo juegos o cosas así, ya que, cuando hago un jp 0 para que arranque el juego, inexorablemente aparece el kernel del divIDE y se cuelga el Spectrum

¿Conocéis alguna manera de deshabilitar y habilitar el divIDE por software? :?
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Ayuda con divIDE y cambio de ROM activa por soft

Notapor mcleod_ideafix el Mie Ago 20, 2014 6:02 pm

wilco2009 escribió:¿Conocéis alguna manera de deshabilitar y habilitar el divIDE por software? :?

Mmmmm..... me temo que no. De hecho, en el ZX-Uno, si seleccionas una ROM de un juego como ROM de arranque, y el DivIDE está activado, tienes el mismo problema. Sencillamente, el DivIDE está pensado para ser usado con la ROM del Spectrum (o alguna que sea compatible) y con ninguna otra.

Lo más que puedes hacer es, desde el selector, o desde el juego mismo, detectar si el DivIDE está activo, y en tal caso, pedir al usuario que quite el jumper E para deshabilitar la ROM del DivIDE, y a continuación pulse una tecla para comenzar el juego propiamente dicho. Esto es lo que se hace, por ejemplo, en el emulador de PacMan para +2A, que usa el modo all-RAM y por tanto es incompatible con el DivIDE.
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Ayuda con divIDE y cambio de ROM activa por soft

Notapor wilco2009 el Mie Ago 20, 2014 11:09 pm

Gracias por la respuesta mcleod.

Estuve hablando con VELESOFT y me dio alguna idea al respecto.
La idea consiste en modificar el hardware para inhabilitar la señal /MREQ del bus trasero de tal forma que el divIDE no detecte que estamos ejecutando direcciones en la ROM.
También hay que ignorar las señales /ROMCS , ROMOE1 y ROMOE2, aunque esto último no estoy convencido de que sea necesario.

Al final tengo desarrollado el diseño pero todavía no lo he llevado a la práctica, ya que ando liado con unas pequeñas utilidades de testeo del prototipo que voy a incluir en el BIOS.

Te copio el mensaje que postee en va-de-retro dirigido a VELESOFT para que le echara un ojo al diseño, pero a este no me ha contestado.

¿Qué te parece a ti?

By other hand, I made some changes in the add-on.

I have added more functionality to the port $043B.

D0..D4: 16Kb ROM block (D0,D1-ROM Page, D2..D4- 64Kb ROM block)

D5: Disable $7FFD ROM Paging (DIS_ROMA14)
D6: Disable $1FFD ROM Paging (DIS_ROMA15)

D7: Disable divIDE (DIS_DIVIDE)

The way it will work will be as following:

-1 When reset DIS_A14, DIS_A15 and DIS_DIVIDE will set to 1.
-2 BIOS ROM will work without problem because divIDE is not active.
-3 In BIOS ROM we have a list of ROMs, and for each ROM we will have:
----3a) Description
----3b) Position in flash ROM (0..31)
----3c) ¿divIDE disabled?
----3d) ROM size in 16Kb blocks
------------If Size = 1 then DIS_A14 = 1 and DIS_A15=1
------------If Size = 2 then DIS_A14 = 0 and DIS_A15=1
------------If Size = 3 then DIS_A14 = 1 and DIS_A15=0

When we will select a ROM, the BIOS program will activate, divIDE and ROM pagging as is configured for the selected ROM, and then will change page ROM and jump to 0.

Pressing Reset disables ROM pagging and divIDE and activates BIOS (16Kb block 0).

Some Hardware modifications on the add-on are needed:

Imagen

And the equations for the add-on GAL:

Código: Seleccionar todo
DISABLE_ROMA14     = !(  COND & !COND2 & !D5 & RESET & !COND3
                      #   !COND & RESET & !DISABLE_ROMA14
                      #   COND2 & RESET & !DISABLE_ROMA14
                      #   RESET & COND3 & !DISABLE_ROMA14 );

DISABLE_ROMA15     = !(  COND & !COND2 & RESET & !COND3 & !D6
                      #   !COND & RESET & !DISABLE_ROMA15
                      #   COND2 & RESET & !DISABLE_ROMA15
                      #   RESET & COND3 & !DISABLE_ROMA15 );

DIS_DIVIDE     = !(  COND & !COND2 & RESET & !COND3 & !D7
                  #   !COND & RESET & !DIS_DIVIDE
                  #   COND2 & RESET & !DIS_DIVIDE
                  #   RESET & COND3 & !DIS_DIVIDE );

ROMA14_2     = (  COND & !COND2 & RESET & D0 & !COND3
                #   ROMA14_2 & DISABLE_ROMA14
                #   ROMA14 & !DISABLE_ROMA14 );

ROMA15_2     = (  COND & !COND2 & RESET & D1 & !COND3
                #   ROMA15_2 & DISABLE_ROMA15
                #   ROMA15 & !DISABLE_ROMA15 );

ROMA16     = (  COND & !COND2 & RESET & !COND3 & D2
              #   !COND & RESET & ROMA16
              #   COND2 & RESET & ROMA16
              #   RESET & COND3 & ROMA16 );

ROMA17     = (  COND & !COND2 & RESET & !COND3 & D3
              #   !COND & RESET & ROMA17
              #   COND2 & RESET & ROMA17
              #   RESET & COND3 & ROMA17 );

ROMA18     = (  COND & !COND2 & RESET & !COND3 & D4
              #   !COND & RESET & ROMA18
              #   COND2 & RESET & ROMA18
              #   RESET & COND3 & ROMA18 );


Where
COND = pin 3
COND2 = pin 1
COND3 = pin 2

@VELESOFT: Some suggestions about it before start with the hardware?
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Ayuda con divIDE y cambio de ROM activa por soft

Notapor wilco2009 el Sab Ago 23, 2014 11:37 pm

Hoy he tenido un momento y lo he comprobado.
Confirmado, poniendo a +5V la patilla /MREQ trasera del interface el divIDE se desactiva por completo!! :D :D :D

Así que mi esquema debería de funcionar, y probablemente no es necesario tocar ROM1OE/ROM2OE/ROMCS. :D
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Ayuda con divIDE y cambio de ROM activa por soft

Notapor wilco2009 el Mar Ago 26, 2014 3:57 pm

Por fin lo he conseguido. :D :D :D :D

Basicamente las ecuaciones anteriores me han servido. Lo unico es que he tenido que capturar A15 ademas de /MREQ, ya que si no lo hacia me arrancaba el divide a la segunda vez que ejecutaba algo en la ROM incluso aunque tuviera +5v en /MREQ.

Os dejo un video del cacharro funcionando:
http://youtu.be/ndh6vFkZ_EM
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron