]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/snes/state.c
games/snes: added open bus emulation
[plan9front.git] / sys / src / games / snes / state.c
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <draw.h>
5 #include <bio.h>
6 #include "dat.h"
7 #include "fns.h"
8
9 static Biobuf *bp;
10
11 void
12 put8(u8int i)
13 {
14         Bputc(bp, i);
15 }
16
17 void
18 put16(u16int i)
19 {
20         put8(i);
21         put8(i >> 8);
22 }
23
24 void
25 put32(u32int i)
26 {
27         put8(i);
28         put8(i >> 8);
29         put8(i >> 16);
30         put8(i >> 24);
31 }
32
33 void
34 put16s(u16int *p, int n)
35 {
36         while(n--)
37                 put16(*p++);
38 }
39
40 int
41 get8(void)
42 {
43         return Bgetc(bp);
44 }
45
46 int
47 get16(void)
48 {
49         int i;
50         
51         i = get8();
52         i |= get8() << 8;
53         return i;
54 }
55
56 int
57 get32(void)
58 {
59         int i;
60         
61         i = get8();
62         i |= get8() << 8;
63         i |= get8() << 16;
64         i |= get8() << 24;
65         return i;
66 }
67
68 void
69 get16s(u16int *p, int n)
70 {
71         while(n--)
72                 *p++ = get16();
73 }
74
75 void
76 loadstate(char *file)
77 {
78         bp = Bopen(file, OREAD);
79         if(bp == nil){
80                 message("open: %r");
81                 return;
82         }
83         Bread(bp, reg, sizeof(reg));
84         Bread(bp, mem, sizeof(mem));
85         Bread(bp, vram, sizeof(vram));
86         Bread(bp, oam, sizeof(oam));
87         Bread(bp, spcmem, sizeof(spcmem));
88         Bread(bp, dsp, sizeof(dsp));
89         get16s(cgram, nelem(cgram));
90         ppuclock = get32();
91         spcclock = get32();
92         dspclock = get32();
93         stimerclock = get32();
94         rA = get16();
95         rX = get16();
96         rY = get16();
97         rS = get16();
98         rP = get8();
99         rD = get16();
100         rDB = get8()<<16;
101         pc = get16();
102         rPB = get8()<<16;
103         emu = get8();
104         irq = get8();
105         nmi = get8();
106         dma = get8();
107         hdma = get32();
108         wai = get8();
109         mdr = get8();
110         mdr1 = get8();
111         mdr2 = get8();
112         oamaddr = get16();
113         vramlatch = get16();
114         keylatch = get32();
115         ppux = get16();
116         ppuy = get16();
117         htime = reg[0x4207] | reg[0x4208] << 8 & 0x100;
118         vtime = reg[0x4209] | reg[0x420a] << 8 & 0x100;
119         subcolor = get16();
120         get16s(hofs, nelem(hofs));
121         get16s(vofs, nelem(vofs));
122         get16s((u16int*) m7, nelem(m7));
123         sA = get8();
124         sX = get8();
125         sY = get8();
126         sS = get8();
127         sP = get8();
128         dspstate = get8();
129         dspcounter = get16();
130         noise = get16();
131         Bterm(bp);
132 }
133
134 void
135 savestate(char *file)
136 {
137         flushram();
138         bp = Bopen(file, OWRITE);
139         if(bp == nil){
140                 message("open: %r");
141                 return;
142         }
143         Bwrite(bp, reg, sizeof(reg));
144         Bwrite(bp, mem, sizeof(mem));
145         Bwrite(bp, vram, sizeof(vram));
146         Bwrite(bp, oam, sizeof(oam));
147         Bwrite(bp, spcmem, sizeof(spcmem));
148         Bwrite(bp, dsp, sizeof(dsp));
149         put16s(cgram, nelem(cgram));
150         put32(ppuclock);
151         put32(spcclock);
152         put32(dspclock);
153         put32(stimerclock);
154         put16(rA);
155         put16(rX);
156         put16(rY);
157         put16(rS);
158         put8(rP);
159         put16(rD);
160         put8(rDB>>16);
161         put16(pc);
162         put8(rPB>>16);
163         put8(emu);
164         put8(irq);
165         put8(nmi);
166         put8(dma);
167         put32(hdma);
168         put8(wai);
169         put8(mdr);
170         put8(mdr1);
171         put8(mdr2);
172         put16(oamaddr);
173         put16(vramlatch);
174         put32(keylatch);
175         put16(ppux);
176         put16(ppuy);
177         put16(subcolor);
178         put16s(hofs, nelem(hofs));
179         put16s(vofs, nelem(vofs));
180         put16s((u16int*) m7, nelem(m7));
181         put8(sA);
182         put8(sX);
183         put8(sY);
184         put8(sS);
185         put8(sP);
186         put8(dspstate);
187         put16(dspcounter);
188         put16(noise);
189         Bterm(bp);
190 }