A Windows desktop code editor for writing Commodore 64 BASIC programs, built around the Commodore 64 Ultimate's local network API. READYCode lets you write BASIC in a modern editor - with C64-accurate PETSCII rendering, syntax highlighting, keyword completion, and line-number tooling - then tokenize it to a real .prg and either save it to disk (for VICE or any other C64 emulator) or push it straight to a C64 Ultimate or VICE emulator over the network and run it immediately.
Writing BASIC for the C64 the "authentic" way means typing into the C64's own line editor: no syntax
highlighting, no find/replace, no undo. ReadyCode keeps the target authentic (real tokenized .prg
files, real PETSCII characters, real C64 Ultimate hardware) while making the writing experience
modern. The editor renders PETSCII control characters using the actual C64 character-ROM glyphs (the
same mapping the KERNAL uses), so what you see in the editor - and on a printed page - matches what
the real machine would show.
- BASIC editor - AvalonEdit-based editor with BASIC keyword highlighting,
REMcomment highlighting, line-number-aware editing, a configurable column-wrap guide, and ghost-text keyword completion. - Accurate PETSCII rendering - control and high-byte characters are remapped at render time to the matching C64 character-ROM glyph (via the embedded "Pet Me 64" font), without altering the underlying text, so existing text-based features (tokenizing, search, etc.) keep working unchanged.
- C64 Ultimate integration - Transfer (load) or Run a program directly on a real C64 Ultimate over its REST API, plus machine controls (reset, reboot, pause, resume, power off) and a device info dialog. The Ultimate's URL is configured once in Preferences.
- Tokenizing /
.prgconversion - converts BASIC source to/from the real tokenized.prgbinary format (including the$0801load address), compatible with VICE and other emulators, not just the Ultimate. - File Explorer panel - a folder tree alongside the editor with inline (VS Code-style) new file/folder creation and rename, drag-and-drop, and the usual cut/copy/paste/delete/reveal-in-Explorer context menu.
- Minify / Prettify - reformat BASIC source for either compactness (token packing, optional line renumbering) or readability.
- Printing - Print and Print Preview render the active tab through the same PETSCII-accurate font/glyph pipeline as the editor, with a standard Windows Page Setup dialog for margins/orientation.
- Themes - Light, Dark, and a Commodore-64-palette theme, swappable at runtime.
- Import/Export - read/write plain-text BASIC alongside native
.prgfiles.
ReadyCode is a single-window WPF (.NET 8) desktop app using a hybrid MVVM-ish pattern: MainViewModel
holds bindable state (open tabs, settings, status bar text, the folder tree), while MainWindow.xaml.cs
owns most commands and talks directly to the AvalonEdit control, since a text editor control doesn't
lend itself to pure MVVM. Commands are implemented with a small custom RelayCommand (ICommand
wrapping an Action + an optional CanExecute predicate, wired into WPF's CommandManager so menu
items enable/disable automatically).
ReadyCode.sln
├── ReadyCode/ # The WPF application
│ ├── Views/ # MainWindow + dialogs (About, Settings, Go to Line, Licenses, ...)
│ ├── ViewModels/ # MainViewModel and small per-dialog view models
│ ├── Models/ # EditorTab (one per open tab), FileTreeItem (Explorer tree node)
│ ├── Editor/ # AvalonEdit extensions: keyword/comment/find colorizers,
│ │ # PetsciiGlyphGenerator (PETSCII -> C64 ROM glyph at render time),
│ │ # ghost-text completion, current-line highlighting
│ ├── Tokenizer/ # BASIC keyword table, the BASIC <-> tokenized .prg converter,
│ │ # and the PETSCII byte -> C64 screen-code map (shared by the
│ │ # editor's renderer and by printing)
│ ├── Minify/, Prettify/ # BASIC source-to-source transforms
│ ├── Printing/ # Print / Print Preview (FlowDocument over the XPS pipeline)
│ ├── C64U/ # Thin REST client for the C64 Ultimate's local HTTP API
│ ├── Settings/ # JSON-persisted user preferences (C64U URL, wrap column, etc.)
│ ├── Resources/Themes/ # Light/Dark/C64 ResourceDictionaries
│ └── Assets/ # App icon/logo, the embedded "Pet Me 64" font + its license
├── ReadyCode.Tests/ # xUnit tests for Tokenizer/Minify/Prettify
└── ReadyCode.Packaging/ # MSIX packaging project (.wapproj) for Store submission -
# requires Visual Studio's packaging tooling, see note below
C64U/C64UltimateClient.cs is a thin wrapper around the Ultimate's local REST API:
| Action | Endpoint |
|---|---|
| Transfer (load without running) | POST /v1/runners:load_prg |
| Run (load and execute) | POST /v1/runners:run_prg |
| Device info | GET /v1/info |
| Machine control (reset/reboot/pause/resume/poweroff) | PUT /v1/machine:{action} |
The base URL is stored in Settings/AppSettings.cs and configured via Preferences in the app.
- Windows 10/11
- .NET 8 SDK
- Visual Studio 2022+ or VS Code with the C# Dev Kit extension
git clone <this-repository-url>
cd ReadyCodedotnet build ReadyCode/ReadyCode.csproj -c DebugBuilding the whole solution (
dotnet build ReadyCode.sln) will also try to buildReadyCode.Packaging(a.wapprojMSIX packaging project), which only builds inside Visual Studio with its packaging tooling installed - under the plain SDK CLI it fails with an MSB4019 error about a missingMicrosoft.DesktopBridge.props. That's expected outside Visual Studio; building the app project directly (above) avoids it.
dotnet run --project ReadyCode/ReadyCode.csproj -c DebugOr in VS Code: Ctrl+Shift+B to build, F5 to debug (see .vscode/launch.json and tasks.json).
In Visual Studio: open ReadyCode.sln and press F5.
dotnet test ReadyCode.Tests/ReadyCode.Tests.csproj(Running dotnet test from the repo root works too - it picks up the test project fine - but, like
the solution-wide build, it will also print the same ReadyCode.Packaging error along the way. The
test results themselves aren't affected by it.)
- AvalonEdit (NuGet) - the underlying text editor control.
Microsoft.WindowsDesktop.App.WindowsForms(FrameworkReference) - used only to reach a handful of classic Win32 dialogs WPF doesn't have (ColorDialog,PageSetupDialog, the classicPrintDialog), without pulling in full WinForms implicit usings.- xUnit (
ReadyCode.Testsonly).
No external services are required to build or run the app. The C64 Ultimate integration is optional - it only activates when you configure a device URL in Preferences.
There are two MSIX-related pieces in this repo:
ReadyCode/ReadyCode.csprojitself is configured for a self-contained (win-x64) Release build withWindowsPackageType=MSIX- thePublish MSIX (Store)task in.vscode/tasks.jsondrives this viadotnet publish.ReadyCode.Packaging/ReadyCode.Packaging.wapprojis a separate Windows Application Packaging Project. As noted above, it requires Visual Studio's MSIX/packaging workload - openReadyCode.slnin Visual Studio and build/publish that project from there.
See CONTRIBUTING.md for coding conventions, the PR workflow, and how to run the test suite before submitting changes.
© 2026 Moonspace Labs, LLC
Licensed under the MIT License. See LICENSE infor license information.
The embedded "Pet Me 64" font is third-party software, used under the terms in
ReadyCode/Assets/Fonts/LICENSE-PetMe64.txt (Kreative Software Relay Fonts Free Use License) - also viewable from the app's Help > About > Licenses dialog.
.png)