Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Changelog

Every release of psxstack, newest first. Releases are semver tags (`vMAJOR.MINOR.PATCH`); a game pins one, and
`PSXSTACK_API` (`include/psxstack/game.h`) counts incompatible contract changes (docs/GAME_CONTRACT.md
"Compatibility and versions"). Issue and pull request numbers are this repository's.

## v0.3.17 (2026-10-24)
- **Docs:** the README leads with the features, then using the stack from a game and developing it (#107);
`CONTRIBUTING.md`, the ground rules, the gates and the pull request steps; this changelog, out of the README.
- **Repository:** `.github/CODEOWNERS`; CI skips a change to it alone, as it does for Markdown and `LICENSE`.

## v0.3.16 (2026-10-24)
- **Video:** the picture fits the screen: `video.scaling`, `fit` by default, `integer` or `stretch`, the Scaling row
in Settings and the in-game menu (#106).
- **Widescreen:** the canvas is at the window's aspect up to 16:9 (16:10 on a Steam Deck), in whole columns rounded
down (426 at 16:9).

## v0.3.15 (2026-10-24)
- **Input:** a second pad on port 1: `input.player2`, the Controls screen's Player 2, `pad2` and `port` for scripts,
the debug channel and the MCP server (#101, #104).
- **In-game menu:** its picture on the hardware renderer; unmuting a game started muted opens the audio device (#74,
#105).

## v0.3.14 (2026-10-21)
- **Launcher:** the self-test finds its own process under the name the system lists (`AppRun` inside an AppImage)
(#100).

## v0.3.13 (2026-10-21)
- **Launcher:** Add to Steam, Remove from Steam and Update shortcut in Settings (`launcher.steam`), with the optional
Steam artwork from game.json's `launcher.steam_art` (#93).

## v0.3.12 (2026-10-21)
- **In-game menu:** fitted to the launcher's canvas, its Menu size (`video.menu_size`), a Mods page that fits
640x480.

## v0.3.11 (2026-10-21)
- **Launcher:** the update check against the game's GitHub releases and the self-update (`launcher.updates` in
game.json, curl as a process, the AppImage and Windows swap), Update now, `--no-update-check`.

## v0.3.10 (2026-10-21)
- **Mods:** the `stop` callback and `applies` in force, for the in-game menu's live switch.

## v0.3.9 (2026-10-21)
- **In-game menu:** the launcher's Settings, Controls and Mods inside the game's window on Escape or Back+Start,
applied live (`PSXSTACK_MENU`).

## v0.3.8 (2026-10-21)
- **Mods:** `fast_loading` ("Faster loading"), a second stack mod beside `fast_forward`: 2x, 4x (the default), 8x or
instant for the CD's data reads (ReadN/ReadS and CdRead without the XA bit), their seeks divided as much.
- **LIBCD:** the movie stream and the reads with the XA bit keep the realistic drive, under `--cd-speed instant` too,
so a movie's video and XA audio play at the drive's rate (before, instant ran the video at the decoder's speed and
overflowed the XA FIFO).
- The shim's `psyq_cd_set_data_speed`, the runtime's `port_disc_fast_loading`. `PSXSTACK_API` stays 1.

## v0.3.7 (2026-10-21)
- **Save states:** quick save and load hotkeys: `input.hotkeys.save_state` (F5) writes the whole game to the quick
slot at the vsync's end, `load_state` (F9) resumes it (a paused game is paused again there); the slot is
`--quick-state FILE`, default `quick.state` beside the settings file; `--input-test` ends with the slot's round
trips (#72).

## v0.3.6 (2026-10-09)
- **Scripts:** a `write_mem` step on both runners (a PS1 address, 1, 2 or 4 bytes with an optional mask, or up to 256
bytes), resolved through the adapter's state map first, then the arena, as `peek_ps1`/`poke_ps1` now are too (#67,
#70).
- **Fibers:** a slot's stack is unpoisoned for ASan before its next fiber starts there; a destroyed fiber's redzones
were still poisoned (#68, #69).

## v0.3.5 (2026-10-09)
- **Game description:** the optional `disc_required`: without a disc the port says so and exits 64 instead of running
the game on reads that find no data; `--input-test` still runs, without `game_main` (#64, #65).

## v0.3.4 (2026-10-08)
- **Launcher:** the self-test compares the refresh fallback with the game's rate, not 50; `--fps`'s help names the
game's rate (#57, #58).
- **Shim:** `psyq/README.md` lists the two GPU differences against PCSX-Redux the second game found as known emulator
categories; `gpu.c` is unchanged (#54, #56).

## v0.3.3 (2026-10-08)
- **LIBC2:** `rand`/`srand` are the shim's (the PS1's generator, state 0 at start, renamed through `psyq_names.h`),
held in save states and cleared by the reset; `port_rand_seed()` for a game's random-index probe (#40, #52).
- **Timing:** the CD and XA rates follow the description's `video.rate`; `--refresh` overrides (#40).
- **Replay runners:** `port_test.py --sanitize` sets `detect_stack_use_after_return=0` (#51); every run gets its own
`--crash-dir` (#47).

## v0.3.2 (2026-10-08)
- **Scripts:** a checkpoint may say `"image": false`: neither runner dumps or hashes the checkpoint image there, the
record carries the flag, and a script/record disagreement is reported (#49).

## v0.3.1 (2026-10-08)
The second game's shim and build fixes.
- **Build:** the units' include order is the probe's and `include/psxstack` is off their path (#35, #36).
- **LIBGTE and LIBGPU:** 51 functions the second game calls (#37) and eight function forms (#45).
- **LIBAPI, LIBCARD, LIBCD, LIBSND, LIBSPU:** events and root counters, the BIOS file calls and LIBCARD over the card
images, LIBCD's file search and reads, LIBSND's SEQ API, LIBSPU (#38); every game unit is compiled with
`psyq_names.h` forced in, renaming the Psy-Q names that are also the host's (#44).
- **LIBGS:** 20 functions and the `GsTMDfast*` handlers; a mapped TMD keeps offsets on the host (#41).
- **Tests:** `tests/psyq_test.py` and `tests/shim_test.py`; `examples/tasks` preempts through the vblank event.

## v0.3.0 (2026-10-08)
The contract grows for a second game, `PSXSTACK_API` unchanged.
- **Memory:** `memory.heap` is optional: a game may keep its heap as its own data (#26, #29); the GTE override is
written at the game's header's path, the inventory takes a Psy-Q library map, `psyq/check.sh` takes its paths
(#28).
- **Psy-Q declarations:** the stack owns them (`include/psxstack/psyq/`) and the shim compiles against them; the
`decls` command checks a game's prototypes against them; the runtime and the shim no longer see a game's include
directories (#7, #31).
- **Fibers:** a game's own tasks on host stacks of the runtime's, deterministic preemption at the tick's end, save
states holding every fiber (#25, #32; `examples/tasks`).
- **Replay runners:** they live in the stack (`tools/replay/`: the emulator driver, the step engine, the boot check,
the port's replay test, the emulator installer); a game keeps its probes and its pins (#27, #30).

## v0.2.1 (2026-10-08)
- **Fixed:** `runtime/mods_data.c` bounds a mod's id in the settings paths (`%.63s`), so Ubuntu 24.04's gcc 13
Release build no longer fails on `-Werror=format-truncation` (#24).

## v0.2.0 (2026-10-08)
The hardware renderer's follow-ups.
- **Rendering:** Direct3D 12 on Windows (DXIL shaders), sub-pixel precision (`video.subpixel`, the perspective
option), the present filters (`video.filter`: sharp, scanlines, smooth; `video.crt`), the wide canvas
(widescreen).
- **Textures:** replacement: the dump mode, texture packs, the launcher's mods.
- **Save states:** `--save-state`, `--load-state`.

## v0.1.0 (2026-10-07)
The first release the Digimon World 2003 port builds on: the host runtime, the Psy-Q shim, the launcher, the game
description and its generator, `psxstack_add_game()`, the hello example, the tools (`port_gen`, `port_inventory`, the
MCP server) and the docs, consumed by dw2003recomp as a pinned submodule.

## v0.1.0-rc.1 (2026-10-07)
The runtime, the Psy-Q shim, the launcher and the build, as extracted from dw2003recomp (phases 0 to 3).
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ own `CLAUDE.md`; dw2003recomp's `port/CMakeLists.txt` is the reference consumer.
- Commit messages say what and why in plain words; a pull request's description lists the gates that ran.

## Docs
`CHANGELOG.md` every release, newest first (a release adds its entry and a GitHub release with the same notes) ·
`docs/GAME_CONTRACT.md` what a game provides and what the stack provides · `docs/PORT.md` the runtime's design (hook
macros, arena, overlays, pump, shim, rendering, sound, crash report) · `docs/RUNTIME.md` building, running, options and
formats · `docs/LAUNCHER.md` the launcher/game contract, the settings file, mod manifests · `docs/DECISIONS.md` the
Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ Commit messages say what and why in plain words. One topic per commit.

## Releases
Releases are semver tags (`vMAJOR.MINOR.PATCH`), cut by the owner. A game pins a tag, so a change here reaches it as
a reviewable pin bump (docs/GAME_CONTRACT.md "Compatibility and versions").
a reviewable pin bump (docs/GAME_CONTRACT.md "Compatibility and versions"). Each release has an entry in
`CHANGELOG.md`, newest first, and a GitHub release with the same notes.

## License
By contributing you agree that your contribution is licensed under the MIT license (`LICENSE`).
28 changes: 5 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ A matching decompilation whose C also compiles for a 64-bit host, plus a small a
The stack is a git submodule pinned at a release tag:
```sh
git submodule add https://github.com/gascarcella/psxstack psxstack
git -C psxstack checkout v0.3.16
git -C psxstack checkout v0.3.17
```

### Building the port
Expand All @@ -129,6 +129,7 @@ cmake --build build/launcher
Releases are semver tags; a game pins one, so a change here reaches it as a reviewable pin bump. `PSXSTACK_API`
(`include/psxstack/game.h`) counts incompatible contract changes. A game's release packages are named so the
launcher's update check finds them (docs/GAME_CONTRACT.md "Compatibility and versions", "Releases").
[`CHANGELOG.md`](CHANGELOG.md) lists what each release changed.

## Developing

Expand Down Expand Up @@ -184,6 +185,7 @@ game's disc).
### Docs
| Doc | What it covers |
|---|---|
| `CHANGELOG.md` | Every release and what it changed |
| `docs/GAME_CONTRACT.md` | What a game provides and what the stack provides |
| `docs/PORT.md` | The runtime's design: hook macros, arena, overlays, pump, shim, rendering, sound, crash report |
| `docs/RUNTIME.md` | Building, running, options and formats |
Expand All @@ -201,28 +203,8 @@ the contract first), the gates a change runs and how a pull request is made. Pro
## Background

### Status
**`v0.3.16`.** One game builds on it so far; the second will widen the shim and the contract. The recent releases:
- **v0.3.16:** the picture fits the screen (`video.scaling`, fit by default), the wide canvas at the window's aspect.
- **v0.3.15:** the in-game menu on the hardware renderer; unmuting a game started muted opens the audio device.
- **v0.3.14:** the launcher's self-test inside an AppImage.
- **v0.3.13:** Add to Steam (`launcher.steam`, the optional artwork `launcher.steam_art`).
- **v0.3.12:** the in-game menu fitted to the screen, its Menu size, a Mods page that fits 640x480.
- **v0.3.11:** the launcher checks the game's GitHub releases and updates itself (`launcher.updates`, Update now,
`--no-update-check`).
- **v0.3.10:** the mods' `stop` callback and `applies`, for the in-game menu's live switch.
- **v0.3.9:** the in-game menu: the launcher's Settings, Controls and Mods inside the game's window, applied live
(`PSXSTACK_MENU`).
- **v0.3.8:** faster loading: the `fast_loading` mod, movies at the drive's rate.
- **v0.3.7:** quick save and load hotkeys, F5/F9.
- **v0.3.6:** a `write_mem` script step, a clean fiber stack under ASan.
- **v0.3.5:** a game that needs its disc says so in game.json.
- **v0.3.4:** the launcher self-test's rate, the GPU's known differences.
- **v0.3.3:** LIBC2's rand and the nominal rates.
- **v0.3.2:** a checkpoint without an image.
- **v0.3.1:** the second game's shim: LIBGTE, LIBGPU, LIBGS, LIBAPI, LIBCD, LIBSND, LIBCARD.
- **v0.3.0:** an optional heap, the stack's own Psy-Q declarations, fibers for a game's tasks, the replay runners.
- **v0.2.0:** the hardware renderer on D3D12, sub-pixel precision, filters, texture packs, a wide canvas and save
states.
**`v0.3.17`.** One game builds on it so far; the second will widen the shim and the contract. Every release and what
it brought is in [`CHANGELOG.md`](CHANGELOG.md).

### How it got here
It grew out of the [Digimon World 2003 decompilation](https://github.com/gascarcella/dw2003recomp)'s `port/` and
Expand Down