| editor_syntaxes/sublime | ||
| examples | ||
| internal | ||
| lib | ||
| vendor | ||
| .gitignore | ||
| claude_code_docker.sh | ||
| commands.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| language.md | ||
| main.go | ||
| README.md | ||
| syntax.md | ||
c65gm
A high-level 6502 cross-compiler targeting the ACME Cross-Assembler. c65gm provides a more expressive language for writing 6502 assembly programs, with features like functions, type-checked variables, control flow structures, and compile-time optimizations.
What It Does
c65gm compiles high-level source code into ACME assembler syntax for the 6502 processor (Commodore 64 and similar platforms). It provides:
- Type system: BYTE and WORD variables with scope resolution
- Functions: Named functions with parameters and call graph analysis
- Control flow: IF/ENDIF, WHILE/WEND, FOR loops, SWITCH/CASE
- Memory operations: PEEK/POKE/PEEKW/POKEW with zero-page optimization. Access registers as variables.
- Operators: Arithmetic (ADD, SUB), bitwise (AND, OR, XOR)
- Preprocessor: File inclusion, macros, conditional compilation, Starlark scripting
- Standard library: C64 screen/kernal routines, memory management, string handling, graphics (Koala), FAT16 filesystem, and more (accessed via
#include <file>, path set byC65LIBPATHenvironment variable) - Optimizations: Constant folding, self-assignment detection
- Safety features: Compile-time detection of overlapping absolute addresses in function call chains
Requirements
- Go: Version 1.25.1 or higher (tested with 1.25.5)
- Acme: Tested with release 0.97 ("Zem")
The project uses Go modules with these dependencies:
github.com/armon/go-radix- Prefix tree for command lookupgo.starlark.net- Embedded Starlark scripting support
Building
Build the compiler binary:
go build -o c65gm
Or install to your GOPATH:
go install
Usage
Compile a source file to ACME assembly:
./c65gm -in input.c65 -out output.asm
Then assemble the output with ACME:
acme -f cbm -o output.prg output.asm
Running Tests
Run all tests:
go test ./...
Run tests with verbose output:
go test -v ./...
Run tests for a specific package:
go test ./internal/compiler
go test ./internal/commands
Examples
See the examples/ directory for sample programs:
hires/- High-resolution graphics demomulticolorbm/- Multicolor bitmap demomemlib_demo/- Memory library usageswitch_demo/- SWITCH/CASE statement examples
Documentation
language.md- Complete language referencesyntax.md- Syntax guidecommands.md- Command reference
License
Copyright (C) 1999, 2025 Mattias Hansson Distributed under GPL.