We started South Park from Banjo’s portable ExEn core. Its game logic immediately found more to ask for: complete short arrays, real resource reads and a service result we couldn’t leave null.SP01SP02

Half a short is not enough.

The old storage model kept only a byte where a signed sixteen-bit array element belonged. South Park packed velocity across those bits. Losing the high byte left movement at zero. Preserving the full short, with the right sign extension, repaired what otherwise looked like a game that would not move.SP02

Resource array reads also had to retain every element beyond the inline slots. Sms.getPrice needed to return an actual VM string from the original tariff data; the unimplemented null result caused a later operand-stack crash. Offline sending still returned failure. Fixing a price query was not pretending a dead SMS service had answered.SP02

Kenny Cow Dodge in the original South Park game
Historical host capture

Original Kenny Cow Dodge, 132×176, retained from historical host execution.

Open the image for the full original view.

SP90

Thirteen little control schemes.

I had thirteen original minigames here, and one generic action layout wasn’t going to explain them. Cow Dodge needed up and down. Gnomes added a kick. The rhythm games used left, middle and right, while Catapult wanted nine numbered windows. We needed to follow the episode I was actually playing.SP04

A read-only observer followed the original scene and selected episode. Changing the overlay could then release touch roles safely while retaining physical ownership, and keep the same game viewport in place. The episode-entry checks cover all thirteen, without turning entry into a claim of completing them all.SP05SP08

An empty audio buffer can be healthy.

Later silent-audio work found a player waiting for the wrong state. A static AudioTrack starts without data. The bridge rejected that state before writing the PCM that would make the track ready. The original melody never got as far as playback.SP03

Writing the original samples before requiring loaded readiness connected the VM’s sound request to the Android output API. The framework checks could measure accepted bytes and play calls. Whether the next phone build sounded right remained a separate listening test.SP06SP07

The full-width arrays and service repairs we made here appear explicitly in Crash’s runtime notes. South Park had filled in parts of the core that the next game didn’t need to discover again.XC01

About these records

The inherited VM and original inputs retain their credits. The minigame probes establish entry and recorded controls, not completion of all thirteen. Audio evidence reaches the Android API through its stated framework sink, not a physical speaker. Prior owner silence/comfort feedback motivated the later work without being relabeled as phone acceptance of 0.1.2. The image is an original-runtime host frame.

The receipts

Selected report lines, investigation notes and recorded feedback. Each receipt keeps its original source and scope.

SP01 / The Banjo ExEn foundationCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/native/README.md · selected lines 3–14

Runs the supplied unchanged NEXE bytecode and original assets. Derived from the
private Banjo ExEn checkpoint's Handyplay ExEn core, upstream commit
460b149302e9a52523bc314a37efabbee9f3d666 (AGPL-3.0). Full native source and license
are included. Original firmware classes and game content remain private.

Use Zig 0.15.2. Host: `zig build -Doptimize=ReleaseSafe -Djni=true`.
Android: `zig build -Doptimize=ReleaseFast -Dtarget=aarch64-linux-android -Dstrip=true --prefix zig-out-android`.
Copy zig-out-android/lib/libsouthpark_exen.so to ../app/lib/arm64-v8a/libsouthpark.so.
The existing banjo_* C ABI names are retained for the common host harness.
JNI is scoped to com.wakka.southpark.ExEnController and the Android library
loads as southpark. Native load segments use 16 KiB alignment, with no external
DT_NEEDED dependencies. This is a portable VM; no original host simulator is run.
SP02 / Full-width shorts, resource arrays and a real SMS priceCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/native/README.md · selected lines 16–27

South Park repairs:
- Implement Sms.getPrice as a real VM String from the original 16.16 tariff
  table and currency. The unimplemented native previously returned null and
  caused a later unchecked operand-stack subtraction to crash.
- Bound-check invokestatic argument subtraction.
- Give short arrays full-width dynamic element storage. SALOAD sign-extends
  signed 16-bit values, SASTORE preserves all 16 bits. Bytes/chars retain their
  byte storage. The previous byte-only short model erased packed velocity
  high bytes and made movement remain at zero.
- Resource.readShorts/readInts preserve every element and advance the full
  resource cursor, including arrays longer than 63 inline slots.
- Unsupported offline SMS returns failure, never a fabricated success reply.
SP90 / Historical image / Kenny Cow Dodge in the original South Park gameHistorical host capture

Source: South_Park_ExEn_Bridge_v0.1.2_PRIVATE/evidence/final-host/04-original-kenny-gameplay.png

Original game pixels retained from the stated historical host check. No physical-phone capture is implied.

Unchanged historical image.
Source member: South_Park_ExEn_Bridge_v0.1.2_PRIVATE/evidence/final-host/04-original-kenny-gameplay.png
SHA-256: 5b3ce0be2077a06bbeeda1b7662dac795f5f74a530350c6fdb6a96cf7d4675f3

Original Kenny Cow Dodge, 132×176, retained from historical host execution.

Scope: Historical host original-runtime framebuffer; not physical-phone output or a framework UI fixture. Visually inspected game-only, zero EXIF, unchanged bytes.
SP04 / Thirteen episodes choose their own controlsCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/README_FIRST.txt · selected lines 18–38

