ZX-Uno prototipo 2: seguimos dándole caña

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor Quest » 28 Jun 2015, 01:35

Antes de nada, que conste que no estoy en contra de que se haga esto en ESXDOS, de hecho cuantas más funcionalidades se tengan, mejor (independientemente de bajo qué "cosa" funcionen) sólo he dado una opinión (en la cual no soy el único, por cierto). Es más, voy a extender mi valoración inicial, para añadir que me parece bien que se haga, pero que no sea de forma exclusiva, es decir que no haya otro modo de usar ciertas características interesantes.

mcleod_ideafix escribió:Dependemos de un montón de software "de terceros" para que ZX-Uno sea ZX-Uno. Para empezar, el ISE de Xilinx.


Tío, no me hiles tan fino, que sabes perfectamente a lo que me estaba refiriendo. El ISE lo usáis los que desarrolláis, no el usuario. No creo que haga falta aclarar más este punto.

mcleod_ideafix escribió:Sólo si quieres actualizar tú el ESXDOS, y en caso de que así sea y la nueva versión sea incompatible en API con la anterior, se cogen las utilidades, que para eso dejamos los códigos fuente y se modifican. Habida cuenta del tiempo que pasa entre una actualización y otra de ESXDOS, me da que cambios de release, poquitos.

Estupendo, dile al usuario que se modifique y se compile el código. Puede que no sea "casual", pero tampoco tiene por qué ser técnico.
Respecto a los cambios de release, cierto, pero probablemente el ZXUNO salga antes del cambio de LFN (para mi gusto MUY relevante), y no solo yo, sino la mayoría va a querer tener ese soporte. Me juego una mano ;) El resto.. un misterio.

mcleod_ideafix escribió:La cantidad "nada despreciable" de demos, ¿cuántas son? Porque sólo me he encontrado con una que le pase eso. Por el contrario, sí que hay una cantidad nada despreciable de demos que si no tienes ESXDOS y su emulación de TRDOS, no vas a ver ni en pintura, porque no tienen versión TAP y sí TRD.


Ya, pero no recuerdo haber dicho nunca jamás que haya que eliminar ESXDOS (muy al contrario). ¿por qué diantres íbamos a dejar de usarlo para cargar TRDs? no lo entiendo.

mcleod_ideafix escribió:Y el problema con los juegos mojonios y similares no es que ESXDOS interfiera, sino que al arrancarse la máquina en modo 48K, aunque tengas los 128K y lo demás, no tienes las variables del sistema que siguen a los valores de los puertos. La demo de Paralaktica no tiene ningún problema con ESXDOS, por cierto: tanto la versión TRD como la TAP, con los timmings de 128K, las arranco desde ESXDOS.


Vale, entonces ahora tú, yo y los probables 20 o 25 usuarios que leen este hilo lo sabemos. Eso es irrelevante. Cuando uno carga y no va, y no es técnico (Aunque no sea tampoco "casual"), no tiene por qué saber el motivo.

mcleod_ideafix escribió:Y por último: recordad que esto es una plataforma. Cada uno la personaliza como quiere. No es el Vega: enchufar y listo. Esto no va encaminado al usuario "casual" aunque se le dan muchas facilidades a los usuarios que sólo quieran jugar. De hecho, ESXDOS y su menú NMI es lo más sencillo que le puedes echar a un usuario.


Sin duda. Pero reitero que el no ser "casual" no implica que se sea técnico. En cualquier caso coincido contigo con respecto a ESXDOS y su NMI. Es lo mejor que hay ahora mismo. Insisto, ¿Alguien ha dicho que haya que eliminarlo?

mcleod_ideafix escribió:Antonio pensaba dar soporte de keymaps en la BIOS para que cada uno puede elegir el suyo en el arranque. La facilidad hardware esta ahí (el poder cambiar de mapa). Ahora hay que implementar el software. No sé vosotros, pero yo no tengo la necesidad de cambiar de mapa cada dos por tres. Tengo el que me gusta y ya está. En FPGA sólo cabe un mapa, no puedes tener más de uno metido en BRAM, porque como ya he comentado, hasta no tener implementado el scandoubler no sabré cuánta BRAM me quedará libre.
[/quote]

