c64 0.1.0-alpha.0

Driver for the Commodore 64 platform
#include <stdint.h>

int16_t basic_facinx() {
    uint8_t a, y;
    asm volatile(
        "jsr $B1AA;"
        : "=a" (a), "=y" (y)
    );
    // TODO: https://www.c64-wiki.com/wiki/FACINX has it both ways round.
    return (int16_t) (((uint16_t) a << 8) | ((uint16_t) y));
}

void basic_givayf(int16_t value) {
    uint8_t a = (uint8_t) ((uint16_t) value >> 8);
    uint8_t y = (uint8_t) ((uint16_t) value);
    asm volatile(
        "jsr $B391;"
        :: "a" (a), "y" (y)
    );
}

void basic_fadd(uint8_t* addr) {
    uint8_t a = (uint8_t) ((uint16_t) addr);
    uint8_t y = (uint8_t) ((uint16_t) addr >> 8);
    asm volatile(
        "jsr $B867;"
        :: "a" (a), "y" (y)
    );
}

void basic_faddt() {
    asm volatile("jsr $B86A");
}

void basic_movfm(uint8_t* addr) {
    uint8_t a = (uint8_t) ((uint16_t) addr);
    uint8_t y = (uint8_t) ((uint16_t) addr >> 8);
    asm volatile(
        "jsr $BBA2;"
        :: "a" (a), "y" (y)
    );
}

void basic_movmf(uint8_t* addr) {
    uint8_t x = (uint8_t) ((uint16_t) addr);
    uint8_t y = (uint8_t) ((uint16_t) addr >> 8);
    asm volatile(
        "jsr $BBD4;"
        :: "x" (x), "y" (y)
    );
}

uint8_t basic_movaf() {
    uint8_t a;
    asm volatile(
        "jsr $BBFC;"
        : "=a" (a)
    );
    return a;
}

uint8_t basic_movfa() {
    uint8_t a;
    asm volatile(
        "jsr $BC0C;"
        : "=a" (a)
    );
    return a;
}

int8_t basic_fcomp(uint8_t* addr) {
    uint8_t a = (uint8_t) ((uint16_t) addr);
    uint8_t y = (uint8_t) ((uint16_t) addr >> 8);
    int8_t ret;
    asm volatile(
        "jsr $BC5B;"
        : "=a" (ret)
        : "a" (a), "y" (y)
    );
    return ret;
}

void basic_qint() {
    asm volatile("jsr $BC9B");
}

int8_t* basic_fout() {
    uint8_t a, y;
    asm volatile(
        "jsr $BDDD;"
        : "=a" (a), "=y" (y)
    );
    return (int8_t*) (((uint16_t) y << 8) | ((uint16_t) a));
}

void basic_negop() {
    asm volatile("jsr $BFB4");
}