1
0
mirror of https://github.com/jscrane/r65emu.git synced 2025-04-22 17:37:08 +00:00

refactor acia ()

This commit is contained in:
Stephen Crane 2025-02-24 15:49:03 +00:00 committed by GitHub
parent e4fcc10877
commit a3d208a8b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 66 additions and 22 deletions

@ -13,33 +13,33 @@ void ACIA::write(Memory::address a, uint8_t b) {
void ACIA::write_control(uint8_t b) {
if ((b & cd_mask) == reset) {
acia_reset();
device_reset();
return;
}
switch (b & ws_mask) {
case ws7e2:
acia_framing(SERIAL_7E2);
framing(SERIAL_7E2);
break;
case ws7o2:
acia_framing(SERIAL_7O2);
framing(SERIAL_7O2);
break;
case ws7e1:
acia_framing(SERIAL_7E1);
framing(SERIAL_7E1);
break;
case ws7o1:
acia_framing(SERIAL_7O1);
framing(SERIAL_7O1);
break;
case ws8n2:
acia_framing(SERIAL_8N2);
framing(SERIAL_8N2);
break;
case ws8n1:
acia_framing(SERIAL_8N1);
framing(SERIAL_8N1);
break;
case ws8e1:
acia_framing(SERIAL_8E1);
framing(SERIAL_8E1);
break;
case ws8o1:
acia_framing(SERIAL_8O1);
framing(SERIAL_8O1);
break;
};
}
@ -53,5 +53,11 @@ uint8_t ACIA::read(Memory::address a) {
}
uint8_t ACIA::read_status() {
return acia_more()? rdrf | tdre: tdre;
uint8_t s = dcd | cts;
uint8_t rw = can_rw_handler? can_rw_handler(): 0;
if (rw & 1)
s |= rdrf;
if (rw & 2)
s |= tdre;
return s;
}

@ -1,14 +1,33 @@
#ifndef __ACIA_H__
#define __ACIA_H__
#pragma once
// Motorola 6850 ACIA
#include <functional>
class ACIA {
public:
void write(Memory::address, uint8_t);
uint8_t read(Memory::address);
virtual void acia_reset() {}
void register_write_data_handler(std::function<void(uint8_t)> fn) {
write_data_handler = fn;
}
void register_read_data_handler(std::function<uint8_t(void)> fn) {
read_data_handler = fn;
}
void register_reset_handler(std::function<void(void)> fn) {
reset_handler = fn;
}
void register_framing_handler(std::function<void(uint32_t)> fn) {
framing_handler = fn;
}
void register_can_rw_handler(std::function<uint8_t(void)> fn) {
can_rw_handler = fn;
}
// status bits
//
@ -47,13 +66,32 @@ public:
static const uint8_t eri = 1 << 7; // enable receive interrupt
protected:
// overrideable device memory interface
virtual uint8_t read_status();
virtual uint8_t read_data() = 0;
virtual void write_control(uint8_t);
virtual void write_data(uint8_t) = 0;
virtual void acia_framing(uint32_t config) {}
virtual bool acia_more() = 0;
private:
void write_control(uint8_t);
uint8_t read_status();
uint8_t read_data() {
return read_data_handler? read_data_handler(): 0;
}
void write_data(uint8_t b) {
if (write_data_handler)
write_data_handler(b);
}
void device_reset() {
if (reset_handler)
reset_handler();
}
void framing(uint32_t cfg) {
if (framing_handler)
framing_handler(cfg);
}
std::function<void(uint8_t)> write_data_handler;
std::function<uint8_t(void)> read_data_handler;
std::function<void(void)> reset_handler;
std::function<void(uint32_t)> framing_handler;
std::function<bool(void)> can_rw_handler;
};
#endif