Bueno, tú lo has dicho, tú no tienes la necesidad de cambiar el mapa. Quién sabe el resto. Yo por ejemplo (aunque sea irrelevante, lo comento porque casualmente lo cambio mucho ahora), lo cambio porque tengo un miniteclado (de los que ocupan un palmo de ancho) que uso cuando pongo el ZXUNO en el escritorio donde tengo poco espacio y tiene la distribución US. Afortunadamente gracias a tu implementación reciente de los keymaps puedo activarlo con el plugin de ESXDOS. Cuando uso el ZXUNO en un lugar con más espacio uso un teclado completo con mapa ES.

Respecto a la cantidad de mapas, justo en el post anterior Antonio ya se ha pronunciado al respecto. Me parece interesante.
Con respecto al scandoubler, por supuesto me parece más importante. No obsante no parece que sea ya un obstáculo por lo mencionado justo en la línea anterior.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor mcleod_ideafix » 28 Jun 2015, 01:37

antoniovillena escribió:McLeod, si no es muy complicado, ¿podrías implementar esa NMI especial que te comenté?. Te recuerdo. Es como una NMI normal. Tiene asociado un registro indicador de fuente de interrupción, que podría ser algo así:

-bit 0: el origen fue que el reproductor PZX vació su buffer
-bit 1: el origen fue pin 5 del joystick
-bit 2: el origen fue pin 9 del joystick
-bit 3: el origen fue F7
-bit 4: el origen fue F8
-bit 5: el origen fue F9
-bit 6: el origen fue F11
-bit 7: el origen fue F12

Si al saltar la NMI el valor de este registro es 0, se produce una NMI normal. Si por el contrario, algunos de estos bits (uno o más) vale 1, salta la NMI especial, que es como la normal pero con BOOTM a 1. La instrucción RETN siempre retornará con BOOTM a 0 (independientemente del tipo de NMI que se produzca). Es tarea de la RTI detectar el evento disparador y resetear el registro indicador.


Esto puedo hacerlo sin tocar el T80, pero de lo del buffer del PZX olvídate :P El reproductor PZX es un experimento, y queda chulo y tal, pero no es algo en lo que vaya a trabajar más de momento. La implementación que tengo es limpia, y el uso de una memoria externa la simplifica mucho.

En los mapas hay unas "acciones de usuario" que pueden usarse para estas cosas. No hay necesidad de hacer un mapeado "hard" a las teclas que dices, sino que se puede usar cualquier combinación que quieras. Hay espacio para cinco acciones de usuario, cosa que debería ser bastante para esto (vamos, entiendo que la configuración "en caliente" es una única rutina con lo que accedes por una tecla, no por varias).

La cosa es.... la ROM que se hará cargo de esa NMI.... ¿dónde estará? Hay que tener una página más de RAM (hay algunas no usadas) que será la que aparezca cuando esta nueva NMI se active. Por decir una, digo que sea la página 13, que es la página que sigue a la que tiene la ROM de ESXDOS.

Así pues, mi "contrapropuesta" es:
- Modo NMI disparable con hasta 5 teclas personalizables por el usuario mediante el mapa, o mediante los pines sin asignar del joystick. El registro $08 de ZX-Uno (NMIEVENT) indica con sus bits a 1 qué evento produjo la NMI.
- La NMI hace que se pagine automáticamente el banco 13 de la SRAM al espacio de ROM (0-16383). Para no complicar las cosas, el banco 13, cuando está paginado, permite la escritura en él. Así puedes poner variables donde quieras dentro de esos 16K. El bit BOOTM se pone a 1 para permitir el uso de la SPI Flash. La paginación se produce durante el ciclo de aceptación de la interrupción, por lo que la primera instrucción leída en 0066h es de la nueva ROM.
- Un reset de cualquier tipo resetea a la máquina, despaginando antes esta memoria.
- Esta NMI no se puede disparar mientras BOOTM valga 1.
- La instrucción RETN despagina esta ROM, dejando la que estaba antes, y pone BOOTM a 0.

