From 0cbb535d81816153a45f63e1dc4e20bd384f637a Mon Sep 17 00:00:00 2001 From: Hay1tsme Date: Sat, 7 Jun 2025 15:09:37 -0400 Subject: [PATCH] love live io --- board/config.c | 9 +++++ board/config.h | 2 + board/k9101258.c | 43 ++++++++++++++++++---- board/k9101258.h | 18 ++++----- ll3hook/config.c | 1 + ll3hook/config.h | 1 + ll3hook/dllmain.c | 11 +++--- ll3hook/ll3-dll.c | 7 +--- ll3hook/ll3-dll.h | 3 +- ll3hook/ll3hook.def | 3 +- ll3hook/meson.build | 2 + ll3hook/usbio.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ ll3hook/usbio.h | 6 +++ ll3io/config.c | 36 +++++++++--------- ll3io/config.h | 27 +++++++------- ll3io/ll3io.c | 67 ++++++++++++++++++++++++--------- ll3io/ll3io.h | 44 +++++++++------------- ri/ri.c | 2 +- sivaio/config.c | 1 + 19 files changed, 264 insertions(+), 109 deletions(-) create mode 100644 ll3hook/usbio.c create mode 100644 ll3hook/usbio.h diff --git a/board/config.c b/board/config.c index 32d6a73..0d8e9e5 100644 --- a/board/config.c +++ b/board/config.c @@ -26,3 +26,12 @@ void k92x0249_config_load(struct k92x0249_config *cfg, const wchar_t *filename) wcstombs_s(NULL, cfg->serial, sizeof(cfg->serial), wserial, sizeof(cfg->serial) - 1); } + +void k9101258_config_load(struct usbio_config *cfg, const wchar_t *filename) +{ + assert(cfg != NULL); + assert(filename != NULL); + wchar_t wserial[17]; + + cfg->enabled = GetPrivateProfileIntW(L"usbio", L"enable", 1, filename); +} diff --git a/board/config.h b/board/config.h index 8ba43a8..5e7b51e 100644 --- a/board/config.h +++ b/board/config.h @@ -5,6 +5,8 @@ #include "board/io4.h" #include "board/k92x0249.h" +#include "board/k9101258.h" void io4_config_load(struct io4_config *cfg, const wchar_t *filename); void k92x0249_config_load(struct k92x0249_config *cfg, const wchar_t *filename); +void k9101258_config_load(struct usbio_config *cfg, const wchar_t *filename); diff --git a/board/k9101258.c b/board/k9101258.c index 424c4e3..82fd00b 100644 --- a/board/k9101258.c +++ b/board/k9101258.c @@ -21,14 +21,12 @@ // USB IO, A/B/C variants static const uint8_t base_bfr[64] = { - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // 6: gamebtns, 7: door sw, 4: game/opt btns - 0xFF, 0xFF, 0xFF, 0x00, 0x35, 0x00, 0x00, 0x00, // 12 - coin count, 13 - coin jam (64) - //0xF0, 0xCA, 0x79, 0xE0, 0x08, 0xE3, 0x70, 0xE2, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, // 6: gamebtns, 7: door sw, 4: game/opt btns + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, // 12 - coin count, 13 - coin jam (64) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 16 - 31 possibly analog in? - //0x7C, 0xEB, 0x3C, 0xDB, 0x84, 0xDE, 0xF0, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38/39 system buttons? - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reader stuff? + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, // Reader stuff? 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; @@ -41,8 +39,16 @@ static const wchar_t usbio_path[] = L"$usbio"; static HANDLE usbio_fd; static void *usbio_ops_ctx; +static struct usbio_ops ops = { + .digital_in = NULL, + .digital_out = NULL, + .analog_in = NULL, + .analog_out = NULL, + .reader_poll = NULL, + .reader_led_out = NULL, +}; -HRESULT k9101258_hook_init() +HRESULT k9101258_hook_init(const struct usbio_ops *ioops, void *ctx) { HRESULT hr; @@ -52,6 +58,9 @@ HRESULT k9101258_hook_init() return hr; } + ops.digital_in = ioops->digital_in; + usbio_ops_ctx = ctx; + // only idVendor, idProduct and bcdDevice are actually read it seems struct _USB_DEVICE_DESCRIPTOR desc = { .bLength = sizeof(USB_DEVICE_DESCRIPTOR), @@ -92,7 +101,27 @@ HRESULT k9101258_hook_init() static void read_pipe(void *ctx, uint8_t *bfr, uint32_t bfr_len, uint32_t *len_tx) { memcpy_s(bfr, bfr_len, base_bfr, sizeof(base_bfr)); - *len_tx = 64; + *len_tx = sizeof(base_bfr); + + uint32_t coinct = 0; + uint8_t buttons[4] = {0}; + uint16_t analog[8] = {0}; + uint8_t card_id[16] = {0}; + + if (ops.digital_in != NULL) { + ops.digital_in(usbio_ops_ctx, buttons, &coinct); + memcpy_s(bfr + 4, bfr_len - 4, buttons, sizeof(buttons)); + bfr[12] = coinct % 255; + } + + if (ops.analog_in != NULL) { + ops.analog_in(usbio_ops_ctx, analog); + } + + if (ops.reader_poll != NULL) { + ops.reader_poll(usbio_ops_ctx, card_id); + memcpy_s(bfr + 48, bfr_len - 48, card_id, sizeof(card_id)); + } } static void write_pipe(void *ctx, uint8_t *bfr, uint32_t bfr_len, uint32_t *len_tx) diff --git a/board/k9101258.h b/board/k9101258.h index e63bc06..af52fa3 100644 --- a/board/k9101258.h +++ b/board/k9101258.h @@ -4,21 +4,19 @@ #include #pragma pack(push,1) +struct usbio_config { + bool enabled; +}; -// needs to handle digital and analog reads and writes, coin stuff, and -// having an ad-on device (usually a card reader) and maybe an SD card?? - -// Mayhaps move this to a seperate thing in the event a second USB IO -// providor is needed? struct usbio_ops { - void (*digital_in)(void *ctx, uint32_t *out); + void (*digital_in)(void *ctx, uint8_t out[4], uint32_t *coin_ct); void (*digital_out)(void *ctx); // TODO: digital outputs void (*analog_in)(void *ctx, uint16_t out[8]); - bool (*is_coin_pressed)(void *ctx); - void (*reader_poll)(void *ctx); // TODO: reader struct? - void (*reader_led_out)(void *ctx); // TODO: reader struct? + void (*analog_out)(void *ctx); // TODO: confirm we even have analog out lol + void (*reader_poll)(void *ctx, uint8_t card_id[16]); + void (*reader_led_out)(void *ctx, uint32_t rgb); }; #pragma pack(pop) -HRESULT k9101258_hook_init(); +HRESULT k9101258_hook_init(const struct usbio_ops *ioops, void *ctx); diff --git a/ll3hook/config.c b/ll3hook/config.c index 450b8f9..e183bfd 100644 --- a/ll3hook/config.c +++ b/ll3hook/config.c @@ -33,4 +33,5 @@ void ll3_hook_config_load( ll3_dll_config_load(&cfg->dll, filename); gfx_config_load(&cfg->gfx, filename); printer_config_load(&cfg->printer, filename); + k9101258_config_load(&cfg->usbio, filename); } \ No newline at end of file diff --git a/ll3hook/config.h b/ll3hook/config.h index 3fb6eaa..54eac67 100644 --- a/ll3hook/config.h +++ b/ll3hook/config.h @@ -14,6 +14,7 @@ struct ll3_hook_config { struct ll3_dll_config dll; struct gfx_config gfx; struct printer_config printer; + struct usbio_config usbio; }; void ll3_hook_config_load( diff --git a/ll3hook/dllmain.c b/ll3hook/dllmain.c index cd14208..b1e5176 100644 --- a/ll3hook/dllmain.c +++ b/ll3hook/dllmain.c @@ -14,6 +14,7 @@ #include "ll3hook/config.h" #include "ll3hook/ll3-dll.h" +#include "ll3hook/usbio.h" #include "platform/platform.h" @@ -43,11 +44,6 @@ static DWORD CALLBACK ll3_pre_startup(void) printer_hook_init(&ll3_hook_cfg.printer, 0, ll3_hook_mod); - hr = k9101258_hook_init(); - if (FAILED(hr)) { - goto fail; - } - /* Initialize emulation hooks */ hr = platform_hook_init( @@ -65,6 +61,11 @@ static DWORD CALLBACK ll3_pre_startup(void) goto fail; } + hr = ll3_usbio_init(&ll3_hook_cfg.usbio); + if (FAILED(hr)) { + goto fail; + } + /* Initialize debug helpers */ spike_hook_init(L".\\taitools.ini"); diff --git a/ll3hook/ll3-dll.c b/ll3hook/ll3-dll.c index 836e507..8ba659a 100644 --- a/ll3hook/ll3-dll.c +++ b/ll3hook/ll3-dll.c @@ -13,11 +13,8 @@ const struct dll_bind_sym ll3_dll_syms[] = { .sym = "ll3_io_init", .off = offsetof(struct ll3_dll, init), }, { - .sym = "ll3_io_read_coin_counter", - .off = offsetof(struct ll3_dll, read_coin_counter), - }, { - .sym = "ll3_io_get_btns", - .off = offsetof(struct ll3_dll, get_btns), + .sym = "ll3_io_poll", + .off = offsetof(struct ll3_dll, poll), }, }; diff --git a/ll3hook/ll3-dll.h b/ll3hook/ll3-dll.h index 34febd8..9e2da23 100644 --- a/ll3hook/ll3-dll.h +++ b/ll3hook/ll3-dll.h @@ -7,8 +7,7 @@ struct ll3_dll { uint16_t api_version; HRESULT (*init)(void); - void (*read_coin_counter)(uint16_t *coins, uint16_t *services); - void (*get_btns)(uint8_t *btn, uint8_t *stick); + void (*poll)(uint16_t *game_btn, uint8_t *sys_btn, uint32_t *coinct); }; struct ll3_dll_config { diff --git a/ll3hook/ll3hook.def b/ll3hook/ll3hook.def index aee1cd5..224b9eb 100644 --- a/ll3hook/ll3hook.def +++ b/ll3hook/ll3hook.def @@ -3,5 +3,4 @@ LIBRARY ll3hook EXPORTS ll3_io_get_api_version ll3_io_init - ll3_io_read_coin_counter - ll3_io_get_btns \ No newline at end of file + ll3_io_poll \ No newline at end of file diff --git a/ll3hook/meson.build b/ll3hook/meson.build index 3d801d3..404ccad 100644 --- a/ll3hook/meson.build +++ b/ll3hook/meson.build @@ -22,5 +22,7 @@ shared_library( 'dllmain.c', 'll3-dll.c', 'll3-dll.h', + 'usbio.c', + 'usbio.h', ], ) diff --git a/ll3hook/usbio.c b/ll3hook/usbio.c new file mode 100644 index 0000000..81fa9b7 --- /dev/null +++ b/ll3hook/usbio.c @@ -0,0 +1,90 @@ +#include +#include + +#include "ll3hook/usbio.h" +#include "ll3hook/ll3-dll.h" +#include "ll3io/ll3io.h" +#include "util/dprintf.h" + +static void get_buttons(void *ctx, uint8_t out[4], uint32_t *coin_ct); + +HRESULT ll3_usbio_init(const struct usbio_config *cfg) +{ + if (!cfg->enabled) { + return S_FALSE; + } + + ll3_dll.init(); + + struct usbio_ops ops = { + .digital_in = get_buttons, + .digital_out = NULL, + .analog_in = NULL, + .analog_out = NULL, + .reader_poll = NULL, + .reader_led_out = NULL, + }; + + return k9101258_hook_init(&ops, NULL); +} + +static void get_buttons(void *ctx, uint8_t out[4], uint32_t *coin_ct) +{ + uint16_t gamebtn = 0; + uint8_t sysbtn = 0; + ll3_dll.poll(&gamebtn, &sysbtn, coin_ct); + + // Door switches + out[3] |= 0xFC; + + if (sysbtn & LL3_SYSBTN_TEST) { + out[0] |= 0x20; + } + if (sysbtn & LL3_SYSBTN_SERVICE) { + out[0] |= 0x40; + } + if (sysbtn & LL3_SYSBTN_SELECT) { + out[0] |= 0x10; + } + if (sysbtn & LL3_SYSBTN_ENTER) { + out[2] |= 0x80; + } + if (sysbtn & LL3_SYSBTN_COIN) { + out[0] |= 0x80; + } + + if (gamebtn & LL3_BTN1) { + out[2] |= 0x01; + } + if (gamebtn & LL3_BTN2) { + out[2] |= 0x02; + } + if (gamebtn & LL3_BTN3) { + out[2] |= 0x04; + } + if (gamebtn & LL3_BTN4) { + out[2] |= 0x08; + } + if (gamebtn & LL3_BTN5) { + out[2] |= 0x10; + } + if (gamebtn & LL3_BTN6) { + out[2] |= 0x20; + } + if (gamebtn & LL3_BTN7) { + out[2] |= 0x40; + } + if (gamebtn & LL3_BTN8) { + out[0] |= 0x01; + } + if (gamebtn & LL3_BTN9) { + out[0] |= 0x02; + } + if (gamebtn & LL3_BTN_CANCEL) { + out[0] |= 0x04; + } + if (gamebtn & LL3_BTN_DECIDE) { + out[0] |= 0x08; + } + +} \ No newline at end of file diff --git a/ll3hook/usbio.h b/ll3hook/usbio.h new file mode 100644 index 0000000..7470043 --- /dev/null +++ b/ll3hook/usbio.h @@ -0,0 +1,6 @@ +#pragma once +#include + +#include "board/k9101258.h" + +HRESULT ll3_usbio_init(const struct usbio_config *cfg); diff --git a/ll3io/config.c b/ll3io/config.c index 2ebc3d1..182a659 100644 --- a/ll3io/config.c +++ b/ll3io/config.c @@ -8,23 +8,21 @@ void ll3_io_config_load(struct ll3_input_config *cfg, const wchar_t *filename) { - cfg->test = GetPrivateProfileIntW(L"jvs", L"test", VK_HOME, filename); - cfg->service = GetPrivateProfileIntW(L"jvs", L"service", VK_DELETE, filename); - cfg->coin = GetPrivateProfileIntW(L"jvs", L"coin", VK_INSERT, filename); + cfg->test = GetPrivateProfileIntW(L"usbio", L"test", VK_HOME, filename); + cfg->service = GetPrivateProfileIntW(L"usbio", L"service", VK_DELETE, filename); + cfg->select = GetPrivateProfileIntW(L"usbio", L"select", VK_END, filename); + cfg->enter = GetPrivateProfileIntW(L"usbio", L"enter", VK_RSHIFT, filename); + cfg->coin = GetPrivateProfileIntW(L"usbio", L"coin", VK_INSERT, filename); - cfg->is_xinput = GetPrivateProfileIntW(L"deck", L"deck", 0, filename); - cfg->xinput_player = GetPrivateProfileIntW(L"deck", L"controller_num", 0, filename); - - cfg->btn_l = GetPrivateProfileIntW(L"deck", L"left_button", 'C', filename); - cfg->btn_r = GetPrivateProfileIntW(L"deck", L"right_button", 'N', filename); - - cfg->stick_l_up = GetPrivateProfileIntW(L"deck", L"left_stick_up", 'W', filename); - cfg->stick_l_right = GetPrivateProfileIntW(L"deck", L"left_stick_right", 'D', filename); - cfg->stick_l_down = GetPrivateProfileIntW(L"deck", L"left_stick_down", 'S', filename); - cfg->stick_l_left = GetPrivateProfileIntW(L"deck", L"left_stick_left", 'A', filename); - - cfg->stick_r_up = GetPrivateProfileIntW(L"deck", L"right_stick_up", 'I', filename); - cfg->stick_r_right = GetPrivateProfileIntW(L"deck", L"right_stick_right", 'L', filename); - cfg->stick_r_down = GetPrivateProfileIntW(L"deck", L"right_stick_down", 'K', filename); - cfg->stick_r_left = GetPrivateProfileIntW(L"deck", L"right_stick_left", 'J', filename); -} \ No newline at end of file + cfg->btn1 = GetPrivateProfileIntW(L"usbio", L"rhythm_1", '1', filename); + cfg->btn2 = GetPrivateProfileIntW(L"usbio", L"rhythm_2", '2', filename); + cfg->btn3 = GetPrivateProfileIntW(L"usbio", L"rhythm_3", '3', filename); + cfg->btn4 = GetPrivateProfileIntW(L"usbio", L"rhythm_4", '4', filename); + cfg->btn5 = GetPrivateProfileIntW(L"usbio", L"rhythm_5", '5', filename); + cfg->btn6 = GetPrivateProfileIntW(L"usbio", L"rhythm_6", '6', filename); + cfg->btn7 = GetPrivateProfileIntW(L"usbio", L"rhythm_7", '7', filename); + cfg->btn8 = GetPrivateProfileIntW(L"usbio", L"rhythm_8", '8', filename); + cfg->btn9 = GetPrivateProfileIntW(L"usbio", L"rhythm_9", '9', filename); + cfg->btn_decide = GetPrivateProfileIntW(L"usbio", L"decide", '-', filename); + cfg->btn_cancel = GetPrivateProfileIntW(L"usbio", L"cancel", '=', filename); +} diff --git a/ll3io/config.h b/ll3io/config.h index 475f1e5..6cdac28 100644 --- a/ll3io/config.h +++ b/ll3io/config.h @@ -5,23 +5,22 @@ #pragma pack(push, 1) struct ll3_input_config { - uint8_t is_xinput; - uint8_t xinput_player; - uint8_t test; uint8_t service; + uint8_t select; + uint8_t enter; uint8_t coin; - uint8_t btn_l; - uint8_t btn_r; - - uint8_t stick_l_up; - uint8_t stick_l_right; - uint8_t stick_l_down; - uint8_t stick_l_left; - uint8_t stick_r_up; - uint8_t stick_r_right; - uint8_t stick_r_down; - uint8_t stick_r_left; + uint8_t btn1; + uint8_t btn2; + uint8_t btn3; + uint8_t btn4; + uint8_t btn5; + uint8_t btn6; + uint8_t btn7; + uint8_t btn8; + uint8_t btn9; + uint8_t btn_decide; + uint8_t btn_cancel; }; #pragma pack(pop) diff --git a/ll3io/ll3io.c b/ll3io/ll3io.c index e567903..b632c4f 100644 --- a/ll3io/ll3io.c +++ b/ll3io/ll3io.c @@ -12,8 +12,7 @@ static bool ll3_io_coin = false; static bool ll3_io_service = false; -static uint16_t ll3_coin_ct = 0; -static uint16_t ll3_service_ct = 0; +static uint32_t ll3_coin_ct = 0; static struct ll3_input_config cfg; uint16_t ll3_io_get_api_version(void) @@ -28,20 +27,10 @@ HRESULT ll3_io_init(void) return S_OK; } -void ll3_io_get_btns(uint8_t *btn, uint8_t *stick) -{ - if (GetAsyncKeyState(cfg.test) & 0x8000) { - *btn |= ll3_BTN_TEST; - } - - if (GetAsyncKeyState(cfg.service) & 0x8000) { - *btn |= ll3_BTN_SERVICE; - } -} - -void ll3_io_read_coin_counter(uint16_t *coins, uint16_t *services) +void ll3_io_poll(uint16_t *game_btn, uint8_t *sys_btn, uint32_t *coinct) { if (GetAsyncKeyState(cfg.coin) & 0x8000) { + *sys_btn |= LL3_SYSBTN_COIN; if (!ll3_io_coin) { ll3_io_coin = true; ll3_coin_ct++; @@ -51,14 +40,58 @@ void ll3_io_read_coin_counter(uint16_t *coins, uint16_t *services) } if (GetAsyncKeyState(cfg.service) & 0x8000) { + *sys_btn |= LL3_SYSBTN_SERVICE; if (!ll3_io_service) { ll3_io_service = true; - ll3_service_ct++; + ll3_coin_ct++; } } else { ll3_io_service = false; } - *coins = ll3_coin_ct; - *services = ll3_service_ct; + *coinct = ll3_coin_ct; + + if (GetAsyncKeyState(cfg.test) & 0x8000) { + *sys_btn |= LL3_SYSBTN_TEST; + } + if (GetAsyncKeyState(cfg.enter) & 0x8000) { + *sys_btn |= LL3_SYSBTN_ENTER; + } + if (GetAsyncKeyState(cfg.select) & 0x8000) { + *sys_btn |= LL3_SYSBTN_SELECT; + } + + if (GetAsyncKeyState(cfg.btn1) & 0x8000) { + *game_btn |= LL3_BTN1; + } + if (GetAsyncKeyState(cfg.btn2) & 0x8000) { + *game_btn |= LL3_BTN2; + } + if (GetAsyncKeyState(cfg.btn3) & 0x8000) { + *game_btn |= LL3_BTN3; + } + if (GetAsyncKeyState(cfg.btn4) & 0x8000) { + *game_btn |= LL3_BTN4; + } + if (GetAsyncKeyState(cfg.btn5) & 0x8000) { + *game_btn |= LL3_BTN5; + } + if (GetAsyncKeyState(cfg.btn6) & 0x8000) { + *game_btn |= LL3_BTN6; + } + if (GetAsyncKeyState(cfg.btn7) & 0x8000) { + *game_btn |= LL3_BTN7; + } + if (GetAsyncKeyState(cfg.btn8) & 0x8000) { + *game_btn |= LL3_BTN8; + } + if (GetAsyncKeyState(cfg.btn9) & 0x8000) { + *game_btn |= LL3_BTN9; + } + if (GetAsyncKeyState(cfg.btn_cancel) & 0x8000) { + *game_btn |= LL3_BTN_CANCEL; + } + if (GetAsyncKeyState(cfg.btn_decide) & 0x8000) { + *game_btn |= LL3_BTN_DECIDE; + } } \ No newline at end of file diff --git a/ll3io/ll3io.h b/ll3io/ll3io.h index cf320bf..039d617 100644 --- a/ll3io/ll3io.h +++ b/ll3io/ll3io.h @@ -5,22 +5,25 @@ #include enum { - ll3_BTN_TEST = 0x01, - ll3_BTN_SERVICE = 0x02, - ll3_BTN_COIN = 0x03, - ll3_BTN_LEFT = 0x04, - ll3_BTN_RIGHT = 0x05, + LL3_SYSBTN_TEST = 0x01, + LL3_SYSBTN_SERVICE = 0x02, + LL3_SYSBTN_COIN = 0x04, + LL3_SYSBTN_ENTER = 0x08, + LL3_SYSBTN_SELECT = 0x10, }; enum { - ll3_STICK_L_UP = 0x01, - ll3_STICK_L_RIGHT = 0x02, - ll3_STICK_L_DOWN = 0x03, - ll3_STICK_L_LEFT = 0x04, - ll3_STICK_R_UP = 0x05, - ll3_STICK_R_RIGHT = 0x06, - ll3_STICK_R_DOWN = 0x07, - ll3_STICK_R_LEFT = 0x08, + LL3_BTN1 = 0x0001, + LL3_BTN2 = 0x0002, + LL3_BTN3 = 0x0004, + LL3_BTN4 = 0x0008, + LL3_BTN5 = 0x0010, + LL3_BTN6 = 0x0020, + LL3_BTN7 = 0x0040, + LL3_BTN8 = 0x0080, + LL3_BTN9 = 0x0100, + LL3_BTN_DECIDE = 0x0200, + LL3_BTN_CANCEL = 0x0400, }; /* Get the version of the Theatrhythm IO API that this DLL supports. This @@ -41,17 +44,4 @@ uint16_t ll3_io_get_api_version(void); HRESULT ll3_io_init(void); - -/* Get the state of the cabinet's gameplay buttons as of the last poll. See - ll3_IO_GAMEBTN enum above for bit mask definitions. Inputs are split into - a left hand side set of inputs and a right hand side set of inputs: the bit - mappings are the same in both cases. - - All buttons are active-high, even though some buttons' electrical signals - on a real cabinet are active-low. - - Minimum API version: 0x0100 */ - -void ll3_io_get_btns(uint8_t *btn, uint8_t *stick); - -void ll3_io_read_coin_counter(uint16_t *coins, uint16_t *services); \ No newline at end of file +void ll3_io_poll(uint16_t *game_btn, uint8_t *sys_btn, uint32_t *coinct); diff --git a/ri/ri.c b/ri/ri.c index eb2dd96..1f08f7a 100644 --- a/ri/ri.c +++ b/ri/ri.c @@ -42,7 +42,7 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb, DWORD err = 0; PRAWINPUTDEVICELIST ri_devs = NULL; uint32_t num_final_devs = 0; - PRI_DEVICE final_dev_list; + PRI_DEVICE final_dev_list = NULL; mouse_cb = in_mouse_cb; kb_cb = in_kb_cb; diff --git a/sivaio/config.c b/sivaio/config.c index 7ac8a2f..53fcf2a 100644 --- a/sivaio/config.c +++ b/sivaio/config.c @@ -1,6 +1,7 @@ #include #include +#include #include #include