Compare commits

..

1 Commits

Author SHA1 Message Date
d118ef614c updated README and added "AM Daemon" window name 2024-02-22 12:12:29 +01:00
615 changed files with 6749 additions and 22856 deletions

View File

@ -1,4 +0,0 @@
---
BasedOnStyle: Google
IndentWidth: 4
---

6
.gitignore vendored
View File

@ -18,9 +18,3 @@ build/
# External dependencies # External dependencies
subprojects/capnhook subprojects/capnhook
# For enabling debug logging on local builds
MesonLocalOptions.mk
# Some meson cache thing
.meson-subproject-wrap-hash.txt

View File

@ -5,19 +5,12 @@ V ?= @
BUILD_DIR := build BUILD_DIR := build
BUILD_DIR_32 := $(BUILD_DIR)/build32 BUILD_DIR_32 := $(BUILD_DIR)/build32
BUILD_DIR_64 := $(BUILD_DIR)/build64 BUILD_DIR_64 := $(BUILD_DIR)/build64
BUILD_DIR_GAMES_32 := $(BUILD_DIR_32)/games
BUILD_DIR_GAMES_64 := $(BUILD_DIR_64)/games
BUILD_DIR_ZIP := $(BUILD_DIR)/zip BUILD_DIR_ZIP := $(BUILD_DIR)/zip
DOC_DIR := doc DOC_DIR := doc
DIST_DIR := dist DIST_DIR := dist
# Add "-D[option]=[value]" here as necessary
MESON_OPTIONS :=
# For options that shouldn't be committed
-include MesonLocalOptions.mk
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Targets # Targets
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -26,9 +19,9 @@ include Package.mk
.PHONY: build # Build the project .PHONY: build # Build the project
build: build:
$(V)meson setup $(MESON_OPTIONS) --cross cross-mingw-32.txt $(BUILD_DIR_32) $(V)meson --cross cross-mingw-32.txt $(BUILD_DIR_32)
$(V)ninja -C $(BUILD_DIR_32) $(V)ninja -C $(BUILD_DIR_32)
$(V)meson setup $(MESON_OPTIONS) --cross cross-mingw-64.txt $(BUILD_DIR_64) $(V)meson --cross cross-mingw-64.txt $(BUILD_DIR_64)
$(V)ninja -C $(BUILD_DIR_64) $(V)ninja -C $(BUILD_DIR_64)
.PHONY: dist # Build and create a zip distribution package .PHONY: dist # Build and create a zip distribution package

View File

