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
13 changes: 8 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.14.0] "Foundry" - 2026-07-12

Tenth release of the RustyNES-parity roadmap: Mobile Phase 1, the UniFFI bridge foundations.

### Added

- **New crate `rustysnes-mobile`** (`v1.14.0 "Foundry"`, Mobile Phase 1): a `UniFFI` bridge
- **New crate `rustysnes-mobile`** (Mobile Phase 1): a `UniFFI` bridge
generating Kotlin (Android) and Swift (iOS) bindings over `rustysnes_core::facade::EmuCore` —
the same facade the desktop frontend and `rustysnes-libretro` already drive the emulator
through. MVP surface: ROM load/close, `run_frame`, the peripheral setters (Gamepad/Mouse/Super
Scope/Multitap), framebuffer + per-frame audio access, save/load state, reset/power-cycle.
Verified for
real: a genuine `cargo ndk` cross-compile to `arm64-v8a` produced an actual ARM64 `.so`
(confirmed via `file`), and `uniffi-bindgen` generated real, correctly-shaped Kotlin and Swift
bindings from the compiled library.
Verified for real: a genuine `cargo ndk` cross-compile to `arm64-v8a` produced an actual ARM64
`.so` (confirmed via `file`), and `uniffi-bindgen` generated real, correctly-shaped Kotlin and
Swift bindings from the compiled library.
- **`no_std` CI gate expanded to a per-crate matrix**: `rustysnes-{cpu,ppu,apu,cart,core}` each
now build standalone against `thumbv7em-none-eabihf --no-default-features`, replacing the prior
single aggregate-only `rustysnes-core` build.
Expand Down
28 changes: 14 additions & 14 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ members = [
]

[workspace.package]
version = "1.13.0"
version = "1.14.0"
edition = "2024"
rust-version = "1.96"
license = "MIT OR Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-apu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-apu"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cart/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cart"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cheevos/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-cheevos"
description = "Native-only RetroAchievements (rcheevos) FFI wrapper for RustySNES"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-core"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cpu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cpu"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-frontend/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-frontend"
description = "RustySNES: cross-platform SNES emulator binary (winit + wgpu + cpal + egui)"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-gfx-shaders/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-gfx-shaders"
description = "RustySNES: shared WGSL presentation-shader sources (blit + post-filters)"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-mobile/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-mobile"
description = "RustySNES: UniFFI mobile bridge (Kotlin/Swift bindings over the emulation core)"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-netplay/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-netplay"
description = "RustySNES: GGPO-style rollback netplay (UDP native, WebRTC browser)"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-ppu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-ppu"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-savestate/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-savestate"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-script/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-script"
description = "RustySNES: sandboxed Lua 5.4 scripting (memory read/write + a per-frame callback)"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-test-harness/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-test-harness"
version = "1.13.0"
version = "1.14.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
11 changes: 7 additions & 4 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
This file is authoritative for per-suite pass counts, the board / coprocessor matrix, and
version policy. Everything else defers to it.

