code banks switching

This commit is contained in:
BADIM-PC\Vadim 2017-12-14 14:38:06 +03:00
parent 6e8a478ee9
commit d2daa0a653
3 changed files with 38 additions and 18 deletions

View File

@ -1827,7 +1827,7 @@ static void onStudioEvent(Code* code, StudioEvent event)
} }
} }
void initCode(Code* code, tic_mem* tic) void initCode(Code* code, tic_mem* tic, tic_code* src)
{ {
if(code->outline.items == NULL) if(code->outline.items == NULL)
code->outline.items = (OutlineItem*)SDL_malloc(OUTLINE_ITEMS_SIZE); code->outline.items = (OutlineItem*)SDL_malloc(OUTLINE_ITEMS_SIZE);
@ -1838,10 +1838,10 @@ void initCode(Code* code, tic_mem* tic)
*code = (Code) *code = (Code)
{ {
.tic = tic, .tic = tic,
.data = getBankCode()->data, .data = src->data,
.tick = tick, .tick = tick,
.escape = escape, .escape = escape,
.cursor = {{getBankCode()->data, NULL, 0, 0}, NULL, 0}, .cursor = {{src->data, NULL, 0, 0}, NULL, 0},
.rect = {0, TOOLBAR_SIZE + 1, TIC80_WIDTH, TIC80_HEIGHT - TOOLBAR_SIZE - TIC_FONT_HEIGHT - 1}, .rect = {0, TOOLBAR_SIZE + 1, TIC80_WIDTH, TIC80_HEIGHT - TOOLBAR_SIZE - TIC_FONT_HEIGHT - 1},
.scroll = {0, 0, {0, 0}, false}, .scroll = {0, 0, {0, 0}, false},
.tickCounter = 0, .tickCounter = 0,

View File

@ -105,4 +105,4 @@ struct Code
void(*update)(Code*); void(*update)(Code*);
}; };
void initCode(Code*, tic_mem*); void initCode(Code*, tic_mem*, tic_code* src);

View File

@ -201,7 +201,7 @@ static struct
Start* start; Start* start;
Console* console; Console* console;
Run* run; Run* run;
Code* code; Code* code[TIC_BANKS];
Sprite* sprite; Sprite* sprite;
Map* map; Map* map;
World* world; World* world;
@ -790,7 +790,12 @@ void setStudioEvent(StudioEvent event)
{ {
switch(studio.mode) switch(studio.mode)
{ {
case TIC_CODE_MODE: studio.code->event(studio.code, event); break; case TIC_CODE_MODE:
{
Code* code = studio.code[studio.bank.index.code];
code->event(code, event);
}
break;
case TIC_SPRITE_MODE: studio.sprite->event(studio.sprite, event); break; case TIC_SPRITE_MODE: studio.sprite->event(studio.sprite, event); break;
case TIC_MAP_MODE: studio.map->event(studio.map, event); break; case TIC_MAP_MODE: studio.map->event(studio.map, event); break;
case TIC_SFX_MODE: studio.sfx->event(studio.sfx, event); break; case TIC_SFX_MODE: studio.sfx->event(studio.sfx, event); break;
@ -1079,7 +1084,9 @@ void showDialog(const char** text, s32 rows, DialogCallback callback, void* data
static void initModules() static void initModules()
{ {
initCode(studio.code, studio.tic); for(s32 i = 0; i < TIC_BANKS; i++)
initCode(studio.code[i], studio.tic, &studio.tic->cart.banks[i].code);
initSprite(studio.sprite, studio.tic); initSprite(studio.sprite, studio.tic);
initMap(studio.map, studio.tic); initMap(studio.map, studio.tic);
initWorldMap(); initWorldMap();
@ -1784,9 +1791,11 @@ static bool processShortcuts(SDL_KeyboardEvent* event)
case SDLK_ESCAPE: case SDLK_ESCAPE:
case SDLK_AC_BACK: case SDLK_AC_BACK:
{ {
if(studio.mode == TIC_CODE_MODE && studio.code->mode != TEXT_EDIT_MODE) Code* code = studio.code[studio.bank.index.code];
if(studio.mode == TIC_CODE_MODE && code->mode != TEXT_EDIT_MODE)
{ {
studio.code->escape(studio.code); code->escape(code);
return true; return true;
} }
@ -1920,9 +1929,10 @@ SDL_Event* pollEvent()
#endif #endif
{ {
studio.console->codeLiveReload.reload(studio.console, studio.code->data); Code* code = studio.code[studio.bank.index.code];
if(studio.console->codeLiveReload.active && studio.code->update) studio.console->codeLiveReload.reload(studio.console, code->data);
studio.code->update(studio.code); if(studio.console->codeLiveReload.active && code->update)
code->update(code);
} }
break; break;
} }
@ -2280,7 +2290,12 @@ static void renderStudio()
case TIC_START_MODE: studio.start->tick(studio.start); break; case TIC_START_MODE: studio.start->tick(studio.start); break;
case TIC_CONSOLE_MODE: studio.console->tick(studio.console); break; case TIC_CONSOLE_MODE: studio.console->tick(studio.console); break;
case TIC_RUN_MODE: studio.run->tick(studio.run); break; case TIC_RUN_MODE: studio.run->tick(studio.run); break;
case TIC_CODE_MODE: studio.code->tick(studio.code); break; case TIC_CODE_MODE:
{
Code* code = studio.code[studio.bank.index.code];
code->tick(code);
}
break;
case TIC_SPRITE_MODE: studio.sprite->tick(studio.sprite); break; case TIC_SPRITE_MODE: studio.sprite->tick(studio.sprite); break;
case TIC_MAP_MODE: studio.map->tick(studio.map); break; case TIC_MAP_MODE: studio.map->tick(studio.map); break;
case TIC_WORLD_MODE: studio.world->tick(studio.world); break; case TIC_WORLD_MODE: studio.world->tick(studio.world); break;
@ -2476,8 +2491,9 @@ static void updateSystemFont()
void studioConfigChanged() void studioConfigChanged()
{ {
if(studio.code->update) Code* code = studio.code[studio.bank.index.code];
studio.code->update(studio.code); if(code->update)
code->update(code);
initTouchGamepad(); initTouchGamepad();
updateSystemFont(); updateSystemFont();
@ -2560,10 +2576,12 @@ static void onFSInitialized(FileSystem* fs)
studio.tic = studio.tic80local->memory; studio.tic = studio.tic80local->memory;
{ {
for(s32 i = 0; i < TIC_BANKS; i++)
studio.code[i] = SDL_malloc(sizeof(Code));
studio.start = SDL_malloc(sizeof(Start)); studio.start = SDL_malloc(sizeof(Start));
studio.console = SDL_malloc(sizeof(Console)); studio.console = SDL_malloc(sizeof(Console));
studio.run = SDL_malloc(sizeof(Run)); studio.run = SDL_malloc(sizeof(Run));
studio.code = SDL_malloc(sizeof(Code));
studio.sprite = SDL_malloc(sizeof(Sprite)); studio.sprite = SDL_malloc(sizeof(Sprite));
studio.map = SDL_malloc(sizeof(Map)); studio.map = SDL_malloc(sizeof(Map));
studio.world = SDL_malloc(sizeof(World)); studio.world = SDL_malloc(sizeof(World));
@ -2668,10 +2686,12 @@ s32 main(s32 argc, char **argv)
#endif #endif
{ {
for(s32 i = 0; i < TIC_BANKS; i++)
SDL_free(studio.code[i]);
SDL_free(studio.start); SDL_free(studio.start);
SDL_free(studio.console); SDL_free(studio.console);
SDL_free(studio.run); SDL_free(studio.run);
SDL_free(studio.code);
SDL_free(studio.sprite); SDL_free(studio.sprite);
SDL_free(studio.map); SDL_free(studio.map);
SDL_free(studio.world); SDL_free(studio.world);