From eedf675ebdc42805a8ae750fcfc4011b29bf05e0 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 7 Jul 2013 23:39:53 -0400 Subject: [PATCH] debugger updates --- bin/CMakeLists.txt | 8 +++- bin/address_map.h | 30 +++++++++++++++ bin/debugger.cpp | 80 +++++++++++++++++++++++++++++++++++++++ bin/debugger.h | 12 ++++++ bin/lexer.re.cpp | 5 ++- bin/loadtrap.rl | 93 ++++++++++++++++++++++++++++++++++++++++++++++ bin/parser.lemon | 10 +++++ 7 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 bin/loadtrap.rl diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 4071dfa..c5d22df 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -25,8 +25,14 @@ add_custom_command( DEPENDS debugger.h ) +add_custom_command( + OUTPUT loadtrap.cpp + COMMAND ragel -p -G2 -o loadtrap.cpp "${CMAKE_CURRENT_SOURCE_DIR}/loadtrap.rl" + MAIN_DEPENDENCY loadtrap.rl + DEPENDS debugger.h +) -add_executable(mpw loader.cpp debugger.cpp address_map.cpp lexer.cpp parser.cpp) +add_executable(mpw loader.cpp debugger.cpp address_map.cpp lexer.cpp parser.cpp loadtrap.cpp) target_link_libraries(mpw CPU_LIB) target_link_libraries(mpw TOOLBOX_LIB) target_link_libraries(mpw MPW_LIB) diff --git a/bin/address_map.h b/bin/address_map.h index 1ca124b..81cd851 100644 --- a/bin/address_map.h +++ b/bin/address_map.h @@ -16,6 +16,21 @@ public: void clear(); + std::unordered_map::iterator begin() + { + return map.begin(); + } + + std::unordered_map::iterator end() + { + return map.end(); + } + + size_t size() + { + return map.size(); + } + private: std::array pageMap; std::unordered_map map; @@ -34,6 +49,21 @@ public: void clear(); + std::unordered_map::iterator begin() + { + return map.begin(); + } + + std::unordered_map::iterator end() + { + return map.end(); + } + + size_t size() + { + return map.size(); + } + private: std::unordered_map map; diff --git a/bin/debugger.cpp b/bin/debugger.cpp index f6e61a6..9abd1cc 100644 --- a/bin/debugger.cpp +++ b/bin/debugger.cpp @@ -28,6 +28,8 @@ #include #include +#include + namespace { bool sigInt = false; @@ -41,6 +43,7 @@ namespace { AddressMap wbrkMap; // write breaks. ToolMap tbrkMap; // tool breaks. + std::unordered_map toolMap; void hexdump(const uint8_t *data, ssize_t size, uint32_t address = 0) @@ -439,6 +442,34 @@ void ToolBreak(int32_t tool) } } +void ToolBreak() +{ + // list all tool breaks. + + if (!tbrkMap.size()) + { + printf("No tool breaks\n"); + return; + } + + std::vector v; + v.reserve(tbrkMap.size()); + + for (auto kv : tbrkMap) + { + v.push_back(kv.first); + } + + std::sort(v.begin(), v.end()); + + for (auto trap : v) + { + const char *name = TrapName(trap); + if (!name) name = ""; + printf("$%04x %s\n", trap, name); + } +} + void Break(int32_t address) { // 24-bit only, - address to remove. @@ -463,6 +494,34 @@ void Break(int32_t address) } +void Break() +{ + // list all tool breaks. + + if (!brkMap.size()) + { + printf("No breaks\n"); + return; + } + + std::vector v; + v.reserve(brkMap.size()); + + for (auto kv : brkMap) + { + v.push_back(kv.first); + } + + std::sort(v.begin(), v.end()); + + for (auto address : v) + { + printf("$%08x", address); + } +} + + + void Step(const Command &cmd) { @@ -543,6 +602,20 @@ void SetXRegister(unsigned reg, uint32_t value) } +uint16_t TrapNumber(const std::string &s) +{ + auto iter = toolMap.find(s); + if (iter == toolMap.end()) return 0; + return iter->second; +} + +uint16_t TrapNumber(const char *cp) +{ + if (!cp || !*cp) return 0; + std::string s(cp); + return TrapNumber(s); +} + // TODO -- RUN command - reload, re-initialize, re-execute // TODO -- parser calls commands directly (except trace/step/run/etc) @@ -552,6 +625,13 @@ void Shell() add_history("!Andy, it still has history!"); + { + // load the tool trap file. + std::string path = MPW::RootDir(); + path += "/Traps.text"; + toolMap = LoadTrapFile(path); + } + // start it up printf("MPW Debugger shell\n\n"); disasm(cpuGetPC()); diff --git a/bin/debugger.h b/bin/debugger.h index a25c98c..ec0ce9f 100644 --- a/bin/debugger.h +++ b/bin/debugger.h @@ -3,6 +3,9 @@ #include +#include +#include +#include // Debugger is a function in MacTypes.h namespace Debug { @@ -25,6 +28,12 @@ struct Command { bool ParseLine(const char *iter, Command *command); +std::unordered_map LoadTrapFile(const std::string &path); + +uint16_t TrapNumber(const std::string &); +uint16_t TrapNumber(const char *); + + void Shell(); void Help(); @@ -44,7 +53,10 @@ void SetDRegister(unsigned reg, uint32_t value); void SetXRegister(unsigned reg, uint32_t value); void ToolBreak(int32_t tool); +void ToolBreak(); + void Break(int32_t address); +void Break(); } diff --git a/bin/lexer.re.cpp b/bin/lexer.re.cpp index a8dffdd..bb5b8a6 100644 --- a/bin/lexer.re.cpp +++ b/bin/lexer.re.cpp @@ -304,4 +304,7 @@ bool ParseLine(const char *iter, Command *command) return command->valid; } -} // namespace Debugger \ No newline at end of file + + +} // namespace Debugger + diff --git a/bin/loadtrap.rl b/bin/loadtrap.rl new file mode 100644 index 0000000..fd4efe6 --- /dev/null +++ b/bin/loadtrap.rl @@ -0,0 +1,93 @@ + +#include +#include +#include + +#include "debugger.h" + +%%{ + + machine traplist; + + action error { + fprintf(stderr, "Invalid line: %d %.*s", line, (int)length, cp); + fprintf(stderr, "%s - %x\n", name.c_str(), trap); + } + + main := + [ \t]* + [_A-Za-z][_A-Za-z0-9]* @{ + name.push_back(fc); + } + [ \t]* + '=' + [ \t]* + ('0x' | '$') + [0-9A-Fa-f]+ @{ + trap = (trap << 4) + digittoint(fc); + } + [ \t\r\n]* + + %eof { + // final state + map.emplace(name, trap); + } + @eof(error) + $err(error) + + ; + +}%% + +namespace Debug { +std::unordered_map LoadTrapFile(const std::string &path) +{ +%% write data nofinal; + + FILE *fp; + + std::unordered_map map; + + fp = fopen(path.c_str(), "r"); + if (!fp) + { + fprintf(stderr, "Unable to open file %s\n", path.c_str()); + return map; + } + + int line = 0; + for(;;) + { + char *cp; + + size_t length; + cp = fgetln(fp, &length); + if (!cp) break; + ++line; + + while (isspace(*cp) && length) + { + ++cp; + length--; + } + if (!length) continue; + if (*cp == '#') continue; + + char *p = cp; + char *pe = p + length; + char *eof = p + length; + int cs; + + std::string name; + uint16_t trap = 0; + + %% write init; + /* ... */ + %% write exec; + } + + fclose(fp); + return map; +} + +} diff --git a/bin/parser.lemon b/bin/parser.lemon index 37a647c..cc6993c 100644 --- a/bin/parser.lemon +++ b/bin/parser.lemon @@ -67,6 +67,11 @@ stmt ::= PRINT expr(a) EOL. Debug::Print(a); } +stmt ::= BREAK EOL. +{ + Debug::Break(); +} + stmt ::= BREAK expr(a) EOL. { Debug::Break(a); @@ -78,6 +83,11 @@ stmt ::= CONTINUE EOL. command->argc = 0; } +stmt ::= TBREAK EOL. +{ + Debug::ToolBreak(); +} + stmt ::= TBREAK expr(a) EOL. { Debug::ToolBreak(a);