AppleWin/source/Debugger/Debugger_Commands.cpp

535 lines
43 KiB
C++

/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 2009-2014, Tom Charlesworth, Michael Pohoreski
AppleWin is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
AppleWin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Debugger commands
*
* Author: Copyright (C) 2011 - 2011 Michael Pohoreski
*/
#include "StdAfx.h"
#include "Debug.h"
#include "..\Frame.h"
// Commands _______________________________________________________________________________________
#define DEBUGGER__COMMANDS_VERIFY_TXT__ "\xDE\xAD\xC0\xDE"
// Setting function to NULL, allows g_aCommands arguments to be safely listed here
// Commands should be listed alphabetically per category.
// For the list sorted by category, check Commands_e
// NOTE: Keep in sync Commands_e and g_aCommands[] ! Aliases are listed at the end.
Command_t g_aCommands[] =
{
// Assembler
// {"!" , CmdAssemberMini , CMD_ASSEMBLER_MINI , "Mini assembler" }
{"A" , CmdAssemble , CMD_ASSEMBLE , "Assemble instructions" }
// CPU (Main)
,{"." , CmdCursorJumpPC , CMD_CURSOR_JUMP_PC , "Locate the cursor in the disasm window" } // centered
,{"=" , CmdCursorSetPC , CMD_CURSOR_SET_PC , "Sets the PC to the current instruction" }
// ,{"g" , CmdGoNormalSpeed , CMD_GO_NORMAL , "Run @ normal speed [until PC == address]" }
// ,{"G" , CmdGoFullSpeed , CMD_GO_FULL , "Run @ full speed [until PC == address]" }
,{"G" , CmdGo , CMD_GO , "Run @ full speed [until PC == address]" }
,{"IN" , CmdIn , CMD_IN , "Input byte from IO $C0xx" }
,{"KEY" , CmdKey , CMD_INPUT_KEY , "Feed key into emulator" }
,{"JSR" , CmdJSR , CMD_JSR , "Call sub-routine" }
,{"NOP" , CmdNOP , CMD_NOP , "Zap the current instruction with a NOP" }
,{"OUT" , CmdOut , CMD_OUT , "Output byte to IO $C0xx" }
// CPU - Meta Info
,{"PROFILE" , CmdProfile , CMD_PROFILE , "List/Save 6502 profiling" }
,{"R" , CmdRegisterSet , CMD_REGISTER_SET , "Set register" }
// CPU - Stack
,{"POP" , CmdStackPop , CMD_STACK_POP }
,{"PPOP" , CmdStackPopPseudo , CMD_STACK_POP_PSEUDO }
,{"PUSH" , CmdStackPop , CMD_STACK_PUSH }
// ,{"RTS" , CmdStackReturn , CMD_STACK_RETURN }
,{"P" , CmdStepOver , CMD_STEP_OVER , "Step current instruction" }
,{"RTS" , CmdStepOut , CMD_STEP_OUT , "Step out of subroutine" }
// CPU - Meta Info
,{"T" , CmdTrace , CMD_TRACE , "Trace current instruction" }
,{"TF" , CmdTraceFile , CMD_TRACE_FILE , "Save trace to filename" }
,{"TL" , CmdTraceLine , CMD_TRACE_LINE , "Trace (with cycle counting)" }
,{"U" , CmdUnassemble , CMD_UNASSEMBLE , "Disassemble instructions" }
// ,{"WAIT" , CmdWait , CMD_WAIT , "Run until"
// Bookmarks
,{"BM" , CmdBookmark , CMD_BOOKMARK , "Alias for BMA (Bookmark Add)" }
,{"BMA" , CmdBookmarkAdd , CMD_BOOKMARK_ADD , "Add/Update addess to bookmark" }
,{"BMC" , CmdBookmarkClear , CMD_BOOKMARK_CLEAR , "Clear (remove) bookmark" }
,{"BML" , CmdBookmarkList , CMD_BOOKMARK_LIST , "List all bookmarks" }
,{"BMG" , CmdBookmarkGoto , CMD_BOOKMARK_GOTO , "Move cursor to bookmark" }
// ,{"BMLOAD" , CmdBookmarkLoad , CMD_BOOKMARK_LOAD , "Load bookmarks" }
,{"BMSAVE" , CmdBookmarkSave , CMD_BOOKMARK_SAVE , "Save bookmarks" }
// Breakpoints
,{"BRK" , CmdBreakInvalid , CMD_BREAK_INVALID , "Enter debugger on BRK or INVALID" }
,{"BRKOP" , CmdBreakOpcode , CMD_BREAK_OPCODE , "Enter debugger on opcode" }
,{"BP" , CmdBreakpoint , CMD_BREAKPOINT , "Alias for BPR (Breakpoint Register Add)" }
,{"BPA" , CmdBreakpointAddSmart , CMD_BREAKPOINT_ADD_SMART , "Add (smart) breakpoint" }
// ,{"BPP" , CmdBreakpointAddFlag , CMD_BREAKPOINT_ADD_FLAG , "Add breakpoint on flags" }
,{"BPR" , CmdBreakpointAddReg , CMD_BREAKPOINT_ADD_REG , "Add breakpoint on register value" } // NOTE! Different from SoftICE !!!!
,{"BPX" , CmdBreakpointAddPC , CMD_BREAKPOINT_ADD_PC , "Add breakpoint at current instruction" }
,{"BPIO" , CmdBreakpointAddIO , CMD_BREAKPOINT_ADD_IO , "Add breakpoint for IO address $C0xx" }
,{"BPM" , CmdBreakpointAddMem , CMD_BREAKPOINT_ADD_MEM , "Add breakpoint on memory access" } // SoftICE
,{"BPC" , CmdBreakpointClear , CMD_BREAKPOINT_CLEAR , "Clear (remove) breakpoint" } // SoftICE
,{"BPD" , CmdBreakpointDisable , CMD_BREAKPOINT_DISABLE , "Disable breakpoint- it is still in the list, just not active" } // SoftICE
,{"BPEDIT" , CmdBreakpointEdit , CMD_BREAKPOINT_EDIT , "Edit breakpoint" } // SoftICE
,{"BPE" , CmdBreakpointEnable , CMD_BREAKPOINT_ENABLE , "(Re)Enable disabled breakpoint" } // SoftICE
,{"BPL" , CmdBreakpointList , CMD_BREAKPOINT_LIST , "List all breakpoints" } // SoftICE
// ,{"BPLOAD" , CmdBreakpointLoad , CMD_BREAKPOINT_LOAD , "Loads breakpoints" }
,{"BPSAVE" , CmdBreakpointSave , CMD_BREAKPOINT_SAVE , "Saves breakpoints" }
// Config
,{"BENCHMARK" , CmdBenchmark , CMD_BENCHMARK , "Benchmark the emulator" }
,{"BW" , CmdConfigColorMono , CMD_CONFIG_BW , "Sets/Shows RGB for Black & White scheme" }
,{"COLOR" , CmdConfigColorMono , CMD_CONFIG_COLOR , "Sets/Shows RGB for color scheme" }
// ,{"OPTION" , CmdConfigMenu , CMD_CONFIG_MENU , "Access config options" }
,{"DISASM" , CmdConfigDisasm , CMD_CONFIG_DISASM , "Sets/Shows disassembly view options." }
,{"FONT" , CmdConfigFont , CMD_CONFIG_FONT , "Shows current font or sets new one" }
,{"HCOLOR" , CmdConfigHColor , CMD_CONFIG_HCOLOR , "Sets/Shows colors mapped to Apple HGR" }
,{"LOAD" , CmdConfigLoad , CMD_CONFIG_LOAD , "Load debugger configuration" }
,{"MONO" , CmdConfigColorMono , CMD_CONFIG_MONOCHROME , "Sets/Shows RGB for monochrome scheme" }
,{"SAVE" , CmdConfigSave , CMD_CONFIG_SAVE , "Save debugger configuration" }
,{"PWD" , CmdConfigGetDebugDir , CMD_CONFIG_GET_DEBUG_DIR , "Display current debugger directory for scripts & mem load/save." }
,{"CD" , CmdConfigSetDebugDir , CMD_CONFIG_SET_DEBUG_DIR , "Update current debugger directory." }
// Cursor
,{"RET" , CmdCursorJumpRetAddr , CMD_CURSOR_JUMP_RET_ADDR , "Sets the cursor to the subroutine caller" }
,{ "^" , NULL , CMD_CURSOR_LINE_UP } // \x2191 = Up Arrow (Unicode)
,{"Shift ^" , NULL , CMD_CURSOR_LINE_UP_1 }
,{ "v" , NULL , CMD_CURSOR_LINE_DOWN } // \x2193 = Dn Arrow (Unicode)
,{"Shift v" , NULL , CMD_CURSOR_LINE_DOWN_1 }
,{"PAGEUP" , CmdCursorPageUp , CMD_CURSOR_PAGE_UP , "Scroll up one screen" }
,{"PAGEUP256" , CmdCursorPageUp256 , CMD_CURSOR_PAGE_UP_256 , "Scroll up 256 bytes" } // Shift
,{"PAGEUP4K" , CmdCursorPageUp4K , CMD_CURSOR_PAGE_UP_4K , "Scroll up 4096 bytes" } // Ctrl
,{"PAGEDN" , CmdCursorPageDown , CMD_CURSOR_PAGE_DOWN , "Scroll down one scren" }
,{"PAGEDOWN256" , CmdCursorPageDown256 , CMD_CURSOR_PAGE_DOWN_256 , "Scroll down 256 bytes" } // Shift
,{"PAGEDOWN4K" , CmdCursorPageDown4K , CMD_CURSOR_PAGE_DOWN_4K , "Scroll down 4096 bytes" } // Ctrl
// Disassembler Data
,{"Z" , CmdDisasmDataDefByte1 , CMD_DISASM_DATA , "Treat byte [range] as data" }
,{"X" , CmdDisasmDataDefCode , CMD_DISASM_CODE , "Treat byte [range] as code" }
// TODO: Conflicts with monitor command #L -> 000DL
,{"B" , CmdDisasmDataList , CMD_DISASM_LIST , "List all byte ranges treated as data" }
// without symbol lookup
,{"DB" , CmdDisasmDataDefByte1 , CMD_DEFINE_DATA_BYTE1 , "Define byte(s)" }
,{"DB2" , CmdDisasmDataDefByte2 , CMD_DEFINE_DATA_BYTE2 , "Define byte array, display 2 bytes/line" }
,{"DB4" , CmdDisasmDataDefByte4 , CMD_DEFINE_DATA_BYTE4 , "Define byte array, display 4 bytes/line" }
,{"DB8" , CmdDisasmDataDefByte8 , CMD_DEFINE_DATA_BYTE8 , "Define byte array, display 8 bytes/line" }
,{"DW" , CmdDisasmDataDefWord1 , CMD_DEFINE_DATA_WORD1 , "Define address array" }
,{"DW2" , CmdDisasmDataDefWord2 , CMD_DEFINE_DATA_WORD2 , "Define address array, display 2 words/line" }
,{"DW4" , CmdDisasmDataDefWord4 , CMD_DEFINE_DATA_WORD4 , "Define address array, display 4 words/line" }
,{"ASC" , CmdDisasmDataDefString , CMD_DEFINE_DATA_STR , "Define text string" } // 2.7.0.26 Changed: DS to ASC because DS is used as "Define Space" assembler directive
// .{"DF" , CmdDisasmDataDefFloat , CMD_DEFINE_DATA_FLOAT , "Define AppleSoft (packed) Float" }
// .{"DFX" , CmdDisasmDataDefFloatUnpack , CMD_DEFINE_DATA_FLOAT2 , "Define AppleSoft (unpacked) Float" }
// with symbol lookup
// .{"DA<>" , CmdDisasmDataDefAddress8HL , CMD_DEFINE_ADDR_8_HL , "Define split array of addresses, high byte section followed by low byte section" }
// .{"DA><" , CmdDisasmDataDefAddress8LH , CMD_DEFINE_ADDR_8_LH , "Define split array of addresses, low byte section followed by high byte section" }
// .{"DA<" , CmdDisasmDataDefAddress8H , CMD_DEFINE_ADDR_BYTE_H , "Define array of high byte addresses" }
// .{"DB>" , CmdDisasmDataDefAddress8L , CMD_DEFINE_ADDR_BYTE_L , "Define array of low byte addresses" }
,{"DA" , CmdDisasmDataDefAddress16 , CMD_DEFINE_ADDR_WORD , "Define array of word addresses" }
// TODO: Rename config cmd: DISASM
// {"UA" , CmdDisasmDataSmart , CMD_SMART_DISASSEMBLE , "Analyze opcodes to determine if code or data" }
// Disk
,{"DISK" , CmdDisk , CMD_DISK , "Access Disk Drive Functions" }
// Flags
// {"FC" , CmdFlag , CMD_FLAG_CLEAR , "Clear specified Flag" } // NVRBDIZC see AW_CPU.cpp AF_*
// TODO: Conflicts with monitor command #L -> 000CL
,{"CL" , CmdFlag , CMD_FLAG_CLEAR , "Clear specified Flag" } // NVRBDIZC see AW_CPU.cpp AF_*
,{"CLC" , CmdFlagClear , CMD_FLAG_CLR_C , "Clear Flag Carry" } // 0 // Legacy
,{"CLZ" , CmdFlagClear , CMD_FLAG_CLR_Z , "Clear Flag Zero" } // 1
,{"CLI" , CmdFlagClear , CMD_FLAG_CLR_I , "Clear Flag Interrupts Disabled" } // 2
,{"CLD" , CmdFlagClear , CMD_FLAG_CLR_D , "Clear Flag Decimal (BCD)" } // 3
,{"CLB" , CmdFlagClear , CMD_FLAG_CLR_B , "CLear Flag Break" } // 4 // Legacy
,{"CLR" , CmdFlagClear , CMD_FLAG_CLR_R , "Clear Flag Reserved" } // 5
,{"CLV" , CmdFlagClear , CMD_FLAG_CLR_V , "Clear Flag Overflow" } // 6
,{"CLN" , CmdFlagClear , CMD_FLAG_CLR_N , "Clear Flag Negative (Sign)" } // 7
// ,{"FS" , CmdFlag , CMD_FLAG_SET , "Set specified Flag" }
,{"SE" , CmdFlag , CMD_FLAG_SET , "Set specified Flag" }
,{"SEC" , CmdFlagSet , CMD_FLAG_SET_C , "Set Flag Carry" } // 0
,{"SEZ" , CmdFlagSet , CMD_FLAG_SET_Z , "Set Flag Zero" } // 1
,{"SEI" , CmdFlagSet , CMD_FLAG_SET_I , "Set Flag Interrupts Disabled" } // 2
,{"SED" , CmdFlagSet , CMD_FLAG_SET_D , "Set Flag Decimal (BCD)" } // 3
,{"SEB" , CmdFlagSet , CMD_FLAG_SET_B , "Set Flag Break" } // 4 // Legacy
,{"SER" , CmdFlagSet , CMD_FLAG_SET_R , "Set Flag Reserved" } // 5
,{"SEV" , CmdFlagSet , CMD_FLAG_SET_V , "Set Flag Overflow" } // 6
,{"SEN" , CmdFlagSet , CMD_FLAG_SET_N , "Set Flag Negative" } // 7
// Help
,{"?" , CmdHelpList , CMD_HELP_LIST , "List all available commands" }
,{"HELP" , CmdHelpSpecific , CMD_HELP_SPECIFIC , "Help on specific command" }
,{"VERSION" , CmdVersion , CMD_VERSION , "Displays version of emulator/debugger" }
,{"MOTD" , CmdMOTD , CMD_MOTD } // MOTD: Message Of The Day
// Memory
,{"MC" , CmdMemoryCompare , CMD_MEMORY_COMPARE }
,{"MD1" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_1 , "Hex dump in the mini memory area 1" }
,{"MD2" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_2 , "Hex dump in the mini memory area 2" }
,{"MA1" , CmdMemoryMiniDumpAscii , CMD_MEM_MINI_DUMP_ASCII_1 , "ASCII text in mini memory area 1" }
,{"MA2" , CmdMemoryMiniDumpAscii , CMD_MEM_MINI_DUMP_ASCII_2 , "ASCII text in mini memory area 2" }
,{"MT1" , CmdMemoryMiniDumpApple , CMD_MEM_MINI_DUMP_APPLE_1 , "Apple Text in mini memory area 1" }
,{"MT2" , CmdMemoryMiniDumpApple , CMD_MEM_MINI_DUMP_APPLE_2 , "Apple Text in mini memory area 2" }
// {"ML1" , CmdMemoryMiniDumpLow , CMD_MEM_MINI_DUMP_TXT_LO_1 , "Text (Ctrl) in mini memory dump area 1" }
// {"ML2" , CmdMemoryMiniDumpLow , CMD_MEM_MINI_DUMP_TXT_LO_2 , "Text (Ctrl) in mini memory dump area 2" }
// {"MH1" , CmdMemoryMiniDumpHigh , CMD_MEM_MINI_DUMP_TXT_HI_1 , "Text (High) in mini memory dump area 1" }
// {"MH2" , CmdMemoryMiniDumpHigh , CMD_MEM_MINI_DUMP_TXT_HI_2 , "Text (High) in mini memory dump area 2" }
,{"ME" , CmdMemoryEdit , CMD_MEMORY_EDIT , "Memory Editor - Not Implemented!" } // TODO: like Copy ][+ Sector Edit
,{"MEB" , CmdMemoryEnterByte , CMD_MEMORY_ENTER_BYTE , "Enter byte" }
,{"MEW" , CmdMemoryEnterWord , CMD_MEMORY_ENTER_WORD , "Enter word" }
,{"BLOAD" , CmdMemoryLoad , CMD_MEMORY_LOAD , "Load a region of memory" }
,{"M" , CmdMemoryMove , CMD_MEMORY_MOVE , "Memory move" }
,{"BSAVE" , CmdMemorySave , CMD_MEMORY_SAVE , "Save a region of memory" }
,{"S" , CmdMemorySearch , CMD_MEMORY_SEARCH , "Search memory for text / hex values" }
,{"@" ,_SearchMemoryDisplay , CMD_MEMORY_FIND_RESULTS , "Display search memory results" }
// ,{"SA" , CmdMemorySearchAscii , CMD_MEMORY_SEARCH_ASCII , "Search ASCII text" }
// ,{"ST" , CmdMemorySearchApple , CMD_MEMORY_SEARCH_APPLE , "Search Apple text (hi-bit)" }
,{"SH" , CmdMemorySearchHex , CMD_MEMORY_SEARCH_HEX , "Search memory for hex values" }
,{"F" , CmdMemoryFill , CMD_MEMORY_FILL , "Memory fill" }
,{"NTSC" , CmdNTSC , CMD_NTSC , "Save/Load the NTSC palette" }
,{"TSAVE" , CmdTextSave , CMD_TEXT_SAVE , "Save text screen" }
// Output / Scripts
,{"CALC" , CmdOutputCalc , CMD_OUTPUT_CALC , "Display mini calc result" }
,{"ECHO" , CmdOutputEcho , CMD_OUTPUT_ECHO , "Echo string to console" } // or toggle command echoing"
,{"PRINT" , CmdOutputPrint , CMD_OUTPUT_PRINT , "Display string and/or hex values" }
,{"PRINTF" , CmdOutputPrintf , CMD_OUTPUT_PRINTF , "Display formatted string" }
,{"RUN" , CmdOutputRun , CMD_OUTPUT_RUN , "Run script file of debugger commands" }
// Source Level Debugging
,{"SOURCE" , CmdSource , CMD_SOURCE , "Starts/Stops source level debugging" }
,{"SYNC" , CmdSync , CMD_SYNC , "Syncs the cursor to the source file" }
// Symbols
,{"SYM" , CmdSymbols , CMD_SYMBOLS_LOOKUP , "Lookup symbol or address, or define symbol" }
,{"SYMMAIN" , CmdSymbolsCommand , CMD_SYMBOLS_ROM , "Main/ROM symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMBASIC" , CmdSymbolsCommand , CMD_SYMBOLS_APPLESOFT , "Applesoft symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMASM" , CmdSymbolsCommand , CMD_SYMBOLS_ASSEMBLY , "Assembly symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMUSER" , CmdSymbolsCommand , CMD_SYMBOLS_USER_1 , "First user symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMUSER2" , CmdSymbolsCommand , CMD_SYMBOLS_USER_2 , "Second User symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMSRC" , CmdSymbolsCommand , CMD_SYMBOLS_SRC_1 , "First Source symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMSRC2" , CmdSymbolsCommand , CMD_SYMBOLS_SRC_2 , "Second Source symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMDOS33" , CmdSymbolsCommand , CMD_SYMBOLS_DOS33 , "DOS 3.3 symbol table lookup/menu" } // CLEAR,LOAD,SAVE
,{"SYMPRODOS" , CmdSymbolsCommand , CMD_SYMBOLS_PRODOS , "ProDOS symbol table lookup/menu" } // CLEAR,LOAD,SAVE
// ,{"SYMCLEAR" , CmdSymbolsClear , CMD_SYMBOLS_CLEAR } // can't use SC = SetCarry
,{"SYMINFO" , CmdSymbolsInfo , CMD_SYMBOLS_INFO , "Display summary of symbols" }
,{"SYMLIST" , CmdSymbolsList , CMD_SYMBOLS_LIST , "Lookup symbol in main/user/src tables" } // 'symbolname', can't use param '*'
// Variables
// ,{"CLEAR" , CmdVarsClear , CMD_VARIABLES_CLEAR }
// ,{"VAR" , CmdVarsDefine , CMD_VARIABLES_DEFINE }
// ,{"INT8" , CmdVarsDefineInt8 , CMD_VARIABLES_DEFINE_INT8 }
// ,{"INT16" , CmdVarsDefineInt16 , CMD_VARIABLES_DEFINE_INT16 }
// ,{"VARS" , CmdVarsList , CMD_VARIABLES_LIST }
// ,{"VARSLOAD" , CmdVarsLoad , CMD_VARIABLES_LOAD }
// ,{"VARSSAVE" , CmdVarsSave , CMD_VARIABLES_SAVE }
// ,{"SET" , CmdVarsSet , CMD_VARIABLES_SET }
// View
,{"TEXT" , CmdViewOutput_Text4X , CMD_VIEW_TEXT4X , "View Text screen (current page)" }
,{"TEXT1" , CmdViewOutput_Text41 , CMD_VIEW_TEXT41 , "View Text screen Page 1" }
,{"TEXT2" , CmdViewOutput_Text42 , CMD_VIEW_TEXT42 , "View Text screen Page 2" }
,{"TEXT80" , CmdViewOutput_Text8X , CMD_VIEW_TEXT8X , "View 80-col Text screen (current page)" }
,{"TEXT81" , CmdViewOutput_Text81 , CMD_VIEW_TEXT81 , "View 80-col Text screen Page 1" }
,{"TEXT82" , CmdViewOutput_Text82 , CMD_VIEW_TEXT82 , "View 80-col Text screen Page 2" }
,{"GR" , CmdViewOutput_GRX , CMD_VIEW_GRX , "View Lo-Res screen (current page)" }
,{"GR1" , CmdViewOutput_GR1 , CMD_VIEW_GR1 , "View Lo-Res screen Page 1" }
,{"GR2" , CmdViewOutput_GR2 , CMD_VIEW_GR2 , "View Lo-Res screen Page 2" }
,{"DGR" , CmdViewOutput_DGRX , CMD_VIEW_DGRX , "View Double lo-res (current page)" }
,{"DGR1" , CmdViewOutput_DGR1 , CMD_VIEW_DGR1 , "View Double lo-res Page 1" }
,{"DGR2" , CmdViewOutput_DGR2 , CMD_VIEW_DGR2 , "View Double lo-res Page 2" }
,{"HGR" , CmdViewOutput_HGRX , CMD_VIEW_HGRX , "View Hi-res (current page)" }
,{"HGR1" , CmdViewOutput_HGR1 , CMD_VIEW_HGR1 , "View Hi-res Page 1" }
,{"HGR2" , CmdViewOutput_HGR2 , CMD_VIEW_HGR2 , "View Hi-res Page 2" }
,{"DHGR" , CmdViewOutput_DHGRX , CMD_VIEW_DHGRX , "View Double Hi-res (current page)" }
,{"DHGR1" , CmdViewOutput_DHGR1 , CMD_VIEW_DHGR1 , "View Double Hi-res Page 1" }
,{"DHGR2" , CmdViewOutput_DHGR2 , CMD_VIEW_DHGR2 , "View Double Hi-res Page 2" }
// Watch
,{"W" , CmdWatch , CMD_WATCH , "Alias for WA (Watch Add)" }
,{"WA" , CmdWatchAdd , CMD_WATCH_ADD , "Add/Update address or symbol to watch" }
,{"WC" , CmdWatchClear , CMD_WATCH_CLEAR , "Clear (remove) watch" }
,{"WD" , CmdWatchDisable , CMD_WATCH_DISABLE , "Disable specific watch - listed not active" }
,{"WE" , CmdWatchEnable , CMD_WATCH_ENABLE , "(Re)Enable disabled watch" }
,{"WL" , CmdWatchList , CMD_WATCH_LIST , "List all watches" }
// ,{"WLOAD" , CmdWatchLoad , CMD_WATCH_LOAD , "Load Watches" } // Cant use as param to W
,{"WSAVE" , CmdWatchSave , CMD_WATCH_SAVE , "Save Watches" } // due to symbol look-up
// Window
,{"WIN" , CmdWindow , CMD_WINDOW , "Show specified debugger window" }
// CODE 0, CODE 1, CODE 2 ... ???
,{"CODE" , CmdWindowViewCode , CMD_WINDOW_CODE , "Switch to full code window" } // Can't use WC = WatchClear
,{"CODE1" , CmdWindowShowCode1 , CMD_WINDOW_CODE_1 , "Show code on top split window" }
,{"CODE2" , CmdWindowShowCode2 , CMD_WINDOW_CODE_2 , "Show code on bottom split window" }
,{"CONSOLE" , CmdWindowViewConsole , CMD_WINDOW_CONSOLE , "Switch to full console window" }
,{"DATA" , CmdWindowViewData , CMD_WINDOW_DATA , "Switch to full data window" }
,{"DATA1" , CmdWindowShowData1 , CMD_WINDOW_DATA_1 , "Show data on top split window" }
,{"DATA2" , CmdWindowShowData2 , CMD_WINDOW_DATA_2 , "Show data on bottom split window" }
,{"SOURCE1" , CmdWindowShowSource1 , CMD_WINDOW_SOURCE_1 , "Show source on top split screen" }
,{"SOURCE2" , CmdWindowShowSource2 , CMD_WINDOW_SOURCE_2 , "Show source on bottom split screen" }
,{"\\" , CmdWindowViewOutput , CMD_WINDOW_OUTPUT , "Display Apple output until key pressed" }
// ,{"INFO" , CmdToggleInfoPanel , CMD_WINDOW_TOGGLE }
// ,{"WINSOURCE" , CmdWindowShowSource , CMD_WINDOW_SOURCE }
// ,{"ZEROPAGE" , CmdWindowShowZeropage , CMD_WINDOW_ZEROPAGE }
// Zero Page
,{"ZP" , CmdZeroPage , CMD_ZEROPAGE_POINTER , "Alias for ZPA (Zero Page Add)" }
,{"ZP0" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_0 , "Set/Update/Remove ZP watch 0 " }
,{"ZP1" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_1 , "Set/Update/Remove ZP watch 1" }
,{"ZP2" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_2 , "Set/Update/Remove ZP watch 2" }
,{"ZP3" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_3 , "Set/Update/Remove ZP watch 3" }
,{"ZP4" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_4 , "Set/Update/Remove ZP watch 4" }
,{"ZP5" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_5 , "Set/Update/Remove ZP watch 5 " }
,{"ZP6" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_6 , "Set/Update/Remove ZP watch 6" }
,{"ZP7" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_7 , "Set/Update/Remove ZP watch 7" }
,{"ZPA" , CmdZeroPageAdd , CMD_ZEROPAGE_POINTER_ADD , "Add/Update address to zero page pointer" }
,{"ZPC" , CmdZeroPageClear , CMD_ZEROPAGE_POINTER_CLEAR , "Clear (remove) zero page pointer" }
,{"ZPD" , CmdZeroPageDisable , CMD_ZEROPAGE_POINTER_DISABLE, "Disable zero page pointer" }
,{"ZPE" , CmdZeroPageEnable , CMD_ZEROPAGE_POINTER_ENABLE , "(Re)Enable disabled zero page pointer" }
,{"ZPL" , CmdZeroPageList , CMD_ZEROPAGE_POINTER_LIST , "List all zero page pointers" }
// ,{"ZPLOAD" , CmdZeroPageLoad , CMD_ZEROPAGE_POINTER_LOAD , "Load zero page pointers" } // Cant use as param to ZP
,{"ZPSAVE" , CmdZeroPageSave , CMD_ZEROPAGE_POINTER_SAVE , "Save zero page pointers" } // due to symbol look-up
// {"TIMEDEMO"),CmdTimeDemo, CMD_TIMEDEMO }, // CmdBenchmarkStart(), CmdBenchmarkStop()
// {"WC"),CmdShowCodeWindow}, // Can't use since WatchClear
// {"WD"),CmdShowDataWindow}, //
// Internal Consistency Check
,{ DEBUGGER__COMMANDS_VERIFY_TXT__, NULL, NUM_COMMANDS }
// Aliasies - Can be in any order
,{"->" , NULL , CMD_CURSOR_JUMP_PC }
,{"Ctrl ->" , NULL , CMD_CURSOR_SET_PC }
,{"Shift ->" , NULL , CMD_CURSOR_JUMP_PC } // at top
,{"INPUT" , CmdIn , CMD_IN }
// Data
// Flags - Clear
,{"RC" , CmdFlagClear , CMD_FLAG_CLR_C , "Clear Flag Carry" } // 0 // Legacy
,{"RZ" , CmdFlagClear , CMD_FLAG_CLR_Z , "Clear Flag Zero" } // 1
,{"RI" , CmdFlagClear , CMD_FLAG_CLR_I , "Clear Flag Interrupts Disabled" } // 2
,{"RD" , CmdFlagClear , CMD_FLAG_CLR_D , "Clear Flag Decimal (BCD)" } // 3
,{"RB" , CmdFlagClear , CMD_FLAG_CLR_B , "CLear Flag Break" } // 4 // Legacy
,{"RR" , CmdFlagClear , CMD_FLAG_CLR_R , "Clear Flag Reserved" } // 5
,{"RV" , CmdFlagClear , CMD_FLAG_CLR_V , "Clear Flag Overflow" } // 6
,{"RN" , CmdFlagClear , CMD_FLAG_CLR_N , "Clear Flag Negative (Sign)" } // 7
// Flags - Set
,{"SC" , CmdFlagSet , CMD_FLAG_SET_C , "Set Flag Carry" } // 0
,{"SZ" , CmdFlagSet , CMD_FLAG_SET_Z , "Set Flag Zero" } // 1
,{"SI" , CmdFlagSet , CMD_FLAG_SET_I , "Set Flag Interrupts Disabled" } // 2
,{"SD" , CmdFlagSet , CMD_FLAG_SET_D , "Set Flag Decimal (BCD)" } // 3
,{"SB" , CmdFlagSet , CMD_FLAG_SET_B , "CLear Flag Break" } // 4 // Legacy
,{"SR" , CmdFlagSet , CMD_FLAG_SET_R , "Clear Flag Reserved" } // 5
,{"SV" , CmdFlagSet , CMD_FLAG_SET_V , "Clear Flag Overflow" } // 6
,{"SN" , CmdFlagSet , CMD_FLAG_SET_N , "Clear Flag Negative" } // 7
// Memory
,{"D" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_1 , "Hex dump in the mini memory area 1" } // FIXME: Must also work in DATA screen
,{"M1" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_1 } // alias
,{"M2" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_2 } // alias
,{"ME8" , CmdMemoryEnterByte , CMD_MEMORY_ENTER_BYTE } // changed from EB -- bugfix: EB:## ##
,{"ME16" , CmdMemoryEnterWord , CMD_MEMORY_ENTER_WORD }
,{"MM" , CmdMemoryMove , CMD_MEMORY_MOVE }
,{"MS" , CmdMemorySearch , CMD_MEMORY_SEARCH } // CmdMemorySearch
,{"P0" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_0 }
,{"P1" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_1 }
,{"P2" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_2 }
,{"P3" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_3 }
,{"P4" , CmdZeroPagePointer , CMD_ZEROPAGE_POINTER_4 }
,{"REGISTER" , CmdRegisterSet , CMD_REGISTER_SET }
// ,{"RET" , CmdStackReturn , CMD_STACK_RETURN }
,{"TRACE" , CmdTrace , CMD_TRACE }
// ,{"SYMBOLS" , CmdSymbols , CMD_SYMBOLS_LOOKUP , "Return " }
// ,{"SYMBOLS1" , CmdSymbolsInfo , CMD_SYMBOLS_1 }
// ,{"SYMBOLS2" , CmdSymbolsInfo , CMD_SYMBOLS_2 }
// ,{"SYM0" , CmdSymbolsInfo , CMD_SYMBOLS_ROM }
// ,{"SYM1" , CmdSymbolsInfo , CMD_SYMBOLS_APPLESOFT }
// ,{"SYM2" , CmdSymbolsInfo , CMD_SYMBOLS_ASSEMBLY }
// ,{"SYM3" , CmdSymbolsInfo , CMD_SYMBOLS_USER_1 }
// ,{"SYM4" , CmdSymbolsInfo , CMD_SYMBOLS_USER_2 }
// ,{"SYM5" , CmdSymbolsInfo , CMD_SYMBOLS_SRC_1 }
// ,{"SYM6" , CmdSymbolsInfo , CMD_SYMBOLS_SRC_2 }
,{"SYMDOS" , CmdSymbolsCommand , CMD_SYMBOLS_DOS33 }
,{"SYMPRO" , CmdSymbolsCommand , CMD_SYMBOLS_PRODOS }
,{"TEXT40" , CmdViewOutput_Text4X , CMD_VIEW_TEXT4X }
,{"TEXT41" , CmdViewOutput_Text41 , CMD_VIEW_TEXT41 }
,{"TEXT42" , CmdViewOutput_Text42 , CMD_VIEW_TEXT42 }
// ,{"WATCH" , CmdWatchAdd , CMD_WATCH_ADD }
,{"WINDOW" , CmdWindow , CMD_WINDOW }
// ,{"W?" , CmdWatchAdd , CMD_WATCH_ADD }
,{"ZAP" , CmdNOP , CMD_NOP }
// DEPRECATED -- Probably should be removed in a future version
,{"BENCH" , CmdBenchmarkStart , CMD_BENCHMARK } // already hae BENCHMARK
,{"EXITBENCH" , NULL , CMD_BENCHMARK } // 2.8.03 was incorrectly alias with 'E' Bug #246. // CmdBenchmarkStop
,{"MDB" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_1 } // MemoryDumpByte // Did anyone actually use this??
// ,{"MEMORY" , CmdMemoryMiniDumpHex , CMD_MEM_MINI_DUMP_HEX_1 } // MemoryDumpByte // Did anyone actually use this??
};
const int NUM_COMMANDS_WITH_ALIASES = sizeof(g_aCommands) / sizeof (Command_t); // Determined at compile-time ;-)
// Parameters _____________________________________________________________________________________
#define DEBUGGER__PARAMS_VERIFY_TXT__ "\xDE\xAD\xDA\x1A"
// NOTE: Order MUST match Parameters_e[] !!!
Command_t g_aParameters[] =
{
// Breakpoint
{"<=" , NULL, PARAM_BP_LESS_EQUAL }
,{"<" , NULL, PARAM_BP_LESS_THAN }
,{"=" , NULL, PARAM_BP_EQUAL }
,{"!=" , NULL, PARAM_BP_NOT_EQUAL }
,{"!" , NULL, PARAM_BP_NOT_EQUAL_1 }
,{">" , NULL, PARAM_BP_GREATER_THAN }
,{">=" , NULL, PARAM_BP_GREATER_EQUAL }
,{"R" , NULL, PARAM_BP_READ }
,{"?" , NULL, PARAM_BP_READ }
,{"W" , NULL, PARAM_BP_WRITE }
,{"@" , NULL, PARAM_BP_WRITE }
,{"*" , NULL, PARAM_BP_READ_WRITE }
// Regs (for PUSH / POP)
,{"A" , NULL, PARAM_REG_A }
,{"X" , NULL, PARAM_REG_X }
,{"Y" , NULL, PARAM_REG_Y }
,{"PC" , NULL, PARAM_REG_PC }
,{"S" , NULL, PARAM_REG_SP }
// ,{"G" , NULL, PARAM_REG_PC }
// Flags
,{"P" , NULL, PARAM_FLAGS }
,{"C" , NULL, PARAM_FLAG_C } // ---- ---1 Carry
,{"Z" , NULL, PARAM_FLAG_Z } // ---- --1- Zero
,{"I" , NULL, PARAM_FLAG_I } // ---- -1-- Interrupt
,{"D" , NULL, PARAM_FLAG_D } // ---- 1--- Decimal
,{"B" , NULL, PARAM_FLAG_B } // ---1 ---- Break
,{"R" , NULL, PARAM_FLAG_R } // --1- ---- Reserved
,{"V" , NULL, PARAM_FLAG_V } // -1-- ---- Overflow
,{"N" , NULL, PARAM_FLAG_N } // 1--- ---- Sign
// Disasm
,{"BRANCH" , NULL, PARAM_CONFIG_BRANCH }
,{"COLON" , NULL, PARAM_CONFIG_COLON }
,{"OPCODE" , NULL, PARAM_CONFIG_OPCODE }
,{"POINTER" , NULL, PARAM_CONFIG_POINTER }
,{"SPACES" , NULL, PARAM_CONFIG_SPACES }
,{"TARGET" , NULL, PARAM_CONFIG_TARGET }
// Disk
,{"EJECT" , NULL, PARAM_DISK_EJECT }
,{"INFO" , NULL, PARAM_DISK_INFO }
,{"PROTECT" , NULL, PARAM_DISK_PROTECT }
,{"READ" , NULL, PARAM_DISK_READ }
// Font (Config)
,{"MODE" , NULL, PARAM_FONT_MODE } // also INFO, CONSOLE, DISASM (from Window)
// General
,{"FIND" , NULL, PARAM_FIND }
,{"BRANCH" , NULL, PARAM_BRANCH }
,{"CATEGORY" , NULL, PARAM_CATEGORY }
,{"CLEAR" , NULL, PARAM_CLEAR }
,{"LOAD" , NULL, PARAM_LOAD }
,{"LIST" , NULL, PARAM_LIST }
,{"OFF" , NULL, PARAM_OFF }
,{"ON" , NULL, PARAM_ON }
,{"RESET" , NULL, PARAM_RESET }
,{"SAVE" , NULL, PARAM_SAVE }
,{"START" , NULL, PARAM_START } // benchmark
,{"STOP" , NULL, PARAM_STOP } // benchmark
// Help Categories
,{"*" , NULL, PARAM_WILDSTAR }
,{"BOOKMARKS" , NULL, PARAM_CAT_BOOKMARKS }
,{"BREAKPOINTS", NULL, PARAM_CAT_BREAKPOINTS }
,{"CONFIG" , NULL, PARAM_CAT_CONFIG }
,{"CPU" , NULL, PARAM_CAT_CPU }
// ,{"EXPRESSION" ,
,{"FLAGS" , NULL, PARAM_CAT_FLAGS }
,{"HELP" , NULL, PARAM_CAT_HELP }
,{"KEYBOARD" , NULL, PARAM_CAT_KEYBOARD }
,{"MEMORY" , NULL, PARAM_CAT_MEMORY } // alias // SOURCE [SYMBOLS] [MEMORY] filename
,{"OUTPUT" , NULL, PARAM_CAT_OUTPUT }
,{"OPERATORS" , NULL, PARAM_CAT_OPERATORS }
,{"RANGE" , NULL, PARAM_CAT_RANGE }
// ,{"REGISTERS" NULL, PARAM_CAT_REGISTERS }
,{"SYMBOLS" , NULL, PARAM_CAT_SYMBOLS }
,{"VIEW" , NULL, PARAM_CAT_VIEW }
,{"WATCHES" , NULL, PARAM_CAT_WATCHES }
,{"WINDOW" , NULL, PARAM_CAT_WINDOW }
,{"ZEROPAGE" , NULL, PARAM_CAT_ZEROPAGE }
// Memory
,{"?" , NULL, PARAM_MEM_SEARCH_WILD }
// ,{"*" , NULL, PARAM_MEM_SEARCH_BYTE }
// Source level debugging
,{"MEM" , NULL, PARAM_SRC_MEMORY }
,{"MEMORY" , NULL, PARAM_SRC_MEMORY }
,{"SYM" , NULL, PARAM_SRC_SYMBOLS }
,{"SYMBOLS" , NULL, PARAM_SRC_SYMBOLS }
,{"MERLIN" , NULL, PARAM_SRC_MERLIN }
,{"ORCA" , NULL, PARAM_SRC_ORCA }
// View
// ,{"VIEW") , NULL, PARAM_SRC_??? },
// Window Win Cmd WinEffects CmdEffects
,{"CODE" , NULL, PARAM_CODE } // x x code win only switch to code window
// ,{"CODE1" , NULL, PARAM_CODE_1 } // - x code/data win
,{"CODE2" , NULL, PARAM_CODE_2 } // - x code/data win
,{"CONSOLE" , NULL, PARAM_CONSOLE } // x - switch to console window
,{"DATA" , NULL, PARAM_DATA } // x x data win only switch to data window
// ,{"DATA1" , NULL, PARAM_DATA_1 } // - x code/data win
,{"DATA2" , NULL, PARAM_DATA_2 } // - x code/data win
,{"DISASM" , NULL, PARAM_DISASM } //
,{"INFO" , NULL, PARAM_INFO } // - x code/data Toggles showing/hiding Regs/Stack/BP/Watches/ZP
,{"SOURCE" , NULL, PARAM_SOURCE } // x x switch to source window
,{"SRC" , NULL, PARAM_SOURCE } // alias
// ,{"SOURCE_1" , NULL, PARAM_SOURCE_1 } // - x code/data
,{"SOURCE2 " , NULL, PARAM_SOURCE_2 } // - x
,{"SYMBOLS" , NULL, PARAM_SYMBOLS } // x x code/data win switch to symbols window
,{"SYM" , NULL, PARAM_SYMBOLS } // alias x SOURCE [SYM] [MEM] filename
// ,{"SYMBOL1" , NULL, PARAM_SYMBOL_1 } // - x code/data win
,{"SYMBOL2" , NULL, PARAM_SYMBOL_2 } // - x code/data win
// Internal Consistency Check
,{DEBUGGER__PARAMS_VERIFY_TXT__,NULL,NUM_PARAMS}
};
//===========================================================================
void VerifyDebuggerCommandTable()
{
char sText[ CONSOLE_WIDTH * 2 ];
for (int iCmd = 0; iCmd < NUM_COMMANDS; iCmd++ )
{
if ( g_aCommands[ iCmd ].iCommand != iCmd)
{
sprintf( sText, "*** ERROR *** Enumerated Commands mis-matched at #%d!", iCmd );
MessageBoxA( g_hFrameWindow, sText, "ERROR", MB_OK );
PostQuitMessage( 1 );
}
}
// _tcscmp
if (strcmp( g_aCommands[ NUM_COMMANDS ].m_sName, DEBUGGER__COMMANDS_VERIFY_TXT__))
{
sprintf( sText, "*** ERROR *** Total Commands mis-matched!" );
MessageBoxA( g_hFrameWindow, sText, "ERROR", MB_OK );
PostQuitMessage( 1 );
}
if (strcmp( g_aParameters[ NUM_PARAMS ].m_sName, DEBUGGER__PARAMS_VERIFY_TXT__))
{
sprintf( sText, "*** ERROR *** Total Parameters mis-matched!" );
MessageBoxA( g_hFrameWindow, sText, "ERROR", MB_OK );
PostQuitMessage( 2 );
}
}