Tree @master (Download .tar.gz)
SixtyPical
Version 0.21 | See also: Bubble Escape 2K ∘ SITU-SOL
NOTE: Having met the majority of its goals, the SixtyPical project might not undergo much more development going forward. See Future directions for SixtyPical for more information.
SixtyPical brings advanced static analysis to the 6502.
SixtyPical is a low-level programming language supporting some advanced static analysis methods. Its reference compiler can generate efficient code for several 6502-based target platforms while catching many common mistakes at compile-time, reducing the time spent in debugging.
Quick Start
Make sure you have Python (2.7 or 3.5+) installed. Then
clone this repository and put its bin directory on your
executable search path. Then you can run:
sixtypical
If you have the VICE emulator suite installed, you can run
sixtypical --run-on=x64 eg/c64/hearts.60p
and it will compile the hearts.60p source code and
automatically start it in the x64 emulator, and you should see:

You can try sixtypical --run-on on other sources in the eg directory
tree, which contains more extensive examples, including an entire
game(-like program); see eg/README.md for a listing.
Features
SixtyPical aims to fill this niche:
- You'd use assembly, but you don't want to spend hours debugging (say) a memory overrun that happened because of a ridiculous silly error.
- You'd use C or some other "high-level" language, but you don't want the extra overhead added by the compiler to manage the stack and registers.
SixtyPical gives the programmer a coding regimen on par with assembly language in terms of size and hands-on-ness, but also able to catch many ridiculous silly errors at compile time.
Low level
Many of SixtyPical's primitive instructions resemble those of the MOS Technology 6502 — it is in fact intended to be compiled to 6502 machine code. However, it also provides some "higher-level" operations based on common 8-bit machine-language programming idioms, including
- copying values from one register to another (via a third register when there are no underlying instructions that directly support it)
- copying, adding, and comparing 16-bit values (done in two steps)
- explicit tail calls
- indirect subroutine calls
While a programmer will find these constructs convenient, their inclusion in the language is primarily to make programs easier to analyze.
Static analysis
The SixtyPical language defines an effect system, and the reference compiler abstractly interprets the input program in the manner of flow typing to confirm that it does not violate it. This can detect common mistakes such as
- you forgot to clear carry before adding something to the accumulator
- a subroutine that you called trashes a register you thought it preserved
- you tried to read or write a byte beyond the end of a byte array
- you tried to write the address of something that was not a routine, to a jump vector
Efficient code
Unlike most conventional languages, in SixtyPical the programmer must manage memory very explicitly, selecting the registers and memory locations to store each piece of data in. So, unlike a C compiler such as cc65, a SixtyPical compiler doesn't need to generate code to handle calling conventions or register allocation. This results in smaller (and thus faster) programs.
The flagship demo, a minigame for the Commodore 64, compiles to
a 930-byte .PRG file.
Target platforms
The reference implementation can analyze and compile SixtyPical programs to 6502 machine code formats which can run on several 6502-based 8-bit architectures:
For example programs for each of these, see eg/README.md.
Specification
SixtyPical is defined by a specification document, a set of test cases, and a reference implementation written in Python.
There are over 400 test cases, written in Falderal format for readability. In order to run the tests for compilation, dcc6502 needs to be installed.
- SixtyPical specification
- Literate test suite for SixtyPical syntax
- Literate test suite for SixtyPical analysis (operations)
- Literate test suite for SixtyPical analysis (storage)
- Literate test suite for SixtyPical analysis (control flow)
- Literate test suite for SixtyPical compilation
- Literate test suite for SixtyPical fallthru optimization
- Literate test suite for SixtyPical callgraph construction
Documentation
Commit History
@master
git clone https://git.catseye.tc/SixtyPical/
- Rename method for more distinction/clarity. Chris Pressey 8 years ago
- Explicitly sort the chains by their content, for stable sort. Chris Pressey 8 years ago
- Fix whitespace (but not sorting) issue in --dump-fallthru-info. Chris Pressey 8 years ago
- --output cmdline argument, serialize() returns an array of bytes. Chris Pressey 8 years ago
- Reduce number of errors under Python 3 another smidge. Chris Pressey 8 years ago
- Abort loadngo apple2, if the SixtyPical program couldn't compile. Chris Pressey 8 years ago
- Not making any promises, but reduce the errors under Python 3. Chris Pressey 8 years ago
- Rewrite the intro blurb in the README. Chris Pressey 8 years ago
- Add apple2 target to loadngo.sh, apple2 example program. Chris Pressey 8 years ago
- Add notes for Apple II target. Chris Pressey 8 years ago
- Split TODO off into own file. Chris Pressey 8 years ago
- Use relative, ?raw=true URL for embedded image. Chris Pressey 8 years ago
- Merge pull request #13 from catseye/develop-0.16 Chris Pressey (commit: GitHub) 8 years ago
- Update HISTORY and README. Chris Pressey 8 years ago
- Use save block (and a for loop) in the flagship demo game source. Chris Pressey 8 years ago
- Fix test which is misleading due to the way the appliance works. Chris Pressey 8 years ago
- Correct some text in the test suite. Chris Pressey 8 years ago
- Merge pull request #12 from catseye/save-block Chris Pressey (commit: GitHub) 8 years ago
- Extract locations from context appropriately. All tests pass. Chris Pressey 8 years ago
- Add three tests. One fails when it shouldn't. Chris Pressey 8 years ago
- Merge branch 'develop-0.16' of https://github.com/catseye/SixtyPical into save-block Chris Pressey 8 years ago
- Use --output-format, not --prelude, in loadngo script. Chris Pressey 8 years ago
- Make tests pass. Chris Pressey 8 years ago
- Add failing tests for gotos inside runtime-context-making blocks. Chris Pressey 8 years ago
- Support save'ing user-defined locations. Chris Pressey 8 years ago
- Compile code for saving a, x, or y on the stack. Chris Pressey 8 years ago
- Saving anything except `a` trashes `a`. Chris Pressey 8 years ago
- Merge branch 'develop-0.16' of https://github.com/catseye/SixtyPical into save-block Chris Pressey 8 years ago
- Remove --prelude, reform and document --output-formats. Chris Pressey 8 years ago
- Another passing test which is a little surprising. Chris Pressey 8 years ago