Los detalles del nuevo registro NMIEVENT, aquí:
http://www.zxuno.com/index.php/ZX_Spect ... _de_ZX-Uno
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor antoniovillena » 28 Jun 2015, 02:00

mcleod_ideafix escribió:Así pues, mi "contrapropuesta" es:


<rX

mcleod_ideafix escribió:- Modo NMI disparable con hasta 5 teclas personalizables por el usuario mediante el mapa, o mediante los pines sin asignar del joystick. El registro $08 de ZX-Uno (NMIEVENT) indica con sus bits a 1 qué evento produjo la NMI.


Perfecto. Si haces que el NMI se dispare sólo cuando esté a cero podemos usar el mismo registro para enmascarar. Me explico: la RTI detecta el origen de la interrupción con este registro, y luego lo pone a cero para permitir una posterior interrupción. Así por ejemplo si ponemos a $ff este registro es como si inhabilitáramos todas las interrupciones de este tipo.

mcleod_ideafix escribió:- La NMI hace que se pagine automáticamente el banco 13 de la SRAM al espacio de ROM (0-16383). Para no complicar las cosas, el banco 13, cuando está paginado, permite la escritura en él. Así puedes poner variables donde quieras dentro de esos 16K. El bit BOOTM se pone a 1 para permitir el uso de la SPI Flash. La paginación se produce durante el ciclo de aceptación de la interrupción, por lo que la primera instrucción leída en 0066h es de la nueva ROM.


Esto implicaría un nuevo modo de paginación, y por tanto más hardware. Lo óptimo sería usar el mismo banco donde está el bootloader. Este banco está implementado con BRAM. Si estás escaso de BRAM me conformo con 8K de los 16K del banco. Lo he pensado bastante y a pesar de que sea más difícil de actualizar (requiere cambiar el bitstream) es mejor tenerlo aquí. Lo único es que esta memoria debe ser escribible para almacenar aquí registros y algún segmento de pantalla que queramos restaurar. No quiero tener que paginar para guardar las cosas en otro sitio.

mcleod_ideafix escribió:- Un reset de cualquier tipo resetea a la máquina, despaginando antes esta memoria.


Como te he dicho no tienes que paginar nada nuevo. En BOOTM=1 teníamos el bootloader, ahora tenemos bootloader+rti funciones NMI especiales. Un reset de cualquier tipo pondría PC=0, con lo que saltaría al bootloader y reiniciaría la máquina.

mcleod_ideafix escribió:- Esta NMI no se puede disparar mientras BOOTM valga 1.


Me parece perfecto.

mcleod_ideafix escribió:- La instrucción RETN despagina esta ROM, dejando la que estaba antes, y pone BOOTM a 0.


Como digo antes no hace falta ninguna paginación especial, el hecho de poner BOOTM a 0 quita la BRAM donde estaba el bootloader y pone la SRAM (de 8 a 11) correspondiente a la ROM paginada.

mcleod_ideafix escribió:Los detalles del nuevo registro NMIEVENT, aquí:
http://www.zxuno.com/index.php/ZX_Spect ... _de_ZX-Uno


Ok. Le echo un vistazo.

Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor Quest » 28 Jun 2015, 02:19

antoniovillena escribió:Muchas gracias por el betatesting. Pues me temo que la única solución es depurarlo en la máquina real, pero eso va a tardar un poco.


Por cierto, si hay algo en lo que pueda ayudar, lo que sea, para depurar, me dices. Dentro de mis cortas posibilidades, claro. Lamentablemente tengo más tiempo libre del que quisiera.

Si tu me dices "cambia estas lineas cada vez que pruebes X y anotas el resultado", etc, etc.. pues eso.

Si no, pues nada, pero si puedo hacer algo, estoy a disposición.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor antoniovillena » 28 Jun 2015, 02:26

antoniovillena escribió:
mcleod_ideafix escribió:Los detalles del nuevo registro NMIEVENT, aquí:
http://www.zxuno.com/index.php/ZX_Spect ... _de_ZX-Uno


Ok. Le echo un vistazo.


