Skip to content

Commit 6cd5cac

Browse files
committed
retro: implement joypad input.
1 parent b02910b commit 6cd5cac

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

src/libretro.cpp

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#endif
1616

1717
#include <lol/msg> // lol::msg
18+
#include <array> // std::array
1819
#include <cstring> // std::memset
1920
#include <memory> // std::shared_ptr
2021
#include <vector> // std::vector
@@ -23,6 +24,7 @@
2324
#include "pico8/vm.h"
2425
#include "pico8/pico8.h"
2526
#include "raccoon/vm.h"
27+
2628
#include "libretro.h"
2729

2830
#define EXPORT extern "C" RETRO_API
@@ -35,6 +37,7 @@ static retro_environment_t enviro_cb;
3537
static retro_input_poll_t input_poll_cb;
3638
static retro_input_state_t input_state_cb;
3739

40+
// Global core state
3841
static bool is_raccoon;
3942
static std::shared_ptr<z8::vm_base> vm;
4043
static lol::array2d<lol::u8vec4> fb32;
@@ -48,30 +51,11 @@ EXPORT void retro_set_environment(retro_environment_t cb)
4851
enviro_cb(RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME, &no_rom);
4952
}
5053

51-
EXPORT void retro_set_video_refresh(retro_video_refresh_t cb)
52-
{
53-
video_cb = cb;
54-
}
55-
56-
EXPORT void retro_set_audio_sample(retro_audio_sample_t cb)
57-
{
58-
audio_cb = cb;
59-
}
60-
61-
EXPORT void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb)
62-
{
63-
audio_batch_cb = cb;
64-
}
65-
66-
EXPORT void retro_set_input_poll(retro_input_poll_t cb)
67-
{
68-
input_poll_cb = cb;
69-
}
70-
71-
EXPORT void retro_set_input_state(retro_input_state_t cb)
72-
{
73-
input_state_cb = cb;
74-
}
54+
EXPORT void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
55+
EXPORT void retro_set_audio_sample(retro_audio_sample_t cb) { audio_cb = cb; }
56+
EXPORT void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_batch_cb = cb; }
57+
EXPORT void retro_set_input_poll(retro_input_poll_t cb) { input_poll_cb = cb; }
58+
EXPORT void retro_set_input_state(retro_input_state_t cb) { input_state_cb = cb; }
7559

7660
EXPORT void retro_init()
7761
{
@@ -97,7 +81,7 @@ EXPORT void retro_get_system_info(struct retro_system_info *info)
9781
memset(info, 0, sizeof(*info));
9882
info->library_name = "zepto8";
9983
info->library_version = PACKAGE_VERSION;
100-
info->valid_extensions = "p8|png|rcn.json";
84+
info->valid_extensions = "p8|p8.png|rcn.json";
10185
info->need_fullpath = true; // we load our own carts for now
10286
}
10387

@@ -124,14 +108,29 @@ EXPORT void retro_reset()
124108
{
125109
}
126110

111+
static std::array<int, 7> buttons
112+
{
113+
RETRO_DEVICE_ID_JOYPAD_LEFT,
114+
RETRO_DEVICE_ID_JOYPAD_RIGHT,
115+
RETRO_DEVICE_ID_JOYPAD_UP,
116+
RETRO_DEVICE_ID_JOYPAD_DOWN,
117+
RETRO_DEVICE_ID_JOYPAD_A,
118+
RETRO_DEVICE_ID_JOYPAD_B,
119+
RETRO_DEVICE_ID_JOYPAD_START,
120+
};
121+
127122
EXPORT void retro_run()
128123
{
129124
// Update input
125+
input_poll_cb();
126+
for (int n = 0; n < 8; ++n)
127+
for (int k = 0; k < 7; ++k)
128+
vm->button(8 * n + k, input_state_cb(n, RETRO_DEVICE_JOYPAD, 0, buttons[k]));
130129

131130
// Step VM
132131
vm->step(1.f / 60);
133132

134-
// Render video, convert to RGB565
133+
// Render video, convert to RGB565, send back to frontend
135134
vm->render(fb32.data());
136135
for (int y = 0; y < 128; ++y)
137136
for (int x = 0; x < 128; ++x)

0 commit comments

Comments
 (0)