pandora: fix readme and pxml version
[picodrive.git] / pico / state.h
... / ...
CommitLineData
1#include <stdlib.h>
2#include <assert.h>
3#include "pico_types.h"
4
5typedef size_t (arearw)(void *p, size_t _size, size_t _n, void *file);
6typedef size_t (areaeof)(void *file);
7typedef int (areaseek)(void *file, long offset, int whence);
8typedef int (areaclose)(void *file);
9
10int PicoStateFP(void *afile, int is_save,
11 arearw *read, arearw *write, areaeof *eof, areaseek *seek);
12
13static inline void save_u8_(u8 *buf, size_t *b, u32 u)
14{
15 assert(!(u & ~0xff));
16 buf[(*b)++] = u;
17}
18
19static 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
26static 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
33static 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
41static 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
49static 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
57static inline u8 load_u8_(const u8 *buf, size_t *b)
58{
59 return buf[(*b)++];
60}
61
62static inline s8 load_s8_(const u8 *buf, size_t *b)
63{
64 return buf[(*b)++];
65}
66
67static 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
74static 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
81static 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
88static 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}