Mucho mejor con teclas disparadoras configurables.

Quest escribió:Por cierto, si hay algo en lo que pueda ayudar, lo que sea, para depurar, me dices. Dentro de mis cortas posibilidades, claro. Lamentablemente tengo más tiempo libre del que quisiera.

Si tu me dices "cambia estas lineas cada vez que pruebes X y anotas el resultado", etc, etc.. pues eso.

Si no, pues nada, pero si puedo hacer algo, estoy a disposición.


Desgraciadamente el código no está muy legible que digamos y depurar en máquina real implica mostrar un borde o valores hexadecimales por pantalla. Como lo único pendiente por depurar en máquina real es la grabación SPI con reintento, puedo seguir desarrollando con ZEsarUX el resto de características. De todas formas muchas gracias por el ofrecimiento (y por haber probado los 2 últimos cambios).

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor mcleod_ideafix » 29 Jun 2015, 02:19

Ea, pues ya está (eso creo). Es el fantástico y curradísimo
TEST 17

Este core tiene las siguientes novedades:
- Registro SCRATCH. No hace nada especial. Es un registro de 8 bits que el usuario puede escribir y leer cuando le plaza. La única cosa es que la FPGA nos asegura que cuando está acabada de encender, o sea, el primer reset, ese registro vale 0, y si se escribe otro valor en él, permanece aunque hagas un reset o un master reset. Sirve para que la BIOS pueda distinguir entre un reset por arranque de un reset por teclado. Viene a sustituir el otro método en el que detectas si se ha pulsado BkSpace o no al principio de la BIOS para hacer la espera más larga o más corta. Se supone que la BIOS pone a este registro con un valor distinto de 0 antes de abandonarla. El significado que se le dé al valor que se escribe dependerá por tanto de lo que la BIOS haga con él.
Entre las cosas que se hacen solo una vez versus las que se hacen en cada máster reset, está, aparte de lo de la pausa más larga, el mandar el comando RESET al teclado.
- Registro NMIEVENTS. Ya hemos hablado de él.

Estos dos registros están ya documentados en la wiki.

Hay un cambio importante respecto de las especificaciones iniciales. Afecta a la forma en la que se detecta el fin de la NMI. Resulta que detectar cuándo se ejecuta la instrucción RETN (opcodes ED 45) es más complicado de lo que pensaba, porque esto implica "snifar" el bus de datos cuando se va a buscar una instrucción, pero la memoria tarda un tiempo variable en entregar el dato desde que la dirección es válida, y la CPU además no lo lee hasta pasado un ciclo y medio de reloj (o algo así). Total, que mi circuito de detección de dato no funciona correctamente y no me he querido complicar más la vida, así que lo he cambiado por un circuito que decodifica cuándo se ejecuta una instrucción en cierta dirección de memoria.

Esa cierta dirección de memoria es la 006Ah. Después de que se lea el opcode de una instrucción en esa dirección, la ROM NMI es desactivada automáticamente.

La idea es que la rutina NMI que se haga tenga esta pinta:

Código: Seleccionar todo

0066h:  JP 006Bh
0069h:  RETN
006Bh:  verdadero comienzo de la NMI
...
...     aquí tu rutina
...
        JP 0069h  ;Saltar al fin de la NMI


Si se salta a esta rutina NMI, ten por seguro que habrá al menos un bit del registro NMIEVENTS a 1.

Para hacer un poco más sencillo el tema del testeo del core, y poder probar rutinas NMI sin necesidad de guardarlas en la flash y tener que modificar la BIOS, he cambiado un poquito las especificaciones: la página de SRAM que aparece como ROM durante esta NMI no es la 13 (que es la que será de verdad) sino la 7. Es decir, que desde el ordenador puedes volcar ROM's o lo que quieras a la página 7 y probar su ejecución pulsando la tecla asociada al "evento de usuario 1", que es la tecla F12. Mira el fichero genkeybmap_es.c(al final) para ver cómo he añadido la tecla F12.

