Files
psxrecomp/runtime/include/cdrom.h
T
Matthew Stanley aef852e11b SIO alias dispatch + instant disc speed + game miss collector
SIO handler alias (0x0CF0 → func_0000641C):
  Runtime capture showed BIOS installs lui+addiu+jalr to RAM 0x641C at 0x0CF0.
  New [[recompiler.bios_aliases]] TOML mechanism emits a one-liner wrapper and
  registers it in the dispatch table. Eliminates 30K dirty_ram blocks/session.

Instant disc speed (disc_speed = "instant" in game.toml [runtime]):
  cdrom_set_speed(0) collapses all seek/read delays to 1 cycle. Correct INT
  sequence still fires; no artificial wait. "2x" and "4x" divisors available.
  Default remains authentic 1x. Tomba set to instant.

Persistent game miss collector (tools/collect_game_misses.py):
  Appends newly-seen dirty_ram dispatch misses in the game text range to a
  file (TombaRecomp/seeds/dirty_ram_misses.txt) for later seeding.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-29 23:42:16 -07:00

105 lines
2.4 KiB
C

#ifndef PSXRECOMP_CDROM_H
#define PSXRECOMP_CDROM_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void cdrom_init(const char* cue_path);
/* Set disc speed multiplier. divisor=0 → instant (all delays collapse to
* 1 cycle, correct INT sequence fires as fast as host can process).
* divisor=1 → authentic 1x. divisor=2 → 2x. Call before first cdrom_tick. */
void cdrom_set_speed(int divisor);
/* MMIO read/write (0x1F801800-0x1F801803) */
uint32_t cdrom_read(uint32_t addr);
void cdrom_write(uint32_t addr, uint32_t value);
/* Advance CD-ROM state machine by guest CPU cycles. Sets i_stat IRQ_CDROM
* when a command completes or data is ready. */
void cdrom_advance(uint32_t cycles);
/* Legacy frame-paced entry point for interpreter/oracle builds. */
void cdrom_tick(void);
/* DMA channel 3 interface */
uint32_t cdrom_dma_read(void);
int cdrom_dma_ready(void);
typedef struct CDROMDebugState {
uint64_t seq;
uint8_t index_reg;
uint8_t stat_reg;
uint8_t irq_enable;
uint8_t irq_flag;
uint8_t mode_reg;
uint8_t seek_min;
uint8_t seek_sec;
uint8_t seek_sect;
uint8_t pending_cmd;
int has_disc;
int param_count;
int response_read;
int response_count;
int sector_read_pos;
int sector_available;
int sector_size;
int reading;
int read_min;
int read_sec;
int read_sect;
uint8_t read_cmd;
uint8_t filter_file;
uint8_t filter_channel;
uint8_t muted;
int read_delay;
int pending_pending;
int pending_delay;
int pending_phase;
uint32_t i_stat;
} CDROMDebugState;
typedef struct CDROMTraceEntry {
uint64_t seq;
uint32_t addr;
uint32_t val;
uint32_t func;
uint32_t pc;
uint32_t frame;
uint32_t i_stat;
uint8_t kind;
uint8_t width;
uint8_t index_reg;
uint8_t stat_reg;
uint8_t irq_enable;
uint8_t irq_flag;
uint8_t param_count;
uint8_t response_read;
uint8_t response_count;
uint8_t sector_available;
uint8_t mode_reg;
uint8_t pending_cmd;
uint8_t pending_pending;
uint8_t reading;
uint8_t read_cmd;
int sector_read_pos;
int sector_size;
int pending_delay;
int read_delay;
} CDROMTraceEntry;
#define CDROM_TRACE_CAP (1 << 16)
void cdrom_debug_snapshot(CDROMDebugState* out);
uint64_t cdrom_debug_get_trace(const CDROMTraceEntry** out_entries);
void cdrom_debug_clear_trace(void);
#ifdef __cplusplus
}
#endif
#endif /* PSXRECOMP_CDROM_H */