# HG changeset patch # User Michael Pavone # Date 1492487673 25200 # Node ID df3d690cb2c334622887017bb2990868b4577c41 # Parent b6796d63977f895c22788a9d3c072c8cf387f5ea SAT table register bit 0 is not used in H40 mode. Fixes corrupt sprites in ship crash landing scene in Overdrive 2 diff -r b6796d63977f -r df3d690cb2c3 vdp.c --- a/vdp.c Sun Apr 16 18:43:34 2017 -0700 +++ b/vdp.c Mon Apr 17 20:54:33 2017 -0700 @@ -319,10 +319,22 @@ } } +static uint32_t mode5_sat_address(vdp_context *context) +{ + uint32_t addr = context->regs[REG_SAT] << 9; + if (!(context->regs[REG_MODE_2] & BIT_128K_VRAM)) { + addr &= 0xFFFF; + } + if (context->regs[REG_MODE_4] & BIT_H40) { + addr &= 0x1FC00; + } + return addr; +} + void vdp_print_sprite_table(vdp_context * context) { if (context->regs[REG_MODE_2] & BIT_MODE_5) { - uint16_t sat_address = (context->regs[REG_SAT] & 0x7F) << 9; + uint16_t sat_address = mode5_sat_address(context); uint16_t current_index = 0; uint8_t count = 0; do { @@ -438,7 +450,7 @@ context->regs[REG_SCROLL_A], (context->regs[REG_SCROLL_A] & 0x38) << 10, context->regs[REG_WINDOW], (context->regs[REG_WINDOW] & (context->regs[REG_MODE_4] & BIT_H40 ? 0x3C : 0x3E)) << 10, context->regs[REG_SCROLL_B], (context->regs[REG_SCROLL_B] & 0x7) << 13, - context->regs[REG_SAT], (context->regs[REG_SAT] & (context->regs[REG_MODE_4] & BIT_H40 ? 0x7E : 0x7F)) << 9, + context->regs[REG_SAT], mode5_sat_address(context), context->regs[REG_HSCROLL], (context->regs[REG_HSCROLL] & 0x3F) << 10); } else { printf("\n**Table Group**\n" @@ -630,7 +642,7 @@ } height *= 2; } - uint16_t att_addr = ((context->regs[REG_SAT] & 0x7F) << 9) + context->sprite_info_list[context->cur_slot].index * 8 + 4; + uint16_t att_addr = mode5_sat_address(context) + context->sprite_info_list[context->cur_slot].index * 8 + 4; uint16_t tileinfo = (context->vdpmem[att_addr] << 8) | context->vdpmem[att_addr+1]; uint8_t pal_priority = (tileinfo >> 9) & 0x70; uint8_t row; @@ -760,7 +772,7 @@ void write_vram_word(vdp_context *context, uint32_t address, uint8_t value) { if (!(address & 4)) { - uint32_t sat_address = (context->regs[REG_SAT] & 0xFF) << 9; + uint32_t sat_address = mode5_sat_address(context); if(address >= sat_address && address < (sat_address + SAT_CACHE_SIZE*2)) { uint16_t cache_address = address - sat_address; cache_address = (cache_address & 3) | (cache_address >> 1 & 0x1FC); @@ -778,7 +790,7 @@ { if (context->regs[REG_MODE_2] & BIT_MODE_5) { if (!(address & 4)) { - uint32_t sat_address = (context->regs[REG_SAT] & 0x7F) << 9; + uint32_t sat_address = mode5_sat_address(context); if(address >= sat_address && address < (sat_address + SAT_CACHE_SIZE*2)) { uint16_t cache_address = address - sat_address; cache_address = (cache_address & 3) | (cache_address >> 1 & 0x1FC);