• Stars
    star
    142
  • Rank 258,495 (Top 6 %)
  • Language
    Kotlin
  • License
    Other
  • Created almost 6 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

high level programming language and compiler targeting 6502 machines such as the C-64 and CommanderX16

Documentation

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

Written by Irmen de Jong ([email protected])

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).

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

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?

  • reduction of source code length over raw assembly
  • fast execution speed due to compilation to native assembly code. It's possible to write certain raster interrupt 'demoscene' effects purely in Prog8.
  • modularity, symbol scoping, subroutines
  • various data types other than just bytes (16-bit words, floats, strings)
  • floating point math is supported if the target system provides floating point library routines (C64 and Cx16 both do)
  • 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
  • subroutines with input parameters and result values
  • high-level program optimizations
  • small program boilerplate/compilersupport overhead
  • programs can be run multiple times without reloading because of automatic variable (re)initializations.
  • conditional branches
  • when statement to provide a concise jump table alternative to if/elseif chains
  • in expression for concise and efficient multi-value/containment check
  • many built-in functions such as sin, cos, rnd, abs, min, max, sqrt, msb, rol, ror, swap, sort and reverse
  • various powerful built-in libraries to do I/O, number conversions, graphics and more
  • convenience abstractions for low level aspects such as ZeroPage handling, program startup, explicit memory addresses
  • 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, and provides them also on the C64.
  • encode strings and characters into petscii or screencodes as desired (C64/Cx16)

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!):

  • "c64": Commodore-64 (6502 like CPU)
  • "c128": Commodore-128 (6502 like CPU - the Z80 cpu mode is not supported)
  • "cx16": CommanderX16 (65c02 CPU)
  • "pet32": Commodore PET (experimental)
  • "atari": Atari 8 bit such as 800XL (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 {

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

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

More Repositories

1

Pyro4

Pyro 4.x - Python remote objects
Python
715
star
2

Pyro5

Pyro 5 - Python remote objects
Python
302
star
3

synthesizer

python sample mixer and sequencer, waveform synthesizer, and sound playback engine
Python
182
star
4

Pyrolite

Java and .NET client interface for Pyro5 protocol
Java
177
star
5

pyminiaudio

python interface to the miniaudio audio playback, recording, decoding and conversion library
C
159
star
6

Tale

Interactive fiction (text adventure) and Mud framework
Python
142
star
7

pyc64

Commodore-64 simulator in pure Python
Python
80
star
8

pickle

Java and .NET implementation of Python's pickle serialization protocol
C#
76
star
9

Serpent

serializer for literal Python expressions, also .NET and Java
Java
49
star
10

bouldercaves

Boulder Caves - a Boulder Dash (tm) clone in pure python (including level editor)
Python
34
star
11

64tass

64tass - cross assembler for 6502 etc. microprocessors - by soci/singular - [git clone from the original sourceforge repo]
C
30
star
12

cx16shell

Command line shell for the Commander X16
Lua
12
star
13

binaryen-interfaces

non-C programming language interfaces to the Binaryen library
Kotlin
11
star
14

cx16assem

File-based 65c02 assembler for Commander-X16
Lua
9
star
15

ksim65

Kotlin 6502/65C02 microprocessor simulator
Assembly
8
star
16

raycaster

Ray caster engine in Python and Kotlin/JVM
Kotlin
7
star
17

pylibxmplite

Python library that provides libxmp-lite mod file decoding
C
6
star
18

rocketsimulator

python rocket landing simulation game just using tkinter
Python
5
star
19

Pyro3

Pyro 3.x (old version - unmaintained - use Pyro4 instead)
Python
4
star
20

cx16imageviewer

multi file format (iff, pcx, bmp, koala) image viewer for Commander X16
Lua
3
star
21

text-elite

python and cleand up ansi-c versions of text elite
C
2
star
22

ksim68k

m68k cpu simulator
Python
2
star
23

Elite-ships

3d model viewer for Elite's space ships
Python
2
star
24

cx16rockrunner

RockRunner - a Boulderdash(tm) clone for the Commander X16
Lua
1
star
25

mazes

some experiments with generating and solving mazes
Python
1
star
26

cx16kernel

custom CommanderX16 kernel rom
Assembly
1
star
27

cx16chess

Chess game for the Commander X16
Lua
1
star