Debugger en ZesarUX

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
chernandezba
Mensajes: 832
Registrado: 02 Oct 2015, 23:35

Re: Debugger en ZesarUX

Mensaje por chernandezba » 28 Nov 2016, 16:38

Uto escribió:¿hay alguna manera de pasar los breakpoints por linea de comandos?

Estoy tratando de hacer debug de un dot command, lo que implica que cada vez de compilo tengo que montar la SD virtual, copiar el fichero compilado, desmontar la SD, arrancar ZEsarUX (y si algo falla salir de ZEsarUX). Esto me obliga a que cada vez que entro tengo que poner otra vez el breakpoint de turno, si monto y desmonto la unidad con ZEsarUX abierto no pilla los cambios.

Si al menos pudiera hacer algo como ---breakpoints "PC=8192, HL=0"...
Pues no se me había ocurrido... otra buena idea que me apunto para la siguiente versión

:gracias!:
----

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

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

Re: Debugger en ZesarUX

Mensaje por chernandezba » 23 Dic 2016, 20:52

Uto escribió:
En el peor de los casos podrias poner una tecla que haga toggle entre ver codigo y ver registros. Es una idea. Incluso triple toggle entre registros, codigo y hexdump.

Ok. Implementado en la ultima versión de código fuente del emulador:

Improved Debug CPU Window: now you can switch between different views:
1) 1 opcode, cpu registers, other internal registers
2) 9 opcodes, other internal registers
3) 15 opcodes
4) 9 hexdump lines, other internal registers
5) 15 hexdump lines


:boingg:
----

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

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

Re: Debugger en ZesarUX

Mensaje por Uto » 02 Ene 2017, 00:20

chernandezba escribió:
Uto escribió:
En el peor de los casos podrias poner una tecla que haga toggle entre ver codigo y ver registros. Es una idea. Incluso triple toggle entre registros, codigo y hexdump.

Ok. Implementado en la ultima versión de código fuente del emulador:

Improved Debug CPU Window: now you can switch between different views:
1) 1 opcode, cpu registers, other internal registers
2) 9 opcodes, other internal registers
3) 15 opcodes
4) 9 hexdump lines, other internal registers
5) 15 hexdump lines


:boingg:
¡Genial!

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

Re: Debugger en ZesarUX

Mensaje por Uto » 04 Ene 2017, 14:54

Me pasa una cosa: Pongo un breakpoint PC=0000, hago reset, no se para, hago hard reset, no se para, hago "randomize usr 0", sí se para.

Se supone que debería pararse en todos los casos ¿no?

ENTERROM=1 no me funciona en ninguno de los casos anteriormente dichos, ni siquiera con el usr 0 :-?

Nota: todo esto con ZX-Uno, no he probado con otras máquinas. Trataba de hacer debug de la BIOS.

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

Re: Debugger en ZesarUX

Mensaje por chernandezba » 04 Ene 2017, 15:37

Uto escribió:Me pasa una cosa: Pongo un breakpoint PC=0000, hago reset, no se para, hago hard reset, no se para, hago "randomize usr 0", sí se para.
Es un caso conocido. Es por culpa de la manera en que el menú hace el reset. Si pones el breakpoint en PC=1 verás como si que salta

ENTERROM=1 no me funciona en ninguno de los casos anteriormente dichos, ni siquiera con el usr 0 :-?
Quizá la definición en la ayuda es un tanto confusa sobre esta variable:
"ENTERROM: returns 1 the first time PC register is on ROM space (0-16383)"
O sea, que saltará la primera vez que se "salga" y se "entre" a la rom. Dado que seguramente estás en el basic, el registro PC ya está en ese espacio de direcciones.
Prueba a meter el enterrom=1 , desde basic haz un
randomize usr 32768 (por ejemplo)
Cosa que reseteará la máquina, pero provocará que el pc "salga" de ese espacio de direcciones. Cuando entre en la rom saltará el breakpoint

A nivel de código, esto es lo que hace el emulador cuando tienes activados los breakpoints:

if (reg_pc<16384) {
//no ha salido de rom
debug_exitrom=0;

//ver si hay que avisar de un enterrom
if (debug_enterrom==0) debug_enterrom=1;
}

if (reg_pc>16383) {
//no esta en rom
debug_enterrom=0;

//ver si hay que avisar de un exitrom
if (debug_exitrom==0) debug_exitrom=1;
}


Por tanto, mientras estás en basic, estás en el "primer if"

;)

Saludos
----

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

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

Re: Debugger en ZesarUX

Mensaje por Uto » 04 Ene 2017, 15:39

Bueno, no estaba en Basic, era otro intento de que se parara al ejecutar la dirección 0 de la ROM :-D

Pero vamos que ya sabiendo que con PC=1 funciona luego lo pruebo. También estaría bien cambiar la ayuda de ENTERROM para que indique que es cuando viene de RAM y entra en ROM, porque efectivamente me ha confundido (en mi mente ejecutar la dirección 0 siempre es entrar en la ROM) :-)

Edit: con PC=1 tampoco me va , ni con PC=3 (la BIOS tiene un LD SP, nn) al principio, pero creo que esto me está pasando porque al hacer hard reset se me desactivan los breakpoints, aunque no entiendo por que :-?

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

