NMI Especial

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

NMI Especial

Mensaje por Uto » 31 Ago 2017, 01:18

Acabo de hacer unas pruebas con la NMI Especial, y no conseguia que me funcionara.

Básicamente metí el código siguiente en la etiqueta micont del firmware, con el objetivo de que se copiara un código sencillo en C000 en la página 13:

Código: Seleccionar todo

 wreg master_conf, 1
        wreg master_mapper, 13
        jr startX2
nmicd   nop
        nop
        nop
        xor a
        out (254),a
        retn
startX2 ld hl, alto nmicd
        ld de, $c000
        ld bc,startX2-nmicd
        ldir
        wreg master_conf,0
Este código debería dejar esto en C000:

Código: Seleccionar todo

   nop
        nop
        nop
        xor a
        out (254),a
        retn
Pues bien, nada parecía tener efecto, cuando pulsaba F12 se produce el mismo reset que con el firmware oficial.

Haciendo debug en ZesarUX vi que cuando se pulsa la NMI efectivamente se pagina la ROM boot, y poniendo un breakpoint en 66h veo que hay un JP C003h. El caso es que tras ejecutar esa instrucción no acabo en C003h sino en 2200h. Tras algunas pruebas llegamos a la conclusión de que el paginado de DivMMC interfiere. Si deshabilito totalmente DivMMC va a c003 como debe ser.

Mi idea era hacer un pequeño software pokeador que se activara con la NMI Especial de manera que el usuario pudiera cargar con el menu NMI de DivMMC y pokear con la NMI 2, pero me temo que así no se puede, tienes que elegir una u otra NMI al parecer.

¿Alguna idea de como poder hacer eso que quiero usando la NMI especial?

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

Re: NMI Especial

Mensaje por chernandezba » 31 Ago 2017, 08:54

Supongo que una de las soluciones sería que al lanzarse la nmi especial, se desactive divmmc mediante el bit DIVEN a 0. Esto sólo tendría el problema que al volver de la nmi, se tendría el divmmc desactivado... y sin saber cómo estaba antes, para activarlo si conviene. Quizá se podría hacer que el valor de DIVEN se copiase en algún otro registro, para que al volver de la NMI se restaure ese valor
----

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

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

Re: NMI Especial

Mensaje por Uto » 31 Ago 2017, 09:39

Eso estaría bien pero lo tendría que hacer el core, o en su defecto la boot ROM, que al fin y al cabo es del core. O sea que la boot ROM antes de saltar a c003 desactive divmmc y luego salte.

No obstante no estoy nada seguro de que eso funcione, porque me suena vagamente algo de que divmmc pagina el siguiente byte a 66h ya, o algún rollo así, por lo que no funciona el salto a c0003, pero tampoco funcionaría el código de desactivar divmmc, no llegaría a ejecutarlo completo,

Por eso o es el core internamente el que desactiva y luego llama a 66h, o nada.

Otra opción es que la nmi especial no saltara a 66h, sino a otro sitio que no tenga un trap de entrada de divmmc

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

Re: NMI Especial

Mensaje por chernandezba » 31 Ago 2017, 10:11

es el core quien tiene que hacerlo. Al saltar a la 66h se pagina automático la divmmc, no se puede hacer nada en la rom antes
----

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

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

Re: NMI Especial

Mensaje por Uto » 31 Ago 2017, 11:00

chernandezba escribió:es el core quien tiene que hacerlo. Al saltar a la 66h se pagina automático la divmmc, no se puede hacer nada en la rom antes
Efectivamente, aunque bueno, es justo después de leer 66h, esto es lo que vagamente recordaba:




Memory mapping could be invoked manually (by setting CONMEM), or automatically (CPU has fetched opcode form an entry-point). Automatic mapping is active only if EPROM/EEPROM is present (jumper EPROM is closed) or bit MAPRAM is set. Automatic mapping occurs at the begining of refresh cycle after fetching opcodes (M1 cycle) from 0000h, 0008h, 0038h, 0066h, 04c6h and 0562h. It's also mapped instantly (100ns after /MREQ of that fetch is falling down) after executing opcode from area 3d00..3dffh. Memory is automatically disconnected in refresh cycle of the instruction fetch from so called off-area, which is 1ff8-1fffh.

