mirror of
https://github.com/jscrane/r65emu.git
synced 2025-04-22 17:37:08 +00:00
refactor acia (#47)
This commit is contained in:
parent
e4fcc10877
commit
a3d208a8b0
26
src/acia.cpp
26
src/acia.cpp
@ -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;
|
||||
}
|
||||
|
62
src/acia.h
62
src/acia.h
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user