@ -3,9 +3,9 @@ $(BUILD_DIR_ZIP)/chuni.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni $(V)mkdir -p $(BUILD_DIR_ZIP)/chuni
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/chuni/DEVICE
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_32)/chunihook/chunihook.dll \ $(BUILD_DIR_32)/chunihook/chunihook.dll \
$(DIST_DIR)/chuni/segatools.ini \ $(DIST_DIR)/chuni/segatools.ini \
$(DIST_DIR)/chuni/launch.bat \ $(DIST_DIR)/chuni/start.bat \
$(BUILD_DIR_ZIP)/chuni $(BUILD_DIR_ZIP)/chuni
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -18,9 +18,9 @@ $(BUILD_DIR_ZIP)/cxb.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb $(V)mkdir -p $(BUILD_DIR_ZIP)/cxb
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/cxb/DEVICE
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_32)/cxbhook/cxbhook.dll \ $(BUILD_DIR_32)/cxbhook/cxbhook.dll \
$(DIST_DIR)/cxb/segatools.ini \ $(DIST_DIR)/cxb/segatools.ini \
$(DIST_DIR)/cxb/launch.bat \ $(DIST_DIR)/cxb/start.bat \
$(BUILD_DIR_ZIP)/cxb $(BUILD_DIR_ZIP)/cxb
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -33,9 +33,9 @@ $(BUILD_DIR_ZIP)/diva.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva $(V)mkdir -p $(BUILD_DIR_ZIP)/diva
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/diva/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/divahook/divahook.dll \ $(BUILD_DIR_64)/divahook/divahook.dll \
$(DIST_DIR)/diva/segatools.ini \ $(DIST_DIR)/diva/segatools.ini \
$(DIST_DIR)/diva/launch.bat \ $(DIST_DIR)/diva/start.bat \
$(BUILD_DIR_ZIP)/diva $(BUILD_DIR_ZIP)/diva
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -48,9 +48,9 @@ $(BUILD_DIR_ZIP)/carol.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol $(V)mkdir -p $(BUILD_DIR_ZIP)/carol
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/carol/DEVICE
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_32)/carolhook/carolhook.dll \ $(BUILD_DIR_32)/carolhook/carolhook.dll \
$(DIST_DIR)/carol/segatools.ini \ $(DIST_DIR)/carol/segatools.ini \
$(DIST_DIR)/carol/launch.bat \ $(DIST_DIR)/carol/start.bat \
$(BUILD_DIR_ZIP)/carol $(BUILD_DIR_ZIP)/carol
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -63,9 +63,9 @@ $(BUILD_DIR_ZIP)/idz.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz $(V)mkdir -p $(BUILD_DIR_ZIP)/idz
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/idz/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/idzhook/idzhook.dll \ $(BUILD_DIR_64)/idzhook/idzhook.dll \
$(DIST_DIR)/idz/segatools.ini \ $(DIST_DIR)/idz/segatools.ini \
$(DIST_DIR)/idz/launch.bat \ $(DIST_DIR)/idz/start.bat \
$(BUILD_DIR_ZIP)/idz $(BUILD_DIR_ZIP)/idz
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -78,9 +78,9 @@ $(BUILD_DIR_ZIP)/fgo.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo $(V)mkdir -p $(BUILD_DIR_ZIP)/fgo
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/fgo/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/fgohook/fgohook.dll \ $(BUILD_DIR_64)/fgohook/fgohook.dll \
$(DIST_DIR)/fgo/segatools.ini \ $(DIST_DIR)/fgo/segatools.ini \
$(DIST_DIR)/fgo/launch.bat \ $(DIST_DIR)/fgo/start.bat \
$(BUILD_DIR_ZIP)/fgo $(BUILD_DIR_ZIP)/fgo
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -93,10 +93,10 @@ $(BUILD_DIR_ZIP)/idac.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac $(V)mkdir -p $(BUILD_DIR_ZIP)/idac
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/idac/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/idachook/idachook.dll \ $(BUILD_DIR_64)/idachook/idachook.dll \
$(DIST_DIR)/idac/segatools.ini \ $(DIST_DIR)/idac/segatools.ini \
$(DIST_DIR)/idac/config_hook.json \ $(DIST_DIR)/idac/config_hook.json \
$(DIST_DIR)/idac/launch.bat \ $(DIST_DIR)/idac/start.bat \
$(BUILD_DIR_ZIP)/idac $(BUILD_DIR_ZIP)/idac
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -109,10 +109,10 @@ $(BUILD_DIR_ZIP)/swdc.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc $(V)mkdir -p $(BUILD_DIR_ZIP)/swdc
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/swdc/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/swdchook/swdchook.dll \ $(BUILD_DIR_64)/swdchook/swdchook.dll \
$(DIST_DIR)/swdc/segatools.ini \ $(DIST_DIR)/swdc/segatools.ini \
$(DIST_DIR)/swdc/config_hook.json \ $(DIST_DIR)/swdc/config_hook.json \
$(DIST_DIR)/swdc/launch.bat \ $(DIST_DIR)/swdc/start.bat \
$(BUILD_DIR_ZIP)/swdc $(BUILD_DIR_ZIP)/swdc
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -125,9 +125,9 @@ $(BUILD_DIR_ZIP)/mercury.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury $(V)mkdir -p $(BUILD_DIR_ZIP)/mercury
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/mercury/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/mercuryhook/mercuryhook.dll \ $(BUILD_DIR_64)/mercuryhook/mercuryhook.dll \
$(DIST_DIR)/mercury/segatools.ini \ $(DIST_DIR)/mercury/segatools.ini \
$(DIST_DIR)/mercury/launch.bat \ $(DIST_DIR)/mercury/start.bat \
$(BUILD_DIR_ZIP)/mercury $(BUILD_DIR_ZIP)/mercury
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -141,11 +141,11 @@ $(BUILD_DIR_ZIP)/chusan.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE
$(V)cp $(DIST_DIR)/chusan/segatools.ini \ $(V)cp $(DIST_DIR)/chusan/segatools.ini \
$(DIST_DIR)/chusan/config_hook.json \ $(DIST_DIR)/chusan/config_hook.json \
$(DIST_DIR)/chusan/launch.bat \ $(DIST_DIR)/chusan/start.bat \
$(BUILD_DIR_ZIP)/chusan $(BUILD_DIR_ZIP)/chusan
$(V)cp $(BUILD_DIR_GAMES_32)/chusanhook/chusanhook.dll \ $(V)cp $(BUILD_DIR_32)/chusanhook/chusanhook.dll \
$(BUILD_DIR_ZIP)/chusan/chusanhook_x86.dll $(BUILD_DIR_ZIP)/chusan/chusanhook_x86.dll
$(V)cp $(BUILD_DIR_GAMES_64)/chusanhook/chusanhook.dll \ $(V)cp $(BUILD_DIR_64)/chusanhook/chusanhook.dll \
$(BUILD_DIR_ZIP)/chusan/chusanhook_x64.dll $(BUILD_DIR_ZIP)/chusan/chusanhook_x64.dll
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/chusan/inject_x86.exe $(BUILD_DIR_ZIP)/chusan/inject_x86.exe
@ -162,9 +162,9 @@ $(BUILD_DIR_ZIP)/mu3.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3 $(V)mkdir -p $(BUILD_DIR_ZIP)/mu3
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/mu3/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/mu3hook/mu3hook.dll \ $(BUILD_DIR_64)/mu3hook/mu3hook.dll \
$(DIST_DIR)/mu3/segatools.ini \ $(DIST_DIR)/mu3/segatools.ini \
$(DIST_DIR)/mu3/launch.bat \ $(DIST_DIR)/mu3/start.bat \
$(BUILD_DIR_ZIP)/mu3 $(BUILD_DIR_ZIP)/mu3
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -177,9 +177,9 @@ $(BUILD_DIR_ZIP)/mai2.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2 $(V)mkdir -p $(BUILD_DIR_ZIP)/mai2
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/mai2/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/mai2hook/mai2hook.dll \ $(BUILD_DIR_64)/mai2hook/mai2hook.dll \
$(DIST_DIR)/mai2/segatools.ini \ $(DIST_DIR)/mai2/segatools.ini \
$(DIST_DIR)/mai2/launch.bat \ $(DIST_DIR)/mai2/start.bat \
$(BUILD_DIR_ZIP)/mai2 $(BUILD_DIR_ZIP)/mai2
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -192,10 +192,10 @@ $(BUILD_DIR_ZIP)/cm.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm $(V)mkdir -p $(BUILD_DIR_ZIP)/cm
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm/DEVICE $(V)mkdir -p $(BUILD_DIR_ZIP)/cm/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \ $(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/cmhook/cmhook.dll \ $(BUILD_DIR_64)/cmhook/cmhook.dll \
$(DIST_DIR)/cm/config_hook.json \ $(DIST_DIR)/cm/config_hook.json \
$(DIST_DIR)/cm/segatools.ini \ $(DIST_DIR)/cm/segatools.ini \
$(DIST_DIR)/cm/launch.bat \ $(DIST_DIR)/cm/start.bat \
$(BUILD_DIR_ZIP)/cm $(BUILD_DIR_ZIP)/cm
$(V)cp pki/billing.pub \ $(V)cp pki/billing.pub \
pki/ca.crt \ pki/ca.crt \
@ -203,59 +203,6 @@ $(BUILD_DIR_ZIP)/cm.zip:
$(V)strip $(BUILD_DIR_ZIP)/cm/*.{exe,dll} $(V)strip $(BUILD_DIR_ZIP)/cm/*.{exe,dll}
$(V)cd $(BUILD_DIR_ZIP)/cm ; zip -r ../cm.zip * $(V)cd $(BUILD_DIR_ZIP)/cm ; zip -r ../cm.zip *
$(BUILD_DIR_ZIP)/tokyo.zip:
$(V)echo ... $@
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/tokyohook/tokyohook.dll \
$(DIST_DIR)/tokyo/config_hook.json \
$(DIST_DIR)/tokyo/segatools.ini \
$(DIST_DIR)/tokyo/launch.bat \
$(BUILD_DIR_ZIP)/tokyo
$(V)cp pki/billing.pub \
pki/ca.crt \
$(BUILD_DIR_ZIP)/tokyo/DEVICE
$(V)strip $(BUILD_DIR_ZIP)/tokyo/*.{exe,dll}
$(V)cd $(BUILD_DIR_ZIP)/tokyo ; zip -r ../tokyo.zip *
$(BUILD_DIR_ZIP)/kemono.zip:
$(V)echo ... $@
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono/DEVICE
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
$(DIST_DIR)/kemono/launch.bat \
$(BUILD_DIR_ZIP)/kemono
$(V)cp $(BUILD_DIR_GAMES_32)/kemonohook/kemonohook.dll \
$(BUILD_DIR_ZIP)/kemono/kemonohook_x86.dll
$(V)cp $(BUILD_DIR_GAMES_64)/kemonohook/kemonohook.dll \
$(BUILD_DIR_ZIP)/kemono/kemonohook_x64.dll
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/kemono/inject_x86.exe
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/kemono/inject_x64.exe
$(V)cp pki/billing.pub \
pki/ca.crt \
$(BUILD_DIR_ZIP)/kemono/DEVICE
for x in exe dll; do strip $(BUILD_DIR_ZIP)/kemono/*.$$x; done
$(V)cd $(BUILD_DIR_ZIP)/kemono ; zip -r ../kemono.zip *
$(BUILD_DIR_ZIP)/apm3.zip:
$(V)echo ... $@
$(V)mkdir -p $(BUILD_DIR_ZIP)/apm3
$(V)mkdir -p $(BUILD_DIR_ZIP)/apm3/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/apm3hook/apm3hook.dll \
$(DIST_DIR)/apm3/segatools.ini \
$(DIST_DIR)/apm3/launch.bat \
$(DIST_DIR)/apm3/config_hook.json \
$(BUILD_DIR_ZIP)/apm3
$(V)cp pki/billing.pub \
pki/ca.crt \
$(BUILD_DIR_ZIP)/apm3/DEVICE
$(V)strip $(BUILD_DIR_ZIP)/apm3/*.{exe,dll}
$(V)cd $(BUILD_DIR_ZIP)/apm3 ; zip -r ../apm3.zip *
$(BUILD_DIR_ZIP)/doc.zip: \ $(BUILD_DIR_ZIP)/doc.zip: \
$(DOC_DIR)/config \ $(DOC_DIR)/config \
$(DOC_DIR)/chunihook.md \ $(DOC_DIR)/chunihook.md \
@ -278,10 +225,7 @@ $(BUILD_DIR_ZIP)/segatools.zip: \
$(BUILD_DIR_ZIP)/mu3.zip \ $(BUILD_DIR_ZIP)/mu3.zip \
$(BUILD_DIR_ZIP)/mai2.zip \ $(BUILD_DIR_ZIP)/mai2.zip \
$(BUILD_DIR_ZIP)/cm.zip \ $(BUILD_DIR_ZIP)/cm.zip \
$(BUILD_DIR_ZIP)/tokyo.zip \
$(BUILD_DIR_ZIP)/fgo.zip \ $(BUILD_DIR_ZIP)/fgo.zip \
$(BUILD_DIR_ZIP)/kemono.zip \
$(BUILD_DIR_ZIP)/apm3.zip \
CHANGELOG.md \ CHANGELOG.md \
README.md \ README.md \

View File

@ -1,39 +1,31 @@
# Segatools # Segatools
Version: `2025-07-27` Version: `2024-02-22`
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms. Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.
## List of supported games ## List of supported games
* Card Maker
* starting from Card Maker
* CHUNITHM * CHUNITHM
* up to [CHUNITHM PARADISE LOST](doc/chunihook.md) * up to [CHUNITHM PARADISE LOST](doc/chunihook.md)
* starting from CHUNITHM NEW!! * starting from CHUNITHM NEW!!
* crossbeats REV.
* up to crossbeats REV. SUNRISE
* Fate/Grand Order
* Fate/Grand Order Arcade
* Hatsune Miku: Project DIVA Arcade
* up to Future Tone
* Initial D * Initial D
* [Initial D Arcade Stage Zero](doc/idzhook.md) * [Initial D Arcade Stage Zero](doc/idzhook.md)
* Initial D THE ARCADE * Initial D THE ARCADE
* maimai DX * Hatsune Miku: Project DIVA Arcade
* starting from maimai DX * up to Future Tone
* Mario & Sonic
* Mario & Sonic at the Tokyo 2020 Olympics Arcade
* O.N.G.E.K.I.
* starting from O.N.G.E.K.I.
* SEGA World Drivers Championship * SEGA World Drivers Championship
* SEGA World Drivers Championship 2019 * SEGA World Drivers Championship 2019
* Fate/Grand Order
* Fate/Grand Order Arcade
* O.N.G.E.K.I.
* starting from O.N.G.E.K.I.
* maimai DX
* starting from maimai DX
* Card Maker
* starting from Card Maker
* WACCA * WACCA
* starting from WACCA * starting from WACCA
* Kemono Friends
* Kemono Friends 3: Planet Tours
* ALL.Net P-ras MULTI Version 3
* starting from ALL.Net P-ras MULTI Version 3 1.01
## End-users ## End-users

View File

@ -12,7 +12,6 @@
#include "util/crc.h" #include "util/crc.h"
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/env.h"
struct aime_io_config { struct aime_io_config {
wchar_t aime_path[MAX_PATH]; wchar_t aime_path[MAX_PATH];
@ -69,6 +68,7 @@ static void aime_io_config_read(
cfg->felica_path, cfg->felica_path,
_countof(cfg->felica_path), _countof(cfg->felica_path),
filename); filename);
// dprintf("NFC: felicaPath GetLastError %lx\n", GetLastError());
cfg->felica_gen = GetPrivateProfileIntW( cfg->felica_gen = GetPrivateProfileIntW(
L"aime", L"aime",
@ -223,7 +223,7 @@ uint16_t aime_io_get_api_version(void)
HRESULT aime_io_init(void) HRESULT aime_io_init(void)
{ {
aime_io_config_read(&aime_io_cfg, get_config_path()); aime_io_config_read(&aime_io_cfg, L".\\segatools.ini");
return S_OK; return S_OK;
} }

View File

@ -3,6 +3,7 @@ aimeio_lib = static_library(
name_prefix : '', name_prefix : '',
include_directories: inc, include_directories: inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h',
link_with : [ link_with : [
util_lib, util_lib,
], ],

View File

@ -1,11 +1,10 @@
#include <windows.h> #include <windows.h>
#include <devioctl.h> #include <devioctl.h>
#include <winioctl.h> #include <ntdddisk.h>
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "amex/ds.h" #include "amex/ds.h"
@ -20,12 +19,14 @@
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/str.h" #include "util/str.h"
#define DS_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
#define DS_IOCTL_SETUP CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS)
#define DS_IOCTL_READ_SECTOR CTL_CODE(0x8000, 0x804, METHOD_BUFFERED, FILE_READ_ACCESS)
#pragma pack(push, 1) #pragma pack(push, 1)
enum {
DS_IOCTL_GET_ABI_VERSION = 0x80006000,
DS_IOCTL_SETUP = 0x80006004,
DS_IOCTL_READ_SECTOR = 0x80006010,
};
struct ds_eeprom { struct ds_eeprom {
uint32_t crc32; uint32_t crc32;
uint8_t unk_04[4]; uint8_t unk_04[4];

View File

@ -6,7 +6,7 @@
#include <winnt.h> #include <winnt.h>
#endif #endif
#include <devioctl.h> #include <devioctl.h>
#include <winioctl.h> #include <ntdddisk.h>
#include <assert.h> #include <assert.h>
@ -20,7 +20,9 @@
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/str.h" #include "util/str.h"
#define EEPROM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS) enum {
EEPROM_IOCTL_GET_ABI_VERSION = 0x80006000,
};
static HRESULT eeprom_handle_irp(struct irp *irp); static HRESULT eeprom_handle_irp(struct irp *irp);
static HRESULT eeprom_handle_open(struct irp *irp); static HRESULT eeprom_handle_open(struct irp *irp);

View File

@ -1,5 +1,5 @@
#include <windows.h> #include <windows.h>
#include <winioctl.h> #include <ntstatus.h>
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
@ -13,10 +13,12 @@
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/str.h" #include "util/str.h"
#define GPIO_IOCTL_SET_LEDS CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_WRITE_ACCESS) enum {
#define GPIO_IOCTL_GET_PSW CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS) GPIO_IOCTL_SET_LEDS = 0x8000A004,
#define GPIO_IOCTL_GET_DIPSW CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS) GPIO_IOCTL_GET_PSW = 0x80006008,
#define GPIO_IOCTL_DESCRIBE CTL_CODE(0x8000, 0x805, METHOD_BUFFERED, FILE_READ_ACCESS) GPIO_IOCTL_GET_DIPSW = 0x8000600C,
GPIO_IOCTL_DESCRIBE = 0x80006014,
};
enum { enum {
GPIO_TYPE_NONE = 0, GPIO_TYPE_NONE = 0,

View File

@ -4,7 +4,6 @@
#include <winternl.h> #include <winternl.h>
#include <ntstatus.h> #include <ntstatus.h>
#include <winioctl.h>
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
@ -22,9 +21,11 @@
#include "util/dump.h" #include "util/dump.h"
#include "util/str.h" #include "util/str.h"
#define JVS_IOCTL_HELLO CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS) enum {
#define JVS_IOCTL_TRANSACT CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) JVS_IOCTL_HELLO = 0x80006004,
#define JVS_IOCTL_SENSE CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS) JVS_IOCTL_SENSE = 0x8000600C,
JVS_IOCTL_TRANSACT = 0x8000E008,
};
static HRESULT jvs_handle_irp(struct irp *irp); static HRESULT jvs_handle_irp(struct irp *irp);
static HRESULT jvs_handle_open(struct irp *irp); static HRESULT jvs_handle_open(struct irp *irp);
@ -184,14 +185,14 @@ static HRESULT jvs_ioctl_sense(struct irp *irp)
static HRESULT jvs_ioctl_transact(struct irp *irp) static HRESULT jvs_ioctl_transact(struct irp *irp)
{ {
#if defined(LOG_JVS) #if 0
dprintf("\nJVS Port: Outbound frame:\n"); dprintf("\nJVS Port: Outbound frame:\n");
dump_const_iobuf(&irp->write); dump_const_iobuf(&irp->write);
#endif #endif
jvs_bus_transact(jvs_root, irp->write.bytes, irp->write.nbytes, &irp->read); jvs_bus_transact(jvs_root, irp->write.bytes, irp->write.nbytes, &irp->read);
#if defined(LOG_JVS) #if 0
dprintf("JVS Port: Inbound frame:\n"); dprintf("JVS Port: Inbound frame:\n");
dump_iobuf(&irp->read); dump_iobuf(&irp->read);
dprintf("\n"); dprintf("\n");

View File

@ -2,6 +2,7 @@ amex_lib = static_library(
'amex', 'amex',
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [ dependencies : [
capnhook.get_variable('hook_dep'), capnhook.get_variable('hook_dep'),
], ],

View File

@ -6,7 +6,7 @@
#include <winnt.h> #include <winnt.h>
#endif #endif
#include <devioctl.h> #include <devioctl.h>
#include <winioctl.h> #include <ntdddisk.h>
#include <assert.h> #include <assert.h>
@ -20,7 +20,9 @@
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/str.h" #include "util/str.h"
#define SRAM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS) enum {
SRAM_IOCTL_GET_ABI_VERSION = 0x80006000,
};
static HRESULT sram_handle_irp(struct irp *irp); static HRESULT sram_handle_irp(struct irp *irp);
static HRESULT sram_handle_open(struct irp *irp); static HRESULT sram_handle_open(struct irp *irp);

View File

@ -1,7 +1,6 @@
#pragma once #pragma once
#include <windows.h> #include <windows.h>
#include <stdbool.h>
#include "aimeio/aimeio.h" #include "aimeio/aimeio.h"

View File

@ -72,18 +72,8 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
aime_dll_config_load(&cfg->dll, filename); aime_dll_config_load(&cfg->dll, filename);
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename); cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename);
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, filename);
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename); cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename);
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename); cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
cfg->proxy_flag = GetPrivateProfileIntW(L"aime", L"proxyFlag", 2, filename);
GetPrivateProfileStringW(
L"aime",
L"authdataPath",
L"DEVICE\\authdata.bin",
cfg->authdata_path,
_countof(cfg->authdata_path),
filename);
} }
void io4_config_load(struct io4_config *cfg, const wchar_t *filename) void io4_config_load(struct io4_config *cfg, const wchar_t *filename)
@ -100,14 +90,4 @@ void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename)
assert(filename != NULL); assert(filename != NULL);
cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename); cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename);
cfg->port_no = GetPrivateProfileIntW(L"vfd", L"portNo", 0, filename);
cfg->utf_conversion = GetPrivateProfileIntW(L"vfd", L"utfConversion", 0, filename);
}
void ffb_config_load(struct ffb_config *cfg, const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
cfg->enable = GetPrivateProfileIntW(L"ffb", L"enable", 1, filename);
} }

View File

@ -6,9 +6,7 @@
#include "board/io4.h" #include "board/io4.h"
#include "board/sg-reader.h" #include "board/sg-reader.h"
#include "board/vfd.h" #include "board/vfd.h"
#include "board/ffb.h"
void aime_config_load(struct aime_config *cfg, const wchar_t *filename); void aime_config_load(struct aime_config *cfg, const wchar_t *filename);
void io4_config_load(struct io4_config *cfg, const wchar_t *filename); void io4_config_load(struct io4_config *cfg, const wchar_t *filename);
void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename); void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename);
void ffb_config_load(struct ffb_config *cfg, const wchar_t *filename);

View File

@ -16,7 +16,6 @@
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include "board/io3.h" #include "board/io3.h"
@ -80,11 +79,6 @@ static HRESULT io3_cmd_read_analogs(
struct const_iobuf *req_buf, struct const_iobuf *req_buf,
struct iobuf *resp_buf); struct iobuf *resp_buf);
static HRESULT io3_cmd_read_rotarys(
struct io3 *io3,
struct const_iobuf *req_buf,
struct iobuf *resp_buf);
static HRESULT io3_cmd_write_gpio( static HRESULT io3_cmd_write_gpio(
struct io3 *io3, struct io3 *io3,
struct const_iobuf *req_buf, struct const_iobuf *req_buf,
@ -122,13 +116,6 @@ static uint8_t io3_features[] = {
0x03, 8, 10, 0, 0x03, 8, 10, 0,
/* Feature : 0x04 : Rotary inputs
Param1 : 4 : Number of rotary channels
Param2 : 0 : N/A
Param3 : 0 : N/A */
0x04, 4, 0, 0,
/* Feature : 0x12 : GPIO outputs /* Feature : 0x12 : GPIO outputs
Param1 : 3 : Number of ports (8 bits per port) Param1 : 3 : Number of ports (8 bits per port)
Param2 : 0 : N/A Param2 : 0 : N/A
@ -232,9 +219,6 @@ static HRESULT io3_cmd(
case JVS_CMD_READ_ANALOGS: case JVS_CMD_READ_ANALOGS:
return io3_cmd_read_analogs(io3, req, resp); return io3_cmd_read_analogs(io3, req, resp);
case JVS_CMD_READ_ROTARYS:
return io3_cmd_read_rotarys(io3, req, resp);
case JVS_CMD_WRITE_GPIO: case JVS_CMD_WRITE_GPIO:
return io3_cmd_write_gpio(io3, req, resp); return io3_cmd_write_gpio(io3, req, resp);
@ -391,7 +375,7 @@ static HRESULT io3_cmd_read_switches(
return hr; return hr;
} }
#if defined(LOG_IO3) #if 0
dprintf("JVS I/O: Read switches, np=%i, bpp=%i\n", dprintf("JVS I/O: Read switches, np=%i, bpp=%i\n",
req.num_players, req.num_players,
req.bytes_per_player); req.bytes_per_player);
@ -552,60 +536,6 @@ static HRESULT io3_cmd_read_analogs(
} }
static HRESULT io3_cmd_read_rotarys(
struct io3 *io3,
struct const_iobuf *req_buf,
struct iobuf *resp_buf)
{
struct jvs_req_read_rotarys req;
uint16_t rotarys[4];
uint8_t i;
HRESULT hr;
/* Read req */
hr = iobuf_read(req_buf, &req, sizeof(req));
if (FAILED(hr)) {
return hr;
}
if (req.nrotarys > _countof(rotarys)) {
dprintf("JVS I/O: Invalid analog count %i\n", req.nrotarys);
return E_FAIL;
}
//dprintf("JVS I/O: Read rotarys, nrotarys=%i\n", req.nrotarys);
/* Write report byte */
hr = iobuf_write_8(resp_buf, 0x01);
if (FAILED(hr)) {
return hr;
}
/* Write analogs */
memset(rotarys, 0, sizeof(rotarys));
if (io3->ops->read_rotarys != NULL) {
io3->ops->read_rotarys(io3->ops_ctx, rotarys, req.nrotarys);
}
for (i = 0 ; i < req.nrotarys ; i++) {
hr = iobuf_write_be16(resp_buf, rotarys[i]);
if (FAILED(hr)) {
return hr;
}
}
return hr;
}
static HRESULT io3_cmd_write_gpio( static HRESULT io3_cmd_write_gpio(
struct io3 *io3, struct io3 *io3,
struct const_iobuf *req_buf, struct const_iobuf *req_buf,

View File

@ -18,7 +18,6 @@ struct io3_ops {
void (*write_gpio)(void *ctx, uint32_t state); void (*write_gpio)(void *ctx, uint32_t state);
void (*read_switches)(void *ctx, struct io3_switch_state *out); void (*read_switches)(void *ctx, struct io3_switch_state *out);
void (*read_analogs)(void *ctx, uint16_t *analogs, uint8_t nanalogs); void (*read_analogs)(void *ctx, uint16_t *analogs, uint8_t nanalogs);
void (*read_rotarys)(void *ctx, uint16_t *rotaries, uint8_t nrotaries);
void (*read_coin_counter)(void *ctx, uint8_t slot_no, uint16_t *out); void (*read_coin_counter)(void *ctx, uint8_t slot_no, uint16_t *out);
}; };

View File

@ -7,7 +7,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#include "board/config.h" #include "board/config.h"
#include "board/guid.h" #include "board/guid.h"
@ -49,7 +48,7 @@ static_assert(sizeof(struct io4_report_in) == 0x40, "IO4 IN report size");
struct io4_report_out { struct io4_report_out {
uint8_t report_id; uint8_t report_id;
uint8_t cmd; uint8_t cmd;
uint8_t payload[IO4_REPORT_OUT_PAYLOAD_LEN]; uint8_t payload[62];
}; };
static_assert(sizeof(struct io4_report_out) == 0x40, "IO4 OUT report size"); static_assert(sizeof(struct io4_report_out) == 0x40, "IO4 OUT report size");
@ -224,11 +223,7 @@ static HRESULT io4_handle_write(struct irp *irp)
return S_OK; return S_OK;
case IO4_CMD_SET_GENERAL_OUTPUT: case IO4_CMD_SET_GENERAL_OUTPUT:
// dprintf("USB I/O: GPIO Out\n"); dprintf("USB I/O: GPIO Out\n");
if (io4_ops->write_gpio != NULL) {
return io4_ops->write_gpio(out.payload, IO4_REPORT_OUT_PAYLOAD_LEN);
}
return S_OK; return S_OK;

View File

@ -3,9 +3,6 @@
#include <windows.h> #include <windows.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
#define IO4_REPORT_OUT_PAYLOAD_LEN 62
enum { enum {
/* System buttons in button[0] */ /* System buttons in button[0] */
@ -27,7 +24,6 @@ struct io4_state {
struct io4_ops { struct io4_ops {
HRESULT (*poll)(void *ctx, struct io4_state *state); HRESULT (*poll)(void *ctx, struct io4_state *state);
HRESULT (*write_gpio)(uint8_t* payload, size_t len);
}; };
HRESULT io4_hook_init( HRESULT io4_hook_init(

View File

@ -88,7 +88,7 @@ struct led15093_req_reset {
struct led15093_req_set_timeout { struct led15093_req_set_timeout {
struct led15093_req_hdr hdr; struct led15093_req_hdr hdr;
uint8_t cmd; uint8_t cmd;
uint16_t count; uint8_t count;
}; };
struct led15093_req_set_disable_response { struct led15093_req_set_disable_response {
@ -199,7 +199,7 @@ struct led15093_resp_board_info {
char chip_num[5]; char chip_num[5];
uint8_t endcode; // Always 0xFF uint8_t endcode; // Always 0xFF
uint8_t fw_ver; uint8_t fw_ver;
uint16_t rx_buf; uint8_t rx_buf;
}; };
struct led15093_resp_protocol_ver { struct led15093_resp_protocol_ver {

View File

@ -1,6 +1,6 @@
/* /*
SEGA 837-15093-XX LED Controller Board emulator SEGA 837-15093-XX LED Controller Board emulator
Supported variants: Supported variants:
837-15093 837-15093
@ -20,7 +20,6 @@
#include <process.h> #include <process.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "board/led15093-cmd.h" #include "board/led15093-cmd.h"
@ -107,13 +106,9 @@ static uint8_t led15093_host_adr = 1;
static io_led_init_t led_init; static io_led_init_t led_init;
static io_led_set_leds_t set_leds; static io_led_set_leds_t set_leds;
HRESULT led15093_hook_init( HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
const struct led15093_config *cfg, io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr)
io_led_init_t _led_init,
io_led_set_leds_t _set_leds,
unsigned int port_no[2])
{ {
unsigned int num_boards = 0;
assert(cfg != NULL); assert(cfg != NULL);
assert(_led_init != NULL); assert(_led_init != NULL);
@ -123,24 +118,14 @@ HRESULT led15093_hook_init(
return S_FALSE; return S_FALSE;
} }
for (int i = 0; i < led15093_nboards; i++) if (cfg->port_no != 0) {
{ first_port = cfg->port_no;
if (cfg->port_no[i] != 0) {
port_no[i] = cfg->port_no[i];
}
if (port_no[i] != 0) {
num_boards++;
}
} }
assert(num_boards != 0);
led15093_board_adr = num_boards;
led15093_host_adr = num_boards == 2 ? 1 : 2;
led_init = _led_init; led_init = _led_init;
set_leds = _set_leds; set_leds = _set_leds;
led15093_board_adr = board_adr;
led15093_host_adr = host_adr;
memcpy(led15093_board_num, cfg->board_number, sizeof(led15093_board_num)); memcpy(led15093_board_num, cfg->board_number, sizeof(led15093_board_num));
memcpy(led15093_chip_num, cfg->chip_number, sizeof(led15093_chip_num)); memcpy(led15093_chip_num, cfg->chip_number, sizeof(led15093_chip_num));
@ -154,7 +139,7 @@ HRESULT led15093_hook_init(
InitializeCriticalSection(&vb->lock); InitializeCriticalSection(&vb->lock);
uart_init(&vb->boarduart, port_no[i]); uart_init(&vb->boarduart, first_port + i);
if (cfg->high_baudrate) { if (cfg->high_baudrate) {
vb->boarduart.baud.BaudRate = 460800; vb->boarduart.baud.BaudRate = 460800;
} else { } else {
@ -223,6 +208,7 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
_led15093_per_board_vars *v = &led15093_per_board_vars[board]; _led15093_per_board_vars *v = &led15093_per_board_vars[board];
struct uart *boarduart = &led15093_per_board_vars[board].boarduart; struct uart *boarduart = &led15093_per_board_vars[board].boarduart;
/*
if (irp->op == IRP_OP_OPEN) { if (irp->op == IRP_OP_OPEN) {
// Unfortunately the LED board UART gets opened and closed repeatedly // Unfortunately the LED board UART gets opened and closed repeatedly
@ -249,6 +235,30 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
} }
} }
} }
*/
if (irp->op == IRP_OP_OPEN) {
dprintf("LED 15093: Starting backend DLL\n");
// int res = led_init();
hr = led_init();
/*
if (res != 0) {
dprintf("LED 15093: Backend error, LED board disconnected: "
"%d\n",
res);
return E_FAIL;
}
*/
if (FAILED(hr)) {
dprintf("LED 15093: Backend error, LED board disconnected: "
"%x\n",
(int) hr);
return hr;
}
}
hr = uart_handle_irp(boarduart, irp); hr = uart_handle_irp(boarduart, irp);
@ -257,12 +267,12 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
} }
for (;;) { for (;;) {
#if defined(LOG_LED15093) #if 0
dprintf("TX Buffer:\n"); dprintf("TX Buffer:\n");
dump_iobuf(&boarduart->written); dump_iobuf(&boarduart->written);
#endif #endif
req_iobuf.bytes = (uint8_t*)&req; req_iobuf.bytes = (byte*)&req;
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload); req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload);
req_iobuf.pos = 0; req_iobuf.pos = 0;
@ -284,7 +294,7 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
return hr; return hr;
} }
#if defined(LOG_LED15093) #if 0
dprintf("Deframe Buffer:\n"); dprintf("Deframe Buffer:\n");
dump_iobuf(&req_iobuf); dump_iobuf(&req_iobuf);
#endif #endif
@ -677,6 +687,16 @@ static HRESULT led15093_req_set_imm_led(int board, const struct led15093_req_set
return E_INVALIDARG; return E_INVALIDARG;
} }
/*
if (board == 0) {
dprintf("board %d: red: %d, green: %d, blue: %d\n", board, req->data[0x96], req->data[0x97], req->data[0x98]);
}
else if (board == 1)
{
dprintf("board %d: red: %d, green: %d, blue: %d\n", board, req->data[0xb4], req->data[0xb5], req->data[0xb6]);
}
*/
// Return the current LED data, remove const qualifier // Return the current LED data, remove const qualifier
set_leds(board, (uint8_t *) req->data); set_leds(board, (uint8_t *) req->data);
@ -697,7 +717,7 @@ static HRESULT led15093_req_set_imm_led(int board, const struct led15093_req_set
resp.status = v->status_code; resp.status = v->status_code;
if (req->cmd == LED_15093_CMD_SET_IMM_LED) { if (req->cmd == LED_15093_CMD_SET_IMM_LED) {
resp.cmd = LED_15093_CMD_SET_IMM_LED; resp.cmd = LED_15093_CMD_SET_IMM_LED;
} }
// else { // else {
// resp.cmd = LED_15093_CMD_SET_IMM_LED_LEGACY; // resp.cmd = LED_15093_CMD_SET_IMM_LED_LEGACY;
// } // }

View File

@ -8,7 +8,7 @@
struct led15093_config { struct led15093_config {
bool enable; bool enable;
bool high_baudrate; bool high_baudrate;
unsigned int port_no[2]; unsigned int port_no;
char board_number[8]; char board_number[8];
char chip_number[5]; char chip_number[5];
char boot_chip_number[5]; char boot_chip_number[5];
@ -20,5 +20,5 @@ typedef HRESULT (*io_led_init_t)(void);
typedef void (*io_led_set_leds_t)(uint8_t board, uint8_t *rgb); typedef void (*io_led_set_leds_t)(uint8_t board, uint8_t *rgb);
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init, HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
io_led_set_leds_t _set_leds, unsigned int port_no[2]); io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr);

View File

@ -2,6 +2,7 @@ board_lib = static_library(
'board', 'board',
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [ dependencies : [
capnhook.get_variable('hook_dep'), capnhook.get_variable('hook_dep'),
], ],
@ -24,11 +25,6 @@ board_lib = static_library(
'led15093-frame.h', 'led15093-frame.h',
'led15093.c', 'led15093.c',
'led15093.h', 'led15093.h',
'led15070-cmd.h',
'led15070-frame.c',
'led15070-frame.h',
'led15070.c',
'led15070.h',
'sg-cmd.c', 'sg-cmd.c',
'sg-cmd.h', 'sg-cmd.h',
'sg-frame.c', 'sg-frame.c',
@ -46,10 +42,5 @@ board_lib = static_library(
'slider-frame.h', 'slider-frame.h',
'vfd.c', 'vfd.c',
'vfd.h', 'vfd.h',
'vfd-cmd.h',
'vfd-frame.c',
'vfd-frame.h',
'ffb.c',
'ffb.h'
], ],
) )

View File

@ -25,13 +25,6 @@ struct sg_res_header {
uint8_t payload_len; uint8_t payload_len;
}; };
/* struct to save the version string with its length
to fix NUL terminator issues */
struct version_info {
const char *version;
uint8_t length;
};
typedef HRESULT (*sg_dispatch_fn_t)( typedef HRESULT (*sg_dispatch_fn_t)(
void *ctx, void *ctx,
const void *req, const void *req,

View File

@ -27,11 +27,11 @@ static HRESULT sg_led_cmd_set_color(
const struct sg_led *led, const struct sg_led *led,
const struct sg_led_req_set_color *req); const struct sg_led_req_set_color *req);
static const struct version_info led_version[] = { const char *sg_led_info[] = {
{"15084\xFF\x10\x00\x12", 9}, "15084\xFF\x10\x00\x12",
{"000-00000\xFF\x11\x40", 12}, "000-00000\xFF\x11\x40",
// maybe the same? // maybe the same?
{"000-00000\xFF\x11\x40", 12} "000-00000\xFF\x11\x40"
}; };
void sg_led_init( void sg_led_init(
@ -156,10 +156,10 @@ static HRESULT sg_led_cmd_get_info(
{ {
sg_led_dprintf(led, "Get info\n"); sg_led_dprintf(led, "Get info\n");
const struct version_info *fw = &led_version[led->gen - 1]; unsigned int len = strlen(sg_led_info[led->gen - 1]);
sg_res_init(&res->res, req, fw->length); sg_res_init(&res->res, req, len);
memcpy(res->payload, fw->version, fw->length); memcpy(res->payload, sg_led_info[led->gen - 1], len);
return S_OK; return S_OK;
} }

View File

@ -5,21 +5,19 @@
#pragma pack(push, 1) #pragma pack(push, 1)
enum { enum {
SG_NFC_CMD_GET_FW_VERSION = 0x30, SG_NFC_CMD_GET_FW_VERSION = 0x30,
SG_NFC_CMD_GET_HW_VERSION = 0x32, SG_NFC_CMD_GET_HW_VERSION = 0x32,
SG_NFC_CMD_RADIO_ON = 0x40, SG_NFC_CMD_RADIO_ON = 0x40,
SG_NFC_CMD_RADIO_OFF = 0x41, SG_NFC_CMD_RADIO_OFF = 0x41,
SG_NFC_CMD_POLL = 0x42, SG_NFC_CMD_POLL = 0x42,
SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43, SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43,
SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x50, SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x50,
SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME = 0x51, SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52,
SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52, SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x54,
SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x54, SG_NFC_CMD_MIFARE_AUTHENTICATE = 0x55, /* guess based on time sent */
SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA = 0x55, SG_NFC_CMD_SEND_HEX_DATA = 0x61,
SG_NFC_CMD_TO_UPDATE_MODE = 0x60, SG_NFC_CMD_RESET = 0x62,
SG_NFC_CMD_SEND_HEX_DATA = 0x61, SG_NFC_CMD_FELICA_ENCAP = 0x71,
SG_NFC_CMD_RESET = 0x62,
SG_NFC_CMD_FELICA_ENCAP = 0x71,
}; };
struct sg_nfc_res_get_fw_version { struct sg_nfc_res_get_fw_version {
@ -34,7 +32,7 @@ struct sg_nfc_res_get_hw_version {
struct sg_nfc_req_mifare_set_key { struct sg_nfc_req_mifare_set_key {
struct sg_req_header req; struct sg_req_header req;
uint8_t key[6]; uint8_t key_a[6];
}; };
struct sg_nfc_req_mifare_50 { struct sg_nfc_req_mifare_50 {

View File

@ -2,7 +2,6 @@
#include <assert.h> #include <assert.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
@ -17,7 +16,6 @@
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/dump.h" #include "util/dump.h"
#include "util/slurp.h"
static HRESULT sg_nfc_dispatch( static HRESULT sg_nfc_dispatch(
void *ctx, void *ctx,
@ -62,26 +60,21 @@ static HRESULT sg_nfc_cmd_felica_encap(
const struct sg_nfc_req_felica_encap *req, const struct sg_nfc_req_felica_encap *req,
struct sg_nfc_res_felica_encap *res); struct sg_nfc_res_felica_encap *res);
static HRESULT sg_nfc_cmd_send_hex_data(
struct sg_nfc *nfc,
const struct sg_req_header *req,
struct sg_res_header *res);
static HRESULT sg_nfc_cmd_dummy( static HRESULT sg_nfc_cmd_dummy(
struct sg_nfc *nfc, struct sg_nfc *nfc,
const struct sg_req_header *req, const struct sg_req_header *req,
struct sg_res_header *res); struct sg_res_header *res);
static const struct version_info hw_version[] = { static const char *hw_version[] = {
{"TN32MSEC003S H/W Ver3.0", 23}, "TN32MSEC003S H/W Ver3.0",
{"837-15286", 9}, "837-15286",
{"837-15396", 9} "837-15396"
}; };
static const struct version_info fw_version[] = { static const char *fw_version[] = {
{"TN32MSEC003S F/W Ver1.2", 23}, "TN32MSEC003S F/W Ver1.2",
{"\x94", 1}, "\x94",
{"\x94", 1} "\x94"
}; };
void sg_nfc_init( void sg_nfc_init(
@ -89,8 +82,6 @@ void sg_nfc_init(
uint8_t addr, uint8_t addr,
const struct sg_nfc_ops *ops, const struct sg_nfc_ops *ops,
unsigned int gen, unsigned int gen,
unsigned int proxy_flag,
const wchar_t* authdata_path,
void *ops_ctx) void *ops_ctx)
{ {
assert(nfc != NULL); assert(nfc != NULL);
@ -100,8 +91,6 @@ void sg_nfc_init(
nfc->ops_ctx = ops_ctx; nfc->ops_ctx = ops_ctx;
nfc->addr = addr; nfc->addr = addr;
nfc->gen = gen; nfc->gen = gen;
nfc->proxy_flag = proxy_flag;
nfc->authdata_path = authdata_path;
} }
#ifdef NDEBUG #ifdef NDEBUG
@ -195,17 +184,13 @@ static HRESULT sg_nfc_dispatch(
&req->felica_encap, &req->felica_encap,
&res->felica_encap); &res->felica_encap);
case SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME: case SG_NFC_CMD_MIFARE_AUTHENTICATE:
case SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA:
case SG_NFC_CMD_SEND_HEX_DATA:
return sg_nfc_cmd_send_hex_data(nfc, &req->simple, &res->simple);
case SG_NFC_CMD_MIFARE_SELECT_TAG: case SG_NFC_CMD_MIFARE_SELECT_TAG:
case SG_NFC_CMD_MIFARE_SET_KEY_AIME: case SG_NFC_CMD_MIFARE_SET_KEY_AIME:
case SG_NFC_CMD_MIFARE_SET_KEY_BANA: case SG_NFC_CMD_MIFARE_SET_KEY_BANA:
case SG_NFC_CMD_RADIO_ON: case SG_NFC_CMD_RADIO_ON:
case SG_NFC_CMD_RADIO_OFF: case SG_NFC_CMD_RADIO_OFF:
case SG_NFC_CMD_TO_UPDATE_MODE: case SG_NFC_CMD_SEND_HEX_DATA: // TODO: implement?
return sg_nfc_cmd_dummy(nfc, &req->simple, &res->simple); return sg_nfc_cmd_dummy(nfc, &req->simple, &res->simple);
default: default:
@ -232,11 +217,11 @@ static HRESULT sg_nfc_cmd_get_fw_version(
const struct sg_req_header *req, const struct sg_req_header *req,
struct sg_nfc_res_get_fw_version *res) struct sg_nfc_res_get_fw_version *res)
{ {
const struct version_info *fw = &fw_version[nfc->gen - 1]; unsigned int len = strlen(fw_version[nfc->gen - 1]);
/* Dest version is not NUL terminated, this is intentional */ /* Dest version is not NUL terminated, this is intentional */
sg_res_init(&res->res, req, fw->length); sg_res_init(&res->res, req, len);
memcpy(res->version, fw->version, fw->length); memcpy(res->version, fw_version[nfc->gen - 1], len);
return S_OK; return S_OK;
} }
@ -246,11 +231,11 @@ static HRESULT sg_nfc_cmd_get_hw_version(
const struct sg_req_header *req, const struct sg_req_header *req,
struct sg_nfc_res_get_hw_version *res) struct sg_nfc_res_get_hw_version *res)
{ {
const struct version_info *hw = &hw_version[nfc->gen - 1]; unsigned int len = strlen(hw_version[nfc->gen - 1]);
/* Dest version is not NUL terminated, this is intentional */ /* Dest version is not NUL terminated, this is intentional */
sg_res_init(&res->res, req, hw->length); sg_res_init(&res->res, req, len);
memcpy(res->version, hw->version, hw->length); memcpy(res->version, hw_version[nfc->gen - 1], len);
return S_OK; return S_OK;
} }
@ -321,7 +306,6 @@ static HRESULT sg_nfc_poll_aime(
mifare->type = 0x10; mifare->type = 0x10;
mifare->id_len = sizeof(mifare->uid); mifare->id_len = sizeof(mifare->uid);
// mifare->uid = _byteswap_ulong(0x8FBECBFF);
mifare->uid = _byteswap_ulong(0x01020304); mifare->uid = _byteswap_ulong(0x01020304);
/* Initialize MIFARE IC emulator */ /* Initialize MIFARE IC emulator */
@ -361,13 +345,13 @@ static HRESULT sg_nfc_poll_felica(
felica->type = 0x20; felica->type = 0x20;
felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm); felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm);
felica->IDm = _byteswap_uint64(IDm); felica->IDm = _byteswap_uint64(IDm);
felica->PMm = _byteswap_uint64(felica_get_amusement_ic_PMm()); felica->PMm = _byteswap_uint64(felica_get_generic_PMm());
/* Initialize FeliCa IC emulator */ /* Initialize FeliCa IC emulator */
nfc->felica.IDm = IDm; nfc->felica.IDm = IDm;
nfc->felica.PMm = felica_get_amusement_ic_PMm(); nfc->felica.PMm = felica_get_generic_PMm();
nfc->felica.system_code = 0x88b4; nfc->felica.system_code = 0x0000;
return S_OK; return S_OK;
} }
@ -389,62 +373,18 @@ static HRESULT sg_nfc_cmd_mifare_read_block(
sg_nfc_dprintf(nfc, "Read uid %08x block %i\n", uid, req->payload.block_no); sg_nfc_dprintf(nfc, "Read uid %08x block %i\n", uid, req->payload.block_no);
if (req->payload.block_no > 14) { if (req->payload.block_no > 3) {
sg_nfc_dprintf(nfc, "MIFARE block number out of range\n"); sg_nfc_dprintf(nfc, "MIFARE block number out of range\n");
return E_FAIL; return E_FAIL;
} else if (req->payload.block_no >= 5){ // emoney auth encrypted
sg_res_init(&res->res, &req->req, sizeof(res->block));
char* auth;
long size = wslurp(nfc->authdata_path, &auth, false);
if (size < 0){
sg_nfc_dprintf(nfc, "Failed to read %ls: %lx!\n", nfc->authdata_path, GetLastError());
return E_FAIL;
}
int offset = 0;
if (req->payload.block_no == 6){
offset = 16;
} else if (req->payload.block_no == 8){
offset = 32;
} else if (req->payload.block_no == 9){
offset = 48;
} else if (req->payload.block_no == 10){
offset = 64;
} else if (req->payload.block_no == 12){
offset = 82;
} else if (req->payload.block_no == 13){
offset = 98;
} else if (req->payload.block_no == 14){
offset = 114;
}
for (int i = 0; i < 16 && offset + i < size; i++){
res->block[i] = auth[offset + i];
}
free(auth);
} else if (req->payload.block_no == 4){ // emoney auth plain
sg_res_init(&res->res, &req->req, sizeof(res->block));
res->block[0] = 0x54; // header
res->block[1] = 0x43;
res->block[2] = nfc->proxy_flag; // 2 or 3 depending on game (useProxy in env.json)
res->block[3] = 0x01; // unknown flag
} else { // read all other blocks normally
sg_res_init(&res->res, &req->req, sizeof(res->block));
memcpy( res->block,
nfc->mifare.sectors[0].blocks[req->payload.block_no].bytes,
sizeof(res->block));
} }
sg_res_init(&res->res, &req->req, sizeof(res->block));
memcpy( res->block,
nfc->mifare.sectors[0].blocks[req->payload.block_no].bytes,
sizeof(res->block));
return S_OK; return S_OK;
} }
@ -480,7 +420,7 @@ static HRESULT sg_nfc_cmd_felica_encap(
f_res.nbytes = sizeof(res->payload); f_res.nbytes = sizeof(res->payload);
f_res.pos = 1; f_res.pos = 1;
#if defined(LOG_NFC) #if 0
dprintf("FELICA OUTBOUND:\n"); dprintf("FELICA OUTBOUND:\n");
dump_const_iobuf(&f_req); dump_const_iobuf(&f_req);
#endif #endif
@ -494,7 +434,7 @@ static HRESULT sg_nfc_cmd_felica_encap(
sg_res_init(&res->res, &req->req, f_res.pos); sg_res_init(&res->res, &req->req, f_res.pos);
res->payload[0] = f_res.pos; res->payload[0] = f_res.pos;
#if defined(LOG_NFC) #if 0
dprintf("FELICA INBOUND:\n"); dprintf("FELICA INBOUND:\n");
dump_iobuf(&f_res); dump_iobuf(&f_res);
#endif #endif
@ -502,22 +442,6 @@ static HRESULT sg_nfc_cmd_felica_encap(
return S_OK; return S_OK;
} }
static HRESULT sg_nfc_cmd_send_hex_data(
struct sg_nfc *nfc,
const struct sg_req_header *req,
struct sg_res_header *res)
{
sg_res_init(res, req, 0);
/* Firmware checksum length? */
if (req->payload_len == 0x2b) {
/* The firmware is identical flag? */
res->status = 0x20;
}
return S_OK;
}
static HRESULT sg_nfc_cmd_dummy( static HRESULT sg_nfc_cmd_dummy(
struct sg_nfc *nfc, struct sg_nfc *nfc,
const struct sg_req_header *req, const struct sg_req_header *req,

View File

@ -23,10 +23,8 @@ struct sg_nfc {
void *ops_ctx; void *ops_ctx;
uint8_t addr; uint8_t addr;
unsigned int gen; unsigned int gen;
unsigned int proxy_flag;
struct felica felica; struct felica felica;
struct mifare mifare; struct mifare mifare;
const wchar_t* authdata_path;
}; };
void sg_nfc_init( void sg_nfc_init(
@ -34,8 +32,6 @@ void sg_nfc_init(
uint8_t addr, uint8_t addr,
const struct sg_nfc_ops *ops, const struct sg_nfc_ops *ops,
unsigned int gen, unsigned int gen,
unsigned int proxy_flag,
const wchar_t* authdata_path,
void *ops_ctx); void *ops_ctx);
void sg_nfc_transact( void sg_nfc_transact(

View File

@ -47,7 +47,7 @@ static struct sg_led sg_reader_led;
HRESULT sg_reader_hook_init( HRESULT sg_reader_hook_init(
const struct aime_config *cfg, const struct aime_config *cfg,
unsigned int default_port_no, unsigned int port_no,
unsigned int gen, unsigned int gen,
HINSTANCE self) HINSTANCE self)
{ {
@ -66,11 +66,6 @@ HRESULT sg_reader_hook_init(
return hr; return hr;
} }
unsigned int port_no = cfg->port_no;
if (port_no == 0){
port_no = default_port_no;
}
if (cfg->gen != 0) { if (cfg->gen != 0) {
gen = cfg->gen; gen = cfg->gen;
} }
@ -81,7 +76,7 @@ HRESULT sg_reader_hook_init(
return E_INVALIDARG; return E_INVALIDARG;
} }
sg_nfc_init(&sg_reader_nfc, 0x00, &sg_reader_nfc_ops, gen, cfg->proxy_flag, cfg->authdata_path, NULL); sg_nfc_init(&sg_reader_nfc, 0x00, &sg_reader_nfc_ops, gen, NULL);
sg_led_init(&sg_reader_led, 0x08, &sg_reader_led_ops, gen, NULL); sg_led_init(&sg_reader_led, 0x08, &sg_reader_led_ops, gen, NULL);
InitializeCriticalSection(&sg_reader_lock); InitializeCriticalSection(&sg_reader_lock);
@ -90,7 +85,6 @@ HRESULT sg_reader_hook_init(
sg_reader_uart.baud.BaudRate = 38400; sg_reader_uart.baud.BaudRate = 38400;
} }
dprintf("NFC Assembly: enabling (port=%d)\n", port_no);
uart_init(&sg_reader_uart, port_no); uart_init(&sg_reader_uart, port_no);
sg_reader_uart.written.bytes = sg_reader_written_bytes; sg_reader_uart.written.bytes = sg_reader_written_bytes;
sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes); sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes);
@ -121,14 +115,14 @@ static HRESULT sg_reader_handle_irp_locked(struct irp *irp)
{ {
HRESULT hr; HRESULT hr;
#if defined(LOG_NFC) #if 0
if (irp->op == IRP_OP_WRITE) { if (irp->op == IRP_OP_WRITE) {
dprintf("WRITE:\n"); dprintf("WRITE:\n");
dump_const_iobuf(&irp->write); dump_const_iobuf(&irp->write);
} }
#endif #endif
#if defined(LOG_NFC) #if 0
if (irp->op == IRP_OP_READ) { if (irp->op == IRP_OP_READ) {
dprintf("READ:\n"); dprintf("READ:\n");
dump_iobuf(&sg_reader_uart.readable); dump_iobuf(&sg_reader_uart.readable);

View File

@ -9,15 +9,12 @@
struct aime_config { struct aime_config {
struct aime_dll_config dll; struct aime_dll_config dll;
bool enable; bool enable;
unsigned int port_no;
bool high_baudrate; bool high_baudrate;
unsigned int gen; unsigned int gen;
unsigned int proxy_flag;
wchar_t authdata_path[MAX_PATH];
}; };
HRESULT sg_reader_hook_init( HRESULT sg_reader_hook_init(
const struct aime_config *cfg, const struct aime_config *cfg,
unsigned int default_port_no, unsigned int port_no,
unsigned int gen, unsigned int gen,
HINSTANCE self); HINSTANCE self);

70
board/vfd.c Normal file
View File

@ -0,0 +1,70 @@
/* This is some sort of LCD display found on various cabinets. It is driven
directly by amdaemon, and it has something to do with displaying the status
of electronic payments.
Part number in schematics is "VFD GP1232A02A FUTABA".
Little else about this board is known. Black-holing the RS232 comms that it
receives seems to be sufficient for the time being. */
#include <windows.h>
#include <assert.h>
#include <stdint.h>
#include "board/vfd.h"
#include "hook/iohook.h"
#include "hooklib/uart.h"
#include "util/dprintf.h"
#include "util/dump.h"
static HRESULT vfd_handle_irp(struct irp *irp);
static struct uart vfd_uart;
static uint8_t vfd_written[512];
static uint8_t vfd_readable[512];
HRESULT vfd_hook_init(const struct vfd_config *cfg, unsigned int port_no)
{
assert(cfg != NULL);
if (!cfg->enable) {
return S_FALSE;
}
uart_init(&vfd_uart, port_no);
vfd_uart.written.bytes = vfd_written;
vfd_uart.written.nbytes = sizeof(vfd_written);
vfd_uart.readable.bytes = vfd_readable;
vfd_uart.readable.nbytes = sizeof(vfd_readable);
dprintf("VFD: hook enabled.\n");
return iohook_push_handler(vfd_handle_irp);
}
static HRESULT vfd_handle_irp(struct irp *irp)
{
HRESULT hr;
assert(irp != NULL);
if (!uart_match_irp(&vfd_uart, irp)) {
return iohook_invoke_next(irp);
}
hr = uart_handle_irp(&vfd_uart, irp);
if (FAILED(hr) || irp->op != IRP_OP_WRITE) {
return hr;
}
dprintf("VFD TX:\n");
dump_iobuf(&vfd_uart.written);
vfd_uart.written.pos = 0;
return hr;
}

10
board/vfd.h Normal file
View File

@ -0,0 +1,10 @@
#pragma once
#include <windows.h>
struct vfd_config {
bool enable;
};
HRESULT vfd_hook_init(const struct vfd_config *cfg, unsigned int port_no);

View File

@ -78,7 +78,7 @@ static HRESULT controlbd_frame_decode(struct controlbd_req_any *req, struct iobu
uint8_t checksum_pos = src->pos - 1; uint8_t checksum_pos = src->pos - 1;
uint8_t calculated_checksum = 0; uint8_t calculated_checksum = 0;
uint8_t checksum = 0; uint8_t checksum = 0;
if (src->pos < 6) { if (src->pos < 6) {
dprintf("Control Board: Decode Error, request too short (pos is 0x%08X)\n", (int)src->pos); dprintf("Control Board: Decode Error, request too short (pos is 0x%08X)\n", (int)src->pos);
return SEC_E_BUFFER_TOO_SMALL; return SEC_E_BUFFER_TOO_SMALL;
@ -137,7 +137,7 @@ static HRESULT controlbd_handle_irp_locked(struct irp *irp)
for (;;) { for (;;) {
if (controlbd_uart.written.bytes[0] == 0xE0) { if (controlbd_uart.written.bytes[0] == 0xE0) {
#if defined(LOG_CAROL_CONTROL_BD) #if 0
dprintf("Control Board: TX Buffer:\n"); dprintf("Control Board: TX Buffer:\n");
dump_iobuf(&controlbd_uart.written); dump_iobuf(&controlbd_uart.written);
#endif #endif
@ -147,12 +147,12 @@ static HRESULT controlbd_handle_irp_locked(struct irp *irp)
return hr; return hr;
} }
hr = controlbd_req_dispatch(&req); hr = controlbd_req_dispatch(&req);
if (FAILED(hr)) { if (FAILED(hr)) {
dprintf("Control Board: Dispatch Error: 0X%X\n", (int) hr); dprintf("Control Board: Dispatch Error: 0X%X\n", (int) hr);
return hr; return hr;
} }
#if defined(LOG_CAROL_CONTROL_BD) #if 0
dprintf("Control Board: RX Buffer:\n"); dprintf("Control Board: RX Buffer:\n");
dump_iobuf(&controlbd_uart.readable); dump_iobuf(&controlbd_uart.readable);
#endif #endif
@ -206,7 +206,7 @@ static HRESULT controlbd_req_dispatch(const struct controlbd_req_any *req)
case CONTROLBD_CMD_FIRM_SUM: case CONTROLBD_CMD_FIRM_SUM:
return controlbd_req_firmware_checksum(); return controlbd_req_firmware_checksum();
case CONTROLBD_CMD_TIMEOUT: case CONTROLBD_CMD_TIMEOUT:
dprintf("Control Board: Acknowledge Timeout\n"); dprintf("Control Board: Acknowledge Timeout\n");
return controlbd_req_ack_any(req->hdr.cmd); return controlbd_req_ack_any(req->hdr.cmd);
@ -278,7 +278,7 @@ static HRESULT controlbd_req_get_board_info(void)
resp.rev = 0x90; resp.rev = 0x90;
resp.bfr_size = 0x0001; resp.bfr_size = 0x0001;
resp.ack = 1; resp.ack = 1;
strcpy_s(resp.bd_no, sizeof(resp.bd_no), "15312 "); strcpy_s(resp.bd_no, sizeof(resp.bd_no), "15312 ");
strcpy_s(resp.chip_no, sizeof(resp.chip_no), "6699 "); strcpy_s(resp.chip_no, sizeof(resp.chip_no), "6699 ");
resp.chip_no[5] = 0xFF; resp.chip_no[5] = 0xFF;
@ -317,7 +317,7 @@ static HRESULT controlbd_req_polling(const struct controlbd_req_any *req)
resp.unk7 = 3; resp.unk7 = 3;
resp.unk8 = 1; resp.unk8 = 1;
resp.unk9 = 1; resp.unk9 = 1;
resp.btns_pressed = 0; // bit 1 is pen button, bit 2 is dodge resp.btns_pressed = 0; // bit 1 is pen button, bit 2 is dodge
resp.coord_x = 0x0; resp.coord_x = 0x0;
resp.coord_y = 0x0; resp.coord_y = 0x0;

View File

@ -1,31 +1,3 @@
/*
"Wonderland Wars" (carol*) hook
Devices:
JVS: 837-14572 "Type 3" I/O Board
[Satellite]
USB: "WinTouch" Controller Board
^ (DIPSW2 ON, Version 5.xx.xx or above)
COM1: 3M Touch Systems 78-0011-2353-4 Touch Controller Board
^ (DIPSW2 OFF)
COM10: TN32MSEC003S "Gen 1" Aime Reader
OR
837-15286 "Gen 2" Aime Reader
^ (Version 1.6x.xx or above)
COM11: 837-15070-02 LED Controller Board
COM12: 837-15312 Pen Controller I/O Board
[Terminal]
COM10: 837-15286 "Gen 2" Aime Reader
*: SEGA's abbreviation for Lewis Carroll, author of Alice's Adventures in
Wonderland.
*/
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -53,7 +25,6 @@
#include "platform/platform.h" #include "platform/platform.h"
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/env.h"
static HMODULE carol_hook_mod; static HMODULE carol_hook_mod;
static process_entry_t carol_startup; static process_entry_t carol_startup;
@ -74,6 +45,8 @@ static DWORD CALLBACK carol_pre_startup(void)
HMODULE dbghelp; HMODULE dbghelp;
dprintf("--- Begin carol_pre_startup ---\n"); dprintf("--- Begin carol_pre_startup ---\n");
if ( !SetProcessDPIAware() )
dprintf("Failed to set process DPI awareness level!\n");
/* Pin the D3D shader compiler. This makes startup much faster. */ /* Pin the D3D shader compiler. This makes startup much faster. */
@ -99,7 +72,7 @@ static DWORD CALLBACK carol_pre_startup(void)
/* Config load */ /* Config load */
carol_hook_config_load(&carol_hook_cfg, get_config_path()); carol_hook_config_load(&carol_hook_cfg, L".\\segatools.ini");
/* Hook Win32 APIs */ /* Hook Win32 APIs */
@ -163,7 +136,7 @@ static DWORD CALLBACK carol_pre_startup(void)
} }
/* Initialize debug helpers */ /* Initialize debug helpers */
spike_hook_init(get_config_path()); spike_hook_init(L".\\segatools.ini");
dprintf("--- End carol_pre_startup ---\n"); dprintf("--- End carol_pre_startup ---\n");

View File

@ -94,7 +94,7 @@ static HRESULT ledbd_handle_irp_locked(struct irp *irp)
} }
for (;;) { for (;;) {
#if defined(LOG_CAROL_LED_BD) #if 0
dprintf("LED Board: TX Buffer:\n"); dprintf("LED Board: TX Buffer:\n");
dump_iobuf(&ledbd_uart.written); dump_iobuf(&ledbd_uart.written);
#endif #endif
@ -165,4 +165,4 @@ static HRESULT ledbd_req_unkF0(uint8_t cmd)
iobuf_write(&ledbd_uart.readable, resp, 16); iobuf_write(&ledbd_uart.readable, resp, 16);
return S_OK; return S_OK;
} }

View File

@ -4,6 +4,7 @@ shared_library(
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
vs_module_defs : 'carolhook.def', vs_module_defs : 'carolhook.def',
c_pch : '../precompiled.h',
dependencies : [ dependencies : [
capnhook.get_variable('hook_dep'), capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'), capnhook.get_variable('hooklib_dep'),

View File

@ -54,7 +54,7 @@ HRESULT touch_hook_init(const struct touch_config *cfg)
if (!cfg->enable) { if (!cfg->enable) {
return S_OK; return S_OK;
} }
InitializeCriticalSection(&touch_lock); InitializeCriticalSection(&touch_lock);
uart_init(&touch_uart, 1); uart_init(&touch_uart, 1);
@ -112,7 +112,7 @@ static HRESULT touch_handle_irp_locked(struct irp *irp)
} }
for (;;) { for (;;) {
#if defined(LOG_CAROL_TOUCH) #if 0
dprintf("Touchscreen: TX Buffer:\n"); dprintf("Touchscreen: TX Buffer:\n");
dump_iobuf(&touch_uart.written); dump_iobuf(&touch_uart.written);
#endif #endif
@ -188,7 +188,7 @@ static void touch_scan_auto(const bool is_pressed, const uint16_t mouse_x, const
resp.touches[0].touch_id = 1; resp.touches[0].touch_id = 1;
tmp_x = mouse_x & 0x7FFF; tmp_x = mouse_x & 0x7FFF;
tmp_y = mouse_y & 0x7FFF; tmp_y = mouse_y & 0x7FFF;
resp.touches[0].x1 = tmp_x & 0x7F; resp.touches[0].x1 = tmp_x & 0x7F;
resp.touches[0].x2 = (tmp_x >> 7) & 0x7F; resp.touches[0].x2 = (tmp_x >> 7) & 0x7F;
resp.touches[0].y1 = tmp_y & 0x7F; resp.touches[0].y1 = tmp_y & 0x7F;
@ -196,12 +196,12 @@ static void touch_scan_auto(const bool is_pressed, const uint16_t mouse_x, const
flg = resp.touches[0].x1 != last_x1 || resp.touches[0].x2 != last_x2 || resp.touches[0].y1 != last_y1 || resp.touches[0].y2 != last_y2; flg = resp.touches[0].x1 != last_x1 || resp.touches[0].x2 != last_x2 || resp.touches[0].y1 != last_y1 || resp.touches[0].y2 != last_y2;
#if 0 #if 1
if (flg) if (flg)
dprintf("Touch: Mouse down! x %02X %02X y: %02X %02X\n", resp.touches[0].x1, resp.touches[0].x2, resp.touches[0].y1, resp.touches[0].y2); dprintf("Touch: Mouse down! x %02X %02X y: %02X %02X\n", resp.touches[0].x1, resp.touches[0].x2, resp.touches[0].y1, resp.touches[0].y2);
#endif #endif
last_x1 = resp.touches[0].x1; last_x1 = resp.touches[0].x1;
last_x2 = resp.touches[0].x2; last_x2 = resp.touches[0].x2;
last_y1 = resp.touches[0].y1; last_y1 = resp.touches[0].y1;
@ -220,7 +220,7 @@ static void touch_scan_auto(const bool is_pressed, const uint16_t mouse_x, const
iobuf_write(&touch_uart.readable, &resp, sizeof(resp)); iobuf_write(&touch_uart.readable, &resp, sizeof(resp));
LeaveCriticalSection(&touch_lock); LeaveCriticalSection(&touch_lock);
#if defined(LOG_CAROL_TOUCH) #if 0
dprintf("Touch: RX Buffer: (pos %08x)\n", (uint32_t)touch_uart.readable.pos); dprintf("Touch: RX Buffer: (pos %08x)\n", (uint32_t)touch_uart.readable.pos);
dump_iobuf(&touch_uart.readable); dump_iobuf(&touch_uart.readable);
#endif #endif

View File

@ -8,7 +8,6 @@
#include "carolio/carolio.h" #include "carolio/carolio.h"
#include "carolio/config.h" #include "carolio/config.h"
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/env.h"
static unsigned int __stdcall carol_io_touch_thread_proc(void *ctx); static unsigned int __stdcall carol_io_touch_thread_proc(void *ctx);
@ -26,7 +25,7 @@ uint16_t carol_io_get_api_version(void)
HRESULT carol_io_jvs_init(void) HRESULT carol_io_jvs_init(void)
{ {
carol_io_config_load(&carol_io_cfg, get_config_path()); carol_io_config_load(&carol_io_cfg, L".\\segatools.ini");
return S_OK; return S_OK;
} }
@ -179,4 +178,4 @@ static unsigned int __stdcall carol_io_touch_thread_proc(void *ctx)
} }
return 0; return 0;
} }

View File

@ -3,6 +3,7 @@ carolio_lib = static_library(
name_prefix : '', name_prefix : '',
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [ sources : [
'carolio.c', 'carolio.c',
'carolio.h', 'carolio.h',

View File

@ -3,7 +3,6 @@
#include <assert.h> #include <assert.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h>
#include "amex/amex.h" #include "amex/amex.h"
#include "amex/config.h" #include "amex/config.h"
@ -56,8 +55,7 @@ void led15093_config_load(struct led15093_config *cfg, const wchar_t *filename)
memset(cfg->boot_chip_number, ' ', sizeof(cfg->boot_chip_number)); memset(cfg->boot_chip_number, ' ', sizeof(cfg->boot_chip_number));
cfg->enable = GetPrivateProfileIntW(L"led15093", L"enable", 1, filename); cfg->enable = GetPrivateProfileIntW(L"led15093", L"enable", 1, filename);
cfg->port_no[0] = GetPrivateProfileIntW(L"led15093", L"portNo1", 0, filename); cfg->port_no = 0;
cfg->port_no[1] = GetPrivateProfileIntW(L"led15093", L"portNo2", 0, filename);
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaud", 0, filename); cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaud", 0, filename);
cfg->fw_ver = GetPrivateProfileIntW(L"led15093", L"fwVer", 0x90, filename); cfg->fw_ver = GetPrivateProfileIntW(L"led15093", L"fwVer", 0x90, filename);
cfg->fw_sum = GetPrivateProfileIntW(L"led15093", L"fwSum", 0xadf7, filename); cfg->fw_sum = GetPrivateProfileIntW(L"led15093", L"fwSum", 0xadf7, filename);

View File

@ -1,15 +1,3 @@
/*
"CHUNITHM" (chuni) hook
Devices
JVS: 837-14572 "Type 3" I/O Board
COM1: 837-15330 Ground Slider
COM10: 837-15093-06 LED Controller Board
COM11: 837-15093-06 LED Controller Board
COM12: TN32MSEC003S "Gen 1" Aime Reader
*/
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -36,7 +24,6 @@
#include "platform/platform.h" #include "platform/platform.h"
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/env.h"
static HMODULE chuni_hook_mod; static HMODULE chuni_hook_mod;
static process_entry_t chuni_startup; static process_entry_t chuni_startup;
@ -72,7 +59,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Config load */ /* Config load */
chuni_hook_config_load(&chuni_hook_cfg, get_config_path()); chuni_hook_config_load(&chuni_hook_cfg, L".\\segatools.ini");
/* Hook Win32 APIs */ /* Hook Win32 APIs */
@ -114,9 +101,8 @@ static DWORD CALLBACK chuni_pre_startup(void)
{ {
dprintf("IO DLL doesn't support led_init/led_set_leds, cannot start LED15093 hook\n"); dprintf("IO DLL doesn't support led_init/led_set_leds, cannot start LED15093 hook\n");
} else { } else {
unsigned int led_port_no[2] = {10, 11};
hr = led15093_hook_init(&chuni_hook_cfg.led15093, hr = led15093_hook_init(&chuni_hook_cfg.led15093,
chuni_dll.led_init, chuni_dll.led_set_leds, led_port_no); chuni_dll.led_init, chuni_dll.led_set_leds, 10, 2, 2, 1);
if (FAILED(hr)) { if (FAILED(hr)) {
goto fail; goto fail;
@ -131,7 +117,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Initialize debug helpers */ /* Initialize debug helpers */
spike_hook_init(get_config_path()); spike_hook_init(L".\\segatools.ini");
dprintf("--- End chuni_pre_startup ---\n"); dprintf("--- End chuni_pre_startup ---\n");

View File

@ -4,6 +4,7 @@ shared_library(
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
vs_module_defs : 'chunihook.def', vs_module_defs : 'chunihook.def',
c_pch : '../precompiled.h',
dependencies : [ dependencies : [
capnhook.get_variable('hook_dep'), capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'), capnhook.get_variable('hooklib_dep'),

View File

@ -98,7 +98,7 @@ static HRESULT slider_handle_irp_locked(struct irp *irp)
} }
for (;;) { for (;;) {
#if defined(LOG_CHUNI_SLIDER) #if 0
dprintf("TX Buffer:\n"); dprintf("TX Buffer:\n");
dump_iobuf(&slider_uart.written); dump_iobuf(&slider_uart.written);
#endif #endif
@ -117,7 +117,7 @@ static HRESULT slider_handle_irp_locked(struct irp *irp)
return hr; return hr;
} }
#if defined(LOG_CHUNI_SLIDER) #if 0
dprintf("Deframe Buffer:\n"); dprintf("Deframe Buffer:\n");
dump_iobuf(&req_iobuf); dump_iobuf(&req_iobuf);
#endif #endif

View File

@ -4,14 +4,12 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include "chuniio/chuniio.h" #include "chuniio/chuniio.h"
#include "chuniio/config.h" #include "chuniio/config.h"
#include "chuniio/ledoutput.h" #include "chuniio/ledoutput.h"
#include "util/dprintf.h" #include "util/dprintf.h"
#include "util/env.h"
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx); static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx);
@ -29,7 +27,7 @@ uint16_t chuni_io_get_api_version(void)
HRESULT chuni_io_jvs_init(void) HRESULT chuni_io_jvs_init(void)
{ {
chuni_io_config_load(&chuni_io_cfg, get_config_path()); chuni_io_config_load(&chuni_io_cfg, L".\\segatools.ini");
led_init_mutex = CreateMutex( led_init_mutex = CreateMutex(
NULL, // default security attributes NULL, // default security attributes
@ -94,7 +92,7 @@ void chuni_io_jvs_poll(uint8_t *opbtn, uint8_t *beams)
} else { } else {
// Use actual AIR // Use actual AIR
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
if (GetAsyncKeyState(chuni_io_cfg.vk_ir[i]) & 0x8000) { if(GetAsyncKeyState(chuni_io_cfg.vk_ir[i]) & 0x8000) {
*beams |= (1 << i); *beams |= (1 << i);
} else { } else {
*beams &= ~(1 << i); *beams &= ~(1 << i);
@ -174,20 +172,6 @@ HRESULT chuni_io_led_init(void)
} }
void chuni_io_led_set_colors(uint8_t board, uint8_t *rgb) void chuni_io_led_set_colors(uint8_t board, uint8_t *rgb)
{ {
#if 0
if (board == 0) {
dprintf("CHUNI LED: Left Air 1: red: %d, green: %d, blue: %d\n", rgb[0x96], rgb[0x97], rgb[0x98]);
dprintf("CHUNI LED: Left Air 2: red: %d, green: %d, blue: %d\n", rgb[0x99], rgb[0x9A], rgb[0x9B]);
dprintf("CHUNI LED: Left Air 3: red: %d, green: %d, blue: %d\n", rgb[0x9C], rgb[0x9D], rgb[0x9E]);
}
else if (board == 1)
{
dprintf("CHUNI LED: Right Air 1: red: %d, green: %d, blue: %d\n", rgb[0xB4], rgb[0xB5], rgb[0xB6]);
dprintf("CHUNI LED: Right Air 2: red: %d, green: %d, blue: %d\n", rgb[0xB7], rgb[0xB8], rgb[0xB9]);
dprintf("CHUNI LED: Right Air 3: red: %d, green: %d, blue: %d\n", rgb[0xBA], rgb[0xBB], rgb[0xBC]);
}
#endif
led_output_update(board, rgb); led_output_update(board, rgb);
} }

View File

@ -139,10 +139,9 @@ void chuni_io_slider_start(chuni_io_slider_callback_t callback);
void chuni_io_slider_stop(void); void chuni_io_slider_stop(void);
/* Update the RGB lighting on the slider. A pointer to an array of 32 * 3 = 96 /* Update the RGB lighting on the slider. A pointer to an array of 32 * 3 = 96
bytes is supplied, organized in BRG format. bytes is supplied. The illuminated areas on the touch slider are some
The first set of bytes is the right-most slider key, and from there the bytes combination of rectangular regions and dividing lines between these regions
alternate between the dividers and the keys until the left-most key. but the exact mapping of this lighting control buffer is still TBD.
There are 31 illuminated sections in total.
Minimum API version: 0x0100 */ Minimum API version: 0x0100 */
@ -164,17 +163,9 @@ HRESULT chuni_io_led_init(void);
Chunithm uses two chains/boards with WS2811 protocol (each logical led corresponds to 3 physical leds). Chunithm uses two chains/boards with WS2811 protocol (each logical led corresponds to 3 physical leds).
board 0 is on the left side and board 1 on the right side of the cab board 0 is on the left side and board 1 on the right side of the cab
Board 0 has 53 LEDs: left side has 5*10 rgb values for the billboard, followed by 3 rgb values for the air tower
[0]-[49]: snakes through left half of billboard (first column starts at top) right side has 6*10 rgb values for the billboard, followed by 3 rgb values for the air tower
[50]-[52]: left side partition LEDs
Board 1 has 63 LEDs:
[0]-[59]: right half of billboard (first column starts at bottom)
[60]-[62]: right side partition LEDs
Board 2 is the slider and has 31 LEDs:
[0]-[31]: slider LEDs right to left BRG, alternating between keys and dividers
Each rgb value is comprised of 3 bytes in R,G,B order Each rgb value is comprised of 3 bytes in R,G,B order
NOTE: billboard strips have alternating direction (bottom to top, top to bottom, ...) NOTE: billboard strips have alternating direction (bottom to top, top to bottom, ...)

View File

@ -3,7 +3,6 @@
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "chuniio/config.h" #include "chuniio/config.h"
@ -58,13 +57,11 @@ void chuni_io_config_load(
filename); filename);
} }
cfg->cab_led_output_pipe = GetPrivateProfileIntW(L"led", L"cabLedOutputPipe", 1, filename); cfg->led_output_pipe = GetPrivateProfileIntW(L"led", L"cabLedOutputPipe", 1, filename);
cfg->cab_led_output_serial = GetPrivateProfileIntW(L"led", L"cabLedOutputSerial", 0, filename); cfg->led_output_serial = GetPrivateProfileIntW(L"led", L"cabLedOutputSerial", 0, filename);
cfg->controller_led_output_pipe = GetPrivateProfileIntW(L"led", L"controllerLedOutputPipe", 1, filename); cfg->slider_led_output_pipe = GetPrivateProfileIntW(L"led", L"controllerLedOutputPipe", 1, filename);
cfg->controller_led_output_serial = GetPrivateProfileIntW(L"led", L"controllerLedOutputSerial", 0, filename); cfg->slider_led_output_serial = GetPrivateProfileIntW(L"led", L"controllerLedOutputSerial", 0, filename);
cfg->controller_led_output_openithm = GetPrivateProfileIntW(L"led", L"controllerLedOutputOpeNITHM", 0, filename);
cfg->led_serial_baud = GetPrivateProfileIntW(L"led", L"serialBaud", 921600, filename); cfg->led_serial_baud = GetPrivateProfileIntW(L"led", L"serialBaud", 921600, filename);
@ -73,7 +70,7 @@ void chuni_io_config_load(
L"serialPort", L"serialPort",
L"COM5", L"COM5",
port_input, port_input,
_countof(port_input), 6,
filename); filename);
// Sanitize the output path. If it's a serial COM port, it needs to be prefixed // Sanitize the output path. If it's a serial COM port, it needs to be prefixed

View File

@ -2,7 +2,6 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
struct chuni_io_config { struct chuni_io_config {
uint8_t vk_test; uint8_t vk_test;
@ -13,17 +12,16 @@ struct chuni_io_config {
uint8_t vk_cell[32]; uint8_t vk_cell[32];
// Which ways to output LED information are enabled // Which ways to output LED information are enabled
bool cab_led_output_pipe; bool led_output_pipe;
bool cab_led_output_serial; bool led_output_serial;
bool controller_led_output_pipe; bool slider_led_output_pipe;
bool controller_led_output_serial; bool slider_led_output_serial;
bool controller_led_output_openithm;
// The name of a COM port to output LED data on, in serial mode // The name of a COM port to output LED data on, in serial mode
wchar_t led_serial_port[12]; wchar_t led_serial_port[12];
int32_t led_serial_baud; int32_t led_serial_baud;
}; };
void chuni_io_config_load( void chuni_io_config_load(

View File

@ -13,10 +13,10 @@
// This struct is used to send data related to the slider and billboard LEDs // This struct is used to send data related to the slider and billboard LEDs
struct _chuni_led_data_buf_t { struct _chuni_led_data_buf_t {
uint8_t framing; // Sync byte byte framing; // Sync byte
uint8_t board; // LED output the data is for (0-1: billboard, 2: slider) uint8_t board; // LED output the data is for (0-1: billboard, 2: slider)
uint8_t data[LED_OUTPUT_DATA_SIZE_MAX]; // Buffer for LEDs byte data[LED_OUTPUT_DATA_SIZE_MAX]; // Buffer for LEDs
uint8_t data_len; // How many bytes to output from the buffer byte data_len; // How many bytes to output from the buffer
}; };
static uint8_t chuni_led_board_data_lens[LED_BOARDS_TOTAL] = {53*3, 63*3, 31*3}; static byte chuni_led_board_data_lens[LED_BOARDS_TOTAL] = {53*3, 63*3, 31*3};

View File

@ -48,15 +48,15 @@ HRESULT led_output_init(struct chuni_io_config* const cfg)
led_escaped_buf[i].data_len = chuni_led_board_data_lens[i]; led_escaped_buf[i].data_len = chuni_led_board_data_lens[i];
} }
any_outputs_enabled = config->cab_led_output_pipe || config->controller_led_output_pipe any_outputs_enabled = config->led_output_pipe || config->slider_led_output_pipe
|| config->cab_led_output_serial || config->controller_led_output_serial; || config->led_output_serial || config->slider_led_output_serial;
if (config->cab_led_output_pipe || config->controller_led_output_pipe) if (config->led_output_pipe || config->slider_led_output_pipe)
{ {
led_pipe_init(); // don't really care about errors here tbh led_pipe_init(); // don't really care about errors here tbh
} }
if (config->cab_led_output_serial || config->controller_led_output_serial) if (config->led_output_serial || config->slider_led_output_serial)
{ {
led_serial_init(config->led_serial_port, config->led_serial_baud); led_serial_init(config->led_serial_port, config->led_serial_baud);
} }
@ -73,14 +73,14 @@ struct _chuni_led_data_buf_t* escape_led_data(struct _chuni_led_data_buf_t* unes
{ {
struct _chuni_led_data_buf_t* out_struct = &led_escaped_buf[unescaped->board]; struct _chuni_led_data_buf_t* out_struct = &led_escaped_buf[unescaped->board];
uint8_t* in_buf = unescaped->data; byte* in_buf = unescaped->data;
uint8_t* out_buf = out_struct->data; byte* out_buf = out_struct->data;
int i = 0; int i = 0;
int o = 0; int o = 0;
while (i < unescaped->data_len) while (i < unescaped->data_len)
{ {
uint8_t b = in_buf[i++]; byte b = in_buf[i++];
if (b == LED_PACKET_FRAMING || b == LED_PACKET_ESCAPE) if (b == LED_PACKET_FRAMING || b == LED_PACKET_ESCAPE)
{ {
out_buf[o++] = LED_PACKET_ESCAPE; out_buf[o++] = LED_PACKET_ESCAPE;
@ -94,7 +94,7 @@ struct _chuni_led_data_buf_t* escape_led_data(struct _chuni_led_data_buf_t* unes
return out_struct; return out_struct;
} }
void led_output_update(uint8_t board, const uint8_t* rgb) void led_output_update(uint8_t board, const byte* rgb)
{ {
if (board < 0 || board > 2 || !any_outputs_enabled) if (board < 0 || board > 2 || !any_outputs_enabled)
{ {
@ -106,13 +106,13 @@ void led_output_update(uint8_t board, const uint8_t* rgb)
if (board < 2) if (board < 2)
{ {
// billboard (cab) // billboard
if (config->cab_led_output_pipe) if (config->led_output_pipe)
{ {
led_pipe_update(escaped_data); led_pipe_update(escaped_data);
} }
if (config->cab_led_output_serial) if (config->led_output_serial)
{ {
led_serial_update(escaped_data); led_serial_update(escaped_data);
} }
@ -120,18 +120,14 @@ void led_output_update(uint8_t board, const uint8_t* rgb)
else else
{ {
// slider // slider
if (config->controller_led_output_pipe) if (config->slider_led_output_pipe)
{ {
led_pipe_update(escaped_data); led_pipe_update(escaped_data);
} }
if (config->controller_led_output_serial) if (config->slider_led_output_serial)
{ {
if (config->controller_led_output_openithm){ led_serial_update(escaped_data);
led_serial_update_openithm(rgb);
} else {
led_serial_update(escaped_data);
}
} }
} }
} }

View File

@ -16,4 +16,4 @@
extern HANDLE led_init_mutex; extern HANDLE led_init_mutex;
HRESULT led_output_init(struct chuni_io_config* const cfg); HRESULT led_output_init(struct chuni_io_config* const cfg);
void led_output_update(uint8_t board, const uint8_t* rgb); void led_output_update(uint8_t board, const byte* rgb);

View File

@ -3,7 +3,7 @@ chuniio_lib = static_library(
name_prefix : '', name_prefix : '',
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [ sources : [
'chu2to3.c', 'chu2to3.c',
'chu2to3.h', 'chu2to3.h',

Some files were not shown because too many files have changed in this diff Show More