From c4ee594a1c296fe120dbda5c34129803d1398463 Mon Sep 17 00:00:00 2001 From: Stephen Crane Date: Thu, 13 Sep 2018 12:56:54 +0100 Subject: [PATCH] serial framing config --- acia.cpp | 30 +++++++++++++++++++++++++++++- acia.h | 9 +++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/acia.cpp b/acia.cpp index a6cfdde..2e80462 100644 --- a/acia.cpp +++ b/acia.cpp @@ -8,8 +8,36 @@ void acia::operator=(uint8_t b) { _device->write(b); return; } - if ((b & cd_mask) == 0x03) + if ((b & cd_mask) == reset) { _device->reset(); + return; + } + switch (b & ws_mask) { + case ws7e2: + _device->framing(7, 2, even); + break; + case ws7o2: + _device->framing(7, 2, odd); + break; + case ws7e1: + _device->framing(7, 1, even); + break; + case ws7o1: + _device->framing(7, 1, odd); + break; + case ws8n2: + _device->framing(8, 2, none); + break; + case ws8n1: + _device->framing(8, 1, none); + break; + case ws8e1: + _device->framing(8, 1, even); + break; + case ws8o1: + _device->framing(8, 1, odd); + break; + }; // FIXME: more } diff --git a/acia.h b/acia.h index 15aa8d1..91bbd62 100644 --- a/acia.h +++ b/acia.h @@ -1,10 +1,19 @@ #ifndef __ACIA_H__ #define __ACIA_H__ +enum parity { + none, + even, + odd, +}; + class SerialDevice { public: virtual void reset() {} + virtual void framing(unsigned data_bits, unsigned stop_bits, parity p) {} + virtual void write(uint8_t) {} + virtual uint8_t read() {} virtual bool more() { return false; } };