EPISODE CONTROLS
Controls follow the original game's scene and selected episode automatically.
Menus/instructions use arrows and a large OK / SELECT button. During play,
OK / SELECT and BACK / PAUSE sit in a separate utility row.
Kenny Cow Dodge: Up / Down (2 / 8).
Pee Pool: four-way D-pad + STOP 5.
Gnomes: four-way D-pad + KICK 5.
Kiss the Girl, Chef Dance, Audition: Left / Middle / Right (4 / 5 / 6).
Snow: Left / Right (4 / 6).
Starvin Marvin: left gauge 4, PUSH 5, right gauge 6.
Ike's Wee Wee: Up / Down (2 / 8).
Terrance & Phillip: Up / Middle / Down (1 / 4 / 7).
Marklar: Up / Down + FIRE 5.
Catapult: nine numbered buttons corresponding to the original windows.
Pinkeye: four-way D-pad + STRIKE 5.
The original shows sideways instructions and then upright instructions. Use the
upright page. Pinkeye takes an extra original loading/instruction step.
ORIGINAL KEYPAD opens the full keypad inline; EPISODE CONTROLS returns in one
tap. The live viewport stays attached and does not resize when layouts change.
Touch holds release before changing roles; physical input ownership is retained.
Android Back closes the bridge and returns to its caller/Omni.
SP05 / Original input enters all thirteen episodesCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/VERIFICATION.txt · selected lines 10–18

PASS: 523-tick original Kenny movement/save/snapshot regression rerun.
      Up, Down and idle produce distinct frames; original cows spawn;
      300-byte original save; exact eight-tick replay; no faults or overflows.
PASS: All thirteen episodes entered via original inputs from a clean boot and
      an input-reached chooser snapshot. Observer follows original scenes
      17 -> 18 -> 22 -> 23 -> 9 with the correct episode 0..12. Pinkeye needs
      an extra original loading/confirmation step. Original required keys are
      exercised. 2268 cumulative ticks; zero faults or input overflows.
      This does not certify full minigame completion.
SP08 / A read-only observer follows original scene and episodeCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/README_FIRST.txt · selected lines 46–52

WHAT CHANGED / WHAT IS ORIGINAL
All three original inputs, native interpreter core, shared UI kit v1.1.2 source,
launcher artwork and private signing key are byte-identical to v0.1.1. The VM
frontend adds a read-only observer for original scene and episode fields. Java
adds episode controls, corrected Android audio output, and richer diagnostics.
Game code, graphics, original logic, timing and progress are not modified.
Original SMS services have no live backend and are not represented as successful.
SP03 / The static audio buffer was rejected before samples were writtenCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/README_FIRST.txt · selected lines 9–16

AUDIO FIX
The old player rejected the normal MODE_STATIC waiting-for-data state before
writing any samples. The player now accepts that state, writes native-order
PCM16, verifies the entire buffer and loaded state, then starts playback.
Pause/resume, stopped/replaced melodies and completed clips are handled on an
independent audio worker. Reports include requests, starts, written frames,
error count and the actual last failure. The original melody data and tone
renderer are retained. No replacement soundtrack was added.
SP06 / The original PCM reaches the Android output APICheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/VERIFICATION.txt · selected lines 25–33

PASS: Production AudioTrack wrapper receives original nonzero PCM through the
      Android framework's Robolectric audio sink: 508032 bytes / 254016 frames,
      one playback start, zero errors. A strict lifecycle fixture reproduces
      STATE_NO_STATIC_DATA and requires write before play; short-write failure
      details, pause/resume, completed clips and queued replacement cancellation
      are also checked. No physical audio output is attached to this environment.
PASS: Independent report capture remains responsive with a deliberately blocked
      VM handler. This fixture has no Downloads provider; failure/pending text
      is checked, rather than claiming a real MediaStore export.
SP07 / Phone feedback is not a new phone verdictCheckpoint investigation notes

Source: 24-South_Park_ExEn_Bridge_v0.1.2_PRIVATE_CHECKPOINT.zip / South_Park_ExEn_Bridge_v0.1.2_PRIVATE/VERIFICATION.txt · selected lines 43–47

NOT VERIFIED HERE: audible phone playback, phone touch comfort or performance,
real Downloads export, full 13-minigame completion, production Omni hosted
startup/import, public reconstruction or two cumulative public exports.
User's prior phone feedback and silent-audio report informed this update; they
are not represented as phone verification of v0.1.2.
XC01 / South Park repairs and the surviving banjo ABI namesCheckpoint investigation notes

Source: 22-Crash_Bandicoot_ExEn_Bridge_v0.1.1_PRIVATE_CHECKPOINT.zip / Crash_Bandicoot_ExEn_Bridge_v0.1.1_PRIVATE/native/README.md · selected lines 1–19

# Crash ExEn runtime
Portable ExEn VM adapted from Handyplay / mohamedahmed166e, pinned upstream
460b149302e9a52523bc314a37efabbee9f3d666, AGPL-3.0. See LICENSE-AGPL-3.0.txt.
Current source includes the reused South Park full-width array repair, original
font input separation, native diagnostic snapshots and SMS price handler.
Crash adds String construction from wide character arrays, wide drawChars input,
canonical zero/black pen handling, and DialogBox line layout/render services from
the original runtime class contracts. Manufacturer-specific dialog decoration has
no physical-reference comparison. Original EXN bytecode/assets are unchanged.

Use ../tools/build-native.sh with Zig 0.15.2. Host ABI symbols retain the original
banjo_* names for compatibility; they are internal and execute the game provided
as game.exn, with no Banjo game logic. JNI identity is com.wakka.crashexen.
Android ARM64 library has 16 KiB segments and no external dynamic dependencies.
The original 5x8 atlas is loaded from assets/font_5x8.bin at runtime, never embedded
in the compatibility ELF. Both firmware classes and font are original inputs.

The game-requested timer is 75 ms on the first stage. FIFO input does not add
extra ticks. Detailed tracing is disabled. Native game saves are isolated per app.
Continue through the archiveCrash Bandicoot →