NMI Especial
Re: NMI Especial
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
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
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: NMI Especial
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: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
-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;
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: NMI Especial
Ese trozo de código del nmievents, que es lo que hace? si ejecuta un RETN en la 69H, cambia a modo bootm=0?
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: NMI Especial
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.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?
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: NMI Especial
No, porque eso saltaría con el gestor de archivos de esxdosantoniovillena escribió: En tu emulador simplemente puedes hacer que bootm=0 cuando se ejecute un RETN.
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: NMI Especial
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
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.chernandezba escribió:No, porque eso saltaría con el gestor de archivos de esxdosantoniovillena escribió: En tu emulador simplemente puedes hacer que bootm=0 cuando se ejecute un RETN.
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: NMI Especial
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)
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
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").
- 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").
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: NMI Especial
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)