@@ -23,86 +23,86 @@ void Bus::LoadInitialValues() {
23
23
}
24
24
25
25
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
+ }
35
32
36
33
#define CART_IS_MBC1 () (mbc_type >= 0x01 && mbc_type <= 0x03 )
37
34
#define CART_IS_MBC3 () (mbc_type >= 0x0F && mbc_type <= 0x13 )
38
35
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 );
46
45
}
47
- return cartridge.Read ((addr & 0x3FFF ) + rom_bank * 0x4000 );
48
- }
49
46
50
- return cartridge.Read (addr);
47
+ return cartridge.Read (addr);
51
48
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 ];
55
52
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
+ }
61
58
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 ];
64
61
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 ];
68
65
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 ];
72
69
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
+ }
77
74
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 ];
80
77
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 ;
84
81
85
- case 0xFF00 ... 0xFF7F :
86
- return ReadIO (addr & 0xFF );
82
+ case 0xFF00 ... 0xFF7F :
83
+ return ReadIO (addr & 0xFF );
87
84
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 ];
91
88
92
- case 0xFFFF :
93
- // Interrupt enable
94
- return ie;
89
+ case 0xFFFF :
90
+ // Interrupt enable
91
+ return ie;
95
92
96
- default :
97
- UNREACHABLE ();
98
- }
99
- }
93
+ default :
94
+ UNREACHABLE ();
95
+ }
96
+ }();
100
97
101
- void Bus::Write8 (u16 addr, u8 value, bool affect_timer) {
102
98
if (affect_timer) {
103
99
timer.AdvanceCycles (4 );
104
100
}
105
101
102
+ return value;
103
+ }
104
+
105
+ void Bus::Write8 (u16 addr, u8 value, bool affect_timer) {
106
106
switch (addr) {
107
107
case 0x0000 ... 0x7FFF :
108
108
{
@@ -171,6 +171,10 @@ void Bus::Write8(u16 addr, u8 value, bool affect_timer) {
171
171
default :
172
172
UNREACHABLE ();
173
173
}
174
+
175
+ if (affect_timer) {
176
+ timer.AdvanceCycles (4 );
177
+ }
174
178
}
175
179
176
180
void Bus::WriteMBC (u8 mbc_type, u16 addr, u8 value) {
0 commit comments