Mercurial > repos > blastem
changeset 1320:df3d690cb2c3
SAT table register bit 0 is not used in H40 mode. Fixes corrupt sprites in ship crash landing scene in Overdrive 2
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 17 Apr 2017 20:54:33 -0700 |
parents | b6796d63977f |
children | 0849e9356bfe |
files | vdp.c |
diffstat | 1 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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);