high level programming language and compiler targeting 6502 machines such as the C-64 and CommanderX16
Go to file
Irmen de Jong 565973c520 diskio read & write routines now always reset the io channels back to the defaults before returning
This means you don't have to call CLRCHN yourself anymore inbetween if you want to do screen output or keyboard input while a file is open
2024-12-03 23:46:07 +01:00
.github 64tass version... 2024-03-21 21:40:18 +01:00
.idea update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
beanshell fix build 2024-11-29 01:01:59 +01:00
benchmark-program fix asm optimization regression caused by wrong label prefix comparison 2024-11-14 21:24:46 +01:00
codeCore add -plaintext and -ignorefootguns options 2024-12-03 19:12:30 +01:00
codeGenCpu6502 remove bankof(), documented msw() and lsw() 2024-12-01 21:24:26 +01:00
codeGenExperimental update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
codeGenIntermediate fix IR codegen missing a CMPI after if not condition 2024-12-02 03:06:06 +01:00
codeGenVirtual correct openjdk-11 sdk setting in project files instead of just 11 2023-01-24 01:49:38 +01:00
codeOptimizers IR: fix invalid asm name matching that resulted in not removing subs with a name matching an IR asm instruction 2024-11-30 00:10:57 +01:00
compiler diskio read & write routines now always reset the io channels back to the defaults before returning 2024-12-03 23:46:07 +01:00
compilerAst remove the unary/prefix operators ^ and << again 2024-12-01 20:50:33 +01:00
docs diskio read & write routines now always reset the io channels back to the defaults before returning 2024-12-03 23:46:07 +01:00
examples diskio.f_open_w() now also resets io channels back to defaults, like f_open() already did 2024-12-02 22:25:32 +01:00
gradle/wrapper update gradle wrapper version 2024-11-29 00:54:21 +01:00
intermediate update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
parser remove the unary/prefix operators ^ and << again 2024-12-01 20:50:33 +01:00
scripts add compression.decode_rle_vram() to decompress RLE data directly to X16's VRAM. 2024-11-26 02:06:35 +01:00
syntax-files remove bankof(), documented msw() and lsw() 2024-12-01 21:24:26 +01:00
virtualmachine update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
.gitignore floats: added AYINT2 as a safe wrapper for AYINT. Internal float to word cast now also uses that. 2024-11-08 18:52:48 +01:00
.readthedocs.yaml readthedocs 2024-02-21 21:23:18 +01:00
build.gradle.kts update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
gradle.properties update to kotlin 2.1.0 2024-11-28 03:49:07 +01:00
gradlew update gradle wrapper version 2024-11-29 00:54:21 +01:00
gradlew.bat update gradle wrapper version 2024-11-29 00:54:21 +01:00
LICENSE removed confusing GPL software license reference and copyright header from library files. (because of exclusion in output files) 2022-05-30 20:12:20 +02:00
Makefile compiler name change: prog8c (was p8compile) 2024-10-16 18:36:19 +02:00
README.md update some docs 2024-11-23 21:01:18 +01:00
settings.gradle added a beanshell interpreter experiment 2024-10-29 20:52:41 +01:00

ko-fi Documentation

Prog8 - Structured Programming Language for 8-bit 6502/65c02 microprocessors

Written by Irmen de Jong (irmen@razorvine.net)

This is a structured programming language for the 8-bit 6502/6510/65c02 microprocessor from the late 1970's and 1980's as used in many home computers from that era. It is a medium to low level programming language, which aims to provide many conveniences over raw assembly code (even when using a macro assembler).

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 ko-fi.com/irmen.

Documentation

Full documentation (syntax reference, how to use the language and the compiler, etc.) can be found at: https://prog8.readthedocs.io/

How to get it/build it

  • Download the latest official release from github.
  • Or, if you want/need a bleeding edge development version, you can:
    • download a build artifact zipfile from a recent github action build.
    • you can also compile it yourself from source. Instructions here. Note that if you are not using gradle to build it, you might have to perform some manual tasks once to make it compile fully. These are explained in the linked instructions.
  • Alternatively, you can also install the compiler as a package on some linux distros:

Community

