A 6502-oriented low-level programming language supporting advanced static analysis
Go to file
Chris Pressey c7e1b69845
Merge pull request #19 from catseye/develop-0.18
Develop 0.18
2019-01-04 11:21:37 +00:00
bin Move merge_programs() out of main. Handle missing -o options. 2018-09-07 09:26:11 +01:00
doc Support more modes on `add` and `sub`. 2018-12-12 10:34:25 +00:00
eg Extract utility routine to "support/stdlib.60p" source. 2018-12-25 18:10:58 +00:00
images Add screenshot. 2018-03-08 13:36:30 +00:00
src/sixtypical Merge pull request #18 from catseye/more-modes-on-add-and-sub 2018-12-12 15:13:26 +00:00
tests Merge pull request #18 from catseye/more-modes-on-add-and-sub 2018-12-12 15:13:26 +00:00
.gitignore Check in test appliance (dcc6502-adapter) that was missed. 2017-12-11 13:46:06 +00:00
HISTORY.md Merge pull request #18 from catseye/more-modes-on-add-and-sub 2018-12-12 15:13:26 +00:00
LICENSE Update copyright dates. 2018-03-06 15:52:55 +00:00
README.md Note what's on this development branch so far. 2018-11-23 22:16:21 +00:00
TODO.md Drop the check for "consistent initialization" inside `if` blocks. 2018-12-11 19:27:40 +00:00
loadngo.sh --output cmdline argument, serialize() returns an array of bytes. 2018-09-06 16:18:41 +01:00
test.sh Add some tests, some failing, for expected fallthru maps. 2018-03-29 16:44:06 +01:00

README.md

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:

Screenshot of result of running hearts.60p

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