diff options
| author | Peter Fors <peter.fors@mindkiller.com> | 2025-05-03 01:00:10 +0200 |
|---|---|---|
| committer | Peter Fors <peter.fors@mindkiller.com> | 2025-05-03 01:00:10 +0200 |
| commit | 8ed5a368077388c676a4ef27cca9f3a58d91e484 (patch) | |
| tree | 7e96f35ac933fe97a69c2a8f66f8c22f7a9beb6a /ppu_registers.c | |
| parent | 5808f00555c48e1cc1cc110af6a5cd73ddf13010 (diff) | |
cleanup and rewrite of memory_read()
Diffstat (limited to 'ppu_registers.c')
| -rw-r--r-- | ppu_registers.c | 151 |
1 files changed, 29 insertions, 122 deletions
diff --git a/ppu_registers.c b/ppu_registers.c index b426f17..f6bd515 100644 --- a/ppu_registers.c +++ b/ppu_registers.c @@ -4,22 +4,26 @@ static inline void ppu_write(struct nes_state *state, uint32_t offset, uint8_t v uint32_t reg = offset & 0x7; - if(reg == 0) { - ppu->reg_ctrl = value; - ppu->temp_addr = (ppu->temp_addr & 0xf3ff) | ((value & 0x03) << 10); - // ppu->open_bus = value; + if(LIKELY(reg == 4)) { + ppu->oam[ppu->oam_addr++] = value; + ppu->open_bus = value; + return; } else if(reg == 1) { ppu->reg_mask = value; - // ppu->open_bus = value; + ppu->open_bus = value; + return; + + } else if(reg == 0) { + ppu->reg_ctrl = value; + ppu->temp_addr = (ppu->temp_addr & 0xf3ff) | ((value & 0x03) << 10); + ppu->open_bus = value; + return; } else if(reg == 3) { ppu->oam_addr = value; - // ppu->open_bus = value; - - } else if(reg == 4) { - ppu->oam[ppu->oam_addr++] = value; - // ppu->open_bus = value; + ppu->open_bus = value; + return; } else if(reg == 5) { if(ppu->write_latch == 0) { @@ -30,7 +34,8 @@ static inline void ppu_write(struct nes_state *state, uint32_t offset, uint8_t v ppu->temp_addr = (ppu->temp_addr & ~0x73e0) | ((value & 0x07) << 12) | ((value & 0xf8) << 2); ppu->write_latch = 0; } - // ppu->open_bus = value; + ppu->open_bus = value; + return; } else if(reg == 6) { if(ppu->write_latch == 0) { @@ -41,11 +46,12 @@ static inline void ppu_write(struct nes_state *state, uint32_t offset, uint8_t v ppu->vram_addr = ppu->temp_addr; ppu->write_latch = 0; } - // ppu->open_bus = value; + ppu->open_bus = value; + return; } else if(reg == 7) { uint32_t addr = ppu->vram_addr; - if(LIKELY(addr < 0x2000)) { + if(addr < 0x2000) { state->mapper.chr_write(state, addr, value); } else if(LIKELY(addr < 0x3f00)) { @@ -59,78 +65,9 @@ static inline void ppu_write(struct nes_state *state, uint32_t offset, uint8_t v ppu->palette[pal_addr] = value; } ppu->vram_addr += (ppu->reg_ctrl & 0x04) ? 32 : 1; - // ppu->open_bus = value; + ppu->open_bus = value; + return; } - - ppu->open_bus = value; - -#if 0 - switch(offset & 7) { - case 0: { // 2000 - ppu->reg_ctrl = value; - ppu->temp_addr = (ppu->temp_addr & 0xf3ff) | ((value & 0x03) << 10); - ppu->open_bus = value; - } break; - - case 1: { // 2001 - ppu->reg_mask = value; - ppu->open_bus = value; - } break; - - case 3: { // 2003 - ppu->oam_addr = value; - ppu->open_bus = value; - } break; - - case 4: { // 2004 - ppu->oam[ppu->oam_addr++] = value; - ppu->open_bus = value; - } break; - - case 5: { // 2005 - if(ppu->write_latch == 0) { - ppu->fine_x = value & 0x07; - ppu->temp_addr = (ppu->temp_addr & ~0x001f) | (value >> 3); - ppu->write_latch = 1; - } else { - ppu->temp_addr = (ppu->temp_addr & ~0x73e0) | ((value & 0x07) << 12) | ((value & 0xf8) << 2); - ppu->write_latch = 0; - } - ppu->open_bus = value; - } break; - - case 6: { // 2006 - if(ppu->write_latch == 0) { - ppu->temp_addr = (ppu->temp_addr & 0x00ff) | ((value & 0x3f) << 8); - ppu->write_latch = 1; - } else { - ppu->temp_addr = (ppu->temp_addr & 0xff00) | value; - ppu->vram_addr = ppu->temp_addr; - ppu->write_latch = 0; - } - ppu->open_bus = value; - } break; - - case 7: { // 2007 - uint32_t addr = ppu->vram_addr; - if(LIKELY(addr < 0x2000)) { - state->mapper.chr_write(state, addr, value); - - } else if(LIKELY(addr < 0x3f00)) { - state->mapper.ciram_write(state, addr, value); - - } else if(addr < 0x4000) { - uint32_t pal_addr = addr & 0x1f; - if((pal_addr & 3) == 0) { - pal_addr &= ~0x10; - } - ppu->palette[pal_addr] = value; - } - ppu->vram_addr += (ppu->reg_ctrl & 0x04) ? 32 : 1; - ppu->open_bus = value; - } break; - } -#endif } __attribute__((always_inline, hot)) @@ -140,13 +77,17 @@ static inline uint8_t ppu_read(struct nes_state *state, uint32_t offset) { uint32_t reg = offset & 0x7; - if(reg == 2) { + if(LIKELY(reg == 2)) { result = ppu->reg_status; ppu->reg_status &= ~0x80; ppu->write_latch = 0; + ppu->open_bus = result; + return result; - } else if(reg == 4) { + } else if(LIKELY(reg == 4)) { result = ppu->oam[ppu->oam_addr]; + ppu->open_bus = result; + return result; } else if(reg == 7) { uint32_t addr = ppu->vram_addr; @@ -168,45 +109,11 @@ static inline uint8_t ppu_read(struct nes_state *state, uint32_t offset) { } ppu->vram_addr += (ppu->reg_ctrl & 0x04) ? 32 : 1; - } - -#if 0 - switch(offset & 7) { - case 2: { // 2002 - result = ppu->reg_status; - ppu->reg_status &= ~0x80; - ppu->write_latch = 0; - } break; - - case 4: { // 2004 - result = ppu->oam[ppu->oam_addr]; - } break; - - case 7: { // 2007 - uint32_t addr = ppu->vram_addr; - - if(LIKELY(addr < 0x2000)) { - result = ppu->vram_read_buffer; - ppu->vram_read_buffer = state->mapper.chr_read(state, addr); - - } else if(LIKELY(addr < 0x3f00)) { - result = ppu->vram_read_buffer; - ppu->vram_read_buffer = state->mapper.ciram_read(state, addr); - - } else if(addr < 0x4000) { - uint32_t pal_addr = addr & 0x1f; - if((pal_addr & 0x13) == 0x10) { - pal_addr &= ~0x10; - } - result = ppu->palette[pal_addr]; - } + ppu->open_bus = result; + return result; - ppu->vram_addr += (ppu->reg_ctrl & 0x04) ? 32 : 1; - } break; } -# endif - ppu->open_bus = result; return result; } |
