diff --git a/Changes.txt b/Changes.txt index 94dfdb579..da031265e 100644 --- a/Changes.txt +++ b/Changes.txt @@ -14,6 +14,8 @@ 4.7.3 to 5.0: (xxx. xx, 2017) + * Stella has moved from Sourceforge to Github. + * New TIA core: TODO - gather info on all new functionality: - RSYNC - YStart autodetection @@ -24,7 +26,8 @@ finding documentation that finally describes in more detail how the M6532 chip actually works. - * Added BUS and CDF bankswitching schemes, thanks to SpiceWare. + * Added BUS and CDF bankswitching schemes, and also ARM Timer 1 + support; special thanks to SpiceWare for the code. * Fixed bug with SaveKey and AtariVox not properly closing their memory files before starting another instance of the same ROM, when the ROM @@ -39,8 +42,11 @@ currently active TIA palette - The previous trap'm' commands now work when setting TIA read addresses; previously they only worked for write addresses + - The previous trap'm' commands are now renamed 'trap', 'trapread' + and 'trapwrite' - Command completion now works with internal functions and pseudo-ops (basically, anything starting with the '_' character) + - In general, input error checking is much more strictly enforced. * Mouse grabbing is now enabled in windowed mode only when the ROM is using a virtual analog controller (paddles, trakball, etc). @@ -61,7 +67,7 @@ this bug has only ever occurred in Windows XP, but it's been there since Stella 4.1. - * When in 'ROM launcher mode', Stella now uses less CPU time. + * When in 'ROM launcher mode', Stella now uses slightly less CPU time. * Added ROM properties for D.K. VCS homebrew ROM, thanks to Andreas Dietrich. diff --git a/src/debugger/DebuggerParser.cxx b/src/debugger/DebuggerParser.cxx index 2a857011d..247b41093 100644 --- a/src/debugger/DebuggerParser.cxx +++ b/src/debugger/DebuggerParser.cxx @@ -1459,75 +1459,77 @@ void DebuggerParser::executeTrace() // "trap" void DebuggerParser::executeTrap() { - executeTrapRW(true, true); + if(argCount > 2) + { + commandResult << red("Command takes one or two arguments") << endl; + return; + } + + uInt32 beg = args[0]; + uInt32 end = argCount == 2 ? args[1] : beg; + if(beg > 0xFFFF || end > 0xFFFF) + { + commandResult << red("One or more addresses are invalid") << endl; + return; + } + + for(uInt32 addr = beg; addr <= end; ++addr) + executeTrapRW(addr, true, true); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // "trapread" void DebuggerParser::executeTrapread() { - executeTrapRW(true, false); + if(argCount > 2) + { + commandResult << red("Command takes one or two arguments") << endl; + return; + } + + uInt32 beg = args[0]; + uInt32 end = argCount == 2 ? args[1] : beg; + if(beg > 0xFFFF || end > 0xFFFF) + { + commandResult << red("One or more addresses are invalid") << endl; + return; + } + + for(uInt32 addr = beg; addr <= end; ++addr) + executeTrapRW(addr, true, false); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // "trapwrite" void DebuggerParser::executeTrapwrite() { - executeTrapRW(false, true); + if(argCount > 2) + { + commandResult << red("Command takes one or two arguments") << endl; + return; + } + + uInt32 beg = args[0]; + uInt32 end = argCount == 2 ? args[1] : beg; + if(beg > 0xFFFF || end > 0xFFFF) + { + commandResult << red("One or more addresses are invalid") << endl; + return; + } + + for(uInt32 addr = beg; addr <= end; ++addr) + executeTrapRW(addr, false, true); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // wrapper function for trap/trapread/trapwrite commands -void DebuggerParser::executeTrapRW(bool read, bool write) +void DebuggerParser::executeTrapRW(uInt32 addr, bool read, bool write) { - uInt32 beg = args[0]; - uInt32 end = argCount >= 2 ? args[1] : beg; - if(beg > end) std::swap(beg, end); - - for(uInt32 i = beg; i <= end; ++i) - { - if(read) debugger.toggleReadTrap(i); - if(write) debugger.toggleWriteTrap(i); - commandResult << trapStatus(i) << endl; - } -} - -#if 0 -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// "trapm" -void DebuggerParser::executeTrapM() -{ - executeTrapMRW(true, true); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// "trapreadm" -void DebuggerParser::executeTrapreadM() -{ - executeTrapMRW(true, false); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// "trapwritem" -void DebuggerParser::executeTrapwriteM() -{ - executeTrapMRW(false, true); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// wrapper function for trapm/trapreadm/trapwritem commands -void DebuggerParser::executeTrapMRW(bool read, bool write) -{ - uInt32 addr = args[0]; - uInt32 beg = argCount > 1 ? args[1] : 0; - uInt32 end = argCount > 2 ? args[2] : 0xFFFF; - if(beg > end) std::swap(beg, end); - switch(debugger.cartDebug().addressType(addr)) { case CartDebug::ADDR_TIA: { - for(uInt32 i = beg; i <= end; ++i) + for(uInt32 i = 0; i <= 0xFFFF; ++i) { if((i & 0x1080) == 0x0000) { @@ -1541,7 +1543,7 @@ void DebuggerParser::executeTrapMRW(bool read, bool write) } case CartDebug::ADDR_IO: { - for(uInt32 i = beg; i <= end; ++i) + for(uInt32 i = 0; i <= 0xFFFF; ++i) { if((i & 0x1080) == 0x0080 && (i & 0x0200) != 0x0000 && (i & 0x02FF) == addr) { @@ -1553,7 +1555,7 @@ void DebuggerParser::executeTrapMRW(bool read, bool write) } case CartDebug::ADDR_ZPRAM: { - for(uInt32 i = beg; i <= end; ++i) + for(uInt32 i = 0; i <= 0xFFFF; ++i) { if((i & 0x1080) == 0x0080 && (i & 0x0200) == 0x0000 && (i & 0x00FF) == addr) { @@ -1565,40 +1567,23 @@ void DebuggerParser::executeTrapMRW(bool read, bool write) } case CartDebug::ADDR_ROM: { - // Enforce range? - if(argCount > 1) + if(addr >= 0x1000 && addr <= 0xFFFF) { - if(beg < addr) beg = addr & 0xF000; - if(end < beg) beg = end; - } - else - { - beg = 0x1000; - end = 0xFFFF; - } - - // Are we in range? - if(!(addr >= beg && addr <= end)) - { - commandResult << "Address " << addr << " is outside range" << endl; - return; - } - for(uInt32 i = beg; i <= end; ++i) - { - if((i % 0x2000 >= 0x1000) && (i & 0x0FFF) == (addr & 0x0FFF)) + for(uInt32 i = 0x1000; i <= 0xFFFF; ++i) { - if(read) debugger.toggleReadTrap(i); - if(write) debugger.toggleWriteTrap(i); + if((i % 0x2000 >= 0x1000) && (i & 0x0FFF) == (addr & 0x0FFF)) + { + if(read) debugger.toggleReadTrap(i); + if(write) debugger.toggleWriteTrap(i); + } } } break; } } - commandResult << trapStatus(addr) << " + mirrors from $" - << Base::HEX4 << beg << " - $" << end << endl; + commandResult << trapStatus(addr) << " + mirrors" << endl; } -#endif // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // "type" diff --git a/src/debugger/DebuggerParser.hxx b/src/debugger/DebuggerParser.hxx index 6e36df4e0..ee2f99bcd 100644 --- a/src/debugger/DebuggerParser.hxx +++ b/src/debugger/DebuggerParser.hxx @@ -180,7 +180,7 @@ class DebuggerParser void executeTrap(); void executeTrapread(); void executeTrapwrite(); - void executeTrapRW(bool read, bool write); // not exposed by debugger + void executeTrapRW(uInt32 addr, bool read, bool write); // not exposed by debugger void executeType(); void executeUHex(); void executeUndef();