Files
Sylpheed/docs/re/data/input-ring-word-remap.txt
sylph-decoder 4518b5c76a re: the pad word is REMAPPED -- my own bit table was mislabelled throughout
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
2026-09-01 18:33:42 +00:00

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