diff --git a/src/jsapi.c b/src/jsapi.c index 768c4dc..879689c 100644 --- a/src/jsapi.c +++ b/src/jsapi.c @@ -828,3 +828,8 @@ void callJavascriptScanline(tic_mem* memory, s32 row) } else duk_pop(duk); } + +void callJavascriptOverlap(tic_mem* memory) +{ + +} \ No newline at end of file diff --git a/src/luaapi.c b/src/luaapi.c index 2dd9168..eb7f77a 100644 --- a/src/luaapi.c +++ b/src/luaapi.c @@ -1245,4 +1245,9 @@ void callLuaScanline(tic_mem* memory, s32 row) } else lua_pop(lua, 1); } -} \ No newline at end of file +} + +void callLuaOverlap(tic_mem* memory) +{ + +} diff --git a/src/machine.h b/src/machine.h index 39d7f4f..bf08dc3 100644 --- a/src/machine.h +++ b/src/machine.h @@ -46,8 +46,6 @@ typedef struct s32 duration; } Channel; -typedef void(ScanlineFunc)(tic_mem* memory, s32 row); - typedef struct { s32 l; @@ -84,7 +82,8 @@ typedef struct Channel channels[TIC_SOUND_CHANNELS]; } music; - ScanlineFunc* scanline; + tic_scanline scanline; + tic_overlap overlap; bool initialized; } MachineState; @@ -134,3 +133,6 @@ void callJavascriptTick(tic_machine* machine); void callLuaScanline(tic_mem* memory, s32 row); void callJavascriptScanline(tic_mem* memory, s32 row); + +void callLuaOverlap(tic_mem* memory); +void callJavascriptOverlap(tic_mem* memory); diff --git a/src/studio.c b/src/studio.c index 456e410..6c41ce3 100644 --- a/src/studio.c +++ b/src/studio.c @@ -1452,7 +1452,7 @@ static void setCoverImage() if(pixels) { - tic->api.blit(tic, pixels, tic->api.scanline); + tic->api.blit(tic, pixels, tic->api.scanline, tic->api.overlap); u32* buffer = SDL_malloc(TIC80_WIDTH * TIC80_HEIGHT * sizeof(u32)); @@ -1932,11 +1932,13 @@ static void blitTexture() SDL_LockTexture(studio.texture, NULL, &pixels, &pitch); tic_scanline scanline = NULL; + tic_overlap overlap = NULL; switch(studio.mode) { case TIC_RUN_MODE: scanline = tic->api.scanline; + overlap = tic->api.overlap; break; case TIC_SPRITE_MODE: scanline = studio.sprite.scanline; @@ -1948,7 +1950,7 @@ static void blitTexture() break; } - tic->api.blit(tic, pixels, scanline); + tic->api.blit(tic, pixels, scanline, overlap); recordFrame(pixels); diff --git a/src/tic.c b/src/tic.c index c66f29d..d57afca 100644 --- a/src/tic.c +++ b/src/tic.c @@ -430,6 +430,7 @@ static void api_reset(tic_mem* memory) tic_machine* machine = (tic_machine*)memory; machine->state.initialized = false; machine->state.scanline = NULL; + machine->state.overlap = NULL; updateSaveid(memory); } @@ -1428,6 +1429,7 @@ static void api_tick(tic_mem* memory, tic_tick_data* data) if(done) { machine->state.scanline = memory->script == tic_script_js ? callJavascriptScanline : callLuaScanline; + machine->state.overlap = memory->script == tic_script_js ? callJavascriptOverlap : callLuaOverlap; machine->state.initialized = true; } else return; @@ -1447,6 +1449,14 @@ static void api_scanline(tic_mem* memory, s32 row) machine->state.scanline(memory, row); } +static void api_overlap(tic_mem* memory) +{ + tic_machine* machine = (tic_machine*)memory; + + if(machine->state.initialized) + machine->state.overlap(memory); +} + static double api_time(tic_mem* memory) { tic_machine* machine = (tic_machine*)memory; @@ -1645,7 +1655,7 @@ static u32* paletteBlit(tic_mem* tic) return pal; } -static void api_blit(tic_mem* tic, u32* out, tic_scanline scanline) +static void api_blit(tic_mem* tic, u32* out, tic_scanline scanline, tic_overlap overlap) { const u32* pal = paletteBlit(tic); @@ -1721,6 +1731,11 @@ static void api_blit(tic_mem* tic, u32* out, tic_scanline scanline) } memset4(&out[(TIC80_FULLHEIGHT-Bottom) * TIC80_FULLWIDTH], pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH*Bottom); + + if(overlap) + { + overlap(tic); + } } static void initApi(tic_api* api) @@ -1757,6 +1772,7 @@ static void initApi(tic_api* api) INIT_API(time); INIT_API(tick); INIT_API(scanline); + INIT_API(overlap); INIT_API(reset); INIT_API(pause); INIT_API(resume); diff --git a/src/tic80.c b/src/tic80.c index 11c1799..2f0fde1 100644 --- a/src/tic80.c +++ b/src/tic80.c @@ -121,7 +121,7 @@ TIC80_API void tic80_tick(tic80* tic, tic80_input input) tic80->memory->api.tick(tic80->memory, &tic80->tickData); tic80->memory->api.tick_end(tic80->memory); - tic80->memory->api.blit(tic80->memory, tic->screen, tic80->memory->api.scanline); + tic80->memory->api.blit(tic80->memory, tic->screen, tic80->memory->api.scanline, tic80->memory->api.overlap); TickCounter++; } diff --git a/src/ticapi.h b/src/ticapi.h index 674885c..1e98282 100644 --- a/src/ticapi.h +++ b/src/ticapi.h @@ -63,6 +63,7 @@ typedef struct typedef struct tic_mem tic_mem; typedef void(*tic_scanline)(tic_mem* memory, s32 row); +typedef void(*tic_overlap)(tic_mem* memory); typedef struct { @@ -96,6 +97,7 @@ typedef struct double (*time) (tic_mem* memory); void (*tick) (tic_mem* memory, tic_tick_data* data); void (*scanline) (tic_mem* memory, s32 row); + void (*overlap) (tic_mem* memory); void (*reset) (tic_mem* memory); void (*pause) (tic_mem* memory); void (*resume) (tic_mem* memory); @@ -107,7 +109,7 @@ typedef struct void (*tick_start) (tic_mem* memory, const tic_sound* src); void (*tick_end) (tic_mem* memory); - void (*blit) (tic_mem* tic, u32* out, tic_scanline scanline); + void (*blit) (tic_mem* tic, u32* out, tic_scanline scanline, tic_overlap overlap); tic_script_lang (*get_script)(tic_mem* memory); } tic_api;