• src/doors/syncretro/GAMES

    From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Fri Jul 24 11:06:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/b7c59b78c62840b5edc2ed23
    Added Files:
    src/doors/syncretro/GAMES_INI.md
    Modified Files:
    exec/load/syncretro_lobby.js src/doors/syncretro/.gitignore main.c probe_core.c syncretro_games.c test_binds.c test_games.c
    Log Message:
    syncretro: fix games.ini review findings, track GAMES_INI.md

    Applies the final code review of the games.ini feature.

    - Track GAMES_INI.md (was never git-added, though four shipped files
    already cite it) and correct it: mark the feature implemented, amend
    sec 7 so a missing/mistyped/unmeasured cabinet stays non-fatal but
    is now reported (the old "no log noise" wording conflated "don't
    fail" with "don't speak"), and document the stick2 asymmetry as a
    known, deliberate limitation (button.* absent means unmeasured;
    stick2 absent means one stick).

    - syncretro_games.c: fix the button.* validator, which used
    strncmp()/strcmp() while every xpdev ini lookup matches keys
    case-insensitively (stricmp() in ini_file.c) -- a lower-case
    "button.y" was honoured by the reader and flagged as invalid by the
    validator in the same breath. Switch to strnicmp()/stricmp().
    test_games.c gains a case proving this and failing against the old
    comparison.

    - sr_games_load() now reports which of three states it found (a
    loaded section, no section, or no file) in one stderr line, so a
    missing file, a typo'd section name, and a genuinely unmeasured
    cabinet are no longer indistinguishable from each other or from
    success.

    - syncretro_lobby.js warns once if a dead names.json is still present
    next to games.ini, since only a sysop's hand-added titles silently
    vanish when it stops being read.

    - probe_core.c: -hold no longer sits behind the -coin guard, so it
    works standalone -- previously the only tool for measuring a
    games.ini entry silently did nothing without -coin.

    - Smaller fixes: syncretro_games.c's path buffer is PATH_MAX instead
    of a silently-truncating 512; main.c's stale sr_games_load() comment
    clause is trimmed; the syncretro .gitignore covers build-test/ and
    build-probe/; two untracked *.pre-syncarcade.bak files are removed;
    test_binds.c pins that every arcade button row's solo spelling
    agrees with the key that actually reaches it.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows@VERT to Git commit to main/sbbs/m on Tue Jul 28 17:21:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/05237f8fddd1f43142ca531b
    Modified Files:
    src/doors/syncretro/GAMES_INI.md M2_INPUT.md M3_MULTICORE.md README.md main.c syncretro.h syncretro_binds.c syncretro_input.c test_axis.c test_binds.c
    Log Message:
    syncretro: a second player at the same keyboard

    A cabinet's coin and start buttons are per-player inputs: MAME 2003-Plus
    reads coin n and n-player start off port n-1's SELECT and START. The
    arcade profile bound port 0 only (3a9fb3c143, 2026-07-21), so it could
    start one player and no more -- two coins and there was still no key that started a two-player game.

    Both ports are now bound, on the gamepad profile as well as the arcade
    one, and with the same keys: I J K L is player 2's stick, M , . / and
    U O his six buttons. On a cabinet 6 is his coin slot and 2 his start; on
    a console ; and ' are his Start and Select. The number row otherwise
    spells MAME's own convention -- 5 and 6 the coins, 1 and 2 the starts -- alongside the Bksp and Enter the help screen could already name.

    Player 1 keeps every key he had, the arrows included. Most cabinets
    alternate turns on one set of controls and read port 0 for both players,
    so those play exactly as they did whether one person or two are at the keyboard.

    That leaves the second stick of a twin-stick cabinet (da866ee25b,
    2026-07-24) sharing keys with player 2's first, so it moves from I / K to
    P / ; -- the far right, clear of the second panel.

    Pause moves from Space to Ctrl-P on every profile, and on a cabinet Space
    now fires button 1. MAME's default keyboard map makes Space player 1's
    button 3: a player reaching for it means to shoot, not to stop the game,
    and a bare key driving a door action is the one exception to this table's
    own rule that bare keys play the game and Ctrl keys drive the door. It
    was bound to pause when the table was written (d3024daa0a, 2026-07-09).
    Space stays unbound on the two cartridge profiles, where nothing on the
    console corresponds and an unbound key raises the key legend.

    The help screen is generated from the same table and so lists all of it.
    Player 2's buttons render as one row, trimmed on a labelled cabinet to
    the ids that cabinet uses: they are player 1's six ids under different
    keys, and twelve named button lines do not fit an 80x24 screen.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Tue Jul 28 21:54:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/536bb66ea22238ecc21cad86
    Modified Files:
    src/doors/syncretro/GAMES_INI.md M2_INPUT.md probe_core.c syncretro_games.c syncretro_games.h syncretro_input.c test_axis.c test_games.c xtrn/syncarcade/README.md games.ini
    Log Message:
    syncretro: a cabinet whose stick is a potentiometer

    Paperboy rides itself into the curb. With nobody at the keyboard the bike steers left and runs flat out, and it crashes about two seconds after the
    level starts.

    The door was answering correctly, which is what made this hard to see. Instrumenting MAME 2003-Plus at the revision the arcade install runs shows
    the driver receiving a dead-centred handlebar every frame -- both ADC
    channels at 0x80, the port's own declared middle, with no residual delta.
    The trap is that 0x80 is not where Paperboy's handlebars rest. Sweeping the converter and tracking the player sprite: below about 36% of travel the bike walks into the oncoming lane, above about 50% it walks the other way, and
    the speed axis saturates so early that 0x10, 0x40 and 0x80 are one value -- flat out. So a centred stick is a hard left turn with the throttle open, and every frontend produces one. Current MAME declares the same 0x80.

    games.ini gains analog_rest: where a cabinet's control sits when nobody is touching it, as a percentage of each axis's travel. The door answers the
    left analog stick with it, and drives the axis to its stop while a direction key is held -- a keyboard has no half-press, and the ends of the travel are where the bars physically go. Releasing returns to rest, which is what a
    sprung control does.

    There is no default and no root-level form. A rest position is a fact about
    one machine and a guessed one drives the game on its own, so a cabinet that declares nothing reads a centred stick, byte for byte what it read before.
    Of the romsets in the arcade install, Paperboy is the only one whose driver declares an analog joystick. A value that does not parse as two numbers is treated as absent rather than as zero: zero is a real setting, and quietly meaning it would reproduce the bug the key exists to fix.

    probe_core gains -analog, the analog counterpart of -hold, so the number is re-measurable rather than folklore. It only bounds the answer -- anywhere inside the band tracks straight -- and the shipped 45,57 was settled by
    playing it. The speed axis has no band at all and is anchored to the pace
    the game itself rides at during a level's scripted entry.

    test_games covers the parse, the clamp and the malformed-is-absent rule; test_axis drives the real input path end to end for the rest value, a held direction, the return to rest, the second player, and the cabinets that
    declare nothing and must still read a centred stick. GAMES_INI.md sec 15 carries the measurements and the method.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Tue Jul 28 21:54:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/92bc048a96c8570354505023
    Modified Files:
    src/doors/syncretro/GAMES_INI.md xtrn/syncarcade/games.ini
    Log Message:
    syncarcade: sort games.ini by romset, so a duplicate has nowhere to hide

    The file was grouped by hand at the top and grown by appending blocks to the bottom, which is how two sections naming no driver sat in it unnoticed -- burgtime fifteen lines from the btime it duplicated, millipedes nowhere near milliped.

    A duplicate section is worse than untidy: xpdev's reader answers out of the first one and never sees the second, so every key in the second is lost with
    no warning at all. Verified against the reader rather than assumed. Sorted,
    the pair is adjacent and a reviewer cannot miss it; unsorted, nothing short of a script finds it.

    Only the order changes. Every section's keys and values are byte-identical,
    and the handlebar note travels with the section it explains. The convention is recorded in the file's own header, where the next contributor appending a
    block will read it, and in GAMES_INI.md sec 4.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian L@VERT to Git commit to main/sbbs/m on Sun Aug 2 22:35:00 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/3f5480ed05a0a881fffad704
    Modified Files:
    src/doors/syncretro/GAMES_INI.md xtrn/syncarcade/syncretro.ini xtrn/syncivision/syncretro.ini xtrn/syncnes/syncretro.ini
    Log Message:
    Ship suspend/resume config for SyncRetro's three consoles

    Turns on the suspend/resume feature built in the earlier tasks of this
    plan, and documents the per-romset override.

    Two keys, deliberately kept separate:

    - [console] save_state is a capability claim -- this core and driver
    snapshot and restore reliably -- and is ours to make, not the
    sysop's. syncivision (FreeIntv) and syncnes (fceumm) each get
    `true`: one core, one driver, verified. syncarcade (MAME 2003-Plus)
    gets `false`: save-state support in that lineage is per-driver
    across roughly 5000 drivers, a partially-supporting driver restores
    a subtly broken machine that fails as a wrong-looking game rather
    than as an error, and nothing has been verified.

    - [state] auto_resume is the sysop's switch -- whether this install
    offers the feature at all -- and says nothing about any core. All
    three consoles ship it `true`.

    Collapsing these into one key would force a sysop who just doesn't
    want resume on their NES to write `save_state = false`, recording a
    false claim about fceumm that whoever reads or copies that file next
    inherits.

    GAMES_INI.md documents the matching per-romset `save_state` override
    in games.ini, and ties it to the existing sec 14 rule: a section in
    games.ini means someone here has actually run that cabinet, so a
    bulk verification tool run against games.ini only ever covers
    cabinets that have been played.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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