mirror of
https://github.com/ksherlock/mpw.git
synced 2025-01-10 20:29:26 +00:00
SIGINT handler, continue
This commit is contained in:
parent
27cd692790
commit
4bdac5a62a
200
bin/debugger.cpp
200
bin/debugger.cpp
@ -4,6 +4,8 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <array>
|
#include <array>
|
||||||
@ -29,6 +31,49 @@ bool ParseLine(const char *iter, Command *command);
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
uint32_t debuggerReadLong(uint32_t address)
|
||||||
|
{
|
||||||
|
uint32_t tmp = 0;
|
||||||
|
for (unsigned i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (address < Flags.memorySize)
|
||||||
|
tmp = (tmp << 8) + Flags.memory[address++];
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t debuggerReadWord(uint32_t address)
|
||||||
|
{
|
||||||
|
uint16_t tmp = 0;
|
||||||
|
for (unsigned i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
if (address < Flags.memorySize)
|
||||||
|
tmp = (tmp << 8) + Flags.memory[address++];
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t debuggerReadByte(uint32_t address)
|
||||||
|
{
|
||||||
|
if (address < Flags.memorySize)
|
||||||
|
return Flags.memory[address];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
bool sigInt = false;
|
||||||
|
void sigIntHandler(int)
|
||||||
|
{
|
||||||
|
sigInt = true;
|
||||||
|
}
|
||||||
|
|
||||||
// any reason to have enable/disable flag
|
// any reason to have enable/disable flag
|
||||||
// vs deleting it?
|
// vs deleting it?
|
||||||
std::unordered_map<uint16_t, bool> tbrkMap;
|
std::unordered_map<uint16_t, bool> tbrkMap;
|
||||||
@ -109,41 +154,6 @@ extern "C" {
|
|||||||
return brkMap.find(address) != brkMap.end();
|
return brkMap.find(address) != brkMap.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t debuggerReadLong(uint32_t address)
|
|
||||||
{
|
|
||||||
uint32_t tmp = 0;
|
|
||||||
for (unsigned i = 0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
if (address < Flags.memorySize)
|
|
||||||
tmp = (tmp << 8) + Flags.memory[address++];
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t debuggerReadWord(uint32_t address)
|
|
||||||
{
|
|
||||||
uint16_t tmp = 0;
|
|
||||||
for (unsigned i = 0; i < 2; ++i)
|
|
||||||
{
|
|
||||||
if (address < Flags.memorySize)
|
|
||||||
tmp = (tmp << 8) + Flags.memory[address++];
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t debuggerReadByte(uint32_t address)
|
|
||||||
{
|
|
||||||
if (address < Flags.memorySize)
|
|
||||||
return Flags.memory[address];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
void hexdump(const uint8_t *data, ssize_t size, uint32_t address = 0)
|
void hexdump(const uint8_t *data, ssize_t size, uint32_t address = 0)
|
||||||
{
|
{
|
||||||
@ -231,6 +241,82 @@ namespace {
|
|||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool step(bool trace)
|
||||||
|
{
|
||||||
|
// return false to break (toolbreak, address break, etc.)
|
||||||
|
|
||||||
|
uint16_t op;
|
||||||
|
cpuExecuteInstruction();
|
||||||
|
|
||||||
|
uint32_t pc = cpuGetPC();
|
||||||
|
if (trace) disasm(pc, &op);
|
||||||
|
else op = debuggerReadWord(pc);
|
||||||
|
|
||||||
|
|
||||||
|
// will this also be set by an interrupt?
|
||||||
|
if (cpuGetStop())
|
||||||
|
{
|
||||||
|
if (!trace) disasm(pc);
|
||||||
|
printf("CPU stopped\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sigInt)
|
||||||
|
{
|
||||||
|
if (!trace) disasm(pc);
|
||||||
|
printf("^C break\n");
|
||||||
|
sigInt = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// check for pc breaks
|
||||||
|
if (brkLookup(pc))
|
||||||
|
{
|
||||||
|
if (!trace) disasm(pc);
|
||||||
|
printf("Address break: $%08x\n", pc);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo -- instruction break for rts /rtn
|
||||||
|
|
||||||
|
// check for toolbreaks.
|
||||||
|
if ((op & 0xf000) == 0xa000)
|
||||||
|
{
|
||||||
|
if (tbrkLookup(op))
|
||||||
|
{
|
||||||
|
if (!trace) disasm(pc);
|
||||||
|
printf("Tool break: $%04x\n", op);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pc > Flags.memorySize)
|
||||||
|
{
|
||||||
|
printf("PC out of range\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sp = cpuGetAReg(7);
|
||||||
|
if (sp < Flags.stackRange.first)
|
||||||
|
{
|
||||||
|
printf("Stack overflow error\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sp > Flags.stackRange.second)
|
||||||
|
{
|
||||||
|
printf("Stack underflow error\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -402,6 +488,7 @@ void DebugBreak(Command &cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DebugStep(const Command &cmd)
|
void DebugStep(const Command &cmd)
|
||||||
{
|
{
|
||||||
// TODO - step n to step specified # of instructions.
|
// TODO - step n to step specified # of instructions.
|
||||||
@ -416,41 +503,14 @@ void DebugStep(const Command &cmd)
|
|||||||
// TODO -- move to common function...
|
// TODO -- move to common function...
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
uint16_t op;
|
if (!step(true)) break;
|
||||||
cpuExecuteInstruction();
|
}
|
||||||
|
}
|
||||||
if (cpuGetStop()) break; // will this also be set by an interrupt?
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t pc = cpuGetPC();
|
void DebugContinue(const Command &cmd)
|
||||||
disasm(pc, &op);
|
|
||||||
|
|
||||||
// check for pc breaks
|
|
||||||
if (brkLookup(pc))
|
|
||||||
{
|
{
|
||||||
break;
|
while (step(false)) ;
|
||||||
}
|
|
||||||
|
|
||||||
// check for toolbreaks.
|
|
||||||
if ((op & 0xf000) == 0xa000)
|
|
||||||
{
|
|
||||||
if (tbrkLookup(op))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t sp = cpuGetAReg(7);
|
|
||||||
if (sp < Flags.stackRange.first)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Stack overflow error\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp > Flags.stackRange.second)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Stack underflow error\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebugSetARegister(Command &cmd)
|
void DebugSetARegister(Command &cmd)
|
||||||
@ -529,6 +589,8 @@ void DebugShell()
|
|||||||
printf("MPW Debugger shell\n\n");
|
printf("MPW Debugger shell\n\n");
|
||||||
disasm(cpuGetPC());
|
disasm(cpuGetPC());
|
||||||
|
|
||||||
|
signal(SIGINT, sigIntHandler);
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
cp = readline("] ");
|
cp = readline("] ");
|
||||||
@ -569,6 +631,10 @@ void DebugShell()
|
|||||||
DebugStep(cmd);
|
DebugStep(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Continue:
|
||||||
|
DebugContinue(cmd);
|
||||||
|
break;
|
||||||
|
|
||||||
case TBreak:
|
case TBreak:
|
||||||
DebugToolBreak(cmd);
|
DebugToolBreak(cmd);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user