**Current release:** `v1.13.0 "Vantage"` (`v0.1.0 "Foundation"`,
**Current release:** `v1.14.0 "Foundry"` (`v0.1.0 "Foundation"`,
`v0.2.0 "Persistence"`, `v0.3.0 "Continuum"`, `v0.4.0 "Completion"`, `v0.5.0 "Fidelity"`,
`v0.6.0 "Shippable"`, `v0.7.0 "Resolution"`, `v0.8.0 "Community"`, `v0.9.0 "Threshold"`,
`v1.0.0 "Zenith"`, `v1.0.1 "Aftertouch"`, `v1.1.0 "Latchkey"`, `v1.2.0 "Phosphor"`,
`v1.3.0 "Palimpsest"`, and `v1.4.0 "Convergence"` precede it; see `to-dos/VERSION-PLAN.md` for the
full ladder). **`v1.5.0`-`v1.13.0`** are the opening rungs of the RustyNES-parity ladder — a CI
full ladder). **`v1.5.0`-`v1.14.0`** are the opening rungs of the RustyNES-parity ladder — a CI
safety net (`v1.5.0 "Bedrock"`), a MkDocs documentation site + PWA + accuracy ledger
(`v1.6.0 "Lighthouse"`), the debugger extracted into its own module plus a hex Memory panel
(`v1.7.0 "Telemetry"`, `v1.7.1` patch), a Memory Compare panel + in-app Docs panel
Expand All @@ -17,9 +17,12 @@ safety net (`v1.5.0 "Bedrock"`), a MkDocs documentation site + PWA + accuracy le
time (`v1.10.0 "Atelier"`), fixing RetroAchievements to actually load a game for the first
time (`v1.11.0 "Podium"`), adding a third presentation post-filter (`PostFilter::Xbrz`) plus
extracting the WGSL shader sources into a new `rustysnes-gfx-shaders` crate for reuse by the
planned mobile bridge (`v1.12.0 "Refraction"`), and adding two accessibility theme variants
mobile bridge (`v1.12.0 "Refraction"`), adding two accessibility theme variants
(`AppTheme::HighContrast`/`Colorblind`) while honestly re-scoping the other two originally-planned
items (`v1.13.0 "Vantage"`) — all frontend/tooling/CI work with **zero
items (`v1.13.0 "Vantage"`), and — reversing `v1.0.0`'s "no mobile appetite" default — a new
`rustysnes-mobile` `UniFFI` bridge crate over `EmuCore`, real-verified via a `cargo ndk` ARM64
cross-compile and inspected Kotlin/Swift binding output, plus the `no_std` CI gate expanded to a
per-crate matrix (`v1.14.0 "Foundry"`) — all frontend/tooling/CI work with **zero
change** to the accuracy dashboard, per-suite pass counts, or coprocessor tier matrix below,
which stayed byte-identical throughout; see `CHANGELOG.md` for full per-release detail. `v1.0.0`
closes the production-cut
Expand Down
8 changes: 4 additions & 4 deletions to-dos/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -344,10 +344,10 @@ under `v1.0.0`) and the netplay save-state-cost pre-work.
a save-state migration fixture and a keyboard-nav audit, were investigated and found to already
be a verified-non-issue and a manual-walkthrough task respectively, not code fixes — both
honestly re-scoped rather than force-fit), then the mobile track's bridge foundations
(`v1.14.0 "Foundry"` — new `rustysnes-mobile` `UniFFI` crate over the same `EmuCore` facade the
desktop frontend uses; verified for real with a genuine `cargo ndk` ARM64 cross-compile and
inspected Kotlin/Swift binding output, not just claimed; the mobile/Android+iOS "no appetite"
default from `v1.0.0` is formally reversed, `docs/adr/0012`) — with
(`v1.14.0 "Foundry"`, **RELEASED 2026-07-12** — new `rustysnes-mobile` `UniFFI` crate over the
same `EmuCore` facade the desktop frontend uses; verified for real with a genuine `cargo ndk`
ARM64 cross-compile and inspected Kotlin/Swift binding output, not just claimed; the mobile/
Android+iOS "no appetite" default from `v1.0.0` is formally reversed, `docs/adr/0012`) — with
the rest of the mobile track — Android + iOS apps plus dormant monetization scaffolding
(`v1.15.0`-`v1.18.0`) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in lockstep against
RustyNES's own continuing development via `to-dos/LOCKSTEP-CHECKLIST.md`, not a frozen
Expand Down
6 changes: 2 additions & 4 deletions to-dos/VERSION-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1162,11 +1162,9 @@ into a hollow "audit passed" claim. See `docs/frontend.md` for the full explanat
rationale; stands up `docs/mobile-readiness.md`; a new ADR records the mobile-platform-target
decision, citing that `docs/adr/0002`'s gate is already closed favorably.

### `v1.14.0 "Foundry"` — Mobile Phase 1: bridge foundations
### `v1.14.0 "Foundry"` — Mobile Phase 1: bridge foundations — **RELEASED 2026-07-12**

Implemented (this PR; the version bump + "RELEASED" marker land in the separate
`chore(release)` closeout PR, matching every prior rung's two-PR pattern): new crate
`rustysnes-mobile`, a `UniFFI` bridge over `rustysnes_core::facade::EmuCore`
Delivered: new crate `rustysnes-mobile`, a `UniFFI` bridge over `rustysnes_core::facade::EmuCore`
(the same `std`-only facade the desktop frontend and `rustysnes-libretro` already drive the
emulator through — `Board: Send` since `v1.0.0` and the chip-stack crates' `#![no_std]`+`alloc`
posture were both already proven, not new work here). MVP surface: ROM load/close, `run_frame`,
Expand Down
Loading