Commit Graph

30 Commits

Author SHA1 Message Date
ml f65b9be1df Adding publishing of artifacts
release / build (push) Successful in 4m53s
v0.9.9
2026-07-17 20:45:04 +02:00
ml 5ac145bff6 Adding small note on new image build scripts 2026-07-04 16:25:05 +02:00
ml e07258c8bd Fix VICE cross-compile and image cache-warming for release builds
release / build (push) Successful in 5m34s
build-image/Dockerfile: add bison (VICE's configure needs a yacc-compatible
parser generator, same category as the earlier flex fix) and exclude
packageRelease/signReleaseBundle from the cache-warm stage's gradlew run,
since those always fail there for lack of a keystore that's never baked
into the image.

vice_jni.c: guard getFrameCount()/setSoundEnabled() with #ifdef
HAVE_VICE_SRC like their sibling functions already do — they referenced
globals that only exist when VICE is linked in, breaking the documented
no-VICE placeholder build. Only surfaced now because the cache-warm stage
is the first thing to ever compile this file without VICE.

dist.sh: floor the untagged dev-build's versionCode at 1, since the
0.0.0-dev+<sha> placeholder otherwise computes to 0, which Android's
Gradle plugin rejects.

run-image.sh: wipe generated build artifacts (vice-src, vice-libs,
nibtools-src/libs, app/build, .cxx) before each run so it exercises a true
from-scratch build like CI does, instead of silently reusing artifacts
left over from a previous local run. Also chown the bind-mounted repo back
to the host user on exit, since the container runs as root and was
otherwise leaving root-owned files behind.
2026-07-04 15:11:53 +02:00
ml 8881241fd8 Split the monolithic build-image.sh into three scripts: build-image.sh now only builds locally, run-image.sh
runs dist.sh inside that local image via a bind mount, andcupload-image.sh pushes the already-built image.
The Dockerfile also warms the Gradle dependency cache in a throwaway build stage, and pre-installs
the pinned CMake version, so `run-image.sh` doesn't re-download the same Maven dependencies on every run.

dist.sh now strips the -pre+meta suffix before writing package.json's version, since Pebble's build
tooling parses it strictly as X.Y.Z integers and was rejecting suffixed versions.
2026-07-04 05:36:14 +02:00
ml ad887c8bc8 Add flex to build image and VICE preflight check
release / build (push) Failing after 1m53s
VICE's configure.ac uses AC_PROG_LEX, which needs flex — missing from
the build image caused a late, confusing "Could not find either flex
or lex!" failure deep inside configure. Add it to the Dockerfile and
to build_vice.sh's own preflight tool check so a missing flex fails
fast with a clear error. Bump build-image/VERSION to 2.
2026-07-03 06:14:15 +02:00
ml 2117043e31 More robust nibtools build
release / build (push) Failing after 2m7s
2026-07-02 14:27:55 +02:00
ml 84c47136df Setting bash as default shell for action
release / build (push) Failing after 2m3s
2026-07-02 14:13:37 +02:00
ml 23ad9ebc32 Adding container registry login for gitea action
release / build (push) Failing after 52s
2026-07-02 13:57:35 +02:00
ml f3f7442849 dist.sh builds versioned, signed artifacts for both apps from a git tag
release / build (push) Failing after 0s
(semver drives Android versionCode/versionName and package.json). The
build-image/ Dockerfile pins the same toolchain for a portable,
containerized Gitea Actions runner (build-image.sh builds and pushes
it) so releases don't depend on any one machine's local setup.
Pushing vX.Y.Z now builds and publishes a Gitea Release automatically.
2026-07-02 13:19:12 +02:00
ml 73c6c90c8d Adding a README 2026-07-01 16:10:37 +02:00
ml 3705935ca4 Adding F-Droid publishing 2026-06-27 12:13:48 +02:00
ml eee068a500 Wire keystore signing config; trim publish.md
- Read keystore.properties at Gradle config time; wire signingConfig into
  the release build type (degrades gracefully when the file is absent)
2026-06-27 12:04:55 +02:00
ml daefed88b1 Add Fetch Disks button and Anleitung copy-protection viewer
- Cross-compile nibtools for Android NDK; download all 8 episode disks
  from the Internet Archive C64 Preservation Project as NBZ and convert
  to G64 via JNI (throwaway-pthread to contain nibconv's exit() calls)
- Bundle manual transcription as APK asset; 📖 button opens scrollable
  viewer with Seite→Absatz→Zeile→Wort lookup hierarchy documented
2026-06-27 10:36:15 +02:00
ml aaa6e772a7 Replace bundled ROM extraction with runtime import/download flow
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)
2026-06-25 09:27:19 +02:00
ml 89c99b50e2 Add screen mirroring, watch input, splash screen, and architecture docs
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.
2026-06-21 19:15:19 +02:00
ml 463c85e62f Fix snapshot save/load: route both through CPU trap to sync registers
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.
2026-06-17 20:50:51 +02:00
ml b9153ac973 Improve snapshop saving and loading 2026-06-14 10:21:37 +02:00
ml 0f814eb134 Adding a save state panel 2026-06-14 10:04:59 +02:00
ml 755e7758e4 Add hero save editor with D64 format documentation
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.
2026-06-14 09:46:17 +02:00
ml 958ab77c58 Localize all visible button labels and dialogs via string resources:
values/strings.xml (English default) and values-de/strings.xml
cover section headers, hero disk buttons, sound toggle, import
button, file picker title, and the replace-disk confirmation dialog
2026-06-14 08:51:05 +02:00
ml 285c5984ac Adding a help button 2026-06-14 08:33:29 +02:00
ml e2cbf2b37d Add Reset button, fix disk swap regression, and add sticky Shift
- 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
2026-06-14 08:15:33 +02:00
ml 65597b8fce Add a drive LED vor virtual disk device
Cleanup code base
Adding a splash screen
2026-06-14 07:35:31 +02:00
ml 392bbeb996 Rework UI with drawer menu, hero disks, and sound toggle 2026-06-13 14:28:58 +02:00
ml 5a390aa733 Add C64 SID audio output via OpenSL ES with sound toggle 2026-06-13 13:54:41 +02:00
ml 7a8cd492d5 Fix C64 display rendering and keyboard matrix
- 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
2026-06-10 19:04:18 +02:00
ml 678108530c Add in-app file import and episode picker
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
2026-06-05 09:44:06 +02:00
ml 8c7f2e3306 Add VICE C64 emulator integration to Android companion app
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.
2026-06-04 16:24:14 +02:00
ml 724157aca3 Removed dead code 2026-06-01 16:31:29 +02:00
ml d7adb56197 Initial commit, adding original binaries, initial watch and companion apps which can talk 2026-06-01 15:53:11 +02:00