]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/nes/state.c
games/nes: it's too late to write code
[plan9front.git] / sys / src / games / nes / 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 void
11 put8(u8int i)
12 {
13         write(fd, &i, 1);
14 }
15
16 void
17 put16(u16int i)
18 {
19         put8(i);
20         put8(i >> 8);
21 }
22
23 void
24 put32(u32int i)
25 {
26         put8(i);
27         put8(i >> 8);
28         put8(i >> 16);
29         put8(i >> 24);
30 }
31
32 int
33 get8(void)
34 {
35         u8int c;
36         
37         read(fd, &c, 1);
38         return c;
39 }
40
41 int
42 get16(void)
43 {
44         int i;
45         
46         i = get8();
47         i |= get8() << 8;
48         return i;
49 }
50
51 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         fd = open(file, OREAD);
67         if(fd < 0){
68                 message("open: %r");
69                 return;
70         }
71         read(fd, mem, sizeof(mem));
72         read(fd, ppuram, sizeof(ppuram));
73         read(fd, oam, sizeof(oam));
74         if(chrram)
75                 read(fd, chr, nchr * CHRSZ);
76         rA = get8();
77         rX = get8();
78         rY = get8();
79         rS = get8();
80         rP = get8();
81         nmi = get8();
82         pc = get16();
83         pput = get16();
84         ppuv = get16();
85         ppusx = get8();
86         ppux = get16();
87         ppuy = get16();
88         mirr = get8();
89         odd = get8();
90         vramlatch = get8();
91         keylatch = get8();
92         vrambuf = get8();
93         clock = get32();
94         ppuclock = get32();
95         apuclock = get32();
96         apuseq = get8();
97         dmcaddr = get16();
98         dmccnt = get16();
99         read(fd, apuctr, sizeof(apuctr));
100         mapper[map](RSTR, 0);
101         close(fd);
102 }
103
104 void
105 savestate(char *file)
106 {
107         fd = create(file, ORDWR, 0666);
108         if(fd < 0){
109                 message("create: %r");
110                 return;
111         }
112         write(fd, mem, sizeof(mem));
113         write(fd, ppuram, sizeof(ppuram));
114         write(fd, oam, sizeof(oam));
115         if(chrram)
116                 write(fd, chr, nchr * CHRSZ);
117         put8(rA);
118         put8(rX);
119         put8(rY);
120         put8(rS);
121         put8(rP);
122         put8(nmi);
123         put16(pc);
124         put16(pput);
125         put16(ppuv);
126         put8(ppusx);
127         put16(ppux);
128         put16(ppuy);
129         put8(mirr);
130         put8(odd);
131         put8(vramlatch);
132         put8(keylatch);
133         put8(vrambuf);
134         put32(clock);
135         put32(ppuclock);
136         put32(apuclock);
137         put8(apuseq);
138         put16(dmcaddr);
139         put16(dmccnt);
140         write(fd, apuctr, sizeof(apuctr));
141         mapper[map](SAVE, 0);
142         close(fd);
143 }