-
Notifications
You must be signed in to change notification settings - Fork 0
/
read.go
75 lines (62 loc) · 2.16 KB
/
read.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package mmu
import (
"log"
"github.com/jmontupet/gbcore/internal/pkg/hram"
"github.com/jmontupet/gbcore/internal/pkg/ioports"
"github.com/jmontupet/gbcore/internal/pkg/mmu/memorymap"
"github.com/jmontupet/gbcore/internal/pkg/unusableaddr"
"github.com/jmontupet/gbcore/internal/pkg/wram"
)
func (m *MMU) Read(addr uint16) uint8 {
switch {
////// Cartridge bank 00 + Cartridge bank 01~NN //////
case addr >= memorymap.FixedRomStart && addr <= memorymap.SwitchableRomEnd:
return m.cartridge.Read(addr)
////// VRAM Switchable 0~1 on CGB//////
case addr >= memorymap.VRamStart && addr <= memorymap.VRamEnd:
return m.gpu.Read(addr)
////// Cartridge RAM //////
case addr >= memorymap.ExternalRamStart && addr <= memorymap.ExternalRamEnd:
return m.cartridge.Read(addr)
////// WRAM bank 0 + WRAM bank 1 ( ~ 7 on CGB ) //////
case addr >= wram.WRamStart && addr <= wram.WRamEnd:
return m.wram.Read(addr)
////// Mirrored WRAM 0 & N //////
case addr >= wram.MirrorWramStart && addr <= wram.MirrorWramEnd:
return m.mirrorWram.Read(addr)
////// OAM //////
case addr >= memorymap.OAMStart && addr <= memorymap.OAMEnd:
return m.gpu.Read(addr)
////// NOT USABLE BUT USED //////
case addr >= unusableaddr.AddrStart && addr <= unusableaddr.AddrEnd:
return m.unusableAddr.Read(addr)
////// IO Registers //////
// Delegate control to Joypad
case addr == 0xFF00:
return m.joypad.Read(addr)
// Delegate control to oamDMA for dma tranfer
case addr == 0xFF46:
return m.oamDMA.Read(addr)
// Delegate control to vramDMA for dma tranfer
case addr == 0xFF51, addr == 0xFF52,
addr == 0xFF53, addr == 0xFF54, addr == 0xFF55:
return m.vramDMA.Read(addr)
// Delegate control to gpu for colors palettes
case addr == 0xFF68,
addr == 0xFF69,
addr == 0xFF6A,
addr == 0xFF6B:
return m.gpu.Read(addr)
case addr >= ioports.AddrStart && addr <= ioports.AddrEnd:
return m.io.Read(addr)
////// HRAM //////
case addr >= hram.AddrStart && addr <= hram.AddrEnd:
return m.hram.Read(addr)
////// Interrupts Enable (IE) //////
case addr == memorymap.Interrupts:
return m.interrupt.Read(addr)
default:
log.Fatalf("MEMORY UNREACHABLE : 0x%04X", addr)
return 0x00
}
}