Most of the development on Prog8 and the use of it is currently centered around the Commander X16 retro computer. Their discord server contains a small channel dedicated to Prog8. Other than that, use the issue tracker on github.

Software license

GNU GPL 3.0 (see file LICENSE), with exception for generated code:

  • The compiler and its libraries are free to use according to the terms of the GNU GPL 3.0
  • exception: the resulting files (intermediate source codes and resulting binary program) created by the compiler are excluded from the GPL and are free to use in whatever way desired, commercially or not.

What does Prog8 provide?

  • all advantages of a higher level language over having to write assembly code manually
  • programs run very fast because it's compiled to native machine code
  • code often is smaller and faster than equivalent C code compiled with CC65 or even LLVM-MOS
  • modularity, symbol scoping, subroutines. No need for forward declarations.
  • various data types other than just bytes (16-bit words, floats, strings)
  • floating point math is supported on certain 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.
  • automatic static variable allocations, automatic string and array variables and string sharing
  • high-level program optimizations
  • programs can be run multiple times without reloading because of automatic variable (re)initializations.
  • conditional branches that map 1:1 to cpu status flags
  • when statement to provide a concise jump table alternative to if/elseif chains
  • in expression for concise and efficient multi-value/containment check
  • defer statement to help write concise and robust subroutine cleanup logic
  • several specialized built-in functions such as lsb, msb, min, max, rol, ror
  • various powerful built-in libraries to do I/O, number conversions, graphics and more
  • inline assembly allows you to have full control when every cycle or byte matters
  • supports the sixteen 'virtual' 16-bit registers R0 - R15 from the Commander X16 (also available on other targets)
  • encode strings and characters into petscii or screencodes or even other encodings
  • Automatic ROM/RAM bank switching on certain compiler targets when calling routines in other banks
  • 50 Kb of available program RAM size on the C64 by default; because Basic ROM is banked out altogether

Rapid edit-compile-run-debug cycle:

  • use a modern PC to do the work on, use nice editors and enjoy quick compilation times
  • can automatically run the program in the Vice emulator after succesful compilation
  • breakpoints, that let the Vice emulator drop into the monitor if execution hits them
  • source code labels automatically loaded in Vice emulator so it can show them in disassembly

Multiple supported compiler targets (contributions to improve these or to add support for other machines are welcome!):

  • "cx16": CommanderX16 (65c02 CPU)
  • "c64": Commodore-64 (6502 like CPU)
  • "c128": Commodore-128 (6502 like CPU - the Z80 cpu mode is not supported)
  • "pet32": Commodore PET (limited support)
  • "atari": Atari 8 bit such as 800XL (experimental)
  • "neo": Neo6502 (experimental)
  • If you only use standard kernal and prog8 library routines, it is possible to compile the exact same program for different machines (just change the compiler target flag)

Additional required tools

64tass - cross assembler. Install this on your shell path. A recent .exe version of this tool for Windows can be obtained from my clone of this project. For other platforms it is very easy to compile it yourself (make ; make install).

A Java runtime (jre or jdk), version 11 or newer is required to run a prepackaged version of the compiler. If you want to build it from source, you'll need a Java SDK + Kotlin 1.3.x SDK (or for instance, IntelliJ IDEA with the Kotlin plugin).

It's handy to have an emulator (or a real machine perhaps!) to run the programs on. The compiler assumes the presence of the Vice emulator for the C64 target, and a recent emulator version (R42 or newer) 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.

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.

Example code

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

%import textio
%zeropage basicsafe

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

    sub start() {
        sys.memset(sieve, 256, 0)   ; clear the sieve
        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
        }

        ; 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 C-64 you'll get:

c64 screen

One of the included examples (wizzine.p8) animates a bunch of sprite balloons and looks like this:

wizzine screen

Another example (cube3d-sprites.p8) draws the vertices of a rotating 3d cube:

cube3d screen

If you want to play a video game, a fully working Tetris clone is included in the examples:

tehtriz_screen

There are a couple of examples specially made for the CommanderX16 compiler target. For instance here's a well known space ship animated in 3D with hidden line removal, in the CommanderX16 emulator:

cobra3d