cff531af |
1 | /*\r |
2 | * PicoDrive\r |
3 | * (c) Copyright Dave, 2004\r |
4 | * (C) notaz, 2006-2010\r |
5 | *\r |
6 | * This work is licensed under the terms of MAME license.\r |
7 | * See COPYING file in the top-level directory.\r |
8 | */\r |
cc68a136 |
9 | \r |
10 | #ifndef PICO_H\r |
11 | #define PICO_H\r |
12 | \r |
1f49b750 |
13 | #include <stdint.h> // [u]int<n>_t\r |
21ebcfd3 |
14 | #include <stdlib.h> // size_t\r |
eff55556 |
15 | \r |
cc68a136 |
16 | #ifdef __cplusplus\r |
17 | extern "C" {\r |
18 | #endif\r |
19 | \r |
2446536b |
20 | // message log\r |
21 | extern void lprintf(const char *fmt, ...);\r |
22 | \r |
75736070 |
23 | // external funcs for Sega/Mega CD\r |
7c18e34a |
24 | extern int mp3_get_bitrate(void *f, int size);\r |
25 | extern void mp3_start_play(void *f, int pos);\r |
f7741cac |
26 | extern void mp3_update(s32 *buffer, int length, int stereo);\r |
84100c0f |
27 | \r |
28 | // this function should write-back d-cache and invalidate i-cache\r |
29 | // on a mem region [start_addr, end_addr)\r |
b081408f |
30 | // used by dynarecs\r |
2446536b |
31 | extern void cache_flush_d_inval_i(void *start_addr, void *end_addr);\r |
cb0316e4 |
32 | \r |
b081408f |
33 | // attempt to alloc mem at specified address.\r |
34 | // alloc anywhere else if that fails (callers should handle that)\r |
e743be20 |
35 | extern void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed);\r |
b4db550e |
36 | extern void *plat_mremap(void *ptr, size_t oldsize, size_t newsize);\r |
b081408f |
37 | extern void plat_munmap(void *ptr, size_t size);\r |
df925153 |
38 | \r |
39 | // memory for the dynarec; plat_mem_get_for_drc() can just return NULL\r |
40 | extern void *plat_mem_get_for_drc(size_t size);\r |
c25d78ee |
41 | extern int plat_mem_set_exec(void *ptr, size_t size);\r |
b081408f |
42 | \r |
19954be1 |
43 | // this one should handle display mode changes\r |
d5d17782 |
44 | extern void emu_video_mode_change(int start_line, int line_count, int start_col, int col_count);\r |
19954be1 |
45 | \r |
ae87bffa |
46 | // this must switch to 16bpp mode\r |
974fdb5b |
47 | extern void emu_32x_startup(void);\r |
48 | \r |
83ff19ec |
49 | // optional 32X BIOS, should be left NULL if not used\r |
50 | // must be 256, 2048, 1024 bytes\r |
51 | extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s;\r |
52 | \r |
cc68a136 |
53 | // Pico.c\r |
602133e1 |
54 | #define POPT_EN_FM (1<< 0) // 00 000x\r |
55 | #define POPT_EN_PSG (1<< 1)\r |
56 | #define POPT_EN_Z80 (1<< 2)\r |
57 | #define POPT_EN_STEREO (1<< 3)\r |
58 | #define POPT_ALT_RENDERER (1<< 4) // 00 00x0\r |
a2f24bfa |
59 | #define POPT_EN_YM2413 (1<< 5)\r |
37631374 |
60 | #define POPT_EN_SNDFILTER (1<< 6)\r |
602133e1 |
61 | #define POPT_ACC_SPRITES (1<< 7)\r |
62 | #define POPT_DIS_32C_BORDER (1<< 8) // 00 0x00\r |
63 | #define POPT_EXT_FM (1<< 9)\r |
64 | #define POPT_EN_MCD_PCM (1<<10)\r |
65 | #define POPT_EN_MCD_CDDA (1<<11)\r |
66 | #define POPT_EN_MCD_GFX (1<<12) // 00 x000\r |
466fa079 |
67 | #define POPT_EN_GG_LCD (1<<13)\r |
602133e1 |
68 | #define POPT_EN_SOFTSCALE (1<<14)\r |
69 | #define POPT_EN_MCD_RAMCART (1<<15)\r |
70 | #define POPT_DIS_VDP_FIFO (1<<16) // 0x 0000\r |
92dfd9af |
71 | #define POPT_EN_DRC (1<<17)\r |
381eea9b |
72 | #define POPT_DIS_SPRITE_LIM (1<<18)\r |
053fd9b4 |
73 | #define POPT_DIS_IDLE_DET (1<<19)\r |
8ac9ab7f |
74 | #define POPT_EN_32X (1<<20) // x0 0000\r |
db1d3564 |
75 | #define POPT_EN_PWM (1<<21)\r |
20d2358a |
76 | #define POPT_PWM_IRQ_OPT (1<<22)\r |
324bd685 |
77 | #define POPT_DIS_FM_SSGEG (1<<23)\r |
23cd73bc |
78 | #define POPT_EN_FM_DAC (1<<24) //x00 0000\r |
e2e2b6ad |
79 | #define POPT_EN_FM_FILTER (1<<25)\r |
bac44b18 |
80 | #define POPT_EN_KBD (1<<26)\r |
44be7e5c |
81 | #define POPT_EN_MOUSE (1<<27)\r |
be2c4208 |
82 | \r |
3611781e |
83 | #define PAHW_MCD (1<<0)\r |
84 | #define PAHW_32X (1<<1)\r |
85 | #define PAHW_SVP (1<<2)\r |
86 | #define PAHW_PICO (1<<3)\r |
0c9c8e47 |
87 | \r |
3611781e |
88 | #define PAHW_SMS (1<<4)\r |
0aa63fce |
89 | #define PAHW_GG (1<<5)\r |
90 | #define PAHW_SG (1<<6)\r |
91 | #define PAHW_SC (1<<7)\r |
0c9c8e47 |
92 | #define PAHW_8BIT (PAHW_SMS|PAHW_GG|PAHW_SG|PAHW_SC)\r |
3611781e |
93 | \r |
94 | #define PHWS_AUTO 0\r |
95 | #define PHWS_GG 1\r |
96 | #define PHWS_SMS 2\r |
df6c895c |
97 | #define PHWS_SG 3\r |
cab84f29 |
98 | #define PHWS_SC 4\r |
280bfc3c |
99 | \r |
fe8f2d96 |
100 | #define PQUIRK_FORCE_6BTN (1<<0)\r |
101 | #define PQUIRK_BLACKTHORNE_HACK (1<<1)\r |
102 | #define PQUIRK_WWFRAW_HACK (1<<2)\r |
103 | #define PQUIRK_MARSCHECK_HACK (1<<3)\r |
a67db32a |
104 | #define PQUIRK_NO_Z80_BUS_LOCK (1<<4)\r |
a76fad41 |
105 | \r |
93f9619e |
106 | // the emulator is configured and some status is reported\r |
107 | // through this global state (not saved in savestates)\r |
d5d17782 |
108 | typedef struct PicoInterface\r |
93f9619e |
109 | {\r |
110 | unsigned int opt; // POPT_* bitfield\r |
111 | \r |
922c3352 |
112 | unsigned short pad[4]; // Joypads, format is MXYZ SACB RLDU\r |
113 | unsigned short padInt[4]; // internal copy\r |
114 | unsigned short AHW; // active addon hardware: PAHW_* bitfield\r |
115 | \r |
116 | unsigned short kbd; // SC-3000 or Pico Keyboard\r |
117 | int mouse[4]; // x,y mouse coordinates\r |
118 | int mouseInt[4]; // internal copy\r |
119 | \r |
120 | unsigned short quirks; // game-specific quirks: PQUIRK_*\r |
121 | unsigned short overclockM68k; // overclock the emulated 68k, in %\r |
122 | \r |
123 | unsigned short filter; // softscale filter type\r |
93f9619e |
124 | \r |
125 | unsigned short skipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff\r |
126 | unsigned short regionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe\r |
127 | unsigned short autoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP\r |
f9ea940f |
128 | unsigned int hwSelect; // hardware preselected via option menu\r |
129 | unsigned int mapper; // mapper selection for SMS, 0 = auto\r |
214a6c62 |
130 | unsigned int tmsPalette; // palette used by SMS in TMS graphic modes\r |
93f9619e |
131 | \r |
6311a3ba |
132 | int sndRate; // rate in Hz\r |
37631374 |
133 | int sndFilterAlpha; // Low pass sound filter alpha (Q16)\r |
6311a3ba |
134 | short *sndOut; // PCM output buffer\r |
135 | void (*writeSound)(int len); // write .sndOut callback, called once per frame\r |
136 | \r |
137 | void (*osdMessage)(const char *msg); // output OSD message from emu, optional\r |
138 | \r |
139 | void (*mcdTrayOpen)(void);\r |
140 | void (*mcdTrayClose)(void);\r |
93f9619e |
141 | } PicoInterface;\r |
142 | \r |
143 | extern PicoInterface PicoIn;\r |
144 | \r |
2aa27095 |
145 | void PicoInit(void);\r |
cc68a136 |
146 | void PicoExit(void);\r |
1cb1584b |
147 | void PicoPower(void);\r |
148 | int PicoReset(void);\r |
5e128c6d |
149 | void PicoLoopPrepare(void);\r |
2aa27095 |
150 | void PicoFrame(void);\r |
a12e0116 |
151 | void PicoFrameDrawOnly(void);\r |
4609d0cd |
152 | typedef enum { PI_ROM, PI_ISPAL, PI_IS40_CELL, PI_IS240_LINES } pint_t;\r |
153 | typedef union { int vint; void *vptr; } pint_ret_t;\r |
154 | void PicoGetInternal(pint_t which, pint_ret_t *ret);\r |
cc68a136 |
155 | \r |
ea38612f |
156 | struct PicoEState;\r |
157 | \r |
f3a57b2d |
158 | // pico.c\r |
fa4e0531 |
159 | #define XPCM_BUFFER_SIZE 64\r |
0e732d77 |
160 | enum {\r |
fabe161e |
161 | PKEY_RELEASED = 0,\r |
162 | PKEY_DOWN,\r |
163 | PKEY_UP,\r |
0e732d77 |
164 | };\r |
165 | enum {\r |
fabe161e |
166 | PSHIFT_RELEASED = 0,\r |
167 | PSHIFT_DOWN,\r |
168 | PSHIFT_UP_HELD_DOWN,\r |
169 | PSHIFT_RELEASED_HELD_DOWN,\r |
170 | PSHIFT_UP\r |
0e732d77 |
171 | };\r |
172 | typedef struct\r |
173 | {\r |
174 | uint8_t i;\r |
175 | uint8_t mode;\r |
176 | uint8_t neg;\r |
177 | uint8_t has_read;\r |
178 | uint8_t caps_lock;\r |
179 | uint8_t has_caps_lock;\r |
180 | uint32_t mem;\r |
181 | uint64_t start_time_keydown;\r |
182 | uint64_t time_keydown;\r |
183 | uint8_t key_state;\r |
184 | uint8_t shift_state;\r |
f563beb7 |
185 | uint8_t active;\r |
0e732d77 |
186 | } picohw_kb;\r |
d49b10c2 |
187 | typedef struct\r |
188 | {\r |
189 | int pen_pos[2];\r |
190 | int page;\r |
fa22af4c |
191 | int fifo_bytes; // bytes in FIFO\r |
ef4eb506 |
192 | unsigned short r1, r12;\r |
fa4e0531 |
193 | unsigned int reserved[3];\r |
ef4eb506 |
194 | unsigned char xpcm_buffer[XPCM_BUFFER_SIZE+4];\r |
195 | unsigned char *xpcm_ptr;\r |
0e732d77 |
196 | picohw_kb kb;\r |
d49b10c2 |
197 | } picohw_state;\r |
198 | extern picohw_state PicoPicohw;\r |
406c96c5 |
199 | \r |
bcc9eda0 |
200 | // area.c\r |
201 | int PicoState(const char *fname, int is_save);\r |
b4db550e |
202 | int PicoStateLoadGfx(const char *fname);\r |
203 | void *PicoTmpStateSave(void);\r |
204 | void PicoTmpStateRestore(void *data);\r |
76276b0b |
205 | extern void (*PicoStateProgressCB)(const char *str);\r |
cc68a136 |
206 | \r |
274fcc35 |
207 | // cd/cdd.c\r |
208 | int cdd_load(const char *filename, int type);\r |
209 | int cdd_unload(void);\r |
eff55556 |
210 | \r |
cc68a136 |
211 | // Cart.c\r |
83bd0b76 |
212 | typedef enum\r |
213 | {\r |
214 | PMT_UNCOMPRESSED = 0,\r |
71de3cd9 |
215 | PMT_ZIP,\r |
15ca7152 |
216 | PMT_CSO,\r |
217 | PMT_CHD\r |
83bd0b76 |
218 | } pm_type;\r |
219 | typedef struct\r |
220 | {\r |
221 | void *file; /* file handle */\r |
222 | void *param; /* additional file related field */\r |
223 | unsigned int size; /* size */\r |
224 | pm_type type;\r |
87b0845f |
225 | char ext[4];\r |
83bd0b76 |
226 | } pm_file;\r |
227 | pm_file *pm_open(const char *path);\r |
15ca7152 |
228 | void pm_sectorsize(int length, pm_file *stream);\r |
83bd0b76 |
229 | size_t pm_read(void *ptr, size_t bytes, pm_file *stream);\r |
15ca7152 |
230 | size_t pm_read_audio(void *ptr, size_t bytes, pm_file *stream);\r |
83bd0b76 |
231 | int pm_seek(pm_file *stream, long offset, int whence);\r |
232 | int pm_close(pm_file *fp);\r |
a5085db3 |
233 | int PicoCartLoad(pm_file *f, const unsigned char *rom, unsigned int romsize,\r |
234 | unsigned char **prom, unsigned int *psize, int is_sms);\r |
ae87bffa |
235 | int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_cfg);\r |
2aa27095 |
236 | void PicoCartUnload(void);\r |
a9b3ffd3 |
237 | extern void (*PicoCartLoadProgressCB)(int percent);\r |
b2451ac6 |
238 | extern void (*PicoCDLoadProgressCB)(const char *fname, int percent);\r |
4c2e3554 |
239 | extern int PicoGameLoaded;\r |
cc68a136 |
240 | \r |
241 | // Draw.c\r |
5a681086 |
242 | // for line-based renderer, set conversion\r |
243 | // from internal 8 bit representation in 'HighCol' to:\r |
244 | typedef enum\r |
245 | {\r |
246 | PDF_NONE = 0, // no conversion\r |
247 | PDF_RGB555, // RGB/BGR output, depends on compile options\r |
248 | PDF_8BIT, // 8-bit out (handles shadow/hilight mode, sonic water)\r |
249 | } pdso_t;\r |
41946d70 |
250 | void PicoDrawSetOutFormat(pdso_t which, int use_32x_line_mode);\r |
5a681086 |
251 | void PicoDrawSetOutBuf(void *dest, int increment);\r |
f4750ee0 |
252 | void PicoDrawSetCallbacks(int (*begin)(unsigned int num), int (*end)(unsigned int num));\r |
cc68a136 |
253 | // utility\r |
254 | #ifdef _ASM_DRAW_C\r |
ea8c405f |
255 | void vidConvCpyRGB565(void *to, void *from, int pixels);\r |
cc68a136 |
256 | #endif\r |
ea38612f |
257 | void PicoDoHighPal555(int sh, int line, struct PicoEState *est);\r |
e721f801 |
258 | // internals, NB must keep in sync with ASM draw functions\r |
47677a2a |
259 | #define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority\r |
b061bc16 |
260 | #define PDRAW_PARSE_SPRITES (1<<2) // SAT needs parsing\r |
947fb5f9 |
261 | #define PDRAW_INTERLACE (1<<3)\r |
b061bc16 |
262 | #define PDRAW_DIRTY_SPRITES (1<<4) // SAT modified\r |
602133e1 |
263 | #define PDRAW_SONIC_MODE (1<<5) // mid-frame palette changes for 8bit renderer\r |
264 | #define PDRAW_PLANE_HI_PRIO (1<<6) // have layer with all hi prio tiles (mk3)\r |
265 | #define PDRAW_SHHI_DONE (1<<7) // layer sh/hi already processed\r |
f55fb314 |
266 | #define PDRAW_32_COLS (1<<8) // 32 columns mode\r |
b9bc876c |
267 | #define PDRAW_BORDER_32 (1<<9) // center H32 in buffer (32 px border)\r |
3031ff34 |
268 | #define PDRAW_SKIP_FRAME (1<<10) // frame is skipped\r |
f55fb314 |
269 | #define PDRAW_30_ROWS (1<<11) // 30 rows mode (240 lines)\r |
52e4a905 |
270 | #define PDRAW_32X_SCALE (1<<12) // scale CLUT layer for 32X\r |
96948bdf |
271 | #define PDRAW_SMS_BLANK_1 (1<<13) // 1st column blanked\r |
db1ee7a2 |
272 | #define PDRAW_BGC_DMA (1<<14) // in background color DMA\r |
17c1401b |
273 | #define PDRAW_SOFTSCALE (1<<15) // H32 upscaling\r |
274 | #define PDRAW_SYNC_NEEDED (1<<16) // redraw needed\r |
275 | #define PDRAW_SYNC_NEXT (1<<17) // redraw next frame\r |
ea38612f |
276 | extern int rendstatus_old;\r |
ae87bffa |
277 | extern int rendlines;\r |
cc68a136 |
278 | \r |
5a681086 |
279 | // draw.c\r |
280 | void PicoDrawUpdateHighPal(void);\r |
281 | void PicoDrawSetInternalBuf(void *dest, int line_increment);\r |
282 | \r |
283 | // draw2.c\r |
cc68a136 |
284 | // stuff below is optional\r |
285 | extern unsigned short *PicoCramHigh; // pointer to CRAM buff (0x40 shorts), converted to native device color (works only with 16bit for now)\r |
043ccbf4 |
286 | extern void (*PicoPrepareCram)(void);// prepares PicoCramHigh for renderer to use\r |
cc68a136 |
287 | \r |
f3a57b2d |
288 | // pico.c (32x)\r |
ed4402a7 |
289 | #ifndef NO_32X\r |
290 | \r |
291 | void Pico32xSetClocks(int msh2_hz, int ssh2_hz);\r |
fcdefcf6 |
292 | \r |
ed4402a7 |
293 | #else\r |
294 | \r |
295 | #define Pico32xSetClocks(msh2_khz, ssh2_khz)\r |
296 | \r |
297 | #endif\r |
298 | \r |
299 | // normally 68k clock (7670442) * 3, in reality but much lower\r |
300 | // because of high memory latencies\r |
301 | #define PICO_MSH2_HZ ((int)(7670442.0 * 2.4))\r |
302 | #define PICO_SSH2_HZ ((int)(7670442.0 * 2.4))\r |
303 | \r |
cc68a136 |
304 | // sound.c\r |
70efc52d |
305 | extern void (*PsndMix_32_to_16)(s16 *dest, s32 *src, int count);\r |
9d917eea |
306 | void PsndRerate(int preserve_state);\r |
cc68a136 |
307 | \r |
4c2e3554 |
308 | // media.c\r |
309 | enum media_type_e {\r |
310 | PM_BAD_DETECT = -1,\r |
311 | PM_ERROR = -2,\r |
312 | PM_BAD_CD = -3,\r |
313 | PM_BAD_CD_NO_BIOS = -4,\r |
314 | PM_MD_CART = 1, /* also 32x */\r |
315 | PM_MARK3,\r |
4fc85c80 |
316 | PM_PICO,\r |
4c2e3554 |
317 | PM_CD,\r |
318 | };\r |
274fcc35 |
319 | \r |
15ca7152 |
320 | enum cd_track_type\r |
274fcc35 |
321 | {\r |
15ca7152 |
322 | CT_UNKNOWN = 0,\r |
323 | // data tracks\r |
324 | CT_ISO = 1, /* 2048 B/sector */\r |
325 | CT_BIN = 2, /* 2352 B/sector */\r |
326 | // audio tracks\r |
02ff0254 |
327 | CT_AUDIO = 8,\r |
328 | CT_RAW = CT_AUDIO | 1,\r |
329 | CT_CHD = CT_AUDIO | 2,\r |
330 | CT_MP3 = CT_AUDIO | 3,\r |
331 | CT_WAV = CT_AUDIO | 4,\r |
274fcc35 |
332 | };\r |
333 | \r |
15ca7152 |
334 | typedef struct\r |
335 | {\r |
336 | char *fname;\r |
337 | int pregap; /* pregap for current track */\r |
338 | int sector_offset; /* in current file */\r |
339 | int sector_xlength;\r |
dd7882a3 |
340 | int loop, loop_lba; /* MEGASD extensions */\r |
15ca7152 |
341 | enum cd_track_type type;\r |
342 | } cd_track_t;\r |
343 | \r |
344 | typedef struct\r |
345 | {\r |
346 | int track_count;\r |
347 | cd_track_t tracks[0];\r |
348 | } cd_data_t;\r |
349 | \r |
350 | \r |
4c2e3554 |
351 | enum media_type_e PicoLoadMedia(const char *filename,\r |
a5085db3 |
352 | const unsigned char *rom, unsigned int romsize,\r |
4c2e3554 |
353 | const char *carthw_cfg_fname,\r |
354 | const char *(*get_bios_filename)(int *region, const char *cd_fname),\r |
549dd407 |
355 | const char *(*get_msu_filename)(const char *cd_fname),\r |
4c2e3554 |
356 | void (*do_region_override)(const char *media_filename));\r |
357 | int PicoCdCheck(const char *fname_in, int *pregion);\r |
358 | \r |
359 | extern unsigned char media_id_header[0x100];\r |
360 | \r |
531a8f38 |
361 | // memory.c\r |
362 | enum input_device {\r |
363 | PICO_INPUT_NOTHING,\r |
364 | PICO_INPUT_PAD_3BTN,\r |
365 | PICO_INPUT_PAD_6BTN,\r |
0738c83e |
366 | PICO_INPUT_MOUSE,\r |
d650a7a2 |
367 | PICO_INPUT_PAD_TEAM,\r |
368 | PICO_INPUT_PAD_4WAY,\r |
531a8f38 |
369 | };\r |
370 | void PicoSetInputDevice(int port, enum input_device device);\r |
371 | \r |
cc68a136 |
372 | #ifdef __cplusplus\r |
373 | } // End of extern "C"\r |
374 | #endif\r |
375 | \r |
376 | #endif // PICO_H\r |