mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
mods: let games expose loading speed as a free integer, plus disabled_by
Players asked for CD speeds beyond the curated 2x/4x list and for the two loading accelerators to stop being one control (GH TombaRecomp#5: a speedrunner wants shorter loads but NOT the host speed-up, which runs past the loading screen and breaks a skip). Three changes, all general: - psx_mod_set_disc_speed accepted only divisor 2 or 4. That was policy, not safety: cdrom.c divides the sector delay and floors the result at CDROM_MIN_DELAY, and apply_speed leaves XA streaming at authentic timing, so no positive divisor can produce a zero-delay storm or pitch-shift FMV audio. Accept 1..PSX_MOD_DISC_SPEED_MAX and let the mod's description carry the risk warning. - psx_mod_set_load_acceleration accepted 2..16. Host pacing cannot desync the guest at all (every frame, CD deadline, interrupt and callback still happens), so the ceiling was arbitrary. Accept 1..PSX_MOD_LOAD_ACCEL_MAX, with 1 meaning authentic and 0 still meaning uncapped. - New option key disabled_by: an option names a BOOLEAN sibling that overrides it, so "tick Instant and the speed box stops mattering" needs no second widget type. The parser rejects a dangling, self-referential or non-boolean reference rather than leaving a control silently always enabled, and the provider resolves the link against the live selection so the launcher and the plugins can never disagree about whether a control counts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -123,10 +123,20 @@ enum {
|
||||
int psx_mod_set_frame_interpolation_blend(uint32_t blend_mode);
|
||||
int psx_mod_set_auto_skip_fmv(int enabled);
|
||||
|
||||
/*
|
||||
* Upper bounds for the two loading-speed knobs below. Both are generous on
|
||||
* purpose: games surface them to players as free-form integers, and neither
|
||||
* can corrupt guest state (see the notes on each setter). They exist to reject
|
||||
* nonsense, not to curate a list of "blessed" speeds.
|
||||
*/
|
||||
#define PSX_MOD_LOAD_ACCEL_MAX 1024u
|
||||
#define PSX_MOD_DISC_SPEED_MAX 1024u
|
||||
|
||||
/*
|
||||
* Accelerate only the wall-clock pacing of sustained non-XA data loads while
|
||||
* preserving every guest VBlank, CD deadline, interrupt, and callback.
|
||||
* wall_clock_multiplier accepts 2..16, or zero for uncapped host speed.
|
||||
* wall_clock_multiplier accepts 1..PSX_MOD_LOAD_ACCEL_MAX, or zero for
|
||||
* uncapped host speed (1 is a no-op, i.e. authentic pacing).
|
||||
* release_frames controls how many guest frames acceleration may remain active
|
||||
* after the load predicate clears; zero is the precise/speedrun-safe policy.
|
||||
*/
|
||||
@@ -134,10 +144,15 @@ int psx_mod_set_load_acceleration(uint32_t wall_clock_multiplier,
|
||||
uint32_t release_frames);
|
||||
|
||||
/*
|
||||
* Select guest-visible CD timing for a game-owned loading feature. divisor is
|
||||
* 2 or 4, or zero for the bounded "instant" scheduler; instant_max_per_frame
|
||||
* is used only with divisor zero. Unlike host load acceleration, this changes
|
||||
* when the emulated game receives CD interrupts and can expose timing bugs.
|
||||
* Select guest-visible CD timing for a game-owned loading feature. divisor
|
||||
* divides the emulated sector delay, so it IS the speed multiplier: 1 is
|
||||
* authentic timing, higher is faster, up to PSX_MOD_DISC_SPEED_MAX. Zero
|
||||
* selects the bounded "instant" scheduler, and instant_max_per_frame (1..256)
|
||||
* applies only in that case. cdrom.c floors the divided delay at
|
||||
* CDROM_MIN_DELAY and leaves XA streaming at authentic timing, so no value
|
||||
* here can produce a zero-delay storm or speed up FMV audio. Unlike host load
|
||||
* acceleration this changes WHEN the guest receives CD interrupts and can
|
||||
* expose game timing bugs, which is why it is a separate, opt-in knob.
|
||||
*/
|
||||
int psx_mod_set_disc_speed(uint32_t divisor,
|
||||
uint32_t instant_max_per_frame);
|
||||
|
||||
Reference in New Issue
Block a user