izapple2/apple2/persistance.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)
}
}