Tree @16-bit-compare (Download .tar.gz)
SixtyPical
Version 0.18. Work-in-progress, everything is subject to change.
SixtyPical is a low-level programming language with advanced static analysis. Many of its primitive instructions resemble those of the 6502 CPU — in fact it is intended to be compiled to 6502 machine code — but along with these instructions are constructs which ease structuring and analyzing the code. The language 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, 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
Many of these checks are done with abstract interpretation, where we go through the program step by step, tracking not just the changes that happen during a specific execution of the program, but sets of changes that could possibly happen in any run of the program.
SixtyPical also provides some convenient operations based on machine-language programming idioms, such as
- copying values from one register to another (via a third register when there are no underlying instructions that directly support it); this includes 16-bit values, which are copied in two steps
- explicit tail calls
- indirect subroutine calls
SixtyPical is defined by a specification document, a set of test cases, and a reference implementation written in Python 2. The reference implementation can analyze and compile SixtyPical programs to 6502 machine code, which can be run on several 6502-based 8-bit architectures:
- Commodore 64
- Commodore VIC-20
- Atari 2600 VCS
- Apple II
Quick Start
If you have the VICE emulator installed, from this directory, you can run
./loadngo.sh c64 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 the loadngo.sh
script 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.
Documentation
- Design Goals
- SixtyPical specification
- SixtyPical revision history
- Literate test suite for SixtyPical syntax
- Literate test suite for SixtyPical analysis
- Literate test suite for SixtyPical compilation
- Literate test suite for SixtyPical fallthru optimization
- 6502 Opcodes used/not used in SixtyPical
- Output formats supported by
sixtypical
- TODO
Commit History
@16-bit-compare
git clone https://git.catseye.tc/SixtyPical/
- Fix order of operands in word-sized `cmp`. Chris Pressey 5 years ago
- Add another example. Even more convincing that the order is wrong. Chris Pressey 5 years ago
- Add example program that suggests we've got the arguments backwards. Chris Pressey 5 years ago
- If add and sub can work on words, then cmp can work on words too. Chris Pressey 5 years ago
- Notes on `compare`. Chris Pressey 5 years ago
- Merge branch 'develop-0.18' into 16-bit-compare Chris Pressey 5 years ago
- Note what's on this development branch so far. Chris Pressey 5 years ago
- Initial attempt at 16-bit compare. Not super well tested yet. Chris Pressey 5 years ago
- Make lexer greatly less inefficient on large source files. Chris Pressey 6 years ago
- Merge pull request #14 from catseye/develop-0.17 Chris Pressey (commit: GitHub) 6 years ago