mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-25 08:25:25 -05:00
Compare commits
84 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efca967553 | ||
|
|
6c1bb3db82 | ||
|
|
bec809fbaa | ||
|
|
9775f2c853 | ||
|
|
26c9d7fe0a | ||
|
|
6b81cd7535 | ||
|
|
b3b6c3f499 | ||
|
|
0586ea50aa | ||
|
|
cafa60d0f6 | ||
|
|
76c2c49c13 | ||
|
|
6d38aa5f4a | ||
|
|
c1c5685e3a | ||
|
|
050e52b21e | ||
|
|
ab50c70f71 | ||
|
|
2223947dd8 | ||
|
|
0294eed22b | ||
|
|
d7235c3c2c | ||
|
|
402d0d4ca4 | ||
|
|
89fe822919 | ||
|
|
75583897c1 | ||
|
|
58d297458c | ||
|
|
ba528488f0 | ||
|
|
7692e14b0b | ||
|
|
4cc81f48f3 | ||
|
|
da736d2968 | ||
|
|
c3f9ce7e91 | ||
|
|
41de45d459 | ||
|
|
bda239a2ba | ||
|
|
1e32d1a9a8 | ||
|
|
852d770629 | ||
|
|
4be866e69e | ||
|
|
537b1fa384 | ||
|
|
bd2d722031 | ||
|
|
4f8f6c0f7a | ||
|
|
51a018b0cf | ||
|
|
04442a6dbc | ||
|
|
85a080e6b3 | ||
|
|
28633ded37 | ||
|
|
721897d7b0 | ||
|
|
926bbf2e10 | ||
|
|
ce75e149f7 | ||
|
|
57d9d976ff | ||
|
|
7e731916e2 | ||
|
|
dd9b8faafe | ||
|
|
50ff026b85 | ||
|
|
0ff6134b79 | ||
|
|
ae35b859d9 | ||
|
|
3cf3d44945 | ||
|
|
2a80083af2 | ||
|
|
66e0467ad3 | ||
|
|
c5f0116294 | ||
|
|
ddfa814387 | ||
|
|
088d4bf338 | ||
|
|
f1a7621e2b | ||
|
|
4a3d5fa189 | ||
|
|
0f2828da40 | ||
|
|
ba2016b5bc | ||
|
|
b42c9aa93b | ||
|
|
8de259c639 | ||
|
|
0d54587787 | ||
|
|
4721ba2d3c | ||
|
|
1105a2a130 | ||
|
|
8ab92872ad | ||
|
|
a16dc82cef | ||
|
|
729f5abcc0 | ||
|
|
6e0e5031ac | ||
|
|
f17e8d6739 | ||
|
|
ac02609948 | ||
|
|
c644db03ae | ||
|
|
7d5398b6af | ||
|
|
cac09f8f87 | ||
|
|
85c9c444f1 | ||
|
|
8f2ce1f1b3 | ||
|
|
d3bf381a4f | ||
|
|
3acbc7f251 | ||
|
|
839903ab48 | ||
|
|
c929141e71 | ||
|
|
1477480836 | ||
|
|
bf4322e855 | ||
|
|
3eed0a4ab3 | ||
|
|
a9ade9d9d4 | ||
|
|
26336805d2 | ||
|
|
7d0e916b9f | ||
|
|
a03a5604ec |
145
.gitlab-ci.yml
145
.gitlab-ci.yml
@@ -1,55 +1,136 @@
|
|||||||
|
#
|
||||||
|
# This pipeline requires packages to be switched on under the repository settings. Otherwise, you will 403s when
|
||||||
|
# uploading to the package repo is triggered.
|
||||||
|
#
|
||||||
|
# Variables to setup in GitLab CI/CD settings of the project
|
||||||
|
#
|
||||||
|
# The variables with BASE64 postfixes need to contain the base64 encoded data. Otherwise, masking
|
||||||
|
# in GitLab won't work due to not matching their pre-defined regex
|
||||||
|
#
|
||||||
|
# CI_PIGSTALL_DATA_PREFIX_BASE64
|
||||||
|
# CI_PIGSTALL_LINK_BASE64
|
||||||
|
# CI_PIGSTALL_PHP_SESSION_ID
|
||||||
|
# CI_PIGSTALL_SESSION_BASE64
|
||||||
|
#
|
||||||
|
# CI_TOOLS_UPLOAD_KEY
|
||||||
|
# CI_TOOLS_UPLOAD_URL
|
||||||
|
# CI_TOOLS_URL
|
||||||
|
|
||||||
image: docker:stable
|
image: docker:stable
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
DOCKER_TLS_CERTDIR: "/certs"
|
DOCKER_TLS_CERTDIR: "/certs"
|
||||||
|
DIST_PACKAGE_RELATIVE_PATH: "build/docker/bemanitools.zip"
|
||||||
|
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bemanitools"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- docker:19.03.8-dind
|
- docker:19.03.8-dind
|
||||||
|
|
||||||
before_script:
|
|
||||||
- docker info
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
- upload-release
|
- upload
|
||||||
|
- release
|
||||||
|
|
||||||
build-master:
|
build:
|
||||||
stage: build
|
stage: build
|
||||||
before_script:
|
|
||||||
- apk update && apk add make > /dev/null
|
|
||||||
script:
|
|
||||||
- make build-docker
|
|
||||||
- mv build/docker/bemanitools.zip bemanitools.zip
|
|
||||||
artifacts:
|
|
||||||
name: "$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME"
|
|
||||||
paths:
|
|
||||||
- bemanitools.zip
|
|
||||||
only:
|
only:
|
||||||
refs:
|
refs:
|
||||||
- master
|
- master
|
||||||
|
- tags
|
||||||
build-tags:
|
|
||||||
stage: build
|
|
||||||
before_script:
|
before_script:
|
||||||
- apk update && apk add make > /dev/null
|
- apk update && apk add make > /dev/null
|
||||||
script:
|
script:
|
||||||
- make build-docker
|
- make build-docker
|
||||||
- mv build/docker/bemanitools.zip bemanitools.zip
|
|
||||||
artifacts:
|
artifacts:
|
||||||
name: "$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME"
|
|
||||||
paths:
|
paths:
|
||||||
- bemanitools.zip
|
- build
|
||||||
only:
|
expire_in: 1 week
|
||||||
- tags
|
|
||||||
|
|
||||||
upload-release:
|
upload-package-registry:
|
||||||
stage: upload-release
|
stage: upload
|
||||||
dependencies:
|
image: curlimages/curl:latest
|
||||||
- build-tags
|
|
||||||
before_script:
|
|
||||||
- apk update && apk add curl > /dev/null
|
|
||||||
script:
|
|
||||||
- echo "Uploading ${CI_PROJECT_NAME}-${CI_COMMIT_TAG}..."
|
|
||||||
- curl --silent --show-error -F "key=${CI_UPLOAD_KEY}" -F "filename=${CI_PROJECT_NAME}-v${CI_COMMIT_TAG}.zip" -F "file=@./bemanitools.zip" ${CI_UPLOAD_URL}
|
|
||||||
only:
|
only:
|
||||||
- tags
|
refs:
|
||||||
|
- master
|
||||||
|
- tags
|
||||||
|
dependencies:
|
||||||
|
- build
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
if [ "${CI_COMMIT_TAG}" ]; then
|
||||||
|
version="${CI_COMMIT_TAG}"
|
||||||
|
else
|
||||||
|
version="${CI_COMMIT_SHORT_SHA}"
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
curl \
|
||||||
|
--silent \
|
||||||
|
--fail \
|
||||||
|
--show-error \
|
||||||
|
--header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
||||||
|
--upload-file "${DIST_PACKAGE_RELATIVE_PATH}" \
|
||||||
|
$PACKAGE_REGISTRY_URL/${version}/bemanitools.zip
|
||||||
|
|
||||||
|
upload-tools-page:
|
||||||
|
stage: upload
|
||||||
|
image: curlimages/curl:latest
|
||||||
|
only:
|
||||||
|
refs:
|
||||||
|
- tags
|
||||||
|
dependencies:
|
||||||
|
- build
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
curl \
|
||||||
|
--silent \
|
||||||
|
--fail \
|
||||||
|
--show-error \
|
||||||
|
--connect-timeout 5 \
|
||||||
|
--max-time 10 \
|
||||||
|
--retry 5 \
|
||||||
|
-F "key=${CI_TOOLS_UPLOAD_KEY}" \
|
||||||
|
-F "filename=${CI_PROJECT_NAME}-v${CI_COMMIT_TAG}.zip" \
|
||||||
|
-F "file=@${DIST_PACKAGE_RELATIVE_PATH}" \
|
||||||
|
${CI_TOOLS_UPLOAD_URL}
|
||||||
|
|
||||||
|
release-gitlab:
|
||||||
|
stage: release
|
||||||
|
image: registry.gitlab.com/gitlab-org/release-cli:v0.8.0
|
||||||
|
only:
|
||||||
|
refs:
|
||||||
|
- tags
|
||||||
|
script:
|
||||||
|
- version="$CI_COMMIT_TAG"
|
||||||
|
- release_message="$(scripts/ci/create-release-message.sh "${version}" < CHANGELOG.md)"
|
||||||
|
- |
|
||||||
|
release-cli create \
|
||||||
|
--name "bemanitools ${version}" \
|
||||||
|
--description="${release_message}" \
|
||||||
|
--tag-name ${version} \
|
||||||
|
--assets-link "{\"name\":\"Distribution binaries\",\"url\":\"${PACKAGE_REGISTRY_URL}/${version}/bemanitools.zip\"}"
|
||||||
|
|
||||||
|
release-pigstall:
|
||||||
|
stage: release
|
||||||
|
image: curlimages/curl:latest
|
||||||
|
only:
|
||||||
|
refs:
|
||||||
|
- tags
|
||||||
|
script:
|
||||||
|
- version="${CI_COMMIT_TAG}"
|
||||||
|
- changelog_excerpt="$(scripts/ci/create-release-message.sh "${version}" < CHANGELOG.md)"
|
||||||
|
- release_message="$(printf "bemanitools ${version} released\n${CI_TOOLS_URL}/bemanitools-v${version}.zip\n${changelog_excerpt}")"
|
||||||
|
- session="$(echo "$CI_PIGSTALL_SESSION_BASE64" | base64 -d)"
|
||||||
|
- data_prefix="$(echo "$CI_PIGSTALL_DATA_PREFIX_BASE64" | base64 -d)"
|
||||||
|
- link="$(echo "$CI_PIGSTALL_LINK_BASE64" | base64 -d)"
|
||||||
|
- |
|
||||||
|
curl \
|
||||||
|
--silent \
|
||||||
|
--fail \
|
||||||
|
--connect-timeout 5 \
|
||||||
|
--max-time 10 \
|
||||||
|
--retry 5 \
|
||||||
|
--show-error \
|
||||||
|
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||||
|
-H "Cookie: PHPSESSID=$CI_PIGSTALL_PHP_SESSION_ID; session=${session}" \
|
||||||
|
--data-raw "${data_prefix}&body=${release_message}" \
|
||||||
|
"${link}"
|
||||||
|
|||||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -1,7 +1,33 @@
|
|||||||
# Release history
|
# Release history
|
||||||
|
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.
|
||||||
|
|
||||||
|
## 5.40
|
||||||
|
* Feature: Support DDR X and X2 US/EU using ddrhook1 including memory card emulation
|
||||||
|
* Fix: sdvxhook2 crashing on some OS versions
|
||||||
|
* Feature: Support sdvx generator lights in sdvxio
|
||||||
|
|
||||||
|
## 5.39
|
||||||
|
* jbhook3: Fix window mode, remove window frame option, add show cursor on window option
|
||||||
|
* Code simplification and cleanup round plug modules
|
||||||
|
* Code structure improvements p3io jubeat
|
||||||
|
|
||||||
|
## 5.38
|
||||||
|
* sdvxhook2: Support sound voltex exceed gear
|
||||||
|
|
||||||
|
## 5.37
|
||||||
|
* jbhook1: Support jubeat (1) and ripples
|
||||||
|
* jbhook2: Support jubeat knit and copious
|
||||||
|
* jbhook3: Support jubeat saucer, prop, qubell, clan and festo
|
||||||
|
|
||||||
|
## 5.36
|
||||||
|
* iidxhook9: Support for IIDX28
|
||||||
|
* Various bugfixes
|
||||||
|
|
||||||
## 5.35
|
## 5.35
|
||||||
* Jubeat: Add jbio-p4io
|
* Jubeat: Add jbio-p4io
|
||||||
* Nostalgia: Add nostio-panb
|
* Nostalgia: Add nostio-panb
|
||||||
|
* Misc: Add wavepass support to aciodrv-icca (and eamio-icca)
|
||||||
* Misc: Refactor aciodrv to support multiple devices using the same port (with aciomgr)
|
* Misc: Refactor aciodrv to support multiple devices using the same port (with aciomgr)
|
||||||
* Misc: Fix d3d9ex windowed hook not behaving correctly (size/framed)
|
* Misc: Fix d3d9ex windowed hook not behaving correctly (size/framed)
|
||||||
* Misc: Fix docs not being included with release
|
* Misc: Fix docs not being included with release
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ $$(dll_$1_$2_$3) $$(implib_$1_$2_$3): $$(obj_$1_$2_$3) $$(abslib_$1_$2_$3) \
|
|||||||
$(V)echo ... $$(dll_$1_$2_$3)
|
$(V)echo ... $$(dll_$1_$2_$3)
|
||||||
$(V)$$(toolchain_$1)gcc -shared \
|
$(V)$$(toolchain_$1)gcc -shared \
|
||||||
-o $$(dll_$1_$2_$3) -Wl,--out-implib,$$(implib_$1_$2_$3) \
|
-o $$(dll_$1_$2_$3) -Wl,--out-implib,$$(implib_$1_$2_$3) \
|
||||||
$$^ $$(ldflags_$3)
|
-Wl,--start-group $$^ -Wl,--end-group $$(ldflags_$3)
|
||||||
$(V)$$(toolchain_$1)strip $$(dll_$1_$2_$3)
|
$(V)$$(toolchain_$1)strip $$(dll_$1_$2_$3)
|
||||||
$(V)$$(toolchain_$1)ranlib $$(implib_$1_$2_$3)
|
$(V)$$(toolchain_$1)ranlib $$(implib_$1_$2_$3)
|
||||||
|
|
||||||
|
|||||||
161
Module.mk
161
Module.mk
@@ -26,7 +26,8 @@
|
|||||||
# 8: Patch 3: beatmania IIDX 16 Empress
|
# 8: Patch 3: beatmania IIDX 16 Empress
|
||||||
# jubeat
|
# jubeat
|
||||||
#
|
#
|
||||||
# 10: Patch 4: DanceDanceRevolution X2
|
# 10: Patch 2: jubeat Knit
|
||||||
|
# Patch 4: DanceDanceRevolution X2
|
||||||
#
|
#
|
||||||
# 11: Patch 1: beatmania IIDX 18 Resort Anthem
|
# 11: Patch 1: beatmania IIDX 18 Resort Anthem
|
||||||
# pop'n music 19 Tune Street
|
# pop'n music 19 Tune Street
|
||||||
@@ -71,7 +72,7 @@ cflags += \
|
|||||||
# Each AVS-dependent project should consume the earliest AVS import definition
|
# Each AVS-dependent project should consume the earliest AVS import definition
|
||||||
# that is still ABI-compatible with the real build its target links against.
|
# that is still ABI-compatible with the real build its target links against.
|
||||||
|
|
||||||
avsvers_32 := 1700 1603 1601 1508 1403 1304 1101 803 0
|
avsvers_32 := 1700 1603 1601 1508 1403 1304 1101 1002 803 0
|
||||||
avsvers_64 := 1700 1603 1601 1509 1508
|
avsvers_64 := 1700 1603 1601 1509 1508
|
||||||
|
|
||||||
imps += avs avs-ea3
|
imps += avs avs-ea3
|
||||||
@@ -91,7 +92,9 @@ include src/main/camhook/Module.mk
|
|||||||
include src/main/cconfig/Module.mk
|
include src/main/cconfig/Module.mk
|
||||||
include src/main/config/Module.mk
|
include src/main/config/Module.mk
|
||||||
include src/main/d3d9exhook/Module.mk
|
include src/main/d3d9exhook/Module.mk
|
||||||
include src/main/ddrhook/Module.mk
|
include src/main/ddrhook-util/Module.mk
|
||||||
|
include src/main/ddrhook1/Module.mk
|
||||||
|
include src/main/ddrhook2/Module.mk
|
||||||
include src/main/ddrio-mm/Module.mk
|
include src/main/ddrio-mm/Module.mk
|
||||||
include src/main/ddrio-smx/Module.mk
|
include src/main/ddrio-smx/Module.mk
|
||||||
include src/main/ddrio/Module.mk
|
include src/main/ddrio/Module.mk
|
||||||
@@ -135,12 +138,15 @@ include src/main/iidxio-ezusb2/Module.mk
|
|||||||
include src/main/iidxio/Module.mk
|
include src/main/iidxio/Module.mk
|
||||||
include src/main/iidxiotest/Module.mk
|
include src/main/iidxiotest/Module.mk
|
||||||
include src/main/inject/Module.mk
|
include src/main/inject/Module.mk
|
||||||
include src/main/jbhook/Module.mk
|
|
||||||
include src/main/jbhook1/Module.mk
|
|
||||||
include src/main/jbio-magicbox/Module.mk
|
include src/main/jbio-magicbox/Module.mk
|
||||||
include src/main/jbio-p4io/Module.mk
|
include src/main/jbio-p4io/Module.mk
|
||||||
include src/main/jbio/Module.mk
|
include src/main/jbio/Module.mk
|
||||||
include src/main/jbiotest/Module.mk
|
include src/main/jbiotest/Module.mk
|
||||||
|
include src/main/jbhook-util/Module.mk
|
||||||
|
include src/main/jbhook-util-p3io/Module.mk
|
||||||
|
include src/main/jbhook1/Module.mk
|
||||||
|
include src/main/jbhook2/Module.mk
|
||||||
|
include src/main/jbhook3/Module.mk
|
||||||
include src/main/launcher/Module.mk
|
include src/main/launcher/Module.mk
|
||||||
include src/main/mempatch-hook/Module.mk
|
include src/main/mempatch-hook/Module.mk
|
||||||
include src/main/mm/Module.mk
|
include src/main/mm/Module.mk
|
||||||
@@ -365,7 +371,7 @@ $(zipdir)/iidx-25-to-26.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/iidx-27.zip: \
|
$(zipdir)/iidx-27-to-28.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 \
|
||||||
@@ -375,7 +381,9 @@ $(zipdir)/iidx-27.zip: \
|
|||||||
build/bin/indep-64/vefxio.dll \
|
build/bin/indep-64/vefxio.dll \
|
||||||
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/iidxhook-27.conf \
|
dist/iidx/iidxhook-27.conf \
|
||||||
|
dist/iidx/iidxhook-28.conf \
|
||||||
dist/iidx/vefx.txt \
|
dist/iidx/vefx.txt \
|
||||||
| $(zipdir)/
|
| $(zipdir)/
|
||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
@@ -421,28 +429,68 @@ $(zipdir)/jb-01.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/jb-02.zip: \
|
||||||
|
build/bin/avs2_1002-32/jbhook1.dll \
|
||||||
|
build/bin/indep-32/inject.exe \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
build/bin/indep-32/jbio.dll \
|
||||||
|
dist/jb/config.bat \
|
||||||
|
dist/jb/gamestart-02.bat \
|
||||||
|
dist/jb/jbhook-02.conf \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/jb-03.zip: \
|
||||||
|
build/bin/avs2_1101-32/jbhook2.dll \
|
||||||
|
build/bin/avs2_1101-32/launcher.exe \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
build/bin/indep-32/jbio.dll \
|
||||||
|
dist/jb/config.bat \
|
||||||
|
dist/jb/gamestart-03.bat \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/jb-04.zip: \
|
||||||
|
build/bin/avs2_1304-32/jbhook2.dll \
|
||||||
|
build/bin/avs2_1304-32/launcher.exe \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
build/bin/indep-32/jbio.dll \
|
||||||
|
dist/jb/config.bat \
|
||||||
|
dist/jb/gamestart-03.bat \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/jb-05-to-07.zip: \
|
$(zipdir)/jb-05-to-07.zip: \
|
||||||
build/bin/avs2_1508-32/jbhook.dll \
|
build/bin/avs2_1508-32/jbhook3.dll \
|
||||||
build/bin/avs2_1508-32/launcher.exe \
|
build/bin/avs2_1508-32/launcher.exe \
|
||||||
build/bin/indep-32/config.exe \
|
build/bin/indep-32/config.exe \
|
||||||
build/bin/indep-32/eamio.dll \
|
build/bin/indep-32/eamio.dll \
|
||||||
build/bin/indep-32/geninput.dll \
|
build/bin/indep-32/geninput.dll \
|
||||||
build/bin/indep-32/jbio.dll \
|
build/bin/indep-32/jbio.dll \
|
||||||
dist/jb/config.bat \
|
dist/jb/config.bat \
|
||||||
dist/jb/gamestart.bat \
|
dist/jb/gamestart-04.bat \
|
||||||
| $(zipdir)/
|
| $(zipdir)/
|
||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/jb-08.zip: \
|
$(zipdir)/jb-08.zip: \
|
||||||
build/bin/avs2_1700-32/jbhook.dll \
|
build/bin/avs2_1700-32/jbhook3.dll \
|
||||||
build/bin/avs2_1700-32/launcher.exe \
|
build/bin/avs2_1700-32/launcher.exe \
|
||||||
build/bin/indep-32/config.exe \
|
build/bin/indep-32/config.exe \
|
||||||
build/bin/indep-32/eamio.dll \
|
build/bin/indep-32/eamio.dll \
|
||||||
build/bin/indep-32/geninput.dll \
|
build/bin/indep-32/geninput.dll \
|
||||||
build/bin/indep-32/jbio.dll \
|
build/bin/indep-32/jbio.dll \
|
||||||
dist/jb/config.bat \
|
dist/jb/config.bat \
|
||||||
dist/jb/gamestart.bat \
|
dist/jb/gamestart-04.bat \
|
||||||
| $(zipdir)/
|
| $(zipdir)/
|
||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
@@ -471,7 +519,7 @@ $(zipdir)/sdvx-01-to-04.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/sdvx-05.zip: \
|
$(zipdir)/sdvx-05-to-06.zip: \
|
||||||
build/bin/avs2_1700-64/launcher.exe \
|
build/bin/avs2_1700-64/launcher.exe \
|
||||||
build/bin/avs2_1700-64/sdvxhook2.dll \
|
build/bin/avs2_1700-64/sdvxhook2.dll \
|
||||||
build/bin/indep-64/config.exe \
|
build/bin/indep-64/config.exe \
|
||||||
@@ -519,10 +567,48 @@ $(zipdir)/sdvx-hwio-x64.zip: \
|
|||||||
$(V)echo ... $@
|
$(V)echo ... $@
|
||||||
$(V)zip -j $@ $^
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
$(zipdir)/ddr-12-to-16.zip: \
|
$(zipdir)/ddr-11.zip: \
|
||||||
build/bin/avs2_1508-32/launcher.exe \
|
build/bin/indep-32/inject.exe \
|
||||||
build/bin/avs2_1508-32/ddrhook.dll \
|
build/bin/avs2_803-32/ddrhook1.dll \
|
||||||
build/bin/avs2_1508-32/unicorntail.dll \
|
build/bin/avs2_803-32/unicorntail.dll \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/ddrio.dll \
|
||||||
|
build/bin/indep-32/ddrio-mm.dll \
|
||||||
|
build/bin/indep-32/ddrio-smx.dll \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
dist/ddr/config.bat \
|
||||||
|
dist/ddr/gamestart-11.bat \
|
||||||
|
dist/ddr/gamestart-11-us.bat \
|
||||||
|
dist/ddr/ddr-11.conf \
|
||||||
|
dist/ddr/ddr-11-us.conf \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/ddr-12-us.zip: \
|
||||||
|
build/bin/indep-32/inject.exe \
|
||||||
|
build/bin/avs2_1002-32/ddrhook1.dll \
|
||||||
|
build/bin/avs2_1002-32/unicorntail.dll \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/ddrio.dll \
|
||||||
|
build/bin/indep-32/ddrio-mm.dll \
|
||||||
|
build/bin/indep-32/ddrio-smx.dll \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
dist/ddr/config.bat \
|
||||||
|
dist/ddr/gamestart-12-us.bat \
|
||||||
|
dist/ddr/gamestart-12-eu.bat \
|
||||||
|
dist/ddr/ddr-12-us.conf \
|
||||||
|
dist/ddr/ddr-12-eu.conf \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/ddr-12.zip: \
|
||||||
|
build/bin/avs2_1002-32/launcher.exe \
|
||||||
|
build/bin/avs2_1002-32/ddrhook2.dll \
|
||||||
|
build/bin/avs2_1002-32/unicorntail.dll \
|
||||||
build/bin/indep-32/config.exe \
|
build/bin/indep-32/config.exe \
|
||||||
build/bin/indep-32/ddrio.dll \
|
build/bin/indep-32/ddrio.dll \
|
||||||
build/bin/indep-32/ddrio-mm.dll \
|
build/bin/indep-32/ddrio-mm.dll \
|
||||||
@@ -531,7 +617,37 @@ $(zipdir)/ddr-12-to-16.zip: \
|
|||||||
build/bin/indep-32/geninput.dll \
|
build/bin/indep-32/geninput.dll \
|
||||||
dist/ddr/config.bat \
|
dist/ddr/config.bat \
|
||||||
dist/ddr/gamestart-12.bat \
|
dist/ddr/gamestart-12.bat \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/ddr-13.zip: \
|
||||||
|
build/bin/avs2_1304-32/launcher.exe \
|
||||||
|
build/bin/avs2_1304-32/ddrhook2.dll \
|
||||||
|
build/bin/avs2_1304-32/unicorntail.dll \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/ddrio.dll \
|
||||||
|
build/bin/indep-32/ddrio-mm.dll \
|
||||||
|
build/bin/indep-32/ddrio-smx.dll \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
dist/ddr/config.bat \
|
||||||
dist/ddr/gamestart-13.bat \
|
dist/ddr/gamestart-13.bat \
|
||||||
|
| $(zipdir)/
|
||||||
|
$(V)echo ... $@
|
||||||
|
$(V)zip -j $@ $^
|
||||||
|
|
||||||
|
$(zipdir)/ddr-14-to-16.zip: \
|
||||||
|
build/bin/avs2_1508-32/launcher.exe \
|
||||||
|
build/bin/avs2_1508-32/ddrhook2.dll \
|
||||||
|
build/bin/avs2_1508-32/unicorntail.dll \
|
||||||
|
build/bin/indep-32/config.exe \
|
||||||
|
build/bin/indep-32/ddrio.dll \
|
||||||
|
build/bin/indep-32/ddrio-mm.dll \
|
||||||
|
build/bin/indep-32/ddrio-smx.dll \
|
||||||
|
build/bin/indep-32/eamio.dll \
|
||||||
|
build/bin/indep-32/geninput.dll \
|
||||||
|
dist/ddr/config.bat \
|
||||||
dist/ddr/gamestart-14.bat \
|
dist/ddr/gamestart-14.bat \
|
||||||
dist/ddr/gamestart-15.bat \
|
dist/ddr/gamestart-15.bat \
|
||||||
dist/ddr/gamestart-16.bat \
|
dist/ddr/gamestart-16.bat \
|
||||||
@@ -541,7 +657,7 @@ $(zipdir)/ddr-12-to-16.zip: \
|
|||||||
|
|
||||||
$(zipdir)/ddr-16-x64.zip: \
|
$(zipdir)/ddr-16-x64.zip: \
|
||||||
build/bin/avs2_1603-64/launcher.exe \
|
build/bin/avs2_1603-64/launcher.exe \
|
||||||
build/bin/avs2_1603-64/ddrhook.dll \
|
build/bin/avs2_1603-64/ddrhook2.dll \
|
||||||
build/bin/avs2_1603-64/unicorntail.dll \
|
build/bin/avs2_1603-64/unicorntail.dll \
|
||||||
build/bin/indep-64/config.exe \
|
build/bin/indep-64/config.exe \
|
||||||
build/bin/indep-64/ddrio.dll \
|
build/bin/indep-64/ddrio.dll \
|
||||||
@@ -603,7 +719,11 @@ $(BUILDDIR)/tests.zip: \
|
|||||||
|
|
||||||
$(BUILDDIR)/bemanitools.zip: \
|
$(BUILDDIR)/bemanitools.zip: \
|
||||||
$(zipdir)/bst.zip \
|
$(zipdir)/bst.zip \
|
||||||
$(zipdir)/ddr-12-to-16.zip \
|
$(zipdir)/ddr-11.zip \
|
||||||
|
$(zipdir)/ddr-12.zip \
|
||||||
|
$(zipdir)/ddr-12-us.zip \
|
||||||
|
$(zipdir)/ddr-13.zip \
|
||||||
|
$(zipdir)/ddr-14-to-16.zip \
|
||||||
$(zipdir)/ddr-16-x64.zip \
|
$(zipdir)/ddr-16-x64.zip \
|
||||||
$(zipdir)/doc.zip \
|
$(zipdir)/doc.zip \
|
||||||
$(zipdir)/iidx-09-to-12.zip \
|
$(zipdir)/iidx-09-to-12.zip \
|
||||||
@@ -614,15 +734,18 @@ $(BUILDDIR)/bemanitools.zip: \
|
|||||||
$(zipdir)/iidx-20.zip \
|
$(zipdir)/iidx-20.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.zip \
|
$(zipdir)/iidx-27-to-28.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 \
|
||||||
|
$(zipdir)/jb-02.zip \
|
||||||
|
$(zipdir)/jb-03.zip \
|
||||||
|
$(zipdir)/jb-04.zip \
|
||||||
$(zipdir)/jb-05-to-07.zip \
|
$(zipdir)/jb-05-to-07.zip \
|
||||||
$(zipdir)/jb-08.zip \
|
$(zipdir)/jb-08.zip \
|
||||||
$(zipdir)/jb-hwio.zip \
|
$(zipdir)/jb-hwio.zip \
|
||||||
$(zipdir)/sdvx-01-to-04.zip \
|
$(zipdir)/sdvx-01-to-04.zip \
|
||||||
$(zipdir)/sdvx-05.zip \
|
$(zipdir)/sdvx-05-to-06.zip \
|
||||||
$(zipdir)/sdvx-05-cn.zip \
|
$(zipdir)/sdvx-05-cn.zip \
|
||||||
$(zipdir)/sdvx-hwio-x86.zip \
|
$(zipdir)/sdvx-hwio-x86.zip \
|
||||||
$(zipdir)/sdvx-hwio-x64.zip \
|
$(zipdir)/sdvx-hwio-x64.zip \
|
||||||
|
|||||||
91
README.md
91
README.md
@@ -1,7 +1,7 @@
|
|||||||
# Bemanitools 5
|
# Bemanitools 5
|
||||||
[](https://dev.s-ul.net/djhackers/bemanitools/commits/master)
|
[](https://dev.s-ul.net/djhackers/bemanitools/commits/master)
|
||||||
|
|
||||||
Version: 5.35
|
Version: 5.40
|
||||||
|
|
||||||
[Release history](CHANGELOG.md)
|
[Release history](CHANGELOG.md)
|
||||||
|
|
||||||
@@ -26,48 +26,57 @@ The tl;dr version and golden rules of the sections in the document:
|
|||||||
* [Everyone is allowed to submit changes which are not just limited to code by opening merge requests](CONTRIBUTING.md#pull-requests-bugfixes-new-features-or-other-code-contributions)
|
* [Everyone is allowed to submit changes which are not just limited to code by opening merge requests](CONTRIBUTING.md#pull-requests-bugfixes-new-features-or-other-code-contributions)
|
||||||
* [Documentation improvements can and even should be contributed by non developers](CONTRIBUTING.md#pull-requests-bugfixes-new-features-or-other-code-contributions)
|
* [Documentation improvements can and even should be contributed by non developers](CONTRIBUTING.md#pull-requests-bugfixes-new-features-or-other-code-contributions)
|
||||||
|
|
||||||
## List of supported games (hook libraries)
|
## Supported games
|
||||||
|
The following games are supported with their corresponding hook-libraries.
|
||||||
|
|
||||||
* BeatStream
|
* BeatStream
|
||||||
* BeatStream (bst.zip) using bsthook
|
* BeatStream (`bst.zip`): bsthook
|
||||||
* BeatStream アニムトライヴ (bst.zip) using bsthook
|
* BeatStream アニムトライヴ (`bst.zip`): bsthook
|
||||||
* Dance Dance Revolution
|
* [Dance Dance Revolution](doc/ddrhook/README.md)
|
||||||
* Dance Dance Revolution X2 (ddr-12-to-16.zip) using ddrhook
|
* Dance Dance Revolution X (`ddr-11.zip`): [ddrhook1](doc/ddrhook/ddrhook1.md)
|
||||||
* Dance Dance Revolution X3 vs. 2ndMIX (ddr-12-to-16.zip) using ddrhook
|
* Dance Dance Revolution X2 (US/EU regions) (`ddr-12-us.zip`): [ddrhook1](doc/ddrhook/ddrhook1.md)
|
||||||
* Dance Dance Revolution 2013 (ddr-12-to-16.zip) using ddrhook
|
* Dance Dance Revolution X2 (JP region) (`ddr-12.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md)
|
||||||
* Dance Dance Revolution 2014 (ddr-12-to-16.zip) using ddrhook
|
* Dance Dance Revolution 2013 (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md)
|
||||||
* Dance Dance Revolution A (ddr-12-to-16.zip) using ddrhook
|
* Dance Dance Revolution 2014 (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md)
|
||||||
* Beatmania IIDX
|
* Dance Dance Revolution A (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md)
|
||||||
* Beatmania IIDX 9th Style (iidx-09-to-12.zip) using [iidxhook1](doc/iidxhook/iidxhook1.md)
|
* [Beatmania IIDX](doc/iidxhook/README.md)
|
||||||
* Beatmania IIDX 10th Style (iidx-09-to-12.zip) using [iidxhook1](doc/iidxhook/iidxhook1.md)
|
* Beatmania IIDX 9th Style (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md)
|
||||||
* Beatmania IIDX 11 IIDX RED (iidx-09-to-12.zip) using [iidxhook1](doc/iidxhook/iidxhook1.md)
|
* Beatmania IIDX 10th Style (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md)
|
||||||
* Beatmania IIDX 12 HAPPY SKY (iidx-09-to-12.zip) using [iidxhook1](doc/iidxhook/iidxhook1.md)
|
* Beatmania IIDX 11 IIDX RED (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md)
|
||||||
* Beatmania IIDX 13 DistorteD (iidx-13.zip) using [iidxhook2](doc/iidxhook/iidxhook2.md)
|
* Beatmania IIDX 12 HAPPY SKY (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md)
|
||||||
* Beatmania IIDX 14 GOLD (iidx-14-to-17.zip) using [iidxhook3](doc/iidxhook/iidxhook3.md)
|
* Beatmania IIDX 13 DistorteD (`iidx-13.zip`): [iidxhook2](doc/iidxhook/iidxhook2.md)
|
||||||
* Beatmania IIDX 15 DJ TROOPERS (iidx-14-to-17.zip) using [iidxhook3](doc/iidxhook/iidxhook3.md)
|
* Beatmania IIDX 14 GOLD (`iidx-14-to-17.zip`): [iidxhook3](doc/iidxhook/iidxhook3.md)
|
||||||
* Beatmania IIDX 16 EMPRESS (iidx-14-to-17.zip) using [iidxhook3](doc/iidxhook/iidxhook3.md)
|
* Beatmania IIDX 15 DJ TROOPERS (`iidx-14-to-17.zip`): [iidxhook3](doc/iidxhook/iidxhook3.md)
|
||||||
* Beatmania IIDX 17 SIRIUS (iidx-14-to-17.zip) using [iidxhook3](doc/iidxhook/iidxhook3.md)
|
* Beatmania IIDX 16 EMPRESS (`iidx-14-to-17.zip`): [iidxhook3](doc/iidxhook/iidxhook3.md)
|
||||||
* Beatmania IIDX 18 Resort Anthem (iidx-18.zip) using [iidxhook4](doc/iidxhook/iidxhook4.md)
|
* Beatmania IIDX 17 SIRIUS (`iidx-14-to-17.zip`): [iidxhook3](doc/iidxhook/iidxhook3.md)
|
||||||
* Beatmania IIDX 19 Lincle (iidx-19.zip) using [iidxhook5](doc/iidxhook/iidxhook5.md)
|
* Beatmania IIDX 18 Resort Anthem (`iidx-18.zip`): [iidxhook4](doc/iidxhook/iidxhook4.md)
|
||||||
* Beatmania IIDX 20 Tricoro (iidx-20.zip) using [iidxhook6](doc/iidxhook/iidxhook6.md)
|
* Beatmania IIDX 19 Lincle (`iidx-19.zip`): [iidxhook5](doc/iidxhook/iidxhook5.md)
|
||||||
* Beatmania IIDX 21 SPADA (iidx-21-to-24.zip) using [iidxhook7](doc/iidxhook/iidxhook7.md)
|
* Beatmania IIDX 20 Tricoro (`iidx-20.zip`): [iidxhook6](doc/iidxhook/iidxhook6.md)
|
||||||
* Beatmania IIDX 22 PENDUAL (iidx-21-to-24.zip) using [iidxhook7](doc/iidxhook/iidxhook7.md)
|
* Beatmania IIDX 21 SPADA (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||||
* Beatmania IIDX 23 copula (iidx-21-to-24.zip) using [iidxhook7](doc/iidxhook/iidxhook7.md)
|
* Beatmania IIDX 22 PENDUAL (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||||
* Beatmania IIDX 24 SINOBUZ (iidx-21-to-24.zip) using [iidxhook7](doc/iidxhook/iidxhook7.md)
|
* Beatmania IIDX 23 copula (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||||
* Beatmania IIDX 25 CANNON BALLERS (iidx-25-to-26.zip) using [iidxhook8](doc/iidxhook/iidxhook8.md)
|
* Beatmania IIDX 24 SINOBUZ (`iidx-21-to-24.zip`): [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||||
* Beatmania IIDX 26 Rootage (iidx-25-to-26.zip) using [iidxhook8](doc/iidxhook/iidxhook8.md)
|
* Beatmania IIDX 25 CANNON BALLERS (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||||
* Beatmania IIDX 27 Heroic Verse (iidx-27.zip) using [iidxhook9](doc/iidxhook/iidxhook9.md)
|
* Beatmania IIDX 26 Rootage (`iidx-25-to-26.zip`): [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||||
* jubeat
|
* Beatmania IIDX 27 Heroic Verse (`iidx-27-to-28.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||||
* jubeat (experimental/buggy) (jb-01.zip) using [jbhook1](doc/jbhook1/jbhook1.md)
|
* Beatmania IIDX 28 BISTROVER (`iidx-27-to-28.zip`): [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||||
* jubeat saucer (fulfill) (jb-05-to-07.zip) using jbhook
|
* [jubeat](doc/jbhook/README.md)
|
||||||
* jubeat prop (jb-05-to-07.zip) using jbhook
|
* jubeat (`jb-01.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
||||||
* jubeat Qubell (jb-05-to-07.zip) using jbhook
|
* jubeat ripples (`jb-02.zip`): [jbhook1](doc/jbhook/jbhook1.md)
|
||||||
* jubeat clan (jb-08.zip) using jbhook
|
* jubeat knit (`jb-03.zip`): [jbhook2](doc/jbhook/jbhook2.md)
|
||||||
|
* jubeat copious (`jb-04.zip`): [jbhook2](doc/jbhook/jbhook2.md)
|
||||||
|
* jubeat saucer (fulfill) (`jb-05-to-07.zip`): [jbhook3](doc/jbhook/jbhook3.md)
|
||||||
|
* jubeat prop (`jb-05-to-07.zip`): [jbhook3](doc/jbhook/jbhook3.md)
|
||||||
|
* jubeat qubell (`jb-05-to-07.zip`): [jbhook3](doc/jbhook/jbhook3.md)
|
||||||
|
* jubeat clan (`jb-08.zip`): [jbhook3](doc/jbhook/jbhook3.md)
|
||||||
|
* jubeat festo (`jb-08.zip`): [jbhook3](doc/jbhook/jbhook3.md)
|
||||||
* SOUND VOLTEX
|
* SOUND VOLTEX
|
||||||
* SOUND VOLTEX BOOTH (sdvx-01-to-04.zip) using sdvxhook
|
* SOUND VOLTEX BOOTH (`sdvx-01-to-04.zip`): sdvxhook
|
||||||
* SOUND VOLTEX II -infinite infection- (sdvx-01-to-04.zip) using sdvxhook
|
* SOUND VOLTEX II -infinite infection- (`sdvx-01-to-04.zip`): sdvxhook
|
||||||
* SOUND VOLTEX III GRAVITY WARS (sdvx-01-to-04.zip) using sdvxhook
|
* SOUND VOLTEX III GRAVITY WARS (`sdvx-01-to-04.zip`): sdvxhook
|
||||||
* SOUND VOLTEX IV HEAVENLY HAVEN (sdvx-01-to-04.zip) using sdvxhook
|
* SOUND VOLTEX IV HEAVENLY HAVEN (`sdvx-01-to-04.zip`): sdvxhook
|
||||||
* SOUND VOLTEX Vivid Wave (sdvx-05.zip) using sdvxhook2
|
* SOUND VOLTEX Vivid Wave (`sdvx-05-to-06`): sdvxhook2
|
||||||
|
* SOUND VOLTEX EXCEED GEAR (`sdvx-05-to-06`): sdvxhook2
|
||||||
|
|
||||||
## ViGEm clients: Expose BT5 APIs as XBOX game controllers
|
## ViGEm clients: Expose BT5 APIs as XBOX game controllers
|
||||||
Play your favorite non-bemani arcade games with any hardware, e.g. real cabinet hardware, that
|
Play your favorite non-bemani arcade games with any hardware, e.g. real cabinet hardware, that
|
||||||
|
|||||||
32
dist/ddr/ddr-11-us.conf
vendored
Normal file
32
dist/ddr/ddr-11-us.conf
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# EAMID
|
||||||
|
eamuse.eamid=0101020304050607086F
|
||||||
|
|
||||||
|
# Mcode of the game to run.
|
||||||
|
security.mcode=GQHDXUAA
|
||||||
|
|
||||||
|
# Emulate P3IO COM4 and its downstream devices. Uses the Windows COM4 port when disabled.
|
||||||
|
ddrhook1.use_com4_emu=true
|
||||||
|
|
||||||
|
# SD cabinet mode
|
||||||
|
ddrhook1.standard_def=false
|
||||||
|
|
||||||
|
# Use 15 kHz monitor mode
|
||||||
|
ddrhook1.use_15khz=false
|
||||||
|
|
||||||
|
# Enable USB memory data emulation
|
||||||
|
ddrhook1.usbmem_enabled=false
|
||||||
|
|
||||||
|
# Specify path for P1 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p1=usbmem_p1
|
||||||
|
|
||||||
|
# Specify path for P2 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p2=usbmem_p2
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
32
dist/ddr/ddr-11.conf
vendored
Normal file
32
dist/ddr/ddr-11.conf
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# EAMID
|
||||||
|
eamuse.eamid=0101020304050607086F
|
||||||
|
|
||||||
|
# Mcode of the game to run.
|
||||||
|
security.mcode=GQHDXJAA
|
||||||
|
|
||||||
|
# Emulate P3IO COM4 and its downstream devices. Uses the Windows COM4 port when disabled.
|
||||||
|
ddrhook1.use_com4_emu=true
|
||||||
|
|
||||||
|
# SD cabinet mode
|
||||||
|
ddrhook1.standard_def=false
|
||||||
|
|
||||||
|
# Use 15 kHz monitor mode
|
||||||
|
ddrhook1.use_15khz=false
|
||||||
|
|
||||||
|
# Enable USB memory data emulation
|
||||||
|
ddrhook1.usbmem_enabled=false
|
||||||
|
|
||||||
|
# Specify path for P1 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p1=usbmem_p1
|
||||||
|
|
||||||
|
# Specify path for P2 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p2=usbmem_p2
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
32
dist/ddr/ddr-12-eu.conf
vendored
Normal file
32
dist/ddr/ddr-12-eu.conf
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# EAMID
|
||||||
|
eamuse.eamid=0101020304050607086F
|
||||||
|
|
||||||
|
# Mcode of the game to run.
|
||||||
|
security.mcode=GQJDXEAA
|
||||||
|
|
||||||
|
# Emulate P3IO COM4 and its downstream devices. Uses the Windows COM4 port when disabled.
|
||||||
|
ddrhook1.use_com4_emu=true
|
||||||
|
|
||||||
|
# SD cabinet mode
|
||||||
|
ddrhook1.standard_def=false
|
||||||
|
|
||||||
|
# Use 15 kHz monitor mode
|
||||||
|
ddrhook1.use_15khz=false
|
||||||
|
|
||||||
|
# Enable USB memory data emulation
|
||||||
|
ddrhook1.usbmem_enabled=false
|
||||||
|
|
||||||
|
# Specify path for P1 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p1=usbmem_p1
|
||||||
|
|
||||||
|
# Specify path for P2 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p2=usbmem_p2
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
32
dist/ddr/ddr-12-us.conf
vendored
Normal file
32
dist/ddr/ddr-12-us.conf
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# EAMID
|
||||||
|
eamuse.eamid=0101020304050607086F
|
||||||
|
|
||||||
|
# Mcode of the game to run.
|
||||||
|
security.mcode=GQJDXUAA
|
||||||
|
|
||||||
|
# Emulate P3IO COM4 and its downstream devices. Uses the Windows COM4 port when disabled.
|
||||||
|
ddrhook1.use_com4_emu=true
|
||||||
|
|
||||||
|
# SD cabinet mode
|
||||||
|
ddrhook1.standard_def=false
|
||||||
|
|
||||||
|
# Use 15 kHz monitor mode
|
||||||
|
ddrhook1.use_15khz=false
|
||||||
|
|
||||||
|
# Enable USB memory data emulation
|
||||||
|
ddrhook1.usbmem_enabled=false
|
||||||
|
|
||||||
|
# Specify path for P1 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p1=usbmem_p1
|
||||||
|
|
||||||
|
# Specify path for P2 USB memory data
|
||||||
|
ddrhook1.usbmem_path_p2=usbmem_p2
|
||||||
|
|
||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
11
dist/ddr/gamestart-11-us.bat
vendored
Normal file
11
dist/ddr/gamestart-11-us.bat
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist conf\nvram mkdir conf\nvram
|
||||||
|
if not exist conf\raw mkdir conf\raw
|
||||||
|
|
||||||
|
regsvr32 /s com\CLVsd.ax
|
||||||
|
regsvr32 /s com\xactengine2_10.dll
|
||||||
|
|
||||||
|
inject ddrhook1.dll DDR.exe --config ddr-11-us.conf %*
|
||||||
11
dist/ddr/gamestart-11.bat
vendored
Normal file
11
dist/ddr/gamestart-11.bat
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist conf\nvram mkdir conf\nvram
|
||||||
|
if not exist conf\raw mkdir conf\raw
|
||||||
|
|
||||||
|
regsvr32 /s com\CLVsd.ax
|
||||||
|
regsvr32 /s com\xactengine2_10.dll
|
||||||
|
|
||||||
|
inject ddrhook1.dll DDR.exe --config ddr-11.conf %*
|
||||||
11
dist/ddr/gamestart-12-eu.bat
vendored
Normal file
11
dist/ddr/gamestart-12-eu.bat
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist conf\nvram mkdir conf\nvram
|
||||||
|
if not exist conf\raw mkdir conf\raw
|
||||||
|
|
||||||
|
regsvr32 /s com\CLVsd.ax
|
||||||
|
regsvr32 /s com\xactengine2_10.dll
|
||||||
|
|
||||||
|
inject ddrhook1.dll DDR.exe --config ddr-12-eu.conf %*
|
||||||
11
dist/ddr/gamestart-12-us.bat
vendored
Normal file
11
dist/ddr/gamestart-12-us.bat
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist conf\nvram mkdir conf\nvram
|
||||||
|
if not exist conf\raw mkdir conf\raw
|
||||||
|
|
||||||
|
regsvr32 /s com\CLVsd.ax
|
||||||
|
regsvr32 /s com\xactengine2_10.dll
|
||||||
|
|
||||||
|
inject ddrhook1.dll DDR.exe --config ddr-12-us.conf %*
|
||||||
2
dist/ddr/gamestart-12.bat
vendored
2
dist/ddr/gamestart-12.bat
vendored
@@ -8,4 +8,4 @@ if not exist conf\raw mkdir conf\raw
|
|||||||
regsvr32 /s k-clvsd.dll
|
regsvr32 /s k-clvsd.dll
|
||||||
regsvr32 /s xactengine2_10.dll
|
regsvr32 /s xactengine2_10.dll
|
||||||
|
|
||||||
.\launcher.exe -K .\ddrhook.dll .\ddr.dll %*
|
.\launcher.exe -K .\ddrhook2.dll .\ddr.dll %*
|
||||||
|
|||||||
2
dist/ddr/gamestart-13.bat
vendored
2
dist/ddr/gamestart-13.bat
vendored
@@ -8,4 +8,4 @@ if not exist conf\raw mkdir conf\raw
|
|||||||
regsvr32 /s k-clvsd.dll
|
regsvr32 /s k-clvsd.dll
|
||||||
regsvr32 /s xactengine2_10.dll
|
regsvr32 /s xactengine2_10.dll
|
||||||
|
|
||||||
.\launcher.exe -K .\ddrhook.dll .\ddr.dll %*
|
.\launcher.exe -K .\ddrhook2.dll .\ddr.dll %*
|
||||||
|
|||||||
2
dist/ddr/gamestart-14.bat
vendored
2
dist/ddr/gamestart-14.bat
vendored
@@ -11,4 +11,4 @@ if not exist conf\raw mkdir conf\raw
|
|||||||
regsvr32 /s k-clvsd.dll
|
regsvr32 /s k-clvsd.dll
|
||||||
regsvr32 /s xactengine2_10.dll
|
regsvr32 /s xactengine2_10.dll
|
||||||
|
|
||||||
.\launcher.exe -K .\ddrhook.dll .\mdxja_945.dll %*
|
.\launcher.exe -K .\ddrhook2.dll .\mdxja_945.dll %*
|
||||||
|
|||||||
2
dist/ddr/gamestart-15.bat
vendored
2
dist/ddr/gamestart-15.bat
vendored
@@ -11,4 +11,4 @@ if not exist conf\raw mkdir conf\raw
|
|||||||
regsvr32 /s k-clvsd.dll
|
regsvr32 /s k-clvsd.dll
|
||||||
regsvr32 /s xactengine2_10.dll
|
regsvr32 /s xactengine2_10.dll
|
||||||
|
|
||||||
.\launcher.exe -K .\ddrhook.dll .\mdxja_945.dll %*
|
.\launcher.exe -K .\ddrhook2.dll .\mdxja_945.dll %*
|
||||||
|
|||||||
2
dist/ddr/gamestart-16.bat
vendored
2
dist/ddr/gamestart-16.bat
vendored
@@ -12,4 +12,4 @@ if not exist conf\raw mkdir conf\raw
|
|||||||
regsvr32 /s com\k-clvsd.dll
|
regsvr32 /s com\k-clvsd.dll
|
||||||
regsvr32 /s com\xactengine2_10.dll
|
regsvr32 /s com\xactengine2_10.dll
|
||||||
|
|
||||||
.\launcher.exe -H 33554432 -K .\ddrhook.dll .\arkmdxp3.dll %*
|
.\launcher.exe -H 33554432 -K .\ddrhook2.dll .\arkmdxp3.dll %*
|
||||||
|
|||||||
16
dist/iidx/gamestart-28.bat
vendored
Normal file
16
dist/iidx/gamestart-28.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-28.conf %*
|
||||||
5
dist/iidx/iidxhook-14.conf
vendored
5
dist/iidx/iidxhook-14.conf
vendored
@@ -46,8 +46,5 @@ 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
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
|
||||||
sec.boot_version=GQGLDJAA
|
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQGLDJA
|
sec.black_plug_mcode=GQGLDJAA
|
||||||
5
dist/iidx/iidxhook-15.conf
vendored
5
dist/iidx/iidxhook-15.conf
vendored
@@ -46,8 +46,5 @@ 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
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
|
||||||
sec.boot_version=GQHDDJAA
|
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQHDDJA
|
sec.black_plug_mcode=GQHDDJAA
|
||||||
5
dist/iidx/iidxhook-16.conf
vendored
5
dist/iidx/iidxhook-16.conf
vendored
@@ -49,8 +49,5 @@ 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
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
|
||||||
sec.boot_version=GQI00JAA
|
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GQI00JA
|
sec.black_plug_mcode=GQI00JAA
|
||||||
5
dist/iidx/iidxhook-17.conf
vendored
5
dist/iidx/iidxhook-17.conf
vendored
@@ -49,8 +49,5 @@ 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
|
||||||
|
|
||||||
# Security boot version (e.g. GEC02).
|
|
||||||
sec.boot_version=GCJDJJAA
|
|
||||||
|
|
||||||
# Security black plug mcode id string (e.g. GQC02JAA).
|
# Security black plug mcode id string (e.g. GQC02JAA).
|
||||||
sec.black_plug_mcode=GCJDJJA
|
sec.black_plug_mcode=GCJDJJAA
|
||||||
78
dist/iidx/iidxhook-28.conf
vendored
Normal file
78
dist/iidx/iidxhook-28.conf
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Disable card reader emulation and enable usage of real card reader hardware on COM0 (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)
|
||||||
|
|
||||||
7
dist/jb/gamestart-02.bat
vendored
Normal file
7
dist/jb/gamestart-02.bat
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist dev\nvram mkdir dev\nvram
|
||||||
|
|
||||||
|
inject jbhook1.dll jubeat.exe --config jbhook-02.conf %*
|
||||||
10
dist/jb/gamestart-03.bat
vendored
Normal file
10
dist/jb/gamestart-03.bat
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /d %~dp0
|
||||||
|
|
||||||
|
if not exist dev\nvram mkdir dev\nvram
|
||||||
|
if not exist dev\nvram\coin.xml copy prop\defaults\coin.xml dev\nvram\coin.xml
|
||||||
|
if not exist dev\nvram\eacoin.xml copy prop\defaults\eacoin.xml dev\nvram\eacoin.xml
|
||||||
|
if not exist dev\raw mkdir dev\raw
|
||||||
|
|
||||||
|
launcher -H 33554432 -K jbhook2.dll jubeat.dll -v
|
||||||
@@ -7,4 +7,4 @@ if not exist dev\nvram\coin.xml copy prop\defaults\coin.xml dev\nvram\coin.xml
|
|||||||
if not exist dev\nvram\eacoin.xml copy prop\defaults\eacoin.xml dev\nvram\eacoin.xml
|
if not exist dev\nvram\eacoin.xml copy prop\defaults\eacoin.xml dev\nvram\eacoin.xml
|
||||||
if not exist dev\raw mkdir dev\raw
|
if not exist dev\raw mkdir dev\raw
|
||||||
|
|
||||||
launcher -H 33554432 -K jbhook.dll jubeat.dll
|
launcher -H 33554432 -K jbhook3.dll jubeat.dll
|
||||||
3
dist/jb/jbhook-01.conf
vendored
3
dist/jb/jbhook-01.conf
vendored
@@ -1,6 +1,9 @@
|
|||||||
# Run the game windowed
|
# Run the game windowed
|
||||||
gfx.windowed=false
|
gfx.windowed=false
|
||||||
|
|
||||||
|
# rotate the normally-horizontal game window to be vertical
|
||||||
|
gfx.vertical=true
|
||||||
|
|
||||||
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
eamuse.server=localhost:80
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
|||||||
18
dist/jb/jbhook-02.conf
vendored
Normal file
18
dist/jb/jbhook-02.conf
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Run the game windowed
|
||||||
|
gfx.windowed=false
|
||||||
|
|
||||||
|
# rotate the normally-horizontal game window to be vertical
|
||||||
|
gfx.vertical=true
|
||||||
|
|
||||||
|
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
|
||||||
|
eamuse.server=localhost:80
|
||||||
|
|
||||||
|
# PCBID
|
||||||
|
eamuse.pcbid=0101020304050607086F
|
||||||
|
|
||||||
|
# EAMID
|
||||||
|
eamuse.eamid=0101020304050607086F
|
||||||
|
|
||||||
|
# Mcode of the game to run.
|
||||||
|
security.mcode=GCI44JAA
|
||||||
|
|
||||||
15
dist/sdvx5/sdvxhook2.conf
vendored
15
dist/sdvx5/sdvxhook2.conf
vendored
@@ -13,6 +13,15 @@ io.force_headphones=false
|
|||||||
# Disables the built in file hooks, requiring manual file creation (/dev/raw/j.dest)
|
# Disables the built in file hooks, requiring manual file creation (/dev/raw/j.dest)
|
||||||
io.disable_file_hooks=false
|
io.disable_file_hooks=false
|
||||||
|
|
||||||
|
# Disables the built in power control hooks, allowing game to modify system power settings
|
||||||
|
io.disable_power_hooks=false
|
||||||
|
|
||||||
|
# Disables the built in NVAPI control hooks, allowing game to modify system monitor settings
|
||||||
|
io.disable_nvapi_hooks=false
|
||||||
|
|
||||||
|
# Emulates the card reader on COM1 instead of COM2
|
||||||
|
io.com1_card_reader=false
|
||||||
|
|
||||||
# Run the game in a framed window (requires windowed option)
|
# Run the game in a framed window (requires windowed option)
|
||||||
gfx.framed=true
|
gfx.framed=true
|
||||||
|
|
||||||
@@ -43,6 +52,12 @@ gfx.device_adapter=-1
|
|||||||
# Orientation to force monitor into, -1 to use default, 0, 1, 2, 3 to do 0, 90, 180, 270 degrees
|
# Orientation to force monitor into, -1 to use default, 0, 1, 2, 3 to do 0, 90, 180, 270 degrees
|
||||||
gfx.force_orientation=-1
|
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
|
||||||
|
|
||||||
# Disables the camera emulation
|
# Disables the camera emulation
|
||||||
cam.disable_emu=false
|
cam.disable_emu=false
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,29 @@
|
|||||||
# Bemanitools 5 documentation
|
# Bemanitools 5 documentation
|
||||||
|
|
||||||
This folder contains various types of documentation.
|
This folder contains various types of documentation.
|
||||||
|
|
||||||
Table of contents:
|
Table of contents:
|
||||||
|
|
||||||
* Key tools
|
* Key tools
|
||||||
* [Inject](inject.md): Readme for one of BT5's key applications, `inject.exe`
|
* [Inject](inject.md): Readme for one of BT5's key applications, `inject.exe`
|
||||||
* [Launcher](launcher.md): Readme for another one of BT5's key applications, `launcher.exe`
|
* [Launcher](launcher.md): Readme for another one of BT5's key applications, `launcher.exe`
|
||||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||||
* Game hooks
|
* Game hooks
|
||||||
* [ddrhook](ddrhook/README.md): Documentation relevant to `ddrhook` implementations
|
* [ddrhook](ddrhook/README.md): Documentation relevant to `ddrhook` implementations
|
||||||
* [iidxhook](iidxhook/README.md): Documentation relevant to `iidxhook` implementations
|
* [iidxhook](iidxhook/README.md): Documentation relevant to `iidxhook` implementations
|
||||||
* [jbhook](jbhook/README.md): Documentation relevant to `jbhook` implementations
|
* [jbhook](jbhook/README.md): Documentation relevant to `jbhook` implementations
|
||||||
* [sdvxhook](sdvxhook/README.md): Documentation relevant to `sdvxhook` implementations
|
* [sdvxhook](sdvxhook/README.md): Documentation relevant to `sdvxhook` implementations
|
||||||
* Development
|
* Development
|
||||||
* [API](api.md): Available APIs for BT5 and instructions how to use them
|
* [API](api.md): Available APIs for BT5 and instructions how to use them
|
||||||
* [Architecture](architecture.md): Outline of BT5's architecture, how things are designed and why
|
* [Architecture](architecture.md): Outline of BT5's architecture, how things are designed and why
|
||||||
* [Development](development.md): Development environment, building, releasing, etc.
|
* [Development](development.md): Development environment, building, releasing, etc.
|
||||||
* [Developer documentation](dev/README.md): Various lose documentation/notes by developers
|
* [Developer documentation](dev/README.md): Various lose documentation/notes by developers
|
||||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||||
* Hardware
|
|
||||||
* [Hardware](hardware/README.md): Anything related to hardware, e.g. IO boards
|
## Further external documentation
|
||||||
|
|
||||||
|
A list of external documentation that can be useful when dealing with bemanitools,
|
||||||
|
supported data and hardware.
|
||||||
|
|
||||||
|
* [arcade-docs](https://github.com/Shizmob/arcade-docs): An open (to read and contribute) repository
|
||||||
|
of arcade hardware and software documentation
|
||||||
|
|||||||
49
doc/ddrhook/README.md
Normal file
49
doc/ddrhook/README.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# ddrhook
|
||||||
|
|
||||||
|
ddrhook is a collection of hook libraries for "Dance Dance Revoluion" providing
|
||||||
|
emulation and various patches to run these games on non BemaniPC hardware and
|
||||||
|
newer Windows versions.
|
||||||
|
|
||||||
|
The hook libraries must be bootstrapped either using [inject](../inject.md) or
|
||||||
|
[launcher](../launcher.md) depending on the version you want to run. Further
|
||||||
|
instructions are given in dedicated readme files for each ddrhook version
|
||||||
|
(see below).
|
||||||
|
|
||||||
|
## Versions
|
||||||
|
|
||||||
|
ddrhook comes in a few different flavors. The game and its engine changed over
|
||||||
|
the years. Some game versions might require patches/parameters enabled which
|
||||||
|
others don't need or have different AVS versions. Here is the list of supported
|
||||||
|
games:
|
||||||
|
|
||||||
|
* [ddrhook1](ddrhook1.md): X, X2 (US/EU regions)
|
||||||
|
* [ddrhook2](ddrhook2.md): X2 (JP region), X3 vs. 2ndMIX, 2013, 2014, A
|
||||||
|
|
||||||
|
When building bemanitools, independent packages are created for each set of games
|
||||||
|
which are ready to be dropped on top of vanilla AC data dumps. We recommend
|
||||||
|
using pristine dumps to avoid any conflicts with other hardcoded hacks or
|
||||||
|
binary patches.
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
To run your game with ddrhook, you have to use the inject tool to inject the
|
||||||
|
DLL to the game process. `dist/ddr` contains bat scripts with all the
|
||||||
|
important parameters configured. Further parameters can be added but might not
|
||||||
|
be required to run the game with default settings.
|
||||||
|
Further information on how to setup the data for each specific version are
|
||||||
|
elaborated in their dedicated readme files.
|
||||||
|
|
||||||
|
## Command line options
|
||||||
|
|
||||||
|
Add the argument *-h* when running inject with ddrhook to print help/usage
|
||||||
|
information with a list of parameters you can apply to tweak various things.
|
||||||
|
|
||||||
|
## ddrio API
|
||||||
|
|
||||||
|
Available implementations that can be swapped out depending on which kind of
|
||||||
|
IO hardware you want to use:
|
||||||
|
|
||||||
|
* `ddrio`: Default implementation supporting keyboard, mouse and USB
|
||||||
|
game controllers
|
||||||
|
* ddrio-mm: Support Minimaid custom interface
|
||||||
|
* [ddrio-smx](ddrhook/ddrio-smx.md): Support for StepManiaX dance platforms
|
||||||
139
doc/ddrhook/ddrhook1.md
Normal file
139
doc/ddrhook/ddrhook1.md
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
# ddrhook1
|
||||||
|
|
||||||
|
## Supported games
|
||||||
|
|
||||||
|
The following games are supported with this hook library:
|
||||||
|
|
||||||
|
* Dance Dance Revolution X
|
||||||
|
* Dance Dance Revolution X2 (US/EU regions)
|
||||||
|
|
||||||
|
The games must be bootstrapped using [inject](../inject.md).
|
||||||
|
|
||||||
|
## Data setup
|
||||||
|
|
||||||
|
Ensure your folder with your unpacked data looks like this:
|
||||||
|
|
||||||
|
* `conf`
|
||||||
|
* `data`
|
||||||
|
* `ddr`
|
||||||
|
* `ddr_YYYYMMDDRR` where `YYYYMMDDRR` corresponds to different datecodes of
|
||||||
|
different versions. Multiple folders of these possible
|
||||||
|
|
||||||
|
`DDR.exe` files should be in `ddr` and `ddr_YYYYMMDDRR` folders.
|
||||||
|
|
||||||
|
Unpack the distribution package `ddr-11.zip` into one of the folders containing
|
||||||
|
a `DDR.exe` file. We recommend using the one with the latest datecode which
|
||||||
|
denotes the latest version of the game including bugfixes etc.
|
||||||
|
|
||||||
|
`gamestart-11.bat` as well as `ddrhook1.dll` are now expected to be located
|
||||||
|
in the same folder as (one) `DDR.exe` file.
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
Run `gamestart-11.bat` as administrator. For the US version of the game, run
|
||||||
|
`gamestart-11-us.bat` instead. This can be done by either by double
|
||||||
|
clicking or running it from `cmd.exe`. The latter is recommended to have
|
||||||
|
any debug output kept on screen after closing the game.
|
||||||
|
|
||||||
|
This will run [inject](../inject.md) with the `ddrhook1.dll`. On first run,
|
||||||
|
if you don't have a conguration file, e.g. `ddr-11.conf`, available in the
|
||||||
|
same folder, a default one will be created and the game exits. Simply re-run
|
||||||
|
`gamestart-11.bat` again.
|
||||||
|
|
||||||
|
## Configuration ddrhook
|
||||||
|
|
||||||
|
The hook library can be configured via cmd arguments or a configuration file.
|
||||||
|
The latter is generated (*ddr-11.conf* in the same directory) on the first
|
||||||
|
start of the game using the gamestart-XX.bat file. It contains default values
|
||||||
|
for all available parameters and comments explaining each parameter. Please
|
||||||
|
follow the comments when configuring your setup.
|
||||||
|
|
||||||
|
Add the argument *-h* when running gamestart-XX.bat
|
||||||
|
(e.g. *gamestart-XX.bat -h*) to print help/usage information with a list of
|
||||||
|
all available parameters. Every parameter can be either set as command line
|
||||||
|
argument or using a configuration file.
|
||||||
|
|
||||||
|
To set a parameter from the command line, just add it as an argument after
|
||||||
|
the bat file like this
|
||||||
|
|
||||||
|
```
|
||||||
|
gamestart-11.bat -p gfx.windowed=true
|
||||||
|
```
|
||||||
|
|
||||||
|
The syntax for the "key=value" is the same as in the config file. Make sure
|
||||||
|
to have a pre-ceeding "-p" for every parameter added.
|
||||||
|
|
||||||
|
However, if a parameter is specifed in the configuration file and as a command
|
||||||
|
line argument, the command line argument overrides the config file's value.
|
||||||
|
|
||||||
|
## Configure USB memory cards and edit data
|
||||||
|
|
||||||
|
You can setup actual USB thumb drives mapped to a drive letter, e.g. `E:\` for
|
||||||
|
player 1 and `F:\` for player 2, or just have them point to any local directory,
|
||||||
|
e.g. `usbmem_p1` and `usbmem_p2`.
|
||||||
|
|
||||||
|
Set-up your folder mappings in the
|
||||||
|
[conf file or via command line args](#configuration-ddrhook) like follows:
|
||||||
|
|
||||||
|
* Enable USB memory data emulation: `ddrhook1.usbmem_enabled=true`
|
||||||
|
* Set P1 USB memory data path pointing to local folder `usbmem_p1` next to `DDR.EXE`:
|
||||||
|
`ddrhook1.usbmem_path_p1=usbmem_p1`
|
||||||
|
* Set P1 USB memory data path pointing to local folder `usbmem_p2` next to `DDR.EXE`:
|
||||||
|
`ddrhook1.usbmem_path_p1=usbmem_p2`
|
||||||
|
* Have/create a subfolder called `DDR_EDIT` on any location/USB drive you want to use
|
||||||
|
* Name your edit data file either `DDR_EDIT_J.DAT` (for JP version) or `DDR_EDIT_U.DAT`
|
||||||
|
(for US version) and place it in the `DDR_EDIT` directory.
|
||||||
|
|
||||||
|
For the example setup above, the full relative path of the edit file should be
|
||||||
|
`usbmem_p1\DDR_EDIT\DDR_EDIT_J.DAT` for player 1.
|
||||||
|
|
||||||
|
Note that USB memory cards are not detected by the game and the game stays
|
||||||
|
silent about that if they do not contain edit data, your path mapping does not resolve
|
||||||
|
or you misplaced or named your edit data file incorrectly.
|
||||||
|
|
||||||
|
## Grey and glitchy arrows
|
||||||
|
|
||||||
|
This is a known issue with many GPUs, typically non-Radeon GPUs.
|
||||||
|
|
||||||
|
There is currently not patch available in Bemanitools for that. We assume this is an
|
||||||
|
issue with incompatible shader code.
|
||||||
|
|
||||||
|
There are solutions to hard-patch the code available elsewhere.
|
||||||
|
|
||||||
|
## Troubleshooting and FAQ
|
||||||
|
|
||||||
|
### Issues with background videos (not) playing
|
||||||
|
|
||||||
|
The game expects you have the `CLVSD.ax` file registered for decoding videos.
|
||||||
|
|
||||||
|
Grab the `CLVSD.ax` file and go to *Start* > *Run* > enter `regsvr32 clvsd.ax` and
|
||||||
|
execute. Make sure to run as Administrator, otherwise you will get errors due to
|
||||||
|
invalid permissions.
|
||||||
|
|
||||||
|
### Game crashes during boot
|
||||||
|
|
||||||
|
If you have played a newer version of DDR, e.g. DDR 2014+, you might have the
|
||||||
|
`k-clvsd.dll` codec registered which crashes DDR X and likely X2 (EU/US) as well.
|
||||||
|
|
||||||
|
Unregister `k-clvsd.dll`, e.g. `regsvr32 /u k-clvsd.dll`, and
|
||||||
|
[registering `CLVSD.ax`](#issues-with-background-videos-not-working).
|
||||||
|
|
||||||
|
Note that `CLVSD.ax` will likely hang any newer/more recent DDR versions on startup
|
||||||
|
and require you to use the `k-clvsd.dll` that came with the respective version
|
||||||
|
instead. See [this section](ddrhook2.md#video-codecs-for-background-videos) for
|
||||||
|
further details.
|
||||||
|
|
||||||
|
### Black screen/render window without a response
|
||||||
|
|
||||||
|
This symptom might have many causes, here is a list of known issues and what can be done:
|
||||||
|
|
||||||
|
* If not done already, try installing
|
||||||
|
[DirectX Redist (June 2010)](https://www.microsoft.com/en-us/download/details.aspx?id=8109)
|
||||||
|
* If you have an integrated/second GPU, ensure it is disabled
|
||||||
|
* External (USB) audio devices could cause issues. Ensure you are running on on-board/integrated
|
||||||
|
sound cards and unplug any external audio devices.
|
||||||
|
* [Disable fullscreen optimizations](https://devblogs.microsoft.com/directx/demystifying-full-screen-optimizations/):
|
||||||
|
Right click on `DDR.exe`, *Properties* > *Compatibility* > *Disable fullscreen optimizations*
|
||||||
|
* Check if you can run `DDR.exe` without Bemanitools by simply launching it. It should at least
|
||||||
|
boot into a startup screen. If that isn't even possible, then it's likely not an issue with
|
||||||
|
Bemanitools. Note that your data path needs to be `D:\HDX` for that to work though.
|
||||||
80
doc/ddrhook/ddrhook2.md
Normal file
80
doc/ddrhook/ddrhook2.md
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# ddrhook2
|
||||||
|
|
||||||
|
## Supported games
|
||||||
|
|
||||||
|
The following games are supported by this hook library:
|
||||||
|
|
||||||
|
* Dance Dance Revolution X2 (JP region)
|
||||||
|
* Dance Dance Revolution X3 vs. 2ndMIX
|
||||||
|
* Dance Dance Revolution 2013
|
||||||
|
* Dance Dance Revolution 2014
|
||||||
|
* Dance Dance Revolution A
|
||||||
|
|
||||||
|
Note that different builds of the same hook library are required to run the
|
||||||
|
different versions. See different distribution packages, e.g. `ddr-12.zip`,
|
||||||
|
`ddr-13.zip` etc.
|
||||||
|
|
||||||
|
Depending on the game version, earlier versions are bootstrapped using
|
||||||
|
[inject](../inject.md) while later versions require [launcher](../launcher.md).
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
Run `gamestart-XX.bat`, where `XX` corresponds to the version of the game you
|
||||||
|
want to run, as administrator. For the US version of X2, run
|
||||||
|
`gamestart-12-us.bat` instead. This can be done by either by double
|
||||||
|
clicking or running it from `cmd.exe`. The latter is recommended to have
|
||||||
|
any debug output kept on screen after closing the game.
|
||||||
|
|
||||||
|
This will run [inject](../inject.md) or [launcher](../launcher.md), depending
|
||||||
|
on the version of the game, with the `ddrhook2.dll`. On first run, if you don't
|
||||||
|
have a conguration file, e.g. `ddr-12.conf`, available in the same folder, a
|
||||||
|
default one will be created and the game exits. Simply re-run `gamestart-XX.bat`
|
||||||
|
again.
|
||||||
|
|
||||||
|
## Configure USB memory cards and edit data (DDR X2)
|
||||||
|
|
||||||
|
You can setup actual USB thumb drives mapped to a drive letter, e.g. `E:\` for
|
||||||
|
player 1 and `F:\` for player 2, or just have them point to any local directory,
|
||||||
|
e.g. `usbmem_p1` and `usbmem_p2`.
|
||||||
|
|
||||||
|
Set-up your folder mappings in the
|
||||||
|
[conf file or via command line args](#configuration-ddrhook) like follows:
|
||||||
|
|
||||||
|
* Enable USB memory data emulation: `ddrhook1.usbmem_enabled=true`
|
||||||
|
* Set P1 USB memory data path pointing to local folder `usbmem_p1` next to `DDR.EXE`:
|
||||||
|
`ddrhook1.usbmem_path_p1=usbmem_p1`
|
||||||
|
* Set P1 USB memory data path pointing to local folder `usbmem_p2` next to `DDR.EXE`:
|
||||||
|
`ddrhook1.usbmem_path_p1=usbmem_p2`
|
||||||
|
* Have/create a subfolder called `DDR_EDIT` on any location/USB drive you want to use
|
||||||
|
* Name your edit data file either `DDR_EDIT_J.DAT` (for JP version) or `DDR_EDIT_US.DAT`
|
||||||
|
(for US version) and place it in the `DDR_EDIT` directory.
|
||||||
|
|
||||||
|
For the example setup above, the full relative path of the edit file should be
|
||||||
|
`usbmem_p1\DDR_EDIT\DDR_EDIT_J.DAT` for player 1.
|
||||||
|
|
||||||
|
Note that USB memory cards are not detected by the game and the game stays
|
||||||
|
silent about that if they do not contain edit data, your path mapping does not resolve
|
||||||
|
or you misplaced or named your edit data file incorrectly.
|
||||||
|
|
||||||
|
## Troubleshooting and FAQ
|
||||||
|
|
||||||
|
### Video codecs for background videos
|
||||||
|
|
||||||
|
For DDR 2014 and newer (maybe also earlier?), you need to register `k-clvsd.dll` and
|
||||||
|
`xactengine2_10.dll` to make background videos work. These files are included with
|
||||||
|
respective versions of the games.
|
||||||
|
|
||||||
|
Run the following commands either from a command line (`cmd.exe`) or from
|
||||||
|
*Start* > *Run*. Adjust the path to files accordingly pointing to the correct files.
|
||||||
|
|
||||||
|
* Register `regsvr32 D:\MDX\contents\k-clvsd.dll`
|
||||||
|
* Register `regsvr32 D:\MDX\contents\xactengine2_10.dll`
|
||||||
|
|
||||||
|
Note: The one that comes with IIDX will hang DDR at startup. The opposite is not true:
|
||||||
|
IIDX works just fine with this CLVSD.
|
||||||
|
|
||||||
|
### Laggy audio
|
||||||
|
|
||||||
|
If you're running on Windows XP, go to the sound devices control panel, select your
|
||||||
|
sound card, click Advanced Options and turn Hardware Acceleration down to basic. This
|
||||||
|
will make the audio much less laggy..
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# BIO2 sub IO turntable bypass cable
|
|
||||||
If you upgraded a C02 wired cabinet, the turntables are connected to the
|
|
||||||
sub IO via a serial line that goes to another sub IO behind the front panel
|
|
||||||
next to the 16seg display. This introduces additional latency as the input
|
|
||||||
data needs to pass through multiple systems/PCBs until it reaches the game.
|
|
||||||
|
|
||||||
This can be reduced by using a so-called "bypass" cable, that connects the
|
|
||||||
turntables directly to the BIO2 sub IO board by emulating the wiring of a
|
|
||||||
D01 cabinet, reducing latency significantly.
|
|
||||||
|
|
||||||
This cable could be ordered with the IIDX Rootage upgrade kit but can also
|
|
||||||
be easily created from scratch.
|
|
||||||
|
|
||||||
## Parts
|
|
||||||
* Some wires
|
|
||||||
* [JST HL](https://jst.de/file/download/219/pitch-3-96-mm-wtw-hl2-pdf) 2x4 pin female connector
|
|
||||||
* [JST HVQ](https://jst.de/file/download/637/hvq) 8 pin female connector
|
|
||||||
* Matching terminals for the connectors
|
|
||||||
|
|
||||||
## Pinout
|
|
||||||
```text
|
|
||||||
JST HL 2x4 pin front view connector
|
|
||||||
|
|
||||||
notch at top
|
|
||||||
___
|
|
||||||
|---------|
|
|
||||||
| 1 2 3 4 |
|
|
||||||
| 5 6 7 8 |
|
|
||||||
|---------|
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
JST HVQ 8 pin front view connector
|
|
||||||
Numbering on connector matches
|
|
||||||
|
|
||||||
notch at top
|
|
||||||
___________________
|
|
||||||
-------------------
|
|
||||||
|-----------------|
|
|
||||||
| 1 2 3 4 5 6 7 8 |
|
|
||||||
|-----------------|
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Pins of the two connectors need to be connected like this:
|
|
||||||
| JST HL 2x4 pin | JST 8 pin |
|
|
||||||
|----------------|-----------|
|
|
||||||
| 1 | 1 |
|
|
||||||
| 2 | 1 |
|
|
||||||
| 3 | 3 |
|
|
||||||
| 4 | 2 |
|
|
||||||
| 5 | 5 |
|
|
||||||
| 6 | 4 |
|
|
||||||
| 7 | 8 |
|
|
||||||
| 8 | 8 |
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Ezusb 1/2 RJ45 to DIN8 connector pinout
|
|
||||||
This was created from using the BIO2 sub IO board to connect pre IIDX 25 cabinet hardware to the
|
|
||||||
BIO2 IO board. The two connector types from different generation IO boards, RJ45 on the ezusb FX
|
|
||||||
(C02) board and a round DIN8 connector on the ezusb FX2 (IO2) board are just different connectors to
|
|
||||||
the same hardware on the PCB.
|
|
||||||
|
|
||||||
Therefore, any C02 wired cabinet can be easily upgraded to IO2 wiring and vice versa by building
|
|
||||||
a simple RJ45 -> DIN8 or DIN8 -> RJ45 adapter.
|
|
||||||
|
|
||||||
The following connection information was traced on a original Konami BIO2 sub IO board.
|
|
||||||
|
|
||||||
RJ45 (female) connector, top view:
|
|
||||||
```text
|
|
||||||
plug insert
|
|
||||||
|
|
|
||||||
|
|
|
||||||
v
|
|
||||||
|-----------|
|
|
||||||
| Top view |
|
|
||||||
| |
|
|
||||||
| Pins |
|
|
||||||
| 7 5 3 1 |
|
|
||||||
| 8 6 4 2 |
|
|
||||||
|-----------|
|
|
||||||
```
|
|
||||||
|
|
||||||
DIN8 (female) connector, top view:
|
|
||||||
```text
|
|
||||||
plug insert
|
|
||||||
|
|
|
||||||
|
|
|
||||||
v
|
|
||||||
|-----------|
|
|
||||||
| Top view |
|
|
||||||
| Pins |
|
|
||||||
| 3 1 2 6 |
|
|
||||||
| 7 4 5 8 9 |
|
|
||||||
|-----------|
|
|
||||||
```
|
|
||||||
|
|
||||||
The two connectors are interconnected on the PCB like this:
|
|
||||||
| RJ45 pins | DIN8 pins |
|
|
||||||
|-----------|-----------|
|
|
||||||
| 1 | 1 |
|
|
||||||
| 2 | 7 |
|
|
||||||
| 3 | 4 |
|
|
||||||
| 4 | 6 |
|
|
||||||
| 5 | 5 |
|
|
||||||
| 6 | 3 |
|
|
||||||
| 7 | 2 |
|
|
||||||
| 8 | 1 |
|
|
||||||
@@ -23,14 +23,14 @@ games:
|
|||||||
* [iidxhook8](iidxhook8.md): CANNON BALLERS, Rootage
|
* [iidxhook8](iidxhook8.md): CANNON BALLERS, Rootage
|
||||||
* [iidxhook8](iidxhook9.md): Heroic Verse
|
* [iidxhook8](iidxhook9.md): Heroic Verse
|
||||||
|
|
||||||
When building kactools, independent packages are created for each set of games
|
When building bemanitools, independent packages are created for each set of games
|
||||||
which are ready to be dropped on top of vanilla AC data dumps. We recommend
|
which are ready to be dropped on top of vanilla AC data dumps. We recommend
|
||||||
using prestine dumps to avoid any conflicts with other hardcoded hacks or
|
using pristine dumps to avoid any conflicts with other hardcoded hacks or
|
||||||
binary patches.
|
binary patches.
|
||||||
|
|
||||||
## How to run
|
## How to run
|
||||||
To run your game with iidxhook, you have to use the inject tool to inject the
|
To run your game with iidxhook, you have to use the inject tool to inject the
|
||||||
DLL to the game process. *dist/iidx* contains bat scripts with all the
|
DLL to the game process. `dist/iidx` contains bat scripts with all the
|
||||||
important parameters configured. Further parameters can be added but might not
|
important parameters configured. Further parameters can be added but might not
|
||||||
be required to run the game with default settings.
|
be required to run the game with default settings.
|
||||||
Further information on how to setup the data for each specific version are
|
Further information on how to setup the data for each specific version are
|
||||||
@@ -47,4 +47,4 @@ IO hardware you want to use:
|
|||||||
game controllers
|
game controllers
|
||||||
* [iidxio-bio2](iidxhook/iidxio-bio2.md): Support BIO2 hardware
|
* [iidxio-bio2](iidxhook/iidxio-bio2.md): Support BIO2 hardware
|
||||||
* [iidxio-ezusb](iidxhook/iidxio-ezusb.md): Support C02 ezusb FX hardware
|
* [iidxio-ezusb](iidxhook/iidxio-ezusb.md): Support C02 ezusb FX hardware
|
||||||
* [iidxio-ezusb2](iidxhook/iidxio-ezusb2.md): Support IO2 ezusb FX2 hardware
|
* [iidxio-ezusb2](iidxhook/iidxio-ezusb2.md): Support IO2 ezusb FX2 hardware
|
||||||
|
|||||||
@@ -57,6 +57,12 @@ If you want to run the games online, you have to set a valid PCBID and EAMID
|
|||||||
argument. You also have to set the url of the eamuse server you want to
|
argument. You also have to set the url of the eamuse server you want to
|
||||||
connect to.
|
connect to.
|
||||||
|
|
||||||
|
Additional note regarding EAMID: This is new compared to the prior games and
|
||||||
|
is provided as the identifier of the "eamuse license" to the server. Depending
|
||||||
|
on the implementation of the server, this can lead to authentication failure
|
||||||
|
resulting in
|
||||||
|
[a network error on boot or warning during gameplay](#network-warning-instead-of-network-ok).
|
||||||
|
|
||||||
Run the game with the gamestart-XX.bat file and enable network on the operator
|
Run the game with the gamestart-XX.bat file and enable network on the operator
|
||||||
menu. When enabled, the game seems to hang and expects you to power
|
menu. When enabled, the game seems to hang and expects you to power
|
||||||
cycle the machine (i.e. quit the game and restart it).
|
cycle the machine (i.e. quit the game and restart it).
|
||||||
@@ -134,7 +140,7 @@ value to cut down start-up times.
|
|||||||
|
|
||||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||||
This can be caused by:
|
This can be caused by:
|
||||||
* Invalid PCBID
|
* Invalid PCBID/EAMID: Ensure both are [set to the same ID](#eamuse-network-setup)
|
||||||
* Firewall blocking connections
|
* Firewall blocking connections
|
||||||
* Invalid eamuse url or port specified
|
* Invalid eamuse url or port specified
|
||||||
* Game is not run using the Administrator account
|
* Game is not run using the Administrator account
|
||||||
|
|||||||
@@ -2,6 +2,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
|
||||||
|
|
||||||
The games must be bootstrapped using [launcher](../launcher.md).
|
The games must be bootstrapped using [launcher](../launcher.md).
|
||||||
|
|
||||||
|
|||||||
77
doc/jbhook/README.md
Normal file
77
doc/jbhook/README.md
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# jbhook
|
||||||
|
|
||||||
|
jbhook is a collection of hook libraries for jubeat providing
|
||||||
|
emulation and various patches to run these games on non BemaniPC hardware and
|
||||||
|
newer Windows versions.
|
||||||
|
|
||||||
|
The hook libraries must be bootstrapped either using [inject](../inject.md) or
|
||||||
|
[launcher](../launcher.md) depending on the version you want to run. Further
|
||||||
|
instructions are given in dedicated readme files for each jbhook version
|
||||||
|
(see below).
|
||||||
|
|
||||||
|
# Versions
|
||||||
|
|
||||||
|
jbhook comes in a few different flavors. The game and its engine changed over
|
||||||
|
the years. Some game versions might require patches/parameters enabled which
|
||||||
|
others don't need or have different AVS versions. Here is the list of supported
|
||||||
|
games:
|
||||||
|
* [jbhook1](jbhook1.md): jubeat, ripples
|
||||||
|
* [jbhook2](jbhook2.md): knit, copious
|
||||||
|
* [jbhook3](jbhook3.md): saucer, prop, qubell, clan, festo
|
||||||
|
|
||||||
|
I sure have trouble remembering which jubeat version is which, here's a handy
|
||||||
|
guide:
|
||||||
|
* 01 - jubeat
|
||||||
|
* 02 - ripples
|
||||||
|
* 03 - knit
|
||||||
|
* 04 - copious
|
||||||
|
* 05 - saucer
|
||||||
|
* 06 - prop
|
||||||
|
* 07 - qubell
|
||||||
|
* 08 - clan
|
||||||
|
* 09 - festo
|
||||||
|
|
||||||
|
When building bemanitools, independent packages are created for each set of games
|
||||||
|
which are ready to be dropped on top of vanilla AC data dumps. We recommend
|
||||||
|
using pristine dumps to avoid any conflicts with other hardcoded hacks or
|
||||||
|
binary patches.
|
||||||
|
|
||||||
|
# How to run
|
||||||
|
|
||||||
|
To run your game with jbhook, you have to use the inject tool to inject the
|
||||||
|
DLL to the game process. `dist/jb` contains bat scripts with all the
|
||||||
|
important parameters configured. Further parameters can be added but might not
|
||||||
|
be required to run the game with default settings.
|
||||||
|
Further information on how to setup the data for each specific version are
|
||||||
|
elaborated in their dedicated readme files.
|
||||||
|
|
||||||
|
# Data setup and running the game
|
||||||
|
|
||||||
|
Ensure your folder with your unpacked data looks like this:
|
||||||
|
- `data`
|
||||||
|
- `prop`
|
||||||
|
- Various dll files including `jubeat.dll` **OR** `jubeat.exe`
|
||||||
|
|
||||||
|
Unpack the package containing jbhook into the folder containing the jubeat
|
||||||
|
binary file.
|
||||||
|
|
||||||
|
Run the `gamestart-XX.bat` file where `XX` denotes the version of the game you want to run.
|
||||||
|
|
||||||
|
# Eamuse network setup
|
||||||
|
|
||||||
|
Running jubeat or ripples? Modify jbhook-01.conf or jbhook-02.conf.
|
||||||
|
|
||||||
|
Running anything newer?
|
||||||
|
* Open the `prop/ea3-config.xml`
|
||||||
|
* Replace the `ea3/network/services` URL with network service URL of your
|
||||||
|
choice (for example http://my.eamuse.com)
|
||||||
|
* Edit the `ea3/id/pcbid`
|
||||||
|
|
||||||
|
# Real hardware support
|
||||||
|
|
||||||
|
Run the launcher without the hook dll: `launcher jubeat.dll`
|
||||||
|
|
||||||
|
# Command line options
|
||||||
|
|
||||||
|
Add the argument *-h* when running inject with jbhook to print help/usage
|
||||||
|
information with a list of parameters you can apply to tweak various things.
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Game list
|
|
||||||
|
|
||||||
The following games are compatible with this version of jbhook:
|
|
||||||
* saucer
|
|
||||||
* prop
|
|
||||||
* qubell
|
|
||||||
|
|
||||||
# Data setup and running the game
|
|
||||||
|
|
||||||
Ensure your folder with your unpacked data looks like this:
|
|
||||||
- data
|
|
||||||
- prop
|
|
||||||
- Various dll files including jubeat.dll
|
|
||||||
|
|
||||||
Unpack the package containing jbhook into the folder containing the jubeat.dll
|
|
||||||
file.
|
|
||||||
|
|
||||||
Run the gamestart.bat file.
|
|
||||||
|
|
||||||
# Eamuse network setup
|
|
||||||
|
|
||||||
* Open the prop/ea3-config.xml
|
|
||||||
* Replace the *ea3/network/services* URL with network service URL of your
|
|
||||||
choice (for example http://my.eamuse.com)
|
|
||||||
* Edit the *ea3/id/pcbid*
|
|
||||||
|
|
||||||
# Real hardware support
|
|
||||||
|
|
||||||
Run the launcher without the hook dll: *launcher jubeat.dll*
|
|
||||||
|
|
||||||
# Troubleshooting and FAQ
|
|
||||||
42
doc/jbhook/jbhook1.md
Normal file
42
doc/jbhook/jbhook1.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Game list
|
||||||
|
|
||||||
|
The following games are compatible with this version of jbhook:
|
||||||
|
* jubeat
|
||||||
|
* jubeat ripples
|
||||||
|
|
||||||
|
The games must be bootstrapped using [inject](../inject.md).
|
||||||
|
|
||||||
|
# Data setup and running the game
|
||||||
|
|
||||||
|
Unpack the package containing jbhook1 into the revision folder of your choice.
|
||||||
|
Most likely, you want to target the latest revision you have to run the latest
|
||||||
|
binary of the game with any bugfixes by developers.
|
||||||
|
|
||||||
|
The DLLs in this package should be in the same location as the game DLLs and
|
||||||
|
executable - i.e. all these files should be in the same folder:
|
||||||
|
- `inject.exe`
|
||||||
|
- `jubeat.exe`
|
||||||
|
- `jbhook-01.conf`
|
||||||
|
- `eamio.dll`
|
||||||
|
- `libavs-win32.dll`
|
||||||
|
- etc
|
||||||
|
|
||||||
|
Run the `gamestart-01.bat` file as admin.
|
||||||
|
|
||||||
|
# Eamuse network setup
|
||||||
|
|
||||||
|
If you want to run the games online, you have to set a valid PCBID in the
|
||||||
|
configuration file. You also have to set the url of the eamuse server you want
|
||||||
|
to connect to.
|
||||||
|
|
||||||
|
# Eamuse network setup
|
||||||
|
|
||||||
|
If you want to run the games online, you have to set a valid PCBID and EAMID
|
||||||
|
(use the PCBID as the EAMID) in the configuration file or as a command line
|
||||||
|
argument. You also have to set the url of the eamuse server you want to
|
||||||
|
connect to.
|
||||||
|
|
||||||
|
Additional note regarding EAMID: This is provided as the identifier of the
|
||||||
|
"eamuse license" to the server. Depending on the implementation of the server,
|
||||||
|
this can lead to authentication failure resulting in a network error on boot or
|
||||||
|
warning during gameplay.
|
||||||
42
doc/jbhook/jbhook2.md
Normal file
42
doc/jbhook/jbhook2.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Game list
|
||||||
|
|
||||||
|
The following games are compatible with this version of jbhook:
|
||||||
|
* jubeat knit
|
||||||
|
* jubeat copious
|
||||||
|
|
||||||
|
The games must be bootstrapped using [launcher](../launcher.md).
|
||||||
|
|
||||||
|
# Data setup and running the game
|
||||||
|
|
||||||
|
Unpack the package containing jbhook2 into the revision folder of your choice.
|
||||||
|
Most likely, you want to target the latest revision you have to run the latest
|
||||||
|
binary of the game with any bugfixes by developers.
|
||||||
|
|
||||||
|
The DLLs in this package should be in the same location as the game DLLs and
|
||||||
|
executable - i.e. all these files should be in the same folder:
|
||||||
|
- `launcher.exe`
|
||||||
|
- `jubeat.dll`
|
||||||
|
- `eamio.dll`
|
||||||
|
- `jbhook2.dll`
|
||||||
|
- `libavs-win32.dll`
|
||||||
|
- etc
|
||||||
|
|
||||||
|
Run the `gamestart-02.bat` file as admin.
|
||||||
|
|
||||||
|
# Eamuse network setup
|
||||||
|
|
||||||
|
If you want to run the games online, you have to set a valid PCBID in the
|
||||||
|
configuration file. You also have to set the url of the eamuse server you want
|
||||||
|
to connect to.
|
||||||
|
|
||||||
|
# Eamuse network setup
|
||||||
|
|
||||||
|
If you want to run the games online, you have to set a valid PCBID and EAMID
|
||||||
|
(use the PCBID as the EAMID) in the configuration file or as a command line
|
||||||
|
argument. You also have to set the url of the eamuse server you want to
|
||||||
|
connect to.
|
||||||
|
|
||||||
|
Additional note regarding EAMID: This is provided as the identifier of the
|
||||||
|
"eamuse license" to the server. Depending on the implementation of the server,
|
||||||
|
this can lead to authentication failure resulting in a network error on boot or
|
||||||
|
warning during gameplay.
|
||||||
18
doc/jbhook/jbhook3.md
Normal file
18
doc/jbhook/jbhook3.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Game list
|
||||||
|
|
||||||
|
The following games are compatible with this version of jbhook:
|
||||||
|
* jubeat saucer
|
||||||
|
* jubeat prop
|
||||||
|
* jubeat qubell
|
||||||
|
* jubeat clan
|
||||||
|
* jubeat festo
|
||||||
|
|
||||||
|
The games must be bootstrapped using [launcher](../launcher.md).
|
||||||
|
|
||||||
|
# Data setup and running the game
|
||||||
|
|
||||||
|
Unpack the package containing jbhook3 into the revision folder of your choice.
|
||||||
|
Most likely, you want to target the latest revision you have to run the latest
|
||||||
|
binary of the game with any bugfixes by developers.
|
||||||
|
|
||||||
|
Run the `gamestart-03.bat` file as admin.
|
||||||
28
scripts/ci/create-release-message.sh
Executable file
28
scripts/ci/create-release-message.sh
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
VERSION="$1"
|
||||||
|
|
||||||
|
section_active=""
|
||||||
|
changelog_excerpt=""
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if [ "$section_active" ]; then
|
||||||
|
if [[ "$(echo "$line" | grep '^#')" ]]; then
|
||||||
|
section_active=""
|
||||||
|
else
|
||||||
|
changelog_excerpt="$(printf "%s\n%s" "$changelog_excerpt" "$line")"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$line" = "## $VERSION" ]; then
|
||||||
|
section_active="1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$changelog_excerpt" ]; then
|
||||||
|
printf "%s" "$changelog_excerpt"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
>&2 echo "Could not find version in changelog: $VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -46,6 +46,12 @@ struct property_node;
|
|||||||
struct avs_net_interface {
|
struct avs_net_interface {
|
||||||
uint8_t mac_addr[6];
|
uint8_t mac_addr[6];
|
||||||
uint8_t unknown[30];
|
uint8_t unknown[30];
|
||||||
|
#if AVS_VERSION >= 1603
|
||||||
|
uint8_t unknown2[6];
|
||||||
|
#endif
|
||||||
|
#if AVS_VERSION >= 1700
|
||||||
|
uint8_t unknown3[6];
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
enum psmap_type {
|
enum psmap_type {
|
||||||
|
|||||||
10
src/imports/glhelper.h
Normal file
10
src/imports/glhelper.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
void glFramebufferTexture2DEXT(GLenum target,
|
||||||
|
GLenum attachment,
|
||||||
|
GLenum textarget,
|
||||||
|
GLuint texture,
|
||||||
|
GLint level);
|
||||||
|
|
||||||
|
void glGenFramebuffersEXT(GLsizei n,
|
||||||
|
GLuint *ids);
|
||||||
5
src/imports/import_32_1002_avs-ea3.def
Normal file
5
src/imports/import_32_1002_avs-ea3.def
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
LIBRARY libavs-win32-ea3
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
ea3_boot
|
||||||
|
ea3_shutdown
|
||||||
39
src/imports/import_32_1002_avs.def
Normal file
39
src/imports/import_32_1002_avs.def
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
LIBRARY libavs-win32
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
avs_boot
|
||||||
|
avs_net_ctrl
|
||||||
|
avs_shutdown
|
||||||
|
avs_thread_create
|
||||||
|
avs_thread_destroy
|
||||||
|
avs_thread_exit
|
||||||
|
avs_thread_join
|
||||||
|
log_body_fatal
|
||||||
|
log_body_info
|
||||||
|
log_body_misc
|
||||||
|
log_body_warning
|
||||||
|
log_boot
|
||||||
|
log_change_level
|
||||||
|
property_create
|
||||||
|
property_desc_to_buffer
|
||||||
|
property_destroy
|
||||||
|
property_file_write
|
||||||
|
property_insert_read
|
||||||
|
property_mem_write
|
||||||
|
property_read_query_memsize
|
||||||
|
property_search
|
||||||
|
property_set_flag
|
||||||
|
property_node_clone
|
||||||
|
property_node_create
|
||||||
|
property_node_datasize
|
||||||
|
property_node_name
|
||||||
|
property_node_refer
|
||||||
|
property_node_remove
|
||||||
|
property_node_type
|
||||||
|
property_node_traversal
|
||||||
|
property_node_refdata
|
||||||
|
property_psmap_export
|
||||||
|
property_psmap_import
|
||||||
|
std_getenv
|
||||||
|
std_setenv
|
||||||
|
|
||||||
6
src/imports/import_32_1002_glhelper.def
Normal file
6
src/imports/import_32_1002_glhelper.def
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LIBRARY glhelper
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glBindFramebufferEXT
|
||||||
|
glFramebufferTexture2DEXT
|
||||||
|
glGenFramebuffersEXT
|
||||||
6
src/imports/import_32_1101_glhelper.def
Normal file
6
src/imports/import_32_1101_glhelper.def
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LIBRARY glhelper
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glBindFramebufferEXT
|
||||||
|
glFramebufferTexture2DEXT
|
||||||
|
glGenFramebuffersEXT
|
||||||
6
src/imports/import_32_1304_glhelper.def
Normal file
6
src/imports/import_32_1304_glhelper.def
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LIBRARY glhelper
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glBindFramebufferEXT
|
||||||
|
glFramebufferTexture2DEXT
|
||||||
|
glGenFramebuffersEXT
|
||||||
6
src/imports/import_32_803_glhelper.def
Normal file
6
src/imports/import_32_803_glhelper.def
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LIBRARY glhelper
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glBindFramebufferEXT
|
||||||
|
glFramebufferTexture2DEXT
|
||||||
|
glGenFramebuffersEXT
|
||||||
@@ -9,7 +9,9 @@
|
|||||||
#include "acio/hdxs.h"
|
#include "acio/hdxs.h"
|
||||||
#include "acio/icca.h"
|
#include "acio/icca.h"
|
||||||
#include "acio/kfca.h"
|
#include "acio/kfca.h"
|
||||||
|
#include "acio/mdxf.h"
|
||||||
#include "acio/panb.h"
|
#include "acio/panb.h"
|
||||||
|
#include "acio/rvol.h"
|
||||||
|
|
||||||
#define AC_IO_SOF 0xAA
|
#define AC_IO_SOF 0xAA
|
||||||
#define AC_IO_ESCAPE 0xFF
|
#define AC_IO_ESCAPE 0xFF
|
||||||
@@ -37,9 +39,11 @@ enum ac_io_node_type {
|
|||||||
AC_IO_NODE_TYPE_LED_STRIP = 0x04020000,
|
AC_IO_NODE_TYPE_LED_STRIP = 0x04020000,
|
||||||
AC_IO_NODE_TYPE_LED_SPIKE = 0x05010000,
|
AC_IO_NODE_TYPE_LED_SPIKE = 0x05010000,
|
||||||
AC_IO_NODE_TYPE_KFCA = 0x09060000,
|
AC_IO_NODE_TYPE_KFCA = 0x09060000,
|
||||||
AC_IO_NODE_TYPE_BI2A = 0x0d060000,
|
|
||||||
AC_IO_NODE_TYPE_RVOL = 0x09060001,
|
AC_IO_NODE_TYPE_RVOL = 0x09060001,
|
||||||
|
AC_IO_NODE_TYPE_MDXF = 0x09070000,
|
||||||
AC_IO_NODE_TYPE_PANB = 0x090E0000,
|
AC_IO_NODE_TYPE_PANB = 0x090E0000,
|
||||||
|
AC_IO_NODE_TYPE_BMPU = 0x0B000000,
|
||||||
|
AC_IO_NODE_TYPE_BI2A = 0x0D060000,
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
@@ -84,6 +88,12 @@ struct ac_io_message {
|
|||||||
struct ac_io_panb_poll_out panb_poll_out;
|
struct ac_io_panb_poll_out panb_poll_out;
|
||||||
|
|
||||||
struct ac_io_hdxs_output hdxs_output;
|
struct ac_io_hdxs_output hdxs_output;
|
||||||
|
|
||||||
|
struct ac_io_rvol_poll_in rvol_poll_in;
|
||||||
|
struct ac_io_rvol_poll_out rvol_poll_out;
|
||||||
|
|
||||||
|
struct ac_io_mdxf_poll_in mdxf_poll_in;
|
||||||
|
struct ac_io_mdxf_light_out mdxf_light_out;
|
||||||
};
|
};
|
||||||
} cmd;
|
} cmd;
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,15 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
enum ac_io_icca_cmd {
|
enum ac_io_icca_cmd {
|
||||||
|
/* found on jubeat, sent right after queue loop start */
|
||||||
|
AC_IO_ICCA_CMD_UNKN_0116 = 0x0116,
|
||||||
/* Yet unknown command encountered first on jubeat (1) */
|
/* Yet unknown command encountered first on jubeat (1) */
|
||||||
AC_IO_ICCA_CMD_UNKN_0120 = 0x0120,
|
AC_IO_ICCA_CMD_UNKN_0120 = 0x0120,
|
||||||
AC_IO_ICCA_CMD_QUEUE_LOOP_START = 0x0130,
|
AC_IO_ICCA_CMD_QUEUE_LOOP_START = 0x0130,
|
||||||
AC_IO_ICCA_CMD_ENGAGE = 0x0131,
|
AC_IO_ICCA_CMD_ENGAGE = 0x0131,
|
||||||
AC_IO_ICCA_CMD_POLL = 0x0134,
|
AC_IO_ICCA_CMD_POLL = 0x0134,
|
||||||
AC_IO_ICCA_CMD_SET_SLOT_STATE = 0x0135,
|
AC_IO_ICCA_CMD_SET_SLOT_STATE = 0x0135,
|
||||||
AC_IO_ICCA_CMD_BEGIN_KEYPAD = 0x013A,
|
AC_IO_ICCA_CMD_DEVICE_CONTROL = 0x013A,
|
||||||
AC_IO_ICCA_CMD_POLL_FELICA = 0x0161,
|
AC_IO_ICCA_CMD_POLL_FELICA = 0x0161,
|
||||||
AC_IO_ICCA_CMD_KEY_EXCHANGE = 0x0160,
|
AC_IO_ICCA_CMD_KEY_EXCHANGE = 0x0160,
|
||||||
AC_IO_ICCA_CMD_POLL_ENCRYPTED = 0x0164,
|
AC_IO_ICCA_CMD_POLL_ENCRYPTED = 0x0164,
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
#ifndef AC_IO_ICCB_H
|
|
||||||
#define AC_IO_ICCB_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
enum ac_io_iccb_cmd {
|
|
||||||
/* found on jubeat prop, sent after acio init req, maybe fw update? */
|
|
||||||
AC_IO_ICCB_CMD_UNK_0100 = 0x0100,
|
|
||||||
/* found on jubeat prop, sent right after queue loop start */
|
|
||||||
AC_IO_ICCB_CMD_UNK_0116 = 0x0116,
|
|
||||||
/* found on jubeat prop, sent after 0100 req */
|
|
||||||
AC_IO_ICCB_CMD_UNK_0120 = 0x0120,
|
|
||||||
AC_IO_ICCB_CMD_QUEUE_LOOP_START = 0x0130,
|
|
||||||
AC_IO_ICCB_CMD_POLL = 0x0134,
|
|
||||||
AC_IO_ICCB_CMD_UNK_135 = 0x0135,
|
|
||||||
AC_IO_ICCB_CMD_SLEEP = 0x013A,
|
|
||||||
AC_IO_ICCB_CMD_READ_CARD = 0x0161
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ac_io_iccb_sensor_state {
|
|
||||||
AC_IO_ICCB_SENSOR_CARD = 0x02,
|
|
||||||
AC_IO_ICCB_SENSOR_NO_CARD = 0x04
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ac_io_iccb_card_type {
|
|
||||||
AC_IO_ICCB_CARD_TYPE_ISO15696 = 0x0,
|
|
||||||
AC_IO_ICCB_CARD_TYPE_FELICA = 0x1,
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
|
|
||||||
struct ac_io_iccb_misc {
|
|
||||||
uint8_t unknown;
|
|
||||||
uint8_t subcmd;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ac_io_iccb_state {
|
|
||||||
uint8_t sensor_state;
|
|
||||||
uint8_t card_type;
|
|
||||||
uint8_t uid[8];
|
|
||||||
uint8_t unk2;
|
|
||||||
uint8_t unk3;
|
|
||||||
uint8_t unk4[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -41,8 +41,7 @@ struct ac_io_kfca_poll_in {
|
|||||||
|
|
||||||
struct ac_io_kfca_poll_out {
|
struct ac_io_kfca_poll_out {
|
||||||
uint32_t gpio;
|
uint32_t gpio;
|
||||||
uint8_t pwm[18];
|
uint8_t pwm[20];
|
||||||
uint8_t unk[2];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|||||||
49
src/main/acio/mdxf.h
Normal file
49
src/main/acio/mdxf.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#ifndef AC_IO_MDXF_H
|
||||||
|
#define AC_IO_MDXF_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define AC_IO_CMD_MDXF_POLL 0x0110
|
||||||
|
#define AC_IO_CMD_MDXF_AUTO_GET_START 0x0116
|
||||||
|
#define AC_IO_CMD_MDXF_LIGHT 0x0113
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
|
union mdxf_panel_sensors_individual {
|
||||||
|
struct {
|
||||||
|
uint8_t right : 1;
|
||||||
|
uint8_t left : 1;
|
||||||
|
uint8_t down : 1;
|
||||||
|
uint8_t up : 1;
|
||||||
|
uint8_t unused : 4;
|
||||||
|
};
|
||||||
|
uint8_t raw;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mdxf_panel_sensors {
|
||||||
|
uint8_t down : 4;
|
||||||
|
uint8_t up : 4;
|
||||||
|
uint8_t right : 4;
|
||||||
|
uint8_t left : 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_mdxf_poll_in {
|
||||||
|
struct mdxf_panel_sensors panel;
|
||||||
|
uint8_t unk;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mdxf_lights {
|
||||||
|
uint8_t up_right;
|
||||||
|
uint8_t down_left;
|
||||||
|
uint8_t up_left;
|
||||||
|
uint8_t down_right;
|
||||||
|
uint8_t unk;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_mdxf_light_out {
|
||||||
|
struct mdxf_lights side[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#endif
|
||||||
74
src/main/acio/rvol.h
Normal file
74
src/main/acio/rvol.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#ifndef AC_IO_RVOL_H
|
||||||
|
#define AC_IO_RVOL_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// technically RVOL also can poll with CMD 0x0113
|
||||||
|
// but museca never uses this (it's controlled by if the watchdog is on/off)
|
||||||
|
#define AC_IO_CMD_RVOL_POLL 0x0112
|
||||||
|
#define AC_IO_CMD_RVOL_SET_EXPAND_MODE 0x0114
|
||||||
|
#define AC_IO_CMD_RVOL_AMP_CONTROL 0x0128
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
|
struct ac_io_rvol_buttons_1 {
|
||||||
|
uint8_t unk0 : 1;
|
||||||
|
uint8_t unk1 : 1;
|
||||||
|
uint8_t spinner_4 : 1;
|
||||||
|
uint8_t pedal : 1;
|
||||||
|
uint8_t spinner_5 : 1;
|
||||||
|
uint8_t unk5 : 1;
|
||||||
|
uint8_t unk6 : 1;
|
||||||
|
uint8_t unk7 : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_rvol_buttons_2 {
|
||||||
|
uint8_t spinner_2 : 1;
|
||||||
|
uint8_t unk1 : 1;
|
||||||
|
uint8_t unk2 : 1;
|
||||||
|
uint8_t spinner_1 : 1;
|
||||||
|
uint8_t unk4 : 1;
|
||||||
|
uint8_t unk5 : 1;
|
||||||
|
uint8_t unk6 : 1;
|
||||||
|
uint8_t unk7 : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_rvol_buttons_3 {
|
||||||
|
uint8_t unk0 : 1;
|
||||||
|
uint8_t unk1 : 1;
|
||||||
|
uint8_t unk2 : 1;
|
||||||
|
uint8_t spinner_3 : 1;
|
||||||
|
uint8_t unk4 : 1;
|
||||||
|
uint8_t unk5 : 1;
|
||||||
|
uint8_t unk6 : 1;
|
||||||
|
uint8_t unk7 : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_rvol_poll_in {
|
||||||
|
uint8_t unk_0;
|
||||||
|
struct ac_io_rvol_buttons_1 buttons_1;
|
||||||
|
uint8_t unk_2_8[7];
|
||||||
|
struct ac_io_rvol_buttons_2 buttons_2;
|
||||||
|
uint8_t unk_10;
|
||||||
|
struct ac_io_rvol_buttons_3 buttons_3;
|
||||||
|
uint8_t unk_12_15[4];
|
||||||
|
uint8_t spinners[5];
|
||||||
|
uint8_t unk_21_22[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct light_rgb {
|
||||||
|
uint8_t r;
|
||||||
|
uint8_t g;
|
||||||
|
uint8_t b;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ac_io_rvol_poll_out {
|
||||||
|
uint8_t unk0_3[4];
|
||||||
|
struct light_rgb spinner[5];
|
||||||
|
struct light_rgb title;
|
||||||
|
uint8_t unk22_31[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -8,5 +8,6 @@ src_aciodrv := \
|
|||||||
icca.c \
|
icca.c \
|
||||||
kfca.c \
|
kfca.c \
|
||||||
panb.c \
|
panb.c \
|
||||||
|
rvol.c \
|
||||||
port.c \
|
port.c \
|
||||||
|
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ static bool aciodrv_device_get_version(struct aciodrv_device_ctx *device, uint8_
|
|||||||
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->major = msg.cmd.version.major;
|
version->major = msg.cmd.version.major;
|
||||||
version->minor = msg.cmd.version.minor;
|
version->minor = msg.cmd.version.minor;
|
||||||
version->revision = msg.cmd.version.revision;
|
version->revision = msg.cmd.version.revision;
|
||||||
@@ -392,6 +393,14 @@ bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx *device, ui
|
|||||||
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)
|
||||||
|
{
|
||||||
|
if (device->node_count == 0 || node_id > device->node_count) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ struct aciodrv_device_ctx;
|
|||||||
|
|
||||||
struct aciodrv_device_node_version {
|
struct aciodrv_device_node_version {
|
||||||
char product[ACIO_NODE_PRODUCT_CODE_LEN];
|
char product[ACIO_NODE_PRODUCT_CODE_LEN];
|
||||||
|
uint32_t type;
|
||||||
uint8_t major;
|
uint8_t major;
|
||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
uint8_t revision;
|
uint8_t revision;
|
||||||
@@ -52,6 +53,15 @@ uint8_t aciodrv_device_get_node_count(struct aciodrv_device_ctx *device);
|
|||||||
*/
|
*/
|
||||||
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.
|
||||||
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
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.
|
||||||
*
|
*
|
||||||
|
|||||||
80
src/main/aciodrv/rvol.c
Normal file
80
src/main/aciodrv/rvol.c
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
#define LOG_MODULE "aciodrv-rvol"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
|
#include "util/log.h"
|
||||||
|
|
||||||
|
static bool aciodrv_rvol_change_expand_mode(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
uint8_t mode)
|
||||||
|
{
|
||||||
|
struct ac_io_message msg;
|
||||||
|
|
||||||
|
log_assert(device);
|
||||||
|
|
||||||
|
msg.addr = node_id + 1;
|
||||||
|
msg.cmd.code = ac_io_u16(AC_IO_CMD_RVOL_SET_EXPAND_MODE);
|
||||||
|
msg.cmd.nbytes = 1;
|
||||||
|
|
||||||
|
msg.cmd.raw[0] = (mode | (2 * mode)) << 6;
|
||||||
|
|
||||||
|
if (!aciodrv_send_and_recv(
|
||||||
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
|
log_warning("RVOL change expand mode failed %d", node_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("I/O expand mode set %d, mode: %d",
|
||||||
|
node_id, mode);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aciodrv_rvol_init(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
|
{
|
||||||
|
log_assert(device);
|
||||||
|
|
||||||
|
if (!aciodrv_rvol_change_expand_mode(device, node_id, 1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aciodrv_rvol_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
const struct ac_io_rvol_poll_out *pout,
|
||||||
|
struct ac_io_rvol_poll_in *pin)
|
||||||
|
{
|
||||||
|
struct ac_io_message msg;
|
||||||
|
|
||||||
|
log_assert(device);
|
||||||
|
log_assert(pout);
|
||||||
|
|
||||||
|
msg.addr = node_id + 1;
|
||||||
|
msg.cmd.code = ac_io_u16(AC_IO_CMD_RVOL_POLL);
|
||||||
|
msg.cmd.nbytes = sizeof(*pout);
|
||||||
|
/* buffer size of data we expect */
|
||||||
|
msg.cmd.rvol_poll_out = *pout;
|
||||||
|
|
||||||
|
if (!aciodrv_send_and_recv(
|
||||||
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
||||||
|
log_warning("Polling of node %d failed", node_id + 1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pin != NULL) {
|
||||||
|
memcpy(pin, &msg.cmd.rvol_poll_in, sizeof(*pin));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
36
src/main/aciodrv/rvol.h
Normal file
36
src/main/aciodrv/rvol.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef ACIODRV_RVOL_H
|
||||||
|
#define ACIODRV_RVOL_H
|
||||||
|
|
||||||
|
#include "acio/rvol.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a Revolte (KFCA 1.5) IO board
|
||||||
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
|
* @param node_id Id of the node to initialize (0 based).
|
||||||
|
* @return True if successful, false on error.
|
||||||
|
* @note This module is supposed to be used in combination with the common
|
||||||
|
* device driver foundation.
|
||||||
|
* @see driver.h
|
||||||
|
*/
|
||||||
|
bool aciodrv_rvol_init(struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Poll a Revolte (KFCA 1.5) IO board
|
||||||
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
|
* @param node_id Id of the node to query (0 based).
|
||||||
|
* @param pout Pointer to a state struct to write to device
|
||||||
|
* @param pin Pointer to a state struct to return the current state to
|
||||||
|
* @return True on success, false on error.
|
||||||
|
* @note This module is supposed to be used in combination with the common
|
||||||
|
* device driver foundation.
|
||||||
|
* @see driver.h
|
||||||
|
*/
|
||||||
|
bool aciodrv_rvol_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
const struct ac_io_rvol_poll_out *pout,
|
||||||
|
struct ac_io_rvol_poll_in *pin);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -6,6 +6,5 @@ src_acioemu := \
|
|||||||
h44b.c \
|
h44b.c \
|
||||||
hdxs.c \
|
hdxs.c \
|
||||||
icca.c \
|
icca.c \
|
||||||
iccb.c \
|
|
||||||
pipe.c \
|
pipe.c \
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ void ac_io_emu_icca_init(
|
|||||||
|
|
||||||
// default to 1.6.0
|
// default to 1.6.0
|
||||||
icca->version = v160;
|
icca->version = v160;
|
||||||
|
// default, most common code
|
||||||
|
ac_io_emu_icca_set_product_code(icca, AC_IO_EMU_PROD_CODE_ICCA);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ac_io_emu_icca_set_version(
|
void ac_io_emu_icca_set_version(
|
||||||
@@ -71,6 +73,12 @@ void ac_io_emu_icca_set_version(
|
|||||||
icca->version = version;
|
icca->version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ac_io_emu_icca_set_product_code(
|
||||||
|
struct ac_io_emu_icca *icca, const char product_code[4])
|
||||||
|
{
|
||||||
|
memcpy(icca->product_code, product_code, sizeof(icca->product_code));
|
||||||
|
}
|
||||||
|
|
||||||
void ac_io_emu_icca_dispatch_request(
|
void ac_io_emu_icca_dispatch_request(
|
||||||
struct ac_io_emu_icca *icca, const struct ac_io_message *req)
|
struct ac_io_emu_icca *icca, const struct ac_io_message *req)
|
||||||
{
|
{
|
||||||
@@ -119,14 +127,15 @@ void ac_io_emu_icca_dispatch_request(
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AC_IO_ICCA_CMD_UNKN_0116:
|
||||||
case AC_IO_ICCA_CMD_UNKN_0120:
|
case AC_IO_ICCA_CMD_UNKN_0120:
|
||||||
log_misc("AC_IO_ICCA_CMD_UNKN_0120(%d)", req->addr);
|
log_misc("AC_IO_ICCA_CMD_UNK_%04X(%d)", cmd_code, req->addr);
|
||||||
ac_io_emu_icca_send_status(icca, req, 0x00);
|
ac_io_emu_icca_send_status(icca, req, 0x00);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AC_IO_ICCA_CMD_BEGIN_KEYPAD:
|
case AC_IO_ICCA_CMD_DEVICE_CONTROL:
|
||||||
log_misc("AC_IO_ICCA_CMD_BEGIN_KEYPAD(%d)", req->addr);
|
log_misc("AC_IO_ICCA_CMD_DEVICE_CONTROL(%d)", req->addr);
|
||||||
ac_io_emu_icca_send_status(icca, req, 0x00);
|
ac_io_emu_icca_send_status(icca, req, 0x00);
|
||||||
icca->keypad_started = true;
|
icca->keypad_started = true;
|
||||||
|
|
||||||
@@ -138,48 +147,52 @@ 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: {
|
||||||
struct ac_io_icca_misc *misc =
|
if(icca->version == v150) {
|
||||||
(struct ac_io_icca_misc *) &req->cmd.raw;
|
ac_io_emu_icca_send_state(icca, req, 0, false);
|
||||||
uint8_t cmd;
|
} else {
|
||||||
|
struct ac_io_icca_misc *misc =
|
||||||
|
(struct ac_io_icca_misc *) &req->cmd.raw;
|
||||||
|
uint8_t cmd;
|
||||||
|
|
||||||
switch (misc->subcmd) {
|
switch (misc->subcmd) {
|
||||||
case AC_IO_ICCA_SUBCMD_CARD_SLOT_CLOSE:
|
case AC_IO_ICCA_SUBCMD_CARD_SLOT_CLOSE:
|
||||||
cmd = EAM_IO_CARD_SLOT_CMD_CLOSE;
|
cmd = EAM_IO_CARD_SLOT_CMD_CLOSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AC_IO_ICCA_SUBCMD_CARD_SLOT_OPEN:
|
case AC_IO_ICCA_SUBCMD_CARD_SLOT_OPEN:
|
||||||
cmd = EAM_IO_CARD_SLOT_CMD_OPEN;
|
cmd = EAM_IO_CARD_SLOT_CMD_OPEN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AC_IO_ICCA_SUBCMD_CARD_SLOT_EJECT:
|
case AC_IO_ICCA_SUBCMD_CARD_SLOT_EJECT:
|
||||||
cmd = EAM_IO_CARD_SLOT_CMD_EJECT;
|
cmd = EAM_IO_CARD_SLOT_CMD_EJECT;
|
||||||
icca->engaged = false;
|
icca->engaged = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
cmd = EAM_IO_CARD_SLOT_CMD_READ;
|
cmd = EAM_IO_CARD_SLOT_CMD_READ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cmd = 0xFF;
|
cmd = 0xFF;
|
||||||
log_warning(
|
log_warning(
|
||||||
"Unhandled slot command %X, node %d",
|
"Unhandled slot command %X, node %d",
|
||||||
misc->subcmd,
|
misc->subcmd,
|
||||||
icca->unit_no);
|
icca->unit_no);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd != 0xFF) {
|
|
||||||
if (!eam_io_card_slot_cmd(icca->unit_no, cmd)) {
|
|
||||||
log_warning(
|
|
||||||
"Eamio failed to handle slot cmd %d for node %d",
|
|
||||||
cmd,
|
|
||||||
icca->unit_no);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* response with current slot state */
|
if (cmd != 0xFF) {
|
||||||
ac_io_emu_icca_send_status(icca, req, misc->subcmd);
|
if (!eam_io_card_slot_cmd(icca->unit_no, cmd)) {
|
||||||
|
log_warning(
|
||||||
|
"Eamio failed to handle slot cmd %d for node %d",
|
||||||
|
cmd,
|
||||||
|
icca->unit_no);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* response with current slot state */
|
||||||
|
ac_io_emu_icca_send_status(icca, req, misc->subcmd);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -202,12 +215,14 @@ void ac_io_emu_icca_dispatch_request(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AC_IO_ICCA_CMD_POLL_FELICA:
|
case AC_IO_ICCA_CMD_POLL_FELICA:
|
||||||
icca->detected_new_reader = true;
|
if (icca->version == v150) {
|
||||||
|
ac_io_emu_icca_send_state(icca, req, 0, false);
|
||||||
if (icca->version == v170) {
|
} else if (icca->version == v170) {
|
||||||
ac_io_emu_icca_send_empty(icca, req);
|
ac_io_emu_icca_send_empty(icca, req);
|
||||||
|
icca->detected_new_reader = true;
|
||||||
} else {
|
} else {
|
||||||
ac_io_emu_icca_send_status(icca, req, 0x01);
|
ac_io_emu_icca_send_status(icca, req, 0x01);
|
||||||
|
icca->detected_new_reader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -244,8 +259,6 @@ static void ac_io_emu_icca_cmd_send_version(
|
|||||||
resp.cmd.version.major = 0x01;
|
resp.cmd.version.major = 0x01;
|
||||||
|
|
||||||
if (icca->version == v150) {
|
if (icca->version == v150) {
|
||||||
log_warning(
|
|
||||||
"ICCA v1.5.0 emulation requested, please remove this log once implemented");
|
|
||||||
resp.cmd.version.minor = 0x05;
|
resp.cmd.version.minor = 0x05;
|
||||||
} else if (icca->version == v160) {
|
} else if (icca->version == v160) {
|
||||||
resp.cmd.version.minor = 0x06;
|
resp.cmd.version.minor = 0x06;
|
||||||
@@ -262,7 +275,7 @@ static void ac_io_emu_icca_cmd_send_version(
|
|||||||
|
|
||||||
memcpy(
|
memcpy(
|
||||||
resp.cmd.version.product_code,
|
resp.cmd.version.product_code,
|
||||||
"ICCA",
|
icca->product_code,
|
||||||
sizeof(resp.cmd.version.product_code));
|
sizeof(resp.cmd.version.product_code));
|
||||||
strncpy(resp.cmd.version.date, __DATE__, sizeof(resp.cmd.version.date));
|
strncpy(resp.cmd.version.date, __DATE__, sizeof(resp.cmd.version.date));
|
||||||
strncpy(resp.cmd.version.time, __TIME__, sizeof(resp.cmd.version.time));
|
strncpy(resp.cmd.version.time, __TIME__, sizeof(resp.cmd.version.time));
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ enum ac_io_emu_icca_version {
|
|||||||
v170 = 0x7,
|
v170 = 0x7,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ICC product types for ac_io_emu_icca_set_product_code
|
||||||
|
#define AC_IO_EMU_PROD_CODE_ICCA "ICCA"
|
||||||
|
#define AC_IO_EMU_PROD_CODE_ICCB "ICCB"
|
||||||
|
#define AC_IO_EMU_PROD_CODE_ICCC "ICCC"
|
||||||
|
|
||||||
struct ac_io_emu_icca {
|
struct ac_io_emu_icca {
|
||||||
struct ac_io_emu *emu;
|
struct ac_io_emu *emu;
|
||||||
uint8_t unit_no;
|
uint8_t unit_no;
|
||||||
@@ -28,6 +33,7 @@ struct ac_io_emu_icca {
|
|||||||
uint64_t time_counter_last_poll;
|
uint64_t time_counter_last_poll;
|
||||||
|
|
||||||
enum ac_io_emu_icca_version version;
|
enum ac_io_emu_icca_version version;
|
||||||
|
char product_code[4];
|
||||||
bool cipher_started;
|
bool cipher_started;
|
||||||
uint32_t cipher_keys[4];
|
uint32_t cipher_keys[4];
|
||||||
};
|
};
|
||||||
@@ -39,6 +45,12 @@ void ac_io_emu_icca_init(
|
|||||||
void ac_io_emu_icca_set_version(
|
void ac_io_emu_icca_set_version(
|
||||||
struct ac_io_emu_icca *icca, enum ac_io_emu_icca_version version);
|
struct ac_io_emu_icca *icca, enum ac_io_emu_icca_version version);
|
||||||
|
|
||||||
|
// optional, call after init to override default "ICCA" product code.
|
||||||
|
// Some games may refuse to boot or expect a different packet format when using
|
||||||
|
// one of the alternative codes such as ICCB or ICCC
|
||||||
|
void ac_io_emu_icca_set_product_code(
|
||||||
|
struct ac_io_emu_icca *icca, const char product_code[4]);
|
||||||
|
|
||||||
void ac_io_emu_icca_dispatch_request(
|
void ac_io_emu_icca_dispatch_request(
|
||||||
struct ac_io_emu_icca *icca, const struct ac_io_message *req);
|
struct ac_io_emu_icca *icca, const struct ac_io_message *req);
|
||||||
|
|
||||||
|
|||||||
@@ -1,223 +0,0 @@
|
|||||||
#define LOG_MODULE "acioemu-iccb"
|
|
||||||
|
|
||||||
#include "acioemu/iccb.h"
|
|
||||||
|
|
||||||
#include <windows.h> /* for _BitScanForward */
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "acio/iccb.h"
|
|
||||||
|
|
||||||
#include "acioemu/emu.h"
|
|
||||||
|
|
||||||
#include "bemanitools/eamio.h"
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_cmd_send_version(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req);
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_state(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req);
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_empty(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req);
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_status(
|
|
||||||
struct ac_io_emu_iccb *iccb,
|
|
||||||
const struct ac_io_message *req,
|
|
||||||
uint8_t status);
|
|
||||||
|
|
||||||
void ac_io_emu_iccb_init(
|
|
||||||
struct ac_io_emu_iccb *iccb, struct ac_io_emu *emu, uint8_t unit_no)
|
|
||||||
{
|
|
||||||
memset(iccb, 0, sizeof(*iccb));
|
|
||||||
iccb->emu = emu;
|
|
||||||
iccb->unit_no = unit_no;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ac_io_emu_iccb_dispatch_request(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req)
|
|
||||||
{
|
|
||||||
uint16_t cmd_code;
|
|
||||||
|
|
||||||
cmd_code = ac_io_u16(req->cmd.code);
|
|
||||||
|
|
||||||
switch (cmd_code) {
|
|
||||||
case AC_IO_CMD_GET_VERSION:
|
|
||||||
log_misc("AC_IO_CMD_GET_VERSION(%d)", req->addr);
|
|
||||||
ac_io_emu_iccb_cmd_send_version(iccb, req);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_CMD_START_UP:
|
|
||||||
log_misc("AC_IO_CMD_START_UP(%d)", req->addr);
|
|
||||||
ac_io_emu_iccb_send_status(iccb, req, 0x00);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_CMD_KEEPALIVE:
|
|
||||||
ac_io_emu_iccb_send_empty(iccb, req);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_QUEUE_LOOP_START:
|
|
||||||
log_misc("AC_IO_CMD_QUEUE_LOOP_START(%d)", req->addr);
|
|
||||||
ac_io_emu_iccb_send_status(iccb, req, 0x00);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_UNK_0100:
|
|
||||||
case AC_IO_ICCB_CMD_UNK_0116:
|
|
||||||
case AC_IO_ICCB_CMD_UNK_0120:
|
|
||||||
log_misc("AC_IO_ICCB_CMD_UNK_%04X(%d)", cmd_code, req->addr);
|
|
||||||
ac_io_emu_iccb_send_status(iccb, req, 0x00);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_SLEEP:
|
|
||||||
ac_io_emu_iccb_send_status(iccb, req, 0x00);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_UNK_135:
|
|
||||||
/* log_misc("AC_IO_ICCB_CMD_UNK_135"); */
|
|
||||||
ac_io_emu_iccb_send_state(iccb, req);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_POLL:
|
|
||||||
/* log_misc("AC_IO_ICCB_CMD_POLL"); */
|
|
||||||
ac_io_emu_iccb_send_state(iccb, req);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC_IO_ICCB_CMD_READ_CARD:
|
|
||||||
/* log_misc("AC_IO_ICCB_CMD_READ_CARD"); */
|
|
||||||
ac_io_emu_iccb_send_state(iccb, req);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
log_warning(
|
|
||||||
"Unknown ACIO message %04x on ICCB node, addr=%d",
|
|
||||||
cmd_code,
|
|
||||||
req->addr);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_cmd_send_version(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req)
|
|
||||||
{
|
|
||||||
struct ac_io_message resp;
|
|
||||||
|
|
||||||
resp.addr = req->addr | AC_IO_RESPONSE_FLAG;
|
|
||||||
resp.cmd.code = req->cmd.code;
|
|
||||||
resp.cmd.seq_no = req->cmd.seq_no;
|
|
||||||
resp.cmd.nbytes = sizeof(resp.cmd.version);
|
|
||||||
resp.cmd.version.type = ac_io_u32(AC_IO_NODE_TYPE_ICCB);
|
|
||||||
resp.cmd.version.flag = 0x00;
|
|
||||||
resp.cmd.version.major = 0x01;
|
|
||||||
resp.cmd.version.minor = 0x05;
|
|
||||||
resp.cmd.version.revision = 0x01;
|
|
||||||
memcpy(
|
|
||||||
resp.cmd.version.product_code,
|
|
||||||
"ICCB",
|
|
||||||
sizeof(resp.cmd.version.product_code));
|
|
||||||
strncpy(resp.cmd.version.date, __DATE__, sizeof(resp.cmd.version.date));
|
|
||||||
strncpy(resp.cmd.version.time, __TIME__, sizeof(resp.cmd.version.time));
|
|
||||||
|
|
||||||
ac_io_emu_response_push(iccb->emu, &resp, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_empty(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req)
|
|
||||||
{
|
|
||||||
struct ac_io_message resp;
|
|
||||||
|
|
||||||
resp.addr = req->addr | AC_IO_RESPONSE_FLAG;
|
|
||||||
resp.cmd.code = req->cmd.code;
|
|
||||||
resp.cmd.seq_no = req->cmd.seq_no;
|
|
||||||
resp.cmd.nbytes = 0;
|
|
||||||
|
|
||||||
ac_io_emu_response_push(iccb->emu, &resp, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_status(
|
|
||||||
struct ac_io_emu_iccb *iccb,
|
|
||||||
const struct ac_io_message *req,
|
|
||||||
uint8_t status)
|
|
||||||
{
|
|
||||||
struct ac_io_message resp;
|
|
||||||
|
|
||||||
resp.addr = req->addr | AC_IO_RESPONSE_FLAG;
|
|
||||||
resp.cmd.code = req->cmd.code;
|
|
||||||
resp.cmd.seq_no = req->cmd.seq_no;
|
|
||||||
resp.cmd.nbytes = sizeof(resp.cmd.status);
|
|
||||||
resp.cmd.status = status;
|
|
||||||
|
|
||||||
ac_io_emu_response_push(iccb->emu, &resp, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ac_io_emu_iccb_send_state(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req)
|
|
||||||
{
|
|
||||||
struct ac_io_message resp;
|
|
||||||
struct ac_io_iccb_state *body;
|
|
||||||
bool sensor;
|
|
||||||
|
|
||||||
/* state update */
|
|
||||||
|
|
||||||
if (!eam_io_poll(iccb->unit_no)) {
|
|
||||||
log_warning("Polling eamio failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
sensor = eam_io_get_sensor_state(iccb->unit_no);
|
|
||||||
|
|
||||||
if (sensor != iccb->last_sensor) {
|
|
||||||
if (sensor) {
|
|
||||||
iccb->card_result =
|
|
||||||
eam_io_read_card(iccb->unit_no, iccb->uid, sizeof(iccb->uid));
|
|
||||||
|
|
||||||
// fault if sensor says to read but we got no card
|
|
||||||
iccb->fault = (iccb->card_result == EAM_IO_CARD_NONE);
|
|
||||||
} else {
|
|
||||||
iccb->fault = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iccb->last_sensor = sensor;
|
|
||||||
|
|
||||||
if (iccb->fault) {
|
|
||||||
memset(iccb->uid, 0, sizeof(iccb->uid));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create response */
|
|
||||||
|
|
||||||
resp.addr = req->addr | AC_IO_RESPONSE_FLAG;
|
|
||||||
resp.cmd.code = req->cmd.code;
|
|
||||||
resp.cmd.seq_no = req->cmd.seq_no;
|
|
||||||
resp.cmd.nbytes = sizeof(struct ac_io_iccb_state);
|
|
||||||
|
|
||||||
body = (struct ac_io_iccb_state *) &resp.cmd.raw;
|
|
||||||
|
|
||||||
if (sensor) {
|
|
||||||
body->sensor_state = AC_IO_ICCB_SENSOR_CARD;
|
|
||||||
} else {
|
|
||||||
body->sensor_state = AC_IO_ICCB_SENSOR_NO_CARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!iccb->fault) {
|
|
||||||
memcpy(body->uid, iccb->uid, sizeof(body->uid));
|
|
||||||
}
|
|
||||||
|
|
||||||
body->card_type = 0x30 | (iccb->card_result - 1);
|
|
||||||
body->unk2 = 0;
|
|
||||||
// this doesn't seem to be an error code. If this is not set to 0x03
|
|
||||||
// on slotted readers (only?), the game throws an unknown status error
|
|
||||||
body->unk3 = 0x03;
|
|
||||||
memset(body->unk4, 0, sizeof(body->unk4));
|
|
||||||
|
|
||||||
ac_io_emu_response_push(iccb->emu, &resp, 0);
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#ifndef AC_IO_EMU_ICCB_H
|
|
||||||
#define AC_IO_EMU_ICCB_H
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "acioemu/emu.h"
|
|
||||||
|
|
||||||
struct ac_io_emu_iccb {
|
|
||||||
struct ac_io_emu *emu;
|
|
||||||
uint8_t unit_no;
|
|
||||||
bool fault;
|
|
||||||
bool last_sensor;
|
|
||||||
uint8_t uid[8];
|
|
||||||
uint8_t card_result;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ac_io_emu_iccb_init(
|
|
||||||
struct ac_io_emu_iccb *iccb, struct ac_io_emu *emu, uint8_t unit_no);
|
|
||||||
|
|
||||||
void ac_io_emu_iccb_dispatch_request(
|
|
||||||
struct ac_io_emu_iccb *iccb, const struct ac_io_message *req);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -9,6 +9,7 @@ libs_aciotest := \
|
|||||||
src_aciotest := \
|
src_aciotest := \
|
||||||
icca.c \
|
icca.c \
|
||||||
kfca.c \
|
kfca.c \
|
||||||
bi2a-sdvx.c \
|
|
||||||
panb.c \
|
panb.c \
|
||||||
|
rvol.c \
|
||||||
|
bi2a-sdvx.c \
|
||||||
main.c \
|
main.c \
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "aciotest/icca.h"
|
#include "aciotest/icca.h"
|
||||||
#include "aciotest/kfca.h"
|
#include "aciotest/kfca.h"
|
||||||
#include "aciotest/panb.h"
|
#include "aciotest/panb.h"
|
||||||
|
#include "aciotest/rvol.h"
|
||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
@@ -21,31 +22,37 @@ static uint8_t bi2a_mode = 0;
|
|||||||
* Enumerate supported ACIO nodes based on their product id.
|
* Enumerate supported ACIO nodes based on their product id.
|
||||||
*/
|
*/
|
||||||
static bool aciotest_assign_handler(
|
static bool aciotest_assign_handler(
|
||||||
char product[4], struct aciotest_handler_node_handler *handler)
|
uint32_t product_type, struct aciotest_handler_node_handler *handler)
|
||||||
{
|
{
|
||||||
if (!memcmp(product, "ICCA", 4) || !memcmp(product, "ICCB", 4) ||
|
if (product_type == AC_IO_NODE_TYPE_ICCA) {
|
||||||
!memcmp(product, "ICCC", 4)) {
|
|
||||||
handler->init = aciotest_icca_handler_init;
|
handler->init = aciotest_icca_handler_init;
|
||||||
handler->update = aciotest_icca_handler_update;
|
handler->update = aciotest_icca_handler_update;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memcmp(product, "KFCA", 4)) {
|
if (product_type == AC_IO_NODE_TYPE_KFCA) {
|
||||||
handler->init = aciotest_kfca_handler_init;
|
handler->init = aciotest_kfca_handler_init;
|
||||||
handler->update = aciotest_kfca_handler_update;
|
handler->update = aciotest_kfca_handler_update;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memcmp(product, "PANB", 4)) {
|
if (product_type == AC_IO_NODE_TYPE_PANB) {
|
||||||
handler->init = aciotest_panb_handler_init;
|
handler->init = aciotest_panb_handler_init;
|
||||||
handler->update = aciotest_panb_handler_update;
|
handler->update = aciotest_panb_handler_update;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memcmp(product, "BI2A", 4)) {
|
if (product_type == AC_IO_NODE_TYPE_RVOL) {
|
||||||
|
handler->init = aciotest_rvol_handler_init;
|
||||||
|
handler->update = aciotest_rvol_handler_update;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (product_type == AC_IO_NODE_TYPE_BI2A) {
|
||||||
if (bi2a_mode == 0) {
|
if (bi2a_mode == 0) {
|
||||||
handler->init = aciotest_bi2a_sdvx_handler_init;
|
handler->init = aciotest_bi2a_sdvx_handler_init;
|
||||||
handler->update = aciotest_bi2a_sdvx_handler_update;
|
handler->update = aciotest_bi2a_sdvx_handler_update;
|
||||||
@@ -99,22 +106,22 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (uint8_t i = 0; i < node_count; i++) {
|
for (uint8_t i = 0; i < node_count; i++) {
|
||||||
char product[4];
|
char product[4];
|
||||||
|
uint32_t product_type = aciodrv_device_get_node_product_type(device, i);
|
||||||
aciodrv_device_get_node_product_ident(device, i, product);
|
aciodrv_device_get_node_product_ident(device, i, product);
|
||||||
|
|
||||||
printf(
|
printf(
|
||||||
"> %d: %c%c%c%c\n",
|
"> %d: %c%c%c%c (%08x)\n",
|
||||||
i + 1,
|
i + 1,
|
||||||
product[0],
|
product[0],
|
||||||
product[1],
|
product[1],
|
||||||
product[2],
|
product[2],
|
||||||
product[3]);
|
product[3],
|
||||||
|
product_type);
|
||||||
|
|
||||||
if (!aciotest_assign_handler(product, &handler[i])) {
|
if (!aciotest_assign_handler(product_type, &handler[i])) {
|
||||||
printf(
|
printf(
|
||||||
"ERROR: Unsupported acio node product %c%c%c%c on node %d\n",
|
"ERROR: Unsupported acio node product %08x on node %d\n",
|
||||||
product[0],
|
product_type,
|
||||||
product[1],
|
|
||||||
product[2],
|
|
||||||
product[3],
|
|
||||||
i);
|
i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
73
src/main/aciotest/rvol.c
Normal file
73
src/main/aciotest/rvol.c
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#include "aciotest/rvol.h"
|
||||||
|
|
||||||
|
#include "acio/acio.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "aciodrv/rvol.h"
|
||||||
|
|
||||||
|
static struct ac_io_rvol_poll_out pout;
|
||||||
|
|
||||||
|
bool aciotest_rvol_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
||||||
|
{
|
||||||
|
memset(&pout, 0, sizeof(pout));
|
||||||
|
return aciodrv_rvol_init(device, node_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aciotest_rvol_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
|
{
|
||||||
|
struct ac_io_rvol_poll_in pin;
|
||||||
|
|
||||||
|
if (!aciodrv_rvol_poll(device, node_id, &pout, &pin)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint8_t selected_light = pin.spinners[0] / 43;
|
||||||
|
|
||||||
|
printf(
|
||||||
|
">>> RVOL %d\n"
|
||||||
|
"Press: %3d %3d %3d\n"
|
||||||
|
" %3d %3d\n"
|
||||||
|
"\n"
|
||||||
|
"Spin: %3d %3d %3d\n"
|
||||||
|
" %3d %3d\n"
|
||||||
|
"\n"
|
||||||
|
"Pedal: %3d\n"
|
||||||
|
"\n"
|
||||||
|
"Editing light #%d R: %d G: %d B: %d\n"
|
||||||
|
"(Change light with Spinner 1, values with 3-5)\n",
|
||||||
|
node_id,
|
||||||
|
pin.buttons_2.spinner_1,
|
||||||
|
pin.buttons_3.spinner_3,
|
||||||
|
pin.buttons_1.spinner_5,
|
||||||
|
pin.buttons_2.spinner_2,
|
||||||
|
pin.buttons_1.spinner_4,
|
||||||
|
pin.spinners[0],
|
||||||
|
pin.spinners[2],
|
||||||
|
pin.spinners[4],
|
||||||
|
pin.spinners[1],
|
||||||
|
pin.spinners[3],
|
||||||
|
!pin.buttons_1.pedal,
|
||||||
|
selected_light,
|
||||||
|
pin.spinners[2] / 2,
|
||||||
|
pin.spinners[3] / 2,
|
||||||
|
pin.spinners[4] / 2
|
||||||
|
);
|
||||||
|
|
||||||
|
memset(&pout, 0, sizeof(pout));
|
||||||
|
|
||||||
|
if (selected_light == 5) {
|
||||||
|
pout.title.r = pin.spinners[2] / 2;
|
||||||
|
pout.title.g = pin.spinners[3] / 2;
|
||||||
|
pout.title.b = pin.spinners[4] / 2;
|
||||||
|
} else {
|
||||||
|
pout.spinner[selected_light].r = pin.spinners[2] / 2;
|
||||||
|
pout.spinner[selected_light].g = pin.spinners[3] / 2;
|
||||||
|
pout.spinner[selected_light].b = pin.spinners[4] / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
14
src/main/aciotest/rvol.h
Normal file
14
src/main/aciotest/rvol.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef ACIOTEST_RVOL_H
|
||||||
|
#define ACIOTEST_RVOL_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
|
bool aciotest_rvol_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool aciotest_rvol_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -33,6 +33,7 @@ enum sdvx_io_out_gpio_bit {
|
|||||||
SDVX_IO_OUT_GPIO_D = 0,
|
SDVX_IO_OUT_GPIO_D = 0,
|
||||||
SDVX_IO_OUT_GPIO_FX_L = 1,
|
SDVX_IO_OUT_GPIO_FX_L = 1,
|
||||||
SDVX_IO_OUT_GPIO_FX_R = 2,
|
SDVX_IO_OUT_GPIO_FX_R = 2,
|
||||||
|
SDVX_IO_OUT_GPIO_GENERATOR_B = 3,
|
||||||
SDVX_IO_OUT_GPIO_START = 12,
|
SDVX_IO_OUT_GPIO_START = 12,
|
||||||
SDVX_IO_OUT_GPIO_A = 13,
|
SDVX_IO_OUT_GPIO_A = 13,
|
||||||
SDVX_IO_OUT_GPIO_B = 14,
|
SDVX_IO_OUT_GPIO_B = 14,
|
||||||
|
|||||||
56
src/main/bio2/bi2a-ddr.h
Normal file
56
src/main/bio2/bi2a-ddr.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#ifndef BIO2_BI2A_DDR
|
||||||
|
#define BIO2_BI2A_DDR
|
||||||
|
|
||||||
|
#include "bio2/bio2.h"
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
|
struct bi2a_ddr_system_panel {
|
||||||
|
uint8_t b_unk1 : 1;
|
||||||
|
uint8_t b_coin : 1;
|
||||||
|
uint8_t b_service : 1;
|
||||||
|
uint8_t b_test : 1;
|
||||||
|
uint8_t b_un2 : 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bi2a_ddr_player_1_panel {
|
||||||
|
uint8_t b_unk : 3;
|
||||||
|
uint8_t b_right : 1;
|
||||||
|
uint8_t b_left : 1;
|
||||||
|
uint8_t b_down : 1;
|
||||||
|
uint8_t b_up : 1;
|
||||||
|
uint8_t b_start : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bi2a_ddr_player_2_panel {
|
||||||
|
uint8_t b_unk1 : 1;
|
||||||
|
uint8_t b_right : 1;
|
||||||
|
uint8_t b_left : 1;
|
||||||
|
uint8_t b_down : 1;
|
||||||
|
uint8_t b_up : 1;
|
||||||
|
uint8_t b_start : 1;
|
||||||
|
uint8_t b_unk2 : 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bi2a_ddr_state_in {
|
||||||
|
uint8_t unk1;
|
||||||
|
struct bi2a_ddr_system_panel system;
|
||||||
|
uint8_t unk2[7];
|
||||||
|
struct bi2a_ddr_player_1_panel player_1;
|
||||||
|
struct bi2a_ddr_player_2_panel player_2;
|
||||||
|
uint8_t unk3[5];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bi2a_ddr_state_out {
|
||||||
|
uint8_t unk1[40];
|
||||||
|
};
|
||||||
|
|
||||||
|
_Static_assert(
|
||||||
|
sizeof(struct bi2a_ddr_state_in) == 16,
|
||||||
|
"bi2a_ddr_state_in is the wrong size");
|
||||||
|
_Static_assert(
|
||||||
|
sizeof(struct bi2a_ddr_state_out) == 40,
|
||||||
|
"bi2a_ddr_state_out is the wrong size");
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -11,6 +11,11 @@ enum bio2_bi2a_cmd {
|
|||||||
BIO2_BI2A_CMD_INIT = 0x0100,
|
BIO2_BI2A_CMD_INIT = 0x0100,
|
||||||
BIO2_BI2A_CMD_WATCHDOG = 0x0120,
|
BIO2_BI2A_CMD_WATCHDOG = 0x0120,
|
||||||
BIO2_BI2A_CMD_POLL = 0x0152, // For IIDX
|
BIO2_BI2A_CMD_POLL = 0x0152, // For IIDX
|
||||||
|
// For games using libacio for BIO2 communication
|
||||||
|
BIO2_BI2A_CMD_ACIO_POLL_NOWD = 0x0112,
|
||||||
|
BIO2_BI2A_CMD_ACIO_POLL_WD = 0x0113,
|
||||||
|
BIO2_BI2A_CMD_TAPELED_INIT = 0x0140,
|
||||||
|
BIO2_BI2A_CMD_TAPELED_SEND = 0x0141,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -52,7 +52,7 @@ void d3d9exhook_config_gfx_init(struct cconfig *config)
|
|||||||
config,
|
config,
|
||||||
D3D9EXHOOK_CONFIG_GFX_CONFINED_KEY,
|
D3D9EXHOOK_CONFIG_GFX_CONFINED_KEY,
|
||||||
D3D9EXHOOK_CONFIG_GFX_DEFAULT_CONFINED_VALUE,
|
D3D9EXHOOK_CONFIG_GFX_DEFAULT_CONFINED_VALUE,
|
||||||
"Confine mouse coursor to window");
|
"Confine mouse cursor to window");
|
||||||
|
|
||||||
cconfig_util_set_int(
|
cconfig_util_set_int(
|
||||||
config,
|
config,
|
||||||
|
|||||||
18
src/main/ddrhook-util/Module.mk
Normal file
18
src/main/ddrhook-util/Module.mk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
libs += ddrhook-util
|
||||||
|
|
||||||
|
libs_ddrhook-util := \
|
||||||
|
hook \
|
||||||
|
hooklib \
|
||||||
|
util \
|
||||||
|
|
||||||
|
src_ddrhook-util := \
|
||||||
|
dinput.c \
|
||||||
|
gfx.c \
|
||||||
|
guid.c \
|
||||||
|
misc.c \
|
||||||
|
monitor.c \
|
||||||
|
extio.c \
|
||||||
|
_com4.c \
|
||||||
|
usbmem.c \
|
||||||
|
spike.c \
|
||||||
|
p3io.c \
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#include "bemanitools/ddrio.h"
|
#include "bemanitools/ddrio.h"
|
||||||
|
|
||||||
#include "ddrhook/_com4.h"
|
#include "ddrhook-util/_com4.h"
|
||||||
|
|
||||||
#include "hook/iohook.h"
|
#include "hook/iohook.h"
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef IIDXHOOK_COM4_H
|
#ifndef DDRHOOK_UTIL_COM4_H
|
||||||
#define IIDXHOOK_COM4_H
|
#define DDRHOOK_UTIL_COM4_H
|
||||||
|
|
||||||
#include "hook/iohook.h"
|
#include "hook/iohook.h"
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef HOOK_DINPUT_H
|
#ifndef DDRHOOK_UTIL_DINPUT_H
|
||||||
#define HOOK_DINPUT_H
|
#define DDRHOOK_UTIL_DINPUT_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef DDRHOOK_EXTIO_H
|
#ifndef DDRHOOK_UTIL_EXTIO_H
|
||||||
#define DDRHOOK_EXTIO_H
|
#define DDRHOOK_UTIL_EXTIO_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
281
src/main/ddrhook-util/gfx.c
Normal file
281
src/main/ddrhook-util/gfx.c
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
// TODO: Fix gray arrows on NVIDIA cards (also applies to X3)
|
||||||
|
|
||||||
|
#define LOG_MODULE "gfx-hook"
|
||||||
|
|
||||||
|
#include <d3d9.h>
|
||||||
|
#include <d3dx9core.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "hook/com-proxy.h"
|
||||||
|
#include "hook/table.h"
|
||||||
|
|
||||||
|
#include "ddrhook-util/gfx.h"
|
||||||
|
|
||||||
|
#include "util/defs.h"
|
||||||
|
#include "util/log.h"
|
||||||
|
#include "util/str.h"
|
||||||
|
#include "util/time.h"
|
||||||
|
|
||||||
|
static LONG(STDCALL *real_ChangeDisplaySettingsExA)(
|
||||||
|
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param);
|
||||||
|
static LONG(STDCALL *real_SetWindowLongW)(
|
||||||
|
HWND hWnd, int nIndex, LONG dwNewLong);
|
||||||
|
static BOOL(STDCALL *real_SetWindowPos)(
|
||||||
|
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
|
||||||
|
|
||||||
|
static LONG STDCALL my_ChangeDisplaySettingsExA(
|
||||||
|
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param);
|
||||||
|
static LONG STDCALL my_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong);
|
||||||
|
static BOOL STDCALL my_SetWindowPos(
|
||||||
|
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
|
||||||
|
|
||||||
|
static bool gfx_windowed;
|
||||||
|
static bool gfx_is_modern;
|
||||||
|
|
||||||
|
static const struct hook_symbol gfx_user32_syms[] = {
|
||||||
|
{
|
||||||
|
.name = "ChangeDisplaySettingsExA",
|
||||||
|
.patch = my_ChangeDisplaySettingsExA,
|
||||||
|
.link = (void **) &real_ChangeDisplaySettingsExA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SetWindowLongW",
|
||||||
|
.patch = my_SetWindowLongW,
|
||||||
|
.link = (void **) &real_SetWindowLongW,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SetWindowPos",
|
||||||
|
.patch = my_SetWindowPos,
|
||||||
|
.link = (void **) &real_SetWindowPos,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void gfx_d3d9_calc_win_size_with_framed(
|
||||||
|
HWND hwnd, DWORD x, DWORD y, DWORD width, DWORD height, LPWINDOWPOS wp)
|
||||||
|
{
|
||||||
|
/* taken from dxwnd */
|
||||||
|
RECT rect;
|
||||||
|
DWORD style;
|
||||||
|
int max_x, max_y;
|
||||||
|
HMENU menu;
|
||||||
|
|
||||||
|
rect.left = x;
|
||||||
|
rect.top = y;
|
||||||
|
max_x = width;
|
||||||
|
max_y = height;
|
||||||
|
rect.right = x + max_x;
|
||||||
|
rect.bottom = y + max_y;
|
||||||
|
|
||||||
|
style = GetWindowLong(hwnd, GWL_STYLE);
|
||||||
|
menu = GetMenu(hwnd);
|
||||||
|
AdjustWindowRect(&rect, style, (menu != NULL));
|
||||||
|
|
||||||
|
/* shift down-right so that the border is visible
|
||||||
|
and also update the iPosX,iPosY upper-left coordinates
|
||||||
|
of the client area */
|
||||||
|
|
||||||
|
if (rect.left < 0) {
|
||||||
|
rect.right -= rect.left;
|
||||||
|
rect.left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rect.top < 0) {
|
||||||
|
rect.bottom -= rect.top;
|
||||||
|
rect.top = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wp->x = rect.left;
|
||||||
|
wp->y = rect.top;
|
||||||
|
wp->cx = rect.right - rect.left;
|
||||||
|
wp->cy = rect.bottom - rect.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static LONG STDCALL my_ChangeDisplaySettingsExA(
|
||||||
|
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param)
|
||||||
|
{
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
return DISP_CHANGE_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_ChangeDisplaySettingsExA(
|
||||||
|
dev_name, dev_mode, hwnd, flags, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LONG STDCALL my_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong)
|
||||||
|
{
|
||||||
|
if (gfx_get_windowed() && nIndex == GWL_STYLE) {
|
||||||
|
dwNewLong |= WS_OVERLAPPEDWINDOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_SetWindowLongW(hWnd, nIndex, dwNewLong);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL STDCALL my_SetWindowPos(
|
||||||
|
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
|
||||||
|
{
|
||||||
|
// Causes DDR A to have a really wide window
|
||||||
|
if (gfx_get_is_modern()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
WINDOWPOS wp;
|
||||||
|
|
||||||
|
gfx_d3d9_calc_win_size_with_framed(hWnd, X, Y, cx, cy, &wp);
|
||||||
|
|
||||||
|
return real_SetWindowPos(
|
||||||
|
hWnd, hWndInsertAfter, wp.x, wp.y, wp.cx, wp.cy, uFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void gfx_insert_hooks(HMODULE target)
|
||||||
|
{
|
||||||
|
hook_table_apply(
|
||||||
|
target, "user32.dll", gfx_user32_syms, lengthof(gfx_user32_syms));
|
||||||
|
|
||||||
|
log_info("Initialized d3d9 hooks");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gfx_get_windowed(void)
|
||||||
|
{
|
||||||
|
return gfx_windowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfx_set_windowed(void)
|
||||||
|
{
|
||||||
|
gfx_windowed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gfx_get_is_modern(void)
|
||||||
|
{
|
||||||
|
return gfx_is_modern;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfx_set_is_modern(void)
|
||||||
|
{
|
||||||
|
gfx_is_modern = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static void gfx_d3d9_patch_window(struct hook_d3d9_irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp);
|
||||||
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_CREATE_WINDOW_EX);
|
||||||
|
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
/* use a different style */
|
||||||
|
irp->args.create_window_ex.style |= WS_OVERLAPPEDWINDOW;
|
||||||
|
|
||||||
|
/* also show mouse cursor */
|
||||||
|
ShowCursor(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gfx_d3d9_fix_window_size_and_pos(struct hook_d3d9_irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp);
|
||||||
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_CREATE_WINDOW_EX);
|
||||||
|
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
/* we have to adjust the window size, because the window needs to be a
|
||||||
|
slightly bigger than the rendering resolution (window caption and
|
||||||
|
stuff is included in the window size) */
|
||||||
|
WINDOWPOS wp;
|
||||||
|
|
||||||
|
gfx_d3d9_calc_win_size_with_framed(
|
||||||
|
irp->args.create_window_ex.result,
|
||||||
|
irp->args.create_window_ex.x,
|
||||||
|
irp->args.create_window_ex.y,
|
||||||
|
irp->args.create_window_ex.width,
|
||||||
|
irp->args.create_window_ex.height,
|
||||||
|
&wp);
|
||||||
|
|
||||||
|
SetWindowPos(
|
||||||
|
irp->args.create_window_ex.result, 0, wp.x, wp.y, wp.cx, wp.cy, 0);
|
||||||
|
|
||||||
|
irp->args.create_window_ex.x = wp.x;
|
||||||
|
irp->args.create_window_ex.y = wp.y;
|
||||||
|
irp->args.create_window_ex.width = wp.cx;
|
||||||
|
irp->args.create_window_ex.height = wp.cy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfx_d3d9_create_device_apply_window_mode(
|
||||||
|
struct hook_d3d9_irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp);
|
||||||
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_CTX_CREATE_DEVICE);
|
||||||
|
D3DPRESENT_PARAMETERS *pp = irp->args.ctx_create_device.pp;
|
||||||
|
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
pp->Windowed = TRUE;
|
||||||
|
pp->FullScreen_RefreshRateInHz = 0;
|
||||||
|
} else if (pp->Windowed == FALSE) {
|
||||||
|
/* 64bit builds show the cursor even during fullscreen */
|
||||||
|
ShowCursor(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfx_d3d9_reset_apply_window_mode(
|
||||||
|
struct hook_d3d9_irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp);
|
||||||
|
log_assert(irp->op == HOOK_D3D9_IRP_OP_DEV_RESET);
|
||||||
|
D3DPRESENT_PARAMETERS *pp = irp->args.dev_reset.pp;
|
||||||
|
|
||||||
|
if (gfx_get_windowed()) {
|
||||||
|
pp->Windowed = TRUE;
|
||||||
|
pp->FullScreen_RefreshRateInHz = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
gfx_d3d9_irp_handler(struct hook_d3d9_irp *irp)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
log_assert(irp);
|
||||||
|
|
||||||
|
switch (irp->op) {
|
||||||
|
case HOOK_D3D9_IRP_OP_CREATE_WINDOW_EX:
|
||||||
|
gfx_d3d9_patch_window(irp);
|
||||||
|
|
||||||
|
hr = hook_d3d9_irp_invoke_next(irp);
|
||||||
|
|
||||||
|
if (hr == S_OK) {
|
||||||
|
gfx_d3d9_fix_window_size_and_pos(irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
case HOOK_D3D9_IRP_OP_CTX_CREATE_DEVICE:
|
||||||
|
gfx_d3d9_create_device_apply_window_mode(irp);
|
||||||
|
hr = hook_d3d9_irp_invoke_next(irp);
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
case HOOK_D3D9_IRP_OP_DEV_RESET:
|
||||||
|
gfx_d3d9_reset_apply_window_mode(irp);
|
||||||
|
hr = hook_d3d9_irp_invoke_next(irp);
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return hook_d3d9_irp_invoke_next(irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_fatal("Illegal state");
|
||||||
|
}
|
||||||
25
src/main/ddrhook-util/gfx.h
Normal file
25
src/main/ddrhook-util/gfx.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef DDRHOOK1_D3D9_H
|
||||||
|
#define DDRHOOK1_D3D9_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "hook/d3d9.h"
|
||||||
|
|
||||||
|
struct ddrhook1_d3d9_config {
|
||||||
|
bool windowed;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool gfx_get_windowed(void);
|
||||||
|
void gfx_set_windowed(void);
|
||||||
|
|
||||||
|
bool gfx_get_is_modern(void);
|
||||||
|
void gfx_set_is_modern(void);
|
||||||
|
|
||||||
|
void gfx_d3d9_calc_win_size_with_framed(
|
||||||
|
HWND hwnd, DWORD x, DWORD y, DWORD width, DWORD height, LPWINDOWPOS wp);
|
||||||
|
|
||||||
|
void gfx_insert_hooks(HMODULE target);
|
||||||
|
HRESULT gfx_d3d9_irp_handler(struct hook_d3d9_irp *irp);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include <initguid.h>
|
#include <initguid.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "ddrhook/monitor.h"
|
#include "ddrhook-util/monitor.h"
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "ddrhook/gfx.h"
|
#include "ddrhook-util/gfx.h"
|
||||||
|
|
||||||
#include "hook/pe.h"
|
#include "hook/pe.h"
|
||||||
#include "hook/table.h"
|
#include "hook/table.h"
|
||||||
@@ -11,10 +11,9 @@
|
|||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
static LONG(STDCALL *real_ChangeDisplaySettingsExA)(
|
|
||||||
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param);
|
|
||||||
static LRESULT(STDCALL *real_SendMessageW)(
|
static LRESULT(STDCALL *real_SendMessageW)(
|
||||||
HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||||
|
|
||||||
static HWND(STDCALL *real_CreateWindowExW)(
|
static HWND(STDCALL *real_CreateWindowExW)(
|
||||||
DWORD dwExStyle,
|
DWORD dwExStyle,
|
||||||
LPCWSTR lpClassName,
|
LPCWSTR lpClassName,
|
||||||
@@ -28,16 +27,11 @@ static HWND(STDCALL *real_CreateWindowExW)(
|
|||||||
HMENU hMenu,
|
HMENU hMenu,
|
||||||
HINSTANCE hInstance,
|
HINSTANCE hInstance,
|
||||||
LPVOID lpParam);
|
LPVOID lpParam);
|
||||||
static LONG(STDCALL *real_SetWindowLongW)(
|
|
||||||
HWND hWnd, int nIndex, LONG dwNewLong);
|
|
||||||
static BOOL(STDCALL *real_SetWindowPos)(
|
|
||||||
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
|
|
||||||
|
|
||||||
static LONG STDCALL my_ChangeDisplaySettingsExA(
|
|
||||||
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param);
|
|
||||||
static SHORT STDCALL my_GetKeyState(int vk);
|
static SHORT STDCALL my_GetKeyState(int vk);
|
||||||
static LRESULT STDCALL
|
static LRESULT STDCALL
|
||||||
my_SendMessageW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
my_SendMessageW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||||
|
|
||||||
static HWND STDCALL my_CreateWindowExA(
|
static HWND STDCALL my_CreateWindowExA(
|
||||||
DWORD dwExStyle,
|
DWORD dwExStyle,
|
||||||
LPCSTR lpClassName,
|
LPCSTR lpClassName,
|
||||||
@@ -64,16 +58,8 @@ static HWND STDCALL my_CreateWindowExW(
|
|||||||
HMENU hMenu,
|
HMENU hMenu,
|
||||||
HINSTANCE hInstance,
|
HINSTANCE hInstance,
|
||||||
LPVOID lpParam);
|
LPVOID lpParam);
|
||||||
static LONG STDCALL my_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong);
|
|
||||||
static BOOL STDCALL my_SetWindowPos(
|
|
||||||
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
|
|
||||||
|
|
||||||
static const struct hook_symbol misc_user32_syms[] = {
|
static const struct hook_symbol misc_user32_syms[] = {
|
||||||
{
|
|
||||||
.name = "ChangeDisplaySettingsExA",
|
|
||||||
.patch = my_ChangeDisplaySettingsExA,
|
|
||||||
.link = (void **) &real_ChangeDisplaySettingsExA,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.name = "SendMessageW",
|
.name = "SendMessageW",
|
||||||
.patch = my_SendMessageW,
|
.patch = my_SendMessageW,
|
||||||
@@ -92,82 +78,8 @@ static const struct hook_symbol misc_user32_syms[] = {
|
|||||||
.patch = my_CreateWindowExW,
|
.patch = my_CreateWindowExW,
|
||||||
.link = (void **) &real_CreateWindowExW,
|
.link = (void **) &real_CreateWindowExW,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.name = "SetWindowLongW",
|
|
||||||
.patch = my_SetWindowLongW,
|
|
||||||
.link = (void **) &real_SetWindowLongW,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "SetWindowPos",
|
|
||||||
.patch = my_SetWindowPos,
|
|
||||||
.link = (void **) &real_SetWindowPos,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static LONG STDCALL my_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong)
|
|
||||||
{
|
|
||||||
if (nIndex == GWL_STYLE)
|
|
||||||
dwNewLong |= WS_OVERLAPPEDWINDOW;
|
|
||||||
return real_SetWindowLongW(hWnd, nIndex, dwNewLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL STDCALL my_SetWindowPos(
|
|
||||||
HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LONG STDCALL my_ChangeDisplaySettingsExA(
|
|
||||||
char *dev_name, DEVMODE *dev_mode, HWND hwnd, DWORD flags, void *param)
|
|
||||||
{
|
|
||||||
if (gfx_get_windowed()) {
|
|
||||||
return DISP_CHANGE_SUCCESSFUL;
|
|
||||||
} else {
|
|
||||||
return real_ChangeDisplaySettingsExA(
|
|
||||||
dev_name, dev_mode, hwnd, flags, param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void calc_win_size_with_framed(
|
|
||||||
HWND hwnd, DWORD x, DWORD y, DWORD width, DWORD height, LPWINDOWPOS wp)
|
|
||||||
{
|
|
||||||
/* taken from dxwnd */
|
|
||||||
RECT rect;
|
|
||||||
DWORD style;
|
|
||||||
int max_x, max_y;
|
|
||||||
HMENU menu;
|
|
||||||
|
|
||||||
rect.left = x;
|
|
||||||
rect.top = y;
|
|
||||||
max_x = width;
|
|
||||||
max_y = height;
|
|
||||||
rect.right = x + max_x;
|
|
||||||
rect.bottom = y + max_y;
|
|
||||||
|
|
||||||
style = GetWindowLong(hwnd, GWL_STYLE);
|
|
||||||
menu = GetMenu(hwnd);
|
|
||||||
AdjustWindowRect(&rect, style, (menu != NULL));
|
|
||||||
|
|
||||||
/* shift down-right so that the border is visible
|
|
||||||
and also update the iPosX,iPosY upper-left coordinates
|
|
||||||
of the client area */
|
|
||||||
|
|
||||||
if (rect.left < 0) {
|
|
||||||
rect.right -= rect.left;
|
|
||||||
rect.left = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rect.top < 0) {
|
|
||||||
rect.bottom -= rect.top;
|
|
||||||
rect.top = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
wp->x = rect.left;
|
|
||||||
wp->y = rect.top;
|
|
||||||
wp->cx = rect.right - rect.left;
|
|
||||||
wp->cy = rect.bottom - rect.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HWND STDCALL my_CreateWindowExW(
|
static HWND STDCALL my_CreateWindowExW(
|
||||||
DWORD dwExStyle,
|
DWORD dwExStyle,
|
||||||
LPCWSTR lpClassName,
|
LPCWSTR lpClassName,
|
||||||
@@ -182,6 +94,23 @@ static HWND STDCALL my_CreateWindowExW(
|
|||||||
HINSTANCE hInstance,
|
HINSTANCE hInstance,
|
||||||
LPVOID lpParam)
|
LPVOID lpParam)
|
||||||
{
|
{
|
||||||
|
// This breaks DDR X, X2 and X3
|
||||||
|
if (gfx_get_is_modern()) {
|
||||||
|
return real_CreateWindowExW(
|
||||||
|
dwExStyle,
|
||||||
|
lpClassName,
|
||||||
|
lpWindowName,
|
||||||
|
dwStyle,
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
nWidth,
|
||||||
|
nHeight,
|
||||||
|
hWndParent,
|
||||||
|
hMenu,
|
||||||
|
hInstance,
|
||||||
|
lpParam);
|
||||||
|
}
|
||||||
|
|
||||||
if (gfx_get_windowed()) {
|
if (gfx_get_windowed()) {
|
||||||
/* use a different style */
|
/* use a different style */
|
||||||
dwStyle |= WS_OVERLAPPEDWINDOW;
|
dwStyle |= WS_OVERLAPPEDWINDOW;
|
||||||
@@ -215,7 +144,7 @@ static HWND STDCALL my_CreateWindowExW(
|
|||||||
slightly bigger than the rendering resolution (window caption and
|
slightly bigger than the rendering resolution (window caption and
|
||||||
stuff is included in the window size) */
|
stuff is included in the window size) */
|
||||||
WINDOWPOS wp;
|
WINDOWPOS wp;
|
||||||
calc_win_size_with_framed(hwnd, X, Y, nWidth, nHeight, &wp);
|
gfx_d3d9_calc_win_size_with_framed(hwnd, X, Y, nWidth, nHeight, &wp);
|
||||||
SetWindowPos(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0);
|
SetWindowPos(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0);
|
||||||
X = wp.x;
|
X = wp.x;
|
||||||
Y = wp.y;
|
Y = wp.y;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef HOOK_MISC_H
|
#ifndef DDRHOOK_UTIL_MISC_H
|
||||||
#define HOOK_MISC_H
|
#define DDRHOOK_UTIL_MISC_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "ddrhook/monitor.h"
|
#include "ddrhook-util/monitor.h"
|
||||||
|
|
||||||
#include "hook/table.h"
|
#include "hook/table.h"
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef DDRHOOK_MONITOR_H
|
#ifndef DDRHOOK_UTIL_MONITOR_H
|
||||||
#define DDRHOOK_MONITOR_H
|
#define DDRHOOK_UTIL_MONITOR_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
152
src/main/ddrhook-util/p3io.c
Normal file
152
src/main/ddrhook-util/p3io.c
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "bemanitools/ddrio.h"
|
||||||
|
|
||||||
|
#include "ddrhook-util/p3io.h"
|
||||||
|
|
||||||
|
#include "p3ioemu/emu.h"
|
||||||
|
#include "p3ioemu/uart.h"
|
||||||
|
|
||||||
|
#include "util/log.h"
|
||||||
|
|
||||||
|
extern bool _15khz;
|
||||||
|
extern bool standard_def;
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_read_jamma(void *ctx, uint32_t *state);
|
||||||
|
static HRESULT p3io_ddr_set_outputs(void *ctx, uint32_t outputs);
|
||||||
|
static HRESULT p3io_ddr_get_cab_type(void *ctx, enum p3io_cab_type *type);
|
||||||
|
static HRESULT p3io_ddr_get_video_freq(void *ctx, enum p3io_video_freq *freq);
|
||||||
|
static HRESULT p3io_ddr_get_roundplug(
|
||||||
|
void *ctx, uint8_t plug_id, uint8_t *rom, uint8_t *eeprom);
|
||||||
|
|
||||||
|
static const struct p3io_ops p3io_ddr_ops = {
|
||||||
|
.read_jamma = p3io_ddr_read_jamma,
|
||||||
|
.set_outputs = p3io_ddr_set_outputs,
|
||||||
|
.get_cab_type = p3io_ddr_get_cab_type,
|
||||||
|
.get_video_freq = p3io_ddr_get_video_freq,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct p3io_ops p3io_ddr_ops_with_plugs = {
|
||||||
|
.read_jamma = p3io_ddr_read_jamma,
|
||||||
|
.set_outputs = p3io_ddr_set_outputs,
|
||||||
|
.get_cab_type = p3io_ddr_get_cab_type,
|
||||||
|
.get_video_freq = p3io_ddr_get_video_freq,
|
||||||
|
.get_roundplug = p3io_ddr_get_roundplug,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct security_mcode p3io_ddr_mcode;
|
||||||
|
static struct security_id p3io_ddr_pcbid;
|
||||||
|
static struct security_id p3io_ddr_eamid;
|
||||||
|
static struct security_rp_sign_key p3io_black_sign_key;
|
||||||
|
static struct security_rp_sign_key p3io_white_sign_key;
|
||||||
|
|
||||||
|
void p3io_ddr_init(void)
|
||||||
|
{
|
||||||
|
/* 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
|
||||||
|
_com4.c (or possibly don't, in which case the communications will be
|
||||||
|
sent to the real COM4 on your system) */
|
||||||
|
|
||||||
|
p3io_uart_set_path(0, L"COM4");
|
||||||
|
p3io_emu_init(&p3io_ddr_ops, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void p3io_ddr_init_with_plugs(
|
||||||
|
const struct security_mcode *mcode,
|
||||||
|
const struct security_id *pcbid,
|
||||||
|
const struct security_id *eamid,
|
||||||
|
const struct security_rp_sign_key *black_sign_key,
|
||||||
|
const struct security_rp_sign_key *white_sign_key)
|
||||||
|
{
|
||||||
|
memcpy(&p3io_ddr_mcode, mcode, sizeof(struct security_mcode));
|
||||||
|
memcpy(&p3io_ddr_pcbid, pcbid, 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(&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
|
||||||
|
generate IRPs addressed to COM4 and then we possibly intercept them in
|
||||||
|
_com4.c (or possibly don't, in which case the communications will be
|
||||||
|
sent to the real COM4 on your system) */
|
||||||
|
|
||||||
|
p3io_uart_set_path(0, L"COM4");
|
||||||
|
p3io_emu_init(&p3io_ddr_ops_with_plugs, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void p3io_ddr_fini(void)
|
||||||
|
{
|
||||||
|
p3io_emu_fini();
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_read_jamma(void *ctx, uint32_t *state)
|
||||||
|
{
|
||||||
|
log_assert(state != NULL);
|
||||||
|
|
||||||
|
*state = ddr_io_read_pad();
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_set_outputs(void *ctx, uint32_t outputs)
|
||||||
|
{
|
||||||
|
ddr_io_set_lights_p3io(outputs);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_get_cab_type(void *ctx, enum p3io_cab_type *type)
|
||||||
|
{
|
||||||
|
if (standard_def) {
|
||||||
|
*type = P3IO_CAB_TYPE_SD;
|
||||||
|
} else {
|
||||||
|
*type = P3IO_CAB_TYPE_HD;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_get_video_freq(void *ctx, enum p3io_video_freq *freq)
|
||||||
|
{
|
||||||
|
if (_15khz) {
|
||||||
|
*freq = P3IO_VIDEO_FREQ_15KHZ;
|
||||||
|
} else {
|
||||||
|
*freq = P3IO_VIDEO_FREQ_31KHZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT p3io_ddr_get_roundplug(
|
||||||
|
void *ctx, uint8_t plug_id, uint8_t *rom, uint8_t *eeprom)
|
||||||
|
{
|
||||||
|
struct security_rp3_eeprom eeprom_out;
|
||||||
|
|
||||||
|
if (plug_id == 0) {
|
||||||
|
/* black */
|
||||||
|
memcpy(rom, p3io_ddr_pcbid.id, sizeof(p3io_ddr_pcbid.id));
|
||||||
|
security_rp3_generate_signed_eeprom_data(
|
||||||
|
SECURITY_RP_UTIL_RP_TYPE_BLACK,
|
||||||
|
&p3io_black_sign_key,
|
||||||
|
&p3io_ddr_mcode,
|
||||||
|
&p3io_ddr_pcbid,
|
||||||
|
&eeprom_out);
|
||||||
|
} else {
|
||||||
|
/* white */
|
||||||
|
memcpy(rom, p3io_ddr_eamid.id, sizeof(p3io_ddr_eamid.id));
|
||||||
|
security_rp3_generate_signed_eeprom_data(
|
||||||
|
SECURITY_RP_UTIL_RP_TYPE_WHITE,
|
||||||
|
&p3io_white_sign_key,
|
||||||
|
&security_mcode_eamuse,
|
||||||
|
&p3io_ddr_eamid,
|
||||||
|
&eeprom_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(eeprom, &eeprom_out, sizeof(struct security_rp3_eeprom));
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO coinstock
|
||||||
23
src/main/ddrhook-util/p3io.h
Normal file
23
src/main/ddrhook-util/p3io.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef DDRHOOK_UTIL_P3IO_H
|
||||||
|
#define DDRHOOK_UTIL_P3IO_H
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "hook/iohook.h"
|
||||||
|
|
||||||
|
#include "security/rp-sign-key.h"
|
||||||
|
#include "security/rp3.h"
|
||||||
|
|
||||||
|
extern const wchar_t p3io_dev_node_prefix[];
|
||||||
|
extern const wchar_t p3io_dev_node[];
|
||||||
|
|
||||||
|
void p3io_ddr_init(void);
|
||||||
|
void p3io_ddr_init_with_plugs(
|
||||||
|
const struct security_mcode *mcode,
|
||||||
|
const struct security_id *pcbid,
|
||||||
|
const struct security_id *eamid,
|
||||||
|
const struct security_rp_sign_key *black_sign_key,
|
||||||
|
const struct security_rp_sign_key *white_sign_key);
|
||||||
|
void p3io_ddr_fini(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef DDRHOOK_SPIKE_H
|
#ifndef DDRHOOK_UTIL_SPIKE_H
|
||||||
#define DDRHOOK_SPIKE_H
|
#define DDRHOOK_UTIL_SPIKE_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
439
src/main/ddrhook-util/usbmem.c
Normal file
439
src/main/ddrhook-util/usbmem.c
Normal file
@@ -0,0 +1,439 @@
|
|||||||
|
#define LOG_MODULE "usbmem"
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
// Don't format because the order is important here
|
||||||
|
#include <windows.h>
|
||||||
|
#include <devioctl.h>
|
||||||
|
#include <ntdef.h>
|
||||||
|
#include <ntddser.h>
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include "hook/iohook.h"
|
||||||
|
|
||||||
|
#include "util/crc.h"
|
||||||
|
#include "util/iobuf.h"
|
||||||
|
#include "util/log.h"
|
||||||
|
#include "util/fs.h"
|
||||||
|
#include "util/str.h"
|
||||||
|
|
||||||
|
#define USBMEM_DEVICE_COUNT 2
|
||||||
|
#define USBMEM_COMMAND_BUF_SIZE 128
|
||||||
|
#define USBMEM_DATA_BUF_SIZE (1024 + 5)
|
||||||
|
|
||||||
|
static HANDLE usbmem_fd;
|
||||||
|
static char usbmem_response[USBMEM_DATA_BUF_SIZE];
|
||||||
|
static bool usbmem_pending;
|
||||||
|
static size_t usbmem_response_length;
|
||||||
|
static bool usbmem_enabled;
|
||||||
|
|
||||||
|
static HRESULT usbmem_open(struct irp *irp);
|
||||||
|
static HRESULT usbmem_close(struct irp *irp);
|
||||||
|
static HRESULT usbmem_write(struct irp *irp);
|
||||||
|
static HRESULT usbmem_read(struct irp *irp);
|
||||||
|
static HRESULT usbmem_ioctl(struct irp *irp);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USBMEM_FILE_TYPE_NONE = 0,
|
||||||
|
USBMEM_FILE_TYPE_READ,
|
||||||
|
USBMEM_FILE_TYPE_WRITE,
|
||||||
|
} USBMEM_FILE_TYPE;
|
||||||
|
|
||||||
|
struct USBMEM_STATE {
|
||||||
|
bool connected;
|
||||||
|
bool opened;
|
||||||
|
bool errored;
|
||||||
|
USBMEM_FILE_TYPE file_type;
|
||||||
|
|
||||||
|
char basepath[MAX_PATH];
|
||||||
|
char path[MAX_PATH];
|
||||||
|
char filename[MAX_PATH];
|
||||||
|
|
||||||
|
uint8_t *buffer;
|
||||||
|
size_t buffer_len;
|
||||||
|
size_t buffer_index;
|
||||||
|
int buffer_frame;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int target_device_id;
|
||||||
|
static struct USBMEM_STATE usbmem_state[USBMEM_DEVICE_COUNT];
|
||||||
|
|
||||||
|
static void usbmem_reset_file_state(int port)
|
||||||
|
{
|
||||||
|
if (usbmem_state[port].buffer) {
|
||||||
|
free(usbmem_state[port].buffer);
|
||||||
|
usbmem_state[port].buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
usbmem_state[port].buffer_len = 0;
|
||||||
|
usbmem_state[port].buffer_index = 0;
|
||||||
|
usbmem_state[port].buffer_frame = 0;
|
||||||
|
usbmem_state[port].file_type = USBMEM_FILE_TYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usbmem_init(const char *path_p1, const char *path_p2, const bool enabled)
|
||||||
|
{
|
||||||
|
log_assert(usbmem_fd == NULL);
|
||||||
|
|
||||||
|
HRESULT hr;
|
||||||
|
char usb_data_path[USBMEM_DEVICE_COUNT][MAX_PATH];
|
||||||
|
|
||||||
|
hr = iohook_open_nul_fd(&usbmem_fd);
|
||||||
|
|
||||||
|
if (hr != S_OK) {
|
||||||
|
log_fatal("Opening nul fd failed: %08lx", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
usbmem_enabled = enabled;
|
||||||
|
|
||||||
|
GetFullPathNameA(path_p1, sizeof(usb_data_path[0]), usb_data_path[0], NULL);
|
||||||
|
log_misc("USB memory data path (P1): %s", usb_data_path[0]);
|
||||||
|
|
||||||
|
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]);
|
||||||
|
|
||||||
|
if (enabled && !path_exists(usb_data_path[0]) && !path_exists(usb_data_path[1])) {
|
||||||
|
log_warning("USB memory data path does not exist, disabling");
|
||||||
|
usbmem_enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
target_device_id = -1;
|
||||||
|
for (int i = 0; i < USBMEM_DEVICE_COUNT; i++) {
|
||||||
|
usbmem_state[i].connected = false;
|
||||||
|
usbmem_state[i].opened = false;
|
||||||
|
usbmem_state[i].errored = false;
|
||||||
|
strcpy(usbmem_state[i].basepath, usb_data_path[i]);
|
||||||
|
memset(usbmem_state[i].path, 0, sizeof(usbmem_state[i].path));
|
||||||
|
memset(usbmem_state[i].filename, 0, sizeof(usbmem_state[i].filename));
|
||||||
|
usbmem_reset_file_state(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void usbmem_fini(void)
|
||||||
|
{
|
||||||
|
if (usbmem_fd != NULL) {
|
||||||
|
CloseHandle(usbmem_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
usbmem_fd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
usbmem_dispatch_irp(struct irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp != NULL);
|
||||||
|
|
||||||
|
if (irp->op != IRP_OP_OPEN && irp->fd != usbmem_fd) {
|
||||||
|
return iohook_invoke_next(irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (irp->op) {
|
||||||
|
case IRP_OP_OPEN:
|
||||||
|
return usbmem_open(irp);
|
||||||
|
case IRP_OP_CLOSE:
|
||||||
|
return usbmem_close(irp);
|
||||||
|
case IRP_OP_READ:
|
||||||
|
return usbmem_read(irp);
|
||||||
|
case IRP_OP_WRITE:
|
||||||
|
return usbmem_write(irp);
|
||||||
|
case IRP_OP_IOCTL:
|
||||||
|
return usbmem_ioctl(irp);
|
||||||
|
default:
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT usbmem_open(struct irp *irp)
|
||||||
|
{
|
||||||
|
log_assert(irp != NULL);
|
||||||
|
|
||||||
|
if (!wstr_eq(irp->open_filename, L"COM3")) {
|
||||||
|
return iohook_invoke_next(irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
irp->fd = usbmem_fd;
|
||||||
|
log_info("USB edit data PCB opened");
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT usbmem_close(struct irp *irp)
|
||||||
|
{
|
||||||
|
log_info("USB edit data PCB closed");
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT usbmem_write(struct irp *irp)
|
||||||
|
{
|
||||||
|
struct const_iobuf *src;
|
||||||
|
char request[USBMEM_COMMAND_BUF_SIZE];
|
||||||
|
uint32_t nbytes;
|
||||||
|
|
||||||
|
log_assert(irp != NULL);
|
||||||
|
log_assert(irp->write.bytes != NULL);
|
||||||
|
|
||||||
|
src = &irp->write;
|
||||||
|
nbytes = src->nbytes > USBMEM_COMMAND_BUF_SIZE ? USBMEM_COMMAND_BUF_SIZE : src->nbytes;
|
||||||
|
memcpy(request, src->bytes, nbytes);
|
||||||
|
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) {
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (usbmem_state[target_device_id].buffer_index < usbmem_state[target_device_id].buffer_len) {
|
||||||
|
usbmem_response_length = sizeof(usbmem_response);
|
||||||
|
usbmem_response[0] = 0x02; // 1 = 0x80 buffer, 2 = 0x400 buffer
|
||||||
|
usbmem_response[1] = usbmem_state[target_device_id].buffer_frame;
|
||||||
|
usbmem_response[2] = ~usbmem_response[1];
|
||||||
|
|
||||||
|
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);
|
||||||
|
} else {
|
||||||
|
size_t len = sizeof(usbmem_response) - 5;
|
||||||
|
|
||||||
|
if (usbmem_state[target_device_id].buffer_index + len > 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);
|
||||||
|
usbmem_state[target_device_id].buffer_index += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
usbmem_state[target_device_id].buffer_frame++;
|
||||||
|
|
||||||
|
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) - 1] = crc & 0xff;
|
||||||
|
} else {
|
||||||
|
usbmem_response_length = 1;
|
||||||
|
usbmem_response[0] = 0x04; // End
|
||||||
|
}
|
||||||
|
} else if (strlen(request) > 0) {
|
||||||
|
log_misc(">%s", request);
|
||||||
|
|
||||||
|
// Try to detect device ID
|
||||||
|
// The only commands without a device ID are "sver", "start", and "init".
|
||||||
|
char target_device_val = request[strlen(request) - 1];
|
||||||
|
char *target_device_id_ptr = strstr(request, " ");
|
||||||
|
if (target_device_id_ptr != NULL) {
|
||||||
|
target_device_val = *(target_device_id_ptr - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Rewrite this code to more cleanly handle hotplugging USB drives
|
||||||
|
if (str_eq(request, "sver")) {
|
||||||
|
str_cpy(
|
||||||
|
usbmem_response,
|
||||||
|
sizeof(usbmem_response),
|
||||||
|
"done GQHDXJAA DJHACKRS");
|
||||||
|
} else if (str_eq(request, "init") || str_eq(request, "start")) {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
} else if (target_device_val == 'a' || target_device_val == 'b') {
|
||||||
|
// Counterintuitively, b is P1 and a is P2
|
||||||
|
target_device_id = target_device_val == 'b' ? 0 : 1;
|
||||||
|
|
||||||
|
if (!usbmem_enabled) {
|
||||||
|
// Ignore all other USB device specific commands and pretend a device isn't plugged in
|
||||||
|
// when USB memory emulation is disabled.
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
} else if (usbmem_state[target_device_id].errored) {
|
||||||
|
// If the device went through the entire process once and the file didn't exist
|
||||||
|
// then just force it to be disabled until the game is restarted because otherwise
|
||||||
|
// it'll get stuck in a loop.
|
||||||
|
// 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");
|
||||||
|
} 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].errored = false;
|
||||||
|
|
||||||
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
|
||||||
|
if (usbmem_state[target_device_id].connected)
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
else
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
||||||
|
} else if (str_eq(request, "offa") || str_eq(request, "offb")) {
|
||||||
|
if (usbmem_state[target_device_id].connected)
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
else
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
||||||
|
|
||||||
|
usbmem_state[target_device_id].connected = false;
|
||||||
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
} else if (str_eq(request, "opna") || str_eq(request, "opnb")) {
|
||||||
|
bool basepath_exists = path_exists(usbmem_state[target_device_id].basepath);
|
||||||
|
|
||||||
|
if (!usbmem_state[target_device_id].connected || !basepath_exists) {
|
||||||
|
usbmem_state[target_device_id].opened = false;
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
||||||
|
} else {
|
||||||
|
usbmem_state[target_device_id].opened = true;
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
}
|
||||||
|
} else if (str_eq(request, "clsa") || str_eq(request, "clsb")) {
|
||||||
|
if (usbmem_state[target_device_id].opened)
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
else
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not connected");
|
||||||
|
|
||||||
|
usbmem_state[target_device_id].opened = false;
|
||||||
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
} else if (strncmp(request, "cda ", 4) == 0 || strncmp(request, "cdb ", 4) == 0) {
|
||||||
|
char *path = request + 4;
|
||||||
|
|
||||||
|
if (!usbmem_state[target_device_id].connected || !usbmem_state[target_device_id].opened) {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
} else if (path[1] == ':') {
|
||||||
|
// Absolute path
|
||||||
|
char temp[MAX_PATH];
|
||||||
|
snprintf(temp, sizeof(temp), "%s\\%s", usbmem_state[target_device_id].basepath, path + 3);
|
||||||
|
|
||||||
|
if (!path_exists(temp)) {
|
||||||
|
log_warning("Couldn't find path %s", temp);
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
} else {
|
||||||
|
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(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
}
|
||||||
|
} else if (strncmp(request, "rda ", 4) == 0 || strncmp(request, "rdb ", 4) == 0) {
|
||||||
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
|
||||||
|
if (!usbmem_state[target_device_id].connected || !usbmem_state[target_device_id].opened) {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
} else {
|
||||||
|
char temp[MAX_PATH] = {0};
|
||||||
|
char *filename = request + 4;
|
||||||
|
|
||||||
|
snprintf(temp, sizeof(temp), "%s\\%s", usbmem_state[target_device_id].path, filename);
|
||||||
|
|
||||||
|
if (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].file_type = USBMEM_FILE_TYPE_NONE;
|
||||||
|
usbmem_state[target_device_id].buffer_len = 0;
|
||||||
|
usbmem_state[target_device_id].buffer_index = 0;
|
||||||
|
usbmem_state[target_device_id].buffer_frame = 0;
|
||||||
|
memset(usbmem_state[target_device_id].filename, 0, sizeof(usbmem_state[target_device_id].filename));
|
||||||
|
|
||||||
|
if (!path_exists(temp)) {
|
||||||
|
log_warning("Couldn't find file %s", temp);
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
usbmem_state[target_device_id].errored = true;
|
||||||
|
} else {
|
||||||
|
bool loaded = file_load(temp, (void**)&usbmem_state[target_device_id].buffer,
|
||||||
|
&usbmem_state[target_device_id].buffer_len, false);
|
||||||
|
|
||||||
|
if (loaded) {
|
||||||
|
log_misc("Reading file %s", temp);
|
||||||
|
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(usbmem_response, sizeof(usbmem_response), "start");
|
||||||
|
} else {
|
||||||
|
log_warning("Couldn't read file %s", temp);
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
usbmem_state[target_device_id].errored = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (strncmp(request, "wra ", 4) == 0 || strncmp(request, "wrb ", 4) == 0) {
|
||||||
|
// Open file for writing
|
||||||
|
usbmem_reset_file_state(target_device_id);
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not supported");
|
||||||
|
} else if (strncmp(request, "wha ", 4) == 0 || strncmp(request, "whb ", 4) == 0) {
|
||||||
|
// Something relating to writing?
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "not supported");
|
||||||
|
} else if (strncmp(request, "lma ", 4) == 0 || strncmp(request, "lmb ", 4) == 0) {
|
||||||
|
// What is "lm"?
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "done");
|
||||||
|
} else {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
str_cat(usbmem_response, sizeof(usbmem_response), "\r>");
|
||||||
|
usbmem_response_length = strlen(usbmem_response);
|
||||||
|
}
|
||||||
|
|
||||||
|
usbmem_pending = true;
|
||||||
|
src->pos = nbytes;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT usbmem_read(struct irp *irp)
|
||||||
|
{
|
||||||
|
struct iobuf *dest;
|
||||||
|
|
||||||
|
log_assert(irp != NULL);
|
||||||
|
log_assert(irp->read.bytes != NULL);
|
||||||
|
|
||||||
|
dest = &irp->read;
|
||||||
|
|
||||||
|
if (usbmem_pending && usbmem_response_length != USBMEM_DATA_BUF_SIZE) {
|
||||||
|
log_misc("%s", usbmem_response);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usbmem_pending && usbmem_response_length == 0) {
|
||||||
|
str_cpy(usbmem_response, sizeof(usbmem_response), "\r>");
|
||||||
|
usbmem_response_length = strlen(usbmem_response);
|
||||||
|
}
|
||||||
|
|
||||||
|
dest->pos = usbmem_response_length;
|
||||||
|
memcpy(dest->bytes, usbmem_response, usbmem_response_length);
|
||||||
|
|
||||||
|
usbmem_pending = false;
|
||||||
|
usbmem_response_length = 0;
|
||||||
|
memset(usbmem_response, 0, sizeof(usbmem_response));
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT usbmem_ioctl(struct irp *irp)
|
||||||
|
{
|
||||||
|
SERIAL_STATUS *status;
|
||||||
|
|
||||||
|
log_assert(irp != NULL);
|
||||||
|
|
||||||
|
switch (irp->ioctl) {
|
||||||
|
case IOCTL_SERIAL_GET_COMMSTATUS:
|
||||||
|
if (irp->read.bytes == NULL) {
|
||||||
|
log_warning(
|
||||||
|
"IOCTL_SERIAL_GET_COMMSTATUS: Output buffer is NULL");
|
||||||
|
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (irp->read.nbytes < sizeof(*status)) {
|
||||||
|
log_warning("IOCTL_SERIAL_GET_COMMSTATUS: Buffer is too small");
|
||||||
|
|
||||||
|
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
status = (SERIAL_STATUS *) irp->read.bytes;
|
||||||
|
status->Errors = 0;
|
||||||
|
status->AmountInInQueue = usbmem_pending ? 1 : 0;
|
||||||
|
|
||||||
|
irp->read.pos = sizeof(*status);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
8
src/main/ddrhook-util/usbmem.h
Normal file
8
src/main/ddrhook-util/usbmem.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef DDRHOOK_UTIL_USBMEM_H
|
||||||
|
#define DDRHOOK_UTIL_USBMEM_H
|
||||||
|
|
||||||
|
void usbmem_init(const char *path_p1, const char *path_p2, const bool enabled);
|
||||||
|
void usbmem_fini(void);
|
||||||
|
HRESULT usbmem_dispatch_irp(struct irp *irp);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
avsdlls += ddrhook
|
|
||||||
|
|
||||||
deplibs_ddrhook := \
|
|
||||||
avs \
|
|
||||||
|
|
||||||
libs_ddrhook := \
|
|
||||||
acioemu \
|
|
||||||
p3ioemu \
|
|
||||||
p3io \
|
|
||||||
hook \
|
|
||||||
hooklib \
|
|
||||||
util \
|
|
||||||
eamio \
|
|
||||||
ddrio \
|
|
||||||
|
|
||||||
src_ddrhook := \
|
|
||||||
extio.c \
|
|
||||||
dllmain.c \
|
|
||||||
_com4.c \
|
|
||||||
dinput.c \
|
|
||||||
gfx.c \
|
|
||||||
guid.c \
|
|
||||||
master.c \
|
|
||||||
misc.c \
|
|
||||||
monitor.c \
|
|
||||||
p3io.c \
|
|
||||||
usbmem.c \
|
|
||||||
spike.c
|
|
||||||
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
#include <d3d9.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "hook/com-proxy.h"
|
|
||||||
#include "hook/table.h"
|
|
||||||
|
|
||||||
#include "util/defs.h"
|
|
||||||
#include "util/log.h"
|
|
||||||
|
|
||||||
static HRESULT STDCALL my_CreateDevice(
|
|
||||||
IDirect3D9 *self,
|
|
||||||
UINT adapter,
|
|
||||||
D3DDEVTYPE type,
|
|
||||||
HWND hwnd,
|
|
||||||
DWORD flags,
|
|
||||||
D3DPRESENT_PARAMETERS *pp,
|
|
||||||
IDirect3DDevice9 **pdev);
|
|
||||||
|
|
||||||
static IDirect3D9 *STDCALL my_Direct3DCreate9(UINT sdk_ver);
|
|
||||||
|
|
||||||
static IDirect3D9 *(STDCALL *real_Direct3DCreate9)(UINT sdk_ver);
|
|
||||||
|
|
||||||
static bool gfx_windowed;
|
|
||||||
|
|
||||||
static const struct hook_symbol gfx_d3d9_hook_syms[] = {
|
|
||||||
{
|
|
||||||
.name = "Direct3DCreate9",
|
|
||||||
.patch = my_Direct3DCreate9,
|
|
||||||
.link = (void **) &real_Direct3DCreate9,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static HRESULT STDCALL my_CreateDevice(
|
|
||||||
IDirect3D9 *self,
|
|
||||||
UINT adapter,
|
|
||||||
D3DDEVTYPE type,
|
|
||||||
HWND hwnd,
|
|
||||||
DWORD flags,
|
|
||||||
D3DPRESENT_PARAMETERS *pp,
|
|
||||||
IDirect3DDevice9 **pdev)
|
|
||||||
{
|
|
||||||
IDirect3D9 *real;
|
|
||||||
|
|
||||||
real = com_proxy_downcast(self)->real;
|
|
||||||
|
|
||||||
if (gfx_windowed) {
|
|
||||||
pp->Windowed = TRUE;
|
|
||||||
pp->FullScreen_RefreshRateInHz = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return IDirect3D9_CreateDevice(real, adapter, type, hwnd, flags, pp, pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static IDirect3D9 *STDCALL my_Direct3DCreate9(UINT sdk_ver)
|
|
||||||
{
|
|
||||||
IDirect3D9 *api;
|
|
||||||
IDirect3D9Vtbl *api_vtbl;
|
|
||||||
struct com_proxy *api_proxy;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
log_info("Direct3DCreate9 hook hit");
|
|
||||||
|
|
||||||
api = real_Direct3DCreate9(sdk_ver);
|
|
||||||
|
|
||||||
hr = com_proxy_wrap(&api_proxy, api, sizeof(*api->lpVtbl));
|
|
||||||
|
|
||||||
if (hr != S_OK) {
|
|
||||||
log_fatal("Wrapping com proxy failed: %08lx", hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
api_vtbl = api_proxy->vptr;
|
|
||||||
|
|
||||||
api_vtbl->CreateDevice = my_CreateDevice;
|
|
||||||
|
|
||||||
return (IDirect3D9 *) api_proxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
void gfx_insert_hooks(HMODULE target)
|
|
||||||
{
|
|
||||||
hook_table_apply(
|
|
||||||
target, "d3d9.dll", gfx_d3d9_hook_syms, lengthof(gfx_d3d9_hook_syms));
|
|
||||||
|
|
||||||
log_info("Inserted graphics hooks");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool gfx_get_windowed(void)
|
|
||||||
{
|
|
||||||
return gfx_windowed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void gfx_set_windowed(void)
|
|
||||||
{
|
|
||||||
gfx_windowed = true;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#ifndef DDRHOOK_GFX_H
|
|
||||||
#define DDRHOOK_GFX_H
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
void gfx_insert_hooks(HMODULE target);
|
|
||||||
bool gfx_get_windowed(void);
|
|
||||||
void gfx_set_windowed(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user