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.
This commit is contained in:
parent
02fc2b2a66
commit
ed046c0d5d
17
src/MMU.h
17
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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "debug.h"
|
||||
#include "Disassembler.h"
|
||||
#include "NDSSystem.h"
|
||||
#include "lua-engine.h"
|
||||
|
||||
template<u32> 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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
//-------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue