Skip to content

PlayStation

codingncaffeine edited this page Jun 6, 2026 · 1 revision

PlayStation 1

Default Core: Beetle PSX HW

Emutastic ships Beetle PSX HW (mednafen_psx_hw_libretro.so) as the default PS1 core. It's the hardware-accelerated sibling of the original Mednafen PSX (Beetle), built on the same accuracy foundation but with an OpenGL renderer that unlocks features the software core can't deliver:

  • Internal-resolution upscaling (1× through 8×)
  • PGXP — eliminates polygon jitter and texture warping (the canonical Crash Bandicoot / FF7-9 fix)
  • Dithering control (off / 1×-only / always)
  • MSAA anti-aliasing
  • Texture filtering (bilinear, xBR, SABR)
  • Widescreen hacks (compatible games only)

Save states round-trip across app launches reliably — no SINGLE_SESSION quirk like the Kronos Saturn issue.

Renderer Backend

Beetle PSX HW supports two render backends — OpenGL and Vulkan. Emutastic uses OpenGL (hardware_gl). On Linux the GL renderer runs in the --game-host process: the core renders into an FBO via a GL context, the frontend reads back through a never-blocking 4-slot PBO ring, and the frame presents on the native Wayland toplevel (X11/SDL fallback). Don't switch to hardware_vk in the core options — Vulkan support for this core isn't wired up on Linux and produces a white screen.

Default Look = Native PSX

Out of the box Emutastic configures only the renderer = hardware_gl option. Everything else stays at the core's defaults: 1× internal resolution, PGXP off, no dithering changes. This matches what real PS1 hardware looks like — pixelated, slightly warpy polygons, dithered transparencies.

If you want the upscaled-PSX look, change these in Preferences → Cores → Mednafen PSX HW Options (or per-game via the in-game menu):

Option Native Upscaled (suggested)
beetle_psx_hw_internal_gpu_resolution 1x(native) 4x (sweet spot) or 8x
beetle_psx_hw_pgxp_mode disabled memory only
beetle_psx_hw_pgxp_vertex_cache disabled enabled
beetle_psx_hw_filter nearest SABR or xBR
beetle_psx_hw_msaa 1x(default) 4x

8× internal resolution is GPU-heavy for marginal visual gain over 4× on most titles. Crash 2/3, FF7-9 field maps, and SOTN's room transitions are the canonical "PGXP transforms the look" demos.

Alternative

If you prefer pixel-accurate native rendering or hit a HW-renderer edge case, Emutastic also ships Beetle PSX (software)mednafen_psx_libretro.so. Same accuracy as HW, native-resolution only, no PGXP. Switch via Preferences → Cores → PS1, or per-game using the Cores override.

BIOS Files

Same BIOS for every PS1 core — Emutastic's BIOS resolver finds the matching one:

  • scph5500.bin — NTSC-J
  • scph5501.bin — NTSC-U
  • scph5502.bin — PAL

Region detection comes from the No-Intro filename suffix ((USA), (Japan), (Europe), etc.) — the right BIOS is selected per game without manual configuration.

Save State Compatibility Across Cores

Save states are not portable between cores. A state saved on Beetle PSX HW cannot be loaded on Beetle PSX (software) and vice versa — the snapshot format is core-specific. If you switch the PS1 core for a game your existing states for that game become unreadable from the new core (the files stay on disk; clicking them shows "Failed to load").

Controllers

DualShock (Default)

Emutastic sets the PS1 controller type to DualShock (RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 1) = device 517) via retro_set_controller_port_device. This gives both d-pad and analog stick input out of the box.

The core option beetle_psx_hw_analog_toggle controls the emulated DualShock's analog LED behavior:

Value Behavior
disabled (default) Locked in analog mode — sticks always active, no toggle combo
enabled Toggle combo available, starts in digital mode (sticks off)
enabled-analog Toggle combo available, starts in analog mode (sticks on)

The default (disabled) is the right choice for most users — analog sticks just work. The toggle combo (L1+L2+R1+R2+Select+Start, held ~1 second) is only relevant when enabled or enabled-analog is set, for the rare pre-1997 title that rejects analog-mode controllers entirely.

Digital Controller (Fallback)

If a title doesn't respond to input with DualShock active, switch the controller type to PlayStation Controller in the per-game core preferences. This emulates the original SCPH-1080 digital pad (d-pad only, no sticks). Pre-1997 titles that only understand the 0x41 SIO protocol may need this.

Implementation Notes

A few things that tripped us up and may help other frontend developers:

  • Device type 517 is only for retro_set_controller_port_device. The core polls input via input_state_cb using base types: RETRO_DEVICE_JOYPAD (1) for buttons, RETRO_DEVICE_ANALOG (5) for stick axes. Never 517.
  • Save state loads reset controller ports. After retro_unserialize, the core rebuilds its internal device pointers. You must re-call retro_set_controller_port_device with the correct type post-unserialize, or input reverts to the default digital pad.
  • Analog axis range is -32767 to +32767. SDL3 gamepad can produce -32768 at full deflection on some axes. Passing -32768 to the core causes the PS1's 0-255 analog mapping to underflow and wrap to the opposite direction. Clamp to -32767.
  • Compose the analog stick from per-direction bindings. The stick is built by combining the per-direction (plus/minus) bindings rather than trusting a raw SDL axis sign — this is the convention RetroArch and DuckStation follow and is what makes PS1 analog input correct on Linux.
  • software_fb should stay enabled (core default). Disabling it (beetle_psx_hw_renderer_software_fb = disabled) breaks framebuffer effects — ground textures, pause menu backgrounds, and screen transitions in titles that read/write the PS1 framebuffer directly.

Multi-Disc Games

Drop a folder of (Disc 1).cue / (Disc 2).cue / ... and Emutastic auto-bundles them into a single .m3u library entry. In-game disk swap defaults to L3 + Start. See Disk Swapping for the full per-console behavior — Beetle PSX HW (and SW) both correctly handle the deferred-insert timing required for the CD audio engine to spin down between discs.

Clone this wiki locally