Ayuda con divIDE y cambio de ROM activa por soft
Publicado: Mié 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:
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ú.
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:
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.
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:
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:
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.