# 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 `, path set by `C65LIBPATH` environment 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 lookup - `go.starlark.net` - Embedded Starlark scripting support ## Building Build the compiler binary: ```bash go build -o c65gm ``` Or install to your GOPATH: ```bash go install ``` ## Usage Compile a source file to ACME assembly: ```bash ./c65gm -in input.c65 -out output.asm ``` Then assemble the output with ACME: ```bash acme -f cbm -o output.prg output.asm ``` ## Running Tests Run all tests: ```bash go test ./... ``` Run tests with verbose output: ```bash go test -v ./... ``` Run tests for a specific package: ```bash go test ./internal/compiler go test ./internal/commands ``` ## Examples See the `examples/` directory for sample programs: - `hires/` - High-resolution graphics demo - `multicolorbm/` - Multicolor bitmap demo - `memlib_demo/` - Memory library usage - `switch_demo/` - SWITCH/CASE statement examples ## Documentation - `language.md` - Complete language reference - `syntax.md` - Syntax guide - `commands.md` - Command reference ## License Copyright (C) 1999, 2025 Mattias Hansson Distributed under GPL.