Tienes un fichero TESTNMI.ASM con el código fuente de una pequeña rutina para NMI que unicamente muestra un banner que dice "PAUSE", espera a que se pulse cualquier tecla, y vuelve. Este test lo cargas de la manera habitual (bien con ESXDOS, bien con CargandoLeches), lo ejecutas y a partir de ahí, F12 conmuta a la ROM que se ha volcado en la página 7.

Puedes probar que funciona con cualquier programa que NO use los 128K de RAM, obviamente. Una vez que tengas implementado en BIOS el cargar algo en la ROM NMI (la podemos llamar así), se vuelve a cambiar en la descripción para que use la página 13.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor antoniovillena » 29 Jun 2015, 02:55

Ok. Voy a tener poco tiempo al principio de la semana por motivos ajenos (tengo que buscar piso), por lo que lo haré a mediados/finales de semana.

Respecto a la forma de detección del RETN, me parece una solución ingeniosa, estoy de acuerdo. En cuanto a usar la página 7 (o la 13) no me parece óptimo. Te explico mis razones, aunque después de meterte en todo este fregao me doy por satisfecho con la decisión que tomes. Saltar a la BRAM del bootloader hace más simple y ortogonal la arquitectura. De la misma forma que un MASTER RESET extiende a un RESET, una NMI Especial extiende a una NMI. Por otro lado con BOOTM=1 tengo accesible toda la SRAM, por lo que puedo saltar a la SRAM 7, o a la 13 sin más que paginar a $C000 y saltar.

Es más, si me pongo en plan purista sólo necesito agregar 5 bytes más al bootloader, asegurándome claro de que mastermapper apunte a la página 7 antes de salir de la BIOS:

Código: Seleccionar todo

0066h:  JP $C000
0069h:  RETN


Por esa razón te digo que no hace falta que añadas un modo de paginación especial (SRAM 7 en $0000), con el que hay me apaño.

-- Actualizado 29 Jun 2015, 02:06 --

El nuevo bootloader.asm sería el siguiente:

Código: Seleccionar todo

      macro wreg  dir, dato
        rst     $30
        defb    dir, dato
      endm

        output  bootloader.rom
        define  zxuno_port      $fc3b
        define  master_conf     0
        define  master_mapper   1
        define  flash_spi       2
        define  flash_cs        3
        di
        ld      bc, zxuno_port + $100
        wreg    flash_cs, 1     ; desactivamos spi, enviando un 0
        ld      sp, $c000-17
        ld      a, $0a          ; byte mas significativo de direccion
        wreg    master_mapper, 8  ; paginamos la ROM en $c000
        wreg    flash_cs, 0     ; activamos spi, enviando un 0
        wreg    flash_spi, 3    ; envio flash_spi un 3, orden de lectura
        out     (c), a          ; envia direccion 0ac000, a=0a,h=c0,l=00
        ld      de, $e961       ; tras el out (c), h de bffc se ejecuta
        push    de              ; un jp (hl) hl=0 para iniciar la nueva ROM
        ld      d, (hl)         ; en $bffc para evitar que el cambio de ROM
        push    de              ; colisione con la siguiente instruccion
        add     hl, sp
        out     (c), h
        out     (c), l
        dec     hl              ; Primera lectura que se descarta...
boot    ini
        inc     b
        cp      h               ; compruebo si la direccion es 0000 (final)
        jr      c, boot         ; repito si no lo es
        dec     b
        out     (c), h          ; a master_conf quiero enviar un 0 para pasar
        inc     b               ; a modo normal, pero el ultimo out lo ubico
        jp      $bffd-17

rst30   pop     hl
        outi
        ld      b, (zxuno_port >> 8)+2
        outi
        jp      (hl)

        block   $0066-$
        jp      $c000
        retn

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor mcleod_ideafix » 29 Jun 2015, 03:52

antoniovillena escribió:En cuanto a usar la página 7 (o la 13) no me parece óptimo.

