initial pandora port, with hardware scaling and stuff
[gpsp.git] / common.h
1 /* gameplaySP
2  *
3  * Copyright (C) 2006 Exophase <exophase@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19
20 #ifndef COMMON_H
21 #define COMMON_H
22
23 #define ror(dest, value, shift)                                               \
24   dest = ((value) >> shift) | ((value) << (32 - shift))                       \
25
26 // These includes must be used before SDL is included.
27 #ifdef ARM_ARCH
28
29 #ifdef _WIN32_WCE
30   #include <windows.h>
31 #else
32   #define _BSD_SOURCE // sync
33   #include <stdlib.h>
34   #include <stdio.h>
35   #include <string.h>
36   #include <math.h>
37   #include <fcntl.h>
38   #include <unistd.h>
39   #include <stdarg.h>
40   #include <time.h>
41   #include <sys/time.h>
42 #endif /* _WIN32_WCE */
43
44 #ifdef GIZ_BUILD
45   #include "giz/giz.h"
46 #endif
47 #endif /* ARM_ARCH */
48
49 // Huge thanks to pollux for the heads up on using native file I/O
50 // functions on PSP for vastly improved memstick performance.
51
52 #define file_write_mem(filename_tag, buffer, size)                            \
53 {                                                                             \
54   memcpy(write_mem_ptr, buffer, size);                                        \
55   write_mem_ptr += size;                                                      \
56 }                                                                             \
57
58 #define file_write_mem_array(filename_tag, array)                             \
59   file_write_mem(filename_tag, array, sizeof(array))                          \
60
61 #define file_write_mem_variable(filename_tag, variable)                       \
62   file_write_mem(filename_tag, &variable, sizeof(variable))                   \
63
64 #ifdef PSP_BUILD
65   #define fastcall
66
67   #include <pspkernel.h>
68   #include <pspdebug.h>
69   #include <pspctrl.h>
70   #include <pspgu.h>
71   #include <pspaudio.h>
72   #include <pspaudiolib.h>
73   #include <psprtc.h>
74
75   #define function_cc
76
77   #define convert_palette(value)                                              \
78     value = ((value & 0x7FE0) << 1) | (value & 0x1F)                          \
79
80   #define psp_file_open_read  PSP_O_RDONLY
81   #define psp_file_open_write (PSP_O_CREAT | PSP_O_WRONLY | PSP_O_TRUNC)
82
83   #define file_open(filename_tag, filename, mode)                             \
84     s32 filename_tag = sceIoOpen(filename, psp_file_open_##mode, 0777)        \
85
86   #define file_check_valid(filename_tag)                                      \
87     (filename_tag >= 0)                                                       \
88
89   #define file_close(filename_tag)                                            \
90     sceIoClose(filename_tag)                                                  \
91
92   #define file_read(filename_tag, buffer, size)                               \
93     sceIoRead(filename_tag, buffer, size)                                     \
94
95   #define file_write(filename_tag, buffer, size)                              \
96     sceIoWrite(filename_tag, buffer, size)                                    \
97
98   #define file_seek(filename_tag, offset, type)                               \
99     sceIoLseek(filename_tag, offset, PSP_##type)                              \
100
101   #define file_tag_type s32
102
103   #include <time.h>
104   #include <stdio.h>
105 #else
106   #include "SDL.h"
107
108 #ifdef ARM_ARCH
109   #define function_cc
110 #else
111   #define function_cc __attribute__((regparm(2)))
112 #endif
113
114   typedef unsigned char u8;
115   typedef signed char s8;
116   typedef unsigned short int u16;
117   typedef signed short int s16;
118   typedef unsigned int u32;
119   typedef signed int s32;
120   typedef unsigned long long int u64;
121   typedef signed long long int s64;
122
123   #define convert_palette(value)                                              \
124     value = ((value & 0x1F) << 11) | ((value & 0x03E0) << 1) | (value >> 10)  \
125
126   #define stdio_file_open_read  "rb"
127   #define stdio_file_open_write "wb"
128
129   #define file_open(filename_tag, filename, mode)                             \
130     FILE *filename_tag = fopen(filename, stdio_file_open_##mode)              \
131
132   #define file_check_valid(filename_tag)                                      \
133     (filename_tag)                                                            \
134
135 #ifdef GP2X_BUILD
136
137   #define file_close(filename_tag)                                            \
138   {                                                                           \
139     fclose(filename_tag);                                                     \
140     sync();                                                                   \
141   }                                                                           \
142
143 #else
144
145   #define file_close(filename_tag)                                            \
146     fclose(filename_tag)                                                      \
147
148 #endif
149
150   #define file_read(filename_tag, buffer, size)                               \
151     fread(buffer, size, 1, filename_tag)                                      \
152
153   #define file_write(filename_tag, buffer, size)                              \
154     fwrite(buffer, size, 1, filename_tag)                                     \
155
156   #define file_seek(filename_tag, offset, type)                               \
157     fseek(filename_tag, offset, type)                                         \
158
159   #define file_tag_type FILE *
160
161 #endif
162
163 // These must be variables, not constants.
164
165 #define file_read_variable(filename_tag, variable)                            \
166   file_read(filename_tag, &variable, sizeof(variable))                        \
167
168 #define file_write_variable(filename_tag, variable)                           \
169   file_write(filename_tag, &variable, sizeof(variable))                       \
170
171 // These must be statically declared arrays (ie, global or on the stack,
172 // not dynamically allocated on the heap)
173
174 #define file_read_array(filename_tag, array)                                  \
175   file_read(filename_tag, array, sizeof(array))                               \
176
177 #define file_write_array(filename_tag, array)                                 \
178   file_write(filename_tag, array, sizeof(array))                              \
179
180
181
182 typedef u32 fixed16_16;
183
184 #define float_to_fp16_16(value)                                               \
185   (fixed16_16)((value) * 65536.0)                                             \
186
187 #define fp16_16_to_float(value)                                               \
188   (float)((value) / 65536.0)                                                  \
189
190 #define u32_to_fp16_16(value)                                                 \
191   ((value) << 16)                                                             \
192
193 #define fp16_16_to_u32(value)                                                 \
194   ((value) >> 16)                                                             \
195
196 #define fp16_16_fractional_part(value)                                        \
197   ((value) & 0xFFFF)                                                          \
198
199 #define fixed_div(numerator, denominator, bits)                               \
200   (((numerator * (1 << bits)) + (denominator / 2)) / denominator)             \
201
202 #define address8(base, offset)                                                \
203   *((u8 *)((u8 *)base + (offset)))                                            \
204
205 #define address16(base, offset)                                               \
206   *((u16 *)((u8 *)base + (offset)))                                           \
207
208 #define address32(base, offset)                                               \
209   *((u32 *)((u8 *)base + (offset)))                                           \
210
211 #include <unistd.h>
212 #include <time.h>
213 #include <stdio.h>
214 #include <stdlib.h>
215 #include <string.h>
216 #include <stdarg.h>
217 #include "SDL.h"
218 #include "cpu.h"
219 #include "memory.h"
220 #include "video.h"
221 #include "input.h"
222 #include "sound.h"
223 #include "main.h"
224 #include "gui.h"
225 #include "zip.h"
226 #include "cheats.h"
227
228 #ifdef ARM_ARCH
229   #include "arm/warm.h"
230 #endif
231
232 #ifdef PSP_BUILD
233   #define printf pspDebugScreenPrintf
234 #endif
235
236 #ifdef PC_BUILD
237   #define STDIO_DEBUG
238   //#define REGISTER_USAGE_ANALYZE
239 #endif
240
241 #ifdef GP2X_BUILD
242   #include <strings.h>
243   #include "gp2x/gp2x.h"
244
245   #define printf(format, ...)                                                 \
246     fprintf(stderr, format, ##__VA_ARGS__)                                    \
247
248   #define vprintf(format, ap)                                                 \
249     vfprintf(stderr, format, ap)                                              \
250
251 //  #define STDIO_DEBUG
252 #endif
253
254 #ifdef PND_BUILD
255   #include "pandora/pnd.h"
256 #endif
257
258 #endif