From 9a8149a841ed8ae6a29d291ea46b3f1dc91102ae Mon Sep 17 00:00:00 2001 From: Gabriel Scarcella Date: Sat, 24 Oct 2026 23:24:34 -0300 Subject: [PATCH] CHANGELOG.md: every release from the tags' notes, out of the README; v0.3.17's entry The README's status listed each release inline and stopped at v0.3.16; the list now lives in CHANGELOG.md, newest first, written from the tag messages (v0.1.0-rc.1 to v0.3.16) with v0.3.17's entry for the docs work. The README points at it and pins v0.3.17; CONTRIBUTING.md and CLAUDE.md say a release adds its entry and a GitHub release. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 1 + CONTRIBUTING.md | 3 +- README.md | 28 ++--------- 4 files changed, 138 insertions(+), 24 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..75ccd51 --- /dev/null +++ b/CHANGELOG.md @@ -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). diff --git a/CLAUDE.md b/CLAUDE.md index b342f7c..7591be6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e0ab2b..eccbb94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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`). diff --git a/README.md b/README.md index ebca364..7f1a3e5 100644 --- a/README.md +++ b/README.md @@ -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 @@ -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 @@ -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 | @@ -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