The one-instruction delay could be used to distinguish between nested calls to the same place. For such trick you will place different instruction at the entrypoint address, than is in original ZX ROM. So the first call wil execute
original instruction, but subsequent one will jump to another code, because divIDE memory was already mapped, with its changed opcode. It's great for 100% avoidance of nested NMI, which cannot be implemented using pure combinatorial hardware workaround. It allows divIDE to use INT for timing, when divIDE code is performed (external calls will map later divIDE off and continue in #38h original service, but nested INTs can jump to another work, and mapping off is of course undesirable there).

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

Re: NMI Especial

Mensaje por chernandezba » 31 Ago 2017, 11:08

Ya, es justo después de leerla... pero no se si antes de leer posibles parámetros (por ejemplo la dirección NN en un JP NN) o justo después de leerla entera. La verdad es que esto en ZEsarUX me costó al principio conseguir que funcionase, no se ahora ni como está, pero funciona ;)
----

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

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

Re: NMI Especial

Mensaje por antoniovillena » 31 Ago 2017, 11:19

Es verdad. Como nunca llegué a programar nada no me di cuenta del hook del DivMMC. Eso, como ya habéis dicho, se tendría que arreglar en el core.

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

Re: NMI Especial

Mensaje por Uto » 31 Ago 2017, 12:07

chernandezba escribió:Ya, es justo después de leerla... pero no se si antes de leer posibles parámetros (por ejemplo la dirección NN en un JP NN) o justo después de leerla entera. La verdad es que esto en ZEsarUX me costó al principio conseguir que funcionase, no se ahora ni como está, pero funciona ;)
Sospecho que los NN no los pilla ya, porque no saltaba a C003h sino a 2200h, asi que imagino que justo detrás del JP habrá un 2200h en la ROM de DivMMC o algo así.

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

Re: NMI Especial

Mensaje por Uto » 31 Ago 2017, 23:39

Hoy he estado haciendo unas pruebas haciendo "trampa" con ZesarUX: he cambiado la NMI especial para que tras generarla justo se salte a la direccion c000h, y así no se pasa por 66h y no entra el DivMMC. Los resultados son correctos, mi código estaba bien y aparece en su sitio en la página 13, y se ejecuta. Sin embargo en cuanto hago RET o RETN (da igual) salta a 0 y se queda pillado. No sé si es que soy yo quien tiene que volver a poner bootm a 0 para que se vuelva a paginar la página normal tanto en RAM como en ROM, pero entonces tendría el problema que si se me vuelve a paginar la página de RAM del Spectrum en C000 me la lia claro, porque la siguiente instruccion a ver donde cae.

¿Que hace la NMI especial al salir de la misma? ¿Como debería salir?

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

Re: NMI Especial

Mensaje por chernandezba » 01 Sep 2017, 08:44

Ah claro, el retn no hace mas que un ret (ahora no recuerdo si toca algun flag). Pero vamos, que no cambia nada del bootm, o al menos eso no está especificado. Yo creo que sería mejor que tu programa lo hiciese, en vez del core, así das mas libertad para que el programador decida que hacer, si quiere hacer algún "invento" con la bootm o que se yo.
El problema es que al desactivar bootm, la página que aparecerá en c000h será lo que quede definido en modo bootm=0, es decir, si es un 48kb, tendrás la página 0, si es un 128kb, tendrás la página que indique el puerto 7ffdh, etc. Entonces, si tienes un programa en la c000- , que desactiva bootm, teniendo en cuenta que estabas en ram13, perderás el control de ese programa... no pudiendo ni ejecutar ese retn. A no ser, que metas ese retorno en otra zona, por ejemplo en la memoria de pantalla , y desde ahí cambies bootm y hagas el retn
De todas maneras que sea miguel/antonio quien decidan, igual ellos consideran que es mejor que al hacer retn se desactive también bootm... no se...
----

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

Responder