sao: working USIO, add clock enable toggle
This commit is contained in:
parent
db71d3a0f6
commit
28ab4c6e37
@ -250,6 +250,9 @@ static BOOL WINAPI my_AdjustTokenPrivileges(
|
|||||||
HRESULT clock_hook_init(const struct clock_config *cfg)
|
HRESULT clock_hook_init(const struct clock_config *cfg)
|
||||||
{
|
{
|
||||||
assert(cfg != NULL);
|
assert(cfg != NULL);
|
||||||
|
if (!cfg->enable) {
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
clock_time_warp = cfg->timewarp;
|
clock_time_warp = cfg->timewarp;
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
struct clock_config {
|
struct clock_config {
|
||||||
|
bool enable;
|
||||||
bool timezone;
|
bool timezone;
|
||||||
bool timewarp;
|
bool timewarp;
|
||||||
bool writeable;
|
bool writeable;
|
||||||
|
@ -84,6 +84,7 @@ void clock_config_load(struct clock_config *cfg, const wchar_t *filename)
|
|||||||
assert(cfg != NULL);
|
assert(cfg != NULL);
|
||||||
assert(filename != NULL);
|
assert(filename != NULL);
|
||||||
|
|
||||||
|
cfg->enable = GetPrivateProfileIntW(L"clock", L"enable", 1, filename);
|
||||||
cfg->timezone = GetPrivateProfileIntW(L"clock", L"timezone", 1, filename);
|
cfg->timezone = GetPrivateProfileIntW(L"clock", L"timezone", 1, filename);
|
||||||
cfg->timewarp = GetPrivateProfileIntW(L"clock", L"timewarp", 0, filename);
|
cfg->timewarp = GetPrivateProfileIntW(L"clock", L"timewarp", 0, filename);
|
||||||
cfg->writeable = GetPrivateProfileIntW(
|
cfg->writeable = GetPrivateProfileIntW(
|
||||||
|
@ -19,8 +19,11 @@ const struct dll_bind_sym sao_dll_syms[] = {
|
|||||||
.sym = "sao_io_get_opbtns",
|
.sym = "sao_io_get_opbtns",
|
||||||
.off = offsetof(struct sao_dll, get_opbtns),
|
.off = offsetof(struct sao_dll, get_opbtns),
|
||||||
}, {
|
}, {
|
||||||
.sym = "sao_io_get_drum_analog",
|
.sym = "sao_io_get_analog",
|
||||||
.off = offsetof(struct sao_dll, get_drum_analog),
|
.off = offsetof(struct sao_dll, get_analog),
|
||||||
|
}, {
|
||||||
|
.sym = "sao_io_get_gamebtns",
|
||||||
|
.off = offsetof(struct sao_dll, get_gamebtns),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,7 +10,8 @@ struct sao_dll {
|
|||||||
HRESULT (*poll)(void);
|
HRESULT (*poll)(void);
|
||||||
void (*read_coin_counter)(uint16_t *coins, uint16_t *services);
|
void (*read_coin_counter)(uint16_t *coins, uint16_t *services);
|
||||||
void (*get_opbtns)(uint8_t *opbtn);
|
void (*get_opbtns)(uint8_t *opbtn);
|
||||||
void (*get_drum_analog)(uint8_t *gamebtn);
|
void (*get_gamebtns)(uint8_t *gamebtns);
|
||||||
|
void (*get_analog)(uint8_t *x, uint8_t *y);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sao_dll_config {
|
struct sao_dll_config {
|
||||||
|
@ -4,5 +4,6 @@ EXPORTS
|
|||||||
sao_io_get_api_version
|
sao_io_get_api_version
|
||||||
sao_io_init
|
sao_io_init
|
||||||
sao_io_read_coin_counter
|
sao_io_read_coin_counter
|
||||||
sao_io_get_drum_analog
|
sao_io_get_analog
|
||||||
|
sao_io_get_gamebtns
|
||||||
sao_io_get_opbtns
|
sao_io_get_opbtns
|
@ -21,13 +21,19 @@ static void dll_hook_insert_hooks(HMODULE target);
|
|||||||
|
|
||||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name);
|
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name);
|
||||||
static HMODULE (WINAPI *next_LoadLibraryW)(const wchar_t *name);
|
static HMODULE (WINAPI *next_LoadLibraryW)(const wchar_t *name);
|
||||||
|
static HMODULE WINAPI my_LoadLibraryExW(const wchar_t *name, HANDLE hFile, DWORD dwFlags);
|
||||||
|
static HMODULE (WINAPI *next_LoadLibraryExW)(const wchar_t *name, HANDLE hFile, DWORD dwFlags);
|
||||||
|
|
||||||
static const struct hook_symbol unity_kernel32_syms[] = {
|
static const struct hook_symbol unity_kernel32_syms[] = {
|
||||||
{
|
{
|
||||||
.name = "LoadLibraryW",
|
.name = "LoadLibraryW",
|
||||||
.patch = my_LoadLibraryW,
|
.patch = my_LoadLibraryW,
|
||||||
.link = (void **) &next_LoadLibraryW,
|
.link = (void **) &next_LoadLibraryW,
|
||||||
},
|
},{
|
||||||
|
.name = "LoadLibraryExW",
|
||||||
|
.patch = my_LoadLibraryExW,
|
||||||
|
.link = (void **) &next_LoadLibraryExW,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const wchar_t *target_modules[] = {
|
static const wchar_t *target_modules[] = {
|
||||||
@ -58,6 +64,12 @@ static void dll_hook_insert_hooks(HMODULE target)
|
|||||||
_countof(unity_kernel32_syms));
|
_countof(unity_kernel32_syms));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HMODULE WINAPI my_LoadLibraryExW(const wchar_t *name, HANDLE hFile, DWORD dwFlags)
|
||||||
|
{
|
||||||
|
//dprintf("Unity: LoadLibraryExW %ls\n", name);
|
||||||
|
return my_LoadLibraryW(name);
|
||||||
|
}
|
||||||
|
|
||||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
||||||
{
|
{
|
||||||
const wchar_t *name_end;
|
const wchar_t *name_end;
|
||||||
|
@ -39,12 +39,16 @@ HRESULT sao_usio_hook_init(const struct usio_config *cfg)
|
|||||||
static HRESULT sao_usio_poll(void *ctx, struct usio_state *state)
|
static HRESULT sao_usio_poll(void *ctx, struct usio_state *state)
|
||||||
{
|
{
|
||||||
uint8_t opbtn_out = 0;
|
uint8_t opbtn_out = 0;
|
||||||
uint8_t analog_out = 0;
|
uint8_t gamebtn_out = 0;
|
||||||
|
uint8_t x = 128;
|
||||||
|
uint8_t y = 128;
|
||||||
uint16_t coin_ct = 0;
|
uint16_t coin_ct = 0;
|
||||||
uint16_t service_ct = 0;
|
uint16_t service_ct = 0;
|
||||||
|
|
||||||
sao_dll.get_opbtns(&opbtn_out);
|
sao_dll.get_opbtns(&opbtn_out);
|
||||||
sao_dll.get_drum_analog(&analog_out);
|
sao_dll.get_analog(&x, &y);
|
||||||
sao_dll.read_coin_counter(&coin_ct, &service_ct);
|
sao_dll.read_coin_counter(&coin_ct, &service_ct);
|
||||||
|
sao_dll.get_gamebtns(&gamebtn_out);
|
||||||
|
|
||||||
state->op_btns = 0;
|
state->op_btns = 0;
|
||||||
state->p1_btns = 0;
|
state->p1_btns = 0;
|
||||||
@ -66,14 +70,27 @@ static HRESULT sao_usio_poll(void *ctx, struct usio_state *state)
|
|||||||
state->p1_btns |= 0x02; // Enter
|
state->p1_btns |= 0x02; // Enter
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < _countof(state->analog); i++) {
|
if (gamebtn_out & 0x01) {
|
||||||
if (analog_out & 1 << i) {
|
state->p1_btns |= 0x2000;
|
||||||
state->analog[i] = 0x3FFF;
|
}
|
||||||
} else {
|
if (gamebtn_out & 0x02) {
|
||||||
state->analog[i] = 0x00;
|
state->p1_btns |= 0x1000;
|
||||||
|
}
|
||||||
|
if (gamebtn_out & 0x04) {
|
||||||
|
state->p1_btns |= 0x0800;
|
||||||
|
}
|
||||||
|
if (gamebtn_out & 0x08) {
|
||||||
|
state->p1_btns |= 0x4000;
|
||||||
|
}
|
||||||
|
if (gamebtn_out & 0x10) {
|
||||||
|
state->p1_btns |= 0x01;
|
||||||
|
}
|
||||||
|
if (gamebtn_out & 0x20) {
|
||||||
|
state->p1_btns |= 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
state->analog[0] = x << 8;
|
||||||
|
state->analog[1] = y << 8;
|
||||||
|
|
||||||
state->coins[0].current_coin_count = coin_ct;
|
state->coins[0].current_coin_count = coin_ct;
|
||||||
state->service.current_coin_count = service_ct;
|
state->service.current_coin_count = service_ct;
|
||||||
|
@ -15,13 +15,15 @@ void sao_io_config_load(struct sao_input_config *cfg, const wchar_t *filename)
|
|||||||
cfg->down = GetPrivateProfileIntW(L"usio", L"down", VK_DOWN, filename);
|
cfg->down = GetPrivateProfileIntW(L"usio", L"down", VK_DOWN, filename);
|
||||||
cfg->enter = GetPrivateProfileIntW(L"usio", L"enter", VK_RETURN, filename);
|
cfg->enter = GetPrivateProfileIntW(L"usio", L"enter", VK_RETURN, filename);
|
||||||
|
|
||||||
cfg->p1_rim_l = GetPrivateProfileIntW(L"drum", L"p1_rim_l", 'Z', filename);
|
cfg->stick_up = GetPrivateProfileIntW(L"usio", L"stick_up", 'W', filename);
|
||||||
cfg->p1_center_l = GetPrivateProfileIntW(L"usio", L"p1_center_l", 'X', filename);
|
cfg->stick_left = GetPrivateProfileIntW(L"usio", L"stick_left", 'A', filename);
|
||||||
cfg->p1_center_r = GetPrivateProfileIntW(L"usio", L"p1_center_r", 'C', filename);
|
cfg->stick_down = GetPrivateProfileIntW(L"usio", L"stick_down", 'S', filename);
|
||||||
cfg->p1_rim_r = GetPrivateProfileIntW(L"usio", L"p1_rim_r", 'V', filename);
|
cfg->stick_right = GetPrivateProfileIntW(L"usio", L"stick_right", 'D', filename);
|
||||||
|
cfg->stick_btn1 = GetPrivateProfileIntW(L"usio", L"stick_btn1", 'R', filename);
|
||||||
|
cfg->stick_btn2 = GetPrivateProfileIntW(L"usio", L"stick_btn2", 'F', filename);
|
||||||
|
cfg->stick_btn3 = GetPrivateProfileIntW(L"usio", L"stick_btn3", 'V', filename);
|
||||||
|
|
||||||
cfg->p2_rim_l = GetPrivateProfileIntW(L"drum", L"p2_rim_l", 'U', filename);
|
cfg->btn1 = GetPrivateProfileIntW(L"usio", L"btn1", '1', filename);
|
||||||
cfg->p2_center_l = GetPrivateProfileIntW(L"usio", L"p2_center_l", 'I', filename);
|
cfg->btn2 = GetPrivateProfileIntW(L"usio", L"btn2", '2', filename);
|
||||||
cfg->p2_center_r = GetPrivateProfileIntW(L"usio", L"p2_center_r", 'O', filename);
|
cfg->btn3 = GetPrivateProfileIntW(L"usio", L"btn3", '3', filename);
|
||||||
cfg->p2_rim_r = GetPrivateProfileIntW(L"usio", L"p2_rim_r", 'P', filename);
|
|
||||||
}
|
}
|
@ -12,14 +12,18 @@ struct sao_input_config {
|
|||||||
uint8_t enter;
|
uint8_t enter;
|
||||||
uint8_t coin;
|
uint8_t coin;
|
||||||
|
|
||||||
uint8_t p1_rim_l;
|
uint8_t stick_up;
|
||||||
uint8_t p1_center_l;
|
uint8_t stick_down;
|
||||||
uint8_t p1_center_r;
|
uint8_t stick_left;
|
||||||
uint8_t p1_rim_r;
|
uint8_t stick_right;
|
||||||
uint8_t p2_rim_l;
|
|
||||||
uint8_t p2_center_l;
|
uint8_t stick_btn1;
|
||||||
uint8_t p2_center_r;
|
uint8_t stick_btn2;
|
||||||
uint8_t p2_rim_r;
|
uint8_t stick_btn3;
|
||||||
|
|
||||||
|
uint8_t btn1;
|
||||||
|
uint8_t btn2;
|
||||||
|
uint8_t btn3;
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
@ -62,38 +62,47 @@ void sao_io_get_opbtns(uint8_t *opbtn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sao_io_get_drum_analog(uint8_t *gamebtn)
|
void sao_io_get_gamebtns(uint8_t *gamebtns)
|
||||||
{
|
{
|
||||||
if (GetAsyncKeyState(cfg.p1_rim_l) & 0x8000) {
|
*gamebtns = 0;
|
||||||
*gamebtn |= SAO_IO_P1_RIM_L;
|
if (GetAsyncKeyState(cfg.btn1) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_1;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(cfg.btn2) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_2;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(cfg.btn3) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_3;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(cfg.stick_btn1) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_STICK1;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(cfg.stick_btn2) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_STICK2;
|
||||||
|
}
|
||||||
|
if (GetAsyncKeyState(cfg.stick_btn3) & 0x8000) {
|
||||||
|
*gamebtns |= SAO_IO_GAMEBTN_STICK3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sao_io_get_analog(uint8_t *x, uint8_t *y)
|
||||||
|
{
|
||||||
|
*x = 128;
|
||||||
|
*y = 128;
|
||||||
|
if (GetAsyncKeyState(cfg.stick_up) & 0x8000) {
|
||||||
|
*y += 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p1_center_l) & 0x8000) {
|
if (GetAsyncKeyState(cfg.stick_down) & 0x8000) {
|
||||||
*gamebtn |= SAO_IO_P1_CENTER_L;
|
*y -= 128;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p1_center_r) & 0x8000) {
|
if (GetAsyncKeyState(cfg.stick_right) & 0x8000) {
|
||||||
*gamebtn |= SAO_IO_P1_CENTER_R;
|
*x += 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p1_rim_r) & 0x8000) {
|
if (GetAsyncKeyState(cfg.stick_left) & 0x8000) {
|
||||||
*gamebtn |= SAO_IO_P1_RIM_R;
|
*x -= 128;
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p2_rim_l) & 0x8000) {
|
|
||||||
*gamebtn |= SAO_IO_P2_RIM_L;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p2_center_l) & 0x8000) {
|
|
||||||
*gamebtn |= SAO_IO_P2_CENTER_L;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p2_center_r) & 0x8000) {
|
|
||||||
*gamebtn |= SAO_IO_P2_CENTER_R;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetAsyncKeyState(cfg.p2_rim_r) & 0x8000) {
|
|
||||||
*gamebtn |= SAO_IO_P2_RIM_R;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,5 +4,6 @@ EXPORTS
|
|||||||
sao_io_get_api_version
|
sao_io_get_api_version
|
||||||
sao_io_init
|
sao_io_init
|
||||||
sao_io_read_coin_counter
|
sao_io_read_coin_counter
|
||||||
sao_io_get_drum_analog
|
sao_io_get_analog
|
||||||
|
sao_io_get_gamebtns
|
||||||
sao_io_get_opbtns
|
sao_io_get_opbtns
|
@ -15,14 +15,12 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SAO_IO_P1_RIM_L = 0x0001,
|
SAO_IO_GAMEBTN_1 = 0x0001,
|
||||||
SAO_IO_P1_CENTER_L = 0x0002,
|
SAO_IO_GAMEBTN_2 = 0x0002,
|
||||||
SAO_IO_P1_CENTER_R = 0x0004,
|
SAO_IO_GAMEBTN_3 = 0x0004,
|
||||||
SAO_IO_P1_RIM_R = 0x0008,
|
SAO_IO_GAMEBTN_STICK1 = 0x0008,
|
||||||
SAO_IO_P2_RIM_L = 0x0100,
|
SAO_IO_GAMEBTN_STICK2 = 0x0010,
|
||||||
SAO_IO_P2_CENTER_L = 0x0200,
|
SAO_IO_GAMEBTN_STICK3 = 0x0020,
|
||||||
SAO_IO_P2_CENTER_R = 0x1000,
|
|
||||||
SAO_IO_P2_RIM_R = 0x2000,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get the version of the Pokken IO API that this DLL supports. This
|
/* Get the version of the Pokken IO API that this DLL supports. This
|
||||||
@ -62,6 +60,8 @@ void sao_io_get_opbtns(uint8_t *opbtn);
|
|||||||
|
|
||||||
Minimum API version: 0x0100 */
|
Minimum API version: 0x0100 */
|
||||||
|
|
||||||
void sao_io_get_drum_analog(uint8_t *gamebtn);
|
void sao_io_get_analog(uint8_t *x, uint8_t *y);
|
||||||
|
|
||||||
|
void sao_io_get_gamebtns(uint8_t *gamebtns);
|
||||||
|
|
||||||
void sao_io_read_coin_counter(uint16_t *coins, uint16_t *services);
|
void sao_io_read_coin_counter(uint16_t *coins, uint16_t *services);
|
Loading…
Reference in New Issue
Block a user