#include #include #include "sio.h" void sio_init(SIO *sio) { memset(sio->wr, 0, sizeof(sio->wr)); memset(sio->rr, 0, sizeof(sio->rr)); sio->rx = 0; sio->tx = 0; sio->in_int = false; } bool sio_has_irq(SIO *sio) { bool res = sio->in_int; sio->in_int = false; return res; } bool sio_hasrx(SIO *sio) { return sio->rr[0] & 0x01; // Receive Character Available } bool sio_hastx(SIO *sio) { return !(sio->rr[0] & 0x04); // Transmit Buffer Empty } uint8_t sio_read(SIO *sio) { sio->rr[0] |= 0x04; // Transmit Buffer Empty high return sio->tx; } void sio_write(SIO *sio, uint8_t val) { sio->rr[0] |= 0x01; // Receive Character Available high sio->rx = val; sio->in_int = true; } uint8_t sio_actl_rd(SIO *sio) { uint8_t target = sio->wr[0] & 0x3; // PTR return sio->rr[target]; } void sio_actl_wr(SIO *sio, uint8_t val) { uint8_t target = sio->wr[0] & 0x7; // PTR sio->wr[target] = val; if (target != 0) { sio->wr[0] &= ~0x7; } } uint8_t sio_adata_rd(SIO *sio) { sio->rr[0] &= ~0x01; // Receive Character Available low return sio->rx; } void sio_adata_wr(SIO *sio, uint8_t val) { sio->tx = val; sio->rr[0] &= ~0x04; // Transmit Buffer Empty low }