diff --git a/common/aimeio/aimeio.c b/common/aimeio/aimeio.c index 8192bae..7efffb5 100644 --- a/common/aimeio/aimeio.c +++ b/common/aimeio/aimeio.c @@ -218,7 +218,7 @@ static HRESULT aime_io_generate_aime( uint16_t aime_io_get_api_version(void) { - return 0x0100; + return 0x0101; } HRESULT aime_io_init(void) @@ -351,3 +351,18 @@ HRESULT aime_io_nfc_get_felica_id(uint8_t unit_no, uint64_t *IDm) void aime_io_led_set_color(uint8_t unit_no, uint8_t r, uint8_t g, uint8_t b) {} + +void aime_io_vfd_set_text( + const uint8_t *text, + size_t text_len, + const struct aime_io_vfd_state *state) +{ + (void) text; + (void) text_len; + (void) state; +} + +void aime_io_vfd_set_state(const struct aime_io_vfd_state *state) +{ + (void) state; +} diff --git a/common/aimeio/aimeio.h b/common/aimeio/aimeio.h index 221f8e0..bb851cd 100644 --- a/common/aimeio/aimeio.h +++ b/common/aimeio/aimeio.h @@ -11,7 +11,7 @@ version and the low byte is the minor version (as defined by the Semantic Versioning standard). - The latest API version as of this writing is 0x0100. + The latest API version as of this writing is 0x0101. */ uint16_t aime_io_get_api_version(void); @@ -85,3 +85,47 @@ HRESULT aime_io_nfc_get_felica_id(uint8_t unit_no, uint64_t *IDm); Minimum API version: 0x0100 */ void aime_io_led_set_color(uint8_t unit_no, uint8_t r, uint8_t g, uint8_t b); + +/* + VFD text forwarding. This is intended to pass through the text payload + plus the most recent VFD state so external handlers can emulate scrolling + or layout if desired. + + - text: Pointer to raw text bytes (not null-terminated) + - text_len: Length of the text buffer + - state: Current VFD state at the time of rendering + + The encoding field uses VFD encoding values (0=GB2312, 1=Big5, + 2=Shift-JIS, 3=KSC5601). + + Minimum API version: 0x0101 +*/ +struct aime_io_vfd_state { + uint8_t encoding; + uint8_t text_speed; + uint8_t scroll_enabled; + uint16_t h_scroll; + uint16_t cursor_x; + uint8_t cursor_y; + uint16_t wnd_x0; + uint8_t wnd_y0; + uint16_t wnd_x1; + uint8_t wnd_y1; + uint8_t rotate; + uint8_t brightness; + uint8_t screen_on; + uint32_t clear_seq; +}; + +void aime_io_vfd_set_text( + const uint8_t *text, + size_t text_len, + const struct aime_io_vfd_state *state); + +/* + VFD state change notification. Called when the VFD state changes even + when no text is written. + + Minimum API version: 0x0101 +*/ +void aime_io_vfd_set_state(const struct aime_io_vfd_state *state); diff --git a/common/board/aime-dll.c b/common/board/aime-dll.c index 465fcfd..7c00dfd 100644 --- a/common/board/aime-dll.c +++ b/common/board/aime-dll.c @@ -8,6 +8,11 @@ #include "util/dll-bind.h" #include "util/dprintf.h" +enum { + AIME_DLL_SYM_COUNT_V100 = 5, + AIME_DLL_SYM_COUNT_V101 = 7, +}; + const struct dll_bind_sym aime_dll_syms[] = { { .sym = "aime_io_init", @@ -24,7 +29,13 @@ const struct dll_bind_sym aime_dll_syms[] = { }, { .sym = "aime_io_led_set_color", .off = offsetof(struct aime_dll, led_set_color), - } + }, { + .sym = "aime_io_vfd_set_text", + .off = offsetof(struct aime_dll, vfd_set_text), + }, { + .sym = "aime_io_vfd_set_state", + .off = offsetof(struct aime_dll, vfd_set_state), + }, }; struct aime_dll aime_dll; @@ -42,6 +53,7 @@ HRESULT aime_dll_init(const struct aime_dll_config *cfg, HINSTANCE self) HINSTANCE owned; HINSTANCE src; HRESULT hr; + size_t sym_count; assert(cfg != NULL); assert(self != NULL); @@ -86,7 +98,10 @@ HRESULT aime_dll_init(const struct aime_dll_config *cfg, HINSTANCE self) } sym = aime_dll_syms; - hr = dll_bind(&aime_dll, src, &sym, _countof(aime_dll_syms)); + sym_count = (aime_dll.api_version < 0x0101) + ? AIME_DLL_SYM_COUNT_V100 + : AIME_DLL_SYM_COUNT_V101; + hr = dll_bind(&aime_dll, src, &sym, sym_count); if (FAILED(hr)) { if (src != self) { diff --git a/common/board/aime-dll.h b/common/board/aime-dll.h index 25c52f0..7113cc1 100644 --- a/common/board/aime-dll.h +++ b/common/board/aime-dll.h @@ -15,6 +15,11 @@ struct aime_dll { size_t luid_size); HRESULT (*nfc_get_felica_id)(uint8_t unit_no, uint64_t *IDm); void (*led_set_color)(uint8_t unit_no, uint8_t r, uint8_t g, uint8_t b); + void (*vfd_set_text)( + const uint8_t *text, + size_t text_len, + const struct aime_io_vfd_state *state); + void (*vfd_set_state)(const struct aime_io_vfd_state *state); }; struct aime_dll_config { diff --git a/common/board/vfd-cmd.h b/common/board/vfd-cmd.h index 28bcb16..8c8cd81 100644 --- a/common/board/vfd-cmd.h +++ b/common/board/vfd-cmd.h @@ -3,6 +3,7 @@ #include "board/vfd-frame.h" enum { + VFD_CMD_WRITE_STATIC = 0x00, VFD_CMD_GET_VERSION = 0x5B, VFD_CMD_RESET = 0x0B, VFD_CMD_CLEAR_SCREEN = 0x0C, diff --git a/common/board/vfd.c b/common/board/vfd.c index 4cfb20b..3937a26 100644 --- a/common/board/vfd.c +++ b/common/board/vfd.c @@ -11,6 +11,7 @@ #include #include "board/config.h" +#include "board/aime-dll.h" #include "board/vfd.h" #include "board/vfd-cmd.h" @@ -22,6 +23,7 @@ #include "util/dump.h" #define SUPER_VERBOSE 0 +#define VFD_BRIGHTNESS_MAX 4 static HRESULT vfd_handle_irp(struct irp *irp); @@ -29,7 +31,7 @@ static struct uart vfd_uart; static uint8_t vfd_written[4096]; static uint8_t vfd_readable[4096]; -static int encoding = VFD_ENC_SHIFT_JIS; +static struct aime_io_vfd_state vfd_state; HRESULT vfd_handle_get_version(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart); HRESULT vfd_handle_reset(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart); @@ -51,6 +53,13 @@ HRESULT vfd_handle_create_char2(struct const_iobuf* reader, struct iobuf* writer static bool utf_enabled; +static void vfd_publish_state(void) +{ + if (aime_dll.vfd_set_state != NULL) { + aime_dll.vfd_set_state(&vfd_state); + } +} + HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no) { if (!cfg->enable){ @@ -58,6 +67,9 @@ HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no) } utf_enabled = cfg->utf_conversion; + memset(&vfd_state, 0, sizeof(vfd_state)); + vfd_state.encoding = VFD_ENC_SHIFT_JIS; + vfd_publish_state(); unsigned int port_no = cfg->port_no; if (port_no == 0){ @@ -93,13 +105,13 @@ void print_vfd_text(const char* str, int len){ memset(encoded, 0, 1024 * sizeof(wchar_t)); int codepage = 0; - if (encoding == VFD_ENC_GB2312){ + if (vfd_state.encoding == VFD_ENC_GB2312){ codepage = 936; - } else if (encoding == VFD_ENC_BIG5){ + } else if (vfd_state.encoding == VFD_ENC_BIG5){ codepage = 950; - } else if (encoding == VFD_ENC_SHIFT_JIS){ + } else if (vfd_state.encoding == VFD_ENC_SHIFT_JIS){ codepage = 932; - } else if (encoding == VFD_ENC_KSC5601) { + } else if (vfd_state.encoding == VFD_ENC_KSC5601) { codepage = 949; } @@ -114,6 +126,37 @@ void print_vfd_text(const char* str, int len){ dprintf("VFD: Text: %s\n", str); } + + if (aime_dll.vfd_set_text != NULL) { + aime_dll.vfd_set_text((const uint8_t *) str, len, &vfd_state); + } +} + +static void vfd_read_text_until_sync(struct const_iobuf *reader) +{ + int len; + + if (reader->pos >= reader->nbytes) { + return; + } + + len = 0; + while (reader->pos + len < reader->nbytes && + reader->bytes[reader->pos + len] != VFD_SYNC_BYTE && + reader->bytes[reader->pos + len] != VFD_SYNC_BYTE2) { + len++; + } + + if (len <= 0) { + return; + } + + char *str = malloc((size_t) len + 1); + memset(str, 0, (size_t) len + 1); + iobuf_read(reader, str, len); + str[len] = '\0'; + print_vfd_text(str, len); + free(str); } static HRESULT vfd_handle_irp(struct irp *irp) @@ -178,6 +221,10 @@ static HRESULT vfd_handle_irp(struct irp *irp) hr = vfd_handle_set_text_wnd(&reader, writer, &vfd_uart); } else if (cmd == VFD_CMD_SET_TEXT_SPEED) { hr = vfd_handle_set_text_speed(&reader, writer, &vfd_uart); + } else if (cmd == VFD_CMD_WRITE_STATIC) { + dprintf("VFD: Write Static Text\n"); + vfd_read_text_until_sync(&reader); + hr = S_FALSE; } else if (cmd == VFD_CMD_WRITE_TEXT) { hr = vfd_handle_write_text(&reader, writer, &vfd_uart); } else if (cmd == VFD_CMD_ENABLE_SCROLL) { @@ -199,22 +246,7 @@ static HRESULT vfd_handle_irp(struct irp *irp) // if no sync byte is sent, we are just getting plain text... - if (reader.pos < reader.nbytes){ - int len = 0; - - // read chars until we hit a new sync byte or the data ends - while (reader.pos + len + 1 < reader.nbytes && reader.bytes[reader.pos + len] != VFD_SYNC_BYTE && reader.bytes[reader.pos + len] != VFD_SYNC_BYTE2){ - len++; - } - - char* str = malloc(len); - memset(str, 0, len); - iobuf_read(&reader, str, len); - print_vfd_text(str, len); - free(str); - - reader.pos += len; - } + vfd_read_text_until_sync(&reader); } @@ -230,7 +262,16 @@ static HRESULT vfd_handle_irp(struct irp *irp) } HRESULT vfd_handle_get_version(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ - dprintf("VFD: Get Version\n"); + uint8_t subcmd; + + if (reader->pos < reader->nbytes && + reader->bytes[reader->pos] != VFD_SYNC_BYTE && + reader->bytes[reader->pos] != VFD_SYNC_BYTE2) { + iobuf_read_8(reader, &subcmd); + dprintf("VFD: Get Version (0x%02x)\n", subcmd); + } else { + dprintf("VFD: Get Version\n"); + } struct vfd_resp_board_info resp; @@ -244,12 +285,39 @@ HRESULT vfd_handle_get_version(struct const_iobuf* reader, struct iobuf* writer, HRESULT vfd_handle_reset(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ dprintf("VFD: Reset\n"); - encoding = VFD_ENC_SHIFT_JIS; + memset(&vfd_state, 0, sizeof(vfd_state)); + vfd_state.encoding = VFD_ENC_SHIFT_JIS; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_clear_screen(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ + if (reader->pos + 1 <= reader->nbytes) { + uint8_t next = reader->bytes[reader->pos]; + bool next_is_sync = (next == VFD_SYNC_BYTE || next == VFD_SYNC_BYTE2); + + if (!next_is_sync && next <= VFD_BRIGHTNESS_MAX) { + bool end_or_sync = (reader->pos + 1 >= reader->nbytes); + + if (!end_or_sync) { + uint8_t follow = reader->bytes[reader->pos + 1]; + end_or_sync = (follow == VFD_SYNC_BYTE || follow == VFD_SYNC_BYTE2); + } + + if (end_or_sync) { + uint8_t b; + iobuf_read_8(reader, &b); + dprintf("VFD: Brightness (compat), %d\n", b); + vfd_state.brightness = b; + vfd_publish_state(); + return S_FALSE; + } + } + } + dprintf("VFD: Clear Screen\n"); + vfd_state.clear_seq++; + vfd_publish_state(); return S_FALSE; } @@ -257,12 +325,14 @@ HRESULT vfd_handle_set_brightness(struct const_iobuf* reader, struct iobuf* writ uint8_t b; iobuf_read_8(reader, &b); - if (b > 4){ + if (b > VFD_BRIGHTNESS_MAX){ dprintf("VFD: Brightness, invalid argument\n"); return E_FAIL; } dprintf("VFD: Brightness, %d\n", b); + vfd_state.brightness = b; + vfd_publish_state(); return S_FALSE; } @@ -276,30 +346,49 @@ HRESULT vfd_handle_set_screen_on(struct const_iobuf* reader, struct iobuf* write } dprintf("VFD: Screen Power, %d\n", b); + vfd_state.screen_on = b; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_set_h_scroll(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ - uint8_t x; - iobuf_read_8(reader, &x); + uint16_t x; + iobuf_read_be16(reader, &x); dprintf("VFD: Horizontal Scroll, X=%d\n", x); + vfd_state.h_scroll = x; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_draw_image(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ - int w, h; - uint16_t x0, x1; + uint16_t x0; + uint16_t w; + uint16_t h_lines; + uint16_t h_pixels; uint8_t y0, y1; - uint8_t image[2048]; + size_t payload; + size_t remaining; iobuf_read_be16(reader, &x0); iobuf_read_8(reader, &y0); - iobuf_read_be16(reader, &x1); + iobuf_read_be16(reader, &w); iobuf_read_8(reader, &y1); - w = x1 - x0; - h = y1 - y0; - iobuf_read(reader, image, w*h); - dprintf("VFD: Draw image, %dx%d\n", w, h); + if (y1 >= y0) { + h_lines = (uint16_t) (y1 - y0 + 1); + } else { + h_lines = 0; + } + + h_pixels = (uint16_t) (h_lines * 8); + dprintf("VFD: Draw image, %dx%d @%d,%d\n", w, h_pixels, x0, y0); + + payload = (size_t) w * (size_t) h_pixels; + remaining = reader->nbytes - reader->pos; + if (payload > remaining) { + payload = remaining; + } + + reader->pos += payload; return S_FALSE; } @@ -311,6 +400,9 @@ HRESULT vfd_handle_set_cursor(struct const_iobuf* reader, struct iobuf* writer, iobuf_read_8(reader, &y); dprintf("VFD: Set Cursor, x=%d,y=%d\n", x, y); + vfd_state.cursor_x = x; + vfd_state.cursor_y = y; + vfd_publish_state(); return S_FALSE; } @@ -326,20 +418,31 @@ HRESULT vfd_handle_set_encoding(struct const_iobuf* reader, struct iobuf* writer return E_FAIL; } - encoding = b; + vfd_state.encoding = b; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_set_text_wnd(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ - uint16_t x0, x1; - uint8_t y0, y1; + uint16_t x0, w; + uint8_t y0, h; + uint16_t x1; + uint8_t y1; iobuf_read_be16(reader, &x0); iobuf_read_8(reader, &y0); - iobuf_read_be16(reader, &x1); - iobuf_read_8(reader, &y1); + iobuf_read_be16(reader, &w); + iobuf_read_8(reader, &h); - dprintf("VFD: Set Text Window, p0:%d,%d, p1:%d,%d\n", x0, y0, x1, y1); + x1 = (uint16_t) (x0 + w); + y1 = (uint8_t) (y0 + h); + + dprintf("VFD: Set Text Window, x=%d,y=%d,w=%d,h=%d\n", x0, y0, w, h); + vfd_state.wnd_x0 = x0; + vfd_state.wnd_y0 = y0; + vfd_state.wnd_x1 = x1; + vfd_state.wnd_y1 = y1; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_set_text_speed(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ @@ -347,14 +450,17 @@ HRESULT vfd_handle_set_text_speed(struct const_iobuf* reader, struct iobuf* writ iobuf_read_8(reader, &b); dprintf("VFD: Set Text Speed, %d\n", b); + vfd_state.text_speed = b; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_write_text(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ uint8_t len; iobuf_read_8(reader, &len); - char* str = malloc(len); + char* str = malloc((size_t) len + 1); iobuf_read(reader, str, len); + str[len] = '\0'; print_vfd_text(str, len); free(str); @@ -363,10 +469,14 @@ HRESULT vfd_handle_write_text(struct const_iobuf* reader, struct iobuf* writer, } HRESULT vfd_handle_enable_scroll(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ dprintf("VFD: Enable Scrolling\n"); + vfd_state.scroll_enabled = 1; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_disable_scroll(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ dprintf("VFD: Disable Scrolling\n"); + vfd_state.scroll_enabled = 0; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_rotate(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ @@ -374,6 +484,8 @@ HRESULT vfd_handle_rotate(struct const_iobuf* reader, struct iobuf* writer, stru iobuf_read_8(reader, &b); dprintf("VFD: Rotate, %d\n", b); + vfd_state.rotate = b; + vfd_publish_state(); return S_FALSE; } HRESULT vfd_handle_create_char(struct const_iobuf* reader, struct iobuf* writer, struct uart* vfd_uart){ diff --git a/games/apm3hook/apm3hook.def b/games/apm3hook/apm3hook.def index ec636df..c965fb8 100644 --- a/games/apm3hook/apm3hook.def +++ b/games/apm3hook/apm3hook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/carolhook/carolhook.def b/games/carolhook/carolhook.def index 5102937..1a8312d 100644 --- a/games/carolhook/carolhook.def +++ b/games/carolhook/carolhook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/chunihook/chunihook.def b/games/chunihook/chunihook.def index 517a10b..4128451 100644 --- a/games/chunihook/chunihook.def +++ b/games/chunihook/chunihook.def @@ -5,6 +5,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/chusanhook/chusanhook.def b/games/chusanhook/chusanhook.def index ea786f5..8786d4e 100644 --- a/games/chusanhook/chusanhook.def +++ b/games/chusanhook/chusanhook.def @@ -5,6 +5,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/cmhook/cmhook.def b/games/cmhook/cmhook.def index ab7d3af..526442d 100644 --- a/games/cmhook/cmhook.def +++ b/games/cmhook/cmhook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/cxbhook/cxbhook.def b/games/cxbhook/cxbhook.def index 9efaaf6..8466898 100644 --- a/games/cxbhook/cxbhook.def +++ b/games/cxbhook/cxbhook.def @@ -5,6 +5,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/divahook/divahook.def b/games/divahook/divahook.def index 4d2ae44..a92e61d 100644 --- a/games/divahook/divahook.def +++ b/games/divahook/divahook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/fgohook/fgohook.def b/games/fgohook/fgohook.def index 3e77ccc..a2088b9 100644 --- a/games/fgohook/fgohook.def +++ b/games/fgohook/fgohook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/idachook/idachook.def b/games/idachook/idachook.def index 4653c37..4ef2b98 100644 --- a/games/idachook/idachook.def +++ b/games/idachook/idachook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/idzhook/idzhook.def b/games/idzhook/idzhook.def index 53e01c6..b13642b 100644 --- a/games/idzhook/idzhook.def +++ b/games/idzhook/idzhook.def @@ -9,6 +9,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/kemonohook/kemonohook.def b/games/kemonohook/kemonohook.def index 601a00b..4db5e98 100644 --- a/games/kemonohook/kemonohook.def +++ b/games/kemonohook/kemonohook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/mai2hook/mai2hook.def b/games/mai2hook/mai2hook.def index 4b32c24..cf1ed65 100644 --- a/games/mai2hook/mai2hook.def +++ b/games/mai2hook/mai2hook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/mercuryhook/mercuryhook.def b/games/mercuryhook/mercuryhook.def index 32f33c1..4d3c8ec 100644 --- a/games/mercuryhook/mercuryhook.def +++ b/games/mercuryhook/mercuryhook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/mu3hook/mu3hook.def b/games/mu3hook/mu3hook.def index 0393a2e..ab34a0f 100644 --- a/games/mu3hook/mu3hook.def +++ b/games/mu3hook/mu3hook.def @@ -10,6 +10,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/swdchook/swdchook.def b/games/swdchook/swdchook.def index ad4f93e..09c40a9 100644 --- a/games/swdchook/swdchook.def +++ b/games/swdchook/swdchook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll diff --git a/games/tokyohook/tokyohook.def b/games/tokyohook/tokyohook.def index d60bf17..8b30d5f 100644 --- a/games/tokyohook/tokyohook.def +++ b/games/tokyohook/tokyohook.def @@ -4,6 +4,8 @@ EXPORTS aime_io_get_api_version aime_io_init aime_io_led_set_color + aime_io_vfd_set_text + aime_io_vfd_set_state aime_io_nfc_get_aime_id aime_io_nfc_get_felica_id aime_io_nfc_poll