lua/js sync impl
This commit is contained in:
parent
62a64515ef
commit
6e8a478ee9
|
@ -1978,7 +1978,7 @@ static void onConsoleResumeCommand(Console* console, const char* param)
|
||||||
commandDone(console);
|
commandDone(console);
|
||||||
|
|
||||||
console->tic->api.resume(console->tic);
|
console->tic->api.resume(console->tic);
|
||||||
console->tic->api.sync(console->tic, tic_bank_all, 0, false);
|
console->tic->api.sync(console->tic, NULL, 0, false);
|
||||||
|
|
||||||
setStudioMode(TIC_RUN_MODE);
|
setStudioMode(TIC_RUN_MODE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -704,8 +704,13 @@ static duk_ret_t duk_sync(duk_context* duk)
|
||||||
tic_mem* memory = (tic_mem*)getDukMachine(duk);
|
tic_mem* memory = (tic_mem*)getDukMachine(duk);
|
||||||
|
|
||||||
bool toCart = duk_is_null_or_undefined(duk, 0) ? true : duk_to_boolean(duk, 0);
|
bool toCart = duk_is_null_or_undefined(duk, 0) ? true : duk_to_boolean(duk, 0);
|
||||||
|
const char* section = duk_is_null_or_undefined(duk, 1) ? NULL : duk_to_string(duk, 1);
|
||||||
|
s32 bank = duk_is_null_or_undefined(duk, 2) ? 0 : duk_to_int(duk, 2);
|
||||||
|
|
||||||
memory->api.sync(memory, tic_bank_all, 0, toCart);
|
if(bank >= 0 && bank < TIC_BANKS)
|
||||||
|
memory->api.sync(memory, section, bank, toCart);
|
||||||
|
else
|
||||||
|
duk_error(duk, DUK_ERR_ERROR, "sync() error, invalid bank");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -747,7 +752,7 @@ static const struct{duk_c_function func; s32 params;} ApiFunc[] =
|
||||||
{duk_textri,14},
|
{duk_textri,14},
|
||||||
{duk_clip, 4},
|
{duk_clip, 4},
|
||||||
{duk_music, 4},
|
{duk_music, 4},
|
||||||
{duk_sync, 1},
|
{duk_sync, 3},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void initDuktape(tic_machine* machine)
|
static void initDuktape(tic_machine* machine)
|
||||||
|
|
21
src/luaapi.c
21
src/luaapi.c
|
@ -748,11 +748,28 @@ static s32 lua_sync(lua_State* lua)
|
||||||
tic_mem* memory = (tic_mem*)getLuaMachine(lua);
|
tic_mem* memory = (tic_mem*)getLuaMachine(lua);
|
||||||
|
|
||||||
bool toCart = true;
|
bool toCart = true;
|
||||||
|
const char* section = NULL;
|
||||||
|
s32 bank = 0;
|
||||||
|
|
||||||
if(lua_gettop(lua) >= 1)
|
if(lua_gettop(lua) >= 1)
|
||||||
|
{
|
||||||
toCart = lua_toboolean(lua, 1);
|
toCart = lua_toboolean(lua, 1);
|
||||||
|
|
||||||
memory->api.sync(memory, tic_bank_all, 0, toCart);
|
if(lua_gettop(lua) >= 2)
|
||||||
|
{
|
||||||
|
section = lua_tostring(lua, 2);
|
||||||
|
|
||||||
|
if(lua_gettop(lua) >= 3)
|
||||||
|
{
|
||||||
|
bank = getLuaNumber(lua, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bank >= 0 && bank < TIC_BANKS)
|
||||||
|
memory->api.sync(memory, section, bank, toCart);
|
||||||
|
else
|
||||||
|
luaL_error(lua, "sync() error, invalid bank");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
27
src/tic.c
27
src/tic.c
|
@ -1323,31 +1323,34 @@ static void initCover(tic_mem* tic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void api_sync(tic_mem* tic, tic_bank_section section, s32 bank, bool toCart)
|
static void api_sync(tic_mem* tic, const char* section, s32 bank, bool toCart)
|
||||||
{
|
{
|
||||||
static const struct {s32 cart; s32 ram; s32 size;} Offsets[TIC_BANK_SECTIONS] =
|
static const struct {const char* name; s32 cart; s32 ram; s32 size;} Sections[] =
|
||||||
{
|
{
|
||||||
{offsetof(tic_cartridge, bank.tiles), offsetof(tic_ram, tiles), sizeof(tic_tiles)},
|
{"tiles", offsetof(tic_cartridge, bank.tiles), offsetof(tic_ram, tiles), sizeof(tic_tiles)},
|
||||||
{offsetof(tic_cartridge, bank.sprites), offsetof(tic_ram, sprites), sizeof(tic_tiles)},
|
{"sprites", offsetof(tic_cartridge, bank.sprites), offsetof(tic_ram, sprites), sizeof(tic_tiles)},
|
||||||
{offsetof(tic_cartridge, bank.map), offsetof(tic_ram, map), sizeof(tic_map)},
|
{"map", offsetof(tic_cartridge, bank.map), offsetof(tic_ram, map), sizeof(tic_map)},
|
||||||
{offsetof(tic_cartridge, bank.sfx), offsetof(tic_ram, sfx), sizeof(tic_sfx)},
|
{"sfx", offsetof(tic_cartridge, bank.sfx), offsetof(tic_ram, sfx), sizeof(tic_sfx)},
|
||||||
{offsetof(tic_cartridge, bank.palette), offsetof(tic_ram, vram.palette), sizeof(tic_palette)},
|
{"music", offsetof(tic_cartridge, bank.music), offsetof(tic_ram, music), sizeof(tic_music)},
|
||||||
|
{"pal", offsetof(tic_cartridge, bank.palette), offsetof(tic_ram, vram.palette), sizeof(tic_palette)},
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(bank >= 0 && bank < TIC_BANKS);
|
assert(bank >= 0 && bank < TIC_BANKS);
|
||||||
|
|
||||||
s32 bankOffset = bank * sizeof(tic_bank);
|
s32 bankOffset = bank * sizeof(tic_bank);
|
||||||
|
|
||||||
for(s32 i = 0; i < TIC_BANK_SECTIONS; i++)
|
for(s32 i = 0; i < COUNT_OF(Sections); i++)
|
||||||
if(section & (1 << i))
|
{
|
||||||
|
if(section == NULL || (section && strcmp(section, Sections[i].name) == 0))
|
||||||
toCart
|
toCart
|
||||||
? memcpy((u8*)&tic->cart + Offsets[i].cart + bankOffset, (u8*)&tic->ram + Offsets[i].ram, Offsets[i].size)
|
? memcpy((u8*)&tic->cart + Sections[i].cart + bankOffset, (u8*)&tic->ram + Sections[i].ram, Sections[i].size)
|
||||||
: memcpy((u8*)&tic->ram + Offsets[i].ram, (u8*)&tic->cart + Offsets[i].cart + bankOffset, Offsets[i].size);
|
: memcpy((u8*)&tic->ram + Sections[i].ram, (u8*)&tic->cart + Sections[i].cart + bankOffset, Sections[i].size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cart2ram(tic_mem* memory)
|
static void cart2ram(tic_mem* memory)
|
||||||
{
|
{
|
||||||
api_sync(memory, tic_bank_all, 0, false);
|
api_sync(memory, NULL, 0, false);
|
||||||
|
|
||||||
initCover(memory);
|
initCover(memory);
|
||||||
}
|
}
|
||||||
|
|
12
src/tic.h
12
src/tic.h
|
@ -108,7 +108,6 @@
|
||||||
#define TIC_CODE_SIZE (0x10000)
|
#define TIC_CODE_SIZE (0x10000)
|
||||||
|
|
||||||
#define TIC_BANKS 8
|
#define TIC_BANKS 8
|
||||||
#define TIC_BANK_SECTIONS 5
|
|
||||||
|
|
||||||
#define SFX_NOTES {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-"}
|
#define SFX_NOTES {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-"}
|
||||||
|
|
||||||
|
@ -327,17 +326,6 @@ typedef struct
|
||||||
tic_tile data[TIC_BANK_SPRITES];
|
tic_tile data[TIC_BANK_SPRITES];
|
||||||
} tic_tiles;
|
} tic_tiles;
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
tic_bank_tiles = 1 << 0,
|
|
||||||
tic_bank_sprites = 1 << 1,
|
|
||||||
tic_bank_map = 1 << 2,
|
|
||||||
tic_bank_sfx = 1 << 3,
|
|
||||||
tic_bank_music = 1 << 4,
|
|
||||||
tic_bank_palette = 1 << 5,
|
|
||||||
tic_bank_all = (1 << (TIC_BANK_SECTIONS+1)) - 1,
|
|
||||||
} tic_bank_section;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
tic_tiles tiles;
|
tic_tiles tiles;
|
||||||
|
|
|
@ -103,7 +103,7 @@ typedef struct
|
||||||
void (*reset) (tic_mem* memory);
|
void (*reset) (tic_mem* memory);
|
||||||
void (*pause) (tic_mem* memory);
|
void (*pause) (tic_mem* memory);
|
||||||
void (*resume) (tic_mem* memory);
|
void (*resume) (tic_mem* memory);
|
||||||
void (*sync) (tic_mem* memory, tic_bank_section section, s32 bank, bool toCart);
|
void (*sync) (tic_mem* memory, const char* section, s32 bank, bool toCart);
|
||||||
u32 (*btnp) (tic_mem* memory, s32 id, s32 hold, s32 period);
|
u32 (*btnp) (tic_mem* memory, s32 id, s32 hold, s32 period);
|
||||||
|
|
||||||
void (*load) (tic_cartridge* rom, s32 cartSize, const u8* buffer, s32 size, bool palette);
|
void (*load) (tic_cartridge* rom, s32 cartSize, const u8* buffer, s32 size, bool palette);
|
||||||
|
|
Loading…
Reference in New Issue