Compare commits

...

54 Commits

Author SHA1 Message Date
12dbf7a90c Revert: fallback capnhook to 4633c51d58
ilufang's ERROR_IO_PENDING make serial device has serious delays and missing
before we fix it in capnhook, we need fallback it in segatools
2025-03-19 12:49:22 +00:00
61f95c3f2e GFX: add dpi-awareness switch for all games (#64)
Pretty simple, adds a new config setting to the gfx category, which defaults to enabled to disable DPI scaling if a scale higher than 100% is used, causing game windows to appear stretched and blurry.

Reviewed-on: #64
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-03-14 11:53:31 +00:00
70c3e2fe0f FGO: fix printer hook always being enabled (#60)
that moment when the printer says OK but it absolutely isn't supposed to be OK lmao

edit: I'm not sure why the msvc commits are also in all of these PRs, they have no effect though...
Reviewed-on: #60
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-03-09 16:05:03 +00:00
369fe28687 disable excess logging for carol touchscreen hook 2025-03-02 04:10:35 -05:00
3371f3f437 fix msvc build by removing ntstatus include from platform/system.c 2025-03-02 01:45:23 -05:00
a57542c2d2 Merge branch 'feature/code-cleanup' into develop 2025-03-02 00:36:27 +01:00
27116a7a41 idac, tokyo: improve dipsw cabinet id config 2025-03-02 00:36:13 +01:00
e850346b79 renamed start.bat to launch.bat 2025-03-02 00:25:15 +01:00
4d0ef54279 system: add dip switch label configurations 2025-03-02 00:23:53 +01:00
b8af67377c Merge branch 'feature/mai2-touch-led' into develop 2025-03-02 00:04:00 +01:00
4cb76dd1ee mai2: update all LED boards to use two boards 2025-03-02 00:01:45 +01:00
efe01d92a6 Fix MSVC build again, add support for standalone MSVC compiler (#59)
After switching away from VS, I realized the buildscript wouldn't detect the standalone MSVC compiler, because for whatever genius reason, MS installs that in the x86 program files directory...

Also fixes some duplicate definitions and a missing library that MSVC doesn't like
ah compilers...

Reviewed-on: #59
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-02-24 18:49:22 +00:00
004a2f6dcd docs: fix playformID and billingType config docs 2025-02-21 19:37:54 -05:00
a1611afffc Mai2: Add touch and led15070 hook (#55)
In this PR, I have added the `mai2` touch and `led15070` hooks to provide an example for handling custom peripherals. This change allows users to implement the touch and `led15070` logic by writing appropriate `mai2io` scripts.

#### **Touch Hook**:
- The touch hook simulates touch points based on keyboard combinations. For example, to trigger the A1 touch point, the user must press the A and 1 keys on the keyboard. Input for the 1p requires Caps Lock to be off, while 2p requires Caps Lock to be on.
- The hook allows for independent control of whether device simulation is enabled for "1p" and "2p" and whether keyboard input mapping is enabled.
- **Note**: The current touch hook is not yet functional as it requires modifications to the `capnhook` for proper completion of the `sinmai` hook.

#### **LED15070 Hook**:
- This hook implements basic device simulation. Peripherals requiring lighting data should complete the logic as needed.
- **Note**: The LED data refresh can flood the console logs, so I’ve added a `DEBUG` flag to control whether the debug logging is enabled or not.

#### **Other Changes**:
- In certain versions of `sinmai`, key inputs for 1p and 2p can be directly read from the keyboard without requiring simulation via the `amdaemon io4` hook. I’ve added a switch to control this behavior to prevent redundant input.
- **Benefit**: This ensures that key input is only read when `sinmai` is in the foreground.

If you'd like to learn more about the touch and `led15070` features, my research findings are available here:
[Mai2Touch](https://github.com/Sucareto/Mai2Touch)

Co-authored-by: Sucareto <28331534+Sucareto@users.noreply.github.com>
Reviewed-on: #55
Co-authored-by: Mahuyo <mahuyo@noreply.gitea.tendokyu.moe>
Co-committed-by: Mahuyo <mahuyo@noreply.gitea.tendokyu.moe>
2025-02-16 12:49:58 +00:00
1d63ab24d3 Move capnhook to TeamTofuShop fork, update revision 2025-02-09 04:52:27 -05:00
2f54183636 bump capnhook rev 2025-02-04 11:09:23 -05:00
402bf0f247 nusec: add full IOCTL list without handlers 2025-01-28 01:41:03 -05:00
4c20deb60a bump capnhook ver 2025-01-27 02:09:14 -05:00
96ee1afc2f Merge pull request 'Revert: Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs' (#54) from Bottersnike/segatools:develop into develop
Reviewed-on: #54
2024-12-27 14:18:27 +00:00
0c28765bdd Revert: Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs 2024-12-27 14:12:58 +00:00
96bf8cab81 aime: add portNo to config 2024-12-23 21:49:24 +01:00
a3120181be replace hardcoded enums with #define CTL_CODEs 2024-12-23 21:48:30 +01:00
80d4902cfc remove 5gb wasted space by removing precompiled headers 2024-12-23 21:04:51 +01:00
b4f5cdbe59 Merge pull request 'Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs' (#43) from kagaminehaku/segatools:develop into develop
Reviewed-on: Dniel97/segatools#43
2024-12-23 19:43:47 +00:00
25431a9db1 Add "openssl" config key doc 2024-12-24 02:34:44 +07:00
a705ae8748 Merge pull request 'Add changeable config path' (#53) from GEEKiDoS/segatools:develop into develop
Reviewed-on: Dniel97/segatools#53
2024-12-23 18:04:12 +00:00
b52455339f Merge pull request 'dns: add port overriding support' (#52) from t12i/segatools:develop into develop
Reviewed-on: Dniel97/segatools#52
2024-12-23 17:54:38 +00:00
ff21223f06 Removed the unused lines 2024-12-17 10:06:41 +07:00
047733d122 format code 2024-12-16 11:18:00 +08:00
21bb965382 typo 2024-12-16 11:14:14 +08:00
11556a1332 add changeable config path 2024-12-16 11:09:38 +08:00
d8202e1df4 dns: add port overriding support 2024-12-12 02:28:02 +08:00
2d3d6fc2bb Skip the patch when already patched 2024-11-26 01:40:57 +07:00
6d8ffb46ef Merge pull request 'dns: fix msvc build' (#50) from Haruka/segatools:fixmsvc into develop
Reviewed-on: Dniel97/segatools#50
2024-11-17 13:42:53 +00:00
2069b1ea85 dns: fix msvc build 2024-11-14 13:03:13 +01:00
c80f903cf8 Fix build with Microsoft Visual C++, Fix gfxhook and felica issue (#48)
I just wanna say that It is a SHAME that a Windows ONLY project was not able to build without MINGW
Also where's the missing `3mpxsc.h` in diva hook?

This also fixes the window size issue from hook_CreateWindowExA in gfxhook
And Fixes felica issue as described in #45

Reviewed-on: Dniel97/segatools#48
Reviewed-by: Dniel97 <dniel97@noreply.gitea.tendokyu.moe>
Co-authored-by: GEEKiDoS <geek_ds@foxmail.com>
Co-committed-by: GEEKiDoS <geek_ds@foxmail.com>
2024-11-11 16:28:24 +00:00
ceb2b63e8b Modify host header in HTTP requests to bypass domain censorship in China. (#34)
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
Reviewed-on: Dniel97/segatools#34
Co-authored-by: Sanhei <sanhei@noreply.gitea.tendokyu.moe>
Co-committed-by: Sanhei <sanhei@noreply.gitea.tendokyu.moe>
2024-11-11 16:24:33 +00:00
83840e0a87 dns: add new WAHLAP url blocked (#49)
Reviewed-on: Dniel97/segatools#49
Co-authored-by: zaphkito <zaphkito@noreply.gitea.tendokyu.moe>
Co-committed-by: zaphkito <zaphkito@noreply.gitea.tendokyu.moe>
2024-11-10 20:47:40 +00:00
e50d6d8ebc Merge pull request 'Throw fatal when vfs option configured but invalid' (#47) from Bottersnike/segatools:feat/vfs-validation into develop
Reviewed-on: Dniel97/segatools#47
2024-11-05 16:36:43 +00:00
e1a47cf365 Throw fatal when vfs option configured but invalid 2024-11-04 22:55:15 +00:00
8aef1cfa79 Change method set environment variable to current process only using "SetEnvironmentVariableW" 2024-11-05 00:48:21 +07:00
8fc24503c8 diva, fgo: added gfx, close #46 2024-11-03 23:00:43 +01:00
ebf0f0b428 Develop a new/better method to detect cpu using intrinsic functions (__cpuid and __cpuidex) 2024-11-02 00:26:31 +07:00
892eb2b859 idz, idac, swdc: fixed rumble effect 2024-10-29 22:06:07 +01:00
b80b9fbc19 Delete useless comment 2024-10-18 13:44:47 +07:00
cef3406691 Add switch for openssl patch in segatools.ini 2024-10-18 13:34:25 +07:00
97d2d6b9bc resolved camelCase and the " :" problem 2024-10-16 15:53:52 +07:00
f39b9ce3a0 resolve dniel97 comments 2024-10-16 15:01:39 +07:00
243bb778d1 Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs 2024-10-16 04:08:54 +07:00
66317a0054 bump capnhook rev to include serial fixes 2024-10-11 07:32:22 +02:00
8c24e04900 Merge pull request 'printer: Add setting to configure "printing time"' (#39) from Haruka/segatools:printerdelay into develop
Reviewed-on: Dniel97/segatools#39
2024-10-04 12:53:26 +00:00
3bb9404a38 printer: add the default waitTime setting to config 2024-10-04 11:43:34 +02:00
6819963f06 Merge branch 'refs/heads/develop' into printerdelay 2024-10-03 12:12:59 +02:00
4fa9abffe8 printer: add ability to delay printing 2024-09-27 11:06:18 +02:00
241 changed files with 2804 additions and 850 deletions

4
.clang-format Normal file
View File

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

3
.gitignore vendored
View File

@ -21,3 +21,6 @@ subprojects/capnhook
# For enabling debug logging on local builds
MesonLocalOptions.mk
# Some meson cache thing
.meson-subproject-wrap-hash.txt

View File

@ -5,7 +5,7 @@ $(BUILD_DIR_ZIP)/chuni.zip:
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_32)/chunihook/chunihook.dll \
$(DIST_DIR)/chuni/segatools.ini \
$(DIST_DIR)/chuni/start.bat \
$(DIST_DIR)/chuni/launch.bat \
$(BUILD_DIR_ZIP)/chuni
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -20,7 +20,7 @@ $(BUILD_DIR_ZIP)/cxb.zip:
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_32)/cxbhook/cxbhook.dll \
$(DIST_DIR)/cxb/segatools.ini \
$(DIST_DIR)/cxb/start.bat \
$(DIST_DIR)/cxb/launch.bat \
$(BUILD_DIR_ZIP)/cxb
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -35,7 +35,7 @@ $(BUILD_DIR_ZIP)/diva.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/divahook/divahook.dll \
$(DIST_DIR)/diva/segatools.ini \
$(DIST_DIR)/diva/start.bat \
$(DIST_DIR)/diva/launch.bat \
$(BUILD_DIR_ZIP)/diva
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -50,7 +50,7 @@ $(BUILD_DIR_ZIP)/carol.zip:
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_32)/carolhook/carolhook.dll \
$(DIST_DIR)/carol/segatools.ini \
$(DIST_DIR)/carol/start.bat \
$(DIST_DIR)/carol/launch.bat \
$(BUILD_DIR_ZIP)/carol
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -65,7 +65,7 @@ $(BUILD_DIR_ZIP)/idz.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/idzhook/idzhook.dll \
$(DIST_DIR)/idz/segatools.ini \
$(DIST_DIR)/idz/start.bat \
$(DIST_DIR)/idz/launch.bat \
$(BUILD_DIR_ZIP)/idz
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -80,7 +80,7 @@ $(BUILD_DIR_ZIP)/fgo.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/fgohook/fgohook.dll \
$(DIST_DIR)/fgo/segatools.ini \
$(DIST_DIR)/fgo/start.bat \
$(DIST_DIR)/fgo/launch.bat \
$(BUILD_DIR_ZIP)/fgo
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -96,7 +96,7 @@ $(BUILD_DIR_ZIP)/idac.zip:
$(BUILD_DIR_64)/idachook/idachook.dll \
$(DIST_DIR)/idac/segatools.ini \
$(DIST_DIR)/idac/config_hook.json \
$(DIST_DIR)/idac/start.bat \
$(DIST_DIR)/idac/launch.bat \
$(BUILD_DIR_ZIP)/idac
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -112,7 +112,7 @@ $(BUILD_DIR_ZIP)/swdc.zip:
$(BUILD_DIR_64)/swdchook/swdchook.dll \
$(DIST_DIR)/swdc/segatools.ini \
$(DIST_DIR)/swdc/config_hook.json \
$(DIST_DIR)/swdc/start.bat \
$(DIST_DIR)/swdc/launch.bat \
$(BUILD_DIR_ZIP)/swdc
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -127,7 +127,7 @@ $(BUILD_DIR_ZIP)/mercury.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/mercuryhook/mercuryhook.dll \
$(DIST_DIR)/mercury/segatools.ini \
$(DIST_DIR)/mercury/start.bat \
$(DIST_DIR)/mercury/launch.bat \
$(BUILD_DIR_ZIP)/mercury
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -141,7 +141,7 @@ $(BUILD_DIR_ZIP)/chusan.zip:
$(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE
$(V)cp $(DIST_DIR)/chusan/segatools.ini \
$(DIST_DIR)/chusan/config_hook.json \
$(DIST_DIR)/chusan/start.bat \
$(DIST_DIR)/chusan/launch.bat \
$(BUILD_DIR_ZIP)/chusan
$(V)cp $(BUILD_DIR_32)/chusanhook/chusanhook.dll \
$(BUILD_DIR_ZIP)/chusan/chusanhook_x86.dll
@ -164,7 +164,7 @@ $(BUILD_DIR_ZIP)/mu3.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/mu3hook/mu3hook.dll \
$(DIST_DIR)/mu3/segatools.ini \
$(DIST_DIR)/mu3/start.bat \
$(DIST_DIR)/mu3/launch.bat \
$(BUILD_DIR_ZIP)/mu3
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -179,7 +179,7 @@ $(BUILD_DIR_ZIP)/mai2.zip:
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_64)/mai2hook/mai2hook.dll \
$(DIST_DIR)/mai2/segatools.ini \
$(DIST_DIR)/mai2/start.bat \
$(DIST_DIR)/mai2/launch.bat \
$(BUILD_DIR_ZIP)/mai2
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -195,7 +195,7 @@ $(BUILD_DIR_ZIP)/cm.zip:
$(BUILD_DIR_64)/cmhook/cmhook.dll \
$(DIST_DIR)/cm/config_hook.json \
$(DIST_DIR)/cm/segatools.ini \
$(DIST_DIR)/cm/start.bat \
$(DIST_DIR)/cm/launch.bat \
$(BUILD_DIR_ZIP)/cm
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -211,7 +211,7 @@ $(BUILD_DIR_ZIP)/tokyo.zip:
$(BUILD_DIR_64)/tokyohook/tokyohook.dll \
$(DIST_DIR)/tokyo/config_hook.json \
$(DIST_DIR)/tokyo/segatools.ini \
$(DIST_DIR)/tokyo/start.bat \
$(DIST_DIR)/tokyo/launch.bat \
$(BUILD_DIR_ZIP)/tokyo
$(V)cp pki/billing.pub \
pki/ca.crt \
@ -224,7 +224,7 @@ $(BUILD_DIR_ZIP)/kemono.zip:
$(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/start.bat \
$(DIST_DIR)/kemono/launch.bat \
$(BUILD_DIR_ZIP)/kemono
$(V)cp $(BUILD_DIR_32)/kemonohook/kemonohook.dll \
$(BUILD_DIR_ZIP)/kemono/kemonohook_x86.dll

View File

@ -12,6 +12,7 @@
#include "util/crc.h"
#include "util/dprintf.h"
#include "util/env.h"
struct aime_io_config {
wchar_t aime_path[MAX_PATH];
@ -222,7 +223,7 @@ uint16_t aime_io_get_api_version(void)
HRESULT aime_io_init(void)
{
aime_io_config_read(&aime_io_cfg, L".\\segatools.ini");
aime_io_config_read(&aime_io_cfg, get_config_path());
return S_OK;
}

View File

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

View File

@ -1,10 +1,11 @@
#include <windows.h>
#include <devioctl.h>
#include <ntdddisk.h>
#include <winioctl.h>
#include <assert.h>
#include <ctype.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "amex/ds.h"
@ -19,13 +20,11 @@
#include "util/dprintf.h"
#include "util/str.h"
#pragma pack(push, 1)
#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)
enum {
DS_IOCTL_GET_ABI_VERSION = 0x80006000,
DS_IOCTL_SETUP = 0x80006004,
DS_IOCTL_READ_SECTOR = 0x80006010,
};
#pragma pack(push, 1)
struct ds_eeprom {
uint32_t crc32;

View File

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

View File

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

View File

@ -4,6 +4,7 @@
#include <winternl.h>
#include <ntstatus.h>
#include <winioctl.h>
#include <assert.h>
#include <stddef.h>
@ -21,11 +22,9 @@
#include "util/dump.h"
#include "util/str.h"
enum {
JVS_IOCTL_HELLO = 0x80006004,
JVS_IOCTL_SENSE = 0x8000600C,
JVS_IOCTL_TRANSACT = 0x8000E008,
};
#define JVS_IOCTL_HELLO CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS)
#define JVS_IOCTL_TRANSACT CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define JVS_IOCTL_SENSE CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS)
static HRESULT jvs_handle_irp(struct irp *irp);
static HRESULT jvs_handle_open(struct irp *irp);

View File

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

View File

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

View File

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

View File

@ -72,6 +72,7 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
aime_dll_config_load(&cfg->dll, 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->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
}
@ -90,7 +91,7 @@ void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename)
assert(filename != NULL);
cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename);
cfg->port = GetPrivateProfileIntW(L"vfd", L"portNo", 0, filename);
cfg->port_no = GetPrivateProfileIntW(L"vfd", L"portNo", 0, filename);
cfg->utf_conversion = GetPrivateProfileIntW(L"vfd", L"utfConversion", 0, filename);
}

View File

@ -2,6 +2,7 @@
#include <windows.h>
#include <stdbool.h>
#include <stdint.h>
struct ffb_config {
bool enable;

View File

@ -16,6 +16,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include "board/io3.h"

View File

@ -7,6 +7,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include "board/config.h"
#include "board/guid.h"

View File

@ -3,6 +3,7 @@
#include <windows.h>
#include <stdint.h>
#include <stdbool.h>
#define IO4_REPORT_OUT_PAYLOAD_LEN 62

View File

@ -13,6 +13,7 @@
#include <process.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -102,19 +103,30 @@ HRESULT led15070_hook_init(
io_led_set_fet_output_t _led_set_fet_output,
io_led_dc_update_t _led_dc_update,
io_led_gs_update_t _led_gs_update,
unsigned int first_port,
unsigned int num_boards)
unsigned int port_no[2])
{
unsigned int num_boards = 0;
assert(cfg != NULL);
assert(_led_init != NULL);
if (!cfg->enable) {
return S_FALSE;
}
if (cfg->port_no != 0) {
first_port = cfg->port_no;
for (int i = 0; i < led15070_nboards; i++)
{
if (cfg->port_no[i] != 0) {
port_no[i] = cfg->port_no[i];
}
if (port_no[i] != 0) {
num_boards++;
}
}
assert(num_boards != 0);
led_init = _led_init;
led_set_fet_output = _led_set_fet_output;
led_dc_update = _led_dc_update;
@ -130,10 +142,7 @@ HRESULT led15070_hook_init(
InitializeCriticalSection(&v->lock);
// TODO: IMPROVE!
first_port = i == 1 ? first_port + 2 : first_port;
uart_init(&v->boarduart, first_port);
uart_init(&v->boarduart, port_no[i]);
v->boarduart.baud.BaudRate = 115200;
v->boarduart.written.bytes = v->written_bytes;
v->boarduart.written.nbytes = sizeof(v->written_bytes);
@ -237,12 +246,12 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
}
for (;;) {
#if 0
#if defined(LOG_LED15070)
dprintf("TX Buffer:\n");
dump_iobuf(&boarduart->written);
#endif
req_iobuf.bytes = (byte*)&req;
req_iobuf.bytes = (uint8_t*)&req;
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.cmd) + sizeof(req.payload);
req_iobuf.pos = 0;
@ -256,7 +265,7 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
return hr;
}
#if 0
#if defined(LOG_LED15070)
dprintf("Deframe Buffer:\n");
dump_iobuf(&req_iobuf);
#endif
@ -384,7 +393,9 @@ static HRESULT led15070_req_reset(int board, const struct led15070_req_any *req)
static HRESULT led15070_req_set_input(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set input (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -407,9 +418,10 @@ static HRESULT led15070_req_set_input(int board, const struct led15070_req_any *
static HRESULT led15070_req_set_normal_12bit(int board, const struct led15070_req_any *req)
{
uint8_t idx = req->payload[0];
#if defined(LOG_LED15070)
dprintf("LED 15070: Set LED - Normal 12bit (board %u, index %u)\n",
board, idx);
#endif
// TODO: Data for this command. Seen with Carol
@ -434,9 +446,10 @@ static HRESULT led15070_req_set_normal_12bit(int board, const struct led15070_re
static HRESULT led15070_req_set_normal_8bit(int board, const struct led15070_req_any *req)
{
uint8_t idx = req->payload[0];
// dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
// board, idx);
#if defined(LOG_LED15070)
dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
board, idx);
#endif
led15070_per_board_vars[board].gs[idx][0] = req->payload[1]; // R
led15070_per_board_vars[board].gs[idx][1] = req->payload[2]; // G
@ -467,8 +480,10 @@ static HRESULT led15070_req_set_multi_flash_8bit(int board, const struct led1507
uint8_t idx_skip = req->payload[2];
// TODO: useful?
// dprintf("LED 15070: Set LED - Multi flash 8bit (board %u, start %u, end %u, skip %u)\n",
// board, idx_start, idx_end, idx_skip);
#if defined(LOG_LED15070)
dprintf("LED 15070: Set LED - Multi flash 8bit (board %u, start %u, end %u, skip %u)\n",
board, idx_start, idx_end, idx_skip);
#endif
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
idx_start += idx_skip;
@ -507,9 +522,10 @@ static HRESULT led15070_req_set_multi_fade_8bit(int board, const struct led15070
uint8_t idx_start = req->payload[0];
uint8_t idx_end = req->payload[1];
uint8_t idx_skip = req->payload[2];
// dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
// board, idx_start, idx_end, idx_skip);
#if defined(LOG_LED15070)
dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
board, idx_start, idx_end, idx_skip);
#endif
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
idx_start += idx_skip;
@ -544,7 +560,9 @@ static HRESULT led15070_req_set_multi_fade_8bit(int board, const struct led15070
static HRESULT led15070_req_set_palette_7_normal_led(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set palette - 7 Normal LED (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -566,7 +584,9 @@ static HRESULT led15070_req_set_palette_7_normal_led(int board, const struct led
static HRESULT led15070_req_set_palette_6_flash_led(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set palette - 6 Flash LED (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -588,7 +608,9 @@ static HRESULT led15070_req_set_palette_6_flash_led(int board, const struct led1
static HRESULT led15070_req_set_15dc_out(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set 15DC out (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -610,7 +632,9 @@ static HRESULT led15070_req_set_15dc_out(int board, const struct led15070_req_an
static HRESULT led15070_req_set_15gs_out(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set 15GS out (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -632,7 +656,9 @@ static HRESULT led15070_req_set_15gs_out(int board, const struct led15070_req_an
static HRESULT led15070_req_set_psc_max(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set PSC max (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -654,14 +680,16 @@ static HRESULT led15070_req_set_psc_max(int board, const struct led15070_req_any
static HRESULT led15070_req_set_fet_output(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Set FET output (board %u)\n", board);
#endif
led15070_per_board_vars[board].fet[0] = req->payload[0]; // R or FET0 intensity
led15070_per_board_vars[board].fet[1] = req->payload[1]; // G or FET1 intensity
led15070_per_board_vars[board].fet[2] = req->payload[2]; // B or FET2 intensity
if (led_set_fet_output)
led_set_fet_output((const uint8_t*)led15070_per_board_vars[board].fet);
led_set_fet_output(board, (const uint8_t*)led15070_per_board_vars[board].fet);
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -684,8 +712,9 @@ static HRESULT led15070_req_set_fet_output(int board, const struct led15070_req_
static HRESULT led15070_req_set_gs_palette(int board, const struct led15070_req_any *req)
{
uint8_t idx = req->payload[0];
#if defined(LOG_LED15070)
dprintf("LED 15070: Set GS palette (board %u, index %u)\n", board, idx);
#endif
led15070_per_board_vars[board].gs_palette[idx][0] = req->payload[1]; // R
led15070_per_board_vars[board].gs_palette[idx][1] = req->payload[2]; // G
@ -711,10 +740,12 @@ static HRESULT led15070_req_set_gs_palette(int board, const struct led15070_req_
static HRESULT led15070_req_dc_update(int board, const struct led15070_req_any *req)
{
// dprintf("LED 15070: DC update (board %u)\n", board);
#if defined(LOG_LED15070)
dprintf("LED 15070: DC update (board %u)\n", board);
#endif
if (led_dc_update)
led_dc_update((const uint8_t*)led15070_per_board_vars[board].dc);
led_dc_update(board, (const uint8_t*)led15070_per_board_vars[board].dc);
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -736,10 +767,12 @@ static HRESULT led15070_req_dc_update(int board, const struct led15070_req_any *
static HRESULT led15070_req_gs_update(int board, const struct led15070_req_any *req)
{
// dprintf("LED 15070: GS update (board %u)\n", board);
#if defined(LOG_LED15070)
dprintf("LED 15070: GS update (board %u)\n", board);
#endif
if (led_gs_update)
led_gs_update((const uint8_t*)led15070_per_board_vars[board].gs);
led_gs_update(board, (const uint8_t*)led15070_per_board_vars[board].gs);
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -761,7 +794,9 @@ static HRESULT led15070_req_gs_update(int board, const struct led15070_req_any *
static HRESULT led15070_req_rotate(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Rotate (board %u)\n", board);
#endif
if (!led15070_per_board_vars[board].enable_response)
return S_OK;
@ -786,9 +821,10 @@ static HRESULT led15070_req_set_dc_data(int board, const struct led15070_req_any
uint8_t idx_start = req->payload[0];
uint8_t idx_end = req->payload[1];
uint8_t idx_skip = req->payload[2];
// dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
// board, idx_start, idx_end, idx_skip);
#if defined(LOG_LED15070)
dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
board, idx_start, idx_end, idx_skip);
#endif
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
idx_start += idx_skip;
@ -828,9 +864,10 @@ static HRESULT led15070_req_eeprom_write(int board, const struct led15070_req_an
uint8_t addr = req->payload[0];
uint8_t data = req->payload[1];
#if defined(LOG_LED15070)
dprintf("LED 15070: EEPROM write (board %u, address %02x, data %02x)\n",
board, addr, data);
#endif
if (addr > 0x07) {
dprintf("LED 15070: Error -- Invalid EEPROM write address %02x\n",
@ -918,8 +955,9 @@ static HRESULT led15070_req_eeprom_read(int board, const struct led15070_req_any
uint8_t addr = req->payload[0];
uint8_t data = 0;
#if defined(LOG_LED15070)
dprintf("LED 15070: EEPROM read (board %u, address %02x)\n", board, addr);
#endif
if (addr > 0x07) {
dprintf("LED 15070: Error -- Invalid EEPROM read address %02x\n",
@ -1001,7 +1039,9 @@ static HRESULT led15070_req_eeprom_read(int board, const struct led15070_req_any
static HRESULT led15070_req_ack_on(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Acknowledge commands ON (board %u)\n", board);
#endif
led15070_per_board_vars[board].enable_response = true;
@ -1022,7 +1062,9 @@ static HRESULT led15070_req_ack_on(int board, const struct led15070_req_any *req
static HRESULT led15070_req_ack_off(int board, const struct led15070_req_any *req)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Acknowledge commands OFF (board %u)\n", board);
#endif
led15070_per_board_vars[board].enable_response = false;
@ -1043,7 +1085,9 @@ static HRESULT led15070_req_ack_off(int board, const struct led15070_req_any *re
static HRESULT led15070_req_board_info(int board)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Get board info (board %u)\n", board);
#endif
struct led15070_resp_board_info resp;
@ -1066,7 +1110,9 @@ static HRESULT led15070_req_board_info(int board)
static HRESULT led15070_req_board_status(int board)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Get board status (board %u)\n", board);
#endif
struct led15070_resp_any resp;
@ -1090,7 +1136,9 @@ static HRESULT led15070_req_board_status(int board)
static HRESULT led15070_req_fw_sum(int board)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Get firmware checksum (board %u)\n", board);
#endif
struct led15070_resp_any resp;
@ -1112,7 +1160,9 @@ static HRESULT led15070_req_fw_sum(int board)
static HRESULT led15070_req_protocol_ver(int board)
{
#if defined(LOG_LED15070)
dprintf("LED 15070: Get protocol version (board %u)\n", board);
#endif
struct led15070_resp_any resp;
@ -1186,7 +1236,7 @@ static HRESULT led15070_eeprom_open(int board, wchar_t *path, HANDLE *handle)
HRESULT hr;
BOOL ok;
#if 0
#if defined(LOG_LED15070)
dprintf("LED 15070: Opening EEPROM file '%S' handle (board %u)\n", path, board);
#endif
@ -1232,7 +1282,7 @@ static HRESULT led15070_eeprom_close(int board, wchar_t *path, HANDLE *handle)
HRESULT hr;
BOOL ok;
#if 0
#if defined(LOG_LED15070)
dprintf("LED 15070: Closing EEPROM file '%S' handle (board %u)\n", path, board);
#endif

View File

@ -7,7 +7,7 @@
struct led15070_config {
bool enable;
unsigned int port_no;
unsigned int port_no[2];
char board_number[8];
uint8_t fw_ver;
uint16_t fw_sum;
@ -15,9 +15,9 @@ struct led15070_config {
};
typedef HRESULT (*io_led_init_t)(void);
typedef void (*io_led_set_fet_output_t)(const uint8_t *rgb);
typedef void (*io_led_dc_update_t)(const uint8_t *rgb);
typedef void (*io_led_gs_update_t)(const uint8_t *rgb);
typedef void (*io_led_set_fet_output_t)(uint8_t board, const uint8_t *rgb);
typedef void (*io_led_dc_update_t)(uint8_t board, const uint8_t *rgb);
typedef void (*io_led_gs_update_t)(uint8_t board, const uint8_t *rgb);
HRESULT led15070_hook_init(
const struct led15070_config *cfg,
@ -25,5 +25,4 @@ HRESULT led15070_hook_init(
io_led_set_fet_output_t _led_set_fet_output,
io_led_dc_update_t _led_dc_update,
io_led_gs_update_t _led_gs_update,
unsigned int first_port,
unsigned int num_boards);
unsigned int port_no[2]);

View File

@ -88,7 +88,7 @@ struct led15093_req_reset {
struct led15093_req_set_timeout {
struct led15093_req_hdr hdr;
uint8_t cmd;
uint8_t count;
uint16_t count;
};
struct led15093_req_set_disable_response {

View File

@ -20,6 +20,7 @@
#include <process.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "board/led15093-cmd.h"
@ -106,9 +107,13 @@ static uint8_t led15093_host_adr = 1;
static io_led_init_t led_init;
static io_led_set_leds_t set_leds;
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr)
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])
{
unsigned int num_boards = 0;
assert(cfg != NULL);
assert(_led_init != NULL);
@ -118,14 +123,24 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
return S_FALSE;
}
if (cfg->port_no != 0) {
first_port = cfg->port_no;
for (int i = 0; i < led15093_nboards; i++)
{
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;
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_chip_num, cfg->chip_number, sizeof(led15093_chip_num));
@ -139,7 +154,7 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
InitializeCriticalSection(&vb->lock);
uart_init(&vb->boarduart, first_port + i);
uart_init(&vb->boarduart, port_no[i]);
if (cfg->high_baudrate) {
vb->boarduart.baud.BaudRate = 460800;
} else {
@ -208,7 +223,6 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
_led15093_per_board_vars *v = &led15093_per_board_vars[board];
struct uart *boarduart = &led15093_per_board_vars[board].boarduart;
/*
if (irp->op == IRP_OP_OPEN) {
// Unfortunately the LED board UART gets opened and closed repeatedly
@ -235,30 +249,6 @@ 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);
@ -272,7 +262,7 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
dump_iobuf(&boarduart->written);
#endif
req_iobuf.bytes = (byte*)&req;
req_iobuf.bytes = (uint8_t*)&req;
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload);
req_iobuf.pos = 0;
@ -687,16 +677,6 @@ static HRESULT led15093_req_set_imm_led(int board, const struct led15093_req_set
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
set_leds(board, (uint8_t *) req->data);

View File

@ -8,7 +8,7 @@
struct led15093_config {
bool enable;
bool high_baudrate;
unsigned int port_no;
unsigned int port_no[2];
char board_number[8];
char 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);
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
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_set_leds_t _set_leds, unsigned int port_no[2]);

View File

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

View File

@ -354,13 +354,13 @@ static HRESULT sg_nfc_poll_felica(
felica->type = 0x20;
felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm);
felica->IDm = _byteswap_uint64(IDm);
felica->PMm = _byteswap_uint64(felica_get_generic_PMm());
felica->PMm = _byteswap_uint64(felica_get_amusement_ic_PMm());
/* Initialize FeliCa IC emulator */
nfc->felica.IDm = IDm;
nfc->felica.PMm = felica_get_generic_PMm();
nfc->felica.system_code = 0x0000;
nfc->felica.PMm = felica_get_amusement_ic_PMm();
nfc->felica.system_code = 0x88b4;
return S_OK;
}

View File

@ -47,7 +47,7 @@ static struct sg_led sg_reader_led;
HRESULT sg_reader_hook_init(
const struct aime_config *cfg,
unsigned int port_no,
unsigned int default_port_no,
unsigned int gen,
HINSTANCE self)
{
@ -66,6 +66,11 @@ HRESULT sg_reader_hook_init(
return hr;
}
unsigned int port_no = cfg->port_no;
if (port_no == 0){
port_no = default_port_no;
}
if (cfg->gen != 0) {
gen = cfg->gen;
}
@ -85,6 +90,7 @@ HRESULT sg_reader_hook_init(
sg_reader_uart.baud.BaudRate = 38400;
}
dprintf("NFC Assembly: enabling (port=%d)\n", port_no);
uart_init(&sg_reader_uart, port_no);
sg_reader_uart.written.bytes = sg_reader_written_bytes;
sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes);

View File

@ -9,12 +9,13 @@
struct aime_config {
struct aime_dll_config dll;
bool enable;
unsigned int port_no;
bool high_baudrate;
unsigned int gen;
};
HRESULT sg_reader_hook_init(
const struct aime_config *cfg,
unsigned int port_no,
unsigned int default_port_no,
unsigned int gen,
HINSTANCE self);

View File

@ -8,6 +8,7 @@
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include "board/config.h"
#include "board/vfd.h"
@ -50,7 +51,7 @@ HRESULT vfd_handle_create_char2(struct const_iobuf* reader, struct iobuf* writer
static bool utf_enabled;
HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port)
HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no)
{
if (!cfg->enable){
return S_FALSE;
@ -58,13 +59,13 @@ HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port)
utf_enabled = cfg->utf_conversion;
int port = cfg->port;
if (port == 0){
port = default_port;
unsigned int port_no = cfg->port_no;
if (port_no == 0){
port_no = default_port_no;
}
dprintf("VFD: enabling (port=%d)\n", port);
uart_init(&vfd_uart, port);
dprintf("VFD: enabling (port=%d)\n", port_no);
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;

View File

@ -4,10 +4,10 @@
struct vfd_config {
bool enable;
int port;
unsigned int port_no;
bool utf_conversion;
};
HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port);
HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no);

View File

@ -53,6 +53,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE carol_hook_mod;
static process_entry_t carol_startup;
@ -73,8 +74,6 @@ static DWORD CALLBACK carol_pre_startup(void)
HMODULE dbghelp;
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. */
@ -100,7 +99,7 @@ static DWORD CALLBACK carol_pre_startup(void)
/* Config load */
carol_hook_config_load(&carol_hook_cfg, L".\\segatools.ini");
carol_hook_config_load(&carol_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -164,7 +163,7 @@ static DWORD CALLBACK carol_pre_startup(void)
}
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End carol_pre_startup ---\n");

View File

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

View File

@ -196,7 +196,7 @@ 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;
#if 1
#if 0
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);
#endif

View File

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

View File

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

View File

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

View File

@ -36,6 +36,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE chuni_hook_mod;
static process_entry_t chuni_startup;
@ -71,7 +72,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Config load */
chuni_hook_config_load(&chuni_hook_cfg, L".\\segatools.ini");
chuni_hook_config_load(&chuni_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -113,8 +114,9 @@ static DWORD CALLBACK chuni_pre_startup(void)
{
dprintf("IO DLL doesn't support led_init/led_set_leds, cannot start LED15093 hook\n");
} else {
unsigned int led_port_no[2] = {10, 11};
hr = led15093_hook_init(&chuni_hook_cfg.led15093,
chuni_dll.led_init, chuni_dll.led_set_leds, 10, 2, 2, 1);
chuni_dll.led_init, chuni_dll.led_set_leds, led_port_no);
if (FAILED(hr)) {
goto fail;
@ -129,7 +131,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End chuni_pre_startup ---\n");

View File

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

View File

@ -4,12 +4,14 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "chuniio/chuniio.h"
#include "chuniio/config.h"
#include "chuniio/ledoutput.h"
#include "util/dprintf.h"
#include "util/env.h"
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx);
@ -27,7 +29,7 @@ uint16_t chuni_io_get_api_version(void)
HRESULT chuni_io_jvs_init(void)
{
chuni_io_config_load(&chuni_io_cfg, L".\\segatools.ini");
chuni_io_config_load(&chuni_io_cfg, get_config_path());
led_init_mutex = CreateMutex(
NULL, // default security attributes
@ -92,7 +94,7 @@ void chuni_io_jvs_poll(uint8_t *opbtn, uint8_t *beams)
} else {
// Use actual AIR
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);
} else {
*beams &= ~(1 << i);
@ -172,6 +174,20 @@ HRESULT chuni_io_led_init(void)
}
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);
}

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "chuniio/config.h"

View File

@ -2,6 +2,7 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
struct chuni_io_config {
uint8_t vk_test;

View File

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

View File

@ -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];
byte* in_buf = unescaped->data;
byte* out_buf = out_struct->data;
uint8_t* in_buf = unescaped->data;
uint8_t* out_buf = out_struct->data;
int i = 0;
int o = 0;
while (i < unescaped->data_len)
{
byte b = in_buf[i++];
uint8_t b = in_buf[i++];
if (b == LED_PACKET_FRAMING || b == 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;
}
void led_output_update(uint8_t board, const byte* rgb)
void led_output_update(uint8_t board, const uint8_t* rgb)
{
if (board < 0 || board > 2 || !any_outputs_enabled)
{

View File

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

View File

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

View File

@ -98,7 +98,7 @@ void led_serial_update(struct _chuni_led_data_buf_t* data)
ReleaseMutex(serial_write_mutex);
}
void led_serial_update_openithm(const byte* rgb)
void led_serial_update_openithm(const uint8_t* rgb)
{
if (serial_port != INVALID_HANDLE_VALUE)
{

View File

@ -8,9 +8,10 @@
#pragma once
#include <windows.h>
#include <stdint.h>
#include "chuniio/leddata.h"
HRESULT led_serial_init(wchar_t led_com[12], DWORD baud);
void led_serial_update(struct _chuni_led_data_buf_t* data);
void led_serial_update_openithm(const byte* rgb);
void led_serial_update_openithm(const uint8_t* rgb);

View File

@ -2,6 +2,7 @@
#include <assert.h>
#include <stdlib.h>
#include <stdlib.h>
#include "chuniio/chu2to3.h"
#include "chusanhook/chuni-dll.h"

View File

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

View File

@ -22,40 +22,36 @@
COM4: 837-15396 "Gen 3" Aime Reader
*/
#include <windows.h>
#include <stddef.h>
#include <stdlib.h>
#include "amex/amex.h"
#include <windows.h>
#include "board/sg-reader.h"
#include "board/vfd.h"
#include "chuniio/chuniio.h"
#include "chusanhook/config.h"
#include "chusanhook/io4.h"
#include "chusanhook/slider.h"
#include "chuniio/chuniio.h"
#include "hook/process.h"
#include "gfxhook/d3d9.h"
#include "gfxhook/gfx.h"
#include "hook/process.h"
#include "hooklib/serial.h"
#include "hooklib/spike.h"
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE chusan_hook_mod;
static process_entry_t chusan_startup;
static struct chusan_hook_config chusan_hook_cfg;
static DWORD CALLBACK chusan_pre_startup(void)
{
static DWORD CALLBACK chusan_pre_startup(void) {
HMODULE d3dc;
HMODULE dbghelp;
HRESULT hr;
@ -84,10 +80,10 @@ static DWORD CALLBACK chusan_pre_startup(void)
/* Config load */
chusan_hook_config_load(&chusan_hook_cfg, L".\\segatools.ini");
chusan_hook_config_load(&chusan_hook_cfg, get_config_path());
/* Hook Win32 APIs */
dvd_hook_init(&chusan_hook_cfg.dvd, chusan_hook_mod);
gfx_hook_init(&chusan_hook_cfg.gfx);
gfx_d3d9_hook_init(&chusan_hook_cfg.gfx, chusan_hook_mod);
@ -95,6 +91,16 @@ static DWORD CALLBACK chusan_pre_startup(void)
/* Initialize emulation hooks */
struct dipsw_config new_dipsw_config[8] = {
{L"Delivery Server", L"Server", L"Client"},
{L"Monitor Type", L"60FPS", L"120FPS"},
{L"Cabinet Type", L"CVT", L"SP"},
};
// Set the system dip switch configuration
memcpy(chusan_hook_cfg.platform.system.dipsw_config, new_dipsw_config,
sizeof(new_dipsw_config));
hr = platform_hook_init(
&chusan_hook_cfg.platform,
"SDHD",
@ -123,27 +129,7 @@ static DWORD CALLBACK chusan_pre_startup(void)
goto fail;
}
bool *dipsw = &chusan_hook_cfg.platform.system.dipsw[0];
bool is_cvt = dipsw[2];
for (int i = 0; i < 3; i++) {
switch (i) {
case 0:
dprintf("DipSw: NetInstall: %s\n", dipsw[0] ? "Server" : "Client");
break;
case 1:
dprintf("DipSw: Monitor Type: %dFPS\n", dipsw[1] ? 60 : 120);
break;
case 2:
dprintf("DipSw: Cab Type: %s\n", is_cvt ? "CVT" : "SP");
break;
}
}
unsigned int first_port = is_cvt ? 2 : 20;
bool is_cvt = chusan_hook_cfg.platform.system.dipsw[2];
if (!is_cvt) {
hr = vfd_hook_init(&chusan_hook_cfg.vfd, 2);
@ -153,19 +139,31 @@ static DWORD CALLBACK chusan_pre_startup(void)
}
}
if ( chuni_dll.led_init == NULL || chuni_dll.led_set_leds == NULL )
{
dprintf("IO DLL doesn't support led_init/led_set_leds, cannot start LED15093 hook\n");
unsigned int led_port_no[2];
if (is_cvt) {
led_port_no[0] = 2;
led_port_no[1] = 3;
} else {
hr = led15093_hook_init(&chusan_hook_cfg.led15093,
chuni_dll.led_init, chuni_dll.led_set_leds, first_port, 2, 2, 1);
led_port_no[0] = 20;
led_port_no[1] = 21;
}
if (chuni_dll.led_init == NULL || chuni_dll.led_set_leds == NULL) {
dprintf(
"IO DLL doesn't support led_init/led_set_leds, cannot start "
"LED15093 hook\n");
} else {
hr = led15093_hook_init(&chusan_hook_cfg.led15093, chuni_dll.led_init,
chuni_dll.led_set_leds, led_port_no);
if (FAILED(hr)) {
goto fail;
}
}
hr = sg_reader_hook_init(&chusan_hook_cfg.aime, 4, is_cvt ? 2: 3, chusan_hook_mod);
hr = sg_reader_hook_init(&chusan_hook_cfg.aime, 4, is_cvt ? 2 : 3,
chusan_hook_mod);
if (FAILED(hr)) {
goto fail;
@ -173,7 +171,7 @@ static DWORD CALLBACK chusan_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End chusan_pre_startup ---\n");
@ -185,8 +183,7 @@ fail:
ExitProcess(EXIT_FAILURE);
}
BOOL WINAPI DllMain(HMODULE mod, DWORD cause, void *ctx)
{
BOOL WINAPI DllMain(HMODULE mod, DWORD cause, void *ctx) {
HRESULT hr;
if (cause != DLL_PROCESS_ATTACH) {
@ -198,7 +195,7 @@ BOOL WINAPI DllMain(HMODULE mod, DWORD cause, void *ctx)
hr = process_hijack_startup(chusan_pre_startup, &chusan_startup);
if (!SUCCEEDED(hr)) {
dprintf("Failed to hijack process startup: %x\n", (int) hr);
dprintf("Failed to hijack process startup: %x\n", (int)hr);
}
return SUCCEEDED(hr);

View File

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

View File

@ -1,5 +1,6 @@
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include "board/config.h"

View File

@ -35,6 +35,7 @@
#include "unityhook/hook.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE cm_hook_mod;
static process_entry_t cm_startup;
@ -48,7 +49,7 @@ static DWORD CALLBACK cm_pre_startup(void)
/* Load config */
cm_hook_config_load(&cm_hook_cfg, L".\\segatools.ini");
cm_hook_config_load(&cm_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -62,6 +63,14 @@ static DWORD CALLBACK cm_pre_startup(void)
/* Initialize emulation hooks */
struct dipsw_config new_dipsw_config[8] = {
{L"Delivery Server", L"Client", L"Server"},
};
// Set the system dip switch configuration
memcpy(cm_hook_cfg.platform.system.dipsw_config, new_dipsw_config,
sizeof(new_dipsw_config));
hr = platform_hook_init(
&cm_hook_cfg.platform,
"SDED",
@ -105,7 +114,7 @@ static DWORD CALLBACK cm_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End cm_pre_startup ---\n");

View File

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

View File

@ -6,6 +6,7 @@
#include "cmio/cmio.h"
#include "cmio/config.h"
#include "util/env.h"
static uint8_t cm_opbtn;
static struct cm_io_config cm_io_cfg;
@ -18,7 +19,7 @@ uint16_t cm_io_get_api_version(void)
HRESULT cm_io_init(void)
{
cm_io_config_load(&cm_io_cfg, L".\\segatools.ini");
cm_io_config_load(&cm_io_cfg, get_config_path());
return S_OK;
}

View File

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

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include "amex/amex.h"
#include "amex/config.h"

View File

@ -23,6 +23,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE cxb_hook_mod;
static process_entry_t cxb_startup;
@ -58,7 +59,7 @@ static DWORD CALLBACK cxb_pre_startup(void)
/* Config load */
cxb_hook_config_load(&cxb_hook_cfg, L".\\segatools.ini");
cxb_hook_config_load(&cxb_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -110,7 +111,7 @@ static DWORD CALLBACK cxb_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End cxb_pre_startup ---\n");

View File

@ -1,6 +1,9 @@
#include <windows.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "cxbhook/led.h"
#include "cxbhook/cxb-dll.h"

View File

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

View File

@ -1,6 +1,9 @@
#include <windows.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <winuser.h>
#include "cxbhook/revio.h"

View File

@ -8,6 +8,7 @@
#include "cxbio/config.h"
#include "util/dprintf.h"
#include "util/env.h"
static bool cxb_io_coin;
static int cxb_io_coins;
@ -21,7 +22,7 @@ uint16_t cxb_io_get_api_version(void)
HRESULT cxb_io_revio_init(void)
{
dprintf("CXB IO: REVIO init\n");
cxb_io_config_load(&cxb_io_cfg, L".\\segatools.ini");
cxb_io_config_load(&cxb_io_cfg, get_config_path());
return S_OK;
}
@ -75,4 +76,4 @@ HRESULT cxb_io_led_init(void)
}
void cxb_io_led_update(int id, int color)
{}
{}

View File

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

View File

@ -2,10 +2,10 @@
pushd %~dp0
taskkill /f /im aimeReaderHost.exe > nul 2>&1
start /min inject -d -k carolhook.dll aimeReaderHost.exe -p 10
inject -d -k carolhook.dll carol_nu.exe
taskkill /f /im aimeReaderHost.exe > nul 2>&1
echo.

View File

@ -64,12 +64,16 @@ subnet=192.168.126.0
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=1
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
monitor=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; Custom IO settings

View File

@ -3,7 +3,9 @@
pushd %~dp0
start /min inject -d -k chunihook.dll aimeReaderHost.exe -p 12
inject -d -k chunihook.dll chuniApp.exe
taskkill /f /im aimeReaderHost.exe > nul 2>&1
echo.

View File

@ -56,12 +56,16 @@ subnet=192.168.139.0
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=1
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
monitor=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; LED settings

View File

@ -82,12 +82,16 @@ dipsw3=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=0
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
monitor=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; LED settings

View File

@ -60,7 +60,7 @@ enable=1
subnet=192.168.150.0
billingCa=../DEVICE/ca.crt
billingPub=../DEVICE/billing.pub
billingType=2
billingType=0
[eeprom]
; See above
@ -75,12 +75,16 @@ path=../DEVICE/sram.bin
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=1
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
monitor=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; Custom IO settings

View File

@ -5,7 +5,7 @@
[vfs]
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
amfs=
; Insert the path to the game Option directory here (contains Axxx directories)
; Insert the path to the game Option (mdata) directory here (contains Mxxx directories)
option=
; Create an empty directory somewhere and insert the path here.
; This directory may be shared between multiple SEGA games.
@ -36,6 +36,10 @@ default=127.0.0.1
; Chunithm is extremely picky about its LAN environment, so leaving this
; setting enabled is strongly recommended.
enable=1
; The final octet of the local host's IP address on the virtualized subnet (so,
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
; local host's virtualized LAN IP is `192.168.32.11`).
addrSuffix=11
; -----------------------------------------------------------------------------
; Board settings
@ -54,6 +58,21 @@ dipsw1=1
; that subnet must start with 192.168.
subnet=192.168.78.0
; -----------------------------------------------------------------------------
; Misc. hooks settings
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; Custom IO settings
; -----------------------------------------------------------------------------

View File

@ -41,7 +41,7 @@ portNo=17
; 837-15093-06 LED board emulation setting.
enable=1
; COM port number for the LED board. Has to be the same as the FTDI port.
portNo=17
portNo1=17
; -----------------------------------------------------------------------------
; Network settings
@ -85,6 +85,16 @@ freeplay=0
; Misc. hook settings
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=0
; Add a frame to the game window if running windowed.
framed=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
[touch]
; WinTouch emulation setting.
enable=1

View File

@ -250,7 +250,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -2,7 +2,7 @@
pushd %~dp0
start /min "AM Daemon" inject -d -k idzhook.dll amdaemon.exe -c configDHCP_Final_Common.json configDHCP_Final_JP.json configDHCP_Final_JP_ST1.json configDHCP_Final_JP_ST2.json configDHCP_Final_EX.json configDHCP_Final_EX_ST1.json configDHCP_Final_EX_ST2.json
start "AM Daemon" /min inject -d -k idzhook.dll amdaemon.exe -c configDHCP_Final_Common.json configDHCP_Final_JP.json configDHCP_Final_JP_ST1.json configDHCP_Final_JP_ST2.json configDHCP_Final_EX.json configDHCP_Final_EX_ST1.json configDHCP_Final_EX_ST2.json
rem Set dipsw1=0 and uncomment the ServerBox for in store battle?
rem inject -k idzhook.dll ServerBoxD8_Nu_x64.exe

View File

@ -97,6 +97,9 @@ windowed=0
framed=1
; Select the monitor to run the game on. (Fullscreen only, 0=primary screen)
monitor=0
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; -----------------------------------------------------------------------------
; Custom IO settings
@ -240,7 +243,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -89,6 +89,9 @@ enable=1
serial_no="5A-A123"
; Insert the path to the image output directory here.
printerOutPath="DEVICE\print"
; The length in milliseconds the printer should be busy printing.
; Set to 0 to instantly finish printing.
waitTime=20000
; -----------------------------------------------------------------------------
; LED settings

View File

@ -69,6 +69,15 @@ freeplay=0
; this to 1 on exactly one machine and set this to 0 on all others.
dipsw1=1
; -----------------------------------------------------------------------------
; LED settings
; -----------------------------------------------------------------------------
[led15070]
; Enable emulation of the 837-15070-04 controlled lights, which handle the
; cabinet and button LEDs.
enable=1
; -----------------------------------------------------------------------------
; Misc. hook settings
; -----------------------------------------------------------------------------
@ -126,11 +135,22 @@ coin=0x72
; Uncomment and complete the following sequence of settings to configure a
; custom keybinding.
[button]
;1p_btn1=0x53
;1p_btn2=0x53
;1p_btn3=0x53
enable=1
;p1Btn1=0x53
;p1Btn2=0x53
;p1Btn3=0x53
; ... etc ...
;2p_btn1=0x53
;2p_btn2=0x53
;2p_btn3=0x53
;p2Btn1=0x53
;p2Btn2=0x53
;p2Btn3=0x53
; ... etc ...
[touch]
p1Enable=1
;p1DebugInput=0
p2Enable=1
;p2DebugInput=0
;p1TouchA1=0x53
;p1TouchA2=0x53
; ... etc ...
;p1TouchE8=0x53

View File

@ -1,10 +1,8 @@
@echo off
pushd %~dp0
taskkill /f /im amdaemon.exe > nul 2>&1
REM USA
start "AM Daemon" /min inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_usa.json
REM start "AM Daemon" /min inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_usa.json
REM JP
start "AM Daemon" /min inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_jpn.json

View File

@ -5,7 +5,7 @@
[vfs]
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
amfs=
; Insert the path to the game Option directory here (contains Axxx directories)
; Insert the path to the game Option directory here (unused in Mercury)
option=
; Create an empty directory somewhere and insert the path here.
; This directory may be shared between multiple SEGA games.
@ -74,7 +74,11 @@ dipsw1=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
; Hooks related to the touch boards
[touch]

View File

@ -70,7 +70,11 @@ dipsw1=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Enable DPI awareness for the game process, preventing Windows from stretching the game window if a DPI scaling higher than 100% is used
dpiAware=1
[unity]
; Enable Unity hook. This will allow you to run custom .NET code before the game

View File

@ -200,7 +200,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -8,6 +8,9 @@
#include "board/config.h"
#include "board/sg-reader.h"
#include "hooklib/config.h"
#include "hooklib/dvd.h"
#include "divahook/config.h"
#include "platform/config.h"
@ -47,6 +50,8 @@ void diva_hook_config_load(
platform_config_load(&cfg->platform, filename);
amex_config_load(&cfg->amex, filename);
aime_config_load(&cfg->aime, filename);
dvd_config_load(&cfg->dvd, filename);
gfx_config_load(&cfg->gfx, filename);
diva_dll_config_load(&cfg->dll, filename);
slider_config_load(&cfg->slider, filename);
}

View File

@ -6,15 +6,23 @@
#include "board/sg-reader.h"
#include "hooklib/dvd.h"
#include "hooklib/touch.h"
#include "gfxhook/config.h"
#include "platform/config.h"
#include "divahook/diva-dll.h"
#include "divahook/slider.h"
#include "platform/platform.h"
struct diva_hook_config {
struct platform_config platform;
struct amex_config amex;
struct aime_config aime;
struct dvd_config dvd;
struct gfx_config gfx;
struct touch_screen_config touch;
struct diva_dll_config dll;
struct slider_config slider;
};

View File

@ -22,6 +22,9 @@
#include "divahook/jvs.h"
#include "divahook/slider.h"
#include "gfxhook/gfx.h"
#include "gfxhook/gl.h"
#include "hook/process.h"
#include "hooklib/serial.h"
@ -30,6 +33,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE diva_hook_mod;
static process_entry_t diva_startup;
@ -38,15 +42,30 @@ static struct diva_hook_config diva_hook_cfg;
static DWORD CALLBACK diva_pre_startup(void)
{
HRESULT hr;
HMODULE dbghelp;
dprintf("--- Begin diva_pre_startup ---\n");
/* Pin dbghelp so the path hooks apply to it. */
dbghelp = LoadLibraryW(L"dbghelp.dll");
if (dbghelp != NULL) {
dprintf("Pinned debug helper library, hMod=%p\n", dbghelp);
}
else {
dprintf("Failed to load debug helper library!\n");
}
/* Config load */
diva_hook_config_load(&diva_hook_cfg, L".\\segatools.ini");
diva_hook_config_load(&diva_hook_cfg, get_config_path());
/* Hook Win32 APIs */
dvd_hook_init(&diva_hook_cfg.dvd, diva_hook_mod);
gfx_hook_init(&diva_hook_cfg.gfx);
gfx_gl_hook_init(&diva_hook_cfg.gfx, diva_hook_mod);
serial_hook_init();
/* Initialize emulation hooks */
@ -87,7 +106,7 @@ static DWORD CALLBACK diva_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End diva_pre_startup ---\n");

View File

@ -63,33 +63,33 @@ static void diva_jvs_read_switches(void *ctx, struct io3_switch_state *out)
diva_dll.jvs_poll(&opbtn, &gamebtn);
if (gamebtn & 0x01) {
if (gamebtn & DIVA_IO_GAMEBTN_CIRCLE) {
out->p1 |= 1 << 6;
}
if (gamebtn & 0x02) {
if (gamebtn & DIVA_IO_GAMEBTN_CROSS) {
out->p1 |= 1 << 7;
}
if (gamebtn & 0x04) {
if (gamebtn & DIVA_IO_GAMEBTN_SQUARE) {
out->p1 |= 1 << 8;
}
if (gamebtn & 0x08) {
if (gamebtn & DIVA_IO_GAMEBTN_TRIANGLE) {
out->p1 |= 1 << 9;
}
if (gamebtn & 0x10) {
if (gamebtn & DIVA_IO_GAMEBTN_START) {
out->p1 |= 1 << 15;
}
if (opbtn & 0x01) {
if (opbtn & DIVA_IO_OPBTN_TEST) {
out->system = 0x80;
} else {
out->system = 0;
}
if (opbtn & 0x02) {
if (opbtn & DIVA_IO_OPBTN_SERVICE) {
out->p1 |= 1 << 14;
}
}

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'divahook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),
@ -14,6 +13,7 @@ shared_library(
amex_lib,
board_lib,
divaio_lib,
gfxhook_lib,
hooklib_lib,
jvs_lib,
platform_lib,

View File

@ -7,6 +7,7 @@
#include "divaio/divaio.h"
#include "divaio/config.h"
#include "util/env.h"
static unsigned int __stdcall diva_io_slider_thread_proc(void *ctx);
@ -23,7 +24,7 @@ uint16_t diva_io_get_api_version(void)
HRESULT diva_io_jvs_init(void)
{
diva_io_config_load(&diva_io_cfg, L".\\segatools.ini");
diva_io_config_load(&diva_io_cfg, get_config_path());
return S_OK;
}
@ -37,11 +38,11 @@ void diva_io_jvs_poll(uint8_t *opbtn_out, uint8_t *gamebtn_out)
opbtn = 0;
if (GetAsyncKeyState(diva_io_cfg.vk_test) & 0x8000) {
opbtn |= 1;
opbtn |= DIVA_IO_OPBTN_TEST;
}
if (GetAsyncKeyState(diva_io_cfg.vk_service) & 0x8000) {
opbtn |= 2;
opbtn |= DIVA_IO_OPBTN_SERVICE;
}
for (i = 0 ; i < _countof(diva_io_cfg.vk_buttons) ; i++) {

View File

@ -5,6 +5,19 @@
#include <stdbool.h>
#include <stdint.h>
enum {
DIVA_IO_OPBTN_TEST = 0x01,
DIVA_IO_OPBTN_SERVICE = 0x02
};
enum {
DIVA_IO_GAMEBTN_CIRCLE = 0x01,
DIVA_IO_GAMEBTN_CROSS = 0x02,
DIVA_IO_GAMEBTN_SQUARE = 0x04,
DIVA_IO_GAMEBTN_TRIANGLE = 0x08,
DIVA_IO_GAMEBTN_START = 0x10,
};
/* Get the version of the Project Diva IO API that this DLL supports. This
function should return a positive 16-bit integer, where the high byte is
the major version and the low byte is the minor version (as defined by the

View File

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

View File

@ -44,7 +44,7 @@ option=../../option
1. In the `[dns]` section, set `default=` to your computer's hostname or LAN IP. Do not put
`127.0.0.1` here, the game specifically checks for and rejects loopback addresses. This setting
controls the address of the network services server
1. Right click `start.bat` in `app/bin` and run it as Administrator. I think you need to run it as
1. Right click `launch.bat` in `app/bin` and run it as Administrator. I think you need to run it as
admin at least once, but once you have done that you can run the game as a regular user
1. A sequence of several start-up screens will be displayed. You should also see a bunch of debug
output in a command line window; if you're seeing hex dumps here then that's a good sign. There

View File

@ -6,6 +6,17 @@ all games.
Keyboard binding settings use
[Virtual-Key Codes](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes).
## Config Path
The default file path for config file is `./segatools.ini`.
You can modify environment variable `SEGATOOLS_CONFIG_PATH` to another path.
For example, You can have another `launch.bat` with following code in it,
Then you can copy `segatools.ini` to `another_config.ini` but with different dns host in it
```bat
set SEGATOOLS_CONFIG_PATH=.\another_config.ini
```
## `[aimeio]`
Controls the card reader driver.
@ -31,6 +42,12 @@ Default: `1`
Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
reader (COM port number varies by game).
### `portNo`
Default: (game specific)
Sets the COM port to use for the aime card reader assembly.
### `highBaud`
Default: `1`
@ -197,6 +214,30 @@ Default: Empty string (i.e. use value from `default` setting)
Overrides the target of the `aime.naominet.jp` host lookup.
### `replaceHost`
Default: `0`
Replace the HOST field in HTTP request headers with the settings above. This may help bypass network restrictions in some regions.
### `startupPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `startup` server. The current implementation affects every TCP connection to the port 80.
### `billingPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `billing` server. The current implementation affects every TCP connection to the port 8443.
### `aimedbPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `aimedb` server. The current implementation affects every TCP connection to the port 22345.
## `[ds]`
Controls emulation of the "DS (Dallas Semiconductor) EEPROM" chip on the AMEX
@ -301,6 +342,38 @@ Nu chassis DIP switch settings:
- `111`: 1920x1080
- Switch 8: Game-specific. Not used in any shipping game.
## `[gfx]`
### `enable`
Default: `1`
Enables graphic hooks.
### `windowed`
Default: `0`
Force the game to run windowed.
### `framed`
Default: `0`
Add a frame to the game window if running windowed.
### `monitor`
Default: `0`
Select the monitor to run the game on. (Fullscreen only, 0 = primary screen)
### `dpiAware`
Default: `1`
Sets the game to be DPI-aware. This prevents Windows automatically scaling the game window by your desktop's scaling factor, which may cause blurry graphics.
## `[hwmon]`
Configure stub implementation of the platform hardware monitor driver. The
@ -379,18 +452,22 @@ Default: (Varies depending on game)
Override the game's four-character platform code (e.g. `AAV2` for Nu 2). This
is actually supposed to be a separate three-character `platformId` and
integer `modelType` setting, but they are combined here for convenience. Valid
values include:
integer `modelType` setting, but they are combined here for convenience.
- `AAV0`: Nu 1 (Project DIVA)
- `AAV1`: Nu 1.1 (Chunithm)
- `AAV2`: Nu 2 (Initial D Zero)
- `AAW0`: NuSX 1
- `AAW1`: NuSX 1.1
- `ACA0`: ALLS UX
- `ACA1`: ALLS HX
- `ACA2`: ALLS UX (without dedicated GPU)
- `ACA4`: ALLS MX
`platformId` is one of the following:
- `AAV`: Nu 1/1.1/2
- `AAW`: NuSX 1/1.1
- `ACA`: ALLS UX/HX/MX
`modelType` is one of the following:
- `1`: Server (SV)
- `2`: Satalite (ST)
- `3`: Live (LV)
- `4`: Terminal (TN)
It's safe to assume that every game you'll be playing with these tools will be a Satalite.
Some games care, others don't. Some even change how they run based on this value (Wonderland Wars
will boot into terminal mode if `modelType` is 4).
### `region`
@ -427,15 +504,9 @@ the billing transactions.
Default: `1`
Set the billing "type" for the keychip. The type determins what kind of revenue share,
if any, the game maker has with SEGA. Some games may be picky and require types other
then 1 (ex. crossbeats REV. requires billing type 2), so this option is provided if this
is an issue. Billing types are:
- 0: No billing?
- 1: Billing type A
- 2: Billing type B1
- 3: Billing type B2
Sets the billing type, a single bit value that flags the cabinet as a rental if set to `1`, or `0` otherwise.
Certian games that were only sold officially as full purchases (that is, non-rentals) must have this value set to 0.
NOTE: Crossbeats erroniously displays Billing modes A/B1/B2, but this value comes from the `modelType` and NOT this value!
### `systemFlag`

View File

@ -65,7 +65,7 @@ felicaGen=0
and fill it with 20 digits, for example `01234567891234567890`. Make sure to
save the file.
1. Right click `start.bat` in `package` and run it as Administrator. After the
1. Right click `launch.bat` in `package` and run it as Administrator. After the
first run you may be able to run the game as a normal user.
1. Once you're at the title screen, press 2 or 3 a few times to add some
credits, then _hold_ the Enter key for a few seconds to scan a card and start

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