diff --git a/output/luapack.zip b/output/luapack/luapack.zip similarity index 99% rename from output/luapack.zip rename to output/luapack/luapack.zip index 10aca5e4..fc0e9041 100644 Binary files a/output/luapack.zip and b/output/luapack/luapack.zip differ diff --git a/src/auxlib.lua b/src/auxlib.lua new file mode 100644 index 00000000..b7806f61 --- /dev/null +++ b/src/auxlib.lua @@ -0,0 +1,192 @@ +local iuplua_open = package.loadlib("iuplua51.dll", "iuplua_open") +iuplua_open() +local iupcontrolslua_open = package.loadlib("iupluacontrols51.dll", "iupcontrolslua_open") +iupcontrolslua_open() + + +function emu.OnClose.iuplua() + if(emu.OnCloseIup ~= nil) then + emu.OnCloseIup(); + end + iup.Close(); +end + +function testiup() + + img1 = iup.image + { + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,3,2,3,2,3,2,2,3,2,2,2,3,3,3,2,2,2,3,3,2,3,2,2,3,3,3,2,2,2}, + {2,2,2,3,2,3,3,2,3,3,2,3,2,3,2,2,2,3,2,3,2,2,3,3,2,3,2,2,2,3,2,2}, + {2,2,2,3,2,3,2,2,3,2,2,3,2,2,2,2,2,3,2,3,2,2,2,3,2,3,2,2,2,3,2,2}, + {2,2,2,3,2,3,2,2,3,2,2,3,2,2,3,3,3,3,2,3,2,2,2,3,2,3,3,3,3,3,2,2}, + {2,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,2,3,2,3,2,2,2,3,2,3,2,2,2,2,2,2}, + {2,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,2,3,2,3,2,2,3,3,2,3,2,2,2,3,2,2}, + {2,2,2,3,2,3,2,2,3,2,2,3,2,2,3,3,3,3,2,2,3,3,2,3,2,2,3,3,3,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,3,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + colors = + { + "BGCOLOR", -- 1 + "255 0 0", -- 2 + "0 0 0" -- 3 (changed because of Lua index starts at 1) + } + } + + img2 = iup.image + { + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {3,3,3,4,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {3,3,3,4,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {3,3,3,4,3,4,3,4,3,3,4,3,3,3,1,1,4,3,3,3,4,4,3,4,3,3,4,4,4,3,3,3}, + {3,3,3,4,3,4,4,3,4,4,3,4,3,4,1,1,3,4,3,4,3,3,4,4,3,4,3,3,3,4,3,3}, + {3,3,3,4,3,4,3,3,4,3,3,4,3,3,1,1,3,4,3,4,3,3,3,4,3,4,3,3,3,4,3,3}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {3,3,3,4,3,4,3,3,4,3,3,4,3,4,1,1,3,4,3,4,3,3,4,4,3,4,3,3,3,4,3,3}, + {3,3,3,4,3,4,3,3,4,3,3,4,3,3,1,1,4,4,3,3,4,4,3,4,3,3,4,4,4,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,4,3,3,3,4,3,3,3,3,3,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,4,4,4,3,3,3,3,3,3,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, + {2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,1,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,3,3,3,3,3,3,3,3,1,1,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; + colors = + { + "0 255 0", -- 1 + "BGCOLOR", -- 2 + "255 0 0", -- 3 + "0 0 0" -- 4 + } + } + + mnu = iup.menu + { + iup.submenu + { + iup.menu + { + iup.item{title="IupItem 1 Checked",value="ON"}, + iup.separator{}, + iup.item{title="IupItem 2 Disabled",active="NO"} + } + ;title="IupSubMenu 1" + }, + iup.item{title="IupItem 3"}, + iup.item{title="IupItem 4"} + } + + dlg = iup.dialog + { + iup.vbox + { + iup.hbox + { + iup.frame + { + iup.vbox + { + iup.button{title="Button Text"}, + iup.button{title="",image=img1}, + iup.button{title="",image=img1,impress=img2} + } + ;title="IupButton" + }, + iup.frame + { + iup.vbox + { + iup.label{title="Label Text"}, + iup.label{title="",separator="HORIZONTAL"}, + iup.label{title="",image=img1} + } + ;title="IupLabel" + }, + iup.frame + { + iup.vbox + { + iup.toggle{title="Toggle Text", value="ON"}, + iup.toggle{title="",image=img1,impress=img2}, + iup.frame + { + iup.radio + { + iup.vbox + { + iup.toggle{title="Toggle Text"}, + iup.toggle{title="Toggle Text"} + } + } + ;title="IupRadio" + } + } + ;title="IupToggle" + }, + iup.frame + { + iup.vbox + { + iup.text{size="80x",value="IupText Text"}, + iup.multiline{size="80x60",expand="YES",value="IupMultiline Text\nSecond Line\nThird Line"} + } + ;title="IupText/IupMultiline" + }, + iup.frame + { + iup.vbox + { + iup.list{"Item 1 Text","Item 2 Text","Item 3 Text"; expand="YES",value="1"}, + iup.list{"Item 1 Text","Item 2 Text","Item 3 Text"; dropdown="YES",expand="YES",value="2"}, + iup.list{"Item 1 Text","Item 2 Text","Item 3 Text"; editbox="YES",expand="YES",value="3"} + } + ;title="IupList" + } + }, + iup.canvas{bgcolor="128 255 0"} + ;gap="5",alignment="ARIGHT",margin="5x5" + } + ;title="IupDialog Title", menu=mnu + } + + dlg:show() + +end \ No newline at end of file diff --git a/src/lua-engine.cpp b/src/lua-engine.cpp index a559d6ef..5be86f55 100644 --- a/src/lua-engine.cpp +++ b/src/lua-engine.cpp @@ -40,7 +40,7 @@ extern "C" #define FALSE 0 #endif -static lua_State *LUA; +static lua_State *L; // Are we running any code right now? static char *luaScriptName = NULL; @@ -62,6 +62,7 @@ static int skipRerecords = FALSE; static const char *frameAdvanceThread = "FCEU.FrameAdvance"; static const char *memoryWatchTable = "FCEU.Memory"; static const char *memoryValueTable = "FCEU.MemValues"; +static const char *onCloseCallback = "emu.OnClose"; static const char *guiCallbackTable = "FCEU.GUI"; // True if there's a thread waiting to run after a run of frame-advance. @@ -124,7 +125,7 @@ static void FCEU_LuaOnStop() { * consult FCEU_LuaFrameSkip(). */ int FCEU_LuaSpeed() { - if (!LUA || !luaRunning) + if (!L || !luaRunning) return 0; //printf("%d\n", speedmode); @@ -145,7 +146,7 @@ int FCEU_LuaSpeed() { * Returns 0 if no, 1 if frame should be skipped, -1 if it should not be. */ int FCEU_LuaFrameSkip() { - if (!LUA || !luaRunning) + if (!L || !luaRunning) return 0; switch (speedmode) { @@ -167,32 +168,32 @@ int FCEU_LuaFrameSkip() { * */ void FCEU_LuaWriteInform() { - if (!LUA || !luaRunning) return; + if (!L || !luaRunning) return; // Nuke the stack, just in case. - lua_settop(LUA,0); + lua_settop(L,0); - lua_getfield(LUA, LUA_REGISTRYINDEX, memoryWatchTable); - lua_pushnil(LUA); - while (lua_next(LUA, 1) != 0) + lua_getfield(L, LUA_REGISTRYINDEX, memoryWatchTable); + lua_pushnil(L); + while (lua_next(L, 1) != 0) { - unsigned int addr = luaL_checkinteger(LUA, 2); + unsigned int addr = luaL_checkinteger(L, 2); lua_Integer value; - lua_getfield(LUA, LUA_REGISTRYINDEX, memoryValueTable); - lua_pushvalue(LUA, 2); - lua_gettable(LUA, 4); - value = luaL_checkinteger(LUA, 5); + lua_getfield(L, LUA_REGISTRYINDEX, memoryValueTable); + lua_pushvalue(L, 2); + lua_gettable(L, 4); + value = luaL_checkinteger(L, 5); if (FCEU_CheatGetByte(addr) != value) { // Value changed; update & invoke the Lua callback - lua_pushinteger(LUA, addr); - lua_pushinteger(LUA, FCEU_CheatGetByte(addr)); - lua_settable(LUA, 4); - lua_pop(LUA, 2); + lua_pushinteger(L, addr); + lua_pushinteger(L, FCEU_CheatGetByte(addr)); + lua_settable(L, 4); + lua_pop(L, 2); numTries = 1000; - int res = lua_pcall(LUA, 0, 0, 0); + int res = lua_pcall(L, 0, 0, 0); if (res) { - const char *err = lua_tostring(LUA, -1); + const char *err = lua_tostring(L, -1); #ifdef WIN32 //StopSound(); //mbg merge 7/23/08 @@ -202,9 +203,9 @@ void FCEU_LuaWriteInform() { #endif } } - lua_settop(LUA, 2); + lua_settop(L, 2); } - lua_settop(LUA, 0); + lua_settop(L, 0); } /////////////////////////// @@ -704,11 +705,10 @@ static int gui_drawpixel(lua_State *L) { int x = luaL_checkinteger(L, 1); int y = luaL_checkinteger(L,2); - y += FSettings.FirstSLine; uint8 colour = gui_getcolour(L,3); - if (x < 0 || x >= 256 || y < FSettings.FirstSLine || y > FSettings.LastSLine) + if (x < 0 || x >= 256 || y < 0 || y >= 256) luaL_error(L,"bad coordinates"); gui_prepare(); @@ -727,14 +727,12 @@ static int gui_drawline(lua_State *L) { y1 = luaL_checkinteger(L,2); x2 = luaL_checkinteger(L,3); y2 = luaL_checkinteger(L,4); - y1 += FSettings.FirstSLine; - y2 += FSettings.FirstSLine; colour = gui_getcolour(L,5); - if (x1 < 0 || x1 >= 256 || y1 < FSettings.FirstSLine || y1 > FSettings.LastSLine) + if (x1 < 0 || x1 >= 256 || y1 < 0 || y1 >= 256) luaL_error(L,"bad coordinates"); - if (x2 < 0 || x2 >= 256 || y2 < FSettings.FirstSLine || y2 > FSettings.LastSLine) + if (x2 < 0 || x2 >= 256 || y2 < 0 || y2 >= 256) luaL_error(L,"bad coordinates"); gui_prepare(); @@ -800,14 +798,12 @@ static int gui_drawbox(lua_State *L) { y1 = luaL_checkinteger(L,2); x2 = luaL_checkinteger(L,3); y2 = luaL_checkinteger(L,4); - y1 += FSettings.FirstSLine; - y2 += FSettings.FirstSLine; colour = gui_getcolour(L,5); - if (x1 < 0 || x1 >= 256 || y1 < FSettings.FirstSLine || y1 > FSettings.LastSLine) + if (x1 < 0 || x1 >= 256 || y1 < 0 || y1 >= 256) luaL_error(L,"bad coordinates"); - if (x2 < 0 || x2 >= 256 || y2 < FSettings.FirstSLine || y2 > FSettings.LastSLine) + if (x2 < 0 || x2 >= 256 || y2 < 0 || y2 >= 256) luaL_error(L,"bad coordinates"); @@ -856,7 +852,7 @@ static int gui_gdscreenshot(lua_State *L) { // This is QUITE nasty... - const int width=256, height=1+FSettings.LastSLine-FSettings.FirstSLine; + const int width=256, height=256; // Stack allocation unsigned char *buffer = (unsigned char*)alloca(2+2+2+1+4 + (width*height*4)); @@ -883,7 +879,7 @@ static int gui_gdscreenshot(lua_State *L) { // Now we can actually save the image data int i = 0; int x,y; - for (y=FSettings.FirstSLine; y <= FSettings.LastSLine; y++) { + for (y=0; y < height; y++) { for (x=0; x < width; x++) { uint8 index = XBuf[y*256 + x]; @@ -929,14 +925,13 @@ static int gui_text(lua_State *L) { x = luaL_checkinteger(L,1); y = luaL_checkinteger(L,2); msg = luaL_checkstring(L,3); - y += FSettings.FirstSLine; - if (x < 0 || x >= 256 || y < FSettings.FirstSLine || y > FSettings.LastSLine) + if (x < 0 || x >= 256 || y < 0 || y >= 256) luaL_error(L,"bad coordinates"); gui_prepare(); - DrawTextTransWH(gui_data+y*256+x, 256, (uint8 *)msg, 0x20+0x80, 256 - x, 1 + FSettings.LastSLine - y); + DrawTextTransWH(gui_data+y*256+x, 256, (uint8 *)msg, 0x20+0x80, 256 - x, 256 - y); return 0; @@ -994,7 +989,7 @@ static int gui_gdoverlay(lua_State *L) { y = 0; } - for (sy += FSettings.FirstSLine; y < height && sy <= FSettings.LastSLine; y++, sy++) { + for (; y < height && sy < 256; y++, sy++) { if (baseX < 0) { x = -baseX; @@ -1436,13 +1431,13 @@ void FCEU_LuaFrameBoundary() { // printf("Lua Frame\n"); // HA! - if (!LUA || !luaRunning) + if (!L || !luaRunning) return; // Our function needs calling - lua_settop(LUA,0); - lua_getfield(LUA, LUA_REGISTRYINDEX, frameAdvanceThread); - lua_State *thread = lua_tothread(LUA,1); + lua_settop(L,0); + lua_getfield(L, LUA_REGISTRYINDEX, frameAdvanceThread); + lua_State *thread = lua_tothread(L,1); // Lua calling C must know that we're busy inside a frame boundary frameBoundary = TRUE; @@ -1456,8 +1451,8 @@ void FCEU_LuaFrameBoundary() { } else if (result != 0) { // Done execution by bad causes FCEU_LuaOnStop(); - lua_pushnil(LUA); - lua_setfield(LUA, LUA_REGISTRYINDEX, frameAdvanceThread); + lua_pushnil(L); + lua_setfield(L, LUA_REGISTRYINDEX, frameAdvanceThread); // Error? #ifdef WIN32 @@ -1496,7 +1491,7 @@ int FCEU_LoadLuaCode(const char *filename) { luaScriptName = strdup(filename); } - if (!LUA) { + if (!L) { #ifdef WIN32 HMODULE test = LoadLibrary("lua5.1.dll"); @@ -1508,59 +1503,65 @@ int FCEU_LoadLuaCode(const char *filename) { FreeLibrary(test); #endif - LUA = lua_open(); - luaL_openlibs(LUA); + L = lua_open(); + luaL_openlibs(L); - luaL_register(LUA, "FCEU", fceulib); - luaL_register(LUA, "memory", memorylib); - luaL_register(LUA, "joypad", joypadlib); - luaL_register(LUA, "savestate", savestatelib); - luaL_register(LUA, "movie", movielib); - luaL_register(LUA, "gui", guilib); + luaL_register(L, "FCEU", fceulib); + luaL_register(L, "memory", memorylib); + luaL_register(L, "joypad", joypadlib); + luaL_register(L, "savestate", savestatelib); + luaL_register(L, "movie", movielib); + luaL_register(L, "gui", guilib); - lua_pushcfunction(LUA, base_AND); - lua_setfield(LUA, LUA_GLOBALSINDEX, "AND"); - lua_pushcfunction(LUA, base_OR); - lua_setfield(LUA, LUA_GLOBALSINDEX, "OR"); - lua_pushcfunction(LUA, base_XOR); - lua_setfield(LUA, LUA_GLOBALSINDEX, "XOR"); - lua_pushcfunction(LUA, base_BIT); - lua_setfield(LUA, LUA_GLOBALSINDEX, "BIT"); + lua_pushcfunction(L, base_AND); + lua_setfield(L, LUA_GLOBALSINDEX, "AND"); + lua_pushcfunction(L, base_OR); + lua_setfield(L, LUA_GLOBALSINDEX, "OR"); + lua_pushcfunction(L, base_XOR); + lua_setfield(L, LUA_GLOBALSINDEX, "XOR"); + lua_pushcfunction(L, base_BIT); + lua_setfield(L, LUA_GLOBALSINDEX, "BIT"); + + lua_newtable(L); + lua_setglobal(L,"emu"); + lua_getglobal(L,"emu"); + lua_newtable(L); + lua_setfield(L,-2,"OnClose"); - lua_newtable(LUA); - lua_setfield(LUA, LUA_REGISTRYINDEX, memoryWatchTable); - lua_newtable(LUA); - lua_setfield(LUA, LUA_REGISTRYINDEX, memoryValueTable); + lua_newtable(L); + lua_setfield(L, LUA_REGISTRYINDEX, memoryWatchTable); + lua_newtable(L); + lua_setfield(L, LUA_REGISTRYINDEX, memoryValueTable); } // We make our thread NOW because we want it at the bottom of the stack. // If all goes wrong, we let the garbage collector remove it. - lua_State *thread = lua_newthread(LUA); + lua_State *thread = lua_newthread(L); // Load the data - int result = luaL_loadfile(LUA,filename); + int result = luaL_loadfile(L,filename); if (result) { #ifdef WIN32 // Doing this here caused nasty problems; reverting to MessageBox-from-dialog behavior. //StopSound();//StopSound(); //mbg merge 7/23/08 - MessageBox(NULL, lua_tostring(LUA,-1), "Lua load error", MB_OK | MB_ICONSTOP); + MessageBox(NULL, lua_tostring(L,-1), "Lua load error", MB_OK | MB_ICONSTOP); #else - fprintf(stderr, "Failed to compile file: %s\n", lua_tostring(LUA,-1)); + fprintf(stderr, "Failed to compile file: %s\n", lua_tostring(L,-1)); #endif // Wipe the stack. Our thread - lua_settop(LUA,0); + lua_settop(L,0); return 0; // Oh shit. } // Get our function into it - lua_xmove(LUA, thread, 1); + lua_xmove(L, thread, 1); // Save the thread to the registry. This is why I make the thread FIRST. - lua_setfield(LUA, LUA_REGISTRYINDEX, frameAdvanceThread); + lua_setfield(L, LUA_REGISTRYINDEX, frameAdvanceThread); // Initialize settings @@ -1601,12 +1602,26 @@ void FCEU_ReloadLuaCode() void FCEU_LuaStop() { // Kill it. - if (LUA) { - lua_close(LUA); // this invokes our garbage collectors for us - LUA = NULL; - FCEU_LuaOnStop(); + if (!L) return; + + //execute the user's shutdown callbacks + //onCloseCallback + lua_getglobal(L, "emu"); + lua_getfield(L, -1, "OnClose"); + lua_pushnil(L); + while (lua_next(L, -2) != 0) + { + lua_call(L,0,0); } + //sometimes iup uninitializes com + CoInitialize(0); + //lua_gc(L,LUA_GCCOLLECT,0); + + + lua_close(L); // this invokes our garbage collectors for us + L = NULL; + FCEU_LuaOnStop(); } /** @@ -1614,7 +1629,7 @@ void FCEU_LuaStop() { * */ int FCEU_LuaRunning() { - return LUA && luaRunning; + return L && luaRunning; } @@ -1644,7 +1659,7 @@ uint8 FCEU_LuaReadJoypad(int which) { * This function will not return true if a script is not running. */ int FCEU_LuaRerecordCountSkip() { - return LUA && luaRunning && skipRerecords; + return L && luaRunning && skipRerecords; } @@ -1656,32 +1671,32 @@ int FCEU_LuaRerecordCountSkip() { */ void FCEU_LuaGui(uint8 *XBuf) { - if (!LUA || !luaRunning) + if (!L || !luaRunning) return; // First, check if we're being called by anybody - lua_getfield(LUA, LUA_REGISTRYINDEX, guiCallbackTable); + lua_getfield(L, LUA_REGISTRYINDEX, guiCallbackTable); - if (lua_isfunction(LUA, -1)) { + if (lua_isfunction(L, -1)) { // We call it now numTries = 1000; - int ret = lua_pcall(LUA, 0, 0, 0); + int ret = lua_pcall(L, 0, 0, 0); if (ret != 0) { #ifdef WIN32 //StopSound();//StopSound(); //mbg merge 7/23/08 - MessageBox(hAppWnd, lua_tostring(LUA, -1), "Lua Error in GUI function", MB_OK); + MessageBox(hAppWnd, lua_tostring(L, -1), "Lua Error in GUI function", MB_OK); #else - fprintf(stderr, "Lua error in gui.register function: %s\n", lua_tostring(LUA, -1)); + fprintf(stderr, "Lua error in gui.register function: %s\n", lua_tostring(L, -1)); #endif // This is grounds for trashing the function - lua_pushnil(LUA); - lua_setfield(LUA, LUA_REGISTRYINDEX, guiCallbackTable); + lua_pushnil(L); + lua_setfield(L, LUA_REGISTRYINDEX, guiCallbackTable); } } // And wreak the stack - lua_settop(LUA, 0); + lua_settop(L, 0); if (gui_used == GUI_CLEAR) return; @@ -1695,14 +1710,14 @@ void FCEU_LuaGui(uint8 *XBuf) { // direct copy if (transparency == 0) { - for (y = FSettings.FirstSLine; y <= FSettings.LastSLine && y < 256; y++) { + for (y = 0; y < 256; y++) { for (x=0; x < 256; x++) { if (gui_data[y*256+x] != GUI_COLOUR_CLEAR) XBuf[y*256 + x] = gui_data[y*256+x]; } } } else { - for (y = FSettings.FirstSLine; y <= FSettings.LastSLine && y < 256; y++) { + for (y = 0; y < 256; y++) { for (x=0; x < 256; x++) { if (gui_data[y*256+x] != GUI_COLOUR_CLEAR) { uint8 rg, gg, bg, rx, gx, bx, r, g, b; diff --git a/vc8/archive.bat b/vc8/archive.bat index 726862f2..113b36e9 100644 --- a/vc8/archive.bat +++ b/vc8/archive.bat @@ -1,4 +1,6 @@ del /s fceux.zip cd ..\output ..\vc8\zip -X -9 -r ..\vc8\fceux.zip fceux.exe fceux.chm 7z.dll palettes +copy /y luapack\luapack.zip ..\vc8\ +..\vc8\zip -X -9 -r ..\vc8\luapack.zip auxlib.lua cd ..\vc8 \ No newline at end of file diff --git a/vc8/fceux.vcproj b/vc8/fceux.vcproj index e2d07e28..1aa5951e 100644 --- a/vc8/fceux.vcproj +++ b/vc8/fceux.vcproj @@ -2452,6 +2452,28 @@ RelativePath="..\src\asm.cpp" > + + + + + + + + diff --git a/vc8/upload.bat b/vc8/upload.bat index 25448ddd..42ba8407 100644 --- a/vc8/upload.bat +++ b/vc8/upload.bat @@ -1 +1,2 @@ -pscp -pw zzzap333 fceux.zip fceux@www.pi-r-squared.com:web/zip/fceux.zip \ No newline at end of file +pscp -pw zzzap333 fceux.zip fceux@www.pi-r-squared.com:web/zip/fceux.zip +pscp -pw zzzap333 luapack.zip fceux@www.pi-r-squared.com:web/lua/luapack.zip \ No newline at end of file