input-pad-read-path.md says of the word the C_PAD_DECODER reads: "There is no shift and no remap on the way in -- the bit positions are XINPUT's own." That is wrong. sub_8220D500 rebuilds the word out of XINPUT_GAMEPAD before anything else sees it, into the game's own numbering. bits 0-3 A B X Y bits 4-7 left stick UP DOWN LEFT RIGHT (+/-20000 of 32767) bits 8-11 right stick UP DOWN LEFT RIGHT bits 12-15 D-pad UP DOWN LEFT RIGHT bits 16-17 START, BACK bits 18-19 LB, RB bits 20-21 LT, RT -- digital, threshold >220 of 255 bits 22-23 L3, R3 Extracted mechanically from the image, no row typed by hand. The control is the shape of the result: the 24 assignments land on bits 0..23, each used exactly once, none repeated. A misdecode does not produce a bijection over a contiguous range, and coincidence does not put the stick and D-pad directions in the same order in two aligned nibbles. So every mask in that page's tables names the wrong button. The 0xE000 x18 site, read there as "B | X | Y", is "D-pad DOWN | LEFT | RIGHT" -- eighteen sites testing a menu cursor, which is what 18 sites should be. And its headline negative is REFUTED: "LB and RB are not menu inputs" is false. They are bound at config fields this+0x70 and this+0x84, LT/RT at +0x74/+0x80. The negative was searched for 0x0100/0x0200 -- LB and RB in XINPUT's numbering -- in a word where they live at 0x40000/0x80000. Right function, right buttons, wrong bit positions, so it could only come back empty. A negative is only as good as the numbering it was searched in. Also decodes the ring record: +12 HELD, +16 PRESSED, +20 RELEASED, +28/+32 raw trigger bytes. Edge and level are one struct four bytes apart, which displaces that page's guess that press-vs-hold was split between GetState and the XamInputGetKeystrokeEx queue. The superset claim in that page survives and is untouched: sub_82457038 really does compare every XINPUT_GAMEPAD field, and it really is XINPUT-layout. This page depends on it. Not decoded: which output bit means which ACTION, and per-screen sets. 5 of 18 output-bit sites did not resolve to a pad guard, so the output map is a lower bound -- in particular "START is not tested" is NOT claimed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
35 lines
2.5 KiB
Plaintext
35 lines
2.5 KiB
Plaintext
# C_PAD_RINGBUF button word -- the REMAP from XINPUT_GAMEPAD into the game's
|
|
# own bit numbering. Built by sub_8220D500 and stored to ringbuf+12.
|
|
# Every row read straight out of /image/sylpheed.pe (VA - 0x82000000); the
|
|
# 'raw' column is the instruction word in the image at that address.
|
|
|
|
site raw XINPUT source condition ring bit bit#
|
|
8220D55C 39000001 wButtons A 0x00000001 0
|
|
8220D578 61080002 wButtons B 0x00000002 1
|
|
8220D594 61080004 wButtons X 0x00000004 2
|
|
8220D5B0 61080008 wButtons Y 0x00000008 3
|
|
8220D5CC 65080001 wButtons START 0x00010000 16
|
|
8220D5E8 65080002 wButtons BACK 0x00020000 17
|
|
8220D604 61081000 wButtons DPAD_UP 0x00001000 12
|
|
8220D620 61082000 wButtons DPAD_DOWN 0x00002000 13
|
|
8220D63C 61084000 wButtons DPAD_LEFT 0x00004000 14
|
|
8220D658 61088000 wButtons DPAD_RIGHT 0x00008000 15
|
|
8220D674 65080004 wButtons LB (left shoulder) 0x00040000 18
|
|
8220D690 65080008 wButtons RB (right shoulder) 0x00080000 19
|
|
8220D6AC 65080040 wButtons L3 (left thumb click) 0x00400000 22
|
|
8220D6C8 65080080 wButtons R3 (right thumb click) 0x00800000 23
|
|
8220D6E0 65080010 bLeftTrigger bLeftTrigger > 0xDC (220) 0x00100000 20
|
|
8220D6F8 65080020 bRightTrigger bRightTrigger > 0xDC (220) 0x00200000 21
|
|
8220D714 61080040 sThumbLX sThumbLX < -20000 0x00000040 6
|
|
8220D728 61080080 sThumbLX sThumbLX > +20000 0x00000080 7
|
|
8220D744 61080020 sThumbLY sThumbLY < -20000 0x00000020 5
|
|
8220D758 61080010 sThumbLY sThumbLY > +20000 0x00000010 4
|
|
8220D774 61080400 sThumbRX sThumbRX < -20000 0x00000400 10
|
|
8220D788 61080800 sThumbRX sThumbRX > +20000 0x00000800 11
|
|
8220D7A4 61080200 sThumbRY sThumbRY < -20000 0x00000200 9
|
|
8220D7B8 61080100 sThumbRY sThumbRY > +20000 0x00000100 8
|
|
|
|
# 24 mappings, covering every field of XINPUT_GAMEPAD.
|
|
# ring bits used: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23
|
|
# contiguous 0..23 with none repeated: True
|