Prog8 documentation - 10.2.1

Prog8 logo

What is Prog8?

This is a compiled programming language targeting the 8-bit 6502 / 6510 / 65c02 microprocessors. This CPU is from the late 1970’s and early 1980’s and was used in many home computers from that era, such as the Commodore 64. The language aims to provide many conveniences over raw assembly code (even when using a macro assembler), while still being low level enough to create high performance programs. You can compile programs for various machines with this CPU:

  • Commander X16

  • Commodore 64

  • Commodore 128 (limited support)

  • Commodore PET (limited support)

  • Atari 800 XL (limited support)

Prog8 is copyright © Irmen de Jong (irmen@razorvine.net | http://www.razorvine.net). The project is on github: https://github.com/irmen/prog8.git

Software License

This is free software, as defined in the GNU GPL 3.0 (https://www.gnu.org/licenses/gpl.html) Exception: All output files generated by the compiler (intermediary files and compiled binary programs) are excluded from this particular license: you can do with those whatever you want. This means, for instance, that you can use the Prog8 compiler to create commercial software as long as you only sell the actual resulting program.

Want to buy me a coffee or a pizza perhaps?

This project was created over the last couple of years by dedicating thousands of hours of my free time to it, to make it the best I possibly can. If you like Prog8, and think it’s worth a nice cup of hot coffee or a delicious pizza, you can help me out a little bit over at https://ko-fi.com/irmen .

3d rotating sprites Simple wizzine sprite effect Fully playable tetris clone BoulderDash(tm) clone for the X16 Paint program for the X16 Chess program for the X16

Language features

  • It is a cross-compiler running on modern machines (Linux, MacOS, Windows, …)

  • Programs run very fast because compilation to native machine code. It’s possible to write games purely in Prog8, and even certain raster interrupt ‘demoscene’ effects.

  • Provides a very convenient edit/compile/run cycle by being able to directly launch the compiled program in an emulator and provide debugging information to this emulator.

  • Based on simple and familiar imperative structured programming (it looks like a mix of C and Python)

  • Modular programming and scoping via modules, code blocks, and subroutines.

  • No need for forward declarations.

  • Provide high level programming constructs but at the same time stay close to the metal; still able to directly use memory addresses and ROM subroutines, and inline assembly to have full control when every register, cycle or byte matters

  • Subroutines with parameters and return values

  • Complex nested expressions are possible

  • Variables are all allocated statically

  • Conditional branches for status flags that map 1:1 to processor branch instructions

  • when statement to avoid if-else chains

  • in expression for concise and efficient multi-value/containment test

  • Several powerful built-in functions, such as lsb, msb, min, max, rol, ror, sort and reverse

  • Variable data types include signed and unsigned bytes and words, arrays, strings.

  • Floating point math is supported on select compiler targets.

  • Strings can contain escaped characters but also many symbols directly if they have a PETSCII equivalent, such as “♠♥♣♦π▚●○╳”. Characters like ^, _, \, {, } and | are also accepted and converted to the closest PETSCII equivalents.

  • Identifiers can contain Unicode Letters, so knäckebröd, приблизительно, 見せしめ and π are all valid identifiers.

  • Advanced code optimizations, such as const-folding (zero-allocation constants that are optimized away in expressions), expression and statement simplifications/rewriting.

  • Programs can be run multiple times without reloading because of automatic variable (re)initializations.

  • Supports the sixteen ‘virtual’ 16-bit registers R0 to R15 as defined on the Commander X16, also on the other machines.

  • Support for low level system features such as Vera Fx hardware word multiplication on the Commander X16

  • If you only use standard Kernal and core prog8 library routines, it is sometimes possible to compile the exact same program for different machines (just change the compilation target flag)

Code example

Here is a hello world program:

%import textio
%zeropage basicsafe

main {
    sub start() {
        txt.print("hello world i ♥ prog8\n")
    }
}

This code calculates prime numbers using the Sieve of Eratosthenes algorithm:

%import textio
%zeropage basicsafe

main {
    ubyte[256] sieve
    ubyte candidate_prime = 2       ; is increased in the loop

    sub start() {
        ; clear the sieve, to reset starting situation on subsequent runs
        sys.memset(sieve, 256, false)
        ; calculate primes
        txt.print("prime numbers up to 255:\n\n")
        ubyte amount=0
        repeat {
            ubyte prime = find_next_prime()
            if prime==0
                break
            txt.print_ub(prime)
            txt.print(", ")
            amount++
        }
        txt.nl()
        txt.print("number of primes (expected 54): ")
        txt.print_ub(amount)
        txt.nl()
    }

    sub find_next_prime() -> ubyte {
        while sieve[candidate_prime] {
            candidate_prime++
            if candidate_prime==0
                return 0        ; we wrapped; no more primes available in the sieve
        }

        ; found next one, mark the multiples and return it.
        sieve[candidate_prime] = true
        uword multiple = candidate_prime

        while multiple < len(sieve) {
            sieve[lsb(multiple)] = true
            multiple += candidate_prime
        }
        return candidate_prime
    }
}

when compiled an ran on a C64 you get this:

result when run on C64

when the exact same program is compiled for the Commander X16 target, and run on the emulator, you get this:

result when run on CX16 emulator

Getting the compiler

Usually you just download a fat jar of an official released version, but you can also build it yourself from source. Detailed instructions on how to obtain a version of the compiler are in First, getting a working compiler.

Required additional tools

64tass - cross assembler. Install this program somewhere on your shell’s search path. It’s easy to compile yourself, but a recent precompiled .exe (only for Windows) can be obtained from the files section in the official project on sourceforge. You need at least version 1.58.0 of this assembler. If you are on Linux, there’s probably a “64tass” package in the repositories, but check if it is a recent enough version.

A Java runtime (jre or jdk), version 11 or newer is required to run the prog8 compiler itself. If you’re scared of Oracle’s licensing terms, get one of the versions of another vendor. Even Microsoft provides their own version. Other OpenJDK builds can be found at Adoptium . For MacOS you can also use the Homebrew system to install a recent version of OpenJDK.

Finally: an emulator (or a real machine of course) to test and run your programs on. For the PET, C64 and C128 targets, the compiler assumes the presence of the VICE emulator. If you’re targeting the Commander X16 instead, download a recent emulator version for the CommanderX16, such as x16emu (preferred, this is the official emulator. If required, source code is here. There is also Box16 which has powerful debugging features. For the Atari target, it assumes the “atari800” or “altirra” emulator. If multiple options are listed above, you can select which one you want to launch using the -emu or -emu2 command line options.

Syntax highlighting: for a few different editors, syntax highlighting definition files are provided. Look in the syntax-files directory in the github repository to find them.

Index