Es óptimo desde el punto de vista del hardware. Primero: la BRAM es un recurso precioso, y de SRAM tenemos de sobra. Esta es de hecho la principal razón. Segundo: el manejo de la RAM está centralizado en un módulo que va asignando cachos de la SRAM a una parte u otra del espacio de direcciones de la CPU, con lo que sólo he tenido que meter un "else if" en ese módulo. Esto no es que sea mucho más complejo con la BRAM, si se usa como BRAM la que tiene al bootloader, y se mete en ella la NMI, pero entonces, ¿cómo harías para que se pudiera grabar una nueva versión de la ROM NMI desde la BIOS?

antoniovillena escribió:Por otro lado con BOOTM=1 tengo accesible toda la SRAM, por lo que puedo saltar a la SRAM 7, o a la 13 sin más que paginar a $C000 y saltar.

Ok, pero.... ¿por qué necesitas BOOTM a 1? Si es por el acceso a la flash, no necesitas BOOTM a 1. Por otra parte, ¿qué quieres hacer desde esta NMI que implique el poder ver a toda la memoria con el MASTERMAPPER?

antoniovillena escribió:Es más, si me pongo en plan purista sólo necesito agregar 5 bytes más al bootloader, asegurándome claro de que mastermapper apunte a la página 7 antes de salir de la BIOS:

Código: Seleccionar todo

0066h:  JP $C000
0069h:  RETN


Por esa razón te digo que no hace falta que añadas un modo de paginación especial (SRAM 7 en $0000), con el que hay me apaño.

-- Actualizado 29 Jun 2015, 02:06 --

El nuevo bootloader.asm sería el siguiente:

Código: Seleccionar todo

      macro wreg  dir, dato
        rst     $30
        defb    dir, dato
      endm

        output  bootloader.rom
        define  zxuno_port      $fc3b
        define  master_conf     0
        define  master_mapper   1
        define  flash_spi       2
        define  flash_cs        3
        di
        ld      bc, zxuno_port + $100
        wreg    flash_cs, 1     ; desactivamos spi, enviando un 0
        ld      sp, $c000-17
        ld      a, $0a          ; byte mas significativo de direccion
        wreg    master_mapper, 8  ; paginamos la ROM en $c000
        wreg    flash_cs, 0     ; activamos spi, enviando un 0
        wreg    flash_spi, 3    ; envio flash_spi un 3, orden de lectura
        out     (c), a          ; envia direccion 0ac000, a=0a,h=c0,l=00
        ld      de, $e961       ; tras el out (c), h de bffc se ejecuta
        push    de              ; un jp (hl) hl=0 para iniciar la nueva ROM
        ld      d, (hl)         ; en $bffc para evitar que el cambio de ROM
        push    de              ; colisione con la siguiente instruccion
        add     hl, sp
        out     (c), h
        out     (c), l
        dec     hl              ; Primera lectura que se descarta...
boot    ini
        inc     b
        cp      h               ; compruebo si la direccion es 0000 (final)
        jr      c, boot         ; repito si no lo es
        dec     b
        out     (c), h          ; a master_conf quiero enviar un 0 para pasar
        inc     b               ; a modo normal, pero el ultimo out lo ubico
        jp      $bffd-17

rst30   pop     hl
        outi
        ld      b, (zxuno_port >> 8)+2
        outi
        jp      (hl)

        block   $0066-$
        jp      $c000
        retn


