]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/gba/state.c
games/mahjongg: off by one in bmatch(), fix hint() redraw (thanks Kenji)
[plan9front.git] / sys / src / games / gba / 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 extern Var cpuvars[], ppuvars[], memvars[], apuvars[], evvars[];
10 extern Event *events[NEVENT], *elist;
11
12 static void
13 putevents(Biobuf *bp)
14 {
15         int i, j;
16         Event *e;
17         
18         for(i = 0; i < NEVENT; i++)
19                 if(elist == events[i])
20                         break;
21         if(i == NEVENT && elist != nil)
22                 print("unknown event %p in chain\n", elist);
23         Bputc(bp, i);
24         for(i = 0; i < NEVENT; i++){
25                 e = events[i];
26                 Bputc(bp, e->time);
27                 Bputc(bp, e->time >> 8);
28                 Bputc(bp, e->time >> 16);
29                 Bputc(bp, e->time >> 24);
30                 for(j = 0; j < NEVENT; j++)
31                         if(e->next == events[j])
32                                 break;
33                 if(j == NEVENT && e->next != nil)
34                         print("unknown event %p in chain\n", e->next);
35                 Bputc(bp, j);
36         }
37                 
38 }
39
40 static void
41 getevents(Biobuf *bp)
42 {
43         int i, j;
44         Event *e;
45         
46         i = Bgetc(bp);
47         elist = i >= NEVENT ? nil : events[i];
48         for(i = 0; i < NEVENT; i++){
49                 e = events[i];
50                 e->time = Bgetc(bp);
51                 e->time |= Bgetc(bp) << 8;
52                 e->time |= Bgetc(bp) << 16;
53                 e->time |= Bgetc(bp) << 24;
54                 j = Bgetc(bp);
55                 e->next = j >= NEVENT ? nil : events[j];
56         }
57 }
58
59 static void
60 getvars(Biobuf *bp, Var *v)
61 {
62         int n;
63         u16int *p, w;
64         u32int *q, l;
65
66         for(; v->a != nil; v++)
67                 switch(v->s){
68                 case 1:
69                         Bread(bp, v->a, v->n);
70                         break;
71                 case 2:
72                         n = v->n;
73                         p = v->a;
74                         while(n--){
75                                 w = Bgetc(bp);
76                                 *p++ = w | Bgetc(bp) << 8;
77                         }
78                         break;
79                 case 4:
80                         n = v->n;
81                         q = v->a;
82                         while(n--){
83                                 l = Bgetc(bp);
84                                 l |= Bgetc(bp) << 8;
85                                 l |= Bgetc(bp) << 16;
86                                 *q++ = l | Bgetc(bp) << 24;
87                         }
88                         break;
89                 }
90
91 }
92
93 static void
94 putvars(Biobuf *bp, Var *v)
95 {
96         int n;
97         u16int *p;
98         u32int *q;
99
100         for(; v->a != nil; v++)
101                 switch(v->s){
102                 case 1:
103                         Bwrite(bp, v->a, v->n);
104                         break;
105                 case 2:
106                         n = v->n;
107                         p = v->a;
108                         while(n--){
109                                 Bputc(bp, *p & 0xff);
110                                 Bputc(bp, *p++ >> 8);
111                         }
112                         break;
113                 case 4:
114                         n = v->n;
115                         q = v->a;
116                         while(n--){
117                                 Bputc(bp, *q);
118                                 Bputc(bp, *q >> 8);
119                                 Bputc(bp, *q >> 16);
120                                 Bputc(bp, *q++ >> 24);
121                         }
122                         break;
123                 }
124 }
125
126 void
127 savestate(char *file)
128 {
129         Biobuf *bp;
130
131         flushback();
132         bp = Bopen(file, OWRITE);
133         if(bp == nil){
134                 print("open: %r\n");
135                 return;
136         }
137         putvars(bp, cpuvars);
138         putvars(bp, ppuvars);
139         putvars(bp, memvars);
140         putvars(bp, apuvars);
141         putvars(bp, evvars);
142         putevents(bp);
143         Bterm(bp);
144 }
145
146 void
147 loadstate(char *file)
148 {
149         Biobuf *bp;
150         extern u32int r[16];
151
152         bp = Bopen(file, OREAD);
153         if(bp == nil){
154                 print("open: %r\n");
155                 return;
156         }
157         getvars(bp, cpuvars);
158         getvars(bp, ppuvars);
159         getvars(bp, memvars);
160         getvars(bp, apuvars);
161         getvars(bp, evvars);
162         getevents(bp);
163         cpuload();
164         Bterm(bp);
165 }