From 87677ed4c32885e2f5f7da4d68eead4678b141da Mon Sep 17 00:00:00 2001 From: tomcw Date: Mon, 9 Dec 2019 20:42:16 +0000 Subject: [PATCH] Debugger: In _6502_GetTargets() removed the bool bIgnoreJSRJMP parameter. --- source/Debugger/Debug.cpp | 2 +- source/Debugger/Debugger_Assembler.cpp | 37 +++++++------------------- source/Debugger/Debugger_Assembler.h | 4 +-- source/Debugger/Debugger_Display.cpp | 15 ++++++++++- test/TestDebugger/TestDebugger.cpp | 33 +++++++++++------------ 5 files changed, 41 insertions(+), 50 deletions(-) diff --git a/source/Debugger/Debug.cpp b/source/Debugger/Debug.cpp index ddf916b3..94dc73ee 100644 --- a/source/Debugger/Debug.cpp +++ b/source/Debugger/Debug.cpp @@ -1130,7 +1130,7 @@ int CheckBreakpointsIO () // bIncludeNextOpcodeAddress == false: // . JSR addr16: ignore addr16 as a target // . BRK/RTS/RTI: ignore return (or vector) addr16 as a target - _6502_GetTargets( regs.pc, &aTarget[0], &aTarget[1], &aTarget[2], &nBytes, true, true, false ); + _6502_GetTargets( regs.pc, &aTarget[0], &aTarget[1], &aTarget[2], &nBytes, true, false ); if (nBytes) { diff --git a/source/Debugger/Debugger_Assembler.cpp b/source/Debugger/Debugger_Assembler.cpp index 039093bb..851e5a68 100644 --- a/source/Debugger/Debugger_Assembler.cpp +++ b/source/Debugger/Debugger_Assembler.cpp @@ -584,21 +584,19 @@ bool _6502_GetStackReturnAddress ( WORD & nAddress_ ) //=========================================================================== bool _6502_GetTargets ( WORD nAddress, int *pTargetPartial_, int *pTargetPartial2_, int *pTargetPointer_, int * pTargetBytes_, - bool bIgnoreJSRJMP /*= true*/, bool bIgnoreBranch /*= true*/, bool bIncludeNextOpcodeAddress /*= true*/ ) + bool bIgnoreBranch /*= true*/, bool bIncludeNextOpcodeAddress /*= true*/ ) { - bool bStatus = false; - if (! pTargetPartial_) - return bStatus; + return false; if (! pTargetPartial2_) - return bStatus; + return false; if (! pTargetPointer_) - return bStatus; + return false; // if (! pTargetBytes_) -// return bStatus; +// return false; *pTargetPartial_ = NO_6502_TARGET; *pTargetPartial2_ = NO_6502_TARGET; @@ -607,8 +605,6 @@ bool _6502_GetTargets ( WORD nAddress, int *pTargetPartial_, int *pTargetPartial if (pTargetBytes_) *pTargetBytes_ = 0; - bStatus = true; - BYTE nOpcode = mem[nAddress]; BYTE nTarget8 = mem[(nAddress+1)&0xFFFF]; WORD nTarget16 = (mem[(nAddress+2)&0xFFFF]<<8) | nTarget8; @@ -666,13 +662,13 @@ bool _6502_GetTargets ( WORD nAddress, int *pTargetPartial_, int *pTargetPartial break; case AM_A: // Absolute - if (nOpcode == OPCODE_JSR) // JSR? + if (nOpcode == OPCODE_JSR) { *pTargetPartial_ = _6502_STACK_BEGIN + ((regs.sp+0) & 0xFF); *pTargetPartial2_ = _6502_STACK_BEGIN + ((regs.sp-1) & 0xFF); } - if (bIncludeNextOpcodeAddress || (nOpcode != OPCODE_JSR)) + if (bIncludeNextOpcodeAddress || (nOpcode != OPCODE_JSR && nOpcode != OPCODE_JMP_A)) *pTargetPointer_ = nTarget16; if (pTargetBytes_) @@ -778,22 +774,7 @@ bool _6502_GetTargets ( WORD nAddress, int *pTargetPartial_, int *pTargetPartial break; } - if (bIgnoreJSRJMP) - { - // If 6502 is jumping, don't show byte [nAddressTarget] - if ((*pTargetPointer_ >= 0) && ( - (nOpcode == OPCODE_JSR ) || // 0x20 - (nOpcode == OPCODE_JMP_A ))) // 0x4C -// (nOpcode == OPCODE_JMP_NA ) || // 0x6C -// (nOpcode == OPCODE_JMP_IAX))) // 0x7C - { - *pTargetPointer_ = NO_6502_TARGET; - if (pTargetBytes_) - *pTargetBytes_ = 0; - } - } - - return bStatus; + return true; } @@ -818,7 +799,7 @@ bool _6502_GetTargetAddress ( const WORD & nAddress, WORD & nTarget_ ) int nTargetPointer; WORD nTargetValue = 0; // de-ref int nTargetBytes; - _6502_GetTargets( nAddress, &nTargetPartial, &nTargetPointer, &nTargetBytes, false, false ); + _6502_GetTargets( nAddress, &nTargetPartial, &nTargetPointer, &nTargetBytes, false ); // if (nTargetPointer == NO_6502_TARGET) // { diff --git a/source/Debugger/Debugger_Assembler.h b/source/Debugger/Debugger_Assembler.h index 4a78ff14..7dea365a 100644 --- a/source/Debugger/Debugger_Assembler.h +++ b/source/Debugger/Debugger_Assembler.h @@ -193,8 +193,8 @@ extern int g_aAssemblerFirstDirective[ NUM_ASSEMBLERS ]; int _6502_GetOpmodeOpbyte( const int iAddress, int & iOpmode_, int & nOpbytes_, const DisasmData_t** pData = NULL ); void _6502_GetOpcodeOpmodeOpbyte( int & iOpcode_, int & iOpmode_, int & nOpbytes_ ); bool _6502_GetStackReturnAddress( WORD & nAddress_ ); - bool _6502_GetTargets( WORD nAddress, int *pTargetPartial_, int *pTargetPartial2_, int *pTargetPointer_, int * pBytes_ - , const bool bIgnoreJSRJMP = true, bool bIgnoreBranch = true, bool bIncludeNextOpcodeAddress = true ); + bool _6502_GetTargets( WORD nAddress, int *pTargetPartial_, int *pTargetPartial2_, int *pTargetPointer_, int * pBytes_, + bool bIgnoreBranch = true, bool bIncludeNextOpcodeAddress = true ); bool _6502_GetTargetAddress( const WORD & nAddress, WORD & nTarget_ ); bool _6502_IsOpcodeBranch( int nOpcode ); bool _6502_IsOpcodeValid( int nOpcode ); diff --git a/source/Debugger/Debugger_Display.cpp b/source/Debugger/Debugger_Display.cpp index 66fd81c8..223caec4 100644 --- a/source/Debugger/Debugger_Display.cpp +++ b/source/Debugger/Debugger_Display.cpp @@ -1528,6 +1528,13 @@ int GetDisassemblyLine ( WORD nBaseAddress, DisasmLine_t & line_ ) int nTargetBytes; _6502_GetTargets( nBaseAddress, &nTargetPartial, &nTargetPartial2, &nTargetPointer, &nTargetBytes ); + // For *direct* JSR/JMP, don't show 'addr16:byte char' + if (iOpcode == OPCODE_JSR || iOpcode == OPCODE_JMP_A) + { + nTargetPointer = NO_6502_TARGET; + nTargetBytes = 0; + } + if (nTargetPointer != NO_6502_TARGET) { bDisasmFormatFlags |= DISASM_FORMAT_TARGET_POINTER; @@ -1541,7 +1548,7 @@ int GetDisassemblyLine ( WORD nBaseAddress, DisasmLine_t & line_ ) if (g_iConfigDisasmTargets & DISASM_TARGET_ADDR) sprintf( line_.sTargetPointer, "%04X", nTargetPointer & 0xFFFF ); - if (iOpmode != AM_NA ) // Indirect Absolute + if (iOpcode != OPCODE_JMP_NA && iOpcode != OPCODE_JMP_IAX) { bDisasmFormatFlags |= DISASM_FORMAT_TARGET_VALUE; if (g_iConfigDisasmTargets & DISASM_TARGET_VAL) @@ -3215,6 +3222,12 @@ void DrawTargets ( int line) int aTarget[3]; _6502_GetTargets( regs.pc, &aTarget[0],&aTarget[1],&aTarget[2], NULL ); + const BYTE iOpcode = mem[regs.pc]; + if (iOpcode == OPCODE_JSR || iOpcode == OPCODE_JMP_A) + { + aTarget[2] = NO_6502_TARGET; + } + aTarget[1] = aTarget[2]; // Move down as we only have 2 lines RECT rect; diff --git a/test/TestDebugger/TestDebugger.cpp b/test/TestDebugger/TestDebugger.cpp index a212cffc..c5ecb101 100644 --- a/test/TestDebugger/TestDebugger.cpp +++ b/test/TestDebugger/TestDebugger.cpp @@ -145,7 +145,6 @@ int GH445_test_abs(BYTE op) return 0; } -// NB. bIgnoreJSRJMP == false, ie. TargetAddr[2] gets set int GH445_test_jsr(void) { bool bRes; @@ -159,15 +158,15 @@ int GH445_test_jsr(void) mem[(regs.pc+2)&0xFFFF] = (BYTE) ((target2>>8)&0xff); regs.sp = 0x1FF; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != target2) return 1; regs.sp = 0x100; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != 0x1FF || TargetAddr[2] != target2) return 1; regs.sp = 0x101; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != target2) return 1; return 0; @@ -232,7 +231,6 @@ int GH445_test_rti_rts(WORD sp, const bool isRTI) return 0; } -// NB. bIgnoreJSRJMP == false, ie. TargetAddr[2] gets set int GH445_test_jmp(BYTE op) { bool bRes; @@ -268,7 +266,7 @@ int GH445_test_jmp(BYTE op) mem[regs.pc] = op; mem[(regs.pc+1)&0xFFFF] = (BYTE) (target16&0xff); mem[(regs.pc+2)&0xFFFF] = (BYTE) ((target16>>8)&0xff); - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes); if (!bRes || TargetAddr[0] != target0 || TargetAddr[1] != target1 || TargetAddr[2] != target2) return 1; return 0; @@ -448,7 +446,7 @@ int GH451_test_abs(BYTE op) mem[regs.pc] = op; mem[(regs.pc+1)&0xFFFF] = (BYTE) (target2&0xff); mem[(regs.pc+2)&0xFFFF] = (BYTE) ((target2>>8)&0xff); - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[2] != target2) return 1; return 0; @@ -463,15 +461,15 @@ int GH451_test_jsr(void) mem[regs.pc] = OPCODE_JSR; regs.sp = 0x1FF; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != NO_6502_TARGET) return 1; regs.sp = 0x100; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != 0x1FF || TargetAddr[2] != NO_6502_TARGET) return 1; regs.sp = 0x101; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != NO_6502_TARGET) return 1; return 0; @@ -486,15 +484,15 @@ int GH451_test_brk(void) mem[regs.pc] = OPCODE_BRK; regs.sp = 0x1FF; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != NO_6502_TARGET) return 1; regs.sp = 0x100; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != 0x1FF || TargetAddr[2] != NO_6502_TARGET) return 1; regs.sp = 0x101; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != regs.sp || TargetAddr[1] != regs.sp-1 || TargetAddr[2] != NO_6502_TARGET) return 1; return 0; @@ -530,13 +528,12 @@ int GH451_test_rti_rts(WORD sp, const bool isRTI) if (!isRTI) ret_addr++; // NB. return addr from stack is incremented before being transferred to PC - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != sp_addr_l || TargetAddr[1] != sp_addr_h || TargetAddr[2] != NO_6502_TARGET) return 1; return 0; } -// bIgnoreJSRJMP == true int GH451_test_jmp(BYTE op) { bool bRes; @@ -565,7 +562,7 @@ int GH451_test_jmp(BYTE op) mem[regs.pc] = op; mem[(regs.pc+1)&0xFFFF] = (BYTE) (target16&0xff); mem[(regs.pc+2)&0xFFFF] = (BYTE) ((target16>>8)&0xff); - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != target0 || TargetAddr[1] != target1 || TargetAddr[2] != NO_6502_TARGET) return 1; return 0; @@ -581,13 +578,13 @@ int GH451_test_Bcc(void) mem[regs.pc] = 0x10; // BPL next-op mem[regs.pc+1] = 0; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != NO_6502_TARGET || TargetAddr[1] != NO_6502_TARGET || TargetAddr[2] != NO_6502_TARGET) return 1; mem[regs.pc] = 0x10; // BPL this-op mem[regs.pc+1] = 0xfe; - bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, true, false); + bRes = _6502_GetTargets(regs.pc, &TargetAddr[0], &TargetAddr[1], &TargetAddr[2], &TargetBytes, true, false); if (!bRes || TargetAddr[0] != NO_6502_TARGET || TargetAddr[1] != NO_6502_TARGET || TargetAddr[2] != NO_6502_TARGET) return 1; return 0;