#include <stdint.h>
#include <stdbool.h>

/* Extremely simplified Zilog SIO */

typedef struct {
    // Write registers WR7:0
    uint8_t wr[7];
    // Read registers RR2:0
    uint8_t rr[2];
    uint8_t rx;
    uint8_t tx;
    // Set to true when writing a byte while SIO is enabled and set back to
    // false when sio_has_irq() is false.
    bool in_int;
} SIO;

void sio_init(SIO *sio);
bool sio_has_irq(SIO *sio);
bool sio_hasrx(SIO *sio);
bool sio_hastx(SIO *sio);
uint8_t sio_read(SIO *sio);
void sio_write(SIO *sio, uint8_t val);
uint8_t sio_actl_rd(SIO *sio);
void sio_actl_wr(SIO *sio, uint8_t val);
uint8_t sio_adata_rd(SIO *sio);
void sio_adata_wr(SIO *sio, uint8_t val);