1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-20 17:48:07 +11:00
collapseos/emul/hw/rc2014/sio.c
Virgil Dupras 1195b0313b emul/rc2014: add support for Zilog SIO
Very very simplistic, but works with our driver.
2020-09-24 21:01:14 -04:00

71 lines
1.2 KiB
C

#include <stdio.h>
#include <string.h>
#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
}