diff --git a/AppleWin/source/Debug.cpp b/AppleWin/source/Debug.cpp index e273f35c..df23dfd9 100644 --- a/AppleWin/source/Debug.cpp +++ b/AppleWin/source/Debug.cpp @@ -42,214 +42,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // TODO: COLOR SAVE ["filename"] // TODO: COLOR LOAD ["filename"] - // TCHAR DEBUG_VERSION = "0.0.0.0"; // App Version - const int DEBUGGER_VERSION = MAKE_VERSION(2,5,0,1); - -// .1 SH Address,Len Byte [Byte ..] -// 2.5 split Debugger files - -// .21 Changed: Branch indicator now a little bigger +3 in DebugInitialize() (easier to read), indented ^,V to make the < stand out -// U 300 -// E 300 D0 80 D0 FE D0 00 -// .20 Added: BW is now a seperate color scheme -// .19 Added: ECHO CmdConfigEcho(), g_pConsoleFirstArg, and ArgsGet() -// .18 Changed: BPX now defaults to setting breakpoint at cursor. -// .17 Changed: BP now defaults to setting breakpoint at PC. - -// Patch 22 -// .16 fixed BPM. i.e. BPM C400,100. Boot: ulti4bo.dsk, breaks at: 81BC: STA ($88),Y $0088=$C480 ... C483: A0 - -// Patch 21 -// .15 Fixed: CmdRegisterSet() equal sign is now optional. i.e. R A [=] Y -// .14 Optimized: ArgsCook() -// .13 Fixed: HELP "..." on ambigious command displays potential commands -// .12 Added: Token %, calculator mod -// .11 Added: Token /, calculator div -// .10 Added: Token ^, calculator bit-xor -// .9 Added: Token |, calculator bit-or -// .8 Added: Token &, calculator bit-and -// .7 Added: Mini-Assembler -// .6 Added: MOTD (Message of the Day) : Moved from DebugBegin() -// .5 Added: HELP SOURCE -// .4 Fixed: SYMMAIN SYMUSER SYMSRC to now only search their respective symbol tables -// .3 Added: _CmdSymbolList_Address2Symbol() _CmdSymbolList_Symbol2Address() now take bit-flags of which tables to search -// .2 Added: EB alias for E -// .1 Added: EW address value16 CmdMemoryEnterWord() to set memory with 16-Bit Values -// 2.4.2.0 -// .14 Added: SYM ! name to remove (user) symbol. _CmdSymbolsUpdate() -// .13 Added: JSR address|symbol CmdJSR() -// .12 Fixed: SYM address|symbol now reports if address or symbol not found. CmdSymbolsList() -// .11 Fixed PageUp*, PagDn* not being recognized valid commands. - -// Patch 20 -// .10 Added: SYM2 symbolname = value -// .9 Added: Undocumented command: FONT * -// .8 Improved: FONT MODE # is now more accurate. i.e. U 301 -// FONT MODE 0 Classic line spacing (19 lines: 301 .. 313) -// FONT MODE 1 Improved line spacing (20 lines: 301 .. 314) -// FONT MODE 2 Optimal line spacing (22 lines: 301 .. 316) -// .7 Fixed: ArgsCook() wasn't parsing #value properly. i.e. CALC #A+0A -// .6 Cleanup: DrawWatches() - -// Patch 19 -// .5 Fixed: ProfileSave() doesn't strip '%' percent signs anymore. Changed: fprintf() to fputs() -// Fixed: PROFILE RESET doesn't do dummy run of formatting profile data. -// .4 Fixed: Exporting Profile data is now Excel/OpenOffice friendly. -// Zero counts not listed on console. (They are when saved to file.) - -// Patch 18 -// .3 Fixed: Help_Arg_1() now copies command name into arg.name -// .2 Fixed: Temporarily removed extra windows that aren't done yet from showing up: WINDOW_IO WINDOW_SYMBOLS WINDOW_ZEROPAGE WINDOW_SOURCE -// .1 Added: PROFILE LIST -- can now view the profile data from witin the debugger! -// 2.4.1 Added: PROFILE SAVE -- now we can optimize (D0 BNE), and (10 BPL) sucking up the major of the emulator's time. WOOT! -// Added: _6502GetOpmodeOpbyte() and _6502GetOpcodeOpmode() -// .37 Fixed: Misc. commands not updating the console when processed - -// Patch 17 -// .36 Data window now shows text dump based on memory view set (ASCII or APPLE) -// MA1 D0D0; DATA; -// MT1 D0D0; DATA; -// D D0D0; DATA; -// .35 Renamed: ML1 ML2 to MT1 MT2 (Mem Text) -// .34 Removed: MH1 MH2 (redundant MEM_VIEW_APPLE_TEXT) -// .33 Fixed: Tweaking of Lo,Hi,Norm Ascii colors for Disasm Immediate & Memory Dumps -// ML1 D0D0; MH2 D0D0; U FA75 -// .32 Changed: Lo now maps High Ascii to printable chars. i.e. ML1 D0D0 -// .31 Ctrl-Tab, and Ctrl-Shift-Tab now cycle next/prev windows. -// .30 Added: Up,Down,PageUp,PageDown,Shift-PageUp,Shift-PageDown,Ctrl-PageUp,Ctrl-PageDown now scroll Data window -// .29 Added: DATA window now shows memory dump - -// Patch 16 -// .28 Fixed: MONO wasn't setting monochrome scheme -// .27 Changed: Registers now drawn in light blue for both DrawSubWindow_Info() [DrawRegisters()] and DrawBreakpoints() -// Reg names in DrawSubWindow_Info no longer hard-coded: using g_areakpointSource[] -// .26 Changed: DrawTargets() now shows Temp Address, and Final Address as orange (FG_INFO_ADDRESS) -// .25 Changed: Flag Clear "FC" to "CL" (like 6502 mnemonic) -// Changed: Flag Set "FS" to "SE" (like 6502 mnemonic) -// Added: Mirrored 6502 Mnemonics to clear/set flags as commands -// Moved: Legacy Flag Clear/Set commands "R?" "S?" to aliases -// .24 Fixed OPCODE 2F: AM_INVALID1 -> AM_INVALID3 -// .23 Fixed OPCODE 0F: AM_INVALID1 -> AM_INVALID3 -// .22 Fixed: Shift-PageUp Shift-PageDown Ctrl-PageUp Ctrl-PageDown -> _CursorMoveUpAligned() & _CursorMoveDownAligned() -// Bug: U F001, Ctrl-PageDown -// Was using current disasm cursor address instead of top disasm cursor -// .21 Fixed: _CursorMoveUpAligned() & _CursorMoveDownAligned() not wrapping around past FF00 to 0, and wrapping around past 0 to FF00 -// .20 Fixed: DisasmCalcTopFromCurAddress() causing bogus g_bDisasmCurBad when disasm invalid opcodes. -// .19 g_aAddressingFormat[] -> g_aOpmodes[] -// .18 Reverted .17 Changed StackPointer Input/Output. 'SP' is now back to 'S' (to be consistent with 6502 mnemonics) - -// Patch 15 -// .17 Changed StackPointer Input/Output from 'S' to 'SP' -// .16 Fixed Go StopAddress [SkipAddress,Length] Trace() not working afterwards -// .15 Added Info Regs color - Foreground and Background (orange) - -// Patch 14 -// .14 Added: Stack register now shows stack depth -// .13 Bugfix: CmdBreakpointAddPC() operators now don't add extra breakpoints. i.e. BPX P < FA00 -// .12 Bugfix: DrawMemory() should draw memory byte for IO address: ML1 C000 - -// Patch 13 -// NightlyBuild -// .11 Disasm now looks up symbols +1,-1. i.e. U FA85, u FAAE -// .10 Fixed '~' full console height -// .9 Fixed: FindCommand() to update command found if not exact match -// .8 Moved: Flag names from g_aFlagNames[] to "inlined" g_aBreakpointSource[] -// .7 Extended: Calc to show binary values, and char is single-quoted -// Nightly Build -// .6 Bugfix: DrawTargets() should draw target byte for IO address: R PC FB33 -// .5 Extended: FONT "FontName" [Height] -// .4 Extended: Go StopAddress [SkipAddress,Len] -// .3 Added BPR F // break on flag -// Added ! // new breakpoint operator: NOT_EQUAL - -// Patch 12 -// .2 Fixed: FindCommand() and FindParam() now returns 0 if name length is 0. -// .1 Fixed: CmdHelpSpecific() wasn't printing help for 1 argument set by other commands -// 2.4.0.0 added: uber breakpoints: BPR [A|X|Y|PC|SP] [<,<=,=,>,>=] address -// .2 fixed: parsing console input to detect immediate values on operators '+', '-' -// You can now do register arithmetic: CALC A+X+Y -// .1 added: mini-calculator 'CALC' -// 2.3.2 Rewrote parsing of console input -// You can now do stuff like: -// BPA INITAN+3 -// FONT "Lucida Console" - -// Patch 11 -// .19 fixed disasm: new color for disasm target address (orange) - // U FF14 shouldn't colorize ',X' - // U FF16 shouldn't colorize ',Y' - // U FF21 shouldn't colorze 'symbol,Y' -// Addr should be purple or orange to verify is fixed -// .18 fixed disasm: all indirects to do symbol lookup, and colorized '('...')' as operators -// .17 added disasm: syntax coloring to immediate mode prefix '#$' -// .16 fixed disasm window to work with proportional fonts -// .15 fixed buffer-overun crash in TextConvertTabsToSpaces() - -// Patch 10 -// .14 fixed help CATEGORY & SPECIFIC not working properly -// .13 fixed bug of CODE not removing CODE window split -// .12 fixed split window bug of re-sizing console too large -// .11 removed hard-coded height of 16 for line height in various Draw*() -// .10 added alpha feature: SOURCE2 now shows source assembly listing in bottom half of window DrawSourceLine() -// .9 added P [#] to step number of times specified -// .8 added Up-Arrow, Down-Arrow to scroll console by one line in full screen console window -// .7 Added source level debugger to buffer complete assembly source listing file -// .6 Added help for MA#, ML#, MH# -// .5 added 3rd symbol table: SRC -// .4 Added: seperated console input color, console output color -// .3 SYM now prints which symbol table the symbol was found in. -// .2 Added "DFB" to add assembler variable to user symbol table -// .1 Fixed FindAddressFromSymbol() and FindSymbolFromAddress() to search user symbol table first -// 2.3.1 Renamed all globals to conform to coding standard - -// .10 added TAB to move the cursor back to the PC, if there is no console input -// .9 fixed bug of setting reg, always moving the cursor back the PC -// .8 added detection if font is proportional. Still doesn't draw properly, but slowly getting there. -// .7 added colorized chars for regs, and memory ascii dump -// .6 fixed console buffering BUG: ~,~,VERSION * -// .5 added ~ to toggle full console on/off -// .4 Fixed BUG: 'G' DebugContinueStepping() disasm window cursor getting out of sync: R PC FA62; U FB40; G FB53 -// .3 Fixed spelling of CmdWindowLast() -// .2 Added undocumented "VERSION *" to show the number of bytes in the disasm "window" -// .1 Fixed BUG: CmdTrace() disasm window cursor getting out of sync: Start, F7, PageUp, Space -// 2.3.0.0 Syntax coloring for the disassembler! Plus a fancy branch indicator to 'PR#6'! Rock on! -// 38 Fixed FindParam() bug of skipping every other parameter -// 37 Fixed _PARAM_*_BEGIN _PARAM_*_END _PARAM_*_NUM -// 36 Added Regs A,X,Y to show character -// 35 Added syntax coloring for DrawBreakpoints() -// 34 Fixed DrawMemory() viewing memory ASCII to map control-chars to a printable glyph -// 33 Fixed 0 addr not working in CmdMemoryCompare() -// 32 Added BG_INFO_INVERSE, FG_INFO_INVERSE for flag hilighting -// 31 Changed FG_INFO_OPCODE color to yellow -// 30 Fixed MDC 0, bug in CmdUnassemble()with garbage address, due to var not init, and symbol lookup failed -// 29 Fixed typos in help summary, A, and D -// 28 Fixed Scrolling with and without g_bDisasmCurBad -// 27 Found bug -- can't scroll up past $5FFF with Tom's Bug Sample .. CmdCursorLineUp() not checking for gbDisamBad; -// 26 Code cleanup: still have some '#define's to convert over to 'const' -// 25 Fixed disasm singularity not showing up in DrawDisassemblyLine() -// 24 Fixed an disasm singularity in DisasmCalcTopFromCurAddress() i.e. F7, G FB53, then Space (to trace) once. -// 23 Fixed bug Watches not being cleared: _ClearViaArgs() -// 22 Code Cleanup: Moved most ExtTextOut() to DebugDrawText() -// 21 Changed End to jump $8000, due to redundant funcationality of Home, and wrap-around. -// 20 Added: DisasmCalc*From*() -// 19 New colors Enum & Array -// 18 implemented RTS. fixed RET to use common stack return address logic. -// 17 fixed console PageUp PageDn not refreshing console -// .2 WINDOW_CONSOLE & -// Implemented commands: MemoryDumpAscii*(): MA1 MA2 ML1 ML2 MH1 MH2 -// 16 removed BOOL Cmd*(), replaced with UPDATE_* -// 15 New Console Scrolling -// 14 extended FindParam() to specify [begin,end] -// 13 added split window infastructure, added Window_e -// 12 fixed PARAM aliases -// 11 fixed FindParam() to allow aliases -// 10 fixed SYM1 CLEAR, SYM2 CLEAR not actuall clearing -// 9 fixed BufferOuput() in DebugBegin() clobbering first buffered output line -// .1 since source level debugging is a minor feature -// 8 added command "VERSION *" to show internal debug info -// 7 fixed mem enter not refreshing screen -// 6 added source level debuggig back-end -// 5 fixed "SYM 0" bug + // See Debugger_Changelong.txt for full details + const int DEBUGGER_VERSION = MAKE_VERSION(2,5,0,3); // Public _________________________________________________________________________________________ @@ -258,7 +52,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // Breakpoints ________________________________________________________________ int g_nBreakpoints = 0; - Breakpoint_t g_aBreakpoints[ MAX_BREAKPOINTS ]; + Breakpoint_t g_aBreakpoints[ NUM_BREAKPOINTS ]; // NOTE: Breakpoint_Source_t and g_aBreakpointSource must match! const TCHAR *g_aBreakpointSource[ NUM_BREAKPOINT_SOURCES ] = @@ -1074,7 +868,7 @@ bool IsHexString ( LPCSTR pText ) //=========================================================================== bool GetBreakpointInfo ( WORD nOffset, bool & bBreakpointActive_, bool & bBreakpointEnable_ ) { - for (int iBreakpoint = 0; iBreakpoint < MAX_BREAKPOINTS; iBreakpoint++) + for (int iBreakpoint = 0; iBreakpoint < NUM_BREAKPOINTS; iBreakpoint++) { Breakpoint_t *pBP = &g_aBreakpoints[ iBreakpoint ]; @@ -1183,7 +977,7 @@ bool CheckBreakpointsIO () nAddress = aTarget[ iTarget ]; if (nAddress != NO_6502_TARGET) { - for (int iBreakpoint = 0; iBreakpoint < MAX_BREAKPOINTS; iBreakpoint++) + for (int iBreakpoint = 0; iBreakpoint < NUM_BREAKPOINTS; iBreakpoint++) { Breakpoint_t *pBP = &g_aBreakpoints[iBreakpoint]; if (_BreakpointValid( pBP )) @@ -1209,7 +1003,7 @@ bool CheckBreakpointsReg () { bool bStatus = false; - for (int iBreakpoint = 0; iBreakpoint < MAX_BREAKPOINTS; iBreakpoint++) + for (int iBreakpoint = 0; iBreakpoint < NUM_BREAKPOINTS; iBreakpoint++) { Breakpoint_t *pBP = &g_aBreakpoints[iBreakpoint]; @@ -1629,6 +1423,26 @@ Update_t CmdBreakpointMenu (int nArgs) g_aArgs[1].nVal1 = regs.pc; CmdBreakpointAddPC( 1 ); } + else + { + int iParam; + int nFound = FindParam( g_aArgs[ 1 ].sArg, MATCH_EXACT, iParam, _PARAM_GENERAL_BEGIN, _PARAM_GENERAL_END ); + + if (! nFound) + { + CmdBreakpointAddPC( 1 ); + } + + if (iParam == PARAM_SAVE) + { + } + if (iParam == PARAM_LOAD) + { + } + if (iParam == PARAM_RESET) + { + } + } return UPDATE_CONSOLE_DISPLAY; } @@ -1764,13 +1578,13 @@ bool _CmdBreakpointAddCommonArg ( int iArg, int nArg, BreakpointSource_t iSrc, B int iBreakpoint = 0; Breakpoint_t *pBP = & g_aBreakpoints[ iBreakpoint ]; - while ((iBreakpoint < MAX_BREAKPOINTS) && g_aBreakpoints[iBreakpoint].nLength) + while ((iBreakpoint < NUM_BREAKPOINTS) && g_aBreakpoints[iBreakpoint].nLength) { iBreakpoint++; pBP++; } - if (iBreakpoint >= MAX_BREAKPOINTS) + if (iBreakpoint >= NUM_BREAKPOINTS) { ConsoleDisplayError(TEXT("All Breakpoints slots are currently in use.")); return bStatus; @@ -1900,45 +1714,54 @@ Update_t CmdBreakpointAddMem (int nArgs) //=========================================================================== -void _BreakpointClear( Breakpoint_t * aBreakWatchZero, int iBreakpoint ) +void _BreakWatchZero_Clear( Breakpoint_t * aBreakWatchZero, int iSlot ) { - aBreakWatchZero[iBreakpoint].bSet = false; - aBreakWatchZero[iBreakpoint].bEnabled = false; - aBreakWatchZero[iBreakpoint].nLength = 0; + aBreakWatchZero[ iSlot ].bSet = false; + aBreakWatchZero[ iSlot ].bEnabled = false; + aBreakWatchZero[ iSlot ].nLength = 0; } +void _BreakWatchZero_RemoveOne( Breakpoint_t *aBreakWatchZero, const int iSlot, int & nTotal ) +{ + if (aBreakWatchZero[iSlot].bSet) + { + _BreakWatchZero_Clear( aBreakWatchZero, iSlot ); + nTotal--; + } +} + +void _BreakWatchZero_RemoveAll( Breakpoint_t *aBreakWatchZero, const int nMax, int & nTotal ) +{ + int iSlot = nMax; + + while (iSlot--) + { + _BreakWatchZero_RemoveOne( aBreakWatchZero, iSlot, nTotal ); + } +} // called by BreakpointsClear, WatchesClear, ZeroPagePointersClear //=========================================================================== -void _ClearViaArgs( int nArgs, Breakpoint_t * aBreakWatchZero, const int nMax, int & gnBWZ ) +void _ClearViaArgs( int nArgs, Breakpoint_t * aBreakWatchZero, const int nMax, int & nTotal ) { - int iBWZ; + int iSlot = 0; - // CLEAR EACH BREAKPOINT IN THE LIST + // Clear specified breakpoints while (nArgs) { - iBWZ = g_aArgs[nArgs].nVal1; + iSlot = g_aArgs[nArgs].nVal1; + if (! _tcscmp(g_aArgs[nArgs].sArg, g_aParameters[ PARAM_WILDSTAR ].m_sName)) { - iBWZ = nMax; - while (iBWZ--) - { - if (aBreakWatchZero[iBWZ].bSet) - { - _BreakpointClear( aBreakWatchZero, iBWZ ); - gnBWZ--; - } - } + _BreakWatchZero_RemoveAll( aBreakWatchZero, nMax, nTotal ); break; } - else if ((iBWZ >= 1) && (iBWZ <= nMax)) + else + if ((iSlot >= 1) && (iSlot <= nMax)) { - if (aBreakWatchZero[iBWZ-1].bSet) - { - _BreakpointClear( aBreakWatchZero, iBWZ - 1 ); - gnBWZ--; - } + _BreakWatchZero_RemoveOne( aBreakWatchZero, iSlot - 1, nTotal ); } + nArgs--; } } @@ -1947,24 +1770,28 @@ void _ClearViaArgs( int nArgs, Breakpoint_t * aBreakWatchZero, const int nMax, i // called by BreakpointsDisable, WatchesDisable, ZeroPagePointersDisable void _EnableDisableViaArgs( int nArgs, Breakpoint_t * aBreakWatchZero, const int nMax, const bool bEnabled ) { + int iSlot = 0; + // Enable each breakpoint in the list while (nArgs) { - int iBWZ = g_aArgs[nArgs].nVal1; + iSlot = g_aArgs[nArgs].nVal1; + if (! _tcscmp(g_aArgs[nArgs].sArg, g_aParameters[ PARAM_WILDSTAR ].m_sName)) { - int iBWZ = nMax; - while (iBWZ--) + iSlot = nMax; + while (iSlot--) { - aBreakWatchZero[iBWZ].bEnabled = bEnabled; + aBreakWatchZero[ iSlot ].bEnabled = bEnabled; } break; } else - if ((iBWZ >= 1) && (iBWZ <= nMax)) + if ((iSlot >= 1) && (iSlot <= nMax)) { - aBreakWatchZero[iBWZ-1].bEnabled = bEnabled; + aBreakWatchZero[iSlot-1].bEnabled = bEnabled; } + nArgs--; } } @@ -1975,32 +1802,16 @@ Update_t CmdBreakpointClear (int nArgs) if (!g_nBreakpoints) return ConsoleDisplayError(TEXT("There are no breakpoints defined.")); - int iBreakpoint; - - // CHECK FOR ERRORS if (!nArgs) { - iBreakpoint = MAX_BREAKPOINTS; - while (iBreakpoint--) - { - if ((g_aBreakpoints[iBreakpoint].bSet) && - (g_aBreakpoints[iBreakpoint].nAddress == regs.pc)) // TODO: FIXME - { - _BreakpointClear( g_aBreakpoints, iBreakpoint ); - g_nBreakpoints--; - } - } -// return DisplayHelp(CmdBreakpointClear); + _BreakWatchZero_RemoveAll( g_aBreakpoints, NUM_BREAKPOINTS, g_nBreakpoints ); } - - _ClearViaArgs( nArgs, g_aBreakpoints, MAX_BREAKPOINTS, g_nBreakpoints ); - - if (! g_nBreakpoints) + else { - return (UPDATE_DISASM | UPDATE_BREAKPOINTS); + _ClearViaArgs( nArgs, g_aBreakpoints, NUM_BREAKPOINTS, g_nBreakpoints ); } - return UPDATE_BREAKPOINTS | UPDATE_CONSOLE_DISPLAY; // 1; + return UPDATE_DISASM | UPDATE_BREAKPOINTS | UPDATE_CONSOLE_DISPLAY; } //=========================================================================== @@ -2012,7 +1823,7 @@ Update_t CmdBreakpointDisable (int nArgs) if (! nArgs) return Help_Arg_1( CMD_BREAKPOINT_DISABLE ); - _EnableDisableViaArgs( nArgs, g_aBreakpoints, MAX_BREAKPOINTS, false ); + _EnableDisableViaArgs( nArgs, g_aBreakpoints, NUM_BREAKPOINTS, false ); return UPDATE_BREAKPOINTS; } @@ -2033,7 +1844,7 @@ Update_t CmdBreakpointEnable (int nArgs) { if (! nArgs) return Help_Arg_1( CMD_BREAKPOINT_ENABLE ); - _EnableDisableViaArgs( nArgs, g_aBreakpoints, MAX_BREAKPOINTS, true ); + _EnableDisableViaArgs( nArgs, g_aBreakpoints, NUM_BREAKPOINTS, true ); return UPDATE_BREAKPOINTS; } @@ -2068,7 +1879,7 @@ Update_t CmdBreakpointList (int nArgs) { // ConsoleBufferPush( ); // vector vBreakpoints; -// int iBreakpoint = MAX_BREAKPOINTS; +// int iBreakpoint = NUM_BREAKPOINTS; // while (iBreakpoint--) // { // if (g_aBreakpoints[iBreakpoint].enabled) @@ -2086,7 +1897,7 @@ Update_t CmdBreakpointList (int nArgs) else { int iBreakpoint = 0; - while (iBreakpoint < MAX_BREAKPOINTS) + while (iBreakpoint < NUM_BREAKPOINTS) { if (g_aBreakpoints[ iBreakpoint ].bSet) { @@ -6632,7 +6443,7 @@ void DebugInitialize () WindowUpdateConsoleDisplayedSize(); // CLEAR THE BREAKPOINT AND WATCH TABLES - ZeroMemory( g_aBreakpoints , MAX_BREAKPOINTS * sizeof(Breakpoint_t)); + ZeroMemory( g_aBreakpoints , NUM_BREAKPOINTS * sizeof(Breakpoint_t)); ZeroMemory( g_aWatches , MAX_WATCHES * sizeof(Watches_t) ); ZeroMemory( g_aZeroPagePointers, MAX_ZEROPAGE_POINTERS * sizeof(ZeroPagePointers_t)); diff --git a/AppleWin/source/Debug.h b/AppleWin/source/Debug.h index 546d530b..a11fbfe6 100644 --- a/AppleWin/source/Debug.h +++ b/AppleWin/source/Debug.h @@ -20,7 +20,7 @@ using namespace std; // Breakpoints extern int g_nBreakpoints; - extern Breakpoint_t g_aBreakpoints[ MAX_BREAKPOINTS ]; + extern Breakpoint_t g_aBreakpoints[ NUM_BREAKPOINTS ]; extern const TCHAR *g_aBreakpointSource [ NUM_BREAKPOINT_SOURCES ]; extern const TCHAR *g_aBreakpointSymbols[ NUM_BREAKPOINT_OPERATORS ]; diff --git a/AppleWin/source/Debugger_Assembler.cpp b/AppleWin/source/Debugger_Assembler.cpp index 1c757cb1..d5f76681 100644 --- a/AppleWin/source/Debugger_Assembler.cpp +++ b/AppleWin/source/Debugger_Assembler.cpp @@ -73,7 +73,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // 10 signed: BPL BGE // B0 unsigned: BCS BGE - #define R_ MEM_R #define _W MEM_W #define RW MEM_R | MEM_W @@ -151,7 +150,7 @@ const Opcodes_t g_aOpcodes65C02[ NUM_OPCODES ] = {"INX", 0 , 0}, {"SBC", AM_M , R_}, {"NOP", 0 , 0}, {"NOP", AM_1 , 0 }, // E8 .. EB {"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"NOP", AM_1 , 0 }, // EC .. EF {"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"SBC", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // F0 .. F3 - {"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // F4 .. F7 + {"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"???", AM_ZX , 0 }, // F4 .. F7 {"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"PLX", 0 , 0}, {"NOP", AM_1 , 0 }, // F8 .. FB {"NOP", AM_3 , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"NOP", AM_1 , 0 } // FF .. FF }; @@ -274,272 +273,11 @@ Fx BEQ r SBC (d),Y sbc (d) --- --- SBC d,X INC d,X --- SED SBC a,Y {"INX", 0 , 0}, {"SBC", AM_M , R_}, {"NOP", 0 , 0}, {"NOP", AM_1 , 0 }, // E8 .. EB {"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"NOP", AM_1 , 0 }, // EC .. EF {"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"SBC", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // F0 .. F3 - {"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // F4 .. F7 + {"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"???", AM_ZX , 0 }, // F4 .. F7 {"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"PLX", 0 , 0}, {"NOP", AM_1 , 0 }, // F8 .. FB {"NOP", AM_3 , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"NOP", AM_1 , 0 } // FF .. FF }; -/* - - // x3 x7 xB xF are never used - {TEXT("BRK"), 0 , 0 }, // 00h - {TEXT("ORA"), ADDR_INDX , R_ }, // 01h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 02h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 03h - {TEXT("TSB"), ADDR_ZP , _W }, // 04h // 65C02 - {TEXT("ORA"), ADDR_ZP , R_ }, // 05h - {TEXT("ASL"), ADDR_ZP , _W }, // 06h // MEM_R ? - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 07h - {TEXT("PHP"), 0 , SW }, // 08h - {TEXT("ORA"), ADDR_IMM , im }, // 09h - {TEXT("ASL"), 0 , 0 }, // 0Ah // MEM_IMPLICIT - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 0Bh - {TEXT("TSB"), ADDR_ABS , _W }, // 0Ch // 65C02 - {TEXT("ORA"), ADDR_ABS , R_ }, // 0Dh - {TEXT("ASL"), ADDR_ABS , _W }, // 0Eh // MEM_R ? - {TEXT("NOP"), ADDR_INVALID3 , 0 }, // 0Fh - {TEXT("BPL"), ADDR_REL , 0 }, // 10h // signed: BGE @reference: http://www.6502.org/tutorials/compare_instructions.html - {TEXT("ORA"), ADDR_INDY , R_ }, // 11h - {TEXT("ORA"), ADDR_IZPG , R_ }, // 12h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 13h - {TEXT("TRB"), ADDR_ZP , _W }, // 14h - {TEXT("ORA"), ADDR_ZP_X , R_ }, // 15h - {TEXT("ASL"), ADDR_ZP_X , _W }, // 16h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 17h - {TEXT("CLC"), 0 , 0 }, // 18h - {TEXT("ORA"), ADDR_ABSY , R_ }, // 19h - {TEXT("INA"), 0 , 0 }, // 1Ah INC A - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 1Bh - {TEXT("TRB"), ADDR_ABS , _W }, // 1Ch - {TEXT("ORA"), ADDR_ABSX , R_ }, // 1Dh - {TEXT("ASL"), ADDR_ABSX }, // 1Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 1Fh - {TEXT("JSR"), ADDR_ABS }, // 20h - {TEXT("AND"), ADDR_INDX }, // 21h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 22h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 23h - {TEXT("BIT"), ADDR_ZP }, // 24h - {TEXT("AND"), ADDR_ZP }, // 25h - {TEXT("ROL"), ADDR_ZP }, // 26h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 27h - {TEXT("PLP"), 0 }, // 28h - {TEXT("AND"), ADDR_IMM }, // 29h - {TEXT("ROL"), 0 }, // 2Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 2Bh - {TEXT("BIT"), ADDR_ABS }, // 2Ch - {TEXT("AND"), ADDR_ABS }, // 2Dh - {TEXT("ROL"), ADDR_ABS }, // 2Eh - {TEXT("NOP"), ADDR_INVALID3 , 0 }, // 2Fh - {TEXT("BMI"), ADDR_REL }, // 30h - {TEXT("AND"), ADDR_INDY }, // 31h - {TEXT("AND"), ADDR_IZPG }, // 32h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 33h - {TEXT("BIT"), ADDR_ZP_X }, // 34h - {TEXT("AND"), ADDR_ZP_X }, // 35h - {TEXT("ROL"), ADDR_ZP_X }, // 36h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 37h - {TEXT("SEC"), 0 }, // 38h - {TEXT("AND"), ADDR_ABSY }, // 39h - {TEXT("DEA"), 0 }, // 3Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 3Bh - {TEXT("BIT"), ADDR_ABSX }, // 3Ch - {TEXT("AND"), ADDR_ABSX }, // 3Dh - {TEXT("ROL"), ADDR_ABSX }, // 3Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 3Fh - {TEXT("RTI"), 0 , 0 }, // 40h - {TEXT("EOR"), ADDR_INDX }, // 41h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 42h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 43h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 44h - {TEXT("EOR"), ADDR_ZP }, // 45h - {TEXT("LSR"), ADDR_ZP , _W }, // 46h // MEM_R ? - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 47h - {TEXT("PHA"), 0 }, // 48h // MEM_WRITE_IMPLIED | MEM_STACK - {TEXT("EOR"), ADDR_IMM }, // 49h - {TEXT("LSR"), 0 }, // 4Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 4Bh - {TEXT("JMP"), ADDR_ABS }, // 4Ch - {TEXT("EOR"), ADDR_ABS }, // 4Dh - {TEXT("LSR"), ADDR_ABS , _W }, // 4Eh // MEM_R ? - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 4Fh - {TEXT("BVC"), ADDR_REL }, // 50h - {TEXT("EOR"), ADDR_INDY }, // 51h - {TEXT("EOR"), ADDR_IZPG }, // 52h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 53h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 54h - {TEXT("EOR"), ADDR_ZP_X }, // 55h - {TEXT("LSR"), ADDR_ZP_X , _W }, // 56h // MEM_R ? - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 57h - {TEXT("CLI"), 0 }, // 58h - {TEXT("EOR"), ADDR_ABSY }, // 59h - {TEXT("PHY"), 0 }, // 5Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 5Bh - {TEXT("NOP"), ADDR_INVALID3 , 0 }, // 5Ch - {TEXT("EOR"), ADDR_ABSX }, // 5Dh - {TEXT("LSR"), ADDR_ABSX }, // 5Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 5Fh - {TEXT("RTS"), 0 , SR }, // 60h - {TEXT("ADC"), ADDR_INDX }, // 61h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 62h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 63h - {TEXT("STZ"), ADDR_ZP }, // 64h - {TEXT("ADC"), ADDR_ZP }, // 65h - {TEXT("ROR"), ADDR_ZP }, // 66h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 67h - {TEXT("PLA"), 0 , SW }, // 68h - {TEXT("ADC"), ADDR_IMM }, // 69h - {TEXT("ROR"), 0 }, // 6Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 6Bh - {TEXT("JMP"), ADDR_IABS }, // 6Ch - {TEXT("ADC"), ADDR_ABS }, // 6Dh - {TEXT("ROR"), ADDR_ABS }, // 6Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 6Fh - {TEXT("BVS"), ADDR_REL }, // 70h - {TEXT("ADC"), ADDR_INDY }, // 71h - {TEXT("ADC"), ADDR_IZPG }, // 72h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 73h - {TEXT("STZ"), ADDR_ZP_X }, // 74h - {TEXT("ADC"), ADDR_ZP_X }, // 75h - {TEXT("ROR"), ADDR_ZP_X }, // 76h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 77h - {TEXT("SEI"), 0 }, // 78h - {TEXT("ADC"), ADDR_ABSY }, // 79h - {TEXT("PLY"), 0 , SR }, // 7Ah - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 7Bh - {TEXT("JMP"), ADDR_ABSIINDX }, // 7Ch - {TEXT("ADC"), ADDR_ABSX }, // 7Dh - {TEXT("ROR"), ADDR_ABSX }, // 7Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 7Fh - {TEXT("BRA"), ADDR_REL }, // 80h - {TEXT("STA"), ADDR_INDX , _W }, // 81h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // 82h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 83h - {TEXT("STY"), ADDR_ZP , _W }, // 84h - {TEXT("STA"), ADDR_ZP , _W }, // 85h - {TEXT("STX"), ADDR_ZP , _W }, // 86h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 87h - {TEXT("DEY"), 0 , 0 }, // 88h // Explicit - {TEXT("BIT"), ADDR_IMM }, // 89h - {TEXT("TXA"), 0 , 0 }, // 8Ah // Explicit - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 8Bh - {TEXT("STY"), ADDR_ABS , _W }, // 8Ch - {TEXT("STA"), ADDR_ABS , _W }, // 8Dh - {TEXT("STX"), ADDR_ABS , _W }, // 8Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 8Fh - {TEXT("BCC"), ADDR_REL , 0 }, // 90h // MEM_IMMEDIATE - {TEXT("STA"), ADDR_INDY , _W }, // 91h - {TEXT("STA"), ADDR_IZPG , _W }, // 92h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 93h - {TEXT("STY"), ADDR_ZP_X , _W }, // 94h - {TEXT("STA"), ADDR_ZP_X , _W }, // 95h - {TEXT("STX"), ADDR_ZP_Y , _W }, // 96h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 97h - {TEXT("TYA"), 0 , 0 }, // 98h // Explicit - {TEXT("STA"), ADDR_ABSY , _W }, // 99h - {TEXT("TXS"), 0 , 0 }, // 9Ah // EXplicit - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 9Bh - {TEXT("STZ"), ADDR_ABS , _W }, // 9Ch - {TEXT("STA"), ADDR_ABSX , _W }, // 9Dh - {TEXT("STZ"), ADDR_ABSX , _W }, // 9Eh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // 9Fh - {TEXT("LDY"), ADDR_IMM , 0 }, // A0h // MEM_IMMEDIATE - {TEXT("LDA"), ADDR_INDX , R_ }, // A1h - {TEXT("LDX"), ADDR_IMM , 0 }, // A2h // MEM_IMMEDIATE - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // A3h - {TEXT("LDY"), ADDR_ZP , R_ }, // A4h - {TEXT("LDA"), ADDR_ZP , R_ }, // A5h - {TEXT("LDX"), ADDR_ZP , R_ }, // A6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // A7h - {TEXT("TAY"), 0 , 0 }, // A8h // Explicit - {TEXT("LDA"), ADDR_IMM , 0 }, // A9h // MEM_IMMEDIATE - {TEXT("TAX"), 0 , 0 }, // AAh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // ABh - {TEXT("LDY"), ADDR_ABS , R_ }, // ACh - {TEXT("LDA"), ADDR_ABS , R_ }, // ADh - {TEXT("LDX"), ADDR_ABS , R_ }, // AEh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // AFh - {TEXT("BCS"), ADDR_REL , 0 }, // B0h // MEM_IMMEDIATE // unsigned: BGE - {TEXT("LDA"), ADDR_INDY , R_ }, // B1h - {TEXT("LDA"), ADDR_IZPG , R_ }, // B2h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // B3h - {TEXT("LDY"), ADDR_ZP_X , R_ }, // B4h - {TEXT("LDA"), ADDR_ZP_X , R_ }, // B5h - {TEXT("LDX"), ADDR_ZP_Y , R_ }, // B6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // B7h - {TEXT("CLV"), 0 , 0 }, // B8h // Explicit - {TEXT("LDA"), ADDR_ABSY , R_ }, // B9h - {TEXT("TSX"), 0 , 0 }, // BAh // Explicit - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // BBh - {TEXT("LDY"), ADDR_ABSX , R_ }, // BCh - {TEXT("LDA"), ADDR_ABSX , R_ }, // BDh - {TEXT("LDX"), ADDR_ABSY , R_ }, // BEh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // BFh - {TEXT("CPY"), ADDR_IMM }, // C0h - {TEXT("CMP"), ADDR_INDX }, // C1h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // C2h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // C3h - {TEXT("CPY"), ADDR_ZP }, // C4h - {TEXT("CMP"), ADDR_ZP }, // C5h - {TEXT("DEC"), ADDR_ZP }, // C6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // C7h - {TEXT("INY"), 0 }, // C8h - {TEXT("CMP"), ADDR_IMM }, // C9h - {TEXT("DEX"), 0 }, // CAh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // CBh - {TEXT("CPY"), ADDR_ABS }, // CCh - {TEXT("CMP"), ADDR_ABS }, // CDh - {TEXT("DEC"), ADDR_ABS }, // CEh - {TEXT("NOP"), ADDR_INVALID1 }, // CFh - {TEXT("BNE"), ADDR_REL }, // D0h - {TEXT("CMP"), ADDR_INDY }, // D1h - {TEXT("CMP"), ADDR_IZPG }, // D2h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // D3h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // D4h - {TEXT("CMP"), ADDR_ZP_X }, // D5h - {TEXT("DEC"), ADDR_ZP_X }, // D6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // D7h - {TEXT("CLD"), 0 }, // D8h - {TEXT("CMP"), ADDR_ABSY }, // D9h - {TEXT("PHX"), 0 }, // DAh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // DBh - {TEXT("NOP"), ADDR_INVALID3 , 0 }, // DCh - {TEXT("CMP"), ADDR_ABSX }, // DDh - {TEXT("DEC"), ADDR_ABSX }, // DEh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // DFh - {TEXT("CPX"), ADDR_IMM }, // E0h - {TEXT("SBC"), ADDR_INDX }, // E1h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // E2h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // E3h - {TEXT("CPX"), ADDR_ZP }, // E4h - {TEXT("SBC"), ADDR_ZP }, // E5h - {TEXT("INC"), ADDR_ZP }, // E6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // E7h - {TEXT("INX"), 0 }, // E8h - {TEXT("SBC"), ADDR_IMM }, // E9h - {TEXT("NOP"), 0 , 0 }, // EAh - {TEXT("NOP"), ADDR_INVALID1 }, // EBh - {TEXT("CPX"), ADDR_ABS }, // ECh - {TEXT("SBC"), ADDR_ABS }, // EDh - {TEXT("INC"), ADDR_ABS }, // EEh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // EFh - {TEXT("BEQ"), ADDR_REL }, // F0h - {TEXT("SBC"), ADDR_INDY }, // F1h - {TEXT("SBC"), ADDR_IZPG }, // F2h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // F3h - {TEXT("NOP"), ADDR_INVALID2 , 0 }, // F4h - {TEXT("SBC"), ADDR_ZP_X }, // F5h - {TEXT("INC"), ADDR_ZP_X }, // F6h - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // F7h - {TEXT("SED"), 0 }, // F8h - {TEXT("SBC"), ADDR_ABSY }, // F9h - {TEXT("PLX"), 0 }, // FAh - {TEXT("NOP"), ADDR_INVALID1 , 0 }, // FBh - {TEXT("NOP"), ADDR_INVALID3 , 0 }, // FCh - {TEXT("SBC"), ADDR_ABSX }, // FDh - {TEXT("INC"), ADDR_ABSX }, // FEh - {TEXT("NOP"), ADDR_INVALID1 , 0 } // FFh -}; -*/ #undef R_ #undef _W #undef RW diff --git a/AppleWin/source/Debugger_Display.cpp b/AppleWin/source/Debugger_Display.cpp index f31d5d20..71d57a1e 100644 --- a/AppleWin/source/Debugger_Display.cpp +++ b/AppleWin/source/Debugger_Display.cpp @@ -516,7 +516,7 @@ void DrawBreakpoints (HDC dc, int line) rect.bottom += g_nFontHeight; int iBreakpoint; - for (iBreakpoint = 0; iBreakpoint < MAX_BREAKPOINTS; iBreakpoint++ ) + for (iBreakpoint = 0; iBreakpoint < NUM_BREAKPOINTS; iBreakpoint++ ) { Breakpoint_t *pBP = &g_aBreakpoints[iBreakpoint]; WORD nLength = pBP->nLength; diff --git a/AppleWin/source/Debugger_Help.cpp b/AppleWin/source/Debugger_Help.cpp index 2e98527a..57970754 100644 --- a/AppleWin/source/Debugger_Help.cpp +++ b/AppleWin/source/Debugger_Help.cpp @@ -431,7 +431,7 @@ Update_t CmdHelpSpecific (int nArgs) break; // Breakpoints case CMD_BREAKPOINT: - wsprintf( sText, " Maximum breakpoints are: %d", MAX_BREAKPOINTS ); + wsprintf( sText, " Maximum breakpoints are: %d", NUM_BREAKPOINTS ); ConsoleBufferPush( sText ); break; case CMD_BREAKPOINT_ADD_REG: diff --git a/AppleWin/source/Debugger_Types.h b/AppleWin/source/Debugger_Types.h index ef52b5d6..774a16a0 100644 --- a/AppleWin/source/Debugger_Types.h +++ b/AppleWin/source/Debugger_Types.h @@ -136,7 +136,7 @@ enum { - MAX_BREAKPOINTS = 5 + NUM_BREAKPOINTS = 5 }; /*