mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-15 11:55:10 -05:00
Compare commits
71 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
52ff4927b4 | ||
|
|
d989e75488 | ||
|
|
b0564b97c6 | ||
|
|
47bfb4e9b2 | ||
|
|
5c4afb8a2a | ||
|
|
83ef8e2e9d | ||
|
|
3a71a5047a | ||
|
|
aaab9bfbfc | ||
|
|
eab80455b2 | ||
|
|
27e9775101 | ||
|
|
da94ad8f76 | ||
|
|
4c127d26e5 | ||
|
|
e807376d6b | ||
|
|
a2c2d31ca8 | ||
|
|
22978afc9b | ||
|
|
94c562f17b | ||
|
|
1f95437b17 | ||
|
|
58d4130c2a | ||
|
|
e530968dab | ||
|
|
99d756f207 | ||
|
|
2b8d19d82a | ||
|
|
fb84085f69 | ||
|
|
ffe678de61 | ||
|
|
031836ef0e | ||
|
|
a1a849aef3 | ||
|
|
32c786de27 | ||
|
|
4d9fe0002a | ||
|
|
a2ceb0f6cc | ||
|
|
2a57ed9916 | ||
|
|
825ac8e6d2 | ||
|
|
ef103eb299 | ||
|
|
65aa31ca22 | ||
|
|
ecda3ff86f | ||
|
|
389708f794 | ||
|
|
34aca9dc2a | ||
|
|
c2104e7758 | ||
|
|
6a140699ec | ||
|
|
b2e0d9f3d6 | ||
|
|
cb884c307c | ||
|
|
1154444d16 | ||
|
|
7b90963f53 | ||
|
|
722927caa7 | ||
|
|
5eb40bfad3 | ||
|
|
f2678539c3 | ||
|
|
bb0d2823bf | ||
|
|
cb290ab02e | ||
|
|
3d955a8dca | ||
|
|
4a333d0b13 | ||
|
|
f63c759ab2 | ||
|
|
edd0bda3bb | ||
|
|
c49fc61f89 | ||
|
|
885bffd9eb | ||
|
|
c310a41752 | ||
|
|
2a7738dac8 | ||
|
|
b4bf1f481d | ||
|
|
dc931faf86 | ||
|
|
523c0ad3f2 | ||
|
|
3cba8db787 | ||
|
|
2139fce2ae | ||
|
|
bb86aa65e5 | ||
|
|
f0dfc61128 | ||
|
|
61a343d59a | ||
|
|
119272b5d2 | ||
|
|
0cd85083f6 | ||
|
|
485c4d0ad7 | ||
|
|
4bd0ee5ef6 | ||
|
|
8081793a5f | ||
|
|
badd616add | ||
|
|
926e976c36 | ||
|
|
5d2b46376d | ||
|
|
8d5ef0bfb3 |
@@ -1,17 +1,24 @@
|
|||||||
|
# Bug report
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
<!--- Provide a general summary of the issue in the Title above -->
|
<!--- Provide a general summary of the issue in the Title above -->
|
||||||
|
|
||||||
## Expected behavior
|
## Expected behavior
|
||||||
|
|
||||||
<!--- Tell us what should happen -->
|
<!--- Tell us what should happen -->
|
||||||
|
|
||||||
## Current behavior
|
## Current behavior
|
||||||
|
|
||||||
<!--- Tell us what happens instead of the expected behavior -->
|
<!--- Tell us what happens instead of the expected behavior -->
|
||||||
|
|
||||||
## Detailed Description
|
## Detailed Description
|
||||||
|
|
||||||
<!--- Provide a detailed description of the issue. Include links to screenshots or videos if
|
<!--- Provide a detailed description of the issue. Include links to screenshots or videos if
|
||||||
necessary -->
|
necessary -->
|
||||||
|
|
||||||
## Steps to reproduce
|
## Steps to reproduce
|
||||||
|
|
||||||
<!-- Try running the game with a default configuration as well. If that also causes issues, please point that out here in the report. This might speed up the debugging process.-->
|
<!-- Try running the game with a default configuration as well. If that also causes issues, please point that out here in the report. This might speed up the debugging process.-->
|
||||||
|
|
||||||
<!--- Provide a detailed step by step description how to reproduce this issue -->
|
<!--- Provide a detailed step by step description how to reproduce this issue -->
|
||||||
@@ -21,17 +28,23 @@ necessary -->
|
|||||||
4.
|
4.
|
||||||
|
|
||||||
## Possible solution
|
## Possible solution
|
||||||
|
|
||||||
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
|
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
|
||||||
|
|
||||||
## Context (Environment)
|
## Context (Environment)
|
||||||
|
|
||||||
### Bemanitools version(s) affected
|
### Bemanitools version(s) affected
|
||||||
|
|
||||||
* <!--- Add one or multiple versions as a bullet list -->
|
* <!--- Add one or multiple versions as a bullet list -->
|
||||||
|
|
||||||
### Game(s) and version(s) affected
|
### Game(s) and version(s) affected
|
||||||
|
|
||||||
* <!--- Add one or multiple game versions as a bullet list -->
|
* <!--- Add one or multiple game versions as a bullet list -->
|
||||||
|
|
||||||
### Log output
|
### Log output
|
||||||
|
|
||||||
See attachment.
|
See attachment.
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
Provide FULL log output, e.g. inject.log or launcher.log. Please do not guess which things
|
Provide FULL log output, e.g. inject.log or launcher.log. Please do not guess which things
|
||||||
are relevant or not. Without knowing, you might leave out things that are relevant for the developers. You have to enable log output explicitly if not done already.
|
are relevant or not. Without knowing, you might leave out things that are relevant for the developers. You have to enable log output explicitly if not done already.
|
||||||
@@ -50,7 +63,9 @@ Use the search and replace feature of any kind of text editor.
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
### Configuration files
|
### Configuration files
|
||||||
|
|
||||||
See attachment.
|
See attachment.
|
||||||
|
|
||||||
<!--- Provide any configuration files that you used, e.g. iidxhook-XX.conf. This file is located in
|
<!--- Provide any configuration files that you used, e.g. iidxhook-XX.conf. This file is located in
|
||||||
the same directory as launcher.exe or inject.exe.
|
the same directory as launcher.exe or inject.exe.
|
||||||
|
|
||||||
@@ -66,17 +81,21 @@ Use the search and replace feature of any kind of text editor.
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
### Command line arguments
|
### Command line arguments
|
||||||
|
|
||||||
<!--- Provide how you run the game from the command line, e.g. which gamestart.bat you used and any
|
<!--- Provide how you run the game from the command line, e.g. which gamestart.bat you used and any
|
||||||
additional arguments that you provided to it. Also provide the contents of the gamestart.bat you
|
additional arguments that you provided to it. Also provide the contents of the gamestart.bat you
|
||||||
used if you altered it. -->
|
used if you altered it. -->
|
||||||
|
|
||||||
### APIs used
|
### APIs used
|
||||||
|
|
||||||
* <!--- List all APIs you used as a bullet list, e.g. iidxio-keyboard, eamio-keyboard -->
|
* <!--- List all APIs you used as a bullet list, e.g. iidxio-keyboard, eamio-keyboard -->
|
||||||
|
|
||||||
### OS version
|
### OS version
|
||||||
|
|
||||||
<!--- Provide the version of Windows you used with whatever update/build identifier -->
|
<!--- Provide the version of Windows you used with whatever update/build identifier -->
|
||||||
|
|
||||||
### Hardware specs
|
### Hardware specs
|
||||||
|
|
||||||
* CPU: <!--- Insert, e.g. Core i7 2600k 3.20ghz -->
|
* CPU: <!--- Insert, e.g. Core i7 2600k 3.20ghz -->
|
||||||
* RAM: <!--- Insert, e.g. 16 GB -->
|
* RAM: <!--- Insert, e.g. 16 GB -->
|
||||||
* GPU: <!--- Insert, e.g. Nvidia GeForce GTX 970, 4GB -->
|
* GPU: <!--- Insert, e.g. Nvidia GeForce GTX 970, 4GB -->
|
||||||
@@ -1,14 +1,21 @@
|
|||||||
|
# Feature request
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
<!--- Provide a general summary of your changes in the Title above -->
|
<!--- Provide a general summary of your changes in the Title above -->
|
||||||
|
|
||||||
## Detailed description
|
## Detailed description
|
||||||
|
|
||||||
<!--- Describe your feature in detail -->
|
<!--- Describe your feature in detail -->
|
||||||
|
|
||||||
## Benefits
|
## Benefits
|
||||||
|
|
||||||
<!--- Describe the value/benefits of the feature in detail -->
|
<!--- Describe the value/benefits of the feature in detail -->
|
||||||
|
|
||||||
## Drawbacks
|
## Drawbacks
|
||||||
|
|
||||||
<!--- Describe any drawbacks that might be introduced with this feature -->
|
<!--- Describe any drawbacks that might be introduced with this feature -->
|
||||||
|
|
||||||
## Current blockers
|
## Current blockers
|
||||||
|
|
||||||
<!--- Describe any blockers that need to be resolved before implementing this feature -->
|
<!--- Describe any blockers that need to be resolved before implementing this feature -->
|
||||||
@@ -1,23 +1,31 @@
|
|||||||
|
# Pull request
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
<!--- Provide a general summary of your changes in the Title above -->
|
<!--- Provide a general summary of your changes in the Title above -->
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
<!--- Describe your changes in detail -->
|
<!--- Describe your changes in detail -->
|
||||||
|
|
||||||
## Related Issue
|
## Related Issue
|
||||||
|
|
||||||
<!--- This project only accepts pull requests related to open issues -->
|
<!--- This project only accepts pull requests related to open issues -->
|
||||||
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
|
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
|
||||||
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
|
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
|
||||||
<!--- Please link to the issue here: -->
|
<!--- Please link to the issue here: -->
|
||||||
|
|
||||||
## How Has This Been Tested?
|
## How Has This Been Tested?
|
||||||
|
|
||||||
<!--- Please describe in detail how you tested your changes. -->
|
<!--- Please describe in detail how you tested your changes. -->
|
||||||
<!--- Include details of your testing environment, and the tests you ran to -->
|
<!--- Include details of your testing environment, and the tests you ran to -->
|
||||||
<!--- see how your change affects other areas of the code, etc. -->
|
<!--- see how your change affects other areas of the code, etc. -->
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!-- Make sure you covered all items, which apply, of the checklist below. -->
|
<!-- Make sure you covered all items, which apply, of the checklist below. -->
|
||||||
<!-- Strikethrough items that do not apply and provide a brief description why. -->
|
<!-- Strikethrough items that do not apply and provide a brief description why. -->
|
||||||
|
|
||||||
* [ ] Implemented (unit) test(s) which prove that the introduced changes are working as expected.
|
* [ ] Implemented (unit) test(s) which prove that the introduced changes are working as expected.
|
||||||
* Tested with the following games:
|
* Tested with the following games:
|
||||||
* [ ] ... <!-- insert game name 1-->
|
* [ ] ... <!-- insert game name 1-->
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,4 +3,5 @@ build/
|
|||||||
.idea
|
.idea
|
||||||
.vscode
|
.vscode
|
||||||
.vs
|
.vs
|
||||||
version
|
version
|
||||||
|
.DS_Store
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
## Summary
|
|
||||||
<!--- Provide a general summary of your changes in the Title above -->
|
|
||||||
|
|
||||||
## Description
|
|
||||||
<!--- Describe your changes in detail -->
|
|
||||||
|
|
||||||
## Related Issue
|
|
||||||
<!--- This project only accepts pull requests related to open issues -->
|
|
||||||
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
|
|
||||||
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
|
|
||||||
<!--- Please link to the issue here: -->
|
|
||||||
|
|
||||||
## How Has This Been Tested?
|
|
||||||
<!--- Please describe in detail how you tested your changes. -->
|
|
||||||
<!--- Include details of your testing environment, and the tests you ran to -->
|
|
||||||
<!--- see how your change affects other areas of the code, etc. -->
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
<!-- Make sure you covered all items, which apply, of the checklist below. -->
|
|
||||||
<!-- Strikethrough items that do not apply and provide a brief description why. -->
|
|
||||||
* [ ] Implemented (unit) test(s) which prove that the introduced changes are working as expected.
|
|
||||||
* Tested with the following games:
|
|
||||||
* [ ] ... <!-- insert game name 1-->
|
|
||||||
* [ ] ... <!-- insert game name 2--->
|
|
||||||
* [ ] Followed the developer (style) guidelines.
|
|
||||||
* [ ] Updated existing doc of or add new doc to README file(s).
|
|
||||||
* [ ] Updated development documentation.
|
|
||||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -2,6 +2,42 @@
|
|||||||
Note for CI/CD: Ensure the version formatting in the sections is kept identical to the versions
|
Note for CI/CD: Ensure the version formatting in the sections is kept identical to the versions
|
||||||
given in tags. The pipeline will pick this up and cuts out the relevant section for release notes.
|
given in tags. The pipeline will pick this up and cuts out the relevant section for release notes.
|
||||||
|
|
||||||
|
## 5.44
|
||||||
|
### Features
|
||||||
|
* feat(doc): ezusb dev journal entry, 10th style ezusb boot up and security setup
|
||||||
|
* feat(iidx 09/10): ezusb API call monitoring module and configuration flag
|
||||||
|
* feat(iidx 19): Add back btools monitor check for iidxhook5
|
||||||
|
* feat(iidx 9-19): Add configurable settings path hook. Redirect settings paths, i.e. `d/`, `e/` and
|
||||||
|
`f/` drive "folders" to an arbitrary path on any partition, e.g. writable partition
|
||||||
|
* feat(iidx 9/10): Improve commandline script for irbeat-patch 09 and 10, add interactive mode
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* fix(iidx 10): SQ-INIT error caused by incorrect security configuration
|
||||||
|
* fix(iidx 9-24): Wire up coin input in ezusb1/2 IO emulation layer
|
||||||
|
* fix(pnm 15-18): Fix IO buffer inconsistency causing random input misfiring
|
||||||
|
* fix(jb 1-8): Fix IO buffer inconsistency causing random input misfiring
|
||||||
|
* fix(iidx 9-24): Fix IO buffer inconsistency causing random input misfiring
|
||||||
|
* fix(iidx 19): imagefs override strategy with local file redir. Required to enable monitor-check
|
||||||
|
on all chart files
|
||||||
|
* fix(iidx 9-19): Code synchronization issue causing deadlock resulting in game hang/stuck on boot
|
||||||
|
* fix(iidx 9-19): Fix broken settings path handling with mixed / and \
|
||||||
|
* fix(iidx 27): Align disabled cam connection config defaults with 28/29
|
||||||
|
* fix(inject): Fix missing forwarding of exit code
|
||||||
|
* fix(inject): Getting stuck when game exits cleanly due to locked up debugger thread.
|
||||||
|
* fix(iidx 18/19 CN): gamestart.bat creating dev/nvram and dev/raw folders
|
||||||
|
|
||||||
|
## 5.43
|
||||||
|
* iidx29: (Officially) support IIDX CASTHOUR
|
||||||
|
* Code structure maintenance
|
||||||
|
* Various documentation improvements
|
||||||
|
|
||||||
|
## 5.42
|
||||||
|
* Bugfix: Fix diagonal texture tearing on IIDX 18 and 19 based games
|
||||||
|
* Feature: Add support for IIDX Resort Anthem CN using iidxhook4-cn
|
||||||
|
* Feature/bugfix: Enable "nvidia fix" for iidxhook4, 5 and 5-cn. Should fix crashing on some/all
|
||||||
|
nvidia cards
|
||||||
|
* Various minor fixes
|
||||||
|
|
||||||
## 5.41
|
## 5.41
|
||||||
* Feature: Support pop'n music 15-18 using popnhook1
|
* Feature: Support pop'n music 15-18 using popnhook1
|
||||||
* Feature: Support IIDX tricoro CN using iidxhook5-cn
|
* Feature: Support IIDX tricoro CN using iidxhook5-cn
|
||||||
|
|||||||
35
Dockerfile
35
Dockerfile
@@ -1,32 +1,21 @@
|
|||||||
FROM fedora:31
|
FROM --platform=amd64 debian:11.6-slim@sha256:f7d141c1ec6af549958a7a2543365a7829c2cdc4476308ec2e182f8a7c59b519
|
||||||
|
|
||||||
LABEL description="Build environment for bemanitools"
|
LABEL description="Build environment for bemanitools"
|
||||||
|
|
||||||
RUN yum -y install \
|
# mingw-w64-gcc has 32-bit and 64-bit toolchains
|
||||||
git \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
mingw-w64 \
|
||||||
|
mingw-w64-common \
|
||||||
make \
|
make \
|
||||||
zip \
|
zip \
|
||||||
clang \
|
git \
|
||||||
mingw64-gcc.x86_64 \
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
mingw32-gcc.x86_64 \
|
|
||||||
wine.x86_64
|
|
||||||
|
|
||||||
RUN mkdir /bemanitools
|
RUN mkdir /bemanitools
|
||||||
WORKDIR /bemanitools
|
WORKDIR /bemanitools
|
||||||
|
|
||||||
# Order optimized for docker layer caching
|
ENTRYPOINT [ \
|
||||||
COPY run-tests-wine.sh run-tests-wine.sh
|
"/bin/sh", \
|
||||||
COPY CHANGELOG.md CHANGELOG.md
|
"-c" , \
|
||||||
COPY CONTRIBUTING.md CONTRIBUTING.md
|
"cd /bemanitools && \
|
||||||
COPY LICENSE LICENSE
|
make" ]
|
||||||
COPY GNUmakefile GNUmakefile
|
|
||||||
COPY Module.mk Module.mk
|
|
||||||
COPY README.md README.md
|
|
||||||
COPY doc doc
|
|
||||||
COPY dist dist
|
|
||||||
COPY src src
|
|
||||||
# .git folder required or building fails when version is generated
|
|
||||||
COPY .git .git
|
|
||||||
|
|
||||||
# Building
|
|
||||||
RUN make
|
|
||||||
26
GNUmakefile
26
GNUmakefile
@@ -14,7 +14,7 @@ BUILDDIR ?= build
|
|||||||
builddir_docker := $(BUILDDIR)/docker
|
builddir_docker := $(BUILDDIR)/docker
|
||||||
|
|
||||||
docker_container_name := "bemanitools-build"
|
docker_container_name := "bemanitools-build"
|
||||||
docker_image_name := "bemanitools:build"
|
docker_image_name := "bemanitools-build:latest"
|
||||||
|
|
||||||
depdir := $(BUILDDIR)/dep
|
depdir := $(BUILDDIR)/dep
|
||||||
objdir := $(BUILDDIR)/obj
|
objdir := $(BUILDDIR)/obj
|
||||||
@@ -69,7 +69,7 @@ clean:
|
|||||||
|
|
||||||
code-format:
|
code-format:
|
||||||
$(V)echo "Applying clang-format..."
|
$(V)echo "Applying clang-format..."
|
||||||
$(V)find src/ -name '*.c' -o -name '*.h' | xargs clang-format -i -style=file
|
$(V)find src/main src/test -name '*.c' -o -name '*.h' | xargs clang-format -i -style=file
|
||||||
|
|
||||||
run-tests:
|
run-tests:
|
||||||
$(V)echo "Running tests..."
|
$(V)echo "Running tests..."
|
||||||
@@ -81,13 +81,21 @@ version:
|
|||||||
|
|
||||||
build-docker:
|
build-docker:
|
||||||
$(V)docker rm -f $(docker_container_name) 2> /dev/null || true
|
$(V)docker rm -f $(docker_container_name) 2> /dev/null || true
|
||||||
$(V)docker build -t $(docker_image_name) -f Dockerfile .
|
$(V)docker \
|
||||||
$(V)docker create --name $(docker_container_name) $(docker_image_name)
|
build \
|
||||||
$(V)rm -rf $(builddir_docker)
|
-t $(docker_image_name) \
|
||||||
$(V)mkdir -p $(builddir_docker)
|
-f Dockerfile \
|
||||||
$(V)docker cp $(docker_container_name):/bemanitools/build $(builddir_docker)
|
.
|
||||||
$(V)mv $(builddir_docker)/build/* $(builddir_docker)
|
$(V)docker \
|
||||||
$(V)rm -r $(builddir_docker)/build
|
run \
|
||||||
|
--volume $(shell pwd):/bemanitools \
|
||||||
|
--name $(docker_container_name) \
|
||||||
|
$(docker_image_name)
|
||||||
|
|
||||||
|
clean-docker:
|
||||||
|
$(V)docker rm -f $(docker_container_name) || true
|
||||||
|
$(V)docker image rm -f $(docker_image_name) || true
|
||||||
|
$(V)rm -rf $(BUILDDIR)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Pull in module definitions
|
# Pull in module definitions
|
||||||
|
|||||||
27
Module.mk
27
Module.mk
@@ -57,6 +57,7 @@
|
|||||||
# beatmania IIDX 22 PENDUAL
|
# beatmania IIDX 22 PENDUAL
|
||||||
# beatmania IIDX 23 copula
|
# beatmania IIDX 23 copula
|
||||||
# beatmania IIDX 24 SINOBUZ
|
# beatmania IIDX 24 SINOBUZ
|
||||||
|
# Patch 3: DanceDanceRevoluion A20+ (64-bit)
|
||||||
# "Patch" 3: Silent Scope Bone Eater (compatible with p7)
|
# "Patch" 3: Silent Scope Bone Eater (compatible with p7)
|
||||||
# "Patch" 7: Steel Chronicle VicTroopers (not a Bemani, w/e)
|
# "Patch" 7: Steel Chronicle VicTroopers (not a Bemani, w/e)
|
||||||
#
|
#
|
||||||
@@ -110,6 +111,7 @@ include src/main/eamio-icca/Module.mk
|
|||||||
include src/main/eamio/Module.mk
|
include src/main/eamio/Module.mk
|
||||||
include src/main/eamiotest/Module.mk
|
include src/main/eamiotest/Module.mk
|
||||||
include src/main/ezusb-emu/Module.mk
|
include src/main/ezusb-emu/Module.mk
|
||||||
|
include src/main/ezusb-iidx-16seg-emu/Module.mk
|
||||||
include src/main/ezusb-iidx-emu/Module.mk
|
include src/main/ezusb-iidx-emu/Module.mk
|
||||||
include src/main/ezusb-iidx-fpga-flash/Module.mk
|
include src/main/ezusb-iidx-fpga-flash/Module.mk
|
||||||
include src/main/ezusb-iidx-sram-flash/Module.mk
|
include src/main/ezusb-iidx-sram-flash/Module.mk
|
||||||
@@ -136,6 +138,7 @@ include src/main/iidxhook1/Module.mk
|
|||||||
include src/main/iidxhook2/Module.mk
|
include src/main/iidxhook2/Module.mk
|
||||||
include src/main/iidxhook3/Module.mk
|
include src/main/iidxhook3/Module.mk
|
||||||
include src/main/iidxhook4/Module.mk
|
include src/main/iidxhook4/Module.mk
|
||||||
|
include src/main/iidxhook4-cn/Module.mk
|
||||||
include src/main/iidxhook5/Module.mk
|
include src/main/iidxhook5/Module.mk
|
||||||
include src/main/iidxhook5-cn/Module.mk
|
include src/main/iidxhook5-cn/Module.mk
|
||||||
include src/main/iidxhook6/Module.mk
|
include src/main/iidxhook6/Module.mk
|
||||||
@@ -312,6 +315,21 @@ $(zipdir)/iidx-18.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/iidx-18-cn.zip: \
|
||||||
|
build/bin/avs2_1101-32/iidxhook4-cn.dll \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
build/bin/indep-32/iidxio.dll \
|
||||||
|
build/bin/indep-32/vefxio.dll \
|
||||||
|
build/bin/indep-32/inject.exe \
|
||||||
|
dist/iidx/config.bat \
|
||||||
|
dist/iidx/gamestart-18-cn.bat \
|
||||||
|
dist/iidx/iidxhook-18-cn.conf \
|
||||||
|
dist/iidx/vefx.txt \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/iidx-19.zip: \
|
$(zipdir)/iidx-19.zip: \
|
||||||
build/bin/avs2_1304-32/iidxhook5.dll \
|
build/bin/avs2_1304-32/iidxhook5.dll \
|
||||||
build/bin/avs2_1304-32/launcher.exe \
|
build/bin/avs2_1304-32/launcher.exe \
|
||||||
@@ -347,7 +365,6 @@ $(zipdir)/iidx-20.zip: \
|
|||||||
$(zipdir)/iidx-20-cn.zip: \
|
$(zipdir)/iidx-20-cn.zip: \
|
||||||
build/bin/avs2_1304-32/iidxhook5-cn.dll \
|
build/bin/avs2_1304-32/iidxhook5-cn.dll \
|
||||||
build/bin/indep-32/config.exe \
|
build/bin/indep-32/config.exe \
|
||||||
build/bin/indep-32/eamio.dll \
|
|
||||||
build/bin/indep-32/geninput.dll \
|
build/bin/indep-32/geninput.dll \
|
||||||
build/bin/indep-32/iidxio.dll \
|
build/bin/indep-32/iidxio.dll \
|
||||||
build/bin/indep-32/vefxio.dll \
|
build/bin/indep-32/vefxio.dll \
|
||||||
@@ -400,7 +417,7 @@ $(zipdir)/iidx-25-to-26.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/iidx-27-to-28.zip: \
|
$(zipdir)/iidx-27-to-29.zip: \
|
||||||
build/bin/avs2_1700-64/iidxhook9.dll \
|
build/bin/avs2_1700-64/iidxhook9.dll \
|
||||||
build/bin/avs2_1700-64/launcher.exe \
|
build/bin/avs2_1700-64/launcher.exe \
|
||||||
build/bin/indep-64/config.exe \
|
build/bin/indep-64/config.exe \
|
||||||
@@ -411,8 +428,10 @@ $(zipdir)/iidx-27-to-28.zip: \
|
|||||||
dist/iidx/config.bat \
|
dist/iidx/config.bat \
|
||||||
dist/iidx/gamestart-27.bat \
|
dist/iidx/gamestart-27.bat \
|
||||||
dist/iidx/gamestart-28.bat \
|
dist/iidx/gamestart-28.bat \
|
||||||
|
dist/iidx/gamestart-29.bat \
|
||||||
dist/iidx/iidxhook-27.conf \
|
dist/iidx/iidxhook-27.conf \
|
||||||
dist/iidx/iidxhook-28.conf \
|
dist/iidx/iidxhook-28.conf \
|
||||||
|
dist/iidx/iidxhook-29.conf \
|
||||||
dist/iidx/vefx.txt \
|
dist/iidx/vefx.txt \
|
||||||
| $(zipdir)/
|
| $(zipdir)/
|
||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
@@ -722,6 +741,7 @@ $(zipdir)/popn-15-to-18.zip: \
|
|||||||
build/bin/indep-32/eamio.dll \
|
build/bin/indep-32/eamio.dll \
|
||||||
build/bin/indep-32/popnio.dll \
|
build/bin/indep-32/popnio.dll \
|
||||||
build/bin/indep-32/ezusb2-popn-shim.dll \
|
build/bin/indep-32/ezusb2-popn-shim.dll \
|
||||||
|
dist/popn/config.bat \
|
||||||
dist/popn/gamestart-15.bat \
|
dist/popn/gamestart-15.bat \
|
||||||
dist/popn/gamestart-16.bat \
|
dist/popn/gamestart-16.bat \
|
||||||
dist/popn/gamestart-17.bat \
|
dist/popn/gamestart-17.bat \
|
||||||
@@ -779,12 +799,13 @@ $(BUILDDIR)/bemanitools.zip: \
|
|||||||
$(zipdir)/iidx-13.zip \
|
$(zipdir)/iidx-13.zip \
|
||||||
$(zipdir)/iidx-14-to-17.zip \
|
$(zipdir)/iidx-14-to-17.zip \
|
||||||
$(zipdir)/iidx-18.zip \
|
$(zipdir)/iidx-18.zip \
|
||||||
|
$(zipdir)/iidx-18-cn.zip \
|
||||||
$(zipdir)/iidx-19.zip \
|
$(zipdir)/iidx-19.zip \
|
||||||
$(zipdir)/iidx-20.zip \
|
$(zipdir)/iidx-20.zip \
|
||||||
$(zipdir)/iidx-20-cn.zip \
|
$(zipdir)/iidx-20-cn.zip \
|
||||||
$(zipdir)/iidx-21-to-24.zip \
|
$(zipdir)/iidx-21-to-24.zip \
|
||||||
$(zipdir)/iidx-25-to-26.zip \
|
$(zipdir)/iidx-25-to-26.zip \
|
||||||
$(zipdir)/iidx-27-to-28.zip \
|
$(zipdir)/iidx-27-to-29.zip \
|
||||||
$(zipdir)/iidx-hwio-x86.zip \
|
$(zipdir)/iidx-hwio-x86.zip \
|
||||||
$(zipdir)/iidx-hwio-x64.zip \
|
$(zipdir)/iidx-hwio-x64.zip \
|
||||||
$(zipdir)/jb-01.zip \
|
$(zipdir)/jb-01.zip \
|
||||||
|
|||||||
86
README.md
86
README.md
@@ -1,11 +1,11 @@
|
|||||||
# Bemanitools 5
|
# Bemanitools 5
|
||||||
[](https://dev.s-ul.net/djhackers/bemanitools/commits/master)
|
[](https://dev.s-ul.net/djhackers/bemanitools/commits/master)
|
||||||
|
|
||||||
Version: 5.41
|
Version: 5.44
|
||||||
|
|
||||||
[Release history](CHANGELOG.md)
|
[Release history](CHANGELOG.md)
|
||||||
|
|
||||||
A collection of tools to run [various Bemani arcade games](#list-of-supported-games).
|
A collection of tools to run [various Bemani arcade games](#supported-games).
|
||||||
|
|
||||||
Bemanitools 5 (BT5) is the successor to Bemanitools 4 which introduces a big code cleanup and support for newer games.
|
Bemanitools 5 (BT5) is the successor to Bemanitools 4 which introduces a big code cleanup and support for newer games.
|
||||||
BT5 uses a cleaner approach than BT4 did; specifically, all input and lighting is handled by emulating the protocols
|
BT5 uses a cleaner approach than BT4 did; specifically, all input and lighting is handled by emulating the protocols
|
||||||
@@ -59,8 +59,9 @@ The following games are supported with their corresponding hook-libraries.
|
|||||||
* Beatmania IIDX 24 SINOBUZ (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
* Beatmania IIDX 24 SINOBUZ (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||||
* Beatmania IIDX 25 CANNON BALLERS (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
* Beatmania IIDX 25 CANNON BALLERS (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||||
* Beatmania IIDX 26 Rootage (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
* Beatmania IIDX 26 Rootage (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||||
* Beatmania IIDX 27 Heroic Verse (`iidx-27-to-28.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
* Beatmania IIDX 27 Heroic Verse (`iidx-27-to-29.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||||
* Beatmania IIDX 28 BISTROVER (`iidx-27-to-28.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
* Beatmania IIDX 28 BISTROVER (`iidx-27-to-29.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||||
|
* Beatmania IIDX 29 CASTHOUR (`iidx-27-to-29.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||||
* [jubeat](doc/jbhook/README.md)
|
* [jubeat](doc/jbhook/README.md)
|
||||||
* jubeat (`jb-01.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
* jubeat (`jb-01.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
||||||
* jubeat ripples (`jb-02.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
* jubeat ripples (`jb-02.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
||||||
@@ -84,19 +85,42 @@ The following games are supported with their corresponding hook-libraries.
|
|||||||
* SOUND VOLTEX Vivid Wave (`sdvx-05-to-06`): sdvxhook2
|
* SOUND VOLTEX Vivid Wave (`sdvx-05-to-06`): sdvxhook2
|
||||||
* SOUND VOLTEX EXCEED GEAR (`sdvx-05-to-06`): sdvxhook2
|
* SOUND VOLTEX EXCEED GEAR (`sdvx-05-to-06`): sdvxhook2
|
||||||
|
|
||||||
## ViGEm clients: Expose BT5 APIs as XBOX game controllers
|
## Auxiliary tooling
|
||||||
Play your favorite non-bemani arcade games with any hardware, e.g. real cabinet hardware, that
|
* Bootstrapping
|
||||||
implements BT5 APIs.
|
* [inject](doc/inject.md): Inject arbitrary hooking libraries into a target application process.
|
||||||
|
* [launcher](doc/launcher.md): Bootstrap Konami's AVS environment and launch a target application with arbitrary
|
||||||
|
injected hooking libraries.
|
||||||
|
* Beatmnia IIDX Ezusb IO board
|
||||||
|
* [ezusb-iidx-fpga-flash](doc/tools/ezusb-iidx-fpga-flash.md): Flash a binary blob with FPGA firmware to a target
|
||||||
|
ezusb FX IO board
|
||||||
|
* [ezusb-iidx-sram-flash](doc/tools/ezusb-iidx-sram-flash.md): Flash a binary blob with SRAM contents to a target
|
||||||
|
ezusb FX2 IO board
|
||||||
|
* Exit hooks: Exit the game with a button combination using native cabinet inputs
|
||||||
|
* [iidx-ezusb-exit-hook](doc/tools/iidx-ezusb-exit-hook.md): For IIDX with ezusb IO
|
||||||
|
* [iidx-bio2-exit-hook](doc/tools/iidx-bio2-exit-hook.md): For IIDX with BIO2 IO
|
||||||
|
* [iidx-ezusb2-exit-hook](doc/tools/iidx-ezusb-exit-hook.md): For IIDX with ezusb FX2 IO
|
||||||
|
* Bemanitools API testing: Tools for testing bemanitools API implementations
|
||||||
|
* [eamiotest](doc/tools/eamiotest.md): For [eamio API](doc/api.md#eamuse-readers)
|
||||||
|
* [iidxiotest](doc/tools/iidxiotest.md): For [iidxio API](doc/api.md#io-boards)
|
||||||
|
* [jbiotest](doc/tools/jbiotest.md): For [jbio API](doc/api.md#io-boards)
|
||||||
|
* [aciotest](doc/tools/aciotest.md): Command line tool to quickly test ACIO devices
|
||||||
|
* config: UI input/output configuration tool when using the default bemanitools API (geninput)
|
||||||
|
* ir-beat-patch-9/10: Patch the IR beat phase on IIDX 9 and 10
|
||||||
|
* [mempatch-hook](doc/tools/mempatch-hook.md): Patch raw memory locations in the target process based on the provided
|
||||||
|
configuration
|
||||||
|
* [pcbidgen](doc/tools/pcbidgen.md): Konami PCBID generator tool
|
||||||
|
* [ViGEm clients](doc/vigem/README.md): Expose BT5 APIs as XBOX game controllers to play any games with real cabinet
|
||||||
|
hardware.
|
||||||
|
|
||||||
See the dedicated [readme](doc/vigem/README.md) for details.
|
## Pre-requisites
|
||||||
|
|
||||||
## Supported platforms
|
### Supported platforms
|
||||||
Our main platforms are currently Windows XP and Windows 7 which are also the target platforms on the original hardware
|
Our main platforms are currently Windows XP and Windows 7 which are also the target platforms on the original hardware
|
||||||
of those games. However, as it gets more difficult to get and maintain hardware comptible with Windows XP, this might
|
of those games. However, as it gets more difficult to get and maintain hardware comptible with Windows XP, this might
|
||||||
change in the future. Many games also run on very recent Windows 10 builds but bear with us that it's hard to keep up
|
change in the future. Many games also run on very recent Windows 10 builds but bear with us that it's hard to keep up
|
||||||
with Windows updates breaking legacy software.
|
with Windows updates breaking legacy software.
|
||||||
|
|
||||||
## Distribution contents
|
### Distribution contents
|
||||||
Check the [list of supported games](#supported-games) to grab the right files for your game. BT5 also includes
|
Check the [list of supported games](#supported-games) to grab the right files for your game. BT5 also includes
|
||||||
a *tools* subpackage (tools.zip) as well as the full source code (src.zip).
|
a *tools* subpackage (tools.zip) as well as the full source code (src.zip).
|
||||||
|
|
||||||
@@ -104,15 +128,22 @@ You will find *.md files in various sub-packages that give you further instructi
|
|||||||
or FAQ. We advice you to read them as your questions and concerns might already be answered by them. If not, let us
|
or FAQ. We advice you to read them as your questions and concerns might already be answered by them. If not, let us
|
||||||
know if there is any information that you consider helpful or important to know and should be added.
|
know if there is any information that you consider helpful or important to know and should be added.
|
||||||
|
|
||||||
## Setup and dependencies
|
### Setup and dependencies
|
||||||
Most (older generation) games were developed for Windows XP Embedded but should run fine on any
|
Most (older generation) games were developed for Windows XP Embedded but should run fine on any
|
||||||
consumer version of Windows XP. Newer versions of Windows, e.g. Windows 7, 8 and 10, should be fine
|
consumer version of Windows XP. Newer versions of Windows, e.g. Windows 7, 8 and 10, should be fine
|
||||||
as well. Some hooks also include fixes required to run the games on a more recent version.
|
as well. Some hooks also include fixes required to run the games on a more recent version.
|
||||||
|
|
||||||
Depending on the game, you also need the following dependencies installed:
|
Depending on the game, you also need the following dependencies installed:
|
||||||
* DirectX 9 runtime
|
|
||||||
* Microsoft Visual C++ Redistributables 2010 **and** 2013: Depends on the game and age but both
|
* The 32-bit (x86) version of
|
||||||
should cover most if not all of the games so far
|
[Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package MFC Security Update](https://www.microsoft.com/en-sg/download/details.aspx?id=26999)
|
||||||
|
* The 32-bit (x86) and 64-bit (x64) versions of
|
||||||
|
[Microsoft Visual C++ Redistributable Packages for Visual Studio 2013](https://www.microsoft.com/en-sg/download/details.aspx?id=40784)
|
||||||
|
* The [DirectX 9 End-User Runtimes (June 2010)](https://www.microsoft.com/en-us/download/details.aspx?id=8109)
|
||||||
|
|
||||||
|
See also
|
||||||
|
[bemanitools-supplements](https://dev.s-ul.net/djhackers/bemanitools-supplement/-/blob/master/misc/win-runtime/README.md)
|
||||||
|
for files.
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
### Building
|
### Building
|
||||||
@@ -126,32 +157,7 @@ important aspects you should know before you get started with development.
|
|||||||
Please refer to the [API documentation](doc/api.md).
|
Please refer to the [API documentation](doc/api.md).
|
||||||
|
|
||||||
## Release process
|
## Release process
|
||||||
Steps for the release process:
|
Please refer to the [dedicated documentation](doc/release-process.md).
|
||||||
1. Update the corresponding section in the [changelog](CHANGELOG.md) with bullet points reflecting
|
|
||||||
major features merged into master since the previous release
|
|
||||||
1. Make sure you have the latest `master` state pulled to your local copy
|
|
||||||
1. Tag the release with the next release number which also be found at the
|
|
||||||
[top of the readme](#bemanitools-5) as it always reflects the current version beinged worked on
|
|
||||||
on the `master` branch , e.g. 5.35: `git tag 5.35`
|
|
||||||
1. Push the tag to upstream: `git push origin 5.35`
|
|
||||||
1. The [build pipeline](https://dev.s-ul.net/djhackers/bemanitools/-/pipelines) should start
|
|
||||||
automatically once the tag is pushed including the steps `build` and `upload-release`
|
|
||||||
1. Once completed successfully, the release is uploaded
|
|
||||||
1. Take the changelog of the published version and notify the pigs in the stall about it:
|
|
||||||
1. New post in thread
|
|
||||||
```
|
|
||||||
<insert version here> released: <direct link to published version>
|
|
||||||
|
|
||||||
Changelog:
|
|
||||||
<paste changelog here>
|
|
||||||
```
|
|
||||||
1. Update the OP title by bumping the version number in it
|
|
||||||
1. Update the OP post by extending it accordingly (see previous entries)
|
|
||||||
|
|
||||||
1. Bump the version number at the [top of this readme](#bemanitools-5) and add a new empty section
|
|
||||||
in the [changelog](CHANGELOG.md) with the new version number as title. Commit changes and push to
|
|
||||||
`master` branch
|
|
||||||
1. Continue developing and merging MRs until you decide its time for another release
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
Source code license is the Unlicense; you are permitted to do with this as thou wilt. For details, please refer to the
|
Source code license is the Unlicense; you are permitted to do with this as thou wilt. For details, please refer to the
|
||||||
|
|||||||
17
dist/iidx/gamestart-18-cn.bat
vendored
Normal file
17
dist/iidx/gamestart-18-cn.bat
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist d mkdir d
|
||||||
|
if not exist e mkdir e
|
||||||
|
if not exist f mkdir f
|
||||||
|
|
||||||
|
if not exist e\avs_conf mkdir e\avs_conf
|
||||||
|
if not exist e\avs_conf\CONF mkdir e\avs_conf\CONF
|
||||||
|
if not exist e\avs_conf\CONF\NVRAM mkdir e\avs_conf\CONF\NVRAM
|
||||||
|
if not exist e\avs_conf\CONF\RAW mkdir e\avs_conf\CONF\RAW
|
||||||
|
|
||||||
|
if not exist dev\nvram mkdir dev\nvram
|
||||||
|
if not exist dev\raw mkdir dev\raw
|
||||||
|
|
||||||
|
inject iidxhook4-cn.dll bm2dx.exe -D --config iidxhook-18-cn.conf %*
|
||||||
3
dist/iidx/gamestart-20-cn.bat
vendored
3
dist/iidx/gamestart-20-cn.bat
vendored
@@ -11,4 +11,7 @@ if not exist e\avs_conf\CONF mkdir e\avs_conf\CONF
|
|||||||
if not exist e\avs_conf\CONF\NVRAM mkdir e\avs_conf\CONF\NVRAM
|
if not exist e\avs_conf\CONF\NVRAM mkdir e\avs_conf\CONF\NVRAM
|
||||||
if not exist e\avs_conf\CONF\RAW mkdir e\avs_conf\CONF\RAW
|
if not exist e\avs_conf\CONF\RAW mkdir e\avs_conf\CONF\RAW
|
||||||
|
|
||||||
|
if not exist dev\nvram mkdir dev\nvram
|
||||||
|
if not exist dev\raw mkdir dev\raw
|
||||||
|
|
||||||
inject iidxhook5-cn.dll bm2dx.exe -D --config iidxhook-20-cn.conf %*
|
inject iidxhook5-cn.dll bm2dx.exe -D --config iidxhook-20-cn.conf %*
|
||||||
|
|||||||
16
dist/iidx/gamestart-29.bat
vendored
Normal file
16
dist/iidx/gamestart-29.bat
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
@echo off
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist dev mkdir dev
|
||||||
|
if not exist dev\e mkdir dev\e
|
||||||
|
if not exist dev\g mkdir dev\g
|
||||||
|
if not exist dev\nvram mkdir dev\nvram
|
||||||
|
if not exist dev\raw mkdir dev\raw
|
||||||
|
if not exist dev\raw\log mkdir dev\raw\log
|
||||||
|
if not exist dev\raw\fscache mkdir dev\raw\fscache
|
||||||
|
|
||||||
|
for /R prop\defaults %%D in (*.*) do (
|
||||||
|
if not exist dev\nvram\%%~nxD copy /y prop\defaults\%%~nxD dev\nvram
|
||||||
|
)
|
||||||
|
|
||||||
|
launcher -H 134217728 -B iidxhook9.dll bm2dx.dll --config iidxhook-29.conf %*
|
||||||
47
dist/iidx/iidx-irbeat-patch-09.bat
vendored
47
dist/iidx/iidx-irbeat-patch-09.bat
vendored
@@ -1,12 +1,45 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
IF "%1"=="" GOTO USAGE
|
REM Open menu if no arguments specified
|
||||||
|
if "%~1" == "" goto menu
|
||||||
|
|
||||||
iidx-irbeat-patch.exe 9 %1 e\\settings.bin.0
|
if "%~1" gtr "3" goto badbeat
|
||||||
iidx-irbeat-patch.exe 9 %1 f\\settings.bin.1
|
if "%~1" == "0" goto badbeat
|
||||||
GOTO END
|
|
||||||
|
|
||||||
:USAGE
|
set beat = "%~1" - 1
|
||||||
ECHO "Usage: iidx-irbeat-patch.bat <beat phase>"
|
iidx-irbeat-patch.exe 9 %beat% e\\settings.bin.0
|
||||||
|
iidx-irbeat-patch.exe 9 %beat% f\\settings.bin.1
|
||||||
|
|
||||||
|
if not errorlevel 0 goto error
|
||||||
|
echo Beat phase patched sucessfully
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:menu
|
||||||
|
echo Select beat phase:
|
||||||
|
echo 1 - beat#1
|
||||||
|
echo 2 - beat#2
|
||||||
|
echo 3 - beat#3
|
||||||
|
|
||||||
|
choice /n /c:123
|
||||||
|
set /a beat = %errorlevel% - 1
|
||||||
|
|
||||||
|
echo.
|
||||||
|
iidx-irbeat-patch.exe 9 %beat% e\\settings.bin.0
|
||||||
|
iidx-irbeat-patch.exe 9 %beat% f\\settings.bin.1
|
||||||
|
echo.
|
||||||
|
|
||||||
|
if not errorlevel 0 goto error
|
||||||
|
echo Beat phase patched sucessfully
|
||||||
|
timeout 5
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:error
|
||||||
|
echo Something has gone wrong with the patching process, have you run the game at least once?
|
||||||
|
pause
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:badbeat
|
||||||
|
echo Invalid beat phase specified, values are 1 to 3.
|
||||||
|
exit /b
|
||||||
|
|
||||||
:END
|
|
||||||
|
|||||||
47
dist/iidx/iidx-irbeat-patch-10.bat
vendored
47
dist/iidx/iidx-irbeat-patch-10.bat
vendored
@@ -1,12 +1,45 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
IF "%1"=="" GOTO USAGE
|
REM Open menu if no arguments specified
|
||||||
|
if "%~1" == "" goto menu
|
||||||
|
|
||||||
iidx-irbeat-patch.exe 10 %1 e\\settings.bin.0
|
if %~1 gtr 3 goto badbeat
|
||||||
iidx-irbeat-patch.exe 10 %1 f\\settings.bin.1
|
if %~1 == 0 goto badbeat
|
||||||
GOTO END
|
|
||||||
|
|
||||||
:USAGE
|
set /a beat = %~1 - 1
|
||||||
ECHO "Usage: iidx-irbeat-patch.bat <beat phase>"
|
iidx-irbeat-patch.exe 9 %beat% e\\settings.bin.0
|
||||||
|
iidx-irbeat-patch.exe 9 %beat% f\\settings.bin.1
|
||||||
|
|
||||||
|
if not errorlevel 0 goto error
|
||||||
|
echo Beat phase patched sucessfully
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:menu
|
||||||
|
echo Select beat phase:
|
||||||
|
echo 1 - beat#1
|
||||||
|
echo 2 - beat#2
|
||||||
|
echo 3 - beat#3
|
||||||
|
|
||||||
|
choice /n /c:123
|
||||||
|
set /a beat = %errorlevel% - 1
|
||||||
|
|
||||||
|
echo.
|
||||||
|
iidx-irbeat-patch.exe 10 %beat% e\\settings.bin.0
|
||||||
|
iidx-irbeat-patch.exe 10 %beat% f\\settings.bin.1
|
||||||
|
echo.
|
||||||
|
|
||||||
|
if not errorlevel 0 goto error
|
||||||
|
echo Beat phase patched sucessfully
|
||||||
|
timeout 5
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:error
|
||||||
|
echo Something has gone wrong with the patching process, have you run the game at least once?
|
||||||
|
pause
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:badbeat
|
||||||
|
echo Invalid beat phase specified, values are 1 to 3.
|
||||||
|
exit /b
|
||||||
|
|
||||||
:END
|
|
||||||
|
|||||||
13
dist/iidx/iidxhook-09.conf
vendored
13
dist/iidx/iidxhook-09.conf
vendored
@@ -46,17 +46,26 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Enable monitoring of ezusb.dll calls by logging call traces. Only works on 9th and 10th style!
|
||||||
|
ezusb.api_call_monitoring=false
|
||||||
|
|
||||||
|
# Set the type of ezusb IO board. 0 = C02, 1 = D01. Note: Impacts security settings!
|
||||||
|
ezusb.io_board_type=0
|
||||||
|
|
||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
# Stub calls to rteffect.dll (10th to DistorteD)
|
# Stub calls to rteffect.dll (10th to DistorteD)
|
||||||
misc.rteffect_stub=false
|
misc.rteffect_stub=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
# Security boot version (e.g. GEC02).
|
||||||
sec.boot_version=GEC02
|
sec.boot_version=GEC02
|
||||||
|
|
||||||
# Security boot seeds for ezusb, format: X:X:X where X is a number of 0-9 (e.g. 0:0:0).
|
# Security boot seeds for ezusb, format: X:X:X where X is a number of 0-9 (e.g. 0:0:0).
|
||||||
sec.boot_seeds=0:0:0
|
sec.boot_seeds=0:0:0
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GEC02JAA).
|
||||||
sec.black_plug_mcode=GQC02JAA
|
sec.black_plug_mcode=GEC02JAA
|
||||||
9
dist/iidx/iidxhook-10.conf
vendored
9
dist/iidx/iidxhook-10.conf
vendored
@@ -46,12 +46,21 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Enable monitoring of ezusb.dll calls by logging call traces. Only works on 9th and 10th style!
|
||||||
|
ezusb.api_call_monitoring=false
|
||||||
|
|
||||||
|
# Set the type of ezusb IO board. 0 = C02, 1 = D01. Note: Impacts security settings!
|
||||||
|
ezusb.io_board_type=1
|
||||||
|
|
||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
# Stub calls to rteffect.dll (10th to DistorteD)
|
# Stub calls to rteffect.dll (10th to DistorteD)
|
||||||
misc.rteffect_stub=false
|
misc.rteffect_stub=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
# Security boot version (e.g. GEC02).
|
||||||
sec.boot_version=GEC02
|
sec.boot_version=GEC02
|
||||||
|
|
||||||
|
|||||||
9
dist/iidx/iidxhook-11.conf
vendored
9
dist/iidx/iidxhook-11.conf
vendored
@@ -46,12 +46,21 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Enable monitoring of ezusb.dll calls by logging call traces. Only works on 9th and 10th style!
|
||||||
|
ezusb.api_call_monitoring=false
|
||||||
|
|
||||||
|
# Set the type of ezusb IO board. 0 = C02, 1 = D01. Note: Impacts security settings!
|
||||||
|
ezusb.io_board_type=1
|
||||||
|
|
||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
# Stub calls to rteffect.dll (10th to DistorteD)
|
# Stub calls to rteffect.dll (10th to DistorteD)
|
||||||
misc.rteffect_stub=false
|
misc.rteffect_stub=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
# Security boot version (e.g. GEC02).
|
||||||
sec.boot_version=GEC02
|
sec.boot_version=GEC02
|
||||||
|
|
||||||
|
|||||||
9
dist/iidx/iidxhook-12.conf
vendored
9
dist/iidx/iidxhook-12.conf
vendored
@@ -46,6 +46,12 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Enable monitoring of ezusb.dll calls by logging call traces. Only works on 9th and 10th style!
|
||||||
|
ezusb.api_call_monitoring=false
|
||||||
|
|
||||||
|
# Set the type of ezusb IO board. 0 = C02, 1 = D01. Note: Impacts security settings!
|
||||||
|
ezusb.io_board_type=1
|
||||||
|
|
||||||
# Fix broken 3D background on Happy Sky's music select (if appearing completely white)
|
# Fix broken 3D background on Happy Sky's music select (if appearing completely white)
|
||||||
misc.happy_sky_ms_bg_fix=false
|
misc.happy_sky_ms_bg_fix=false
|
||||||
|
|
||||||
@@ -55,6 +61,9 @@ misc.disable_clock_set=false
|
|||||||
# Stub calls to rteffect.dll (10th to DistorteD)
|
# Stub calls to rteffect.dll (10th to DistorteD)
|
||||||
misc.rteffect_stub=false
|
misc.rteffect_stub=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
# Security boot version (e.g. GEC02).
|
||||||
sec.boot_version=GEC02
|
sec.boot_version=GEC02
|
||||||
|
|
||||||
|
|||||||
9
dist/iidx/iidxhook-13.conf
vendored
9
dist/iidx/iidxhook-13.conf
vendored
@@ -46,6 +46,12 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Enable monitoring of ezusb.dll calls by logging call traces. Only works on 9th and 10th style!
|
||||||
|
ezusb.api_call_monitoring=false
|
||||||
|
|
||||||
|
# Set the type of ezusb IO board. 0 = C02, 1 = D01. Note: Impacts security settings!
|
||||||
|
ezusb.io_board_type=1
|
||||||
|
|
||||||
# Fix broken 3D background on DistorteD's music select (if appearing completely black)
|
# Fix broken 3D background on DistorteD's music select (if appearing completely black)
|
||||||
misc.distorted_ms_bg_fix=false
|
misc.distorted_ms_bg_fix=false
|
||||||
|
|
||||||
@@ -55,6 +61,9 @@ misc.disable_clock_set=false
|
|||||||
# Stub calls to rteffect.dll (10th to DistorteD)
|
# Stub calls to rteffect.dll (10th to DistorteD)
|
||||||
misc.rteffect_stub=false
|
misc.rteffect_stub=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
# Security boot version (e.g. GEC02).
|
||||||
sec.boot_version=GEC02
|
sec.boot_version=GEC02
|
||||||
|
|
||||||
|
|||||||
3
dist/iidx/iidxhook-14.conf
vendored
3
dist/iidx/iidxhook-14.conf
vendored
@@ -46,5 +46,8 @@ gfx.device_adapter=-1
|
|||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQGLDJAA
|
sec.black_plug_mcode=GQGLDJAA
|
||||||
3
dist/iidx/iidxhook-15.conf
vendored
3
dist/iidx/iidxhook-15.conf
vendored
@@ -46,5 +46,8 @@ gfx.device_adapter=-1
|
|||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQHDDJAA
|
sec.black_plug_mcode=GQHDDJAA
|
||||||
3
dist/iidx/iidxhook-16.conf
vendored
3
dist/iidx/iidxhook-16.conf
vendored
@@ -49,5 +49,8 @@ gfx.device_adapter=-1
|
|||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQI00JAA
|
sec.black_plug_mcode=GQI00JAA
|
||||||
3
dist/iidx/iidxhook-17.conf
vendored
3
dist/iidx/iidxhook-17.conf
vendored
@@ -49,5 +49,8 @@ gfx.device_adapter=-1
|
|||||||
# Disable operator clock setting system clock time
|
# Disable operator clock setting system clock time
|
||||||
misc.disable_clock_set=false
|
misc.disable_clock_set=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GCJDJJAA
|
sec.black_plug_mcode=GCJDJJAA
|
||||||
53
dist/iidx/iidxhook-18-cn.conf
vendored
Normal file
53
dist/iidx/iidxhook-18-cn.conf
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# Fix stretched BG videos on newer GPUs. Might appear on Red and newer
|
||||||
|
gfx.bgvideo_uv_fix=false
|
||||||
|
|
||||||
|
# Run the game in a framed window (requires windowed option)
|
||||||
|
gfx.framed=false
|
||||||
|
|
||||||
|
# Software limit the frame rate of the rendering loop in hz, e.g. 60 or 59.95 (0.0 = no software limit)
|
||||||
|
gfx.frame_rate_limit=0.0
|
||||||
|
|
||||||
|
# Enable/disable software monitor check/auto timebase or set a pre-determined refresh value. -1 disables this feature. 0 enables auto detecting the current refresh rate on startup. Setting any positive value > 0 allows you to set a pre-determined refresh rate (e.g. retrieved from the monitor check on newer IIDX games). Either the auto detected value or pre-determined value is used to patch any chart files in-memory to fix song synchronization issues. Requires constant refresh rate!!!
|
||||||
|
gfx.monitor_check=-1.000000
|
||||||
|
|
||||||
|
# Patch the GPU device ID detection (leave empty to disable), format XXXX:YYYY, two 4 digit hex numbers (vid:pid). Examples: 1002:7146 (RV515, Radeon X1300), 1002:95C5 (RV620 LE, Radeon HD3450)
|
||||||
|
gfx.pci_id=1002:7146
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
|
|
||||||
|
# Windowed width, 0 for default size
|
||||||
|
gfx.window_width=0
|
||||||
|
|
||||||
|
# Windowed height, 0 for default size
|
||||||
|
gfx.window_height=0
|
||||||
|
|
||||||
|
# Up-/downscale the back buffer's width. This does not change the game's rendering resolution but scales the final frame. Use this to target the native resolution of your monitor/TV, e.g. to avoid over-/underscan, bad image quality or latency caused by the monitors internal upscaler. 0 to disable this feature. Must be set in combination with the corresponding height parameter.
|
||||||
|
gfx.scale_back_buffer_width=0
|
||||||
|
|
||||||
|
# Up-/downscale the back buffer's height. This does not change the game's rendering resolution but scales the final frame. Use this to target the native resolution of your monitor/TV, e.g. to avoid over-/underscan, bad image quality or latency caused by the monitors internal upscaler. 0 to disable this feature. Must be set in combination with the corresponding width parameter.
|
||||||
|
gfx.scale_back_buffer_height=0
|
||||||
|
|
||||||
|
# Filter type to use for up-/downscaling the back buffer. Only used if scaling feature was enabled by setting the scaling width and height parameters. Available types: none, linear, point (refer to D3DTEXTUREFILTERTYPE for explanation).
|
||||||
|
gfx.scale_back_buffer_filter=none
|
||||||
|
|
||||||
|
# Forced refresh rate, -1 to not force any (try 59 or 60 if monitor check fails to lock on high refresh rate monitors)
|
||||||
|
gfx.forced_refresh_rate=-1
|
||||||
|
|
||||||
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Fix diagonal tearing with video cards other than Radeon X1300 and HD3450
|
||||||
|
gfx.diagonal_tearing_fix=false
|
||||||
|
|
||||||
|
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
||||||
|
io.disable_io_emu=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
|
sec.black_plug_mcode=GKJDZCAA
|
||||||
8
dist/iidx/iidxhook-18.conf
vendored
8
dist/iidx/iidxhook-18.conf
vendored
@@ -37,8 +37,14 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Fix diagonal tearing with video cards other than Radeon X1300 and HD3450
|
||||||
|
gfx.diagonal_tearing_fix=false
|
||||||
|
|
||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted/wavepass readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted/wavepass readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
||||||
io.disable_io_emu=false
|
io.disable_io_emu=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
11
dist/iidx/iidxhook-19.conf
vendored
11
dist/iidx/iidxhook-19.conf
vendored
@@ -7,6 +7,9 @@ gfx.framed=false
|
|||||||
# Software limit the frame rate of the rendering loop in hz, e.g. 60 or 59.95 (0.0 = no software limit)
|
# Software limit the frame rate of the rendering loop in hz, e.g. 60 or 59.95 (0.0 = no software limit)
|
||||||
gfx.frame_rate_limit=0.0
|
gfx.frame_rate_limit=0.0
|
||||||
|
|
||||||
|
# Enable/disable software monitor check/auto timebase or set a pre-determined refresh value. -1 disables this feature. 0 enables auto detecting the current refresh rate on startup. Setting any positive value > 0 allows you to set a pre-determined refresh rate (e.g. retrieved from the monitor check on newer IIDX games). Either the auto detected value or pre-determined value is used to patch any chart files in-memory to fix song synchronization issues. Requires constant refresh rate!!!
|
||||||
|
gfx.monitor_check=-1.000000
|
||||||
|
|
||||||
# Patch the GPU device ID detection (leave empty to disable), format XXXX:YYYY, two 4 digit hex numbers (vid:pid). Examples: 1002:7146 (RV515, Radeon X1300), 1002:95C5 (RV620 LE, Radeon HD3450)
|
# Patch the GPU device ID detection (leave empty to disable), format XXXX:YYYY, two 4 digit hex numbers (vid:pid). Examples: 1002:7146 (RV515, Radeon X1300), 1002:95C5 (RV620 LE, Radeon HD3450)
|
||||||
gfx.pci_id=1002:7146
|
gfx.pci_id=1002:7146
|
||||||
|
|
||||||
@@ -34,8 +37,14 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Fix diagonal tearing with video cards other than Radeon X1300 and HD3450
|
||||||
|
gfx.diagonal_tearing_fix=false
|
||||||
|
|
||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted/wavepass readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted/wavepass readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
||||||
io.disable_io_emu=false
|
io.disable_io_emu=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
6
dist/iidx/iidxhook-20-cn.conf
vendored
6
dist/iidx/iidxhook-20-cn.conf
vendored
@@ -37,8 +37,14 @@ gfx.forced_refresh_rate=-1
|
|||||||
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
# D3D9 device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
gfx.device_adapter=-1
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Fix diagonal tearing with video cards other than Radeon X1300 and HD3450
|
||||||
|
gfx.diagonal_tearing_fix=false
|
||||||
|
|
||||||
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
# Disable ezusb IO emulation and enable usage of real ezusb1/2 IO hardware
|
||||||
io.disable_io_emu=false
|
io.disable_io_emu=false
|
||||||
|
|
||||||
|
# Path to store the settings, e.g. bookkeeping, operator settings. d:, e: and f: drive configuration/settings data
|
||||||
|
misc.settings_path=.\
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GKJDZCAA
|
sec.black_plug_mcode=GKJDZCAA
|
||||||
|
|||||||
2
dist/iidx/iidxhook-25.conf
vendored
2
dist/iidx/iidxhook-25.conf
vendored
@@ -43,7 +43,7 @@ cam.device_id1=
|
|||||||
# Override camera device ID 2 detection (copy from device manager, do not escape)
|
# Override camera device ID 2 detection (copy from device manager, do not escape)
|
||||||
cam.device_id2=
|
cam.device_id2=
|
||||||
|
|
||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM0 (for games supporting slotted readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
||||||
|
|||||||
2
dist/iidx/iidxhook-26.conf
vendored
2
dist/iidx/iidxhook-26.conf
vendored
@@ -43,7 +43,7 @@ cam.device_id1=
|
|||||||
# Override camera device ID 2 detection (copy from device manager, do not escape)
|
# Override camera device ID 2 detection (copy from device manager, do not escape)
|
||||||
cam.device_id2=
|
cam.device_id2=
|
||||||
|
|
||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM0 (for games supporting slotted readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
||||||
|
|||||||
4
dist/iidx/iidxhook-27.conf
vendored
4
dist/iidx/iidxhook-27.conf
vendored
@@ -1,4 +1,4 @@
|
|||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM0 (for games supporting slotted readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
||||||
@@ -11,7 +11,7 @@ io.disable_poll_limiter=false
|
|||||||
io.lightning_mode=false
|
io.lightning_mode=false
|
||||||
|
|
||||||
# Disable camera connection
|
# Disable camera connection
|
||||||
io.disable_cams=false
|
io.disable_cams=true
|
||||||
|
|
||||||
# Disables the built in file hooks, requiring manual file creation
|
# Disables the built in file hooks, requiring manual file creation
|
||||||
io.disable_file_hooks=false
|
io.disable_file_hooks=false
|
||||||
|
|||||||
2
dist/iidx/iidxhook-28.conf
vendored
2
dist/iidx/iidxhook-28.conf
vendored
@@ -1,4 +1,4 @@
|
|||||||
# Disable card reader emulation and enable usage of real card reader hardware on COM0 (for games supporting slotted readers)
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted readers)
|
||||||
io.disable_card_reader_emu=false
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
||||||
|
|||||||
78
dist/iidx/iidxhook-29.conf
vendored
Normal file
78
dist/iidx/iidxhook-29.conf
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Disable card reader emulation and enable usage of real card reader hardware on COM1 (for games supporting slotted readers)
|
||||||
|
io.disable_card_reader_emu=false
|
||||||
|
|
||||||
|
# Disable BIO2 emulation and enable usage of real BIO2 hardware
|
||||||
|
io.disable_bio2_emu=false
|
||||||
|
|
||||||
|
# Disables the poll limiter, warning very high CPU usage may arise
|
||||||
|
io.disable_poll_limiter=false
|
||||||
|
|
||||||
|
# Lightning cab mode (requires additional IO emulation)
|
||||||
|
io.lightning_mode=false
|
||||||
|
|
||||||
|
# Disable camera connection
|
||||||
|
io.disable_cams=true
|
||||||
|
|
||||||
|
# Disables the built in file hooks, requiring manual file creation
|
||||||
|
io.disable_file_hooks=false
|
||||||
|
|
||||||
|
# Turntable sensitivity multiplier (1.0 is default)
|
||||||
|
io.tt_multiplier=1.0
|
||||||
|
|
||||||
|
# Disables the camera emulation
|
||||||
|
cam.disable_emu=true
|
||||||
|
|
||||||
|
# Override camera device ID detection (copy from device manager, do not escape)
|
||||||
|
cam.device_id1=
|
||||||
|
|
||||||
|
# Override camera device ID detection (copy from device manager, do not escape)
|
||||||
|
cam.device_id2=
|
||||||
|
|
||||||
|
# Run the game in a framed window (requires windowed option)
|
||||||
|
gfx.framed=true
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
|
|
||||||
|
# Confine mouse cursor to window
|
||||||
|
gfx.confined=false
|
||||||
|
|
||||||
|
# Windowed width, -1 for default size
|
||||||
|
gfx.window_width=-1
|
||||||
|
|
||||||
|
# Windowed height, -1 for default size
|
||||||
|
gfx.window_height=-1
|
||||||
|
|
||||||
|
# Windowed X, -1 for default X position
|
||||||
|
gfx.window_x=-1
|
||||||
|
|
||||||
|
# Windowed Y, -1 for default Y position
|
||||||
|
gfx.window_y=-1
|
||||||
|
|
||||||
|
# Forced refresh rate, -1 to not force any (try 59 or 60 if monitor check fails to lock on high refresh rate monitors)
|
||||||
|
gfx.forced_refresh_rate=-1
|
||||||
|
|
||||||
|
# D3D9ex device adapter (monitor), -1 to use default, 0, 1, 2 etc. to use specified adapter
|
||||||
|
gfx.device_adapter=-1
|
||||||
|
|
||||||
|
# Orientation to force monitor into, -1 to use default, 0, 1, 2, 3 to do 0, 90, 180, 270 degrees
|
||||||
|
gfx.force_orientation=-1
|
||||||
|
|
||||||
|
# Force a screen resolution (width), -1 to disable. Use this if the game does not auto detect your monitor's resolution properly, e.g. 1368x768 instead of 1280x720.
|
||||||
|
gfx.force_screen_res.width=-1
|
||||||
|
|
||||||
|
# Force a screen resolution (height), -1 to disable. Use this if the game does not auto detect your monitor's resolution properly, e.g. 1368x768 instead of 1280x720.
|
||||||
|
gfx.force_screen_res.height=-1
|
||||||
|
|
||||||
|
# IP of adapter to force override with
|
||||||
|
adapter.override_ip=
|
||||||
|
|
||||||
|
# Force ASIO audio mode/device (if applicable / TDJ default)
|
||||||
|
asio.force_asio=false
|
||||||
|
|
||||||
|
# Force WASAPI audio mode (if applicable / LDJ default)
|
||||||
|
asio.force_wasapi=true
|
||||||
|
|
||||||
|
# The ASIO device name to use
|
||||||
|
asio.device_name=XONAR SOUND CARD(64)
|
||||||
|
|
||||||
1
dist/popn/config.bat
vendored
Normal file
1
dist/popn/config.bat
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@start config.exe pnm
|
||||||
27
doc/api.md
27
doc/api.md
@@ -1,4 +1,5 @@
|
|||||||
# Bemanitools API
|
# Bemanitools API
|
||||||
|
|
||||||
Bemanitools introduces interfaces abstracting the IO hardware of many games. This is used to implement support for
|
Bemanitools introduces interfaces abstracting the IO hardware of many games. This is used to implement support for
|
||||||
non-intended IO devices from simple keyboard support, standard gamecontrollers to custom IO boards or using real
|
non-intended IO devices from simple keyboard support, standard gamecontrollers to custom IO boards or using real
|
||||||
hardware with the games (e.g. support for real legacy hardware).
|
hardware with the games (e.g. support for real legacy hardware).
|
||||||
@@ -12,6 +13,9 @@ If you want to write an implementation for your own custom piece of hardware, ch
|
|||||||
sub-folder) in the source code (src.zip).
|
sub-folder) in the source code (src.zip).
|
||||||
|
|
||||||
## Implementations
|
## Implementations
|
||||||
|
|
||||||
|
### IO boards
|
||||||
|
|
||||||
The following implementations are already shipped with BT5.
|
The following implementations are already shipped with BT5.
|
||||||
|
|
||||||
* BeatStream
|
* BeatStream
|
||||||
@@ -34,10 +38,33 @@ The following implementations are already shipped with BT5.
|
|||||||
* [sdvxio-bio2.dll](sdvxhook/sdvxio-bio2.md): BIO2 driver
|
* [sdvxio-bio2.dll](sdvxhook/sdvxio-bio2.md): BIO2 driver
|
||||||
* [sdvxio-kfca.dll](sdvxhook/sdvxio-kfca.md): KFCA IO board driver
|
* [sdvxio-kfca.dll](sdvxhook/sdvxio-kfca.md): KFCA IO board driver
|
||||||
|
|
||||||
|
### Eamuse readers
|
||||||
|
|
||||||
Eamuse hardware support is implemented separately:
|
Eamuse hardware support is implemented separately:
|
||||||
|
|
||||||
* eamio.dll (default): Keyboard and joystick input
|
* eamio.dll (default): Keyboard and joystick input
|
||||||
|
* eamio-icca.dll: Slotted/wave pass readers, required for old games with magnetic stripe cards
|
||||||
|
|
||||||
|
#### ICCA readers for IIDX and port config in device manager
|
||||||
|
|
||||||
|
The COM port for the card readers needs to be configured correctly in device manager. Otherwise,
|
||||||
|
communication with the readers will fail if the settings do not align with how the game or
|
||||||
|
bemanitools wants to operate them.
|
||||||
|
|
||||||
|
Use built-in ports on your mainboard if available but an external USB to serial port dongle also
|
||||||
|
works.
|
||||||
|
|
||||||
|
* Assign `COM1` to the COM port the card readers are connected to.
|
||||||
|
* Ensure that the following settings for the COM port you are going to use are
|
||||||
|
set
|
||||||
|
* BAUD rate 57600
|
||||||
|
* Data bits 8
|
||||||
|
* Parity None
|
||||||
|
* Stop bits 1
|
||||||
|
* Flow control None.
|
||||||
|
|
||||||
## Development notes
|
## Development notes
|
||||||
|
|
||||||
A DEF file for geninput.dll is included. To convert the DEF into an import library suitable for use with Visual C++, run
|
A DEF file for geninput.dll is included. To convert the DEF into an import library suitable for use with Visual C++, run
|
||||||
```
|
```
|
||||||
lib /machine:i386 /def:geninput.def
|
lib /machine:i386 /def:geninput.def
|
||||||
|
|||||||
@@ -127,6 +127,15 @@ TODO go into some more detail about some differences in the hook modules, e.g. 1
|
|||||||
* Font patching for Japanese chars
|
* Font patching for Japanese chars
|
||||||
* Filesystem patches to detour E and F backup drives for settings
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook4-cn (18 CN)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full security emulation with SRAM and round plugs
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
#### iidxhook5 (19)
|
#### iidxhook5 (19)
|
||||||
* Ezusb IO2 I/O emulation
|
* Ezusb IO2 I/O emulation
|
||||||
* Setupapi emulation
|
* Setupapi emulation
|
||||||
@@ -136,6 +145,15 @@ TODO go into some more detail about some differences in the hook modules, e.g. 1
|
|||||||
* Font patching for Japanese chars
|
* Font patching for Japanese chars
|
||||||
* Filesystem patches to detour E and F backup drives for settings
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook5-cn (20 CN)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full security emulation with SRAM and round plugs
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
#### iidxhook6 (20)
|
#### iidxhook6 (20)
|
||||||
* Ezusb IO2 I/O emulation
|
* Ezusb IO2 I/O emulation
|
||||||
* Setupapi emulation
|
* Setupapi emulation
|
||||||
|
|||||||
@@ -47,3 +47,7 @@ IO hardware you want to use:
|
|||||||
game controllers
|
game controllers
|
||||||
* ddrio-mm: Support Minimaid custom interface
|
* ddrio-mm: Support Minimaid custom interface
|
||||||
* [ddrio-smx](ddrhook/ddrio-smx.md): Support for StepManiaX dance platforms
|
* [ddrio-smx](ddrhook/ddrio-smx.md): Support for StepManiaX dance platforms
|
||||||
|
|
||||||
|
## Unicorntail
|
||||||
|
|
||||||
|
[Instructions how to run on Chimera PCBs](unicorntail.md).
|
||||||
|
|||||||
@@ -17,6 +17,73 @@ different versions. See different distribution packages, e.g. `ddr-12.zip`,
|
|||||||
Depending on the game version, earlier versions are bootstrapped using
|
Depending on the game version, earlier versions are bootstrapped using
|
||||||
[inject](../inject.md) while later versions require [launcher](../launcher.md).
|
[inject](../inject.md) while later versions require [launcher](../launcher.md).
|
||||||
|
|
||||||
|
## Setup A20+
|
||||||
|
|
||||||
|
### Data and folder structure
|
||||||
|
|
||||||
|
The following assumes you are using vanilla and unpacked/decrypted data. Copy/unpack the data
|
||||||
|
to a destination of your choice. Expect to have the following root folder structure:
|
||||||
|
|
||||||
|
```
|
||||||
|
arkdata
|
||||||
|
com
|
||||||
|
data
|
||||||
|
dev
|
||||||
|
modules
|
||||||
|
prop
|
||||||
|
```
|
||||||
|
|
||||||
|
* Copy the contents of `modules` to the root folder that the dll-files are next to the folders
|
||||||
|
`arkdata`, `com`, etc.
|
||||||
|
* Unpack the contents of `ddr-14-to-16.zip` to the root folder. `luncher.exe` should be located
|
||||||
|
next to `arkdata`, `com` and all the dll-files
|
||||||
|
|
||||||
|
#### Configuring eamuse settings
|
||||||
|
|
||||||
|
You need to create a `prop/ea3-config.xml` configuration file which provides properties for
|
||||||
|
connecting to a network of your choice (and allows the game to boot).
|
||||||
|
|
||||||
|
Take the `prop/eamuse.xml` as a base and make a copy of it called `prop/ea3-config.xml`.
|
||||||
|
|
||||||
|
Add the software identifier as a child to the `<ea3>` parent node:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<soft>
|
||||||
|
<model __type="str">MDX</model>
|
||||||
|
<dest __type="str">J</dest>
|
||||||
|
<spec __type="str">A</spec>
|
||||||
|
<rev __type="str">A</rev>
|
||||||
|
<ext __type="str">2022020200</ext>
|
||||||
|
</soft>
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace the identifiers according to the version you are using.
|
||||||
|
|
||||||
|
Add your PCBID as a child to the `<ea3>` parent node:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<id>
|
||||||
|
<pcbid __type="str">00010203040506070809</pcbid>
|
||||||
|
<hardid __type="str">00010203040506070809</hardid>
|
||||||
|
</id>
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace the values accordingly with your actual PCBID registered with your target network.
|
||||||
|
|
||||||
|
Add network settings (note this might already exist, replace existing or delete old one) as a child
|
||||||
|
to the `<ea3>` parent node:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<network>
|
||||||
|
<sz_xrpc_buf __type="u32">102400</sz_xrpc_buf>
|
||||||
|
<ssl __type="bool">0</ssl>
|
||||||
|
<services>http://eamuse.konami.fun/service/services/services/</services>
|
||||||
|
</network>
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace the properties accordingly with the settings provided by your network provider, e.g. the
|
||||||
|
URL, further settings like ssl etc.
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
Run `gamestart-XX.bat`, where `XX` corresponds to the version of the game you
|
Run `gamestart-XX.bat`, where `XX` corresponds to the version of the game you
|
||||||
@@ -70,6 +137,9 @@ Run the following commands either from a command line (`cmd.exe`) or from
|
|||||||
* Register `regsvr32 D:\MDX\contents\k-clvsd.dll`
|
* Register `regsvr32 D:\MDX\contents\k-clvsd.dll`
|
||||||
* Register `regsvr32 D:\MDX\contents\xactengine2_10.dll`
|
* Register `regsvr32 D:\MDX\contents\xactengine2_10.dll`
|
||||||
|
|
||||||
|
The `gamestart-XX.bat` scripts should already take care of this by executing the listed commands
|
||||||
|
when launched.
|
||||||
|
|
||||||
Note: The one that comes with IIDX will hang DDR at startup. The opposite is not true:
|
Note: The one that comes with IIDX will hang DDR at startup. The opposite is not true:
|
||||||
IIDX works just fine with this CLVSD.
|
IIDX works just fine with this CLVSD.
|
||||||
|
|
||||||
|
|||||||
45
doc/ddrhook/unicorntail.md
Normal file
45
doc/ddrhook/unicorntail.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Unicorntail
|
||||||
|
|
||||||
|
Unicorntail is a hook library to run the DDR games on a hybrid type of hardware referred to as a
|
||||||
|
"Chimera" or "Unicorn". Compared to a "Dragon", which refers to the official stock hardware by
|
||||||
|
Konami, a Chimera mixes the P3IO board from a PCB used with GF&DM V4-V8, Jubeat, Jubeat Ripples or
|
||||||
|
Jubeat Knit with the motherboard from a GF&DM XG, XG2 or XG3 PCB, or a Reflec Beat PCB.
|
||||||
|
|
||||||
|
Actual build instructions for such hardware are out of scope here.
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Dragon PCBs are hard to come by compared to finding the parts for a Chimera PCB.
|
||||||
|
|
||||||
|
A Chimera PCB however is different in many aspects to the Dragon PCB and requires the use of the
|
||||||
|
`unicorntail.dll` hook library.
|
||||||
|
|
||||||
|
The Dragon's P3IO has two serial ports that the regular P3IOs do not, and one of these serial ports
|
||||||
|
is used to communicate with the card readers. Note that these are actual serial ports driven
|
||||||
|
directly by the P3IO microcontroller, these are NOT just passed through to the motherboard like the
|
||||||
|
proprietary COM1 and COM2 connectors. Unicorn Tail intercepts serial port IO commands being sent to
|
||||||
|
the P3IO and redirects them to COM2 instead, since COM2 is unused on SD cabinets (on HD cabinets it
|
||||||
|
connects to a second ACIO bus which drives the extra lighting glitz like the light spikes and maybe
|
||||||
|
the LED strip).
|
||||||
|
|
||||||
|
## Drivers
|
||||||
|
|
||||||
|
You need the P3IO driver installed on your target system. These can be acquired from an actual stock
|
||||||
|
HDD or grabbed from
|
||||||
|
[bemanitools-supplements](https://dev.s-ul.net/djhackers/bemanitools-supplement/-/blob/master/gfdm/p3io/README.md).
|
||||||
|
|
||||||
|
## Setup and run
|
||||||
|
|
||||||
|
Edit the `gamestart.bat` file that you are using and append `unicorntail.dll` to the list of hooks,
|
||||||
|
e.g.:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
launcher.exe -H 33554432 -K unicorntail.dll arkmdxp3.dll %*
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to use any ddrhook library in addition, you have to have the hooks in the right order
|
||||||
|
to make everything work correctly, e.g.:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
launcher.exe -H 33554432 -K unicorntail.dll -K ddrhook2.dll arkmdxp3.dll %*
|
||||||
|
```
|
||||||
289
doc/dev/journal/2023-04-03-d01-ezusb-io-boot-security.md
Normal file
289
doc/dev/journal/2023-04-03-d01-ezusb-io-boot-security.md
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
# Beatmania IIDX 10th Style - D01 IO boot code and security init
|
||||||
|
|
||||||
|
Date: 2023-04-03
|
||||||
|
Author: icex2
|
||||||
|
|
||||||
|
Documenting decompiled and reverse engineered code snippets from the D01 JAE `bm2dx.exe`. These
|
||||||
|
helped me figuring out the two different security boot modes the game supports.
|
||||||
|
|
||||||
|
In summary, it supports booting with the C02 IO with a C02 black dongle and a D01 IO board with
|
||||||
|
a D01 dongle. No other combination is valid because they didn't make sense back then. You either
|
||||||
|
had an upgraded old style/twinkle cabinet to C02 (GEC02) or you bought a new dedicated cabinet
|
||||||
|
(GQD01). With 10th style supporting the old C02 dongle, it appears that all owners of a C02 cabinet
|
||||||
|
with IO board and C02 dongle received a free software update/HDD. This might make sense considering
|
||||||
|
the short life span of C02 and the game being super buggy, especially in earlier/initial revisions.
|
||||||
|
|
||||||
|
The game expects the following "configurations" from bemanitools:
|
||||||
|
|
||||||
|
* Booting as upgraded C02 with free D01 upgrade
|
||||||
|
* `sec.boot_version=GEC02 `
|
||||||
|
* `sec.boot_seeds=0:0:1`
|
||||||
|
* `sec.black_plug_mcode=GEC02JAA`
|
||||||
|
* "D01 IO pin" on IO board not active
|
||||||
|
* Booting as dedicated
|
||||||
|
* `sec.boot_version=GEC02 `
|
||||||
|
* `sec.boot_seeds=0:1:1`
|
||||||
|
* `sec.black_plug_mcode=GQD01JAA`
|
||||||
|
* "D01 IO pin" on IO board ACTIVE
|
||||||
|
|
||||||
|
All the above was derived from reading and understanding the documented code excerpts below.
|
||||||
|
|
||||||
|
## io_boot - sub_402700
|
||||||
|
|
||||||
|
Called as the first step in the boot statemachine by the "boot" function `sub_40F9C0`.
|
||||||
|
|
||||||
|
```c
|
||||||
|
// sub_402700
|
||||||
|
int __stdcall io_boot(int a1)
|
||||||
|
{
|
||||||
|
DWORD (__stdcall *timeGetTime)(); // esi
|
||||||
|
int usb_boot_security_res; // ebp
|
||||||
|
DWORD time_start; // ebx
|
||||||
|
int io_boot_state; // edi
|
||||||
|
DWORD now; // esi
|
||||||
|
BOOL is_d01_boot_mode; // esi
|
||||||
|
BOOL v7; // esi
|
||||||
|
int result; // eax
|
||||||
|
int v9; // [esp+10h] [ebp-2Ch]
|
||||||
|
int firmware_version; // [esp+14h] [ebp-28h]
|
||||||
|
int io_pad_read; // [esp+18h] [ebp-24h] BYREF
|
||||||
|
char v12[32]; // [esp+1Ch] [ebp-20h] BYREF
|
||||||
|
|
||||||
|
dword_4D0768 = 0;
|
||||||
|
strcpy(byte_4D076C, &byte_4D0858);
|
||||||
|
timeGetTime = ::timeGetTime;
|
||||||
|
v9 = 0;
|
||||||
|
usb_boot_security_res = io_pad_read;
|
||||||
|
time_start = ::timeGetTime();
|
||||||
|
io_boot_state = 0;
|
||||||
|
while ( 2 )
|
||||||
|
{
|
||||||
|
switch ( io_boot_state )
|
||||||
|
{
|
||||||
|
case 0: // "start io", firmware download and wait for reconnect
|
||||||
|
if ( usbStart(0) )
|
||||||
|
{
|
||||||
|
if ( time_exceeded(time_start, 20000) )
|
||||||
|
set_io_error_type(1, aErrorUsbioStar);// ERROR(USBIO START)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
io_boot_state = 1;
|
||||||
|
}
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
case 1: // check firmware
|
||||||
|
firmware_version = usbFirmResult();
|
||||||
|
if ( firmware_version == 96 )
|
||||||
|
{
|
||||||
|
if ( time_exceeded(time_start, 25000) )
|
||||||
|
set_io_error_type(1, aErrorFm); // ERROR(FM), FM = firmware
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
io_boot_state = 2;
|
||||||
|
}
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
case 2:
|
||||||
|
if ( !firmware_version )
|
||||||
|
{
|
||||||
|
usbMute(1);
|
||||||
|
time_start = timeGetTime();
|
||||||
|
now = timeGetTime();
|
||||||
|
io_input_is_d01_ezusb = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
usbPadRead(&io_pad_read);
|
||||||
|
if ( (io_pad_read & 0x10) != 0 )
|
||||||
|
io_input_is_d01_ezusb = 1;
|
||||||
|
}
|
||||||
|
while ( !time_exceeded(now, 2000) );
|
||||||
|
io_boot_state = 3;
|
||||||
|
reset_io_boot_state_label:
|
||||||
|
timeGetTime = ::timeGetTime;
|
||||||
|
if ( io_boot_state != v9 )
|
||||||
|
{
|
||||||
|
v9 = io_boot_state;
|
||||||
|
time_start = ::timeGetTime();
|
||||||
|
}
|
||||||
|
continue; // retry
|
||||||
|
}
|
||||||
|
if ( firmware_version > 128 )
|
||||||
|
{
|
||||||
|
if ( firmware_version == 254 )
|
||||||
|
{
|
||||||
|
set_io_error_type(1, aErrorFmTrnsOut);// ERROR(FM TRNS-OUT)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ( firmware_version == 255 )
|
||||||
|
{
|
||||||
|
set_io_error_type(1, aErrorFmTimeOut);// ERROR(FM TIME-OUT)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch ( firmware_version )
|
||||||
|
{
|
||||||
|
case 128:
|
||||||
|
set_io_error_type(1, aErrorFmReadErr);// ERROR(FM READ-ERR)
|
||||||
|
return 1;
|
||||||
|
case -113:
|
||||||
|
set_io_error_type(1, aErrorFmDlErr);// ERROR(FM DL-ERR)
|
||||||
|
return 1;
|
||||||
|
case -33:
|
||||||
|
set_io_error_type(1, aErrorFmCmprReq);// ERROR(FM CMPR-REQ)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UNKNOWN_ERROR_LABEL:
|
||||||
|
set_io_error_type(1, aErrorUnknown); // ERROR(UNKNOWN)
|
||||||
|
return 1;
|
||||||
|
case 3:
|
||||||
|
if ( io_init_security() )
|
||||||
|
{
|
||||||
|
set_io_error_type(1, aErrorSqInit); // ERROR(SQ-INIT)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
io_boot_state = 4;
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
case 4:
|
||||||
|
is_d01_boot_mode = io_input_is_d01_ezusb != 0;
|
||||||
|
if ( !strncmp(black_dongle_mcode, MCODE_GED01, 5u) )
|
||||||
|
is_d01_boot_mode = 1;
|
||||||
|
usb_boot_security_res = usbBootSecurity(aGec02, 0, is_d01_boot_mode, 1);
|
||||||
|
if ( usb_boot_security_res == 96 )
|
||||||
|
{
|
||||||
|
if ( time_exceeded(time_start, 20000) )
|
||||||
|
set_io_error_type(1, aErrorBtSqInit);// ERROR(BT-SQ-INIT)'
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
io_boot_state = 5;
|
||||||
|
}
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
case 5:
|
||||||
|
if ( usb_boot_security_res )
|
||||||
|
{
|
||||||
|
switch ( usb_boot_security_res )
|
||||||
|
{
|
||||||
|
case 0xFFFFFE9F:
|
||||||
|
set_io_error_type(1, aErrorSecurityE);// ERROR(SECURITY EEP)
|
||||||
|
result = 1;
|
||||||
|
break;
|
||||||
|
case 0xFFFFFECF:
|
||||||
|
case 0xFFFFFEDF:
|
||||||
|
set_io_error_type(1, aErrorSecurityI);// ERROR(SECURITY ID or EEP)
|
||||||
|
result = 1;
|
||||||
|
break;
|
||||||
|
case 0xFFFFFEEF:
|
||||||
|
set_io_error_type(1, aErrorSecurityN);// 'ERROR(SECURITY No Match)'
|
||||||
|
result = 1;
|
||||||
|
break;
|
||||||
|
case 0xFFFFFEFF:
|
||||||
|
io_boot_state = 6;
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
default:
|
||||||
|
goto UNKNOWN_ERROR_LABEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Sleep(0x3E8u);
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
case 6: // security conversion/upgrading security dongles
|
||||||
|
v7 = io_input_is_d01_ezusb != 0;
|
||||||
|
if ( !usbGetSecurityKey(v12) )
|
||||||
|
{
|
||||||
|
if ( usbSetupSecurityComplete(v12, 0, v7, 1) )
|
||||||
|
set_io_error_type(1, aErrorSecurityC);// ERROR(SECURITY CONVERSION FAILED)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
set_io_error_type(1, aErrorSecurityC); // ERROR(SECURITY CONVERSION FAILED)
|
||||||
|
goto reset_io_boot_state_label;
|
||||||
|
default:
|
||||||
|
goto UNKNOWN_ERROR_LABEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## io_init_security - sub_402BB0
|
||||||
|
|
||||||
|
Sub-function of the [io_boot](#io_boot---sub_402700) function.
|
||||||
|
|
||||||
|
```c
|
||||||
|
// sub_402BB0
|
||||||
|
int io_init_security()
|
||||||
|
{
|
||||||
|
int v0; // esi
|
||||||
|
int v2; // esi
|
||||||
|
int mcode_mismatch_cnt; // esi
|
||||||
|
char white_dongle_data_maybe[10]; // [esp+Ch] [ebp-20h] BYREF
|
||||||
|
|
||||||
|
usbSecurityInit();
|
||||||
|
v0 = 0;
|
||||||
|
while ( usbSecurityInitDone() )
|
||||||
|
{
|
||||||
|
if ( v0 > 1200 )
|
||||||
|
{
|
||||||
|
set_io_error_type(-1, aNgSi);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
++v0;
|
||||||
|
Sleep(16u);
|
||||||
|
}
|
||||||
|
pcbid = 0;
|
||||||
|
dword_4D0754 = 0;
|
||||||
|
word_4D0758 = 0;
|
||||||
|
while ( usbGetPCBID(&pcbid) )
|
||||||
|
Sleep(1u);
|
||||||
|
*(_DWORD *)black_dongle_mcode = 0;
|
||||||
|
v2 = 0;
|
||||||
|
*(_DWORD *)&black_dongle_mcode[4] = 0;
|
||||||
|
while ( usbGetSecurity(black_dongle_mcode) ) // black_dongle_mcode = GQD01JAA
|
||||||
|
{
|
||||||
|
if ( v2 > 1200 )
|
||||||
|
{
|
||||||
|
set_io_error_type(-1, aNgPd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
++v2;
|
||||||
|
Sleep(16u);
|
||||||
|
}
|
||||||
|
set_cabinet_type(black_dongle_mcode[6]);
|
||||||
|
mcode_mismatch_cnt = black_dongle_mcode[0] != 'G';
|
||||||
|
if ( io_input_is_d01_ezusb || !strncmp(black_dongle_mcode, MCODE_GED01, 5u) )// Path for using the D01 dongle with D01 IO board
|
||||||
|
{
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[2] != (char)MCODE_D01 )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[3] != SBYTE1(MCODE_D01) )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[4] != SBYTE2(MCODE_D01) )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
}
|
||||||
|
else // Path for using the C02 dongle with C02 IO board
|
||||||
|
{
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[2] != MCODE_C02[0] )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[3] != MCODE_C02[1] )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( (unsigned __int8)black_dongle_mcode[4] != MCODE_C02[2] )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( !usbGetSecurityKey(white_dongle_data_maybe) )
|
||||||
|
{
|
||||||
|
black_dongle_mcode[6] = white_dongle_data_maybe[6];
|
||||||
|
set_cabinet_type(white_dongle_data_maybe[6]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( black_dongle_mcode[5] != 'J' )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( black_dongle_mcode[6] != 'A' && black_dongle_mcode[6] != 'B' && black_dongle_mcode[6] != 'C' )
|
||||||
|
++mcode_mismatch_cnt;
|
||||||
|
if ( !mcode_mismatch_cnt )
|
||||||
|
return 0;
|
||||||
|
set_io_error_type(-1, aNgSecurity);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -51,6 +51,10 @@ make
|
|||||||
|
|
||||||
All output is located in the *build* folder including the final *bemanitools.zip* package.
|
All output is located in the *build* folder including the final *bemanitools.zip* package.
|
||||||
|
|
||||||
|
Note about using `-j n` option on make: This is currently considered broken/unreliable. Expect to
|
||||||
|
run into odd issues like randomly changing unresolved dependency errors. If you attempted this,
|
||||||
|
run a `make clean` before running `make` again.
|
||||||
|
|
||||||
### Release building
|
### Release building
|
||||||
A release build is a clean build including code formatting and testing. This can be executed by running the following
|
A release build is a clean build including code formatting and testing. This can be executed by running the following
|
||||||
command:
|
command:
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ games:
|
|||||||
* [iidxhook2](iidxhook2.md): DistorteD
|
* [iidxhook2](iidxhook2.md): DistorteD
|
||||||
* [iidxhook3](iidxhook3.md): GOLD, DJ TROOPERS, EMPRESS, SIRIUS
|
* [iidxhook3](iidxhook3.md): GOLD, DJ TROOPERS, EMPRESS, SIRIUS
|
||||||
* [iidxhook4](iidxhook4.md): Resort Anthem
|
* [iidxhook4](iidxhook4.md): Resort Anthem
|
||||||
|
* [iidxhook4-cn](iidxhook4-cn.md): Resort Anthem CN (狂热节拍 IIDX)
|
||||||
* [iidxhook5](iidxhook5.md): Lincle
|
* [iidxhook5](iidxhook5.md): Lincle
|
||||||
* [iidxhook5-cn](iidxhook5-cn.md): tricoro CN (狂热节拍 IIDX 2)
|
* [iidxhook5-cn](iidxhook5-cn.md): tricoro CN (狂热节拍 IIDX 2)
|
||||||
* [iidxhook6](iidxhook6.md): Tricoro
|
* [iidxhook6](iidxhook6.md): Tricoro
|
||||||
|
|||||||
@@ -214,3 +214,12 @@ If one or multiple of these issues apply, use the built in scaling options by se
|
|||||||
to scale to. Usually, you want to set this to the monitor's native resolution, e.g.
|
to scale to. Usually, you want to set this to the monitor's native resolution, e.g.
|
||||||
1920x1080 for full HD. You can play around with a few different filters using
|
1920x1080 for full HD. You can play around with a few different filters using
|
||||||
*gfx.scale_back_buffer_filter* which impacts image quality/blurriness on upscaling.
|
*gfx.scale_back_buffer_filter* which impacts image quality/blurriness on upscaling.
|
||||||
|
|
||||||
|
## DJTroopers crashes on boot
|
||||||
|
The stock game is buggy and cannot create default backup data correctly. This
|
||||||
|
can be fixed by using existing backup data from a stock drive or by using
|
||||||
|
the pre-generated backup data for the `e:\` and `f:\` drives provided by
|
||||||
|
[bemanitools-supplement](https://github.com/djhackersdev/bemanitools-supplement/tree/master/iidx/15#default-backup-data).
|
||||||
|
|
||||||
|
Copy those files to your target location that you have configured to store this
|
||||||
|
data, e.g. local `e\` and `f\` folders or the target `e:\` and `f:\` volumes.
|
||||||
13
doc/iidxhook/iidxhook4-cn.md
Normal file
13
doc/iidxhook/iidxhook4-cn.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Game list
|
||||||
|
|
||||||
|
The following games are compatible with this version of iidxhook:
|
||||||
|
* Resort Anthem CN (狂热节拍 IIDX)
|
||||||
|
|
||||||
|
The games must be bootstrapped using [inject.exe](../inject.md).
|
||||||
|
|
||||||
|
# Remarks
|
||||||
|
|
||||||
|
Resort Anthem CN (狂热节拍 IIDX):
|
||||||
|
|
||||||
|
* Does not have NETWORK function
|
||||||
|
* Game doesn't used card readers
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
The following games are compatible with this version of iidxhook:
|
The following games are compatible with this version of iidxhook:
|
||||||
* Heroic Verse
|
* Heroic Verse
|
||||||
* BISTROVER
|
* BISTROVER
|
||||||
|
* CASTHOUR
|
||||||
|
|
||||||
The games must be bootstrapped using [launcher](../launcher.md).
|
The games must be bootstrapped using [launcher](../launcher.md).
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# popnhook
|
# popnhook
|
||||||
|
|
||||||
popnhook is a collection of hook libraries for jubeat providing
|
popnhook is a collection of hook libraries for pop'n music providing
|
||||||
emulation and various patches to run these games on non BemaniPC hardware and
|
emulation and various patches to run these games on non BemaniPC hardware and
|
||||||
newer Windows versions.
|
newer Windows versions.
|
||||||
|
|
||||||
|
|||||||
29
doc/release-process.md
Normal file
29
doc/release-process.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Release process
|
||||||
|
|
||||||
|
For bemanitools maintainers, steps for the release process:
|
||||||
|
|
||||||
|
1. Update the corresponding section in the [changelog](CHANGELOG.md) with bullet points reflecting
|
||||||
|
major features merged into master since the previous release
|
||||||
|
1. Make sure you have the latest `master` state pulled to your local copy
|
||||||
|
1. Tag the release with the next release number which also be found at the
|
||||||
|
[top of the readme](#bemanitools-5) as it always reflects the current version beinged worked on
|
||||||
|
on the `master` branch , e.g. 5.35: `git tag 5.35`
|
||||||
|
1. Push the tag to upstream: `git push origin 5.35`
|
||||||
|
1. The [build pipeline](https://dev.s-ul.net/djhackers/bemanitools/-/pipelines) should start
|
||||||
|
automatically once the tag is pushed including the steps `build` and `upload-release`
|
||||||
|
1. Once completed successfully, the release is uploaded
|
||||||
|
1. Take the changelog of the published version and notify the pigs in the stall about it:
|
||||||
|
1. New post in thread
|
||||||
|
```
|
||||||
|
<insert version here> released: <direct link to published version>
|
||||||
|
|
||||||
|
Changelog:
|
||||||
|
<paste changelog here>
|
||||||
|
```
|
||||||
|
1. Update the OP title by bumping the version number in it
|
||||||
|
1. Update the OP post by extending it accordingly (see previous entries)
|
||||||
|
|
||||||
|
1. Bump the version number at the [top of this readme](#bemanitools-5) and add a new empty section
|
||||||
|
in the [changelog](CHANGELOG.md) with the new version number as title. Commit changes and push to
|
||||||
|
`master` branch
|
||||||
|
1. Continue developing and merging MRs until you decide its time for another release
|
||||||
@@ -231,6 +231,7 @@ void property_node_datasize(struct property_node *node);
|
|||||||
bool std_getenv(const char *key, char *val, uint32_t nbytes);
|
bool std_getenv(const char *key, char *val, uint32_t nbytes);
|
||||||
void std_setenv(const char *key, const char *val);
|
void std_setenv(const char *key, const char *val);
|
||||||
|
|
||||||
|
void* avs_fs_open(const char* path, int mode, int flags);
|
||||||
int avs_fs_addfs(void *filesys_struct);
|
int avs_fs_addfs(void *filesys_struct);
|
||||||
int avs_fs_mount(
|
int avs_fs_mount(
|
||||||
const char *mountpoint, const char *fsroot, const char *fstype, void *data);
|
const char *mountpoint, const char *fsroot, const char *fstype, void *data);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ EXPORTS
|
|||||||
property_destroy @247 NONAME
|
property_destroy @247 NONAME
|
||||||
property_insert_read @255 NONAME
|
property_insert_read @255 NONAME
|
||||||
property_node_create @266 NONAME
|
property_node_create @266 NONAME
|
||||||
|
property_node_datasize @267 NONAME
|
||||||
property_node_refer @278 NONAME
|
property_node_refer @278 NONAME
|
||||||
property_node_remove @279 NONAME
|
property_node_remove @279 NONAME
|
||||||
property_psmap_import @288 NONAME
|
property_psmap_import @288 NONAME
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ LIBRARY libavs-win32
|
|||||||
|
|
||||||
EXPORTS
|
EXPORTS
|
||||||
avs_boot @237 NONAME
|
avs_boot @237 NONAME
|
||||||
|
avs_fs_open @178 NONAME
|
||||||
avs_net_ctrl @15 NONAME
|
avs_net_ctrl @15 NONAME
|
||||||
avs_shutdown @333 NONAME
|
avs_shutdown @333 NONAME
|
||||||
avs_thread_create @183 NONAME
|
avs_thread_create @183 NONAME
|
||||||
@@ -25,4 +26,4 @@ EXPORTS
|
|||||||
property_read_query_memsize @100 NONAME
|
property_read_query_memsize @100 NONAME
|
||||||
property_search @244 NONAME
|
property_search @244 NONAME
|
||||||
std_getenv @226 NONAME
|
std_getenv @226 NONAME
|
||||||
std_setenv @114 NONAME
|
std_setenv @114 NONAME
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
#define AC_IO_CMD_PANB_START_AUTO_INPUT 0x0115
|
#define AC_IO_CMD_PANB_START_AUTO_INPUT 0x0115
|
||||||
|
|
||||||
#define AC_IO_PANB_NUM_NODES 4
|
#define AC_IO_PANB_NUM_NODES 4
|
||||||
#define AC_IO_PANB_MAX_KEYS (7*AC_IO_PANB_NUM_NODES)
|
#define AC_IO_PANB_MAX_KEYS (7 * AC_IO_PANB_NUM_NODES)
|
||||||
#define AC_IO_PANB_MAX_KEYPAIRS (AC_IO_PANB_MAX_KEYS/2)
|
#define AC_IO_PANB_MAX_KEYPAIRS (AC_IO_PANB_MAX_KEYS / 2)
|
||||||
|
|
||||||
struct ac_io_panb_keypair {
|
struct ac_io_panb_keypair {
|
||||||
uint8_t key2 : 4;
|
uint8_t key2 : 4;
|
||||||
@@ -38,5 +38,4 @@ struct ac_io_panb_poll_out {
|
|||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
#include "aciodrv/device.h"
|
#include "aciodrv/device.h"
|
||||||
#include "aciodrv/panb.h"
|
#include "aciodrv/panb.h"
|
||||||
|
|
||||||
#include "util/thread.h"
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
#include "util/thread.h"
|
||||||
|
|
||||||
static int auto_poll_proc(void *auto_poll_param);
|
static int auto_poll_proc(void *auto_poll_param);
|
||||||
static int auto_poll_threadid;
|
static int auto_poll_threadid;
|
||||||
@@ -17,59 +17,60 @@ static struct ac_io_panb_keypair _keypair[AC_IO_PANB_MAX_KEYPAIRS];
|
|||||||
static CRITICAL_SECTION auto_poll_stop_lock;
|
static CRITICAL_SECTION auto_poll_stop_lock;
|
||||||
static bool auto_poll_stop;
|
static bool auto_poll_stop;
|
||||||
|
|
||||||
static int auto_poll_proc(void * param)
|
static int auto_poll_proc(void *param)
|
||||||
{
|
{
|
||||||
struct aciodrv_device_ctx * device = (struct aciodrv_device_ctx *) param;
|
struct aciodrv_device_ctx *device = (struct aciodrv_device_ctx *) param;
|
||||||
struct ac_io_panb_poll_in poll_in;
|
struct ac_io_panb_poll_in poll_in;
|
||||||
bool stop;
|
bool stop;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
aciodrv_panb_recv_poll(device, &poll_in);
|
aciodrv_panb_recv_poll(device, &poll_in);
|
||||||
|
|
||||||
EnterCriticalSection(&keypair_lock);
|
EnterCriticalSection(&keypair_lock);
|
||||||
memcpy(_keypair, poll_in.keypair, AC_IO_PANB_MAX_KEYPAIRS);
|
memcpy(_keypair, poll_in.keypair, AC_IO_PANB_MAX_KEYPAIRS);
|
||||||
LeaveCriticalSection(&keypair_lock);
|
LeaveCriticalSection(&keypair_lock);
|
||||||
|
|
||||||
EnterCriticalSection(&auto_poll_stop_lock);
|
EnterCriticalSection(&auto_poll_stop_lock);
|
||||||
stop = auto_poll_stop;
|
stop = auto_poll_stop;
|
||||||
LeaveCriticalSection(&auto_poll_stop_lock);
|
LeaveCriticalSection(&auto_poll_stop_lock);
|
||||||
} while (!stop);
|
} while (!stop);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device)
|
bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device)
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
|
|
||||||
if (!aciodrv_panb_start_auto_input(device, 0, AC_IO_PANB_NUM_NODES)) {
|
if (!aciodrv_panb_start_auto_input(device, 0, AC_IO_PANB_NUM_NODES)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto_poll_stop = false;
|
auto_poll_stop = false;
|
||||||
InitializeCriticalSection(&keypair_lock);
|
InitializeCriticalSection(&keypair_lock);
|
||||||
InitializeCriticalSection(&auto_poll_stop_lock);
|
InitializeCriticalSection(&auto_poll_stop_lock);
|
||||||
auto_poll_threadid = thread_create(auto_poll_proc, (void *)device, 0x4000, 0);
|
auto_poll_threadid =
|
||||||
|
thread_create(auto_poll_proc, (void *) device, 0x4000, 0);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_proc_panb_get_state(uint8_t *button_state)
|
bool aciodrv_proc_panb_get_state(uint8_t *button_state)
|
||||||
{
|
{
|
||||||
struct ac_io_panb_keypair keypair[AC_IO_PANB_MAX_KEYPAIRS];
|
struct ac_io_panb_keypair keypair[AC_IO_PANB_MAX_KEYPAIRS];
|
||||||
|
|
||||||
EnterCriticalSection(&keypair_lock);
|
EnterCriticalSection(&keypair_lock);
|
||||||
memcpy(keypair, _keypair, AC_IO_PANB_MAX_KEYPAIRS);
|
memcpy(keypair, _keypair, AC_IO_PANB_MAX_KEYPAIRS);
|
||||||
LeaveCriticalSection(&keypair_lock);
|
LeaveCriticalSection(&keypair_lock);
|
||||||
|
|
||||||
/* splice the keypairs into separate button values */
|
/* splice the keypairs into separate button values */
|
||||||
for (int i=0; i<AC_IO_PANB_MAX_KEYPAIRS; i++) {
|
for (int i = 0; i < AC_IO_PANB_MAX_KEYPAIRS; i++) {
|
||||||
uint8_t but1 = keypair[i].key1;
|
uint8_t but1 = keypair[i].key1;
|
||||||
uint8_t but2 = keypair[i].key2;
|
uint8_t but2 = keypair[i].key2;
|
||||||
button_state[2*i] = but1;
|
button_state[2 * i] = but1;
|
||||||
button_state[2*i+1] = but2;
|
button_state[2 * i + 1] = but2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,13 +79,13 @@ void aciodrv_proc_panb_fini(struct aciodrv_device_ctx *device)
|
|||||||
EnterCriticalSection(&auto_poll_stop_lock);
|
EnterCriticalSection(&auto_poll_stop_lock);
|
||||||
auto_poll_stop = true;
|
auto_poll_stop = true;
|
||||||
LeaveCriticalSection(&auto_poll_stop_lock);
|
LeaveCriticalSection(&auto_poll_stop_lock);
|
||||||
|
|
||||||
thread_join(auto_poll_threadid, NULL);
|
thread_join(auto_poll_threadid, NULL);
|
||||||
thread_destroy(auto_poll_threadid);
|
thread_destroy(auto_poll_threadid);
|
||||||
|
|
||||||
DeleteCriticalSection(&keypair_lock);
|
DeleteCriticalSection(&keypair_lock);
|
||||||
DeleteCriticalSection(&auto_poll_stop_lock);
|
DeleteCriticalSection(&auto_poll_stop_lock);
|
||||||
|
|
||||||
/* reset is the only way to disable the auto polling on device side */
|
/* reset is the only way to disable the auto polling on device side */
|
||||||
aciodrv_device_reset(device);
|
aciodrv_device_reset(device);
|
||||||
}
|
}
|
||||||
@@ -4,14 +4,15 @@
|
|||||||
#include "aciodrv/panb.h"
|
#include "aciodrv/panb.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a PANB device. This will take care of setting up the auto-poll and processing
|
* Initialize a PANB device. This will take care of setting up the auto-poll and
|
||||||
* the poll messages in a separate thread (this is necessary as failing to process messages
|
* processing the poll messages in a separate thread (this is necessary as
|
||||||
* fast enough will cause the device to malfunction).
|
* failing to process messages fast enough will cause the device to
|
||||||
|
* malfunction).
|
||||||
*
|
*
|
||||||
* @param device Context of opened device
|
* @param device Context of opened device
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note This function spawns a thread. Caller must call aciodrv_proc_panb_fini to properly
|
* @note This function spawns a thread. Caller must call aciodrv_proc_panb_fini
|
||||||
* terminate.
|
* to properly terminate.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device);
|
bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device);
|
||||||
|
|
||||||
@@ -19,13 +20,15 @@ bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device);
|
|||||||
* Retrieve latest known button state from the PANB device.
|
* Retrieve latest known button state from the PANB device.
|
||||||
*
|
*
|
||||||
* @param button_state 28 cell array to store button state
|
* @param button_state 28 cell array to store button state
|
||||||
* (mandatory, upon calling the array contains values between 0 to 15 indicating the keys velocity).
|
* (mandatory, upon calling the array contains values between 0 to 15
|
||||||
|
* indicating the keys velocity).
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_proc_panb_get_state(uint8_t *button_state);
|
bool aciodrv_proc_panb_get_state(uint8_t *button_state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Properly terminate the thread and reset the device (this is the only way to stop the auto polling).
|
* Properly terminate the thread and reset the device (this is the only way to
|
||||||
|
* stop the auto polling).
|
||||||
*/
|
*/
|
||||||
void aciodrv_proc_panb_fini(struct aciodrv_device_ctx *device);
|
void aciodrv_proc_panb_fini(struct aciodrv_device_ctx *device);
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include "util/mem.h"
|
#include "util/mem.h"
|
||||||
|
|
||||||
/* Enable to dump all data to the logger */
|
/* Enable to dump all data to the logger */
|
||||||
//#define AC_IO_MSG_LOG
|
// #define AC_IO_MSG_LOG
|
||||||
|
|
||||||
#define ACIO_MAX_NODES_PER_PORT 16
|
#define ACIO_MAX_NODES_PER_PORT 16
|
||||||
|
|
||||||
@@ -87,8 +87,11 @@ static bool aciodrv_device_init(struct aciodrv_device_ctx *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AC_IO_MSG_LOG
|
#ifdef AC_IO_MSG_LOG
|
||||||
static void
|
static void aciodrv_device_log_buffer(
|
||||||
aciodrv_device_log_buffer(struct aciodrv_device_ctx *device, const char *msg, const uint8_t *buffer, int length)
|
struct aciodrv_device_ctx *device,
|
||||||
|
const char *msg,
|
||||||
|
const uint8_t *buffer,
|
||||||
|
int length)
|
||||||
{
|
{
|
||||||
char str[4096];
|
char str[4096];
|
||||||
|
|
||||||
@@ -97,7 +100,8 @@ aciodrv_device_log_buffer(struct aciodrv_device_ctx *device, const char *msg, co
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool aciodrv_device_send(struct aciodrv_device_ctx *device, const uint8_t *buffer, int length)
|
static bool aciodrv_device_send(
|
||||||
|
struct aciodrv_device_ctx *device, const uint8_t *buffer, int length)
|
||||||
{
|
{
|
||||||
uint8_t send_buf[512];
|
uint8_t send_buf[512];
|
||||||
int send_buf_pos = 0;
|
int send_buf_pos = 0;
|
||||||
@@ -138,15 +142,20 @@ static bool aciodrv_device_send(struct aciodrv_device_ctx *device, const uint8_t
|
|||||||
aciodrv_device_log_buffer(device, "Send (2)", send_buf, send_buf_pos);
|
aciodrv_device_log_buffer(device, "Send (2)", send_buf, send_buf_pos);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (aciodrv_port_write(device->fd, send_buf, send_buf_pos) != send_buf_pos) {
|
if (aciodrv_port_write(device->fd, send_buf, send_buf_pos) !=
|
||||||
log_warning("[%p] Sending data with length %d failed", device->fd, send_buf_pos);
|
send_buf_pos) {
|
||||||
|
log_warning(
|
||||||
|
"[%p] Sending data with length %d failed",
|
||||||
|
device->fd,
|
||||||
|
send_buf_pos);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aciodrv_device_receive(struct aciodrv_device_ctx *device, uint8_t *buffer, int max_resp_size)
|
static int aciodrv_device_receive(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t *buffer, int max_resp_size)
|
||||||
{
|
{
|
||||||
uint8_t recv_buf[512];
|
uint8_t recv_buf[512];
|
||||||
int recv_size = 0;
|
int recv_size = 0;
|
||||||
@@ -161,7 +170,6 @@ static int aciodrv_device_receive(struct aciodrv_device_ctx *device, uint8_t *bu
|
|||||||
read = aciodrv_port_read(device->fd, recv_buf, 1);
|
read = aciodrv_port_read(device->fd, recv_buf, 1);
|
||||||
} while (recv_buf[0] == AC_IO_SOF);
|
} while (recv_buf[0] == AC_IO_SOF);
|
||||||
|
|
||||||
|
|
||||||
if (read > 0) {
|
if (read > 0) {
|
||||||
/* recv_buf[0] is already the first byte of the message.
|
/* recv_buf[0] is already the first byte of the message.
|
||||||
now read until nothing's left */
|
now read until nothing's left */
|
||||||
@@ -189,8 +197,8 @@ static int aciodrv_device_receive(struct aciodrv_device_ctx *device, uint8_t *bu
|
|||||||
/* next byte is our real data
|
/* next byte is our real data
|
||||||
overwrite escape byte */
|
overwrite escape byte */
|
||||||
do {
|
do {
|
||||||
read = aciodrv_port_read(
|
read =
|
||||||
device->fd, recv_buf + recv_size, 1);
|
aciodrv_port_read(device->fd, recv_buf + recv_size, 1);
|
||||||
} while (read == 0);
|
} while (read == 0);
|
||||||
|
|
||||||
if (read < 0) {
|
if (read < 0) {
|
||||||
@@ -204,7 +212,8 @@ static int aciodrv_device_receive(struct aciodrv_device_ctx *device, uint8_t *bu
|
|||||||
|
|
||||||
if (recv_size > offsetof(struct ac_io_message, cmd.nbytes)) {
|
if (recv_size > offsetof(struct ac_io_message, cmd.nbytes)) {
|
||||||
// header + data + checksum
|
// header + data + checksum
|
||||||
expected_size = offsetof(struct ac_io_message, cmd.raw) + ((struct ac_io_message*)recv_buf)->cmd.nbytes + 1;
|
expected_size = offsetof(struct ac_io_message, cmd.raw) +
|
||||||
|
((struct ac_io_message *) recv_buf)->cmd.nbytes + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +224,11 @@ static int aciodrv_device_receive(struct aciodrv_device_ctx *device, uint8_t *bu
|
|||||||
|
|
||||||
/* recv_size - 1: omit checksum for checksum calc */
|
/* recv_size - 1: omit checksum for checksum calc */
|
||||||
if ((recv_size - 1) > max_resp_size) {
|
if ((recv_size - 1) > max_resp_size) {
|
||||||
log_warning("[%p] Expected %d got %d", device->fd, max_resp_size - 6, recv_buf[4]);
|
log_warning(
|
||||||
|
"[%p] Expected %d got %d",
|
||||||
|
device->fd,
|
||||||
|
max_resp_size - 6,
|
||||||
|
recv_buf[4]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < recv_size - 1; i++) {
|
for (int i = 0; i < recv_size - 1; i++) {
|
||||||
@@ -254,9 +267,7 @@ static uint8_t aciodrv_device_enum_nodes(struct aciodrv_device_ctx *device)
|
|||||||
msg.cmd.count = 0;
|
msg.cmd.count = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Enumerating nodes failed");
|
log_warning("Enumerating nodes failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -266,7 +277,10 @@ static uint8_t aciodrv_device_enum_nodes(struct aciodrv_device_ctx *device)
|
|||||||
return msg.cmd.count;
|
return msg.cmd.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool aciodrv_device_get_version(struct aciodrv_device_ctx *device, uint8_t node_id, struct aciodrv_device_node_version *version)
|
static bool aciodrv_device_get_version(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct aciodrv_device_node_version *version)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -299,7 +313,10 @@ static bool aciodrv_device_get_version(struct aciodrv_device_ctx *device, uint8_
|
|||||||
msg.cmd.version.date,
|
msg.cmd.version.date,
|
||||||
msg.cmd.version.time);
|
msg.cmd.version.time);
|
||||||
|
|
||||||
memcpy(version->product, msg.cmd.version.product_code, ACIO_NODE_PRODUCT_CODE_LEN);
|
memcpy(
|
||||||
|
version->product,
|
||||||
|
msg.cmd.version.product_code,
|
||||||
|
ACIO_NODE_PRODUCT_CODE_LEN);
|
||||||
version->type = ac_io_u32(msg.cmd.version.type);
|
version->type = ac_io_u32(msg.cmd.version.type);
|
||||||
version->major = msg.cmd.version.major;
|
version->major = msg.cmd.version.major;
|
||||||
version->minor = msg.cmd.version.minor;
|
version->minor = msg.cmd.version.minor;
|
||||||
@@ -308,7 +325,8 @@ static bool aciodrv_device_get_version(struct aciodrv_device_ctx *device, uint8_
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool aciodrv_device_start_node(struct aciodrv_device_ctx *device, uint8_t node_id)
|
static bool
|
||||||
|
aciodrv_device_start_node(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -317,9 +335,7 @@ static bool aciodrv_device_start_node(struct aciodrv_device_ctx *device, uint8_t
|
|||||||
msg.cmd.nbytes = 0;
|
msg.cmd.nbytes = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Starting node %d failed", node_id);
|
log_warning("Starting node %d failed", node_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -334,7 +350,8 @@ struct aciodrv_device_ctx *aciodrv_device_open(const char *port_path, int baud)
|
|||||||
return aciodrv_device_open_path(port_path, baud);
|
return aciodrv_device_open_path(port_path, baud);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct aciodrv_device_ctx *aciodrv_device_open_path(const char *port_path, int baud)
|
struct aciodrv_device_ctx *
|
||||||
|
aciodrv_device_open_path(const char *port_path, int baud)
|
||||||
{
|
{
|
||||||
HANDLE port = aciodrv_port_open(port_path, baud);
|
HANDLE port = aciodrv_port_open(port_path, baud);
|
||||||
|
|
||||||
@@ -342,7 +359,8 @@ struct aciodrv_device_ctx *aciodrv_device_open_path(const char *port_path, int b
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct aciodrv_device_ctx *device = xmalloc(sizeof(struct aciodrv_device_ctx));
|
struct aciodrv_device_ctx *device =
|
||||||
|
xmalloc(sizeof(struct aciodrv_device_ctx));
|
||||||
|
|
||||||
memset(device, 0, sizeof(struct aciodrv_device_ctx));
|
memset(device, 0, sizeof(struct aciodrv_device_ctx));
|
||||||
device->fd = port;
|
device->fd = port;
|
||||||
@@ -384,16 +402,23 @@ uint8_t aciodrv_device_get_node_count(struct aciodrv_device_ctx *device)
|
|||||||
return device->node_count;
|
return device->node_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx *device, uint8_t node_id, char product[ACIO_NODE_PRODUCT_CODE_LEN])
|
bool aciodrv_device_get_node_product_ident(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
char product[ACIO_NODE_PRODUCT_CODE_LEN])
|
||||||
{
|
{
|
||||||
if (device->node_count == 0 || node_id > device->node_count) {
|
if (device->node_count == 0 || node_id > device->node_count) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(product, device->node_versions[node_id].product, ACIO_NODE_PRODUCT_CODE_LEN);
|
memcpy(
|
||||||
|
product,
|
||||||
|
device->node_versions[node_id].product,
|
||||||
|
ACIO_NODE_PRODUCT_CODE_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
uint32_t aciodrv_device_get_node_product_type(struct aciodrv_device_ctx *device, uint8_t node_id)
|
uint32_t aciodrv_device_get_node_product_type(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (device->node_count == 0 || node_id > device->node_count) {
|
if (device->node_count == 0 || node_id > device->node_count) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -402,7 +427,9 @@ uint32_t aciodrv_device_get_node_product_type(struct aciodrv_device_ctx *device,
|
|||||||
return device->node_versions[node_id].type;
|
return device->node_versions[node_id].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct aciodrv_device_node_version *aciodrv_device_get_node_product_version(struct aciodrv_device_ctx *device, uint8_t node_id)
|
const struct aciodrv_device_node_version *
|
||||||
|
aciodrv_device_get_node_product_version(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (device->node_count == 0 || node_id > device->node_count) {
|
if (device->node_count == 0 || node_id > device->node_count) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -430,7 +457,10 @@ bool aciodrv_send(struct aciodrv_device_ctx *device, struct ac_io_message *msg)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_recv(struct aciodrv_device_ctx *device, struct ac_io_message *msg, int max_resp_size)
|
bool aciodrv_recv(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
struct ac_io_message *msg,
|
||||||
|
int max_resp_size)
|
||||||
{
|
{
|
||||||
#ifdef AC_IO_MSG_LOG
|
#ifdef AC_IO_MSG_LOG
|
||||||
log_info("[%p] Beginning recv: (%d b)", device->fd, max_resp_size);
|
log_info("[%p] Beginning recv: (%d b)", device->fd, max_resp_size);
|
||||||
@@ -441,7 +471,10 @@ bool aciodrv_recv(struct aciodrv_device_ctx *device, struct ac_io_message *msg,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_send_and_recv(struct aciodrv_device_ctx *device, struct ac_io_message *msg, int max_resp_size)
|
bool aciodrv_send_and_recv(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
struct ac_io_message *msg,
|
||||||
|
int max_resp_size)
|
||||||
{
|
{
|
||||||
if (!aciodrv_send(device, msg)) {
|
if (!aciodrv_send(device, msg)) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -28,11 +28,13 @@ struct aciodrv_device_node_version {
|
|||||||
*/
|
*/
|
||||||
struct aciodrv_device_ctx *aciodrv_device_open(const char *port_path, int baud)
|
struct aciodrv_device_ctx *aciodrv_device_open(const char *port_path, int baud)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__attribute__((deprecated("Use aciomgr instead if device is shareable, else aciodrv_device_open_path")))
|
__attribute__((deprecated("Use aciomgr instead if device is shareable, "
|
||||||
|
"else aciodrv_device_open_path")))
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
struct aciodrv_device_ctx *aciodrv_device_open_path(const char *port_path, int baud);
|
struct aciodrv_device_ctx *
|
||||||
|
aciodrv_device_open_path(const char *port_path, int baud);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the node count on the opened device.
|
* Get the node count on the opened device.
|
||||||
@@ -51,7 +53,10 @@ uint8_t aciodrv_device_get_node_count(struct aciodrv_device_ctx *device);
|
|||||||
* @return True on success, false on error. If True the variable product
|
* @return True on success, false on error. If True the variable product
|
||||||
* contains the identifier of the queried node.
|
* contains the identifier of the queried node.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx *device, uint8_t node_id, char product[ACIO_NODE_PRODUCT_CODE_LEN]);
|
bool aciodrv_device_get_node_product_ident(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
char product[ACIO_NODE_PRODUCT_CODE_LEN]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the product identifier of an enumerated node.
|
* Get the product identifier of an enumerated node.
|
||||||
@@ -60,7 +65,8 @@ bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx *device, ui
|
|||||||
* @param node_id Id of the node. Needs to be in range of the total node count.
|
* @param node_id Id of the node. Needs to be in range of the total node count.
|
||||||
* @return product type ID on success, or 0 on failure
|
* @return product type ID on success, or 0 on failure
|
||||||
*/
|
*/
|
||||||
uint32_t aciodrv_device_get_node_product_type(struct aciodrv_device_ctx *device, uint8_t node_id);
|
uint32_t aciodrv_device_get_node_product_type(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the product version of an enumerated node.
|
* Get the product version of an enumerated node.
|
||||||
@@ -69,7 +75,9 @@ uint32_t aciodrv_device_get_node_product_type(struct aciodrv_device_ctx *device,
|
|||||||
* @param node_id Id of the node. Needs to be in range of the total node count.
|
* @param node_id Id of the node. Needs to be in range of the total node count.
|
||||||
* @return Pointer to the version struct
|
* @return Pointer to the version struct
|
||||||
*/
|
*/
|
||||||
const struct aciodrv_device_node_version *aciodrv_device_get_node_product_version(struct aciodrv_device_ctx *device, uint8_t node_id);
|
const struct aciodrv_device_node_version *
|
||||||
|
aciodrv_device_get_node_product_version(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a message to the ACIO bus and receive an answer.
|
* Send a message to the ACIO bus and receive an answer.
|
||||||
@@ -82,7 +90,10 @@ const struct aciodrv_device_node_version *aciodrv_device_get_node_product_versio
|
|||||||
* @param resp_size Size of the expecting response.
|
* @param resp_size Size of the expecting response.
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_send_and_recv(struct aciodrv_device_ctx *device, struct ac_io_message *msg, int max_resp_size);
|
bool aciodrv_send_and_recv(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
struct ac_io_message *msg,
|
||||||
|
int max_resp_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a message to the ACIO bus.
|
* Send a message to the ACIO bus.
|
||||||
@@ -90,7 +101,8 @@ bool aciodrv_send_and_recv(struct aciodrv_device_ctx *device, struct ac_io_messa
|
|||||||
* @param device Context of opened device
|
* @param device Context of opened device
|
||||||
* @param msg Msg to send to the bus.
|
* @param msg Msg to send to the bus.
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
* @note Prefer the use of aciodrv_send_and_recv when possible. This is for commands which don't trigger a reply.
|
* @note Prefer the use of aciodrv_send_and_recv when possible. This is for
|
||||||
|
* commands which don't trigger a reply.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_send(struct aciodrv_device_ctx *device, struct ac_io_message *msg);
|
bool aciodrv_send(struct aciodrv_device_ctx *device, struct ac_io_message *msg);
|
||||||
|
|
||||||
@@ -101,9 +113,13 @@ bool aciodrv_send(struct aciodrv_device_ctx *device, struct ac_io_message *msg);
|
|||||||
* @param msg Msg to send to the bus. Make sure that the buffer
|
* @param msg Msg to send to the bus. Make sure that the buffer
|
||||||
* is big enough to receive the response.
|
* is big enough to receive the response.
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
* @note Prefer the use of aciodrv_send_and_recv when possible. This is for unsollicited incoming messages.
|
* @note Prefer the use of aciodrv_send_and_recv when possible. This is for
|
||||||
|
* unsollicited incoming messages.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_recv(struct aciodrv_device_ctx *device, struct ac_io_message *msg, int max_resp_size);
|
bool aciodrv_recv(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
struct ac_io_message *msg,
|
||||||
|
int max_resp_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset an opened device.
|
* Reset an opened device.
|
||||||
@@ -115,7 +131,7 @@ bool aciodrv_device_reset(struct aciodrv_device_ctx *device);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the previously opened ACIO device.
|
* Close the previously opened ACIO device.
|
||||||
*
|
*
|
||||||
* @param device Context of opened device
|
* @param device Context of opened device
|
||||||
*/
|
*/
|
||||||
void aciodrv_device_close(struct aciodrv_device_ctx *device);
|
void aciodrv_device_close(struct aciodrv_device_ctx *device);
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
bool aciodrv_h44b_init(
|
bool aciodrv_h44b_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
// unlike input devices like KFCA, H44B has no watchdog or special init code
|
// unlike input devices like KFCA, H44B has no watchdog or special init code
|
||||||
// requirements - shared ACIO node initialisation is enough
|
// requirements - shared ACIO node initialisation is enough
|
||||||
@@ -34,9 +32,7 @@ bool aciodrv_h44b_lights(
|
|||||||
msg.cmd.h44b_output = *lights;
|
msg.cmd.h44b_output = *lights;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Polling of node %d failed", node_id + 1);
|
log_warning("Polling of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#ifndef ACIODRV_H44B_H
|
#ifndef ACIODRV_H44B_H
|
||||||
#define ACIODRV_H44B_H
|
#define ACIODRV_H44B_H
|
||||||
|
|
||||||
#include "aciodrv/device.h"
|
|
||||||
#include "acio/h44b.h"
|
#include "acio/h44b.h"
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize an H44B node.
|
* Initialize an H44B node.
|
||||||
|
|||||||
@@ -8,8 +8,7 @@
|
|||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static bool aciodrv_icca_queue_loop_start(
|
static bool aciodrv_icca_queue_loop_start(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -21,9 +20,7 @@ static bool aciodrv_icca_queue_loop_start(
|
|||||||
msg.cmd.status = 0;
|
msg.cmd.status = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Starting queue loop failed");
|
log_warning("Starting queue loop failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -137,16 +134,14 @@ bool aciodrv_icca_read_card(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_is_slotted(
|
bool aciodrv_icca_is_slotted(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
const struct aciodrv_device_node_version *version;
|
const struct aciodrv_device_node_version *version;
|
||||||
version = aciodrv_device_get_node_product_version(device, node_id);
|
version = aciodrv_device_get_node_product_version(device, node_id);
|
||||||
|
|
||||||
// current heuristic is to check if version >= 1.5
|
// current heuristic is to check if version >= 1.5
|
||||||
if (version) {
|
if (version) {
|
||||||
if (version->major == 1) {
|
if (version->major == 1) {
|
||||||
if (version->minor >= 5) {
|
if (version->minor >= 5) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -157,8 +152,7 @@ bool aciodrv_icca_is_slotted(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_poll_felica(
|
bool aciodrv_icca_poll_felica(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
|
|||||||
@@ -74,9 +74,9 @@ bool aciodrv_icca_read_card(
|
|||||||
/**
|
/**
|
||||||
* Uses some heruistics based on the product ident to determine if the detected
|
* Uses some heruistics based on the product ident to determine if the detected
|
||||||
* device is a slotted (true) or wavepass reader (false).
|
* device is a slotted (true) or wavepass reader (false).
|
||||||
*
|
*
|
||||||
* This function will also return false if the provided node_id is invalid.
|
* This function will also return false if the provided node_id is invalid.
|
||||||
*
|
*
|
||||||
* @param device Context of opened device
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @return True on slotted, false on wavepass.
|
* @return True on slotted, false on wavepass.
|
||||||
@@ -85,18 +85,17 @@ bool aciodrv_icca_read_card(
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_is_slotted(
|
bool aciodrv_icca_is_slotted(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
uint8_t node_id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Polls the felica chip on wavepass readers. This will cause the state of the
|
* Polls the felica chip on wavepass readers. This will cause the state of the
|
||||||
* reader to be AC_IO_ICCA_STATUS_BUSY_NEW for a few polls, before returning
|
* reader to be AC_IO_ICCA_STATUS_BUSY_NEW for a few polls, before returning
|
||||||
* either: AC_IO_ICCA_STATUS_IDLE_NEW or AC_IO_ICCA_STATUS_GOT_UID.
|
* either: AC_IO_ICCA_STATUS_IDLE_NEW or AC_IO_ICCA_STATUS_GOT_UID.
|
||||||
*
|
*
|
||||||
* The user should take care to call this every so often to actually get new
|
* The user should take care to call this every so often to actually get new
|
||||||
* felica UIDs, instead of just old NFC idents. The game seems to do it every
|
* felica UIDs, instead of just old NFC idents. The game seems to do it every
|
||||||
* 5 or so polls after the last AC_IO_ICCA_STATUS_BUSY_NEW poll.
|
* 5 or so polls after the last AC_IO_ICCA_STATUS_BUSY_NEW poll.
|
||||||
*
|
*
|
||||||
* @param device Context of opened device
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
@@ -105,7 +104,6 @@ bool aciodrv_icca_is_slotted(
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_poll_felica(
|
bool aciodrv_icca_poll_felica(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
uint8_t node_id);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,9 +7,8 @@
|
|||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static bool aciodrv_kfca_watchdog_start(
|
static bool
|
||||||
struct aciodrv_device_ctx *device,
|
aciodrv_kfca_watchdog_start(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -25,11 +24,15 @@ static bool aciodrv_kfca_watchdog_start(
|
|||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 2)) {
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 2)) {
|
||||||
log_warning("Starting watchdog failed"); return false;
|
log_warning("Starting watchdog failed");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_warning("Started watchdog of node %d, sz: %d, status: %d",
|
log_warning(
|
||||||
node_id, msg.cmd.nbytes, msg.cmd.status);
|
"Started watchdog of node %d, sz: %d, status: %d",
|
||||||
|
node_id,
|
||||||
|
msg.cmd.nbytes,
|
||||||
|
msg.cmd.status);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -56,9 +59,7 @@ bool aciodrv_kfca_amp(
|
|||||||
msg.cmd.raw[3] = subwoofer;
|
msg.cmd.raw[3] = subwoofer;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Setting AMP failed");
|
log_warning("Setting AMP failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -68,9 +69,7 @@ bool aciodrv_kfca_amp(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_kfca_init(
|
bool aciodrv_kfca_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define ACIODRV_KFCA_H
|
#define ACIODRV_KFCA_H
|
||||||
|
|
||||||
#include "acio/kfca.h"
|
#include "acio/kfca.h"
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize an KFCA node.
|
* Initialize an KFCA node.
|
||||||
|
|||||||
@@ -5,10 +5,11 @@
|
|||||||
#include "aciodrv/device.h"
|
#include "aciodrv/device.h"
|
||||||
#include "aciodrv/panb.h"
|
#include "aciodrv/panb.h"
|
||||||
|
|
||||||
#include "util/thread.h"
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
#include "util/thread.h"
|
||||||
|
|
||||||
bool aciodrv_panb_start_auto_input(struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t node_count)
|
bool aciodrv_panb_start_auto_input(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t node_count)
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
@@ -33,34 +34,40 @@ bool aciodrv_panb_start_auto_input(struct aciodrv_device_ctx *device, uint8_t no
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_panb_recv_poll(struct aciodrv_device_ctx *device, struct ac_io_panb_poll_in *poll_in)
|
bool aciodrv_panb_recv_poll(
|
||||||
|
struct aciodrv_device_ctx *device, struct ac_io_panb_poll_in *poll_in)
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
struct ac_io_panb_poll_in *poll_res = (struct ac_io_panb_poll_in *) &msg.cmd.raw;
|
struct ac_io_panb_poll_in *poll_res =
|
||||||
|
(struct ac_io_panb_poll_in *) &msg.cmd.raw;
|
||||||
|
|
||||||
msg.cmd.code = ac_io_u16(AC_IO_CMD_PANB_POLL_REPLY);
|
msg.cmd.code = ac_io_u16(AC_IO_CMD_PANB_POLL_REPLY);
|
||||||
msg.cmd.nbytes = sizeof(struct ac_io_panb_poll_in);
|
msg.cmd.nbytes = sizeof(struct ac_io_panb_poll_in);
|
||||||
|
|
||||||
if (!aciodrv_recv(device,
|
if (!aciodrv_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + msg.cmd.nbytes + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + msg.cmd.nbytes + 1)) {
|
||||||
log_warning("Getting state failed");
|
log_warning("Getting state failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (poll_in != NULL){
|
if (poll_in != NULL) {
|
||||||
memcpy(poll_in, poll_res, sizeof(struct ac_io_panb_poll_in));
|
memcpy(poll_in, poll_res, sizeof(struct ac_io_panb_poll_in));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_panb_send_lamp(struct aciodrv_device_ctx *device,
|
bool aciodrv_panb_send_lamp(
|
||||||
uint8_t node_id, struct ac_io_panb_poll_out *state)
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_panb_poll_out *state)
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
/* only the first node is handling the commands */
|
/* only the first node is handling the commands */
|
||||||
if (node_id != 0) {
|
if (node_id != 0) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -11,39 +11,43 @@
|
|||||||
* @param node_count The number of nodes to poll.
|
* @param node_count The number of nodes to poll.
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note node_id should be 0, PANB internally manages the other nodes.
|
* @note node_id should be 0, PANB internally manages the other nodes.
|
||||||
* @note Upon calling, the device will stop replying to commands and just keep sending
|
* @note Upon calling, the device will stop replying to commands and just keep
|
||||||
* AC_IO_CMD_PANB_POLL_REPLY messages indefinitely. Failure to retrieve them fast enough
|
* sending AC_IO_CMD_PANB_POLL_REPLY messages indefinitely. Failure to retrieve
|
||||||
* will cause the device to malfunction. It is thus advised to make use of the aciodrv-proc
|
* them fast enough will cause the device to malfunction. It is thus advised to
|
||||||
* module to spawn a thread that will handle these messages and provide an easy access to the
|
* make use of the aciodrv-proc module to spawn a thread that will handle these
|
||||||
* latest input state.
|
|
||||||
* @note This module is supposed to be used in combination with the common
|
|
||||||
* device driver foundation.
|
|
||||||
* @see driver.h
|
|
||||||
*/
|
|
||||||
bool aciodrv_panb_start_auto_input(struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t node_count);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a AC_IO_CMD_PANB_POLL_REPLY message from a PANB device. This assumes that there
|
|
||||||
* is such message incoming (ie. that start_auto_input has been called prior).
|
|
||||||
*
|
|
||||||
* @param device Context of opened device.
|
|
||||||
* @param poll_in Buffer to hold the received message, or NULL.
|
|
||||||
* @return True if successful, false on error.
|
|
||||||
* @note node_id should be 0, PANB internally manages the other nodes.
|
|
||||||
* @note Failure to retrieve the incoming messages fast enough will cause the device to malfunction.
|
|
||||||
* It is thus advised to make use of the aciodrv-proc module to spawn a thread that will handle these
|
|
||||||
* messages and provide an easy access to the latest input state.
|
* messages and provide an easy access to the latest input state.
|
||||||
* @note This module is supposed to be used in combination with the common
|
* @note This module is supposed to be used in combination with the common
|
||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_panb_recv_poll(struct aciodrv_device_ctx *device, struct ac_io_panb_poll_in *poll_in);
|
bool aciodrv_panb_start_auto_input(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t node_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a AC_IO_CMD_PANB_POLL_REPLY message from a PANB device. This assumes
|
||||||
|
* that there is such message incoming (ie. that start_auto_input has been
|
||||||
|
* called prior).
|
||||||
|
*
|
||||||
|
* @param device Context of opened device.
|
||||||
|
* @param poll_in Buffer to hold the received message, or NULL.
|
||||||
|
* @return True if successful, false on error.
|
||||||
|
* @note node_id should be 0, PANB internally manages the other nodes.
|
||||||
|
* @note Failure to retrieve the incoming messages fast enough will cause the
|
||||||
|
* device to malfunction. It is thus advised to make use of the aciodrv-proc
|
||||||
|
* module to spawn a thread that will handle these messages and provide an easy
|
||||||
|
* access to the latest input state.
|
||||||
|
* @note This module is supposed to be used in combination with the common
|
||||||
|
* device driver foundation.
|
||||||
|
* @see driver.h
|
||||||
|
*/
|
||||||
|
bool aciodrv_panb_recv_poll(
|
||||||
|
struct aciodrv_device_ctx *device, struct ac_io_panb_poll_in *poll_in);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Light lamps on a PANB device.
|
* Light lamps on a PANB device.
|
||||||
*
|
*
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a lamp state struct
|
* @param state Pointer to a lamp state struct
|
||||||
* (mandatory).
|
* (mandatory).
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
* @note node_id should be 0, PANB internally manages the other nodes.
|
* @note node_id should be 0, PANB internally manages the other nodes.
|
||||||
@@ -51,6 +55,9 @@ bool aciodrv_panb_recv_poll(struct aciodrv_device_ctx *device, struct ac_io_panb
|
|||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_panb_send_lamp(struct aciodrv_device_ctx *device, uint8_t node_id, struct ac_io_panb_poll_out *state);
|
bool aciodrv_panb_send_lamp(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_panb_poll_out *state);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -148,7 +148,8 @@ int aciodrv_port_write(HANDLE port_fd, const void *bytes, int nbytes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!WriteFile(port_fd, bytes, nbytes, &nwrit, NULL)) {
|
if (!WriteFile(port_fd, bytes, nbytes, &nwrit, NULL)) {
|
||||||
log_warning("[%p] WriteFile failed: err = %lu", port_fd, GetLastError());
|
log_warning(
|
||||||
|
"[%p] WriteFile failed: err = %lu", port_fd, GetLastError());
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ int aciodrv_port_write(HANDLE port_fd, const void *bytes, int nbytes);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the previously opened com port.
|
* Close the previously opened com port.
|
||||||
*
|
*
|
||||||
* @param port_fd HANDLE of opened serial port
|
* @param port_fd HANDLE of opened serial port
|
||||||
*/
|
*/
|
||||||
void aciodrv_port_close(HANDLE port_fd);
|
void aciodrv_port_close(HANDLE port_fd);
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static bool aciodrv_rvol_change_expand_mode(
|
static bool aciodrv_rvol_change_expand_mode(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t mode)
|
||||||
uint8_t node_id,
|
|
||||||
uint8_t mode)
|
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -28,15 +26,12 @@ static bool aciodrv_rvol_change_expand_mode(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("I/O expand mode set %d, mode: %d",
|
log_info("I/O expand mode set %d, mode: %d", node_id, mode);
|
||||||
node_id, mode);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_rvol_init(
|
bool aciodrv_rvol_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ void ac_io_emu_icca_dispatch_request(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AC_IO_ICCA_CMD_SET_SLOT_STATE: {
|
case AC_IO_ICCA_CMD_SET_SLOT_STATE: {
|
||||||
if(icca->version == v150) {
|
if (icca->version == v150) {
|
||||||
ac_io_emu_icca_send_state(icca, req, 0, false);
|
ac_io_emu_icca_send_state(icca, req, 0, false);
|
||||||
} else {
|
} else {
|
||||||
struct ac_io_icca_misc *misc =
|
struct ac_io_icca_misc *misc =
|
||||||
@@ -267,8 +267,7 @@ static void ac_io_emu_icca_cmd_send_version(
|
|||||||
} else {
|
} else {
|
||||||
// probably log invalid version here
|
// probably log invalid version here
|
||||||
log_warning(
|
log_warning(
|
||||||
"Unknown ICCA version: %d emulation requested",
|
"Unknown ICCA version: %d emulation requested", icca->version);
|
||||||
icca->version);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resp.cmd.version.revision = 0x00;
|
resp.cmd.version.revision = 0x00;
|
||||||
@@ -487,7 +486,7 @@ ac_io_emu_icca_cipher(struct ac_io_emu_icca *icca, uint8_t *data, size_t length)
|
|||||||
|
|
||||||
// process data
|
// process data
|
||||||
data[i] =
|
data[i] =
|
||||||
(uint8_t)(icca->cipher_keys[0] >> (((3 - count4) << 3)) ^ data[i]);
|
(uint8_t) (icca->cipher_keys[0] >> (((3 - count4) << 3)) ^ data[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -512,7 +511,7 @@ static void ac_io_emu_icca_cipher_set_key(
|
|||||||
resp.cmd.raw[0] = (reader_key >> 24) & 0xFF;
|
resp.cmd.raw[0] = (reader_key >> 24) & 0xFF;
|
||||||
resp.cmd.raw[1] = (reader_key >> 16) & 0xFF;
|
resp.cmd.raw[1] = (reader_key >> 16) & 0xFF;
|
||||||
resp.cmd.raw[2] = (reader_key >> 8) & 0xFF;
|
resp.cmd.raw[2] = (reader_key >> 8) & 0xFF;
|
||||||
resp.cmd.raw[3] = (reader_key) & 0xFF;
|
resp.cmd.raw[3] = (reader_key) &0xFF;
|
||||||
|
|
||||||
// so I looked these constants up, this isn't actually a secure key
|
// so I looked these constants up, this isn't actually a secure key
|
||||||
// generator it's actually Marsaglia's "KISS" algorithm with different
|
// generator it's actually Marsaglia's "KISS" algorithm with different
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ struct aciomgr_port_dispatcher *aciomgr_port_init(const char *path, int baud)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct aciomgr_port_dispatcher *entry;
|
struct aciomgr_port_dispatcher *entry;
|
||||||
|
|
||||||
EnterCriticalSection(&mgr_cs);
|
EnterCriticalSection(&mgr_cs);
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ bool aciotest_bi2a_sdvx_handler_update(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pin.raw[0] = ac_io_u16(pin.raw[0]);
|
pin.raw[0] = ac_io_u16(pin.raw[0]);
|
||||||
pin.raw[1] = ac_io_u16(pin.raw[1]);
|
pin.raw[1] = ac_io_u16(pin.raw[1]);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include "aciodrv/icca.h"
|
#include "aciodrv/icca.h"
|
||||||
|
|
||||||
|
|
||||||
#define IDLE_RESPONSES_BETWEEN_FELICA_POLLS 5
|
#define IDLE_RESPONSES_BETWEEN_FELICA_POLLS 5
|
||||||
|
|
||||||
struct icca_handler_ctx {
|
struct icca_handler_ctx {
|
||||||
@@ -19,7 +18,7 @@ bool aciotest_icca_handler_init(
|
|||||||
{
|
{
|
||||||
*ctx = malloc(sizeof(struct icca_handler_ctx));
|
*ctx = malloc(sizeof(struct icca_handler_ctx));
|
||||||
|
|
||||||
struct icca_handler_ctx *icca_ctx = (struct icca_handler_ctx*)*ctx;
|
struct icca_handler_ctx *icca_ctx = (struct icca_handler_ctx *) *ctx;
|
||||||
icca_ctx->init = false;
|
icca_ctx->init = false;
|
||||||
|
|
||||||
icca_ctx->slotted_reader = true;
|
icca_ctx->slotted_reader = true;
|
||||||
@@ -34,7 +33,7 @@ bool aciotest_icca_handler_init(
|
|||||||
bool aciotest_icca_handler_update(
|
bool aciotest_icca_handler_update(
|
||||||
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
{
|
{
|
||||||
struct icca_handler_ctx *icca_ctx = (struct icca_handler_ctx*)ctx;
|
struct icca_handler_ctx *icca_ctx = (struct icca_handler_ctx *) ctx;
|
||||||
|
|
||||||
if (icca_ctx->init == false) {
|
if (icca_ctx->init == false) {
|
||||||
icca_ctx->init = true;
|
icca_ctx->init = true;
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
log_to_writer(log_writer_stdout, NULL);
|
log_to_writer(log_writer_stdout, NULL);
|
||||||
|
|
||||||
|
struct aciodrv_device_ctx *device =
|
||||||
struct aciodrv_device_ctx *device = aciodrv_device_open_path(argv[1], atoi(argv[2]));
|
aciodrv_device_open_path(argv[1], atoi(argv[2]));
|
||||||
|
|
||||||
if (!device) {
|
if (!device) {
|
||||||
printf("Opening acio device failed\n");
|
printf("Opening acio device failed\n");
|
||||||
|
|||||||
@@ -3,27 +3,29 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "aciodrv/panb.h"
|
|
||||||
#include "aciodrv-proc/panb.h"
|
#include "aciodrv-proc/panb.h"
|
||||||
|
#include "aciodrv/panb.h"
|
||||||
|
|
||||||
struct panb_handler_ctx {
|
struct panb_handler_ctx {
|
||||||
bool running;
|
bool running;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool aciotest_panb_handler_init(struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
bool aciotest_panb_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
||||||
{
|
{
|
||||||
if (node_id != 0) {
|
if (node_id != 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ctx = malloc(sizeof(struct panb_handler_ctx));
|
*ctx = malloc(sizeof(struct panb_handler_ctx));
|
||||||
struct panb_handler_ctx *panb_ctx = (struct panb_handler_ctx*)*ctx;
|
struct panb_handler_ctx *panb_ctx = (struct panb_handler_ctx *) *ctx;
|
||||||
panb_ctx->running = true;
|
panb_ctx->running = true;
|
||||||
|
|
||||||
return aciodrv_proc_panb_init(device);
|
return aciodrv_proc_panb_init(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciotest_panb_handler_update(struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
bool aciotest_panb_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
{
|
{
|
||||||
uint8_t button[AC_IO_PANB_MAX_KEYS];
|
uint8_t button[AC_IO_PANB_MAX_KEYS];
|
||||||
struct ac_io_panb_poll_out state;
|
struct ac_io_panb_poll_out state;
|
||||||
@@ -32,19 +34,19 @@ bool aciotest_panb_handler_update(struct aciodrv_device_ctx *device, uint8_t nod
|
|||||||
if (node_id != 0) {
|
if (node_id != 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!panb_ctx->running) {
|
if (!panb_ctx->running) {
|
||||||
printf(">>> PANB:\nDevice has been closed. Press Ctrl+C to exit.");
|
printf(">>> PANB:\nDevice has been closed. Press Ctrl+C to exit.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_proc_panb_get_state(button)) {
|
if (!aciodrv_proc_panb_get_state(button)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(">>> PANB:\nPress first and last keys to close device\n");
|
printf(">>> PANB:\nPress first and last keys to close device\n");
|
||||||
|
|
||||||
for (int i=0; i<AC_IO_PANB_MAX_KEYS; i++) {
|
for (int i = 0; i < AC_IO_PANB_MAX_KEYS; i++) {
|
||||||
printf("%01X ", button[i]);
|
printf("%01X ", button[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -52,25 +54,25 @@ bool aciotest_panb_handler_update(struct aciodrv_device_ctx *device, uint8_t nod
|
|||||||
/* I added a key combo to properly close the module.
|
/* I added a key combo to properly close the module.
|
||||||
* Leaving the PANB device in autopolling state without ever
|
* Leaving the PANB device in autopolling state without ever
|
||||||
* reading packets from the serial interface eventually
|
* reading packets from the serial interface eventually
|
||||||
* makes it fall into a state where it doesn't send anything anymore
|
* makes it fall into a state where it doesn't send anything anymore
|
||||||
* and won't even respond to a reset, thus requiring a power cycle.
|
* and won't even respond to a reset, thus requiring a power cycle.
|
||||||
*/
|
*/
|
||||||
if (button[0] && button[AC_IO_PANB_MAX_KEYS-1]) {
|
if (button[0] && button[AC_IO_PANB_MAX_KEYS - 1]) {
|
||||||
aciodrv_proc_panb_fini(device);
|
aciodrv_proc_panb_fini(device);
|
||||||
panb_ctx->running = false;
|
panb_ctx->running = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* light the panel */
|
/* light the panel */
|
||||||
for (int i=0; i<AC_IO_PANB_MAX_KEYS; i++) {
|
for (int i = 0; i < AC_IO_PANB_MAX_KEYS; i++) {
|
||||||
state.key[i].green = (button[i])? 0x7F : 0;
|
state.key[i].green = (button[i]) ? 0x7F : 0;
|
||||||
state.key[i].red = 0;
|
state.key[i].red = 0;
|
||||||
state.key[i].blue = (button[i])? 0x23 : 0;
|
state.key[i].blue = (button[i]) ? 0x23 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_panb_send_lamp(device, node_id, &state)) {
|
if (!aciodrv_panb_send_lamp(device, node_id, &state)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,9 @@
|
|||||||
|
|
||||||
#include "aciodrv/device.h"
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
bool aciotest_panb_handler_init(struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
bool aciotest_panb_handler_init(
|
||||||
bool aciotest_panb_handler_update(struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool aciotest_panb_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -54,8 +54,7 @@ bool aciotest_rvol_handler_update(
|
|||||||
selected_light,
|
selected_light,
|
||||||
pin.spinners[2] / 2,
|
pin.spinners[2] / 2,
|
||||||
pin.spinners[3] / 2,
|
pin.spinners[3] / 2,
|
||||||
pin.spinners[4] / 2
|
pin.spinners[4] / 2);
|
||||||
);
|
|
||||||
|
|
||||||
memset(&pout, 0, sizeof(pout));
|
memset(&pout, 0, sizeof(pout));
|
||||||
|
|
||||||
|
|||||||
@@ -51,17 +51,17 @@ LSTATUS my_RegCloseKey(HKEY hKey);
|
|||||||
|
|
||||||
LSTATUS (*real_RegOpenKeyA)(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult);
|
LSTATUS (*real_RegOpenKeyA)(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult);
|
||||||
|
|
||||||
LSTATUS (*real_RegEnumKeyA)
|
LSTATUS(*real_RegEnumKeyA)
|
||||||
(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cchName);
|
(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cchName);
|
||||||
|
|
||||||
LSTATUS (*real_RegOpenKeyExA)
|
LSTATUS(*real_RegOpenKeyExA)
|
||||||
(HKEY hKey,
|
(HKEY hKey,
|
||||||
LPCSTR lpSubKey,
|
LPCSTR lpSubKey,
|
||||||
DWORD ulOptions,
|
DWORD ulOptions,
|
||||||
REGSAM samDesired,
|
REGSAM samDesired,
|
||||||
PHKEY phkResult);
|
PHKEY phkResult);
|
||||||
|
|
||||||
LSTATUS (*real_RegQueryValueExA)
|
LSTATUS(*real_RegQueryValueExA)
|
||||||
(HKEY hKey,
|
(HKEY hKey,
|
||||||
LPCSTR lpValueName,
|
LPCSTR lpValueName,
|
||||||
LPDWORD lpReserved,
|
LPDWORD lpReserved,
|
||||||
|
|||||||
@@ -10,8 +10,7 @@
|
|||||||
|
|
||||||
#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE false
|
#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE false
|
||||||
#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE false
|
#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE false
|
||||||
#define ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE \
|
#define ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE "XONAR SOUND CARD(64)"
|
||||||
"XONAR SOUND CARD(64)"
|
|
||||||
|
|
||||||
void asiohook_config_init(struct cconfig *config)
|
void asiohook_config_init(struct cconfig *config)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ bool ddr_io_init(
|
|||||||
thread_join_t thread_join,
|
thread_join_t thread_join,
|
||||||
thread_destroy_t thread_destroy);
|
thread_destroy_t thread_destroy);
|
||||||
|
|
||||||
|
|
||||||
/* used to poll the IO for input, note that this is also where lights are
|
/* used to poll the IO for input, note that this is also where lights are
|
||||||
flushed to the device for geninput */
|
flushed to the device for geninput */
|
||||||
uint32_t ddr_io_read_pad(void);
|
uint32_t ddr_io_read_pad(void);
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ enum iidx_io_panel_light {
|
|||||||
IIDX_IO_PANEL_LIGHT_EFFECT = 3,
|
IIDX_IO_PANEL_LIGHT_EFFECT = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Bit mapping for the top lamps from left to right when facing cabinet screen */
|
/* Bit mapping for the top lamps from left to right when facing cabinet screen
|
||||||
|
*/
|
||||||
|
|
||||||
enum iidx_io_top_lamp {
|
enum iidx_io_top_lamp {
|
||||||
IIDX_IO_TOP_LAMP_LEFT_BLUE = 0,
|
IIDX_IO_TOP_LAMP_LEFT_BLUE = 0,
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ void jb_io_set_rgb_led(
|
|||||||
|
|
||||||
bool jb_io_write_lights(void);
|
bool jb_io_write_lights(void);
|
||||||
|
|
||||||
/* Select operating mode for the panel. Should be immediately sent to the IOPCB */
|
/* Select operating mode for the panel. Should be immediately sent to the IOPCB
|
||||||
|
*/
|
||||||
|
|
||||||
bool jb_io_set_panel_mode(enum jb_io_panel_mode mode);
|
bool jb_io_set_panel_mode(enum jb_io_panel_mode mode);
|
||||||
|
|
||||||
|
|||||||
@@ -103,8 +103,6 @@ uint16_t sdvx_io_get_spinner_pos(uint8_t spinner_no);
|
|||||||
Range is between 0-96, where 0 is MAX and 96 is LOW. */
|
Range is between 0-96, where 0 is MAX and 96 is LOW. */
|
||||||
|
|
||||||
bool sdvx_io_set_amp_volume(
|
bool sdvx_io_set_amp_volume(
|
||||||
uint8_t primary,
|
uint8_t primary, uint8_t headphone, uint8_t subwoofer);
|
||||||
uint8_t headphone,
|
|
||||||
uint8_t subwoofer);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,9 +14,8 @@
|
|||||||
// in all inputs and outputs (over sub IO) other than 14 keys to not work.
|
// in all inputs and outputs (over sub IO) other than 14 keys to not work.
|
||||||
static const uint8_t _BIO2DR_BI2A_IIDX_INIT_DATA = 0x2D;
|
static const uint8_t _BIO2DR_BI2A_IIDX_INIT_DATA = 0x2D;
|
||||||
|
|
||||||
static bool bio2drv_bi2a_iidx_init_io(
|
static bool
|
||||||
struct aciodrv_device_ctx *device,
|
bio2drv_bi2a_iidx_init_io(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -28,9 +27,7 @@ static bool bio2drv_bi2a_iidx_init_io(
|
|||||||
msg.cmd.param = _BIO2DR_BI2A_IIDX_INIT_DATA;
|
msg.cmd.param = _BIO2DR_BI2A_IIDX_INIT_DATA;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Init node failed");
|
log_warning("Init node failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -41,8 +38,7 @@ static bool bio2drv_bi2a_iidx_init_io(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool bio2drv_bi2a_iidx_watchdog_start(
|
static bool bio2drv_bi2a_iidx_watchdog_start(
|
||||||
struct aciodrv_device_ctx *device,
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
uint8_t node_id)
|
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,7 @@
|
|||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_iidx_init(
|
bool bio2drv_bi2a_iidx_init(struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the BI2A board
|
* Poll the BI2A board
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
static const uint8_t _BIO2DR_BI2A_SDVX_INIT_DATA = 0x3B;
|
static const uint8_t _BIO2DR_BI2A_SDVX_INIT_DATA = 0x3B;
|
||||||
|
|
||||||
// this is probably InitIO
|
// this is probably InitIO
|
||||||
static bool bio2drv_bi2a_sdvx_init_io(struct aciodrv_device_ctx *device, uint8_t node_id)
|
static bool
|
||||||
|
bio2drv_bi2a_sdvx_init_io(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@@ -24,9 +25,7 @@ static bool bio2drv_bi2a_sdvx_init_io(struct aciodrv_device_ctx *device, uint8_t
|
|||||||
msg.cmd.param = _BIO2DR_BI2A_SDVX_INIT_DATA;
|
msg.cmd.param = _BIO2DR_BI2A_SDVX_INIT_DATA;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Init node failed");
|
log_warning("Init node failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -36,7 +35,8 @@ static bool bio2drv_bi2a_sdvx_init_io(struct aciodrv_device_ctx *device, uint8_t
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bio2drv_bi2a_sdvx_watchdog_start(struct aciodrv_device_ctx *device, uint8_t node_id)
|
static bool bio2drv_bi2a_sdvx_watchdog_start(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
log_assert(device);
|
log_assert(device);
|
||||||
|
|
||||||
@@ -95,9 +95,7 @@ bool bio2drv_bi2a_sdvx_amp(
|
|||||||
msg.cmd.raw[3] = right;
|
msg.cmd.raw[3] = right;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
device,
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
&msg,
|
|
||||||
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
|
||||||
log_warning("Setting AMP failed");
|
log_warning("Setting AMP failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,7 @@
|
|||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_sdvx_init(
|
bool bio2drv_bi2a_sdvx_init(struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
struct aciodrv_device_ctx *device,
|
|
||||||
uint8_t node_id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the board
|
* Poll the board
|
||||||
|
|||||||
@@ -50,10 +50,10 @@ static bool check_property(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool check_id(
|
static bool check_id(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA PDeviceInfoData)
|
||||||
HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA PDeviceInfoData)
|
|
||||||
{
|
{
|
||||||
if (CM_Get_Device_IDA(PDeviceInfoData->DevInst, work_buffer, sizeof(work_buffer), 0)) {
|
if (CM_Get_Device_IDA(
|
||||||
|
PDeviceInfoData->DevInst, work_buffer, sizeof(work_buffer), 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -175,7 +175,8 @@ static void bio2_emu_bi2a_send_status(
|
|||||||
ac_io_emu_response_push(emu, &resp, 0);
|
ac_io_emu_response_push(emu, &resp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int16_t tt_mult_delta(size_t tt_no) {
|
static int16_t tt_mult_delta(size_t tt_no)
|
||||||
|
{
|
||||||
int16_t current_tt = iidx_io_ep2_get_turntable(tt_no);
|
int16_t current_tt = iidx_io_ep2_get_turntable(tt_no);
|
||||||
int16_t delta = get_wrapped_delta_s16(current_tt, tt_last[tt_no], 256);
|
int16_t delta = get_wrapped_delta_s16(current_tt, tt_last[tt_no], 256);
|
||||||
|
|
||||||
|
|||||||
@@ -382,8 +382,8 @@ static INT_PTR lights_handle_pulse_tick(HWND hwnd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bias = (float) (ui->lights[light_no].value_min);
|
bias = (float) (ui->lights[light_no].value_min);
|
||||||
scale =
|
scale = (float) (ui->lights[light_no].value_max -
|
||||||
(float) (ui->lights[light_no].value_max - ui->lights[light_no].value_min);
|
ui->lights[light_no].value_min);
|
||||||
|
|
||||||
/* Intensity perception is non-linear. Pulse quadratically. */
|
/* Intensity perception is non-linear. Pulse quadratically. */
|
||||||
|
|
||||||
|
|||||||
@@ -117,14 +117,14 @@ int main(int argc, char **argv)
|
|||||||
if (!mapper_config_load(schema->name)) {
|
if (!mapper_config_load(schema->name)) {
|
||||||
log_info("Initializing empty config for %s", schema->name);
|
log_info("Initializing empty config for %s", schema->name);
|
||||||
|
|
||||||
mapper_set_nlights((uint8_t)(max_light + 1));
|
mapper_set_nlights((uint8_t) (max_light + 1));
|
||||||
mapper_set_nanalogs((uint8_t) schema->nanalogs);
|
mapper_set_nanalogs((uint8_t) schema->nanalogs);
|
||||||
} else {
|
} else {
|
||||||
// make sure that these are right
|
// make sure that these are right
|
||||||
|
|
||||||
if (mapper_get_nlights() != (max_light + 1)) {
|
if (mapper_get_nlights() != (max_light + 1)) {
|
||||||
log_info("Updating nlights for %s", schema->name);
|
log_info("Updating nlights for %s", schema->name);
|
||||||
mapper_set_nlights((uint8_t)(max_light + 1));
|
mapper_set_nlights((uint8_t) (max_light + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapper_get_nanalogs() != schema->nanalogs) {
|
if (mapper_get_nanalogs() != schema->nanalogs) {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ void spinner_init(HINSTANCE inst)
|
|||||||
wcx.cbSize = sizeof(wcx);
|
wcx.cbSize = sizeof(wcx);
|
||||||
wcx.lpfnWndProc = spinner_wnd_proc;
|
wcx.lpfnWndProc = spinner_wnd_proc;
|
||||||
wcx.hInstance = inst;
|
wcx.hInstance = inst;
|
||||||
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
wcx.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
|
||||||
wcx.lpszClassName = spinner_cls;
|
wcx.lpszClassName = spinner_cls;
|
||||||
|
|
||||||
RegisterClassEx(&wcx);
|
RegisterClassEx(&wcx);
|
||||||
|
|||||||
@@ -18,8 +18,10 @@
|
|||||||
#define D3D9EXHOOK_CONFIG_GFX_FORCED_REFRESHRATE_KEY "gfx.forced_refresh_rate"
|
#define D3D9EXHOOK_CONFIG_GFX_FORCED_REFRESHRATE_KEY "gfx.forced_refresh_rate"
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_DEVICE_ADAPTER_KEY "gfx.device_adapter"
|
#define D3D9EXHOOK_CONFIG_GFX_DEVICE_ADAPTER_KEY "gfx.device_adapter"
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_FORCE_ORIENTATION_KEY "gfx.force_orientation"
|
#define D3D9EXHOOK_CONFIG_GFX_FORCE_ORIENTATION_KEY "gfx.force_orientation"
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_WIDTH_KEY "gfx.force_screen_res.width"
|
#define D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_WIDTH_KEY \
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_HEIGHT_KEY "gfx.force_screen_res.height"
|
"gfx.force_screen_res.width"
|
||||||
|
#define D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_HEIGHT_KEY \
|
||||||
|
"gfx.force_screen_res.height"
|
||||||
|
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_DEFAULT_FRAMED_VALUE false
|
#define D3D9EXHOOK_CONFIG_GFX_DEFAULT_FRAMED_VALUE false
|
||||||
#define D3D9EXHOOK_CONFIG_GFX_DEFAULT_WINDOWED_VALUE false
|
#define D3D9EXHOOK_CONFIG_GFX_DEFAULT_WINDOWED_VALUE false
|
||||||
@@ -103,15 +105,19 @@ void d3d9exhook_config_gfx_init(struct cconfig *config)
|
|||||||
config,
|
config,
|
||||||
D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_WIDTH_KEY,
|
D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_WIDTH_KEY,
|
||||||
D3D9EXHOOK_CONFIG_GFX_DEFAULT_FORCE_SCREEN_RES_WIDTH_VALUE,
|
D3D9EXHOOK_CONFIG_GFX_DEFAULT_FORCE_SCREEN_RES_WIDTH_VALUE,
|
||||||
"Force a screen resolution (width), -1 to disable. Use this if the game does not auto "
|
"Force a screen resolution (width), -1 to disable. Use this if the "
|
||||||
"detect your monitor's resolution properly, e.g. 1368x768 instead of 1280x720.");
|
"game does not auto "
|
||||||
|
"detect your monitor's resolution properly, e.g. 1368x768 instead of "
|
||||||
|
"1280x720.");
|
||||||
|
|
||||||
cconfig_util_set_int(
|
cconfig_util_set_int(
|
||||||
config,
|
config,
|
||||||
D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_HEIGHT_KEY,
|
D3D9EXHOOK_CONFIG_GFX_FORCE_SCREEN_RES_HEIGHT_KEY,
|
||||||
D3D9EXHOOK_CONFIG_GFX_DEFAULT_FORCE_SCREEN_RES_HEIGHT_VALUE,
|
D3D9EXHOOK_CONFIG_GFX_DEFAULT_FORCE_SCREEN_RES_HEIGHT_VALUE,
|
||||||
"Force a screen resolution (height), -1 to disable. Use this if the game does not auto "
|
"Force a screen resolution (height), -1 to disable. Use this if the "
|
||||||
"detect your monitor's resolution properly, e.g. 1368x768 instead of 1280x720.");
|
"game does not auto "
|
||||||
|
"detect your monitor's resolution properly, e.g. 1368x768 instead of "
|
||||||
|
"1280x720.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void d3d9exhook_config_gfx_get(
|
void d3d9exhook_config_gfx_get(
|
||||||
|
|||||||
@@ -52,10 +52,8 @@ static HRESULT STDCALL my_EnumAdapterModes(
|
|||||||
UINT Mode,
|
UINT Mode,
|
||||||
D3DDISPLAYMODE *pMode);
|
D3DDISPLAYMODE *pMode);
|
||||||
|
|
||||||
static UINT STDCALL my_GetAdapterModeCount(
|
static UINT STDCALL
|
||||||
IDirect3D9Ex *self,
|
my_GetAdapterModeCount(IDirect3D9Ex *self, UINT Adapter, D3DFORMAT Format);
|
||||||
UINT Adapter,
|
|
||||||
D3DFORMAT Format);
|
|
||||||
|
|
||||||
static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api);
|
static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api);
|
||||||
|
|
||||||
@@ -305,7 +303,8 @@ static HRESULT STDCALL my_CreateDeviceEx(
|
|||||||
|
|
||||||
if (fdm) {
|
if (fdm) {
|
||||||
log_misc(
|
log_misc(
|
||||||
"CreateDeviceEx display mode: size %d, width %d, height %d, refresh rate %d, format %d, "
|
"CreateDeviceEx display mode: size %d, width %d, height %d, "
|
||||||
|
"refresh rate %d, format %d, "
|
||||||
"scan line ordering %d",
|
"scan line ordering %d",
|
||||||
fdm->Size,
|
fdm->Size,
|
||||||
fdm->Width,
|
fdm->Width,
|
||||||
@@ -318,7 +317,8 @@ static HRESULT STDCALL my_CreateDeviceEx(
|
|||||||
log_misc(
|
log_misc(
|
||||||
"D3D9EX presenter parameters: BackBufferWidth %d, BackBufferHeight "
|
"D3D9EX presenter parameters: BackBufferWidth %d, BackBufferHeight "
|
||||||
"%d, BackBufferFormat %d, "
|
"%d, BackBufferFormat %d, "
|
||||||
"BackBufferCount %d, MultiSampleType %d, MultiSampleQuality %ld, SwapEffect %d, "
|
"BackBufferCount %d, MultiSampleType %d, MultiSampleQuality %ld, "
|
||||||
|
"SwapEffect %d, "
|
||||||
"hDeviceWindow %p, Windowed %d, "
|
"hDeviceWindow %p, Windowed %d, "
|
||||||
"EnableAutoDepthStencil "
|
"EnableAutoDepthStencil "
|
||||||
"%d, AutoDepthStencilFormat %d, Flags %lX, "
|
"%d, AutoDepthStencilFormat %d, Flags %lX, "
|
||||||
@@ -343,8 +343,10 @@ static HRESULT STDCALL my_CreateDeviceEx(
|
|||||||
adapter = d3d9ex_device_adapter;
|
adapter = d3d9ex_device_adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d3d9ex_force_screen_res_width > 0 && d3d9ex_force_screen_res_height > 0) {
|
if (d3d9ex_force_screen_res_width > 0 &&
|
||||||
log_info("Overriding screen resolution/back buffer of %dx%d -> %dx%d",
|
d3d9ex_force_screen_res_height > 0) {
|
||||||
|
log_info(
|
||||||
|
"Overriding screen resolution/back buffer of %dx%d -> %dx%d",
|
||||||
pp->BackBufferWidth,
|
pp->BackBufferWidth,
|
||||||
pp->BackBufferHeight,
|
pp->BackBufferHeight,
|
||||||
d3d9ex_force_screen_res_width,
|
d3d9ex_force_screen_res_width,
|
||||||
@@ -445,7 +447,7 @@ static HRESULT STDCALL my_EnumAdapterModes(
|
|||||||
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
|
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if (d3d9ex_device_adapter>= 0) {
|
if (d3d9ex_device_adapter >= 0) {
|
||||||
Adapter = d3d9ex_device_adapter;
|
Adapter = d3d9ex_device_adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,15 +463,13 @@ static HRESULT STDCALL my_EnumAdapterModes(
|
|||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT STDCALL my_GetAdapterModeCount(
|
static UINT STDCALL
|
||||||
IDirect3D9Ex *self,
|
my_GetAdapterModeCount(IDirect3D9Ex *self, UINT Adapter, D3DFORMAT Format)
|
||||||
UINT Adapter,
|
|
||||||
D3DFORMAT Format)
|
|
||||||
{
|
{
|
||||||
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
|
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
|
||||||
UINT res;
|
UINT res;
|
||||||
|
|
||||||
if (d3d9ex_device_adapter>= 0) {
|
if (d3d9ex_device_adapter >= 0) {
|
||||||
Adapter = d3d9ex_device_adapter;
|
Adapter = d3d9ex_device_adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,14 +494,14 @@ static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api)
|
|||||||
|
|
||||||
hr = real_Direct3DCreate9Ex(sdk_ver, api);
|
hr = real_Direct3DCreate9Ex(sdk_ver, api);
|
||||||
api_ = *api;
|
api_ = *api;
|
||||||
|
|
||||||
hr = com_proxy_wrap(&api_proxy, api_, sizeof(*api_->lpVtbl));
|
hr = com_proxy_wrap(&api_proxy, api_, sizeof(*api_->lpVtbl));
|
||||||
|
|
||||||
if (hr != S_OK) {
|
if (hr != S_OK) {
|
||||||
log_warning("Wrapping com proxy failed: %08lx", hr);
|
log_warning("Wrapping com proxy failed: %08lx", hr);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
api_vtbl = api_proxy->vptr;
|
api_vtbl = api_proxy->vptr;
|
||||||
|
|
||||||
api_vtbl->CreateDeviceEx = my_CreateDeviceEx;
|
api_vtbl->CreateDeviceEx = my_CreateDeviceEx;
|
||||||
@@ -555,7 +555,8 @@ void d3d9ex_configure(struct d3d9exhook_config_gfx *gfx_config)
|
|||||||
d3d9ex_force_screen_res_height = gfx_config->force_screen_res.height;
|
d3d9ex_force_screen_res_height = gfx_config->force_screen_res.height;
|
||||||
|
|
||||||
if (d3d9ex_force_screen_res_width * d3d9ex_force_screen_res_height > 0) {
|
if (d3d9ex_force_screen_res_width * d3d9ex_force_screen_res_height > 0) {
|
||||||
log_warning("Force screen res: Only one, either width or height, is > 0."
|
log_warning(
|
||||||
|
"Force screen res: Only one, either width or height, is > 0."
|
||||||
" Force screen res not activate");
|
" Force screen res not activate");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,7 @@ static struct ac_io_emu_hdxs com4_hdxs;
|
|||||||
static struct ac_io_emu_icca com4_icca[2];
|
static struct ac_io_emu_icca com4_icca[2];
|
||||||
|
|
||||||
static uint32_t check_panel_light(
|
static uint32_t check_panel_light(
|
||||||
const struct ac_io_hdxs_output *output,
|
const struct ac_io_hdxs_output *output, uint8_t panel_idx, uint8_t out_idx)
|
||||||
uint8_t panel_idx,
|
|
||||||
uint8_t out_idx)
|
|
||||||
{
|
{
|
||||||
if (output->lights[panel_idx].bit) {
|
if (output->lights[panel_idx].bit) {
|
||||||
return 1 << out_idx;
|
return 1 << out_idx;
|
||||||
@@ -45,7 +43,8 @@ static uint32_t check_panel_light(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t upscale_light(uint8_t in_7bit) {
|
static uint8_t upscale_light(uint8_t in_7bit)
|
||||||
|
{
|
||||||
if (in_7bit < 0x10) {
|
if (in_7bit < 0x10) {
|
||||||
return in_7bit * 2;
|
return in_7bit * 2;
|
||||||
} else {
|
} else {
|
||||||
@@ -54,18 +53,24 @@ static uint8_t upscale_light(uint8_t in_7bit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lights_dispatcher(
|
static void
|
||||||
struct ac_io_emu_hdxs *emu, const struct ac_io_message *req)
|
lights_dispatcher(struct ac_io_emu_hdxs *emu, const struct ac_io_message *req)
|
||||||
{
|
{
|
||||||
const struct ac_io_hdxs_output *output = &req->cmd.hdxs_output;
|
const struct ac_io_hdxs_output *output = &req->cmd.hdxs_output;
|
||||||
|
|
||||||
uint32_t lights = 0;
|
uint32_t lights = 0;
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P1_START, LIGHT_HD_P1_START);
|
lights |=
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P1_UP_DOWN, LIGHT_HD_P1_UP_DOWN);
|
check_panel_light(output, AC_IO_HDXS_OUT_P1_START, LIGHT_HD_P1_START);
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P1_LEFT_RIGHT, LIGHT_HD_P1_LEFT_RIGHT);
|
lights |= check_panel_light(
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P2_START, LIGHT_HD_P2_START);
|
output, AC_IO_HDXS_OUT_P1_UP_DOWN, LIGHT_HD_P1_UP_DOWN);
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P2_UP_DOWN, LIGHT_HD_P2_UP_DOWN);
|
lights |= check_panel_light(
|
||||||
lights |= check_panel_light(output, AC_IO_HDXS_OUT_P2_LEFT_RIGHT, LIGHT_HD_P2_LEFT_RIGHT);
|
output, AC_IO_HDXS_OUT_P1_LEFT_RIGHT, LIGHT_HD_P1_LEFT_RIGHT);
|
||||||
|
lights |=
|
||||||
|
check_panel_light(output, AC_IO_HDXS_OUT_P2_START, LIGHT_HD_P2_START);
|
||||||
|
lights |= check_panel_light(
|
||||||
|
output, AC_IO_HDXS_OUT_P2_UP_DOWN, LIGHT_HD_P2_UP_DOWN);
|
||||||
|
lights |= check_panel_light(
|
||||||
|
output, AC_IO_HDXS_OUT_P2_LEFT_RIGHT, LIGHT_HD_P2_LEFT_RIGHT);
|
||||||
|
|
||||||
ddr_io_set_lights_hdxs_panel(lights);
|
ddr_io_set_lights_hdxs_panel(lights);
|
||||||
|
|
||||||
@@ -73,9 +78,12 @@ static void lights_dispatcher(
|
|||||||
size_t light_idx = i * 3;
|
size_t light_idx = i * 3;
|
||||||
|
|
||||||
// these are 7 bit, upscale them to 8 bit
|
// these are 7 bit, upscale them to 8 bit
|
||||||
uint8_t r = upscale_light(output->lights[light_idx + AC_IO_HDXS_RED].analog);
|
uint8_t r =
|
||||||
uint8_t g = upscale_light(output->lights[light_idx + AC_IO_HDXS_GREEN].analog);
|
upscale_light(output->lights[light_idx + AC_IO_HDXS_RED].analog);
|
||||||
uint8_t b = upscale_light(output->lights[light_idx + AC_IO_HDXS_BLUE].analog);
|
uint8_t g =
|
||||||
|
upscale_light(output->lights[light_idx + AC_IO_HDXS_GREEN].analog);
|
||||||
|
uint8_t b =
|
||||||
|
upscale_light(output->lights[light_idx + AC_IO_HDXS_BLUE].analog);
|
||||||
|
|
||||||
ddr_io_set_lights_hdxs_rgb(i, r, g, b);
|
ddr_io_set_lights_hdxs_rgb(i, r, g, b);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,11 +72,11 @@ static HRESULT STDCALL my_DirectInput8Create(
|
|||||||
|
|
||||||
res = real_DirectInput8Create(
|
res = real_DirectInput8Create(
|
||||||
hinst, dwVersion, riidltf, (LPVOID *) &api, punkOuter);
|
hinst, dwVersion, riidltf, (LPVOID *) &api, punkOuter);
|
||||||
|
|
||||||
if (res != DI_OK) {
|
if (res != DI_OK) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = com_proxy_wrap(&api_proxy, api, sizeof(*api->lpVtbl));
|
res = com_proxy_wrap(&api_proxy, api, sizeof(*api->lpVtbl));
|
||||||
|
|
||||||
if (res != S_OK) {
|
if (res != S_OK) {
|
||||||
|
|||||||
@@ -185,8 +185,7 @@ static void gfx_d3d9_patch_window(struct hook_d3d9_irp *irp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void gfx_d3d9_fix_window_size_and_pos(struct hook_d3d9_irp *irp)
|
||||||
gfx_d3d9_fix_window_size_and_pos(struct hook_d3d9_irp *irp)
|
|
||||||
{
|
{
|
||||||
log_assert(irp);
|
log_assert(irp);
|
||||||
log_assert(irp->op == HOOK_D3D9_IRP_OP_CREATE_WINDOW_EX);
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_CREATE_WINDOW_EX);
|
||||||
@@ -215,8 +214,7 @@ gfx_d3d9_fix_window_size_and_pos(struct hook_d3d9_irp *irp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_d3d9_create_device_apply_window_mode(
|
static void gfx_d3d9_create_device_apply_window_mode(struct hook_d3d9_irp *irp)
|
||||||
struct hook_d3d9_irp *irp)
|
|
||||||
{
|
{
|
||||||
log_assert(irp);
|
log_assert(irp);
|
||||||
log_assert(irp->op == HOOK_D3D9_IRP_OP_CTX_CREATE_DEVICE);
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_CTX_CREATE_DEVICE);
|
||||||
@@ -231,8 +229,7 @@ static void gfx_d3d9_create_device_apply_window_mode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_d3d9_reset_apply_window_mode(
|
static void gfx_d3d9_reset_apply_window_mode(struct hook_d3d9_irp *irp)
|
||||||
struct hook_d3d9_irp *irp)
|
|
||||||
{
|
{
|
||||||
log_assert(irp);
|
log_assert(irp);
|
||||||
log_assert(irp->op == HOOK_D3D9_IRP_OP_DEV_RESET);
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_DEV_RESET);
|
||||||
|
|||||||
@@ -64,8 +64,14 @@ void p3io_ddr_init_with_plugs(
|
|||||||
memcpy(&p3io_ddr_mcode, mcode, sizeof(struct security_mcode));
|
memcpy(&p3io_ddr_mcode, mcode, sizeof(struct security_mcode));
|
||||||
memcpy(&p3io_ddr_pcbid, pcbid, sizeof(struct security_id));
|
memcpy(&p3io_ddr_pcbid, pcbid, sizeof(struct security_id));
|
||||||
memcpy(&p3io_ddr_eamid, eamid, sizeof(struct security_id));
|
memcpy(&p3io_ddr_eamid, eamid, sizeof(struct security_id));
|
||||||
memcpy(&p3io_black_sign_key, black_sign_key, sizeof(struct security_rp_sign_key));
|
memcpy(
|
||||||
memcpy(&p3io_white_sign_key, white_sign_key, sizeof(struct security_rp_sign_key));
|
&p3io_black_sign_key,
|
||||||
|
black_sign_key,
|
||||||
|
sizeof(struct security_rp_sign_key));
|
||||||
|
memcpy(
|
||||||
|
&p3io_white_sign_key,
|
||||||
|
white_sign_key,
|
||||||
|
sizeof(struct security_rp_sign_key));
|
||||||
|
|
||||||
/* COM4 isn't a real COM port, we configure the core P3IO emulator code to
|
/* COM4 isn't a real COM port, we configure the core P3IO emulator code to
|
||||||
generate IRPs addressed to COM4 and then we possibly intercept them in
|
generate IRPs addressed to COM4 and then we possibly intercept them in
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
#include "hook/iohook.h"
|
#include "hook/iohook.h"
|
||||||
|
|
||||||
#include "util/crc.h"
|
#include "util/crc.h"
|
||||||
|
#include "util/fs.h"
|
||||||
#include "util/iobuf.h"
|
#include "util/iobuf.h"
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
#include "util/fs.h"
|
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
#define USBMEM_DEVICE_COUNT 2
|
#define USBMEM_DEVICE_COUNT 2
|
||||||
@@ -95,7 +95,8 @@ void usbmem_init(const char *path_p1, const char *path_p2, const bool enabled)
|
|||||||
GetFullPathNameA(path_p2, sizeof(usb_data_path[1]), usb_data_path[1], NULL);
|
GetFullPathNameA(path_p2, sizeof(usb_data_path[1]), usb_data_path[1], NULL);
|
||||||
log_misc("USB memory data path (P2): %s", usb_data_path[1]);
|
log_misc("USB memory data path (P2): %s", usb_data_path[1]);
|
||||||
|
|
||||||
if (enabled && !path_exists(usb_data_path[0]) && !path_exists(usb_data_path[1])) {
|
if (enabled && !path_exists(usb_data_path[0]) &&
|
||||||
|
!path_exists(usb_data_path[1])) {
|
||||||
log_warning("USB memory data path does not exist, disabling");
|
log_warning("USB memory data path does not exist, disabling");
|
||||||
usbmem_enabled = false;
|
usbmem_enabled = false;
|
||||||
}
|
}
|
||||||
@@ -177,36 +178,53 @@ static HRESULT usbmem_write(struct irp *irp)
|
|||||||
log_assert(irp->write.bytes != NULL);
|
log_assert(irp->write.bytes != NULL);
|
||||||
|
|
||||||
src = &irp->write;
|
src = &irp->write;
|
||||||
nbytes = src->nbytes > USBMEM_COMMAND_BUF_SIZE ? USBMEM_COMMAND_BUF_SIZE : src->nbytes;
|
nbytes = src->nbytes > USBMEM_COMMAND_BUF_SIZE ? USBMEM_COMMAND_BUF_SIZE :
|
||||||
|
src->nbytes;
|
||||||
memcpy(request, src->bytes, nbytes);
|
memcpy(request, src->bytes, nbytes);
|
||||||
request[nbytes - 1] = '\0'; /* This is always a CR. */
|
request[nbytes - 1] = '\0'; /* This is always a CR. */
|
||||||
|
|
||||||
if (!usbmem_pending && target_device_id >= 0 && target_device_id < USBMEM_DEVICE_COUNT && usbmem_state[target_device_id].file_type == USBMEM_FILE_TYPE_READ) {
|
if (!usbmem_pending && target_device_id >= 0 &&
|
||||||
|
target_device_id < USBMEM_DEVICE_COUNT &&
|
||||||
|
usbmem_state[target_device_id].file_type == USBMEM_FILE_TYPE_READ) {
|
||||||
memset(usbmem_response, 0, sizeof(usbmem_response));
|
memset(usbmem_response, 0, sizeof(usbmem_response));
|
||||||
|
|
||||||
// log_misc("Read progress %08x/%08x bytes", usbmem_state[target_device_id].buffer_index, usbmem_state[target_device_id].buffer_len);
|
// log_misc("Read progress %08x/%08x bytes",
|
||||||
|
// usbmem_state[target_device_id].buffer_index,
|
||||||
|
// usbmem_state[target_device_id].buffer_len);
|
||||||
|
|
||||||
if (usbmem_state[target_device_id].buffer_index < usbmem_state[target_device_id].buffer_len) {
|
if (usbmem_state[target_device_id].buffer_index <
|
||||||
|
usbmem_state[target_device_id].buffer_len) {
|
||||||
usbmem_response_length = sizeof(usbmem_response);
|
usbmem_response_length = sizeof(usbmem_response);
|
||||||
usbmem_response[0] = 0x02; // 1 = 0x80 buffer, 2 = 0x400 buffer
|
usbmem_response[0] = 0x02; // 1 = 0x80 buffer, 2 = 0x400 buffer
|
||||||
usbmem_response[1] = usbmem_state[target_device_id].buffer_frame;
|
usbmem_response[1] = usbmem_state[target_device_id].buffer_frame;
|
||||||
usbmem_response[2] = ~usbmem_response[1];
|
usbmem_response[2] = ~usbmem_response[1];
|
||||||
|
|
||||||
if (usbmem_state[target_device_id].buffer_frame == 0) {
|
if (usbmem_state[target_device_id].buffer_frame == 0) {
|
||||||
snprintf(usbmem_response + 4, sizeof(usbmem_response) - 5, "%d ", usbmem_state[target_device_id].buffer_len);
|
snprintf(
|
||||||
|
usbmem_response + 4,
|
||||||
|
sizeof(usbmem_response) - 5,
|
||||||
|
"%zu ",
|
||||||
|
usbmem_state[target_device_id].buffer_len);
|
||||||
} else {
|
} else {
|
||||||
size_t len = sizeof(usbmem_response) - 5;
|
size_t len = sizeof(usbmem_response) - 5;
|
||||||
|
|
||||||
if (usbmem_state[target_device_id].buffer_index + len > usbmem_state[target_device_id].buffer_len)
|
if (usbmem_state[target_device_id].buffer_index + len >
|
||||||
len = usbmem_state[target_device_id].buffer_len - usbmem_state[target_device_id].buffer_index;
|
usbmem_state[target_device_id].buffer_len)
|
||||||
|
len = usbmem_state[target_device_id].buffer_len -
|
||||||
|
usbmem_state[target_device_id].buffer_index;
|
||||||
|
|
||||||
memcpy(usbmem_response + 3, usbmem_state[target_device_id].buffer + usbmem_state[target_device_id].buffer_index, len);
|
memcpy(
|
||||||
|
usbmem_response + 3,
|
||||||
|
usbmem_state[target_device_id].buffer +
|
||||||
|
usbmem_state[target_device_id].buffer_index,
|
||||||
|
len);
|
||||||
usbmem_state[target_device_id].buffer_index += len;
|
usbmem_state[target_device_id].buffer_index += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
usbmem_state[target_device_id].buffer_frame++;
|
usbmem_state[target_device_id].buffer_frame++;
|
||||||
|
|
||||||
uint16_t crc = crc16_msb(usbmem_response + 3, sizeof(usbmem_response) - 5, 0);
|
uint16_t crc =
|
||||||
|
crc16_msb(usbmem_response + 3, sizeof(usbmem_response) - 5, 0);
|
||||||
usbmem_response[sizeof(usbmem_response) - 2] = crc >> 8;
|
usbmem_response[sizeof(usbmem_response) - 2] = crc >> 8;
|
||||||
usbmem_response[sizeof(usbmem_response) - 1] = crc & 0xff;
|
usbmem_response[sizeof(usbmem_response) - 1] = crc & 0xff;
|
||||||
} else {
|
} else {
|
||||||
@@ -217,7 +235,8 @@ static HRESULT usbmem_write(struct irp *irp)
|
|||||||
log_misc(">%s", request);
|
log_misc(">%s", request);
|
||||||
|
|
||||||
// Try to detect device ID
|
// Try to detect device ID
|
||||||
// The only commands without a device ID are "sver", "start", and "init".
|
// The only commands without a device ID are "sver", "start", and
|
||||||
|
// "init".
|
||||||
char target_device_val = request[strlen(request) - 1];
|
char target_device_val = request[strlen(request) - 1];
|
||||||
char *target_device_id_ptr = strstr(request, " ");
|
char *target_device_id_ptr = strstr(request, " ");
|
||||||
if (target_device_id_ptr != NULL) {
|
if (target_device_id_ptr != NULL) {
|
||||||
@@ -237,18 +256,22 @@ static HRESULT usbmem_write(struct irp *irp)
|
|||||||
target_device_id = target_device_val == 'b' ? 0 : 1;
|
target_device_id = target_device_val == 'b' ? 0 : 1;
|
||||||
|
|
||||||
if (!usbmem_enabled) {
|
if (!usbmem_enabled) {
|
||||||
// Ignore all other USB device specific commands and pretend a device isn't plugged in
|
// Ignore all other USB device specific commands and pretend a
|
||||||
// when USB memory emulation is disabled.
|
// device isn't plugged in when USB memory emulation is
|
||||||
|
// disabled.
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
} else if (usbmem_state[target_device_id].errored) {
|
} else if (usbmem_state[target_device_id].errored) {
|
||||||
// If the device went through the entire process once and the file didn't exist
|
// If the device went through the entire process once and the
|
||||||
// then just force it to be disabled until the game is restarted because otherwise
|
// file didn't exist then just force it to be disabled until the
|
||||||
// it'll get stuck in a loop.
|
// game is restarted because otherwise it'll get stuck in a
|
||||||
// TODO: This could be better emulated by using a keybind to simulate inserting and
|
// loop.
|
||||||
// ejecting the USB drive to additionally clear the error flag.
|
// TODO: This could be better emulated by using a keybind to
|
||||||
|
// simulate inserting and ejecting the USB drive to additionally
|
||||||
|
// clear the error flag.
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
} else if (str_eq(request, "on_a") || str_eq(request, "on_b")) {
|
} else if (str_eq(request, "on_a") || str_eq(request, "on_b")) {
|
||||||
usbmem_state[target_device_id].connected = path_exists(usbmem_state[target_device_id].basepath);
|
usbmem_state[target_device_id].connected =
|
||||||
|
path_exists(usbmem_state[target_device_id].basepath);
|
||||||
usbmem_state[target_device_id].errored = false;
|
usbmem_state[target_device_id].errored = false;
|
||||||
|
|
||||||
usbmem_reset_file_state(target_device_id);
|
usbmem_reset_file_state(target_device_id);
|
||||||
@@ -256,21 +279,32 @@ static HRESULT usbmem_write(struct irp *irp)
|
|||||||
if (usbmem_state[target_device_id].connected)
|
if (usbmem_state[target_device_id].connected)
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
else
|
else
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"not connected");
|
||||||
} else if (str_eq(request, "offa") || str_eq(request, "offb")) {
|
} else if (str_eq(request, "offa") || str_eq(request, "offb")) {
|
||||||
if (usbmem_state[target_device_id].connected)
|
if (usbmem_state[target_device_id].connected)
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
else
|
else
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"not connected");
|
||||||
|
|
||||||
usbmem_state[target_device_id].connected = false;
|
usbmem_state[target_device_id].connected = false;
|
||||||
usbmem_reset_file_state(target_device_id);
|
usbmem_reset_file_state(target_device_id);
|
||||||
} else if (str_eq(request, "opna") || str_eq(request, "opnb")) {
|
} else if (str_eq(request, "opna") || str_eq(request, "opnb")) {
|
||||||
bool basepath_exists = path_exists(usbmem_state[target_device_id].basepath);
|
bool basepath_exists =
|
||||||
|
path_exists(usbmem_state[target_device_id].basepath);
|
||||||
|
|
||||||
if (!usbmem_state[target_device_id].connected || !basepath_exists) {
|
if (!usbmem_state[target_device_id].connected ||
|
||||||
|
!basepath_exists) {
|
||||||
usbmem_state[target_device_id].opened = false;
|
usbmem_state[target_device_id].opened = false;
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"not connected");
|
||||||
} else {
|
} else {
|
||||||
usbmem_state[target_device_id].opened = true;
|
usbmem_state[target_device_id].opened = true;
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
@@ -279,82 +313,132 @@ static HRESULT usbmem_write(struct irp *irp)
|
|||||||
if (usbmem_state[target_device_id].opened)
|
if (usbmem_state[target_device_id].opened)
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
else
|
else
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"not connected");
|
||||||
|
|
||||||
usbmem_state[target_device_id].opened = false;
|
usbmem_state[target_device_id].opened = false;
|
||||||
usbmem_reset_file_state(target_device_id);
|
usbmem_reset_file_state(target_device_id);
|
||||||
} else if (strncmp(request, "cda ", 4) == 0 || strncmp(request, "cdb ", 4) == 0) {
|
} else if (
|
||||||
|
strncmp(request, "cda ", 4) == 0 ||
|
||||||
|
strncmp(request, "cdb ", 4) == 0) {
|
||||||
char *path = request + 4;
|
char *path = request + 4;
|
||||||
|
|
||||||
if (!usbmem_state[target_device_id].connected || !usbmem_state[target_device_id].opened) {
|
if (!usbmem_state[target_device_id].connected ||
|
||||||
|
!usbmem_state[target_device_id].opened) {
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
} else if (path[1] == ':') {
|
} else if (path[1] == ':') {
|
||||||
// Absolute path
|
// Absolute path
|
||||||
char temp[MAX_PATH];
|
char temp[MAX_PATH];
|
||||||
snprintf(temp, sizeof(temp), "%s\\%s", usbmem_state[target_device_id].basepath, path + 3);
|
snprintf(
|
||||||
|
temp,
|
||||||
|
sizeof(temp),
|
||||||
|
"%s\\%s",
|
||||||
|
usbmem_state[target_device_id].basepath,
|
||||||
|
path + 3);
|
||||||
|
|
||||||
if (!path_exists(temp)) {
|
if (!path_exists(temp)) {
|
||||||
log_warning("Couldn't find path %s", temp);
|
log_warning("Couldn't find path %s", temp);
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(
|
||||||
|
usbmem_response, sizeof(usbmem_response), "done");
|
||||||
} else {
|
} else {
|
||||||
log_misc("Changing path to %s", temp);
|
log_misc("Changing path to %s", temp);
|
||||||
str_cpy(usbmem_state[target_device_id].path, sizeof(usbmem_state[target_device_id].path), temp);
|
str_cpy(
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
usbmem_state[target_device_id].path,
|
||||||
|
sizeof(usbmem_state[target_device_id].path),
|
||||||
|
temp);
|
||||||
|
str_cpy(
|
||||||
|
usbmem_response, sizeof(usbmem_response), "done");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
}
|
}
|
||||||
} else if (strncmp(request, "rda ", 4) == 0 || strncmp(request, "rdb ", 4) == 0) {
|
} else if (
|
||||||
|
strncmp(request, "rda ", 4) == 0 ||
|
||||||
|
strncmp(request, "rdb ", 4) == 0) {
|
||||||
usbmem_reset_file_state(target_device_id);
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
|
||||||
if (!usbmem_state[target_device_id].connected || !usbmem_state[target_device_id].opened) {
|
if (!usbmem_state[target_device_id].connected ||
|
||||||
|
!usbmem_state[target_device_id].opened) {
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
} else {
|
} else {
|
||||||
char temp[MAX_PATH] = {0};
|
char temp[MAX_PATH] = {0};
|
||||||
char *filename = request + 4;
|
char *filename = request + 4;
|
||||||
|
|
||||||
snprintf(temp, sizeof(temp), "%s\\%s", usbmem_state[target_device_id].path, filename);
|
snprintf(
|
||||||
|
temp,
|
||||||
|
sizeof(temp),
|
||||||
|
"%s\\%s",
|
||||||
|
usbmem_state[target_device_id].path,
|
||||||
|
filename);
|
||||||
|
|
||||||
if (usbmem_state[target_device_id].buffer) {
|
if (usbmem_state[target_device_id].buffer) {
|
||||||
free(usbmem_state[target_device_id].buffer);
|
free(usbmem_state[target_device_id].buffer);
|
||||||
usbmem_state[target_device_id].buffer = NULL;
|
usbmem_state[target_device_id].buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
usbmem_state[target_device_id].file_type = USBMEM_FILE_TYPE_NONE;
|
usbmem_state[target_device_id].file_type =
|
||||||
|
USBMEM_FILE_TYPE_NONE;
|
||||||
usbmem_state[target_device_id].buffer_len = 0;
|
usbmem_state[target_device_id].buffer_len = 0;
|
||||||
usbmem_state[target_device_id].buffer_index = 0;
|
usbmem_state[target_device_id].buffer_index = 0;
|
||||||
usbmem_state[target_device_id].buffer_frame = 0;
|
usbmem_state[target_device_id].buffer_frame = 0;
|
||||||
memset(usbmem_state[target_device_id].filename, 0, sizeof(usbmem_state[target_device_id].filename));
|
memset(
|
||||||
|
usbmem_state[target_device_id].filename,
|
||||||
|
0,
|
||||||
|
sizeof(usbmem_state[target_device_id].filename));
|
||||||
|
|
||||||
if (!path_exists(temp)) {
|
if (!path_exists(temp)) {
|
||||||
log_warning("Couldn't find file %s", temp);
|
log_warning("Couldn't find file %s", temp);
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(
|
||||||
|
usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
usbmem_state[target_device_id].errored = true;
|
usbmem_state[target_device_id].errored = true;
|
||||||
} else {
|
} else {
|
||||||
bool loaded = file_load(temp, (void**)&usbmem_state[target_device_id].buffer,
|
bool loaded = file_load(
|
||||||
&usbmem_state[target_device_id].buffer_len, false);
|
temp,
|
||||||
|
(void **) &usbmem_state[target_device_id].buffer,
|
||||||
|
&usbmem_state[target_device_id].buffer_len,
|
||||||
|
false);
|
||||||
|
|
||||||
if (loaded) {
|
if (loaded) {
|
||||||
log_misc("Reading file %s", temp);
|
log_misc("Reading file %s", temp);
|
||||||
usbmem_state[target_device_id].file_type = USBMEM_FILE_TYPE_READ;
|
usbmem_state[target_device_id].file_type =
|
||||||
|
USBMEM_FILE_TYPE_READ;
|
||||||
|
|
||||||
str_cpy(usbmem_state[target_device_id].filename, sizeof(usbmem_state[target_device_id].filename), filename);
|
str_cpy(
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "start");
|
usbmem_state[target_device_id].filename,
|
||||||
|
sizeof(usbmem_state[target_device_id].filename),
|
||||||
|
filename);
|
||||||
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"start");
|
||||||
} else {
|
} else {
|
||||||
log_warning("Couldn't read file %s", temp);
|
log_warning("Couldn't read file %s", temp);
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"fail");
|
||||||
usbmem_state[target_device_id].errored = true;
|
usbmem_state[target_device_id].errored = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strncmp(request, "wra ", 4) == 0 || strncmp(request, "wrb ", 4) == 0) {
|
} else if (
|
||||||
|
strncmp(request, "wra ", 4) == 0 ||
|
||||||
|
strncmp(request, "wrb ", 4) == 0) {
|
||||||
// Open file for writing
|
// Open file for writing
|
||||||
usbmem_reset_file_state(target_device_id);
|
usbmem_reset_file_state(target_device_id);
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not supported");
|
str_cpy(
|
||||||
} else if (strncmp(request, "wha ", 4) == 0 || strncmp(request, "whb ", 4) == 0) {
|
usbmem_response, sizeof(usbmem_response), "not supported");
|
||||||
|
} else if (
|
||||||
|
strncmp(request, "wha ", 4) == 0 ||
|
||||||
|
strncmp(request, "whb ", 4) == 0) {
|
||||||
// Something relating to writing?
|
// Something relating to writing?
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "not supported");
|
str_cpy(
|
||||||
} else if (strncmp(request, "lma ", 4) == 0 || strncmp(request, "lmb ", 4) == 0) {
|
usbmem_response, sizeof(usbmem_response), "not supported");
|
||||||
|
} else if (
|
||||||
|
strncmp(request, "lma ", 4) == 0 ||
|
||||||
|
strncmp(request, "lmb ", 4) == 0) {
|
||||||
// What is "lm"?
|
// What is "lm"?
|
||||||
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user