67 lines
1.1 KiB
Go
67 lines
1.1 KiB
Go
package apple2
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/binary"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
type persistent interface {
|
|
save(w io.Writer)
|
|
load(r io.Reader)
|
|
}
|
|
|
|
type persistance struct {
|
|
a *Apple2
|
|
items []persistent
|
|
}
|
|
|
|
func newPersistance(a *Apple2) *persistance {
|
|
var p persistance
|
|
p.a = a
|
|
return &p
|
|
}
|
|
|
|
func (p *persistance) register(i persistent) {
|
|
p.items = append(p.items, i)
|
|
}
|
|
|
|
func (p *persistance) save(filename string) {
|
|
f, err := os.Create(filename)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer f.Close()
|
|
w := bufio.NewWriter(f)
|
|
defer w.Flush()
|
|
|
|
binary.Write(w, binary.BigEndian, p.a.isColor)
|
|
binary.Write(w, binary.BigEndian, p.a.fastMode)
|
|
binary.Write(w, binary.BigEndian, p.a.fastRequestsCounter)
|
|
p.a.cpu.Save(w)
|
|
|
|
for _, v := range p.items {
|
|
v.save(w)
|
|
}
|
|
}
|
|
|
|
func (p *persistance) load(filename string) {
|
|
f, err := os.Open(filename)
|
|
if err != nil {
|
|
// Ignore error if can't load the file
|
|
return
|
|
}
|
|
defer f.Close()
|
|
r := bufio.NewReader(f)
|
|
|
|
binary.Read(r, binary.BigEndian, &p.a.isColor)
|
|
binary.Read(r, binary.BigEndian, &p.a.fastMode)
|
|
binary.Read(r, binary.BigEndian, &p.a.fastRequestsCounter)
|
|
p.a.cpu.Load(r)
|
|
|
|
for _, v := range p.items {
|
|
v.load(r)
|
|
}
|
|
}
|