-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemorymapper.go
More file actions
101 lines (77 loc) · 1.72 KB
/
Copy pathmemorymapper.go
File metadata and controls
101 lines (77 loc) · 1.72 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package main
import (
"errors"
)
type Regions []Region
type MemoryMapper struct {
Regions Regions
}
type Region struct {
Device IMemory
Start uint16
End uint16
Remap bool
}
func NewMemoryMapper() *MemoryMapper {
return &MemoryMapper{Regions: Regions{}}
}
func (m *MemoryMapper) Map(region Region) Regions {
prevRegions := m.Regions
m.Regions = m.Regions.unshift(region)
return prevRegions
}
func (m *MemoryMapper) FindRegion(address uint16) (Region, error) {
for i := 0; i < len(m.Regions); i++ {
if m.Regions[i].Start <= address && m.Regions[i].End >= address {
return m.Regions[i], nil
}
}
return Region{}, errors.New("there is not region for specified address")
}
func (m *MemoryMapper) Get16(address uint16) uint16 {
region, err := m.FindRegion(address)
if err != nil {
return 0x00
}
retAddr := address
if region.Remap {
retAddr = address - region.Start
}
return region.Device.Get16(retAddr)
}
func (m *MemoryMapper) Get8(address uint16) uint8 {
region, err := m.FindRegion(address)
if err != nil {
return 0x00
}
retAddr := address
if region.Remap {
retAddr = address - region.Start
}
return region.Device.Get8(retAddr)
}
func (m *MemoryMapper) Set16(address, value uint16) {
region, err := m.FindRegion(address)
if err != nil {
return
}
retAddr := address
if region.Remap {
retAddr = address - region.Start
}
region.Device.Set16(retAddr, value)
}
func (m *MemoryMapper) Set8(address uint16, value uint8) {
region, err := m.FindRegion(address)
if err != nil {
return
}
retAddr := address
if region.Remap {
retAddr = address - region.Start
}
region.Device.Set8(retAddr, value)
}
func (r Regions) unshift(val Region) Regions {
return append(Regions{val}, r...)
}