5a6d5fcbb6fbd09ff6614af776cd4188d537f603
[picodrive.git] / pico / state.h
1 #include <stdlib.h>
2 #include <assert.h>
3 #include "pico_types.h"
4
5 typedef size_t (arearw)(void *p, size_t _size, size_t _n, void *file);
6 typedef size_t (areaeof)(void *file);
7 typedef int    (areaseek)(void *file, long offset, int whence);
8 typedef int    (areaclose)(void *file);
9
10 int PicoStateFP(void *afile, int is_save,
11   arearw *read, arearw *write, areaeof *eof, areaseek *seek);
12
13 static inline void save_u8_(u8 *buf, size_t *b, u32 u)
14 {
15         assert(!(u & ~0xff));
16         buf[(*b)++] = u;
17 }
18
19 static inline void save_s8_(u8 *buf, size_t *b, s32 s)
20 {
21         s32 s_sext = (s32)((u32)s << 24) >> 24;
22         assert(s == s_sext); (void)s_sext;
23         buf[(*b)++] = s;
24 }
25
26 static inline void save_u16(u8 *buf, size_t *b, u32 u)
27 {
28         assert(!(u & ~0xffff));
29         buf[(*b)++] = u;
30         buf[(*b)++] = u >> 8;
31 }
32
33 static inline void save_s16(u8 *buf, size_t *b, s32 s)
34 {
35         s32 s_sext = (s32)((u32)s << 16) >> 16;
36         assert(s == s_sext); (void)s_sext;
37         buf[(*b)++] = s;
38         buf[(*b)++] = s >> 8;
39 }
40
41 static inline void save_u32(u8 *buf, size_t *b, u32 u)
42 {
43         buf[(*b)++] = u;
44         buf[(*b)++] = u >> 8;
45         buf[(*b)++] = u >> 16;
46         buf[(*b)++] = u >> 24;
47 }
48
49 static inline void save_s32(u8 *buf, size_t *b, s32 s)
50 {
51         buf[(*b)++] = s;
52         buf[(*b)++] = s >> 8;
53         buf[(*b)++] = s >> 16;
54         buf[(*b)++] = s >> 24;
55 }
56
57 static inline u8 load_u8_(const u8 *buf, size_t *b)
58 {
59         return buf[(*b)++];
60 }
61
62 static inline s8 load_s8_(const u8 *buf, size_t *b)
63 {
64         return buf[(*b)++];
65 }
66
67 static inline u16 load_u16(const u8 *buf, size_t *b)
68 {
69         u16 r = (buf[*b + 1] << 8) | buf[*b];
70         (*b) += 2;
71         return r;
72 }
73
74 static inline s16 load_s16(const u8 *buf, size_t *b)
75 {
76         s16 r = (buf[*b + 1] << 8) | buf[*b];
77         (*b) += 2;
78         return r;
79 }
80
81 static inline u32 load_u32(const u8 *buf, size_t *b)
82 {
83         u32 r = (buf[*b + 3] << 24) | (buf[*b + 2] << 16) | (buf[*b + 1] << 8) | buf[*b];
84         (*b) += 4;
85         return r;
86 }
87
88 static inline s32 load_s32(const u8 *buf, size_t *b)
89 {
90         s32 r = (buf[*b + 3] << 24) | (buf[*b + 2] << 16) | (buf[*b + 1] << 8) | buf[*b];
91         (*b) += 4;
92         return r;
93 }