diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index 696d4d1a7..0c8ce03e2 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -24,6 +24,7 @@ #include "firmware.h" #include "mc.h" #include "mem.h" +#include "NDSSystem.h" #ifdef HAVE_LUA #include "lua-engine.h" @@ -699,6 +700,16 @@ FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u3 CallRegisteredLuaMemHook(addr, 1, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif + // break points, wheee + for (int i = 0; i < memReadBreakPoints.size(); ++i) + { + if (addr == memReadBreakPoints[i]) + { + execute = false; + i = memReadBreakPoints.size(); + } + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -734,6 +745,16 @@ FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u CallRegisteredLuaMemHook(addr, 2, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif + // break points, wheee + for (int i = 0; i < memReadBreakPoints.size(); ++i) + { + if (addr == memReadBreakPoints[i]) + { + execute = false; + i = memReadBreakPoints.size(); + } + } + //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { @@ -781,6 +802,15 @@ FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif + // break points, wheee + for (int i = 0; i < memReadBreakPoints.size(); ++i) + { + if (addr == memReadBreakPoints[i]) + { + execute = false; + i = memReadBreakPoints.size(); + } + } //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) @@ -837,6 +867,16 @@ FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } + // break points, wheee + for (int i = 0; i < memWriteBreakPoints.size(); ++i) + { + if (addr == memWriteBreakPoints[i]) + { + execute = false; + i = memWriteBreakPoints.size(); + } + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -876,6 +916,16 @@ FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } + // break points, wheee + for (int i = 0; i < memWriteBreakPoints.size(); ++i) + { + if (addr == memWriteBreakPoints[i]) + { + execute = false; + i = memWriteBreakPoints.size(); + } + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -915,6 +965,16 @@ FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } + // break points, wheee + for (int i = 0; i < memWriteBreakPoints.size(); ++i) + { + if (addr == memWriteBreakPoints[i]) + { + execute = false; + i = memWriteBreakPoints.size(); + } + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index 0c058592e..a45c64a27 100755 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -59,6 +59,8 @@ #include "wifi.h" #include "Database.h" #include "frontend/modules/Disassembler.h" +#include "frontend/windows/disView.h" +#include "display.h" #ifdef GDB_STUB #include "gdbstub.h" @@ -91,6 +93,9 @@ GameInfo gameInfo; NDSSystem nds; CFIRMWARE *extFirmwareObj = NULL; +std::vector memReadBreakPoints; +std::vector memWriteBreakPoints; + using std::min; using std::max; @@ -1911,6 +1916,29 @@ static /*donotinline*/ std::pair armInnerLoop( s32 timer = minarmtime(arm9,arm7); while(timer < s32next && !sequencer.reschedule && execute) { + // breakpoint handling + for (int i = 0; i < NDS_ARM9.breakPoints.size(); ++i) { + if (NDS_ARM9.instruct_adr == NDS_ARM9.breakPoints[i] && !NDS_ARM9.debugStep) { + emu_paused = true; + paused = true; + execute = false; + // update debug display + PostMessageA(DisViewWnd[0], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM9.instruct_adr); + InvalidateRect(DisViewWnd[0], NULL, FALSE); + return std::make_pair(arm9, arm7); + } + } + for (int i = 0; i < NDS_ARM7.breakPoints.size(); ++i) { + if (NDS_ARM7.instruct_adr == NDS_ARM7.breakPoints[i] && !NDS_ARM7.debugStep) { + emu_paused = true; + paused = true; + execute = false; + // update debug display + PostMessageA(DisViewWnd[1], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM7.instruct_adr); + InvalidateRect(DisViewWnd[1], NULL, FALSE); + return std::make_pair(arm9, arm7); + } + } if(doarm9 && (!doarm7 || arm9 <= timer)) { if(!(NDS_ARM9.freeze & CPU_FREEZE_WAIT_IRQ) && !nds.freezeBus) @@ -1933,6 +1961,24 @@ static /*donotinline*/ std::pair armInnerLoop( nds.idleCycles[0] += arm9-temp; if (gxFIFO.size < 255) nds.freezeBus &= ~1; } + // for proper stepping... + if (NDS_ARM9.debugStep) { + NDS_ARM9.debugStep = false; + execute = false; + PostMessageA(DisViewWnd[0], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM9.instruct_adr); + InvalidateRect(DisViewWnd[0], NULL, FALSE); + } + if (NDS_ARM9.stepOverBreak == NDS_ARM9.instruct_adr && NDS_ARM9.stepOverBreak != 0) { + NDS_ARM9.stepOverBreak = 0; + execute = false; + PostMessageA(DisViewWnd[0], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM9.instruct_adr); + InvalidateRect(DisViewWnd[0], NULL, FALSE); + } + // aaand handle step to return + if (NDS_ARM9.runToRetTmp != 0 && NDS_ARM9.runToRetTmp == NDS_ARM9.instruct_adr) { + NDS_ARM9.runToRetTmp = 0; + NDS_ARM9.runToRet = true; + } } if(doarm7 && (!doarm9 || arm7 <= timer)) { @@ -1964,6 +2010,23 @@ static /*donotinline*/ std::pair armInnerLoop( #endif } } + if (NDS_ARM7.debugStep) { + NDS_ARM7.debugStep = false; + execute = false; + PostMessageA(DisViewWnd[1], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM7.instruct_adr); + InvalidateRect(DisViewWnd[1], NULL, FALSE); + } + if (NDS_ARM7.stepOverBreak == NDS_ARM7.instruct_adr && NDS_ARM7.stepOverBreak != 0) { + NDS_ARM7.stepOverBreak = 0; + execute = false; + PostMessageA(DisViewWnd[1], WM_COMMAND, IDC_DISASMSEEK, NDS_ARM7.instruct_adr); + InvalidateRect(DisViewWnd[1], NULL, FALSE); + } + // aaand handle step to return + if (NDS_ARM7.runToRetTmp != 0 && NDS_ARM7.runToRetTmp == NDS_ARM7.instruct_adr) { + NDS_ARM7.runToRetTmp = 0; + NDS_ARM7.runToRet = true; + } } timer = minarmtime(arm9,arm7); @@ -1984,6 +2047,7 @@ void NDS_debug_break() void NDS_debug_continue() { NDS_ARM9.stalled = NDS_ARM7.stalled = 0; + execute = true; } void NDS_debug_step() diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index ca6029907..da9998da0 100755 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -405,6 +405,9 @@ typedef struct TSCalInfo extern GameInfo gameInfo; +extern std::vector memReadBreakPoints; +extern std::vector memWriteBreakPoints; + struct UserButtons : buttonstruct { diff --git a/desmume/src/arm_instructions.cpp b/desmume/src/arm_instructions.cpp index 43412058a..dbac8c2e7 100644 --- a/desmume/src/arm_instructions.cpp +++ b/desmume/src/arm_instructions.cpp @@ -1,4 +1,4 @@ -/* +/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2016 DeSmuME team @@ -3104,6 +3104,10 @@ TEMPLATE static u32 FASTCALL OP_BLX_REG(const u32 i) cpu->CPSR.bits.T = BIT0(tmp); cpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; + if (cpu->runToRet) { + cpu->runToRet = false; + cpu->runToRetTmp = cpu->next_instruction + 4; + } return 3; } @@ -3145,6 +3149,10 @@ TEMPLATE static u32 FASTCALL OP_BL(const u32 i) cpu->R[15] += (off<<2); cpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; + if (cpu->runToRet) { + cpu->runToRet = false; + cpu->runToRetTmp = cpu->next_instruction + 4; + } return 3; } @@ -3403,12 +3411,12 @@ TEMPLATE static u32 FASTCALL OP_SMLA_T_T(const u32 i) TEMPLATE static u32 FASTCALL OP_SMLAL_B_B(const u32 i) { - s32 a = LWORD(cpu->R[REG_POS(i,0)]); - s32 b = LWORD(cpu->R[REG_POS(i,8)]); - s64 product = (s64)(a*b); - s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); - s64 sum = dst64 + product; - cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); + s32 a = LWORD(cpu->R[REG_POS(i,0)]); + s32 b = LWORD(cpu->R[REG_POS(i,8)]); + s64 product = (s64)(a*b); + s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); + s64 sum = dst64 + product; + cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); cpu->R[REG_POS(i,16)] = (u32)((sum>>32) & 0xFFFFFFFF); return 2; @@ -3416,12 +3424,12 @@ TEMPLATE static u32 FASTCALL OP_SMLAL_B_B(const u32 i) TEMPLATE static u32 FASTCALL OP_SMLAL_B_T(const u32 i) { - s32 a = LWORD(cpu->R[REG_POS(i,0)]); - s32 b = HWORD(cpu->R[REG_POS(i,8)]); - s64 product = (s64)(a*b); - s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); - s64 sum = dst64 + product; - cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); + s32 a = LWORD(cpu->R[REG_POS(i,0)]); + s32 b = HWORD(cpu->R[REG_POS(i,8)]); + s64 product = (s64)(a*b); + s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); + s64 sum = dst64 + product; + cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); cpu->R[REG_POS(i,16)] = (u32)((sum>>32) & 0xFFFFFFFF); return 2; @@ -3429,12 +3437,12 @@ TEMPLATE static u32 FASTCALL OP_SMLAL_B_T(const u32 i) TEMPLATE static u32 FASTCALL OP_SMLAL_T_B(const u32 i) { - s32 a = HWORD(cpu->R[REG_POS(i,0)]); - s32 b = LWORD(cpu->R[REG_POS(i,8)]); - s64 product = (s64)(a*b); - s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); - s64 sum = dst64 + product; - cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); + s32 a = HWORD(cpu->R[REG_POS(i,0)]); + s32 b = LWORD(cpu->R[REG_POS(i,8)]); + s64 product = (s64)(a*b); + s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); + s64 sum = dst64 + product; + cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); cpu->R[REG_POS(i,16)] = (u32)((sum>>32) & 0xFFFFFFFF); return 2; @@ -3442,12 +3450,12 @@ TEMPLATE static u32 FASTCALL OP_SMLAL_T_B(const u32 i) TEMPLATE static u32 FASTCALL OP_SMLAL_T_T(const u32 i) { - s32 a = HWORD(cpu->R[REG_POS(i,0)]); - s32 b = HWORD(cpu->R[REG_POS(i,8)]); - s64 product = (s64)(a*b); - s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); - s64 sum = dst64 + product; - cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); + s32 a = HWORD(cpu->R[REG_POS(i,0)]); + s32 b = HWORD(cpu->R[REG_POS(i,8)]); + s64 product = (s64)(a*b); + s64 dst64 = (s64)(cpu->R[REG_POS(i,12)] + (((s64)cpu->R[REG_POS(i,16)])<<32)); + s64 sum = dst64 + product; + cpu->R[REG_POS(i,12)] = (u32)(sum & 0xFFFFFFFF); cpu->R[REG_POS(i,16)] = (u32)((sum>>32) & 0xFFFFFFFF); return 2; @@ -4750,6 +4758,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIA(const u32 i) //start += 4; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } return MMU_aluMemCycles(2, c); @@ -4791,6 +4805,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIB(const u32 i) else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } return MMU_aluMemCycles(4, c); } @@ -4817,6 +4837,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDA(const u32 i) c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DA(14, start); @@ -4858,6 +4884,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDB(const u32 i) registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DB(14, start); @@ -4915,6 +4947,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIA_W(const u32 i) c += MMU_memAccessCycles(start); start += 4; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } if(i & (1 << REG_POS(i,16))) { @@ -4965,6 +5003,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIB_W(const u32 i) else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } if(i & (1 << REG_POS(i,16))) { @@ -4998,6 +5042,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDA_W(const u32 i) c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DA(14, start); @@ -5047,6 +5097,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDB_W(const u32 i) registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DB(14, start); @@ -5125,6 +5181,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIA2(const u32 i) //start += 4; cpu->next_instruction = cpu->R[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } return MMU_aluMemCycles(2, c); } @@ -5180,6 +5242,12 @@ TEMPLATE static u32 FASTCALL OP_LDMIB2(const u32 i) cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } return MMU_aluMemCycles(2, c); } @@ -5212,6 +5280,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDA2(const u32 i) c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DA(14, start); @@ -5270,6 +5344,12 @@ TEMPLATE static u32 FASTCALL OP_LDMDB2(const u32 i) cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); + + // debugging + if (cpu->runToRet) { + execute = false; + cpu->runToRet = false; + } } OP_L_DB(14, start); diff --git a/desmume/src/armcpu.h b/desmume/src/armcpu.h index 597b0840a..b9d77c6b8 100644 --- a/desmume/src/armcpu.h +++ b/desmume/src/armcpu.h @@ -327,6 +327,13 @@ struct armcpu_t /** the ctrl interface */ armcpu_ctrl_iface ctrl_iface; + + // debugging stuff + int runToRetTmp; + bool runToRet; + int stepOverBreak; + std::vector breakPoints; + bool debugStep; }; int armcpu_new( armcpu_t *armcpu, u32 id); diff --git a/desmume/src/frontend/windows/disView.cpp b/desmume/src/frontend/windows/disView.cpp index 70a9f5013..207d0f0f1 100644 --- a/desmume/src/frontend/windows/disView.cpp +++ b/desmume/src/frontend/windows/disView.cpp @@ -37,8 +37,9 @@ typedef struct BOOL autoup; u32 autoup_secs; u32 curr_ligne; - armcpu_t *cpu; + armcpu_t* cpu; u16 mode; + s32 break_pos; } disview_struct; disview_struct *DisView7 = NULL; @@ -47,7 +48,7 @@ disview_struct *DisView9 = NULL; extern TOOLSCLASS *ViewDisasm_ARM7; extern TOOLSCLASS *ViewDisasm_ARM9; -static HWND DisViewWnd[2] = {NULL, NULL}; + HWND DisViewWnd[2] = {NULL, NULL}; #define INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) @@ -90,12 +91,23 @@ LRESULT DisViewBox_OnPaint(HWND hwnd, disview_struct *win, WPARAM wParam, LPARAM u32 i; u32 adr; - if (win->autoup||win->autogo) - win->curr_ligne = (win->cpu->instruct_adr >> 2); + //if (win->autoup||win->autogo) + // win->curr_ligne = (win->cpu->instruct_adr >> 2); adr = win->curr_ligne*4; + SetTextColor(mem_dc, RGB(0, 0, 0)); + for(i = 0; i < nbligne; ++i) { + SetBkColor(mem_dc, RGB(255, 255, 255)); + for (int j = 0; j < win->cpu->breakPoints.size(); ++j) { + if (adr == win->cpu->breakPoints[j]) { + SetBkColor(mem_dc, RGB(255, 0, 0)); + } + } + if (adr == win->cpu->instruct_adr) { + SetBkColor(mem_dc, RGB(0, 255, 0)); + } u32 ins = _MMU_read32(win->cpu->proc_ID, MMU_AT_DEBUG, adr); des_arm_instructions_set[INDEX(ins)](adr, ins, txt); sprintf(text, "%04X:%04X %08X %s", (int)(adr>>16), (int)(adr&0xFFFF), (int)ins, txt); @@ -130,6 +142,15 @@ LRESULT DisViewBox_OnPaint(HWND hwnd, disview_struct *win, WPARAM wParam, LPARAM for(i = 0; i < nbligne; ++i) { + SetBkColor(mem_dc, RGB(255, 255, 255)); + for (int j = 0; j < win->cpu->breakPoints.size(); ++j) { + if (adr == win->cpu->breakPoints[j]) { + SetBkColor(mem_dc, RGB(255, 0, 0)); + } + } + if (adr == win->cpu->instruct_adr) { + SetBkColor(mem_dc, RGB(0, 255, 0)); + } u32 ins = _MMU_read16(win->cpu->proc_ID, MMU_AT_DEBUG, adr); des_thumb_instructions_set[ins>>6](adr, ins, txt); sprintf(text, "%04X:%04X %04X %s", (int)(adr>>16), (int)(adr&0xFFFF), (int)ins, txt); @@ -174,53 +195,71 @@ LRESULT DisViewDialog_OnPaint(HWND hwnd, disview_struct *win, WPARAM wParam, LPA for(i = 0; i < 16; ++i) { sprintf(text, "%08X", (int)win->cpu->R[i]); - SetWindowText(GetDlgItem(hwnd, IDC_R0+i), text); + //SetWindowText(GetDlgItem(hwnd, IDC_R0+i), text); + SetDlgItemText(hwnd, IDC_R0 + i, text); } #define OFF 16 + + #define CPSROFF 288 SetBkMode(hdc, TRANSPARENT); if(win->cpu->CPSR.bits.N) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 452+OFF, 238, "N", 1); + TextOut(hdc, 452+OFF, CPSROFF, "N", 1); if(win->cpu->CPSR.bits.Z) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 464+OFF, 238, "Z", 1); + TextOut(hdc, 464+OFF, CPSROFF, "Z", 1); if(win->cpu->CPSR.bits.C) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 475+OFF, 238, "C", 1); + TextOut(hdc, 475+OFF, CPSROFF, "C", 1); if(win->cpu->CPSR.bits.V) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 486+OFF, 238, "V", 1); + TextOut(hdc, 486+OFF, CPSROFF, "V", 1); if(win->cpu->CPSR.bits.Q) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 497+OFF, 238, "Q", 1); + TextOut(hdc, 497+OFF, CPSROFF, "Q", 1); if(!win->cpu->CPSR.bits.I) SetTextColor(hdc, RGB(255,0,0)); else SetTextColor(hdc, RGB(70, 70, 70)); - TextOut(hdc, 508+OFF, 238, "I", 1); + TextOut(hdc, 508+OFF, CPSROFF, "I", 1); sprintf(text, "%02X", (int)win->cpu->CPSR.bits.mode); SetWindowText(GetDlgItem(hwnd, IDC_MODE), text); sprintf(text, "%08X", MMU.timer[0][0]);//win->cpu->SPSR); SetWindowText(GetDlgItem(hwnd, IDC_TMP), text); + + // weehee break points drawing + for (int i = 0; i < 8; ++i) { + int j = i + win->break_pos; + if (j < win->cpu->breakPoints.size()) { + sprintf(text, "%08X", win->cpu->breakPoints[j]); + } + else { + sprintf(text, "%08X", 0); + } + SetWindowText(GetDlgItem(hwnd, IDC_BP0 + i), text); + } + + sprintf(text, "%02i", win->break_pos); + SetWindowText(GetDlgItem(hwnd, IDC_BPCOUNT), text); EndPaint(hwnd, &ps); return 1; @@ -308,7 +347,7 @@ BOOL CALLBACK ViewDisasm_ARM7Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA UDM_SETRANGE, 0, MAKELONG(99, 1)); SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), UDM_SETPOS32, 0, DisView7->autoup_secs); - DisViewWnd[1] = NULL; + DisViewWnd[1] = hwnd; return 1; } case WM_CLOSE : @@ -332,6 +371,13 @@ BOOL CALLBACK ViewDisasm_ARM7Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA case WM_TIMER: SendMessage(hwnd, WM_COMMAND, IDC_REFRESH, 0); return 1; + case WM_MOUSEWHEEL: { + int tmp = (*((int*)&wParam)); + short tmp2 = (*(((short*)&tmp) + 1)); + DisView7->curr_ligne += -tmp2 / WHEEL_DELTA; + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } case WM_COMMAND : switch (LOWORD (wParam)) { @@ -385,6 +431,7 @@ BOOL CALLBACK ViewDisasm_ARM7Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA case IDC_STEP: { NDS_debug_step(); + NDS_ARM7.debugStep = true; } return 1; @@ -464,6 +511,85 @@ BOOL CALLBACK ViewDisasm_ARM7Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE), TRUE); } return 1; + case IDC_DISASMSEEK: + { + DisView7->curr_ligne = lParam / 4; + return 1; + } + case IDC_BPUP: + { + DisView7->break_pos = max(0, DisView7->break_pos - 1); + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_BPDOWN: + { + DisView7->break_pos += 1; + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_BREAKPOINT: { + char tmp[16]; + int lg = GetDlgItemText(hwnd, IDC_BPDEST, tmp, 16); + u32 adr = 0; + for (int i = 0; i < lg; ++i) + { + if ((tmp[i] >= 'A') && (tmp[i] <= 'F')) + { + adr = adr * 16 + (tmp[i] - 'A' + 10); + continue; + } + if ((tmp[i] >= '0') && (tmp[i] <= '9')) + { + adr = adr * 16 + (tmp[i] - '0'); + continue; + } + } + NDS_ARM7.breakPoints.push_back(adr); + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_DELBP: { + if (DisView7->break_pos < NDS_ARM7.breakPoints.size()) { + NDS_ARM7.breakPoints.erase(NDS_ARM7.breakPoints.begin() + DisView7->break_pos); + } + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_REGUPDATE: { + for (int i = 0; i < 15; ++i) { + char tmp[16]; + int lg = GetDlgItemText(hwnd, IDC_R0 + i, tmp, 16); + u32 adr = 0; + for (int i = 0; i < lg; ++i) + { + if ((tmp[i] >= 'A') && (tmp[i] <= 'F')) + { + adr = adr * 16 + (tmp[i] - 'A' + 10); + continue; + } + if ((tmp[i] >= '0') && (tmp[i] <= '9')) + { + adr = adr * 16 + (tmp[i] - '0'); + continue; + } + } + + NDS_ARM7.R[i] = adr; + } + return 1; + } + case IDC_RUNRET: { + NDS_ARM7.runToRet = true; + execute = true; + return 1; + } + case IDC_STEPOVER: { + NDS_ARM7.stepOverBreak = NDS_ARM7.instruct_adr + 4; + execute = true; + paused = false; + } + return 1; return 1; } return 0; @@ -554,7 +680,7 @@ BOOL CALLBACK ViewDisasm_ARM9Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA UDM_SETRANGE, 0, MAKELONG(99, 1)); SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), UDM_SETPOS32, 0, DisView9->autoup_secs); - DisViewWnd[0] = NULL; + DisViewWnd[0] = hwnd; return 1; } case WM_CLOSE : @@ -578,6 +704,13 @@ BOOL CALLBACK ViewDisasm_ARM9Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA case WM_TIMER: SendMessage(hwnd, WM_COMMAND, IDC_REFRESH, 0); return 1; + case WM_MOUSEWHEEL: { + int tmp = (*((int*)&wParam)); + short tmp2 = (*(((short*)&tmp) + 1)); + DisView9->curr_ligne += -tmp2 / WHEEL_DELTA; + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } case WM_COMMAND : switch (LOWORD (wParam)) { @@ -631,6 +764,8 @@ BOOL CALLBACK ViewDisasm_ARM9Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA case IDC_STEP: { NDS_debug_step(); + DisView9->curr_ligne += 1; + NDS_ARM9.debugStep = true; } return 1; case IDC_CONTINUE: @@ -709,6 +844,84 @@ BOOL CALLBACK ViewDisasm_ARM9Proc (HWND hwnd, UINT message, WPARAM wParam, LPARA EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE), TRUE); } return 1; + case IDC_DISASMSEEK: + { + DisView9->curr_ligne = lParam / 4; + return 1; + } + case IDC_BPUP: + { + DisView9->break_pos = max(0, DisView9->break_pos - 1); + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_BPDOWN: + { + DisView9->break_pos += 1; + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_BREAKPOINT: { + char tmp[16]; + int lg = GetDlgItemText(hwnd, IDC_BPDEST, tmp, 16); + u32 adr = 0; + for (int i = 0; i < lg; ++i) + { + if ((tmp[i] >= 'A') && (tmp[i] <= 'F')) + { + adr = adr * 16 + (tmp[i] - 'A' + 10); + continue; + } + if ((tmp[i] >= '0') && (tmp[i] <= '9')) + { + adr = adr * 16 + (tmp[i] - '0'); + continue; + } + } + NDS_ARM9.breakPoints.push_back(adr); + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_DELBP: { + if (DisView9->break_pos < NDS_ARM9.breakPoints.size()) { + NDS_ARM9.breakPoints.erase(NDS_ARM9.breakPoints.begin() + DisView9->break_pos); + } + InvalidateRect(hwnd, NULL, FALSE); + return 1; + } + case IDC_REGUPDATE: { + for (int i = 0; i < 15; ++i) { + char tmp[16]; + int lg = GetDlgItemText(hwnd, IDC_R0 + i, tmp, 16); + u32 adr = 0; + for (int i = 0; i < lg; ++i) + { + if ((tmp[i] >= 'A') && (tmp[i] <= 'F')) + { + adr = adr * 16 + (tmp[i] - 'A' + 10); + continue; + } + if ((tmp[i] >= '0') && (tmp[i] <= '9')) + { + adr = adr * 16 + (tmp[i] - '0'); + continue; + } + } + + NDS_ARM9.R[i] = adr; + } + return 1; + } + case IDC_RUNRET: { + NDS_ARM9.runToRet = true; + execute = true; + return 1; + } + case IDC_STEPOVER: { + NDS_ARM9.stepOverBreak = NDS_ARM9.instruct_adr + 4; + execute = true; + paused = false; + } return 1; } return 0; diff --git a/desmume/src/frontend/windows/disView.h b/desmume/src/frontend/windows/disView.h index 32be269c2..61684df82 100644 --- a/desmume/src/frontend/windows/disView.h +++ b/desmume/src/frontend/windows/disView.h @@ -21,6 +21,8 @@ #define DISVIEW_H #include +#include +#include extern BOOL CALLBACK ViewDisasm_ARM7Proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); extern LRESULT CALLBACK ViewDisasm_ARM7BoxProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); @@ -28,6 +30,8 @@ extern LRESULT CALLBACK ViewDisasm_ARM7BoxProc(HWND hwnd, UINT msg, WPARAM wPara extern BOOL CALLBACK ViewDisasm_ARM9Proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); extern LRESULT CALLBACK ViewDisasm_ARM9BoxProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +extern HWND DisViewWnd[2]; + template void FORCEINLINE DisassemblerTools_Refresh(); #endif diff --git a/desmume/src/frontend/windows/main.cpp b/desmume/src/frontend/windows/main.cpp index 4a95fc198..5c473bf55 100755 --- a/desmume/src/frontend/windows/main.cpp +++ b/desmume/src/frontend/windows/main.cpp @@ -1214,17 +1214,27 @@ void CheckMessages() while( PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) ) { - if( GetMessage( &msg, 0, 0, 0)>0 ) + if (GetMessage(&msg, 0, 0, 0) > 0) { if (RamWatchHWnd && IsDialogMessage(RamWatchHWnd, &msg)) { - if(msg.message == WM_KEYDOWN) // send keydown messages to the dialog (for accelerators, and also needed for the Alt key to work) + if (msg.message == WM_KEYDOWN) // send keydown messages to the dialog (for accelerators, and also needed for the Alt key to work) SendMessage(RamWatchHWnd, msg.message, msg.wParam, msg.lParam); continue; } if (SoundView_GetHWnd() && IsDialogMessage(SoundView_GetHWnd(), &msg)) continue; + if (DisViewWnd[0] && msg.message == WM_MOUSEWHEEL && IsDialogMessage(DisViewWnd[0], &msg)) + { + SendMessage(DisViewWnd[0], msg.message, msg.wParam, msg.lParam); + } + + if (DisViewWnd[1] && msg.message == WM_MOUSEWHEEL && IsDialogMessage(DisViewWnd[1], &msg)) + { + SendMessage(DisViewWnd[1], msg.message, msg.wParam, msg.lParam); + } + if(!TranslateAccelerator(hwnd,hAccel,&msg)) { TranslateMessage(&msg); diff --git a/desmume/src/frontend/windows/memView.cpp b/desmume/src/frontend/windows/memView.cpp index 05ff757b2..0fe65c7d7 100644 --- a/desmume/src/frontend/windows/memView.cpp +++ b/desmume/src/frontend/windows/memView.cpp @@ -37,6 +37,9 @@ using namespace std; typedef u32 HWAddressType; +int RBPOffs; +int WBPOffs; + struct MemViewRegion { char name[16]; // name of this region (ex. ARM9, region dropdown) @@ -249,6 +252,44 @@ INT_PTR CALLBACK EditAddrProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return CallWindowProc((WNDPROC)oldEditAddrProc, hWnd, msg, wParam, lParam); } +void MemView_Paint(CMemView* wnd, HWND hCtl, WPARAM wParam, LPARAM lParam) { + + PAINTSTRUCT ps; + + BeginPaint(hCtl, &ps); + // update text... + char str[16]; + for (int i = 0; i < 8; ++i) { + int j = i + RBPOffs; + if (j < memReadBreakPoints.size()) { + sprintf(str, "%08X", memReadBreakPoints[j]); + } + else { + sprintf(str, "%08X", 0); + } + SetWindowText(GetDlgItem(hCtl, IDC_MRBP0 + i), str); + } + + for (int i = 0; i < 8; ++i) { + int j = i + WBPOffs; + if (j < memWriteBreakPoints.size()) { + sprintf(str, "%08X", memWriteBreakPoints[j]); + } + else { + sprintf(str, "%08X", 0); + } + SetWindowText(GetDlgItem(hCtl, IDC_MWBP0 + i), str); + } + + sprintf(str, "%02i", RBPOffs); + SetWindowText(GetDlgItem(hCtl, IDC_MEMRBPOFFS), str); + + sprintf(str, "%02i", WBPOffs); + SetWindowText(GetDlgItem(hCtl, IDC_MEMWBPOFFS), str); + + EndPaint(hCtl, &ps); +} + INT_PTR CALLBACK MemView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CMemView* wnd = (CMemView*)GetWindowLongPtr(hDlg, DWLP_USER); @@ -325,6 +366,10 @@ INT_PTR CALLBACK MemView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa } return 1; + case WM_PAINT: + MemView_Paint(wnd, hDlg, wParam, lParam); + return 1; + case WM_DESTROY: { u16 num = ComboBox_GetCount(gAddress); @@ -630,6 +675,73 @@ INT_PTR CALLBACK MemView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa wnd->Refresh(); wnd->SetFocus(); return 1; + + case IDC_READBP: + { + char str[16]; + GetDlgItemText(hDlg, IDC_MEMBPTARG, str, 16); + memReadBreakPoints.push_back(strtol(str, NULL, 16)); + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_WRITEBP: + { + char str[16]; + GetDlgItemText(hDlg, IDC_MEMBPTARG, str, 16); + memWriteBreakPoints.push_back(strtol(str, NULL, 16)); + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_DELREADBP: { + if (RBPOffs < memReadBreakPoints.size()) { + memReadBreakPoints.erase(memReadBreakPoints.begin() + RBPOffs); + } + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_DELWRITEBP: { + if (WBPOffs < memWriteBreakPoints.size()) { + memWriteBreakPoints.erase(memWriteBreakPoints.begin() + WBPOffs); + } + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_MEMRBPUP: { + RBPOffs = max(0, RBPOffs - 1); + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_MEMRBPDOWN: { + RBPOffs += 1; + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_MEMWBPUP: { + WBPOffs = max(0, WBPOffs - 1); + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } + case IDC_MEMWBPDOWN: { + WBPOffs += 1; + wnd->Refresh(); + wnd->SetFocus(); + InvalidateRect(hDlg, NULL, FALSE); + return 1; + } } return 0; } @@ -727,6 +839,16 @@ LRESULT MemView_ViewBoxPaint(CMemView* wnd, HWND hCtl, WPARAM wParam, LPARAM lPa else { SetBkColor(mem_hdc, RGB(255, 255, 255)); + for (int j = 0; j < memReadBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memReadBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } + for (int j = 0; j < memWriteBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memWriteBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } SetTextColor(mem_hdc, RGB(0, 0, 0)); sprintf(text, "%02X", val); @@ -770,6 +892,16 @@ LRESULT MemView_ViewBoxPaint(CMemView* wnd, HWND hCtl, WPARAM wParam, LPARAM lPa else { SetBkColor(mem_hdc, RGB(255, 255, 255)); + for (int j = 0; j < memReadBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memReadBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } + for (int j = 0; j < memWriteBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memWriteBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } SetTextColor(mem_hdc, RGB(0, 0, 0)); sprintf(text, "%04X", val); @@ -823,6 +955,16 @@ LRESULT MemView_ViewBoxPaint(CMemView* wnd, HWND hCtl, WPARAM wParam, LPARAM lPa else { SetBkColor(mem_hdc, RGB(255, 255, 255)); + for (int j = 0; j < memReadBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memReadBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } + for (int j = 0; j < memWriteBreakPoints.size(); ++j) { + if ((line << 4) + i + wnd->address == memWriteBreakPoints[j]) { + SetBkColor(mem_hdc, RGB(255, 0, 0)); + } + } SetTextColor(mem_hdc, RGB(0, 0, 0)); sprintf(text, "%08X", val); diff --git a/desmume/src/frontend/windows/resource.h b/desmume/src/frontend/windows/resource.h index b139e9708..a753958ae 100755 --- a/desmume/src/frontend/windows/resource.h +++ b/desmume/src/frontend/windows/resource.h @@ -91,6 +91,22 @@ #define IDC_COMBO2 161 #define IDC_COMBO3 162 #define IDC_COMBO4 163 +#define IDC_DISASMSEEK 164 +#define IDC_BREAKPOINT 165 +#define IDC_BPDEST 166 +#define IDC_BP0 167 +#define IDC_BP1 168 +#define IDC_BP2 169 +#define IDC_BP3 170 +#define IDC_BP4 171 +#define IDC_BP5 172 +#define IDC_BP6 173 +#define IDC_BP7 174 +#define IDC_BPUP 175 +#define IDC_BPDOWN 176 +#define IDC_DELBP 177 +#define IDC_BPCOUNT 178 +#define IDC_REGUPDATE 179 #define IDM_CONFIG 180 #define IDC_FRAMESKIP0 191 #define IDC_FRAMESKIP1 192 @@ -109,6 +125,35 @@ #define IDM_MGPU 219 #define IDM_SGPU 220 #define IDC_FRAMESKIPAUTO 221 +#define IDC_RUNRET 230 +#define IDC_STEPOVER 231 +#define IDC_MEMBPTARG 232 +#define IDC_READBP 233 +#define IDC_WRITEBP 234 +#define IDC_DELREADBP 235 +#define IDC_DELWRITEBP 236 +#define IDC_MRBP0 237 +#define IDC_MRBP1 238 +#define IDC_MRBP2 239 +#define IDC_MRBP3 240 +#define IDC_MRBP4 241 +#define IDC_MRBP5 242 +#define IDC_MRBP6 243 +#define IDC_MRBP7 244 +#define IDC_MWBP0 245 +#define IDC_MWBP1 246 +#define IDC_MWBP2 247 +#define IDC_MWBP3 248 +#define IDC_MWBP4 249 +#define IDC_MWBP5 250 +#define IDC_MWBP6 251 +#define IDC_MWBP7 252 +#define IDC_MEMRBPUP 253 +#define IDC_MEMRBPDOWN 254 +#define IDC_MEMRBPOFFS 255 +#define IDC_MEMWBPUP 256 +#define IDC_MEMWBPDOWN 257 +#define IDC_MEMWBPOFFS 258 #define IDC_8_BIT 302 #define IDC_16_BIT 303 #define IDC_32_BIT 304 diff --git a/desmume/src/frontend/windows/resources.rc b/desmume/src/frontend/windows/resources.rc index acf533034..a136d2254 100755 --- a/desmume/src/frontend/windows/resources.rc +++ b/desmume/src/frontend/windows/resources.rc @@ -311,7 +311,7 @@ BEGIN DEFPUSHBUTTON "Add",IDC_BADD,120,190,50,14 END -IDD_DESASSEMBLEUR_VIEWER7 DIALOGEX 0, 0, 380, 186 +IDD_DESASSEMBLEUR_VIEWER7 DIALOGEX 0, 0, 470, 206 STYLE DS_SETFONT | DS_CENTER | WS_CAPTION CAPTION "Disassembler" FONT 8, "MS Sans Serif", 0, 0, 0x1 @@ -325,43 +325,43 @@ BEGIN CONTROL "&Auto-update",IDC_AUTO_UPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,285,1,54,14 CONTROL "Edit",IDC_DES_BOX,"DesViewBox7",WS_VSCROLL | WS_TABSTOP,4,16,296,150 PUSHBUTTON "&Close",IDC_FERMER,248,170,50,14 - LTEXT "R0 :",IDC_STATIC,304,16,17,8 - LTEXT "R1 :",IDC_STATIC,304,24,17,8 - LTEXT "R2 :",IDC_STATIC,304,32,17,8 - LTEXT "R3 :",IDC_STATIC,304,40,17,8 - LTEXT "R4 :",IDC_STATIC,304,48,17,8 - LTEXT "R5 :",IDC_STATIC,304,56,17,8 - LTEXT "R6 :",IDC_STATIC,304,64,17,8 - LTEXT "R7 :",IDC_STATIC,304,72,17,8 - LTEXT "R8 :",IDC_STATIC,304,80,17,8 - LTEXT "R9 :",IDC_STATIC,304,88,17,8 - LTEXT "R10 :",IDC_STATIC,304,96,17,8 - LTEXT "R11 :",IDC_STATIC,304,104,17,8 - LTEXT "R12 :",IDC_STATIC,304,112,17,8 - LTEXT "SP :",IDC_STATIC,304,120,17,8 - LTEXT "LR :",IDC_STATIC,304,128,17,8 - LTEXT "PC :",IDC_STATIC,304,136,17,8 - LTEXT "Mode :",IDC_STATIC,304,158,22,8 - LTEXT "SPSR :",IDC_STATIC,304,168,22,8 - LTEXT "00000000",IDC_R0,325,16,40,8 - LTEXT "00000000",IDC_R1,325,24,40,8 - LTEXT "00000000",IDC_R2,325,32,40,8 - LTEXT "00000000",IDC_R3,325,40,40,8 - LTEXT "00000000",IDC_R4,325,48,40,8 - LTEXT "00000000",IDC_R5,325,56,40,8 - LTEXT "00000000",IDC_R6,325,64,40,8 - LTEXT "00000000",IDC_R7,325,72,40,8 - LTEXT "00000000",IDC_R8,325,80,40,8 - LTEXT "00000000",IDC_R9,325,88,40,8 - LTEXT "00000000",IDC_R10,325,96,40,8 - LTEXT "00000000",IDC_R11,325,104,40,8 - LTEXT "00000000",IDC_R12,325,112,40,8 - LTEXT "00000000",IDC_R13,325,120,40,8 - LTEXT "00000000",IDC_R14,325,128,40,8 - LTEXT "00000000",IDC_R15,325,136,40,8 - LTEXT "",IDC_MODE,327,158,28,8 - LTEXT "",IDC_TMP,327,168,40,8 - EDITTEXT IDC_AUTO_UPDATE_SECS,340,3,12,14,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED + LTEXT "R0 :", IDC_STATIC, 304, 16, 17, 8 + LTEXT "R1 :", IDC_STATIC, 304, 26, 17, 8 + LTEXT "R2 :", IDC_STATIC, 304, 36, 17, 8 + LTEXT "R3 :", IDC_STATIC, 304, 46, 17, 8 + LTEXT "R4 :", IDC_STATIC, 304, 56, 17, 8 + LTEXT "R5 :", IDC_STATIC, 304, 66, 17, 8 + LTEXT "R6 :", IDC_STATIC, 304, 76, 17, 8 + LTEXT "R7 :", IDC_STATIC, 304, 86, 17, 8 + LTEXT "R8 :", IDC_STATIC, 304, 96, 17, 8 + LTEXT "R9 :", IDC_STATIC, 304, 106, 17, 8 + LTEXT "R10 :", IDC_STATIC, 304, 116, 17, 8 + LTEXT "R11 :", IDC_STATIC, 304, 126, 17, 8 + LTEXT "R12 :", IDC_STATIC, 304, 136, 17, 8 + LTEXT "SP :", IDC_STATIC, 304, 146, 17, 8 + LTEXT "LR :", IDC_STATIC, 304, 156, 17, 8 + LTEXT "PC :", IDC_STATIC, 304, 166, 17, 8 + LTEXT "Mode :", IDC_STATIC, 304, 188, 22, 8 + LTEXT "SPSR :", IDC_STATIC, 304, 198, 22, 8 + EDITTEXT IDC_R0, 325, 16, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R1, 325, 26, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R2, 325, 36, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R3, 325, 46, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R4, 325, 56, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R5, 325, 66, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R6, 325, 76, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R7, 325, 86, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R8, 325, 96, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R9, 325, 106, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R10, 325, 116, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R11, 325, 126, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R12, 325, 136, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R13, 325, 146, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R14, 325, 156, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R15, 325, 166, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + LTEXT "", IDC_MODE, 327, 188, 28, 8 + LTEXT "", IDC_TMP, 327, 198, 40, 8 + EDITTEXT IDC_AUTO_UPDATE_SECS,340,3,12,12,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED CONTROL "",IDC_AUTO_UPDATE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_DISABLED,352,2,11,14 LTEXT "frames",IDC_STATIC,364,5,16,8 PUSHBUTTON "&Refresh",IDC_REFRESH,162,170,50,14,BS_ICON @@ -369,9 +369,26 @@ BEGIN PUSHBUTTON "&Step",IDC_STEP,41,170,24,14 CONTROL "Autoupd asm",IDC_AUTOUPDATE_ASM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,172,57,10 PUSHBUTTON "&Cont",IDC_CONTINUE,67,170,24,14 + LTEXT "00000000", IDC_BP0, 390, 32, 50, 14 + LTEXT "00000000", IDC_BP1, 390, 42, 50, 14 + LTEXT "00000000", IDC_BP2, 390, 52, 50, 14 + LTEXT "00000000", IDC_BP3, 390, 62, 50, 14 + LTEXT "00000000", IDC_BP4, 390, 72, 50, 14 + LTEXT "00000000", IDC_BP5, 390, 82, 50, 14 + LTEXT "00000000", IDC_BP6, 390, 92, 50, 14 + LTEXT "00000000", IDC_BP7, 390, 102, 50, 14 + PUSHBUTTON "&^", IDC_BPUP, 430, 32, 16, 14 + PUSHBUTTON "&v", IDC_BPDOWN, 430, 48, 16, 14 + LTEXT "00", IDC_BPCOUNT, 430, 64, 32, 14 + PUSHBUTTON "&Delete Breakpoint", IDC_DELBP, 390, 112, 76, 14 + PUSHBUTTON "&Update Registers", IDC_REGUPDATE, 390, 128, 76, 14 + PUSHBUTTON "&Run To Return", IDC_RUNRET, 390, 144, 76, 14 + PUSHBUTTON "&Step Over", IDC_STEPOVER, 390, 160, 76, 14 + PUSHBUTTON "&Add Breakpoint", IDC_BREAKPOINT, 390, 0, 76, 14 + EDITTEXT IDC_BPDEST, 390, 16, 76, 14, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP END -IDD_DESASSEMBLEUR_VIEWER9 DIALOGEX 0, 0, 380, 186 +IDD_DESASSEMBLEUR_VIEWER9 DIALOGEX 0, 0, 470, 206 STYLE DS_SETFONT | DS_CENTER | WS_CAPTION CAPTION "Disassembler" FONT 8, "MS Sans Serif", 0, 0, 0x1 @@ -385,45 +402,62 @@ BEGIN CONTROL "&Auto-update",IDC_AUTO_UPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,285,1,54,14 CONTROL "Edit",IDC_DES_BOX,"DesViewBox9",WS_VSCROLL | WS_TABSTOP,4,16,296,150 PUSHBUTTON "&Close",IDC_FERMER,248,170,50,14 + PUSHBUTTON "&Add Breakpoint",IDC_BREAKPOINT,390,0,76,14 + EDITTEXT IDC_BPDEST,390,16,76,14,ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP EDITTEXT IDC_SETPNUM,5,170,34,14,ES_UPPERCASE | ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP + LTEXT "00000000",IDC_BP0,390,32,50,14 + LTEXT "00000000",IDC_BP1,390,42,50,14 + LTEXT "00000000",IDC_BP2,390,52,50,14 + LTEXT "00000000",IDC_BP3,390,62,50,14 + LTEXT "00000000",IDC_BP4,390,72,50,14 + LTEXT "00000000",IDC_BP5,390,82,50,14 + LTEXT "00000000",IDC_BP6,390,92,50,14 + LTEXT "00000000",IDC_BP7,390,102,50,14 + PUSHBUTTON "&^",IDC_BPUP,430,32,16,14 + PUSHBUTTON "&v",IDC_BPDOWN,430,48,16,14 + LTEXT "00",IDC_BPCOUNT,430,64,32,14 + PUSHBUTTON "&Delete Breakpoint",IDC_DELBP,390,112,76,14 + PUSHBUTTON "&Update Registers",IDC_REGUPDATE,390,128,76,14 + PUSHBUTTON "&Run To Return",IDC_RUNRET,390,144,76,14 + PUSHBUTTON "&Step Over",IDC_STEPOVER,390,160,76,14 PUSHBUTTON "&Step",IDC_STEP,41,170,24,14 LTEXT "R0 :",IDC_STATIC,304,16,17,8 - LTEXT "R1 :",IDC_STATIC,304,24,17,8 - LTEXT "R2 :",IDC_STATIC,304,32,17,8 - LTEXT "R3 :",IDC_STATIC,304,40,17,8 - LTEXT "R4 :",IDC_STATIC,304,48,17,8 - LTEXT "R5 :",IDC_STATIC,304,56,17,8 - LTEXT "R6 :",IDC_STATIC,304,64,17,8 - LTEXT "R7 :",IDC_STATIC,304,72,17,8 - LTEXT "R8 :",IDC_STATIC,304,80,17,8 - LTEXT "R9 :",IDC_STATIC,304,88,17,8 - LTEXT "R10 :",IDC_STATIC,304,96,17,8 - LTEXT "R11 :",IDC_STATIC,304,104,17,8 - LTEXT "R12 :",IDC_STATIC,304,112,17,8 - LTEXT "SP :",IDC_STATIC,304,120,17,8 - LTEXT "LR :",IDC_STATIC,304,128,17,8 - LTEXT "PC :",IDC_STATIC,304,136,17,8 - LTEXT "Mode :",IDC_STATIC,304,158,22,8 - LTEXT "SPSR :",IDC_STATIC,304,168,22,8 - LTEXT "00000000",IDC_R0,325,16,40,8 - LTEXT "00000000",IDC_R1,325,24,40,8 - LTEXT "00000000",IDC_R2,325,32,40,8 - LTEXT "00000000",IDC_R3,325,40,40,8 - LTEXT "00000000",IDC_R4,325,48,40,8 - LTEXT "00000000",IDC_R5,325,56,40,8 - LTEXT "00000000",IDC_R6,325,64,40,8 - LTEXT "00000000",IDC_R7,325,72,40,8 - LTEXT "00000000",IDC_R8,325,80,40,8 - LTEXT "00000000",IDC_R9,325,88,40,8 - LTEXT "00000000",IDC_R10,325,96,40,8 - LTEXT "00000000",IDC_R11,325,104,40,8 - LTEXT "00000000",IDC_R12,325,112,40,8 - LTEXT "00000000",IDC_R13,325,120,40,8 - LTEXT "00000000",IDC_R14,325,128,40,8 - LTEXT "00000000",IDC_R15,325,136,40,8 - LTEXT "",IDC_MODE,327,158,28,8 - LTEXT "",IDC_TMP,327,168,40,8 - EDITTEXT IDC_AUTO_UPDATE_SECS,340,3,12,14,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED + LTEXT "R1 :",IDC_STATIC,304,26,17,8 + LTEXT "R2 :",IDC_STATIC,304,36,17,8 + LTEXT "R3 :",IDC_STATIC,304,46,17,8 + LTEXT "R4 :",IDC_STATIC,304,56,17,8 + LTEXT "R5 :",IDC_STATIC,304,66,17,8 + LTEXT "R6 :",IDC_STATIC,304,76,17,8 + LTEXT "R7 :",IDC_STATIC,304,86,17,8 + LTEXT "R8 :",IDC_STATIC,304,96,17,8 + LTEXT "R9 :",IDC_STATIC,304,106,17,8 + LTEXT "R10 :",IDC_STATIC,304,116,17,8 + LTEXT "R11 :",IDC_STATIC,304,126,17,8 + LTEXT "R12 :",IDC_STATIC,304,136,17,8 + LTEXT "SP :",IDC_STATIC,304,146,17,8 + LTEXT "LR :",IDC_STATIC,304,156,17,8 + LTEXT "PC :",IDC_STATIC,304,166,17,8 + LTEXT "Mode :",IDC_STATIC,304,188,22,8 + LTEXT "SPSR :",IDC_STATIC,304,198,22,8 + EDITTEXT IDC_R0, 325, 16, 40, 10,ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R1, 325, 26, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R2, 325, 36, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R3, 325, 46, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R4, 325, 56, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R5, 325, 66, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R6, 325, 76, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R7, 325, 86, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R8, 325, 96, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R9, 325, 106, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R10, 325, 116, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R11, 325, 126, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R12, 325, 136, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R13, 325, 146, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R14, 325, 156, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + EDITTEXT IDC_R15, 325, 166, 40, 10, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + LTEXT "",IDC_MODE,327,188,28,8 + LTEXT "",IDC_TMP,327,198,40,8 + EDITTEXT IDC_AUTO_UPDATE_SECS,340,3,12,12,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED CONTROL "",IDC_AUTO_UPDATE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_DISABLED,352,2,11,14 LTEXT "frames",IDC_STATIC,364,5,16,8 PUSHBUTTON "&Refresh",IDC_REFRESH,162,170,50,14,BS_ICON @@ -808,7 +842,7 @@ BEGIN LTEXT "frames",IDC_STATIC,92,158,16,8 END -IDD_MEM_VIEW DIALOGEX 0, 0, 444, 239 +IDD_MEM_VIEW DIALOGEX 0, 0, 614, 239 STYLE DS_SETFONT | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Memory Viewer" FONT 8, "MS Sans Serif", 0, 0, 0x0 @@ -832,6 +866,33 @@ BEGIN LTEXT "",IDC_2012,163,223,73,8 EDITTEXT IDC_CURRENT_ADDR,41,223,43,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Address:",IDC_STATIC,8,222,28,13 + EDITTEXT IDC_MEMBPTARG, 446, 6, 160, 14, ES_UPPERCASE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_GROUP + PUSHBUTTON "Add Read Breakpoint", IDC_READBP, 446, 22, 80, 14 + PUSHBUTTON "Add Write Breakpoint", IDC_WRITEBP, 528, 22, 80, 14 + PUSHBUTTON "Del Read Breakpoint", IDC_DELREADBP, 446, 166, 80, 14 + PUSHBUTTON "Del Write Breakpoint", IDC_DELWRITEBP, 528, 166, 80, 14 + LTEXT "00000000", IDC_MRBP0, 446, 38, 60, 14 + LTEXT "00000000", IDC_MRBP1, 446, 54, 60, 14 + LTEXT "00000000", IDC_MRBP2, 446, 70, 60, 14 + LTEXT "00000000", IDC_MRBP3, 446, 86, 60, 14 + LTEXT "00000000", IDC_MRBP4, 446, 102, 60, 14 + LTEXT "00000000", IDC_MRBP5, 446, 118, 60, 14 + LTEXT "00000000", IDC_MRBP6, 446, 134, 60, 14 + LTEXT "00000000", IDC_MRBP7, 446, 150, 60, 14 + LTEXT "00000000", IDC_MWBP0, 528, 38, 60, 14 + LTEXT "00000000", IDC_MWBP1, 528, 54, 60, 14 + LTEXT "00000000", IDC_MWBP2, 528, 70, 60, 14 + LTEXT "00000000", IDC_MWBP3, 528, 86, 60, 14 + LTEXT "00000000", IDC_MWBP4, 528, 102, 60, 14 + LTEXT "00000000", IDC_MWBP5, 528, 118, 60, 14 + LTEXT "00000000", IDC_MWBP6, 528, 134, 60, 14 + LTEXT "00000000", IDC_MWBP7, 528, 150, 60, 14 + PUSHBUTTON "^", IDC_MEMRBPUP, 480, 38, 14, 14 + PUSHBUTTON "v", IDC_MEMRBPDOWN, 480, 54, 14, 14 + LTEXT "00", IDC_MEMRBPOFFS, 480, 70, 14, 28 + PUSHBUTTON "^", IDC_MEMWBPUP, 562, 38, 14, 14 + PUSHBUTTON "v", IDC_MEMWBPDOWN, 562, 54, 14, 14 + LTEXT "00", IDC_MEMWBPOFFS, 562, 70, 14, 28 END IDD_MICROPHONE DIALOGEX 0, 0, 241, 142