Re: Debugger en ZesarUX

Mensaje por chernandezba » 04 Ene 2017, 15:45

Uto escribió:Bueno, no estaba en Basic, era otro intento de que se parara al ejecutar la dirección 0 de la ROM :-D

Pero vamos que ya sabiendo que con PC=1 funciona luego lo pruebo. También estaría bien cambiar la ayuda de ENTERROM para que indique que es cuando viene de RAM y entra en ROM, porque efectivamente me ha confundido (en mi mente ejecutar la dirección 0 siempre es entrar en la ROM) :-)
Si te digo la verdad, creo que el enterrom lo pidió algún programador, y lo implementé exactamente como pidió
Otra alternativa a hacer esto es que metas un breakpoint como:
pc<16384
Además, con el cambio del comportamiento en el salto de breakpoints que hice en la 4.2 (comportamiento que se puede cambiar en los settings) ese breakpoint sólo saltará la primera vez que se cumpla, y luego no volverá a saltar hasta que deje de cumplirse y se vuelva a cumplir de nuevo (lo mismo que con enterrom: hasta que salga y vuelva a entrar)
Por tanto creo que incluso me cargaré ese enterrom y exitrom, que ya no tienen sentido :llamarada:
----

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

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

Re: Debugger en ZesarUX

Mensaje por Uto » 04 Ene 2017, 17:47

Al hacer hard reset por alguna extraña razón los breakpoints se ponen a off, y por tanto es imposible parar en la BIOS de ZX-Uno, porque aunque pongas el PC<16384, en cuanto haces el hard-reset todos los brekapoints pasan a disabled, y para cuando quieres ponerlo de nuevo ya no estás en 0000 :-(

He estado mirando el código, y creía que la causa estaba en la linea 2194 de cpu.c (debug_breakpoints_enabled.v=0) y realmente si comento esa linea al hacer hard reset no se ponen los breakpoints a disabled (al menos en los menus se ven enabled), pero tampoco se para en la BIOS pese a que al ejecutarla PC<10 y el breakpoint pone exactamente eso. Si le dejo seguir , tampoco para en la ROM del Spectrum cuando la ejecuta.

En fin, no veo como hacerlo :-(

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

Re: Debugger en ZesarUX

Mensaje por chernandezba » 04 Ene 2017, 22:52

Le echaré un vistazo. Creo que el problema viene al cambiar el modo turbo. Cuando hay ese cambio creo que los breakpoints se desactivan. Es por una razón muy larga de explicar ;)
----

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

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

Re: Debugger en ZesarUX

Mensaje por chernandezba » 05 Ene 2017, 14:48

Si, es lo que decía. Cada vez que se hace hard reset, se vuelve a establecer la velocidad turbo (aun incluso si está velocidad 1x). Esto acaba desactivando los breakpoints

Entonces como solución temporal, puedes quitar del hard reset del zxuno el llamado a la función de cambio de turbo:

Busca la función

hard_reset_cpu_zxuno

dentro del archivo zxuno.c

Te encontrarás:

void hard_reset_cpu_zxuno(void)
{
//quitamos write enable de la spi flash zxuno
zxuno_spi_status_register &=(255-ZXUNO_SPI_WEL);



//resetear todos los bits de masterconf y dejar solo bootm
zxuno_ports[0]=1;

zxuno_ports[0x0C]=255;
zxuno_ports[0x0D]=1;
zxuno_ports[0x0E]=0;
zxuno_ports[0x0F]=0;
zxuno_ports[0x40]=0;

//Y sincronizar parametros
zxuno_set_emulator_setting_diven();
zxuno_set_emulator_setting_disd();
zxuno_set_emulator_setting_i2kb();
zxuno_set_emulator_setting_timing();
zxuno_set_emulator_setting_contend();
zxuno_set_emulator_setting_devcontrol_diay();
zxuno_set_emulator_setting_scandblctrl();

...

Pues precisamente esta última llamada
zxuno_set_emulator_setting_scandblctrl();

Es la que hace el cambio de turbo. Comenta esa línea o quítala, como quieras.
Así cuando se haga el hard reset, no se toca el modo turbo, y no se desactivarán los breakpoints.

Por cierto, luego la propia bios se pone a cambiar el modo turbo para acelerar las rutinas de inicio en la bios. PERO en ZEsarUX 4.2 y adelante, los cambios de turbo desde la bios los tengo "interceptados" y no se cambia el modo turbo (puedes verlo fácilmente comparando el tiempo de arranque en zxuno real y en ZEsarUX). Puedes ver como lo hago en la misma función zxuno_set_emulator_setting_scandblctrl

Por tanto, luego cuando arranque la bios, no se cambia el turbo, y no se perderán tampoco los breakpoints


Y... por que al cambiar el modo turbo desactivo los breakpoints? Otro efecto laaaargo de explicar. Realmente el cambio de modo turbo cambia montón de cosas del core de emulación , y una de ellas es el "trap" que utilizo en el core del Z80 para poder capturar breakpoints.

:tetris1:
----

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

Responder