]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/gb/state.c
games/nes: cleanup and resize handling
[plan9front.git] / sys / src / games / gb / state.c
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <draw.h>
5 #include "dat.h"
6 #include "fns.h"
7
8 static int fd;
9
10 static void
11 put8(u8int i)
12 {
13         write(fd, &i, 1);
14 }
15
16 static void
17 put16(u16int i)
18 {
19         put8(i);
20         put8(i >> 8);
21 }
22
23 static void
24 put32(u32int i)
25 {
26         put8(i);
27         put8(i >> 8);
28         put8(i >> 16);
29         put8(i >> 24);
30 }
31
32 static int
33 get8(void)
34 {
35         u8int c;
36         
37         read(fd, &c, 1);
38         return c;
39 }
40
41 static int
42 get16(void)
43 {
44         int i;
45         
46         i = get8();
47         i |= get8() << 8;
48         return i;
49 }
50
51 static int
52 get32(void)
53 {
54         int i;
55         
56         i = get8();
57         i |= get8() << 8;
58         i |= get8() << 16;
59         i |= get8() << 24;
60         return i;
61 }
62
63 void
64 loadstate(char *file)
65 {
66         flushram();
67         fd = open(file, OREAD);
68         if(fd < 0){
69                 message("open: %r");
70                 return;
71         }
72         read(fd, mem, 65536);
73         if(ram != nil)
74                 read(fd, ram, rambanks * 8192);
75         read(fd, R, sizeof R);
76         sp = get16();
77         pc = get16();
78         Fl = get8();
79         halt = get32();
80         IME = get32();
81         clock = get32();
82         ppuclock = get32();
83         divclock = get32();
84         timerclock = get32();
85         timerfreq = get32();
86         timer = get32();
87         rombank = get32();
88         rambank = get32();
89         ramen = get32();
90         battery = get32();
91         ramrom = get32();
92         close(fd);
93 }
94
95 void
96 savestate(char *file)
97 {
98         flushram();
99         fd = create(file, ORDWR, 0666);
100         if(fd < 0){
101                 message("create: %r");
102                 return;
103         }
104         write(fd, mem, 65536);
105         if(ram != nil)
106                 write(fd, ram, rambanks * 8192);
107         write(fd, R, sizeof R);
108         put16(sp);
109         put16(pc);
110         put8(Fl);
111         put32(halt);
112         put32(IME);
113         put32(clock);
114         put32(ppuclock);
115         put32(divclock);
116         put32(timerclock);
117         put32(timerfreq);
118         put32(timer);
119         put32(rombank);
120         put32(rambank);
121         put32(ramen);
122         put32(battery);
123         put32(ramrom);
124         close(fd);
125 }