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
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;
3537static retro_input_poll_t input_poll_cb;
3638static retro_input_state_t input_state_cb;
3739
40+ // Global core state
3841static bool is_raccoon;
3942static std::shared_ptr<z8::vm_base> vm;
4043static 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
7660EXPORT 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+
127122EXPORT 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