K816 high-level assembler

-

A new development tool is part of the X65 Project.

I was looking for a high-level-assembler that will make my life easier, writing OS/816. The closest one to my needs is K65, but it was developed for 6502 on Atari VCS.

So I decided to rewrite it and adapt to 65816.

Meet K816: https://github.com/X65/K816

K816 aims to combine a familiar, readable, C-like source format with the control and predictability of hand-written assembly, while providing a small set of high-level conveniences that remove boilerplate and improve code clarity.

Goals

Quick Taste

Want to get a feel for K65-style code? This is the vibe:

var UART_READY = $FFE0
var UART_DATA  = $FFE1
var API_OP = $FFF1

data VECTORS {
  segment VECTORS
  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 &<main &>main $00 $00
}

main {
  x = #0
  {
    { a&?UART_READY } n-?   // UART ready?
    UART_DATA = a = text,x
    x++
    a?0
  } !=
  API_OP = a = [$FF]        // Halt CPU
}

data text {
  "Hello, World!"
  $0D $0A $00
}

data INFO {
  segment INFO
  "Hello UART example for X65 RIA"
}

This compiles to the following assembly:

> target/debug/k816 examples/hello_uart.k65 --listing

> cat examples/hello_uart.lst
[default]
000200: A2 00 2C E0 FF 10 FB BD 18 02 8D E1 FF E8 C9 00
000210: D0 F0 A9 FF 8D F1 FF 60 48 65 6C 6C 6F 2C 20 57
000220: 6F 72 6C 64 21 0D 0A 00


[VECTORS]
00FFE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00FFF0: 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00


[INFO]
00FC00: 48 65 6C 6C 6F 20 55 41 52 54 20 65 78 61 6D 70
00FC10: 6C 65 20 66 6F 72 20 58 36 35 20 52 49 41


[data obj#0 VECTORS::VECTORS]
00FFE0: <32 bytes of data>

[data obj#0 default::text]
000218: "Hello, World!"
000225: <3 bytes of data>

[data obj#0 INFO::INFO]
00FC00: "Hello UART example for X65 RIA"

[disasm obj#0 default::main]
000200: A2 00       ldx #$00
000202: 2C E0 FF    bit $FFE0
000205: 10 FB       bpl $000202
000207: BD 18 02    lda $0218,X
00020A: 8D E1 FF    sta $FFE1
00020D: E8          inx
00020E: C9 00       cmp #$00
000210: D0 F0       bne $000202
000212: A9 FF       lda #$FF
000214: 8D F1 FF    sta $FFF1
000217: 60          rts⏎

Share: