1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-11-27 20:51:17 +00:00

Add unbreak command, unbreak_all() function for testing

This commit is contained in:
Peter Evans 2018-02-25 14:38:24 -06:00
parent c17616c383
commit 01f230dc85
3 changed files with 75 additions and 5 deletions

View File

@ -72,13 +72,17 @@ extern vm_debug_cmd *vm_debug_find_cmd(const char *);
extern void vm_debug_break(int);
extern void vm_debug_execute(const char *);
extern void vm_debug_quit();
extern void vm_debug_unbreak(int);
extern void vm_debug_unbreak_all();
extern DEBUG_CMD(break);
extern DEBUG_CMD(help);
extern DEBUG_CMD(jump);
extern DEBUG_CMD(printaddr);
extern DEBUG_CMD(printstate);
extern DEBUG_CMD(quit);
extern DEBUG_CMD(resume);
extern DEBUG_CMD(unbreak);
extern DEBUG_CMD(writeaddr);
extern DEBUG_CMD(writestate);

View File

@ -4,6 +4,7 @@
#include <ctype.h>
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
@ -20,12 +21,14 @@
/*
* A table of breakpoints, arranged by address in a CPU. If
* breakpoints[i] is zero, then there is no breakpoint. If it is
* non-zero, then there is a breakpoint at address i.
* breakpoints[i] is false, then there is no breakpoint. If it is
* true, then there is a breakpoint at address i.
*/
static int breakpoints[BREAKPOINTS_MAX];
static bool breakpoints[BREAKPOINTS_MAX];
vm_debug_cmd cmdtable[] = {
{ "break", "b", vm_debug_cmd_break, 1, "<addr>",
"Add breakpoint at <addr>", },
{ "help", "h", vm_debug_cmd_help, 0, "",
"Print out this list of commands", },
{ "jump", "j", vm_debug_cmd_jump, 1, "<addr>",
@ -38,6 +41,8 @@ vm_debug_cmd cmdtable[] = {
"Quit the emulator", },
{ "resume", "r", vm_debug_cmd_resume, 0, "",
"Resume execution", },
{ "unbreak", "u", vm_debug_cmd_unbreak, 1, "<addr>",
"Remove breakpoint at <addr>", },
{ "writeaddr", "wa", vm_debug_cmd_writeaddr, 2, "<addr> <byte>",
"Write <byte> at <addr>", },
{ "writestate", "ws", vm_debug_cmd_writestate, 2, "<reg> <byte>",
@ -90,7 +95,17 @@ vm_debug_break(int addr)
return;
}
breakpoints[addr] = 1;
breakpoints[addr] = true;
}
void
vm_debug_unbreak(int addr)
{
if (addr < 0 || addr >= BREAKPOINTS_MAX) {
return;
}
breakpoints[addr] = false;
}
bool
@ -100,7 +115,13 @@ vm_debug_broke(int addr)
return false;
}
return breakpoints[addr] != 0;
return breakpoints[addr];
}
void
vm_debug_unbreak_all()
{
memset(breakpoints, false, BREAKPOINTS_MAX);
}
char *
@ -215,6 +236,11 @@ vm_debug_find_cmd(const char *str)
sizeof(vm_debug_cmd), cmd_compar);
}
DEBUG_CMD(break)
{
vm_debug_break(args->addr1);
}
DEBUG_CMD(help)
{
FILE *stream = (FILE *)vm_di_get(VM_OUTPUT);
@ -280,3 +306,8 @@ DEBUG_CMD(quit)
{
exit(0);
}
DEBUG_CMD(unbreak)
{
vm_debug_unbreak(args->addr1);
}

View File

@ -49,6 +49,8 @@ teardown()
fclose(stream);
apple2_free(mach);
vm_debug_unbreak_all();
}
TestSuite(vm_debug, .init = setup, .fini = teardown);
@ -177,4 +179,37 @@ Test(vm_debug, broke)
cr_assert_eq(vm_debug_broke(0x23), true);
}
Test(vm_debug, unbreak)
{
vm_debug_break(0x23);
cr_assert_eq(vm_debug_broke(0x23), true);
vm_debug_unbreak(0x23);
cr_assert_eq(vm_debug_broke(0x23), false);
}
Test(vm_debug, cmd_break)
{
args.addr1 = 123;
vm_debug_cmd_break(&args);
cr_assert_eq(vm_debug_broke(123), true);
}
Test(vm_debug, cmd_unbreak)
{
args.addr1 = 123;
vm_debug_cmd_break(&args);
cr_assert_eq(vm_debug_broke(123), true);
vm_debug_cmd_unbreak(&args);
cr_assert_eq(vm_debug_broke(123), false);
}
Test(vm_debug, unbreak_all)
{
vm_debug_break(55555);
vm_debug_unbreak_all();
cr_assert_eq(vm_debug_broke(55555), false);
}
/* Test(vm_debug, quit) */