mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-24 14:45:40 +00:00
24d24db988
Also make the debugger display 16 bytes per line when using the "listmemory" command. Mirrored system registers can now be watched |
||
---|---|---|
.. | ||
CPU | ||
AddressTable.cpp | ||
AddressTable.h | ||
Breakpoint.cpp | ||
Breakpoint.h | ||
CodeAnalyser.cpp | ||
CodeAnalyser.h | ||
ConsoleDebugger.cpp | ||
ConsoleDebugger.h | ||
CPUDebug.cpp | ||
CPUDebug.h | ||
Debugger.cpp | ||
Debugger.h | ||
DebuggerIO.cpp | ||
DebuggerIO.h | ||
Exception.cpp | ||
Exception.h | ||
Interrupt.cpp | ||
Interrupt.h | ||
Label.cpp | ||
Label.h | ||
ReadMe.txt | ||
Register.cpp | ||
Register.h | ||
SupermodelDebugger.cpp | ||
SupermodelDebugger.h | ||
Watch.cpp | ||
Watch.h |
Help for Supermodel Console-based Debugger ========================================== Relevant Supermodel Command Line Options ---------------------------------------- -enter-debugger Enters the debugger at the start of emulation, -disable-debugger Completely disables the debugger in emulator. At any point whilst running the emulator, execution can be halted and the debugger entered by pressing Alt+B. Code Analysis ------------- At startup, and whenever new code is encountered, the debugger analyses the program's code in order to work out all reachable code locations from a given set of entry points (reset address, exception handlers etc). During the analysis, it keeps track of all valid code locations and this is used to align instructions for CPUs with variable length instruction sets. It also generates a set of auto-labels that identify places of interest such as sub-routines, jump destinations and exception handlers etc. Code analysis can be switched off via the 'configure' command if required. Debugger Commands ================= Execution --------- n next [<count>=1] Runs the next single instruction or the next <count> instructions. nf nextframe [<count>=1] Runs until the next frame or for the next <count> frames. s stepover Runs the next instruction. If it is a call to a sub-routine then the sub-routine is 'stepped over' (ie control breaks at the return address of the sub-routine). si stepinto Runs the next single instruction, entering any sub-routines (ie same as 'next' above). so stepout Runs until control returns from the current sub-routine or exception/interrupt handler. Note that if an exception/interrupt occurs whilst stepping out then this will break execution too as control will have left the sub-routine or handler. c continue [<addr>] Continues running until a break is forced or if <addr> specified, until the given address is reached. spc setpc <addr> Sets the PC of the current CPU to the given address. CPUs ---- lc listcpus Lists all the available CPUs with details about them. sc switchcpu (<name>|<num>) Switches to another CPU with the given name or number. dc disablecpu (<name>|<num>) Disables debugging for the CPU with the given name or number. Once disabled, it is no longer possible to switch to or halt execution for that CPU, ie all breakpoints, watches, monitors and traps are ignored. The current CPU cannot be disabled. ec enablecpu (<name>|<num>) Enables debugging for the CPU with the given name or number. Registers --------- lr listregisters Lists all registers for the current CPU and their current values. pr printregister <reg> Prints the current value of the given register for the current CPU. sr setregister <reg> <value> Sets the value of the given register for the current CPU. lm listmonitors Lists all register monitors for the current CPU with details about them. m monitor <reg> am addmonitor <reg> Adds a register monitor for the register with the given name, causing execution to break whenever the register's value changes. rm removemonitor <reg> Removes the register monitor with the given name. ram removeallmonitors Removes all register monitors for the current CPU. Exceptions & Interrupts ----------------------- le listexceptions Lists all known exceptions for the current CPU and details about them. li listinterrupts Lists all known interrupts for the current CPU and details about them. t trap ((e)xception|(i)nterrupt) <id> at addtrap ((e)xception|(i)nterrupt) <id> Adds an exception or interrupt trap for the exception/interrupt with the given identifier. rt removetrap ((e)xception|(i)nterrupt) <id> Removes an exception or interrupt trap for the exception/interrupt with the given identifier. rat removealltraps [(a)ll|(e)xceptions|(i)nterrupts] Removes all exception and/or all interrupt traps for the current CPU. If no arguments are supplied, all exception and all interrupt traps are removed. Disassembly, Labels & Comments ------------------------------ l list [<start>=last [#<instrs>=20|<end>]] ld listdisassembly [<start>=last [#<instrs>=20|<end>]] Lists the disassembled code of the current CPU for the given address range and/or number of instructions. If the start address is not supplied, the listing continues on from the last call, or from just before the current PC address if this is the first call. If the end address or instruction count is not supplied, then the default of 20 instructions are listed. If code analysis is enabled, then this will be used to align the instructions in the disassembly. If code analysis is off and the current PC address falls within the disassembly address range, then the instructions will line up with this. Otherwise, instruction alignment will simply begin at the start address. ll listlabels [(d)efault|(c)ustom|(a)utos|(e)ntrypoints|e(x)cephandlers|(i)interhandlers|(j)umptargets|(l)ooppoints] Lists all labels for the current CPU. The default option is to list all custom labels (user-added) and any auto-labels (labels generated by code analysis) of interest. The other options allow the display of particular types of auto-labels. al addlabel <addr> <name> Adds a custom label at the given address and with the given name. rl removelabel [<name>|<addr>] Removes a custom label with the given name or at the given address. If no argument is supplied, then it removes the custom label at the current PC address. ral removealllabels Removes all custom labels for the current CPU. ac addcomment <addr> <text...> Adds a code comment at the given address and with the given text. rc removecomment [<addr>] Removes the code comment at the given address. If no argument is supplied, then it removes the code comment at the current PC address. rac removeallcomments Removes all code comments for the current CPU. Breakpoints ----------- lb listbreakpoints Lists all breakpoints for the current CPU with details about them. b breakpoint [<addr> [[s)imple|(c)ount <count>|(p)rint)]] ab addbreakpoint [<addr> [[s)imple|(c)ount <count>|(p)rint)]] Adds a breakpoint at the given address. If no arguments are supplied, then it adds a simple breakpoint at the current PC address. Types of breakpoint (default is simple): (s)imple - if the location is hit, execution always breaks, (c)ount - if the location is hit the number of times specified by count, execution breaks. (p)rint - if the location is hit, a message is printed to the console, but control does not break. rb removebreakpoint [#<num>|<addr>] Removes the breakpoint with the given number of at the given address. If no arguments is supplied, then it removes the breakpoint at the current PC address. Memory, I/O & Watches --------------------- ln listregions Lists all known memory regions in the current CPU's address space. ly listmemory [<start>=last [#<rows>=8|<end>]] Lists the memory contents of the current CPU for the given address range and/or number of rows. If the start address is not supplied, the listing continues on from the last call, or from address 0 if this is the first call. If the end address or row count is not supplied, then the default of 8 rows are listed. py printmemory[.<size>=b] <addr> [(h)ex|hexdo(l)lar|hex(p)osth|(d)ecimal|(b)inary] Prints the current memory value at the given address for the current CPU. If no format is supplied, the default data format is used. The size specifier may be a number or (b)yte, (w)ord, (l)ong or (v)erylong. The default if omitted is byte. sy setmemory[.<size>=b] <addr> <value> Sets the memory value at the given address for the current CPU. The size specifier may be a number or (b)yte, (w)ord, (l)ong or (v)erylong. The default if omitted is byte. lo listios Lists all known I/Os (both mapped I/O addresses and I/O ports) for the current CPU and details about them. lw listmemwatches Lists all memory watches for the current CPU with details about them. w memwatch[.<size>=b] <addr> [((n)one|(r)ead|(w)rite|(rw)eadwrite) [((s)imple|(c)ount <count>|(m)atch <sequence>|captu(r)e <maxlen>|(p)rint)]] aw addmemwatch[.<size>=b] <addr> [((n)one|(r)ead|(w)rite|(rw)eadwrite) [((s)imple|(c)ount <count>|(m)atch <sequence>|captu(r)e <maxlen>|(p)rint)]] Adds a read/write memory watch at the given address. If (r)ead, (w)rite or (rw)eadwrite are specified then the watch also triggers an event (see below) when the address is read, written or either read or written, respectively. If (n)one is specified (the default), the watch does not trigger and simply remembers the last read/write at the given address (details about which are visible when listing memory watches). The size specifier may be a number or (b)yte, (w)ord, (l)ong or (v)erylong. The default if omitted is byte. If the address is mapped I/O address, then the size is ignored. Types of watch (default is simple): (s)imple - if the watch is triggered, execution always breaks, (c)ount - if the watch is triggered, execution breaks after the number of times specified by count, (m)atch - if the watch is triggered, execution breaks if the series of values read/written matches the given sequence of data (comma separated), captu(r)e - if the watch is triggered, the value read/written is recorded in a history whose maximum length is as specified, (p)rint - if the watch is triggered, a message with the value read/written is printed to the console. rw removememwatch (#<num>|<addr>) Removes the memory watch with the given number or at the given address. raw removeallmemwatches Removes all memory watches for the current CPU. lpw listportwatches Lists all I/O port watches for the current CPU with details about them. pw portwatch <port> [((n)one|(i)nput|(o)utput|(io)nputoutput) [(s)imple|(c)ount <count>|(m)atch <sequence>|captu(r)e <maxlen>|(p)rint]] apw addportwatch <port> [((n)one|(i)nput|(o)utput|(io)nputoutput) [(s)imple|(c)ount <count>|(m)atch <sequence>|captu(r)e <maxlen>|(p)rint]] Adds an input/output watch for the given I/O port. If (i)nput, (o)utput or (io)nputoutput are specified then the watch also triggers an event (see below) when the port is read (input), written (output) or either read or written, respectively. If (n)one is specified (the default), the watch does not trigger and simply remembers the last read/write for the given port (details about which are visible when listing port watches). Types of watch (default is simple): (s)imple - if the watch is triggered, execution always breaks, (c)ount - if the watch is triggered the number of times specified by count, execution breaks, (m)atch - if the watch is triggered, execution breaks if the series of values input/output matches the given sequence of data (comma separated), captu(r)e - if the watch is triggered, the value inputted/outputted is recorded in a history whose maximum length is as specified, (p)rint - if the watch is triggered, a message with the value inputted/outputted is printed to the console. rpw removeportwatch (#<num>|<port>) Removes the port watch with the given number or for the given port. rapw removeallportwatches Removes all port watches for the current CPU. General -------- p print[.<size>=v] <expr> [(h)ex|hex(z)ero|hexdo(l)lar|hex(p)osth|(d)ecimal|(b)inary] Prints the given expression as a number in the given format. If no format is supplied, the default data format is used. Currently the "expression" can just be a number, label or register name. The size specifier may be a number or (b)yte, (w)ord, (l)ong or (v)erylong. The default if omitted depends on the type of expression. cfg configure analysis [(o)n|of(f)] addrfmt [(h)ex|hex(z)ero|hexdo(l)lar|hex(p)osth|(d)ecimal|(b)inary] portfmt [(h)ex|hex(z)ero|hexdo(l)lar|hex(p)osth|(d)ecimal|(b)inary] datafmt [(h)ex|hex(z)ero|hexdo(l)lar|hex(p)osth|(d)ecimal|(b)inary] showlabels [(o)n|of(f)] showopcodes [(o)n|of(f)] membytesrow [<num>] Configures the debugger. If no arguments are passed, it outputs all the current settings. If a setting is supplied, it outputs the current value for the given setting. If both a setting and a value are supplied, it sets the current value for the given setting. ls loadstate <file> Loads the debugger state (custom labels and code comments) from the given file. ss savestate <file> Save the debugger state (custom labels and code comments) to the given file. h help Prints the available commands. x exit Exits the debugger and emulator. Emulator -------- les loademustate <file> Loads the emulator state from the given file. ses saveemustate <file> Saves the emulator state to the given file. res resetemu Resets the emulator. Inputs ------ lip listinputs Lists all available inputs for the current game. pip printinput (<id>|<label>) Prints details about the input with the given id or label. sip setinput (<id>|<label>) <mapping> Sets the current mapping for the input with the given id or label. rip resetinput (<id>|<label>) Resets the mapping to its default for the input with the given id or label. cip configinput (<id>|<label>) [(s)et|(a)ppend] Configures the input with the given id or label, in a similar fashion to -config-inputs. The default is to set the mapping but if append is specified the mapping is appended to. caip configallinputs Configures all the inputs for the current game, in a similar fashion to -config-inputs. Notes ----- The output of any command can be redirected to a file by adding the > or >> redirection symbols after the command together with the filename to write or append to, eg: listdisassembly MainEntry #50 > c:\disassembly.txt or listmemory $0000 $1000 >> ramdump.txt