1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-12-30 06:29:48 +00:00

Add ability to debug separate from pausing

Also, pausing just pauses now; no debugger prompt is shown. ALT+P
toggles pausing, so just hit it again to unpause. Also, when things are
paused, you can perform other keyboard events (like quitting).
This commit is contained in:
Peter Evans 2018-04-07 11:14:12 -05:00
parent ec719da2c5
commit 6e77e99813
6 changed files with 23 additions and 10 deletions

View File

@ -339,6 +339,13 @@ struct apple2 {
*/ */
bool paused; bool paused;
/*
* When this and the paused fields are true, then we will print a
* debug prompt and allow the user to work with the machine through
* that.
*/
bool debug;
/* /*
* If this is true, then we will disassemble opcodes as we execute. * If this is true, then we will disassemble opcodes as we execute.
*/ */

View File

@ -3,7 +3,8 @@
#include "vm_event.h" #include "vm_event.h"
extern void apple2_event_init(); extern EVENT_DO(apple2_event_debug);
extern EVENT_DO(apple2_event_pause); extern EVENT_DO(apple2_event_pause);
extern void apple2_event_init();
#endif #endif

View File

@ -48,14 +48,9 @@ apple2_create(int width, int height)
return NULL; return NULL;
} }
// By default, we have no strobe set; it should only be set when a
// key is pressed
mach->strobe = false; mach->strobe = false;
// Yes, please do execute opcodes to begin with
mach->paused = false; mach->paused = false;
mach->debug = false;
// Don't print opcodes by default
mach->disasm = false; mach->disasm = false;
// Forward set these to NULL in case we fail to build the machine // Forward set these to NULL in case we fail to build the machine
@ -357,8 +352,7 @@ apple2_run_loop(apple2 *mach)
mach->paused = true; mach->paused = true;
} }
// If we're paused, then just re-loop until we're not if (mach->debug) {
if (mach->paused) {
if (mach->selected_drive) { if (mach->selected_drive) {
mach->selected_drive->locked = true; mach->selected_drive->locked = true;
} }
@ -376,6 +370,10 @@ apple2_run_loop(apple2 *mach)
} }
free(input); free(input);
}
if (mach->paused) {
vm_event_poll(mach->screen);
continue; continue;
} }

View File

@ -328,6 +328,7 @@ DEBUG_CMD(resume)
apple2_debug_unbreak(mach->cpu->PC); apple2_debug_unbreak(mach->cpu->PC);
mach->paused = false; mach->paused = false;
mach->debug = false;
} }
/* /*

View File

@ -17,16 +17,18 @@ void
apple2_event_init() apple2_event_init()
{ {
vm_di_set(VM_PAUSE_FUNC, apple2_event_pause); vm_di_set(VM_PAUSE_FUNC, apple2_event_pause);
vm_di_set(VM_DEBUG_FUNC, apple2_event_debug);
} }
EVENT_DO(apple2_event_pause) EVENT_DO(apple2_event_pause)
{ {
apple2 *mach = (apple2 *)_mach; apple2 *mach = (apple2 *)_mach;
mach->paused = true; mach->paused = !mach->paused;
} }
EVENT_DO(apple2_event_debug) EVENT_DO(apple2_event_debug)
{ {
apple2 *mach = (apple2 *)_mach; apple2 *mach = (apple2 *)_mach;
mach->debug = true;
mach->paused = true; mach->paused = true;
} }

View File

@ -108,6 +108,10 @@ vm_event_keyboard_special(vm_event *ev, char ch)
ev->screen->should_exit = true; ev->screen->should_exit = true;
break; break;
case 'd':
vm_event_do(VM_DEBUG_FUNC);
break;
case 'p': case 'p':
vm_event_do(VM_PAUSE_FUNC); vm_event_do(VM_PAUSE_FUNC);
break; break;