annotate libblastem.c @ 1863:d60f2d7c02a5

Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
author Michael Pavone <pavone@retrodev.com>
date Tue, 14 May 2019 23:20:35 -0700
parents 8500bd987dda
children 96323d73b8ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
1 #include <stdlib.h>
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
2 #include <string.h>
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include "libretro.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include "system.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "util.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "vdp.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include "render.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include "io.h"
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 static retro_environment_t retro_environment;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 RETRO_API void retro_set_environment(retro_environment_t re)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 retro_environment = re;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 static retro_video_refresh_t retro_video_refresh;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 RETRO_API void retro_set_video_refresh(retro_video_refresh_t rvf)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 retro_video_refresh = rvf;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 static retro_audio_sample_t retro_audio_sample;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 RETRO_API void retro_set_audio_sample(retro_audio_sample_t ras)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 retro_audio_sample = ras;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 RETRO_API void retro_set_audio_sample_batch(retro_audio_sample_batch_t rasb)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 static retro_input_poll_t retro_input_poll;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 RETRO_API void retro_set_input_poll(retro_input_poll_t rip)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 retro_input_poll = rip;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 static retro_input_state_t retro_input_state;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 RETRO_API void retro_set_input_state(retro_input_state_t ris)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 retro_input_state = ris;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 int headless = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 int exit_after = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 int z80_enabled = 1;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 char *save_filename;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 tern_node *config;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 uint8_t use_native_states = 1;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 system_header *current_system;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 system_media media;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 RETRO_API void retro_init(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 RETRO_API void retro_deinit(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 {
1691
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
59 if (current_system) {
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
60 retro_unload_game();
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
61 }
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 RETRO_API unsigned retro_api_version(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 return RETRO_API_VERSION;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 RETRO_API void retro_get_system_info(struct retro_system_info *info)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 info->library_name = "BlastEm";
1819
4fb9af0c65b6 Update verison number in liblastem.c
Mike Pavone <pavone@retrodev.com>
parents: 1818
diff changeset
72 info->library_version = "0.6.3-pre"; //TODO: share this with blastem.c
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 info->valid_extensions = "md|gen|sms|bin|rom";
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 info->need_fullpath = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 info->block_extract = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 static vid_std video_standard;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
79 static uint32_t last_width, last_height;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 RETRO_API void retro_get_system_av_info(struct retro_system_av_info *info)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 {
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
82 last_width = LINEBUF_SIZE;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 info->geometry.base_width = info->geometry.max_width = LINEBUF_SIZE;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
84 info->geometry.base_height = video_standard == VID_NTSC ? 243 : 294;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
85 last_height = info->geometry.base_height;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
86 info->geometry.max_height = info->geometry.base_height * 2;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 info->geometry.aspect_ratio = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 info->timing.fps = video_standard == VID_NTSC ? 60 : 50;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 info->timing.sample_rate = 53267; //approximate sample rate of YM2612
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 RETRO_API void retro_set_controller_port_device(unsigned port, unsigned device)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 /* Resets the current game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 RETRO_API void retro_reset(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 current_system->soft_reset(current_system);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 /* Runs the game for one video frame.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 * During retro_run(), input_poll callback must be called at least once.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 *
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 * If a frame is not rendered for reasons where a game "dropped" a frame,
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 * this still counts as a frame, and retro_run() should explicitly dupe
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 * a frame if GET_CAN_DUPE returns true.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 * In this case, the video callback can take a NULL argument for data.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 static uint8_t started;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 RETRO_API void retro_run(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 if (started) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 current_system->resume_context(current_system);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 } else {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 current_system->start_context(current_system, NULL);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 started = 1;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 /* Returns the amount of data the implementation requires to serialize
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 * internal state (save states).
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 * Between calls to retro_load_game() and retro_unload_game(), the
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 * returned size is never allowed to be larger than a previous returned
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 * value, to ensure that the frontend can allocate a save state buffer once.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 */
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
127 static size_t serialize_size_cache;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 RETRO_API size_t retro_serialize_size(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
130 if (!serialize_size_cache) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
131 uint8_t *tmp = current_system->serialize(current_system, &serialize_size_cache);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
132 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
133 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
134 return serialize_size_cache;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 /* Serializes internal state. If failed, or size is lower than
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 * retro_serialize_size(), it should return false, true otherwise. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 RETRO_API bool retro_serialize(void *data, size_t size)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
141 size_t actual_size;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
142 uint8_t *tmp = current_system->serialize(current_system, &actual_size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
143 if (actual_size > size) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
144 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
145 return 0;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
146 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
147 memcpy(data, tmp, actual_size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
148 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
149 return 1;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 RETRO_API bool retro_unserialize(const void *data, size_t size)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
154 current_system->deserialize(current_system, (uint8_t *)data, size);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 RETRO_API void retro_cheat_reset(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *code)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 /* Loads a game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 RETRO_API bool retro_load_game(const struct retro_game_info *game)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
169 serialize_size_cache = 0;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 if (game->path) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 media.dir = path_dirname(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 media.name = basename_no_extension(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 media.extension = path_extension(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 media.buffer = malloc(nearest_pow2(game->size));
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 memcpy(media.buffer, game->data, game->size);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 media.size = game->size;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 current_system = alloc_config_system(detect_system_type(&media), &media, 0, 0);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 unsigned format = RETRO_PIXEL_FORMAT_XRGB8888;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 retro_environment(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &format);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 return current_system != NULL;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 /* Loads a "special" kind of game. Should not be used,
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 * except in extreme cases. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 RETRO_API bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 return retro_load_game(info);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 /* Unloads a currently loaded game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 RETRO_API void retro_unload_game(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 free(media.dir);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 free(media.name);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 free(media.extension);
1691
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
198 media.dir = media.name = media.extension = NULL;
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
199 //buffer is freed by the context
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
200 media.buffer = NULL;
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
201 current_system->free_context(current_system);
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
202 current_system = NULL;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 /* Gets region of game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 RETRO_API unsigned retro_get_region(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 return video_standard == VID_NTSC ? RETRO_REGION_NTSC : RETRO_REGION_PAL;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 /* Gets region of memory. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 RETRO_API void *retro_get_memory_data(unsigned id)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 return NULL;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 RETRO_API size_t retro_get_memory_size(unsigned id)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 //blastem render backend API implementation
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 return r << 16 | g << 8 | b;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 uint8_t render_create_window(char *caption, uint32_t width, uint32_t height, window_close_handler close_handler)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 //not supported in lib build
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 void render_destroy_window(uint8_t which)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 //not supported in lib build
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 static uint32_t fb[LINEBUF_SIZE * 294 * 2];
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
240 static uint8_t last_fb;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 uint32_t *render_get_framebuffer(uint8_t which, int *pitch)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 *pitch = LINEBUF_SIZE * sizeof(uint32_t);
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
244 if (which != last_fb) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
245 *pitch = *pitch * 2;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
246 }
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
247
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
248 if (which) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
249 return fb + LINEBUF_SIZE;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
250 } else {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
251 return fb;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
252 }
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 void render_framebuffer_updated(uint8_t which, int width)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 {
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
257 unsigned height = video_standard == VID_NTSC ? 243 : 294;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
258 unsigned base_height = height;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
259 if (which != last_fb) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
260 height *= 2;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
261 last_fb = which;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
262 }
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
263 if (width != last_width || height != last_height) {
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
264 struct retro_game_geometry geometry = {
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
265 .base_width = width,
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
266 .base_height = height,
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
267 .aspect_ratio = (float)LINEBUF_SIZE / base_height
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
268 };
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
269 retro_environment(RETRO_ENVIRONMENT_SET_GEOMETRY, &geometry);
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
270 last_width = width;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
271 last_height = height;
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
272 }
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
273 retro_video_refresh(fb, width, height, LINEBUF_SIZE * sizeof(uint32_t));
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 current_system->request_exit(current_system);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 uint8_t render_get_active_framebuffer(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 void render_set_video_standard(vid_std std)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 video_standard = std;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286
1822
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
287 int render_fullscreen(void)
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
288 {
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
289 return 1;
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
290 }
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
291
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 void process_events()
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 static int16_t prev_state[2][RETRO_DEVICE_ID_JOYPAD_L2];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 static const uint8_t map[] = {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 BUTTON_A, BUTTON_X, BUTTON_MODE, BUTTON_START, DPAD_UP, DPAD_DOWN,
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 DPAD_LEFT, DPAD_RIGHT, BUTTON_B, BUTTON_Y, BUTTON_Z, BUTTON_C
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 };
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 //TODO: handle other input device types
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 //TODO: handle more than 2 ports when appropriate
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 retro_input_poll();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 for (int port = 0; port < 2; port++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 for (int id = RETRO_DEVICE_ID_JOYPAD_B; id < RETRO_DEVICE_ID_JOYPAD_L2; id++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 int16_t new_state = retro_input_state(port, RETRO_DEVICE_JOYPAD, 0, id);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 if (new_state != prev_state[port][id]) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 if (new_state) {
1689
7f42a93f18a4 Have a suitable default IO port configuration when nonIO is present from the config file. Fixed off by one in processing gamepad button events in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
309 current_system->gamepad_down(current_system, port + 1, map[id]);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 } else {
1689
7f42a93f18a4 Have a suitable default IO port configuration when nonIO is present from the config file. Fixed off by one in processing gamepad button events in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
311 current_system->gamepad_up(current_system, port + 1, map[id]);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 prev_state[port][id] = new_state;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 void render_errorbox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 void render_warnbox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 void render_infobox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 struct audio_source {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 int32_t freq;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 int32_t left_accum;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 int32_t right_accum;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 int32_t num_samples;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 };
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 static audio_source *audio_sources[8];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 static uint8_t num_audio_sources;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 audio_source *render_audio_source(uint64_t master_clock, uint64_t sample_divider, uint8_t channels)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 audio_sources[num_audio_sources] = calloc(1, sizeof(audio_source));
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
341 audio_sources[num_audio_sources]->freq = master_clock / sample_divider;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 return audio_sources[num_audio_sources++];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348
1817
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
349 void render_audio_source_gaindb(audio_source *src, float gain)
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
350 {
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
351 //TODO: Implement this once I hook up a core option for individual FM/PSG gain
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
352 }
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
353
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 static void check_put_sample(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 for (int i = 0; i < num_audio_sources; i++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 {
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
358 int32_t min_samples = audio_sources[i]->freq / 53267;
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
359 if (audio_sources[i]->num_samples < min_samples) {
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 return;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 int16_t left = 0, right = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 for (int i = 0; i < num_audio_sources; i++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 left += audio_sources[i]->left_accum / audio_sources[i]->num_samples;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367 right += audio_sources[i]->right_accum / audio_sources[i]->num_samples;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 audio_sources[i]->left_accum = audio_sources[i]->right_accum = audio_sources[i]->num_samples = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 retro_audio_sample(left, right);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 void render_put_mono_sample(audio_source *src, int16_t value)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 src->left_accum += value;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 src->right_accum += value;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 src->num_samples++;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 check_put_sample();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 void render_put_stereo_sample(audio_source *src, int16_t left, int16_t right)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 src->left_accum += left;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 src->right_accum += right;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 src->num_samples++;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 check_put_sample();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 }
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
387
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 void render_free_source(audio_source *src)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 int index;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 for (index = 0; index < num_audio_sources; index++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 if (audio_sources[index] == src) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 break;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 num_audio_sources--;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 audio_sources[index] = audio_sources[num_audio_sources];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 free(src);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 void bindings_set_mouse_mode(uint8_t mode)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404 }
1818
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
405
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
406 extern const char rom_db_data[];
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
407 char *read_bundled_file(char *name, uint32_t *sizeret)
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
408 {
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
409 if (!strcmp(name, "rom.db")) {
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
410 *sizeret = strlen(rom_db_data);
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
411 char *ret = malloc(*sizeret+1);
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
412 memcpy(ret, rom_db_data, *sizeret + 1);
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
413 return ret;
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
414 }
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
415 return NULL;
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
416 }