• src/doors/syncretro/test_disc.csrc/doors/syncretro/CMakeLists.txt M2_I

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sun Oct 25 16:24:03 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/1fa350147898ba554bd54bc2
    Added Files:
    src/doors/syncretro/test_disc.c
    Modified Files:
    src/doors/syncretro/CMakeLists.txt M2_INPUT.md syncretro_binds.c syncretro_input.c
    Log Message:
    syncretro: numpad is the keypad by position; Shift reaches all 16 disc detents

    The numeric keypad drove the Intellivision keypad by printed digit. The two devices are upside down relative to each other (a PC numpad has 7 8 9 across the top, the Intellivision keypad has 1 2 3 there), so in a cartridge that reads the keypad as a direction -- Tron Deadly Discs aims its throw by key position -- the top-left numpad key fired bottom-left. The whole vertical
    axis was flipped, not only the diagonals: numpad 8 is the bottom-middle
    keypad key. Reported by Deuce as the numpad diagonals being upside down.

    Numpad 7/8/9 now map to keypad 1/2/3 and 1/2/3 to 7/8/9; 4/6, 5, 0, Clear
    and Enter are unchanged. The number row has no shape and stays by digit, so
    it remains the way to type a game-variant number; the same number typed on
    the numpad enters its positional counterpart.

    The disc was capped at eight positions: the door only ever sent d-pad bits,
    and FreeIntv composes a diagonal from two of them but reads the full 16-way ring only from the left analog stick, which the door used solely for the paddle-cart sweep. Holding Shift now turns the held direction one detent clockwise on that stick (Up is NNE, Up+Left is NNW, Left is WNW, and so on round the ring), so every one of the sixteen is a key or two plus Shift.
    While the stick speaks for a controller its d-pad bits are withheld, because the core ORs both into one controller word. Shift is read from the evdev modifier edges (SyncTERM) and from kitty's LEFT_SHIFT/RIGHT_SHIFT functional codes; the byte path has neither Shift nor a key-up and is unchanged.

    The sixteen stick vectors are chosen on the core's own quantized grid:
    FreeIntv divides each axis by 8192 before atan2 and buckets the angle into fifteen 24-degree slots, so the detent is a property of the quantized integer pair, not of the nominal angle. The paddle sweep's vectors move onto the same table (E/ESE and W/WNW), which is what they already decoded to.

    test_disc.c drives the real input module through SyncTERM physical-key
    reports and decodes the results with a copy of the core's arithmetic: every numpad key, all sixteen detents plain and shifted, the withheld bits, the sweep, and a gamepad console left untouched. The help screen gains the Shift row and notes that the numpad is by position; M2_INPUT.md documents both.

    Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net