From ed046c0d5ddb0bd05647d2169316980f1e285e43 Mon Sep 17 00:00:00 2001 From: gocha Date: Thu, 15 Oct 2009 06:10:40 +0000 Subject: [PATCH] 0.9.4+ branch: register LuaBitOp lib; add memory.register[write|read|exec] and memory.[get|set]register; win32: main window now accepts dropped *.lua and *.wch files. --- src/MMU.h | 17 ++++++ src/armcpu.cpp | 3 + src/lua-engine.cpp | 137 ++++++++++++++++++++++--------------------- src/windows/main.cpp | 33 +++++++++++ 4 files changed, 122 insertions(+), 68 deletions(-) diff --git a/src/MMU.h b/src/MMU.h index e60a23c70..fd6814336 100644 --- a/src/MMU.h +++ b/src/MMU.h @@ -32,6 +32,8 @@ #include "ARM9.h" #include "mc.h" +#include "lua-engine.h" + //HACK!!!! REMOVE ME SOON! #ifndef ARMCPU_ARM7 #define ARMCPU_ARM7 1 @@ -275,6 +277,8 @@ FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u3 if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } + CallRegisteredLuaMemHook(addr, 1, /*FIXME*/ 0, LUAMEMHOOK_READ); + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -298,6 +302,8 @@ FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } + CallRegisteredLuaMemHook(addr, 2, /*FIXME*/ 0, LUAMEMHOOK_READ); + //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { @@ -334,6 +340,8 @@ FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } + CallRegisteredLuaMemHook(addr, 4, /*FIXME*/ 0, LUAMEMHOOK_READ); + //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { @@ -389,16 +397,19 @@ FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteByte(ARM9Mem.ARM9_DTCM, addr & 0x3FFF, val); + CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); return; } if ( (addr & 0x0F000000) == 0x02000000) { T1WriteByte( ARM9Mem.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val); + CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write08(addr,val); else _MMU_ARM7_write08(addr,val); + CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); } FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val) @@ -414,16 +425,19 @@ FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteWord(ARM9Mem.ARM9_DTCM, addr & 0x3FFF, val); + CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); return; } if ( (addr & 0x0F000000) == 0x02000000) { T1WriteWord( ARM9Mem.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val); + CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write16(addr,val); else _MMU_ARM7_write16(addr,val); + CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); } FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val) @@ -439,16 +453,19 @@ FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteLong(ARM9Mem.ARM9_DTCM, addr & 0x3FFF, val); + CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); return; } if ( (addr & 0x0F000000) == 0x02000000) { T1WriteLong( ARM9Mem.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val); + CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write32(addr,val); else _MMU_ARM7_write32(addr,val); + CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); } diff --git a/src/armcpu.cpp b/src/armcpu.cpp index 262ad2cca..3c941cd04 100644 --- a/src/armcpu.cpp +++ b/src/armcpu.cpp @@ -30,6 +30,7 @@ #include "debug.h" #include "Disassembler.h" #include "NDSSystem.h" +#include "lua-engine.h" template static u32 armcpu_prefetch(); @@ -523,6 +524,7 @@ u32 armcpu_exec() { if((TEST_COND(CONDITION(ARMPROC.instruction), CODE(ARMPROC.instruction), ARMPROC.CPSR))) { + CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 4, ARMPROC.instruction, LUAMEMHOOK_EXEC); // should report even if condition=false? if(PROCNUM==0) { #ifdef WANTASMLISTING char txt[128]; @@ -547,6 +549,7 @@ u32 armcpu_exec() return CommonSettings.armFastFetchExecute ? std::max(cFetch, cExecute) : (cFetch + cExecute); } + CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 2, ARMPROC.instruction, LUAMEMHOOK_EXEC); if(PROCNUM==0) cExecute += thumb_instructions_set_0[ARMPROC.instruction>>6](); else diff --git a/src/lua-engine.cpp b/src/lua-engine.cpp index c9bb09551..11541d633 100644 --- a/src/lua-engine.cpp +++ b/src/lua-engine.cpp @@ -165,8 +165,8 @@ static int memory_registerHook(lua_State* L, LuaMemHookType hookType, int defaul { // get first argument: address unsigned int addr = luaL_checkinteger(L,1); - if((addr & ~0xFFFFFF) == ~0xFFFFFF) - addr &= 0xFFFFFF; + //if((addr & ~0xFFFFFF) == ~0xFFFFFF) + // addr &= 0xFFFFFF; // get optional second argument: size int size = defaultSize; @@ -233,24 +233,24 @@ LuaMemHookType MatchHookTypeToCPU(lua_State* L, LuaMemHookType hookType) if(cpunameIndex) { const char* cpuName = lua_tostring(L, cpunameIndex); - if(!stricmp(cpuName, "sub") || !stricmp(cpuName, "s68k")) - cpuID = 1; +// if(!stricmp(cpuName, "sub") || !stricmp(cpuName, "s68k")) +// cpuID = 1; lua_remove(L, cpunameIndex); } - switch(cpuID) - { - case 0: // m68k: - return hookType; - - case 1: // s68k: - switch(hookType) - { - case LUAMEMHOOK_WRITE: return LUAMEMHOOK_WRITE_SUB; - case LUAMEMHOOK_READ: return LUAMEMHOOK_READ_SUB; - case LUAMEMHOOK_EXEC: return LUAMEMHOOK_EXEC_SUB; - } - } +// switch(cpuID) +// { +// case 0: // m68k: +// return hookType; +// +// case 1: // s68k: +// switch(hookType) +// { +// case LUAMEMHOOK_WRITE: return LUAMEMHOOK_WRITE_SUB; +// case LUAMEMHOOK_READ: return LUAMEMHOOK_READ_SUB; +// case LUAMEMHOOK_EXEC: return LUAMEMHOOK_EXEC_SUB; +// } +// } return hookType; } @@ -1761,46 +1761,46 @@ struct registerPointerMap #define RPM_ENTRY(name,var) {name, (unsigned int*)&var, sizeof(var)}, -registerPointerMap m68kPointerMap [] = { -/* RPM_ENTRY("a0", main68k_context.areg[0]) - RPM_ENTRY("a1", main68k_context.areg[1]) - RPM_ENTRY("a2", main68k_context.areg[2]) - RPM_ENTRY("a3", main68k_context.areg[3]) - RPM_ENTRY("a4", main68k_context.areg[4]) - RPM_ENTRY("a5", main68k_context.areg[5]) - RPM_ENTRY("a6", main68k_context.areg[6]) - RPM_ENTRY("a7", main68k_context.areg[7]) - RPM_ENTRY("d0", main68k_context.dreg[0]) - RPM_ENTRY("d1", main68k_context.dreg[1]) - RPM_ENTRY("d2", main68k_context.dreg[2]) - RPM_ENTRY("d3", main68k_context.dreg[3]) - RPM_ENTRY("d4", main68k_context.dreg[4]) - RPM_ENTRY("d5", main68k_context.dreg[5]) - RPM_ENTRY("d6", main68k_context.dreg[6]) - RPM_ENTRY("d7", main68k_context.dreg[7]) - RPM_ENTRY("pc", main68k_context.pc) - RPM_ENTRY("sr", main68k_context.sr)*/ +registerPointerMap arm9PointerMap [] = { + RPM_ENTRY("r0", NDS_ARM9.R[0]) + RPM_ENTRY("r1", NDS_ARM9.R[1]) + RPM_ENTRY("r2", NDS_ARM9.R[2]) + RPM_ENTRY("r3", NDS_ARM9.R[3]) + RPM_ENTRY("r4", NDS_ARM9.R[4]) + RPM_ENTRY("r5", NDS_ARM9.R[5]) + RPM_ENTRY("r6", NDS_ARM9.R[6]) + RPM_ENTRY("r7", NDS_ARM9.R[7]) + RPM_ENTRY("r8", NDS_ARM9.R[8]) + RPM_ENTRY("r9", NDS_ARM9.R[9]) + RPM_ENTRY("r10", NDS_ARM9.R[10]) + RPM_ENTRY("r11", NDS_ARM9.R[11]) + RPM_ENTRY("r12", NDS_ARM9.R[12]) + RPM_ENTRY("r13", NDS_ARM9.R[13]) + RPM_ENTRY("r14", NDS_ARM9.R[14]) + RPM_ENTRY("r15", NDS_ARM9.R[15]) + RPM_ENTRY("cpsr", NDS_ARM9.CPSR.val) + RPM_ENTRY("spsr", NDS_ARM9.SPSR.val) {} }; -registerPointerMap s68kPointerMap [] = {/* - RPM_ENTRY("a0", sub68k_context.areg[0]) - RPM_ENTRY("a1", sub68k_context.areg[1]) - RPM_ENTRY("a2", sub68k_context.areg[2]) - RPM_ENTRY("a3", sub68k_context.areg[3]) - RPM_ENTRY("a4", sub68k_context.areg[4]) - RPM_ENTRY("a5", sub68k_context.areg[5]) - RPM_ENTRY("a6", sub68k_context.areg[6]) - RPM_ENTRY("a7", sub68k_context.areg[7]) - RPM_ENTRY("d0", sub68k_context.dreg[0]) - RPM_ENTRY("d1", sub68k_context.dreg[1]) - RPM_ENTRY("d2", sub68k_context.dreg[2]) - RPM_ENTRY("d3", sub68k_context.dreg[3]) - RPM_ENTRY("d4", sub68k_context.dreg[4]) - RPM_ENTRY("d5", sub68k_context.dreg[5]) - RPM_ENTRY("d6", sub68k_context.dreg[6]) - RPM_ENTRY("d7", sub68k_context.dreg[7]) - RPM_ENTRY("pc", sub68k_context.pc) - RPM_ENTRY("sr", sub68k_context.sr)*/ +registerPointerMap arm7PointerMap [] = { + RPM_ENTRY("r0", NDS_ARM7.R[0]) + RPM_ENTRY("r1", NDS_ARM7.R[1]) + RPM_ENTRY("r2", NDS_ARM7.R[2]) + RPM_ENTRY("r3", NDS_ARM7.R[3]) + RPM_ENTRY("r4", NDS_ARM7.R[4]) + RPM_ENTRY("r5", NDS_ARM7.R[5]) + RPM_ENTRY("r6", NDS_ARM7.R[6]) + RPM_ENTRY("r7", NDS_ARM7.R[7]) + RPM_ENTRY("r8", NDS_ARM7.R[8]) + RPM_ENTRY("r9", NDS_ARM7.R[9]) + RPM_ENTRY("r10", NDS_ARM7.R[10]) + RPM_ENTRY("r11", NDS_ARM7.R[11]) + RPM_ENTRY("r12", NDS_ARM7.R[12]) + RPM_ENTRY("r13", NDS_ARM7.R[13]) + RPM_ENTRY("r14", NDS_ARM7.R[14]) + RPM_ENTRY("r15", NDS_ARM7.R[15]) + RPM_ENTRY("cpsr", NDS_ARM7.CPSR.val) + RPM_ENTRY("spsr", NDS_ARM7.SPSR.val) {} }; @@ -1811,11 +1811,11 @@ struct cpuToRegisterMap } cpuToRegisterMaps [] = { - {"m68k.", m68kPointerMap}, - {"main.", m68kPointerMap}, - {"s68k.", s68kPointerMap}, - {"sub.", s68kPointerMap}, - {"", m68kPointerMap}, + {"arm9.", arm9PointerMap}, + {"main.", arm9PointerMap}, + {"arm7.", arm7PointerMap}, + {"sub.", arm7PointerMap}, + {"", arm9PointerMap}, }; @@ -3696,13 +3696,13 @@ static const struct luaL_reg memorylib [] = {"writelong", memory_writedword}, // memory hooks -// {"registerwrite", memory_registerwrite}, -// {"registerread", memory_registerread}, -// {"registerexec", memory_registerexec}, + {"registerwrite", memory_registerwrite}, + {"registerread", memory_registerread}, + {"registerexec", memory_registerexec}, // alternate names -// {"register", memory_registerwrite}, -// {"registerrun", memory_registerexec}, -// {"registerexecute", memory_registerexec}, + {"register", memory_registerwrite}, + {"registerrun", memory_registerexec}, + {"registerexecute", memory_registerexec}, {NULL, NULL} }; @@ -3923,6 +3923,7 @@ void registerLibs(lua_State* L) luaL_register(L, "input", inputlib); // for user input luaL_register(L, "movie", movielib); luaL_register(L, "sound", soundlib); + luaL_register(L, "bit", bit_funcs); // LuaBitOp library luaL_register(L, "agg", aggbasicshapes); luaL_register(L, "agg", agggeneralattributes); @@ -4575,8 +4576,8 @@ void CallRegisteredLuaMemHook(unsigned int address, int size, unsigned int value // (on my system that consistently took 200 ms total in the former case and 350 ms total in the latter case) if(hookedRegions[hookType].NotEmpty()) { - if((hookType <= LUAMEMHOOK_EXEC) && (address >= 0xE00000)) - address |= 0xFF0000; // account for mirroring of RAM + //if((hookType <= LUAMEMHOOK_EXEC) && (address >= 0xE00000)) + // address |= 0xFF0000; // account for mirroring of RAM if(hookedRegions[hookType].Contains(address, size)) CallRegisteredLuaMemHook_LuaMatch(address, size, value, hookType); // something has hooked this specific address } diff --git a/src/windows/main.cpp b/src/windows/main.cpp index 493de361e..13bbfe33b 100644 --- a/src/windows/main.cpp +++ b/src/windows/main.cpp @@ -2910,6 +2910,39 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM } } + //------------------------------------------------------- + //Check if Lua script file + //------------------------------------------------------- + else if (!(fileDropped.find(".lua") == string::npos) && (fileDropped.find(".lua") == fileDropped.length()-4)) //ROM is already loaded and .dsm in filename + { + if(LuaScriptHWnds.size() < 16) + { + char temp [1024]; + strcpy(temp, fileDropped.c_str()); + HWND IsScriptFileOpen(const char* Path); + if(!IsScriptFileOpen(temp)) + { + HWND hDlg = CreateDialog(hAppInst, MAKEINTRESOURCE(IDD_LUA), MainWindow->getHWnd(), (DLGPROC) LuaScriptProc); + SendDlgItemMessage(hDlg,IDC_EDIT_LUAPATH,WM_SETTEXT,0,(LPARAM)temp); + } + } + } + + //------------------------------------------------------- + //Check if watchlist file + //------------------------------------------------------- + else if (!(fileDropped.find(".wch") == string::npos) && (fileDropped.find(".wch") == fileDropped.length()-4)) //ROM is already loaded and .dsm in filename + { + if(!RamWatchHWnd) + { + RamWatchHWnd = CreateDialog(hAppInst, MAKEINTRESOURCE(IDD_RAMWATCH), hwnd, (DLGPROC) RamWatchProc); + // DialogsOpen++; + Load_Watches(true, fileDropped.c_str()); + } + else + SetForegroundWindow(RamWatchHWnd); + } + //------------------------------------------------------- //Else load it as a ROM //-------------------------------------------------------