annotate libblastem.c @ 1925:039553703c20

Don't apply address and cd register changes to the 'live' registers until pending flag is cleared, but do preserve the upper address bits in the latch. Fixes regression in Overdrive 2 while preserving fix to Mona in 344 bytes
author Michael Pavone <pavone@retrodev.com>
date Mon, 13 Apr 2020 20:43:25 -0700
parents 81b059e3ded6
children 94f37e4b1469
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"
1924
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
9 #include "genesis.h"
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
10 #include "sms.h"
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 static retro_environment_t retro_environment;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 RETRO_API void retro_set_environment(retro_environment_t 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 retro_environment = re;
1864
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
16 # define input_descriptor_macro(pad_num) \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
17 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
18 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
19 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
20 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
21 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
22 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
23 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Y" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
24 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
25 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "Z" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
26 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "C" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
27 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Mode" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
28 { pad_num, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, \
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
29
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
30 static const struct retro_input_descriptor desc[] = {
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
31 input_descriptor_macro(0)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
32 input_descriptor_macro(1)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
33 input_descriptor_macro(2)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
34 input_descriptor_macro(3)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
35 input_descriptor_macro(4)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
36 input_descriptor_macro(5)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
37 input_descriptor_macro(6)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
38 input_descriptor_macro(7)
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
39 { 0 },
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
40 };
96323d73b8ab add input descriptors
hizzlekizzle <hizzlekizzle@users.noreply.github.com>
parents: 1822
diff changeset
41
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
42 re(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, (void *)desc);
1687
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 static retro_video_refresh_t retro_video_refresh;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 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
47 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 retro_video_refresh = rvf;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 static retro_audio_sample_t retro_audio_sample;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 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
53 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 retro_audio_sample = ras;
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_set_audio_sample_batch(retro_audio_sample_batch_t rasb)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 static retro_input_poll_t retro_input_poll;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 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
63 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 retro_input_poll = rip;
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 static retro_input_state_t retro_input_state;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 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
69 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 retro_input_state = ris;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 int headless = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 int exit_after = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 int z80_enabled = 1;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 char *save_filename;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 tern_node *config;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 uint8_t use_native_states = 1;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 system_header *current_system;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 system_media media;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 RETRO_API void retro_init(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 RETRO_API void retro_deinit(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 {
1691
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
88 if (current_system) {
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
89 retro_unload_game();
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
90 }
1687
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 RETRO_API unsigned retro_api_version(void)
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 return RETRO_API_VERSION;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 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
99 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 info->library_name = "BlastEm";
1819
4fb9af0c65b6 Update verison number in liblastem.c
Mike Pavone <pavone@retrodev.com>
parents: 1818
diff changeset
101 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
102 info->valid_extensions = "md|gen|sms|bin|rom";
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 info->need_fullpath = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 info->block_extract = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 static vid_std video_standard;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
108 static uint32_t last_width, last_height;
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
109 static uint32_t overscan_top, overscan_bot, overscan_left, overscan_right;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
110 static void update_overscan(void)
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
111 {
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
112 uint8_t overscan;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
113 retro_environment(RETRO_ENVIRONMENT_GET_OVERSCAN, &overscan);
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
114 if (overscan) {
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
115 overscan_top = overscan_bot = overscan_left = overscan_right = 0;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
116 } else {
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
117 if (video_standard == VID_NTSC) {
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
118 overscan_top = 11;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
119 overscan_bot = 8;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
120 overscan_left = 13;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
121 overscan_right = 14;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
122 } else {
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
123 overscan_top = 30;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
124 overscan_bot = 24;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
125 overscan_left = 13;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
126 overscan_right = 14;
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
127 }
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
128 }
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
129 }
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
130
1889
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
131 static int32_t sample_rate;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 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
133 {
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
134 update_overscan();
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
135 last_width = LINEBUF_SIZE;
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
136 info->geometry.base_width = info->geometry.max_width = LINEBUF_SIZE - (overscan_left + overscan_right);
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
137 info->geometry.base_height = (video_standard == VID_NTSC ? 243 : 294) - (overscan_top + overscan_bot);
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
138 last_height = info->geometry.base_height;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
139 info->geometry.max_height = info->geometry.base_height * 2;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 info->geometry.aspect_ratio = 0;
1889
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
141 double master_clock = video_standard == VID_NTSC ? 53693175 : 53203395;
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
142 double lines = video_standard == VID_NTSC ? 262 : 313;
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
143 info->timing.fps = master_clock / (3420.0 * lines);
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
144 info->timing.sample_rate = master_clock / (7 * 6 * 24); //sample rate of YM2612
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
145 sample_rate = info->timing.sample_rate;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 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
149 {
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 /* Resets the current game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 RETRO_API void retro_reset(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 current_system->soft_reset(current_system);
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 /* Runs the game for one video frame.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 * 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
160 *
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 * 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
162 * 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
163 * a frame if GET_CAN_DUPE returns true.
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 * 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
165 */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 static uint8_t started;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 RETRO_API void retro_run(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 if (started) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 current_system->resume_context(current_system);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 } else {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 current_system->start_context(current_system, NULL);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 started = 1;
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 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 /* Returns the amount of data the implementation requires to serialize
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 * internal state (save states).
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 * Between calls to retro_load_game() and retro_unload_game(), the
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 * 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
181 * 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
182 */
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
183 static size_t serialize_size_cache;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 RETRO_API size_t retro_serialize_size(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
186 if (!serialize_size_cache) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
187 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
188 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
189 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
190 return serialize_size_cache;
1687
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 /* Serializes internal state. If failed, or size is lower than
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 * retro_serialize_size(), it should return false, true otherwise. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 RETRO_API bool retro_serialize(void *data, size_t size)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
197 size_t actual_size;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
198 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
199 if (actual_size > size) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
200 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
201 return 0;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
202 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
203 memcpy(data, tmp, actual_size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
204 free(tmp);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
205 return 1;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 }
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 RETRO_API bool retro_unserialize(const void *data, size_t size)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
210 current_system->deserialize(current_system, (uint8_t *)data, size);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 }
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 RETRO_API void retro_cheat_reset(void)
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 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
219 {
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 /* Loads a game. */
1924
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
223 static system_type stype;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 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
225 {
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
226 serialize_size_cache = 0;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 if (game->path) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 media.dir = path_dirname(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 media.name = basename_no_extension(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 media.extension = path_extension(game->path);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 media.buffer = malloc(nearest_pow2(game->size));
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 memcpy(media.buffer, game->data, game->size);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 media.size = game->size;
1924
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
235 stype = detect_system_type(&media);
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
236 current_system = alloc_config_system(stype, &media, 0, 0);
1687
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 unsigned format = RETRO_PIXEL_FORMAT_XRGB8888;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 retro_environment(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &format);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 return current_system != NULL;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 }
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 /* Loads a "special" kind of game. Should not be used,
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 * except in extreme cases. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 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
246 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 return retro_load_game(info);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 /* Unloads a currently loaded game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 RETRO_API void retro_unload_game(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 free(media.dir);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 free(media.name);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 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
256 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
257 //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
258 media.buffer = NULL;
e96d0d3bec7f Don't leak a system context when a game is unloaded
Mike Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
259 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
260 current_system = NULL;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 /* Gets region of game. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 RETRO_API unsigned retro_get_region(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 return video_standard == VID_NTSC ? RETRO_REGION_NTSC : RETRO_REGION_PAL;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 /* Gets region of memory. */
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 RETRO_API void *retro_get_memory_data(unsigned id)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 {
1924
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
272 if (id == RETRO_MEMORY_SYSTEM_RAM)
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
273 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
274 switch (stype)
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
275 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
276 case SYSTEM_GENESIS:
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
277 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
278 genesis_context *gen = (genesis_context *)current_system;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
279 return (uint8_t *)gen->work_ram;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
280 }
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
281 break;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
282 #ifndef NO_Z80
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
283 case SYSTEM_SMS:
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
284 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
285 sms_context *sms = (sms_context *)current_system;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
286 return sms->ram;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
287 }
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
288 break;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
289 #endif
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
290 }
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
291 }
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 return NULL;
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
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 RETRO_API size_t retro_get_memory_size(unsigned id)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 {
1924
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
297 if (id == RETRO_MEMORY_SYSTEM_RAM)
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
298 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
299 switch (stype)
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
300 {
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
301 case SYSTEM_GENESIS:
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
302 return RAM_WORDS * sizeof(uint16_t);
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
303 #ifndef NO_Z80
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
304 case SYSTEM_SMS:
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
305 return SMS_RAM_SIZE;
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
306 #endif
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
307 }
81b059e3ded6 Add memory hook for cheat/rumble/cheevos support
negativeExponent <negativeExponent@users.noreply.github.com>
parents: 1889
diff changeset
308 }
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 //blastem render backend API implementation
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 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
314 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 return r << 16 | g << 8 | b;
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 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
319 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 //not supported in lib build
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 return 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 }
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 void render_destroy_window(uint8_t which)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 //not supported in lib build
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 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
330 static uint8_t last_fb;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 uint32_t *render_get_framebuffer(uint8_t which, int *pitch)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 *pitch = LINEBUF_SIZE * sizeof(uint32_t);
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
334 if (which != last_fb) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
335 *pitch = *pitch * 2;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
336 }
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
337
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
338 if (which) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
339 return fb + LINEBUF_SIZE;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
340 } else {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
341 return fb;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
342 }
1687
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_framebuffer_updated(uint8_t which, int width)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 {
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
347 unsigned height = (video_standard == VID_NTSC ? 243 : 294) - (overscan_top + overscan_bot);
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
348 width -= (overscan_left + overscan_right);
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
349 unsigned base_height = height;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
350 if (which != last_fb) {
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
351 height *= 2;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
352 last_fb = which;
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
353 }
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
354 if (width != last_width || height != last_height) {
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
355 struct retro_game_geometry geometry = {
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
356 .base_width = width,
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
357 .base_height = height,
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
358 .aspect_ratio = (float)LINEBUF_SIZE / base_height
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
359 };
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
360 retro_environment(RETRO_ENVIRONMENT_SET_GEOMETRY, &geometry);
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
361 last_width = width;
1695
3c34122754ac Properly support interlace in libretro build
Michael Pavone <pavone@retrodev.com>
parents: 1694
diff changeset
362 last_height = height;
1694
9e4dd1595f37 Fix aspect ratio for H32 games
Michael Pavone <pavone@retrodev.com>
parents: 1691
diff changeset
363 }
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
364 retro_video_refresh(fb + overscan_left + LINEBUF_SIZE * overscan_top, width, height, LINEBUF_SIZE * sizeof(uint32_t));
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 current_system->request_exit(current_system);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 uint8_t render_get_active_framebuffer(void)
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 return 0;
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_set_video_standard(vid_std std)
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 video_standard = std;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377
1822
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
378 int render_fullscreen(void)
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
379 {
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
380 return 1;
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
381 }
8500bd987dda Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents: 1819
diff changeset
382
1881
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
383 uint32_t render_overscan_top()
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
384 {
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
385 return overscan_top;
1881
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
386 }
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
387
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
388 uint32_t render_overscan_bot()
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
389 {
1882
62e8a8833e39 Implement overscan crop in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1881
diff changeset
390 return overscan_bot;
1881
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
391 }
55198fc9cc1f Don't render lines that are cropped by overscan. Allows submitting frame earlier when bottom overscan is non-zero which can reduce latency in some cases
Mike Pavone <pavone@retrodev.com>
parents: 1868
diff changeset
392
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 void process_events()
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 static int16_t prev_state[2][RETRO_DEVICE_ID_JOYPAD_L2];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 static const uint8_t map[] = {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 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
398 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
399 };
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 //TODO: handle other input device types
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 //TODO: handle more than 2 ports when appropriate
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 retro_input_poll();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 for (int port = 0; port < 2; port++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
405 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
406 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 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
408 if (new_state != prev_state[port][id]) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 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
410 current_system->gamepad_down(current_system, port + 1, map[id]);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 } 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
412 current_system->gamepad_up(current_system, port + 1, map[id]);
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 prev_state[port][id] = new_state;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 void render_errorbox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 void render_warnbox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 void render_infobox(char *title, char *message)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429
1868
bfacedbae5f0 Fix libretro and stateview targets
Michael Pavone <pavone@retrodev.com>
parents: 1864
diff changeset
430 typedef struct {
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 int32_t freq;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 int32_t left_accum;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 int32_t right_accum;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 int32_t num_samples;
1868
bfacedbae5f0 Fix libretro and stateview targets
Michael Pavone <pavone@retrodev.com>
parents: 1864
diff changeset
435 } audio_source;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 static audio_source *audio_sources[8];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 static uint8_t num_audio_sources;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 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
440 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 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
442 audio_sources[num_audio_sources]->freq = master_clock / sample_divider;
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 return audio_sources[num_audio_sources++];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 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
447 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449
1817
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
450 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
451 {
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
452 //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
453 }
03895a4585c3 Fix build breakage for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1695
diff changeset
454
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 static void check_put_sample(void)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 for (int i = 0; i < num_audio_sources; i++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 {
1889
377f110e4cea Report more accurate frame and sample rates to frontend in libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1882
diff changeset
459 int32_t min_samples = audio_sources[i]->freq / sample_rate;
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
460 if (audio_sources[i]->num_samples < min_samples) {
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 return;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 int16_t left = 0, right = 0;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 for (int i = 0; i < num_audio_sources; i++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 left += audio_sources[i]->left_accum / audio_sources[i]->num_samples;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 right += audio_sources[i]->right_accum / audio_sources[i]->num_samples;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 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
470 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 retro_audio_sample(left, right);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 void render_put_mono_sample(audio_source *src, int16_t value)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 src->left_accum += value;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 src->right_accum += value;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 src->num_samples++;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 check_put_sample();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 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
482 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 src->left_accum += left;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 src->right_accum += right;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 src->num_samples++;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 check_put_sample();
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 }
1688
395f684c5379 Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1687
diff changeset
488
1687
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 void render_free_source(audio_source *src)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 int index;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 for (index = 0; index < num_audio_sources; index++)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 if (audio_sources[index] == src) {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 break;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 num_audio_sources--;
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 audio_sources[index] = audio_sources[num_audio_sources];
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 free(src);
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 }
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 void bindings_set_mouse_mode(uint8_t mode)
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 {
6c54bb5fe3b3 Hacky WIP libertro implementation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 }
1818
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
506
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
507 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
508 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
509 {
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
510 if (!strcmp(name, "rom.db")) {
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
511 *sizeret = strlen(rom_db_data);
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
512 char *ret = malloc(*sizeret+1);
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
513 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
514 return ret;
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
515 }
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
516 return NULL;
243f3a7247f9 Include ROM DB in library binary for libretro target
Mike Pavone <pavone@retrodev.com>
parents: 1817
diff changeset
517 }