added palette per bank

This commit is contained in:
BADIM-PC\Vadim
2018-02-27 14:55:25 +03:00
parent 96e2c19a5f
commit 4b46414ae1
9 changed files with 68 additions and 71 deletions
+15 -20
View File
@@ -150,7 +150,7 @@ static void runNoise(blip_buffer_t* blip, tic_sound_register* reg, tic_sound_reg
static void resetPalette(tic_mem* memory)
{
static const u8 DefaultMapping[] = {16, 50, 84, 118, 152, 186, 220, 254};
memcpy(memory->ram.vram.palette.data, memory->cart.palette.data, sizeof(tic_palette));
memcpy(memory->ram.vram.palette.data, memory->cart.bank0.palette.data, sizeof(tic_palette));
memcpy(memory->ram.vram.mapping, DefaultMapping, sizeof DefaultMapping);
}
@@ -1449,13 +1449,13 @@ static void initCover(tic_mem* tic)
{
const gif_color* c = &image->palette[image->buffer[i]];
tic_rgb rgb = { c->r, c->g, c->b };
u8 color = tic_tool_find_closest_color(tic->cart.palette.colors, &rgb);
u8 color = tic_tool_find_closest_color(tic->cart.bank0.palette.colors, &rgb);
tic_tool_poke4(tic->ram.vram.screen.data, i, color);
}
}
gif_close(image);
}
}
}
}
@@ -1465,14 +1465,15 @@ static void api_sync(tic_mem* tic, u32 mask, s32 bank, bool toCart)
static const struct {s32 bank; s32 ram; s32 size;} Sections[] =
{
{offsetof(tic_bank, tiles), offsetof(tic_ram, tiles), sizeof(tic_tiles) },
{offsetof(tic_bank, sprites), offsetof(tic_ram, sprites), sizeof(tic_tiles) },
{offsetof(tic_bank, map), offsetof(tic_ram, map), sizeof(tic_map) },
{offsetof(tic_bank, sfx), offsetof(tic_ram, sfx), sizeof(tic_sfx) },
{offsetof(tic_bank, music), offsetof(tic_ram, music), sizeof(tic_music) },
{offsetof(tic_bank, tiles), offsetof(tic_ram, tiles), sizeof(tic_tiles) },
{offsetof(tic_bank, sprites), offsetof(tic_ram, sprites), sizeof(tic_tiles) },
{offsetof(tic_bank, map), offsetof(tic_ram, map), sizeof(tic_map) },
{offsetof(tic_bank, sfx), offsetof(tic_ram, sfx), sizeof(tic_sfx) },
{offsetof(tic_bank, music), offsetof(tic_ram, music), sizeof(tic_music) },
{offsetof(tic_bank, palette), offsetof(tic_ram, vram.palette), sizeof(tic_palette) },
};
enum{Count = COUNT_OF(Sections), Mask = (1 << (Count+1)) - 1, PaletteMask = 1 << Count};
enum{Count = COUNT_OF(Sections), Mask = (1 << Count) - 1};
if(mask == 0) mask = Mask;
@@ -1488,11 +1489,6 @@ static void api_sync(tic_mem* tic, u32 mask, s32 bank, bool toCart)
: memcpy((u8*)&tic->ram + Sections[i].ram, (u8*)&tic->cart.banks[bank] + Sections[i].bank, Sections[i].size);
}
if(mask & PaletteMask)
toCart
? memcpy(&tic->cart.palette, &tic->ram.vram.palette, sizeof(tic_palette))
: memcpy(&tic->ram.vram.palette, &tic->cart.palette, sizeof(tic_palette));
machine->state.synced |= mask;
}
@@ -1778,7 +1774,9 @@ static void api_load(tic_cartridge* cart, const u8* buffer, s32 size, bool palet
if(palette)
{
static const u8 DB16[] = {0x14, 0x0c, 0x1c, 0x44, 0x24, 0x34, 0x30, 0x34, 0x6d, 0x4e, 0x4a, 0x4e, 0x85, 0x4c, 0x30, 0x34, 0x65, 0x24, 0xd0, 0x46, 0x48, 0x75, 0x71, 0x61, 0x59, 0x7d, 0xce, 0xd2, 0x7d, 0x2c, 0x85, 0x95, 0xa1, 0x6d, 0xaa, 0x2c, 0xd2, 0xaa, 0x99, 0x6d, 0xc2, 0xca, 0xda, 0xd4, 0x5e, 0xde, 0xee, 0xd6};
memcpy(cart->palette.data, DB16, sizeof(tic_palette));
for(s32 i = 0; i < TIC_BANKS; i++)
memcpy(cart->banks[i].palette.data, DB16, sizeof(tic_palette));
}
#define LOAD_CHUNK(to) memcpy(&to, buffer, min(sizeof(to), chunk.size))
@@ -1799,10 +1797,7 @@ static void api_load(tic_cartridge* cart, const u8* buffer, s32 size, bool palet
case CHUNK_WAVEFORM: LOAD_CHUNK(cart->banks[chunk.bank].sfx.waveform); break;
case CHUNK_MUSIC: LOAD_CHUNK(cart->banks[chunk.bank].music.tracks); break;
case CHUNK_PATTERNS: LOAD_CHUNK(cart->banks[chunk.bank].music.patterns); break;
case CHUNK_PALETTE:
if(palette)
LOAD_CHUNK(cart->palette);
break;
case CHUNK_PALETTE: LOAD_CHUNK(cart->banks[chunk.bank].palette); break;
case CHUNK_COVER:
LOAD_CHUNK(cart->cover.data);
cart->cover.size = chunk.size;
@@ -1870,9 +1865,9 @@ static s32 api_save(const tic_cartridge* cart, u8* buffer)
buffer = SAVE_CHUNK(CHUNK_WAVEFORM, cart->banks[i].sfx.waveform, i);
buffer = SAVE_CHUNK(CHUNK_PATTERNS, cart->banks[i].music.patterns, i);
buffer = SAVE_CHUNK(CHUNK_MUSIC, cart->banks[i].music.tracks, i);
buffer = SAVE_CHUNK(CHUNK_PALETTE, cart->banks[i].palette, i);
}
buffer = SAVE_CHUNK(CHUNK_PALETTE, cart->palette, 0);
buffer = saveFixedChunk(buffer, CHUNK_COVER, cart->cover.data, cart->cover.size, 0);
#undef SAVE_CHUNK