mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-15 11:55:10 -05:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a81997dce8 | ||
|
|
bfe68f8708 | ||
|
|
9c1d83d050 | ||
|
|
e4ee94ae2a | ||
|
|
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
|
||||
|
||||
variables:
|
||||
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:
|
||||
- docker:19.03.8-dind
|
||||
|
||||
before_script:
|
||||
- docker info
|
||||
|
||||
stages:
|
||||
- build
|
||||
- upload-release
|
||||
- upload
|
||||
- release
|
||||
|
||||
build-master:
|
||||
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:
|
||||
refs:
|
||||
- master
|
||||
|
||||
build-tags:
|
||||
stage: build
|
||||
- tags
|
||||
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:
|
||||
- tags
|
||||
- build
|
||||
expire_in: 1 week
|
||||
|
||||
upload-release:
|
||||
stage: upload-release
|
||||
dependencies:
|
||||
- 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}
|
||||
upload-package-registry:
|
||||
stage: upload
|
||||
image: curlimages/curl:latest
|
||||
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}"
|
||||
|
||||
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,7 +1,21 @@
|
||||
# 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.
|
||||
|
||||
## 0.00
|
||||
|
||||
testing release pipeline
|
||||
|
||||
## 5.37
|
||||
|
||||
## 5.36
|
||||
* iidxhook9: Support for IIDX28
|
||||
* Various bugfixes
|
||||
|
||||
## 5.35
|
||||
* Jubeat: Add jbio-p4io
|
||||
* 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: Fix d3d9ex windowed hook not behaving correctly (size/framed)
|
||||
* Misc: Fix docs not being included with release
|
||||
|
||||
@@ -91,6 +91,7 @@ include src/main/camhook/Module.mk
|
||||
include src/main/cconfig/Module.mk
|
||||
include src/main/config/Module.mk
|
||||
include src/main/d3d9exhook/Module.mk
|
||||
include src/main/ddrhook-util/Module.mk
|
||||
include src/main/ddrhook/Module.mk
|
||||
include src/main/ddrio-mm/Module.mk
|
||||
include src/main/ddrio-smx/Module.mk
|
||||
@@ -365,7 +366,7 @@ $(zipdir)/iidx-25-to-26.zip: \
|
||||
$(V)echo ... $@
|
||||
$(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/launcher.exe \
|
||||
build/bin/indep-64/config.exe \
|
||||
@@ -375,7 +376,9 @@ $(zipdir)/iidx-27.zip: \
|
||||
build/bin/indep-64/vefxio.dll \
|
||||
dist/iidx/config.bat \
|
||||
dist/iidx/gamestart-27.bat \
|
||||
dist/iidx/gamestart-28.bat \
|
||||
dist/iidx/iidxhook-27.conf \
|
||||
dist/iidx/iidxhook-28.conf \
|
||||
dist/iidx/vefx.txt \
|
||||
| $(zipdir)/
|
||||
$(V)echo ... $@
|
||||
@@ -614,7 +617,7 @@ $(BUILDDIR)/bemanitools.zip: \
|
||||
$(zipdir)/iidx-20.zip \
|
||||
$(zipdir)/iidx-21-to-24.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-x64.zip \
|
||||
$(zipdir)/jb-01.zip \
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Bemanitools 5
|
||||
[](https://dev.s-ul.net/djhackers/bemanitools/commits/master)
|
||||
|
||||
Version: 5.35
|
||||
Version: 5.36
|
||||
|
||||
[Release history](CHANGELOG.md)
|
||||
|
||||
@@ -55,7 +55,8 @@ The tl;dr version and golden rules of the sections in the document:
|
||||
* Beatmania IIDX 24 SINOBUZ (iidx-21-to-24.zip) using [iidxhook7](doc/iidxhook/iidxhook7.md)
|
||||
* Beatmania IIDX 25 CANNON BALLERS (iidx-25-to-26.zip) using [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||
* Beatmania IIDX 26 Rootage (iidx-25-to-26.zip) using [iidxhook8](doc/iidxhook/iidxhook8.md)
|
||||
* Beatmania IIDX 27 Heroic Verse (iidx-27.zip) using [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||
* Beatmania IIDX 27 Heroic Verse (iidx-27-to-28.zip) using [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||
* Beatmania IIDX 28 BISTROVER (iidx-27-to-28.zip) using [iidxhook9](doc/iidxhook/iidxhook9.md)
|
||||
* jubeat
|
||||
* jubeat (experimental/buggy) (jb-01.zip) using [jbhook1](doc/jbhook1/jbhook1.md)
|
||||
* jubeat saucer (fulfill) (jb-05-to-07.zip) using jbhook
|
||||
|
||||
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 %*
|
||||
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)
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
# Bemanitools 5 documentation
|
||||
|
||||
This folder contains various types of documentation.
|
||||
|
||||
Table of contents:
|
||||
|
||||
* Key tools
|
||||
* [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`
|
||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||
* [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`
|
||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||
* Game hooks
|
||||
* [ddrhook](ddrhook/README.md): Documentation relevant to `ddrhook` implementations
|
||||
* [iidxhook](iidxhook/README.md): Documentation relevant to `iidxhook` implementations
|
||||
* [jbhook](jbhook/README.md): Documentation relevant to `jbhook` implementations
|
||||
* [sdvxhook](sdvxhook/README.md): Documentation relevant to `sdvxhook` implementations
|
||||
* [ddrhook](ddrhook/README.md): Documentation relevant to `ddrhook` implementations
|
||||
* [iidxhook](iidxhook/README.md): Documentation relevant to `iidxhook` implementations
|
||||
* [jbhook](jbhook/README.md): Documentation relevant to `jbhook` implementations
|
||||
* [sdvxhook](sdvxhook/README.md): Documentation relevant to `sdvxhook` implementations
|
||||
* Development
|
||||
* [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
|
||||
* [Development](development.md): Development environment, building, releasing, etc.
|
||||
* [Developer documentation](dev/README.md): Various lose documentation/notes by developers
|
||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||
* Hardware
|
||||
* [Hardware](hardware/README.md): Anything related to hardware, e.g. IO boards
|
||||
* [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
|
||||
* [Development](development.md): Development environment, building, releasing, etc.
|
||||
* [Developer documentation](dev/README.md): Various lose documentation/notes by developers
|
||||
* [Tools](tools/README.md): Documentation for additional user and development tooling
|
||||
|
||||
## 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
|
||||
|
||||
@@ -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 |
|
||||
@@ -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
|
||||
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
|
||||
menu. When enabled, the game seems to hang and expects you to power
|
||||
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"
|
||||
This can be caused by:
|
||||
* Invalid PCBID
|
||||
* Invalid PCBID/EAMID: Ensure both are [set to the same ID](#eamuse-network-setup)
|
||||
* Firewall blocking connections
|
||||
* Invalid eamuse url or port specified
|
||||
* Game is not run using the Administrator account
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
The following games are compatible with this version of iidxhook:
|
||||
* Heroic Verse
|
||||
* BISTROVER
|
||||
|
||||
The games must be bootstrapped using [launcher](../launcher.md).
|
||||
|
||||
|
||||
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 {
|
||||
uint8_t mac_addr[6];
|
||||
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 {
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
#include "acio/hdxs.h"
|
||||
#include "acio/icca.h"
|
||||
#include "acio/kfca.h"
|
||||
#include "acio/mdxf.h"
|
||||
#include "acio/panb.h"
|
||||
#include "acio/rvol.h"
|
||||
|
||||
#define AC_IO_SOF 0xAA
|
||||
#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_SPIKE = 0x05010000,
|
||||
AC_IO_NODE_TYPE_KFCA = 0x09060000,
|
||||
AC_IO_NODE_TYPE_BI2A = 0x0d060000,
|
||||
AC_IO_NODE_TYPE_RVOL = 0x09060001,
|
||||
AC_IO_NODE_TYPE_MDXF = 0x09070000,
|
||||
AC_IO_NODE_TYPE_PANB = 0x090E0000,
|
||||
AC_IO_NODE_TYPE_BMPU = 0x0B000000,
|
||||
AC_IO_NODE_TYPE_BI2A = 0x0D060000,
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
@@ -84,6 +88,12 @@ struct ac_io_message {
|
||||
struct ac_io_panb_poll_out panb_poll_out;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ enum ac_io_icca_cmd {
|
||||
AC_IO_ICCA_CMD_ENGAGE = 0x0131,
|
||||
AC_IO_ICCA_CMD_POLL = 0x0134,
|
||||
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_KEY_EXCHANGE = 0x0160,
|
||||
AC_IO_ICCA_CMD_POLL_ENCRYPTED = 0x0164,
|
||||
|
||||
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 \
|
||||
kfca.c \
|
||||
panb.c \
|
||||
rvol.c \
|
||||
port.c \
|
||||
|
||||
|
||||
@@ -300,6 +300,7 @@ static bool aciodrv_device_get_version(struct aciodrv_device_ctx *device, uint8_
|
||||
msg.cmd.version.time);
|
||||
|
||||
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->minor = msg.cmd.version.minor;
|
||||
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);
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -13,6 +13,7 @@ struct aciodrv_device_ctx;
|
||||
|
||||
struct aciodrv_device_node_version {
|
||||
char product[ACIO_NODE_PRODUCT_CODE_LEN];
|
||||
uint32_t type;
|
||||
uint8_t major;
|
||||
uint8_t minor;
|
||||
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]);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
||||
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
|
||||
@@ -125,8 +125,8 @@ void ac_io_emu_icca_dispatch_request(
|
||||
|
||||
break;
|
||||
|
||||
case AC_IO_ICCA_CMD_BEGIN_KEYPAD:
|
||||
log_misc("AC_IO_ICCA_CMD_BEGIN_KEYPAD(%d)", req->addr);
|
||||
case AC_IO_ICCA_CMD_DEVICE_CONTROL:
|
||||
log_misc("AC_IO_ICCA_CMD_DEVICE_CONTROL(%d)", req->addr);
|
||||
ac_io_emu_icca_send_status(icca, req, 0x00);
|
||||
icca->keypad_started = true;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ libs_aciotest := \
|
||||
src_aciotest := \
|
||||
icca.c \
|
||||
kfca.c \
|
||||
bi2a-sdvx.c \
|
||||
panb.c \
|
||||
rvol.c \
|
||||
bi2a-sdvx.c \
|
||||
main.c \
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "aciotest/icca.h"
|
||||
#include "aciotest/kfca.h"
|
||||
#include "aciotest/panb.h"
|
||||
#include "aciotest/rvol.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
@@ -21,31 +22,37 @@ static uint8_t bi2a_mode = 0;
|
||||
* Enumerate supported ACIO nodes based on their product id.
|
||||
*/
|
||||
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) ||
|
||||
!memcmp(product, "ICCC", 4)) {
|
||||
if (product_type == AC_IO_NODE_TYPE_ICCA) {
|
||||
handler->init = aciotest_icca_handler_init;
|
||||
handler->update = aciotest_icca_handler_update;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!memcmp(product, "KFCA", 4)) {
|
||||
if (product_type == AC_IO_NODE_TYPE_KFCA) {
|
||||
handler->init = aciotest_kfca_handler_init;
|
||||
handler->update = aciotest_kfca_handler_update;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!memcmp(product, "PANB", 4)) {
|
||||
if (product_type == AC_IO_NODE_TYPE_PANB) {
|
||||
handler->init = aciotest_panb_handler_init;
|
||||
handler->update = aciotest_panb_handler_update;
|
||||
|
||||
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) {
|
||||
handler->init = aciotest_bi2a_sdvx_handler_init;
|
||||
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++) {
|
||||
char product[4];
|
||||
uint32_t product_type = aciodrv_device_get_node_product_type(device, i);
|
||||
aciodrv_device_get_node_product_ident(device, i, product);
|
||||
|
||||
printf(
|
||||
"> %d: %c%c%c%c\n",
|
||||
"> %d: %c%c%c%c (%08x)\n",
|
||||
i + 1,
|
||||
product[0],
|
||||
product[1],
|
||||
product[2],
|
||||
product[3]);
|
||||
product[3],
|
||||
product_type);
|
||||
|
||||
if (!aciotest_assign_handler(product, &handler[i])) {
|
||||
if (!aciotest_assign_handler(product_type, &handler[i])) {
|
||||
printf(
|
||||
"ERROR: Unsupported acio node product %c%c%c%c on node %d\n",
|
||||
product[0],
|
||||
product[1],
|
||||
product[2],
|
||||
product[3],
|
||||
"ERROR: Unsupported acio node product %08x on node %d\n",
|
||||
product_type,
|
||||
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
|
||||
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_WATCHDOG = 0x0120,
|
||||
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
|
||||
13
src/main/ddrhook-util/Module.mk
Normal file
13
src/main/ddrhook-util/Module.mk
Normal file
@@ -0,0 +1,13 @@
|
||||
libs += ddrhook-util
|
||||
|
||||
libs_ddrhook-util := \
|
||||
hook \
|
||||
hooklib \
|
||||
util \
|
||||
|
||||
src_ddrhook-util := \
|
||||
dinput.c \
|
||||
gfx.c \
|
||||
guid.c \
|
||||
misc.c \
|
||||
monitor.c \
|
||||
@@ -1,4 +1,4 @@
|
||||
#include <initguid.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "ddrhook/monitor.h"
|
||||
#include "ddrhook-util/monitor.h"
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "ddrhook/gfx.h"
|
||||
#include "ddrhook-util/gfx.h"
|
||||
|
||||
#include "hook/pe.h"
|
||||
#include "hook/table.h"
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include "ddrhook/monitor.h"
|
||||
#include "ddrhook-util/monitor.h"
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
@@ -5,6 +5,7 @@ deplibs_ddrhook := \
|
||||
|
||||
libs_ddrhook := \
|
||||
acioemu \
|
||||
ddrhook-util \
|
||||
p3ioemu \
|
||||
p3io \
|
||||
hook \
|
||||
@@ -17,12 +18,7 @@ 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
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
#include "bemanitools/ddrio.h"
|
||||
#include "bemanitools/eamio.h"
|
||||
|
||||
#include "ddrhook-util/gfx.h"
|
||||
|
||||
#include "ddrhook/_com4.h"
|
||||
#include "ddrhook/extio.h"
|
||||
#include "ddrhook/gfx.h"
|
||||
#include "ddrhook/master.h"
|
||||
#include "ddrhook/p3io.h"
|
||||
#include "ddrhook/spike.h"
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#include "ddrhook/master.h"
|
||||
#include "ddrhook/dinput.h"
|
||||
#include "ddrhook/gfx.h"
|
||||
#include "ddrhook/misc.h"
|
||||
#include "ddrhook/monitor.h"
|
||||
|
||||
#include "ddrhook-util/dinput.h"
|
||||
#include "ddrhook-util/gfx.h"
|
||||
#include "ddrhook-util/misc.h"
|
||||
#include "ddrhook-util/monitor.h"
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
|
||||
@@ -168,6 +168,14 @@ void eamuse_set_addr(const struct net_addr *addr)
|
||||
|
||||
tmp_str2 = net_addr_to_str(&eamuse_server_addr_resolved);
|
||||
|
||||
// when resolving URLs with net_str_parse
|
||||
// it will default to NET_INVALID_PORT if no port is specified
|
||||
// assume default 80 here as a good sanity check
|
||||
if (eamuse_server_addr_resolved.ipv4.port == NET_INVALID_PORT) {
|
||||
log_info("No port was specified, using port 80 as fallback");
|
||||
eamuse_server_addr_resolved.ipv4.port = 80;
|
||||
}
|
||||
|
||||
log_info("Target eamuse server %s resolved to %s", tmp_str, tmp_str2);
|
||||
|
||||
free(tmp_str);
|
||||
|
||||
Reference in New Issue
Block a user