/
save.go
101 lines (90 loc) · 2.12 KB
/
save.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
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 emulator
import (
"os"
"path/filepath"
"github.com/pokemium/worldwide/pkg/gbc/cart"
)
// GameBoy save data is SRAM core dump
func (e *Emulator) writeSav() {
savname := filepath.Join(e.RomDir, e.GBC.Cartridge.Title+".sav")
savfile, err := os.Create(savname)
if err != nil {
return
}
defer savfile.Close()
var buffer []byte
switch e.GBC.Cartridge.RAMSize {
case cart.RAM_UNUSED:
buffer = make([]byte, 0x800)
for index := 0; index < 0x800; index++ {
buffer[index] = e.GBC.RAM.Buffer[0][index]
}
case cart.RAM_8KB:
buffer = make([]byte, 0x2000*1)
for index := 0; index < 0x2000; index++ {
buffer[index] = e.GBC.RAM.Buffer[0][index]
}
case cart.RAM_32KB:
buffer = make([]byte, 0x2000*4)
for i := 0; i < 4; i++ {
for j := 0; j < 0x2000; j++ {
index := i*0x2000 + j
buffer[index] = e.GBC.RAM.Buffer[i][j]
}
}
case cart.RAM_64KB:
buffer = make([]byte, 0x2000*8)
for i := 0; i < 8; i++ {
for j := 0; j < 0x2000; j++ {
index := i*0x2000 + j
buffer[index] = e.GBC.RAM.Buffer[i][j]
}
}
}
if e.GBC.Cartridge.HasRTC() {
rtcData := e.GBC.RTC.Dump()
for i := 0; i < 48; i++ {
buffer = append(buffer, rtcData[i])
}
}
_, err = savfile.Write(buffer)
if err != nil {
return
}
}
func (e *Emulator) loadSav() {
savname := filepath.Join(e.RomDir, e.GBC.Cartridge.Title+".sav")
savdata, err := os.ReadFile(savname)
if err != nil {
return
}
switch e.GBC.Cartridge.RAMSize {
case cart.RAM_UNUSED:
for index := 0; index < 0x800; index++ {
e.GBC.RAM.Buffer[0][index] = savdata[index]
}
case cart.RAM_8KB:
for index := 0; index < 0x2000; index++ {
e.GBC.RAM.Buffer[0][index] = savdata[index]
}
case cart.RAM_32KB:
for i := 0; i < 4; i++ {
for j := 0; j < 0x2000; j++ {
index := i*0x2000 + j
e.GBC.RAM.Buffer[i][j] = savdata[index]
}
}
case cart.RAM_64KB:
for i := 0; i < 8; i++ {
for j := 0; j < 0x2000; j++ {
index := i*0x2000 + j
e.GBC.RAM.Buffer[i][j] = savdata[index]
}
}
}
if e.GBC.Cartridge.HasRTC() {
start := (len(savdata) / 0x1000) * 0x1000
rtcData := savdata[start : start+48]
e.GBC.RTC.Sync(rtcData)
}
}