A Commodore 64 emulator implemented in Python with a text-based interface. This emulator focuses on text mode operation and can load and run PRG files, dump memory, and communicate via TCP/UDP.
- 6502 CPU Emulation: Full 6502 instruction set implementation
- Memory Management: Complete C64 memory map with ROM/RAM mapping
- I/O Devices: VIC, SID, CIA1, CIA2 emulation
- Text Mode Interface: Beautiful textual UI using Rich and Textual libraries
- Graphics Mode: Optional pygame window for C64 display output
- PRG File Loading: Load and auto-run Commodore 64 programs
- Server Mode: TCP/UDP server for remote control
- Debug Support: UDP debug logging and detailed debug output
- Memory Dumping: Export memory state to files
- PAL/NTSC Support: Configurable video standard
- Python 3.8 or higher
- See
requirements.txtfor Python dependencies
pip install c64py- Install dependencies:
pip install -r requirements.txt- Ensure ROM files are available:
- By default, the emulator auto-detects ROMs from common locations, including a per-user directory and common VICE install paths.
- You can always point to ROMs explicitly with
--rom-dir. - If ROMs are not found and you are running interactively, the emulator can offer to install ROMs from a local directory or archive into a per-user directory (so future runs work automatically). ROMs are not shipped by default because many ROM binaries are copyrighted.
Run the emulator with a PRG file (auto-runs the program):
c64py program.prgRun the emulator without a program (starts at BASIC prompt):
c64pyprg_file: Optional PRG file to load and run--rom-dir DIR: Directory containing ROM files (default: auto-detect common locations)--tcp-port PORT: Enable TCP server on specified port--udp-port PORT: Enable UDP server on specified port--max-cycles N: Maximum CPU cycles to run (default: unlimited)--dump-memory FILE: Dump memory to file after execution--debug: Enable debug output--udp-debug: Send debug events via UDP--autoquit: Automatically quit when max cycles is reached--udp-debug-port PORT: UDP port for debug events (default: 64738)--udp-debug-host HOST: UDP host for debug events (default: 127.0.0.1)--screen-update-interval SECONDS: Screen update interval (default: 0.1)--video-standard {pal,ntsc}: Video standard (default: pal)--no-colors: Disable ANSI color output--graphics: Render output in a pygame graphics window--graphics-scale N: Scale factor for graphics window (default: 2)--graphics-fps N: Target FPS for graphics window (default: 30)--graphics-border N: Border size in pixels for graphics window (default: 32)
Run with debug output:
c64py program.prg --debugRun in server mode (TCP):
c64py --tcp-port 1234Run with UDP debug logging:
c64py program.prg --udp-debug --udp-debug-port 64738Run with auto-quit after max cycles:
c64py program.prg --max-cycles 5000000 --autoquitDump memory after execution:
c64py program.prg --dump-memory memory.prgWhen running in server mode (with --tcp-port or --udp-port), you can send commands:
STATUS: Get emulator statusSTEP [N]: Step N CPU cycles (default: 1)RUN: Start/resume emulationMEMORY [start] [end]: Read memory (hex addresses)DUMP [start] [end]: Dump memory as hex stringSCREEN: Get current screen outputLOAD <file>: Load a PRG fileSTOP: Stop emulationQUITorEXIT: Exit the server
The emulator features a modern text-based UI when not in server mode:
- C64 Display: Shows the emulated C64 screen
- Debug Panel: Real-time debug log with timestamps
- Status Bar: Current emulator status
Ctrl+X: Quit the emulatorCtrl+R: Fill screen with random characters (debug)Ctrl+K: Dump screen memory to debug logs
-
If any ROM file fails to load, the emulator will:
- Stop the textual UI (if running)
- Print an error message
- Exit immediately with error code 1
-
On automatic exit (e.g., max cycles reached), the emulator will:
- Capture the last 20 log messages
- Shut down the textual UI
- Print the captured logs to the console
The emulator consists of several key components:
- C64: Main emulator class
- CPU6502: 6502 CPU emulator
- MemoryMap: Memory management with ROM/RAM mapping
- TextualInterface: Text-based UI using Textual
- EmulatorServer: TCP/UDP server for remote control
Licensed under the BSD 3-Clause License. See LICENSE.