Pues no se me había ocurrido... otra buena idea que me apunto para la siguiente versiónUto 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"...
Debugger en ZesarUX
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
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
Re: Debugger en ZesarUX
¡Genial!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
Re: Debugger en ZesarUX
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.
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.
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
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 saltaUto 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.
Quizá la definición en la ayuda es un tanto confusa sobre esta variable:
ENTERROM=1 no me funciona en ninguno de los casos anteriormente dichos, ni siquiera con el usr 0
"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
Re: Debugger en ZesarUX
Bueno, no estaba en Basic, era otro intento de que se parara al ejecutar la dirección 0 de la ROM
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
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
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
Si te digo la verdad, creo que el enterrom lo pidió algún programador, y lo implementé exactamente como pidióUto escribió:Bueno, no estaba en Basic, era otro intento de que se parara al ejecutar la dirección 0 de la ROM
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)
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
Re: Debugger en ZesarUX
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
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
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
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
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: Debugger en ZesarUX
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.
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.