summaryrefslogtreecommitdiff
path: root/ppu_registers.c
diff options
context:
space:
mode:
authorPeter Fors <peter.fors@mindkiller.com>2025-05-03 01:00:10 +0200
committerPeter Fors <peter.fors@mindkiller.com>2025-05-03 01:00:10 +0200
commit8ed5a368077388c676a4ef27cca9f3a58d91e484 (patch)
tree7e96f35ac933fe97a69c2a8f66f8c22f7a9beb6a /ppu_registers.c
parent5808f00555c48e1cc1cc110af6a5cd73ddf13010 (diff)
cleanup and rewrite of memory_read()
Diffstat (limited to 'ppu_registers.c')
-rw-r--r--ppu_registers.c151
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;
}