Página 2 de 3

Re: NMI Especial

Publicado: 01 Sep 2017, 09:42
por Uto
Sí, a eso me refería con que la siguiente instrucción a ver donde cae.

Esto de la NMI especial es una buena cosa, pero esta claro que le falta testing. Espero que mis pruebas sirvan de ayuda para arreglarlo :-)

Re: NMI Especial

Publicado: 01 Sep 2017, 11:54
por antoniovillena
Uto escribió:Sí, a eso me refería con que la siguiente instrucción a ver donde cae.

Esto de la NMI especial es una buena cosa, pero esta claro que le falta testing. Espero que mis pruebas sirvan de ayuda para arreglarlo :-)
Vale. Esto lo estudiamos en su día y encontramos una solución más sencilla. Perdona por no comentártelo antes, pero es que no me acordaba. En lugar de modificar el T80 para que con la orden RETN de desactive la paginación, nosotros hicimos lo siguiente:

-Poner un RETN en la rom del bootloader justo después del JP $C003
-Así la RTI que hagas debe hacer un JP $0069 en lugar de un RETN para salir (por esta vía de JP se desactiva bootm además del ejecutar el RETN).
-Los cambios están en core, en el archivo nmievents.v. La codidición de salida es:

Código: Seleccionar todo

if (mreq_n == 1'b0 && m1_n == 1'b0 && rd_n == 1'b0 && a==16'h006A && page_configrom_active == 1'b1)
    state <= ABOUT_TO_EXIT;
Se detecta la dirección 6A que corresponde al segundo byte de la instrucción RETN

Re: NMI Especial

Publicado: 01 Sep 2017, 12:19
por chernandezba
Ese trozo de código del nmievents, que es lo que hace? si ejecuta un RETN en la 69H, cambia a modo bootm=0?

Re: NMI Especial

Publicado: 01 Sep 2017, 13:03
por antoniovillena
chernandezba escribió:Ese trozo de código del nmievents, que es lo que hace? si ejecuta un RETN en la 69H, cambia a modo bootm=0?
En realidad pone bootm a 0 cuando lee cualquier opcode en 69H, independientemente de la instrucción que sea. Ya te digo que era la solución más sencilla que se nos ocurrió sin modificar el T80. En tu emulador simplemente puedes hacer que bootm=0 cuando se ejecute un RETN.

Re: NMI Especial

Publicado: 01 Sep 2017, 13:32
por chernandezba
antoniovillena escribió: En tu emulador simplemente puedes hacer que bootm=0 cuando se ejecute un RETN.
No, porque eso saltaría con el gestor de archivos de esxdos

Re: NMI Especial

Publicado: 01 Sep 2017, 13:33
por chernandezba
Creo que en ZEsarUX la condición seria la misma o parecida que en fpga: poner bootm a 0 cuando se ejecute un RETN en la 69H

Re: NMI Especial

Publicado: 01 Sep 2017, 13:39
por Uto
chernandezba escribió:
antoniovillena escribió: En tu emulador simplemente puedes hacer que bootm=0 cuando se ejecute un RETN.
No, porque eso saltaría con el gestor de archivos de esxdos
No pasa nada, cuando está el gestor de archivos bootm=0, salvo que uses el gestor de archivos en rooted mode, cosa muy poco recomendable.

Re: NMI Especial

Publicado: 01 Sep 2017, 13:49
por chernandezba
mmm cierto...pero lo hago para que sea lo más parecido a la fpga. En la fpga se cambia a bootm=0 cuando se ejecuta cualquier opcode en 69H, independientemente de la instrucción que sea, según dice Antonio
Yo le agregaré una condición mas, y es que esa instrucción tiene que ser RETN, que es mas lógico (y realmente queda mejor pues es un trozo de código dentro de la emulación de esa instrucción, y no algo a meter en el loop principal)

Re: NMI Especial

Publicado: 01 Sep 2017, 18:17
por Uto
Bueno, el experimento es funcional, he hecho lo siguiente:

- Modificar ZesarUX para que salte a C000h en lugar de 66h cuando la NMI es Especial.
- Modificar el firmware para que meta un pequeño código en la página 13 de SRAM del ZX-Uno, que simplemente cambia el borde de color y sale.
. Arrancar el emulador y darle a la NMI especial y el borde se cambia de color, y luego se cuelga.

Esto último pasa a pesar de que he puesto el JP 69H porque ZesarUX no haya aplicado lo del bootm=0 cuando PC=69h, se produce un RET que deberia caer en la ROM del Spectrum pero cae en la BOOT ROM vaya usted a saber donde. Es normal, y probablemente cuando eso se cambie será replicable.
Eso sí, tengo deshabilitar todo lo de DivMMC en ZesarUX o si no sigue petando pro mucho que saltemos a C000h, no sé muy bien por qué, pero no es muy importante en este momento.

En resumen, si se modificara como funciona la NMI especial y saltara a C000h (o C003h, como se prefiera), o a una dirección de la BOOT ROM que no provoque que entre el DivMMC y a su vez salte a C000h o C0003h, se podría hacer un código que se ejecute cuando el Spectrum está funcionando (pokeador, debugger, hasta un "transfer").

Re: NMI Especial

Publicado: 01 Sep 2017, 18:53
por antoniovillena
Yo podría desplazar la NMI especial 7 bytes hacia abajo en el bootloader. Es decir, dirección NMI especial $006D. Dirección de la instrucción RETN $0070 (el segundo byte se detecta en $0071)