Replace helloworld.c with main.c. Add memmap_setup/restore (banks out KERNAL+BASIC+CHAR ROMs so $E000-$FFFF is free for the 8 KB bitmap and $D000-$DFFF is I/O), show_screen(n) which copies the title .bin to $E000 and the .attr to $D000 (screen memory in multicolor bitmap mode) then flips the VIC into BMM=1 MCM=1 CSEL=1 RSEL=1 DEN=1 with bitmap base CB13=1 and screen base VM13-VM10=4 ($D018 = 0x48), and input_fire(port) which reads bit 4 of CIA1 $DC00/$DC01. build.sh default target is now main.c -> whack_hare.prg (still builds helloworld explicitly via the existing -c flag if needed). Verified: ./build.sh -e runs the title screen in oscar64's built-in emulator and exits cleanly. .map shows code at $0880-$09A6 and embedded title data at $09A7-$2CCF, well within the 38 KB main region. .prg is 9428 bytes, well under the 202-block LOAD"*",8,1 limit. Concerns for Phase 3 (score bar): the score bar will overlay the top 8 pixel rows of the bitmap ($E000-$E13F, 320 bytes). show_screen() will continue to copy the full .bin to $E000; score_render() will be called immediately after and overwrite the top 320 bytes. This keeps show_screen() dumb and lets the score bar be re-rendered on state change without re-copying the whole 8 KB bitmap.
nyuller
A C64 programming project using Oscar64
as the cross-compiler. Oscar64 is checked in as a git submodule under
./oscar64/.
Layout
.
├── oscar64/ # Oscar64 cross-compiler (git submodule)
├── docs/c64/ # Low-level C64 reference (memory map, VIC, CIA, SID, …)
├── src/ # Your C code
│ ├── helloworld.c
│ └── build.sh # Compile + run helper
├── OSCAR64.md # Notes on the Oscar64 compiler internals
└── PROG_C64.md # Notes on programming the C64 hardware
First-time setup
# 1. Clone with submodules:
git clone --recurse-submodules <this-repo-url>
# Or, if you already cloned without --recurse-submodules:
git submodule update --init --recursive
Building
cd src
./build.sh # compile helloworld.c → src/build/helloworld.prg
./build.sh -e # run in oscar64's built-in emulator (headless, fast)
./build.sh -v # run in VICE x64 (interactive, needs a real display)
./build.sh -V # run in VICE x64sc (interactive, cycle-exact)
./build.sh -c # just compile
build.sh will build the oscar64 compiler automatically the first time
(it runs make -C make compiler inside ./oscar64/ if
./oscar64/bin/oscar64 doesn't exist yet).
Default test tool is the oscar64 built-in emulator (-e): it
runs headless, needs no ROMs, no display, and is fast. Every Verify
step in tasks.md uses this.
VICE 3.9 is installed at /usr/bin/ (x64, x64sc, x128,
xvic, xpet) and is available via -v / -V. It is a GUI
emulator and needs a real X11 / Wayland display to render — it
won't produce useful screenshots in this headless environment.
Use it from a real terminal session for interactive play-testing
and cycle-exact validation of raster IRQ and SID timing; don't
expect to script it.
Documentation
PROG_C64.md— how the C64 hardware actually works, from a low-level programming perspective. Start here if you want to understand what's going on under the hood.OSCAR64.md— how the Oscar64 compiler works internally, plus a C64- specific section on how to use it well (memory model, bank switching, raster IRQs, common mistakes).docs/c64/— downloaded reference material: the full Commodore 64 Programmer's Reference Guide text, Christian Bauer's canonical VIC-II paper, and per-chip reference notes.