/
bus.go
77 lines (62 loc) · 1.28 KB
/
bus.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
76
77
package bus
import (
"fmt"
)
type Bus struct {
maps []memoryMap
}
var _ ReadableWriteable = new(Bus)
type memoryMap struct {
from uint16
to uint16
rw ReadableWriteable
}
type ReadableWriteable interface {
Readable
Writeable
}
type Readable interface {
Read(addr uint16) uint8
}
type Writeable interface {
Write(addr uint16, data uint8)
}
func (b *Bus) Connect(addrFrom, addrTo uint16, rw ReadableWriteable) {
b.maps = append(b.maps, memoryMap{
from: addrFrom,
to: addrTo,
rw: rw,
})
}
func (b *Bus) Read(addr uint16) uint8 {
for _, m := range b.maps {
if m.from <= addr && addr <= m.to {
return m.rw.Read(addr)
}
}
//log.Printf("unmapped memory range, zero read from the Bus (addr: %#04x)\n", addr)
return 0
}
func (b *Bus) Write(addr uint16, data uint8) {
for _, m := range b.maps {
if m.from <= addr && addr <= m.to {
m.rw.Write(addr, data)
return
}
}
//log.Printf("unmapped memory range, nothing written to the Bus (addr: %#04x, data: %#02x)\n", addr, data)
}
func (b *Bus) Print(from, to uint16) {
for offset := from; offset <= to; offset++ {
if offset%16 == 0 {
fmt.Printf("%04X: ", offset)
}
fmt.Printf("%02X ", b.Read(offset))
if offset%16 == 15 {
fmt.Println()
}
if offset == 0xFFFF {
break // safety exit
}
}
}