Commodore ROMs are copyrighted and can no longer ship inside the APK.
MainActivity now detects missing ROMs on first launch and blocks
startup with a dialog offering two paths: pick files via the system
file picker, or download the official VICE 3.8 tarball and extract the
four ROMs from it client-side (minimal USTAR reader, no extra deps).
- Drop the extractViceRoms Gradle task and asset bundling; add
res/extract_roms.sh for local sideloading during development instead
- gitignore keystores/keystore.properties ahead of a signed release
- Move architecture.md into docs/, refresh it for the screen-mirroring
and watch-input additions, and add accompanying Mermaid diagrams
- Add docs/debugging.md and docs/publish.md (Play Store release notes,
ROM-import compliance rationale)
Mirrors the C64 text screen to the Pebble watch (with game-specific
umlaut handling), adds a SELECT-triggered key wheel for sending
navigation input back to the emulator, shows a splash screen on watch
launch, and documents the resulting end-to-end architecture.
machine_write_snapshot reads maincpu_regs.pc to record the current
program counter. When called directly from video_canvas_refresh,
maincpu_regs is stale — the CPU loop keeps registers as stack-local
variables and only syncs them to maincpu_regs inside DO_INTERRUPT via
EXPORT_REGISTERS(). The snapshot therefore recorded the wrong PC.
On restore (already trap-based), the wrong PC was faithfully written
back into reg_pc via IMPORT_REGISTERS(), causing the CPU to resume at
a bad address. The game screen looked correct (memory/VIC/SID state
all restored) but the CPU never reached the input-polling code, so
button presses had no effect.
Fix: route machine_write_snapshot through interrupt_maincpu_trigger_trap
so DO_INTERRUPT(IK_TRAP) calls EXPORT_REGISTERS() before the trap
function, capturing the true current PC before the snapshot is written.
Pencil button next to each hero disk opens an editor dialog that parses
the D64 directly, lists all PRG save files in a spinner, and lets the
user adjust all nine stats (Vitalität, grade, six percentage stats) with
+/− buttons. Changes to multiple heroes in one session are written back
together on Save.
PETSCII decoding now distinguishes unshifted (0x41–0x5A → lowercase) from
shifted (0xC1–0xDA → uppercase) so names display in natural mixed case
(e.g. "Mark" instead of "MARK").
D64 sector layout helpers extracted to class level so createBlankD64 and
the new editor share the same offset function. Save format documented in
res/HELD_D64_FORMAT.md. Editor strings localised in EN/DE.
- Reset button (left of Sound) ejects disk and power-cycles the C64
to BASIC without reloading — loadedADisks is cleared so episode
buttons trigger autostart again on next press
- A-side episode disks that were already loaded now hot-swap instead
of resetting the machine; use Reset explicitly when a cold start
is needed (fixes unintended reset when returning from hero disk)
- Virtual keyboard Shift is now a toggle: tap SHF to lock shift on
(key stays highlighted), tap again to release — no multi-touch
required to type capital letters
- Remove android:background from C64DisplayView: SurfaceView's XML
background painted over the surface, hiding all rendered content
- Fix pixel byte order: copyPixelsFromBuffer reads [R,G,B,A] bytes, so
physical colors must be packed as ABGR (not ARGB) to avoid R/B swap
- Fix six wrong C64 keyboard matrix positions (1, 2, Q, E, R, Y) taken
from the authoritative VICE hardware matrix table
Assets (ROMs and disk images) now live in getExternalFilesDir, making
them accessible via USB file transfer and any file manager app without
adb or root.
- "Import ROMs" button walks through kernal/basic/chargen picks in
sequence and restarts the emulator when done
- "Import Disks" button opens a multi-select picker; files are saved
as SCHWUM<N><P>.D64 (uppercased for consistent lookup)
- 2×4 episode grid (1A–4B) lights up each button as its disk image
becomes available; tapping loads that disk into drive 8
Cross-compiles VICE 3.8 headless for ARM64 and x86_64 as part of the
Android Studio build (Gradle buildVice task + build_vice.sh). The JNI
bridge (vice_jni.c) renders frames into a shared framebuffer read by
C64DisplayView, and forwards key events from C64KeyboardView to VICE's
keyboard matrix. Without ROM files the app shows a placeholder blue
screen; with ROMs and a .d64 disk image the full C64 emulator runs.