Skip to content

Commit fd4f0a8

Browse files
committed
bus: Do cycle advancements AFTER reading/writing, rather than before
Passes a few more mooneye tests.
1 parent 0095da6 commit fd4f0a8

File tree

1 file changed

+61
-57
lines changed

1 file changed

+61
-57
lines changed

src/bus.cpp

+61-57
Original file line numberDiff line numberDiff line change
@@ -23,86 +23,86 @@ void Bus::LoadInitialValues() {
2323
}
2424

2525
u8 Bus::Read8(u16 addr, bool affect_timer) {
26-
if (affect_timer) {
27-
timer.AdvanceCycles(4);
28-
}
29-
30-
switch (addr) {
31-
case 0x0000 ... 0x7FFF:
32-
if (addr < 0x0100 && boot_rom_enabled) {
33-
return bootrom.Read(addr);
34-
}
26+
const u8 value = [&]() -> u8 {
27+
switch (addr) {
28+
case 0x0000 ... 0x7FFF:
29+
if (addr < 0x0100 && boot_rom_enabled) {
30+
return bootrom.Read(addr);
31+
}
3532

3633
#define CART_IS_MBC1() (mbc_type >= 0x01 && mbc_type <= 0x03)
3734
#define CART_IS_MBC3() (mbc_type >= 0x0F && mbc_type <= 0x13)
3835

39-
if (addr >= 0x4000) {
40-
u8 mbc_type = cartridge.GetMBCType();
41-
u16 rom_bank = 0x001;
42-
if (CART_IS_MBC1()) {
43-
rom_bank = ((mbc1_bank2 & 3) << 5) | (mbc1_bank1 & 0x1F);
44-
} else if (CART_IS_MBC3()) {
45-
rom_bank = mbc3_rom_bank;
36+
if (addr >= 0x4000) {
37+
u8 mbc_type = cartridge.GetMBCType();
38+
u16 rom_bank = 0x001;
39+
if (CART_IS_MBC1()) {
40+
rom_bank = ((mbc1_bank2 & 3) << 5) | (mbc1_bank1 & 0x1F);
41+
} else if (CART_IS_MBC3()) {
42+
rom_bank = mbc3_rom_bank;
43+
}
44+
return cartridge.Read((addr & 0x3FFF) + rom_bank * 0x4000);
4645
}
47-
return cartridge.Read((addr & 0x3FFF) + rom_bank * 0x4000);
48-
}
4946

50-
return cartridge.Read(addr);
47+
return cartridge.Read(addr);
5148

52-
case 0x8000 ... 0x9FFF:
53-
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (VRAM)", vram[addr - 0x8000], addr);
54-
return vram[addr - 0x8000];
49+
case 0x8000 ... 0x9FFF:
50+
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (VRAM)", vram[addr - 0x8000], addr);
51+
return vram[addr - 0x8000];
5552

56-
case 0xA000 ... 0xBFFF:
57-
if (!mbc_ram_enabled) {
58-
// LWARN("bus: attempted to read from cartridge RAM while it is disabled (from 0x{:04X})", addr);
59-
return 0xFF;
60-
}
53+
case 0xA000 ... 0xBFFF:
54+
if (!mbc_ram_enabled) {
55+
// LWARN("bus: attempted to read from cartridge RAM while it is disabled (from 0x{:04X})", addr);
56+
return 0xFF;
57+
}
6158

62-
LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (Cartridge RAM)", cartridge_ram[addr - 0xA000], addr);
63-
return cartridge_ram[addr - 0xA000];
59+
LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (Cartridge RAM)", cartridge_ram[addr - 0xA000], addr);
60+
return cartridge_ram[addr - 0xA000];
6461

65-
case 0xC000 ... 0xDFFF:
66-
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (WRAM)", wram[addr - 0xC000], addr);
67-
return wram[addr - 0xC000];
62+
case 0xC000 ... 0xDFFF:
63+
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (WRAM)", wram[addr - 0xC000], addr);
64+
return wram[addr - 0xC000];
6865

69-
case 0xE000 ... 0xFDFF:
70-
// LWARN("bus: reading from echo RAM (0x{:02X} from 0x{:04X})", wram[addr - 0xE000], addr);
71-
return wram[addr - 0xE000];
66+
case 0xE000 ... 0xFDFF:
67+
// LWARN("bus: reading from echo RAM (0x{:02X} from 0x{:04X})", wram[addr - 0xE000], addr);
68+
return wram[addr - 0xE000];
7269

73-
case 0xFE00 ... 0xFE9F:
74-
if (oam_dma.active) {
75-
return 0xFF;
76-
}
70+
case 0xFE00 ... 0xFE9F:
71+
if (oam_dma.active) {
72+
return 0xFF;
73+
}
7774

78-
// LDEBUG("bus: reading 0x{:02X} to 0x{:04X} (OAM / Sprite Attribute Table)", oam[0xFE00], addr);
79-
return oam[addr - 0xFE00];
75+
// LDEBUG("bus: reading 0x{:02X} to 0x{:04X} (OAM / Sprite Attribute Table)", oam[0xFE00], addr);
76+
return oam[addr - 0xFE00];
8077

81-
case 0xFEA0 ... 0xFEFF:
82-
// LWARN("bus: attempted to read from unusable memory (0x{:04X})", addr);
83-
return 0x00;
78+
case 0xFEA0 ... 0xFEFF:
79+
// LWARN("bus: attempted to read from unusable memory (0x{:04X})", addr);
80+
return 0x00;
8481

85-
case 0xFF00 ... 0xFF7F:
86-
return ReadIO(addr & 0xFF);
82+
case 0xFF00 ... 0xFF7F:
83+
return ReadIO(addr & 0xFF);
8784

88-
case 0xFF80 ... 0xFFFE:
89-
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (Zero Page)", hram[addr - 0xFF80], addr);
90-
return hram[addr - 0xFF80];
85+
case 0xFF80 ... 0xFFFE:
86+
// LDEBUG("bus: reading 0x{:02X} from 0x{:04X} (Zero Page)", hram[addr - 0xFF80], addr);
87+
return hram[addr - 0xFF80];
9188

92-
case 0xFFFF:
93-
// Interrupt enable
94-
return ie;
89+
case 0xFFFF:
90+
// Interrupt enable
91+
return ie;
9592

96-
default:
97-
UNREACHABLE();
98-
}
99-
}
93+
default:
94+
UNREACHABLE();
95+
}
96+
}();
10097

101-
void Bus::Write8(u16 addr, u8 value, bool affect_timer) {
10298
if (affect_timer) {
10399
timer.AdvanceCycles(4);
104100
}
105101

102+
return value;
103+
}
104+
105+
void Bus::Write8(u16 addr, u8 value, bool affect_timer) {
106106
switch (addr) {
107107
case 0x0000 ... 0x7FFF:
108108
{
@@ -171,6 +171,10 @@ void Bus::Write8(u16 addr, u8 value, bool affect_timer) {
171171
default:
172172
UNREACHABLE();
173173
}
174+
175+
if (affect_timer) {
176+
timer.AdvanceCycles(4);
177+
}
174178
}
175179

176180
void Bus::WriteMBC(u8 mbc_type, u16 addr, u8 value) {

0 commit comments

Comments
 (0)