NMI Especial

Avatar de Usuario
Uto
Mensajes: 1385
Registrado: 17 Dic 2015, 16:39

Re: NMI Especial

Mensaje por Uto » 01 Sep 2017, 09:42

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 :-)

Avatar de Usuario
antoniovillena
Mensajes: 2597
Registrado: 27 Sep 2015, 20:41

Re: NMI Especial

Mensaje por antoniovillena » 01 Sep 2017, 11:54

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

Avatar de Usuario
chernandezba
Mensajes: 824
Registrado: 02 Oct 2015, 23:35

Re: NMI Especial

Mensaje por chernandezba » 01 Sep 2017, 12:19

Ese trozo de código del nmievents, que es lo que hace? si ejecuta un RETN en la 69H, cambia a modo bootm=0?
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
antoniovillena
Mensajes: 2597
Registrado: 27 Sep 2015, 20:41

Re: NMI Especial

Mensaje por antoniovillena » 01 Sep 2017, 13:03

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.

Avatar de Usuario
chernandezba
Mensajes: 824
Registrado: 02 Oct 2015, 23:35

Re: NMI Especial

Mensaje por chernandezba » 01 Sep 2017, 13:32

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
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
chernandezba
Mensajes: 824
Registrado: 02 Oct 2015, 23:35

Re: NMI Especial

Mensaje por chernandezba » 01 Sep 2017, 13:33

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
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Uto
Mensajes: 1385
Registrado: 17 Dic 2015, 16:39

Re: NMI Especial

Mensaje por Uto » 01 Sep 2017, 13:39

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.

Avatar de Usuario
chernandezba
Mensajes: 824
Registrado: 02 Oct 2015, 23:35

Re: NMI Especial

Mensaje por chernandezba » 01 Sep 2017, 13:49

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)
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Uto
Mensajes: 1385
Registrado: 17 Dic 2015, 16:39

Re: NMI Especial

Mensaje por Uto » 01 Sep 2017, 18:17

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").

Avatar de Usuario
antoniovillena
Mensajes: 2597
Registrado: 27 Sep 2015, 20:41

Re: NMI Especial

Mensaje por antoniovillena » 01 Sep 2017, 18:53

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)

Responder