Aquí ya me perdí :( O espera.... no. Entiendo que tú quieres que la ROM del bootloader se invoque con esta NMI especial. En la dirección 0066h tendrá que haber código para poner en MASTERMAPPER la página de SRAM que hayamos elegido para tener el gestor NMI (pongamos que sea la 13) y también estará la instrucción RETN en una posición especial para desde ahí hacer el desmapeo. Durante la etapa de BIOS, además de cargar la ROM de usuario y la ROM de ESXDOS, se cargaría la ROM NMI a la página de SRAM 13

¿Es así? Si es eso, entiendo que la instrucción en 0066h no puede ser un JP a $C000 sino un JP a una posición un poco después del RETN, donde estaría el código que pone en MASTERMAPPER la página 13 y después sí, se salta a $C000.

Pero sigo sin ver la necesidad de estar con BOOTM a 1, si lo que, como me figuraba, tú sólamente necesitas acceder a la Flash SPI, y desde esa NMI especial puedes usarla (aunque BOOTM valga 0 y LOCK valga 1)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor antoniovillena » 29 Jun 2015, 09:08

mcleod_ideafix escribió:
antoniovillena escribió:En cuanto a usar la página 7 (o la 13) no me parece óptimo.

Es óptimo desde el punto de vista del hardware. Primero: la BRAM es un recurso precioso, y de SRAM tenemos de sobra. Esta es de hecho la principal razón. Segundo: el manejo de la RAM está centralizado en un módulo que va asignando cachos de la SRAM a una parte u otra del espacio de direcciones de la CPU, con lo que sólo he tenido que meter un "else if" en ese módulo. Esto no es que sea mucho más complejo con la BRAM, si se usa como BRAM la que tiene al bootloader, y se mete en ella la NMI, pero entonces, ¿cómo harías para que se pudiera grabar una nueva versión de la ROM NMI desde la BIOS?


La solución que te propongo es más óptima desde el punto de vista hardware. Tendrías que emplear 105 bytes en lugar de 56 para BRAM, pero por otro lado te ahorras implementar un nuevo modo de paginación.

mcleod_ideafix escribió:
antoniovillena escribió:Por otro lado con BOOTM=1 tengo accesible toda la SRAM, por lo que puedo saltar a la SRAM 7, o a la 13 sin más que paginar a $C000 y saltar.

Ok, pero.... ¿por qué necesitas BOOTM a 1? Si es por el acceso a la flash, no necesitas BOOTM a 1. Por otra parte, ¿qué quieres hacer desde esta NMI que implique el poder ver a toda la memoria con el MASTERMAPPER?


Para no tener que inventarse un nuevo de paginación nuevo. Si con los que tenemos no apañamos, ¿para qué?

mcleod_ideafix escribió:Aquí ya me perdí :( O espera.... no. Entiendo que tú quieres que la ROM del bootloader se invoque con esta NMI especial. En la dirección 0066h tendrá que haber código para poner en MASTERMAPPER la página de SRAM que hayamos elegido para tener el gestor NMI (pongamos que sea la 13) y también estará la instrucción RETN en una posición especial para desde ahí hacer el desmapeo. Durante la etapa de BIOS, además de cargar la ROM de usuario y la ROM de ESXDOS, se cargaría la ROM NMI a la página de SRAM 13

¿Es así? Si es eso, entiendo que la instrucción en 0066h no puede ser un JP a $C000 sino un JP a una posición un poco después del RETN, donde estaría el código que pone en MASTERMAPPER la página 13 y después sí, se salta a $C000.

Pero sigo sin ver la necesidad de estar con BOOTM a 1, si lo que, como me figuraba, tú sólamente necesitas acceder a la Flash SPI, y desde esa NMI especial puedes usarla (aunque BOOTM valga 0 y LOCK valga 1)


Es así. No tienes que paginar MASTERMAPPER si te aseguras que la última vez que lo usaste (la BIOS o alguna utilidad ESXDOS) lo dejaste apuntando a la página 7. ¿Que por qué no lo inicializo desde la RTI? Muy sencillo. No quiero usar contaminar la pila del programa principal con nada más de lo necesario, que serían los 2 bytes del PC que te introduce la NMI. El código para paginar MASTERMAPPER necesitaría cambiar registros de la CPU, que a su vez deberían almacenarse en pila. Otra opción es hacer escribible la BRAM y alojar 128 bytes en lugar de 105.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: ZX-Uno prototipo 2: seguimos dándole caña

Mensajepor mcleod_ideafix » 29 Jun 2015, 19:16

Bueno, pues ya he modificado el TEST 17. Ahora funciona con el bootloader que has puesto, que basicamente salta a la posición $C000 con BOOTM a 1, dejando el RETN en la posición 0069h. El programita "testnmi" también lo he actualizado, con el supuesto de que la página que se usa en este caso no es la 13, sino la 6. También he hecho cambios en firmware.asm para que MASTERMAPPER se quede con el valor 6, pero no los he subido, con la cosa de que seas tú el que toque el firmware y lo suba.

NOTA: la bootrom es de sólo lectura.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

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