#pragma once #include #include #pragma pack(push, 1) struct fastio_node { struct fastio_node *next; uint8_t board_no; // Unlike JVS, FastIO comms are done on the game side through // DMA register reads and writes, meaning we need to have // indivitual functions here instead of just "transact" void (*digital_in)(void* ctx, uint32_t *out); // Digital button inputs void (*analog_in)(void* ctx, uint16_t *out); // Analog stick inputs (WIP) void (*coins_in)(void* ctx, uint8_t slot, uint32_t *out); // Number of unprocessed coins void (*digital_out)(void* ctx, uint16_t channel, uint16_t val); // Digital outputs void (*analog_out)(void* ctx, uint16_t channel, uint16_t val); // Analog outputs (WIP) void (*coins_out)(void* ctx, uint8_t slot, uint16_t removed); // Remove coins from the count }; #pragma pack(pop) typedef HRESULT (*fastio_provider_t)(struct fastio_node *root); HRESULT fastio_hook_init(fastio_provider_t main, fastio_provider_t sub); void fastio_digital_read(void* ctx, uint8_t board_no, uint32_t *out); void fastio_coins_in(void* ctx, uint8_t board_no, uint8_t slot_no, uint32_t *out);