mirror of
https://github.com/TomHarte/CLK.git
synced 2024-07-09 06:29:33 +00:00
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
//
|
|
// 6850.cpp
|
|
// Clock Signal
|
|
//
|
|
// Created by Thomas Harte on 10/10/2019.
|
|
// Copyright © 2019 Thomas Harte. All rights reserved.
|
|
//
|
|
|
|
#include "6850.hpp"
|
|
|
|
#define LOG_PREFIX "[6850] "
|
|
#include "../../Outputs/Log.hpp"
|
|
|
|
using namespace Motorola::ACIA;
|
|
|
|
uint8_t ACIA::read(int address) {
|
|
if(address&1) {
|
|
LOG("Read from receive register");
|
|
} else {
|
|
LOG("Read status");
|
|
return status_;
|
|
}
|
|
return 0x00;
|
|
}
|
|
|
|
void ACIA::write(int address, uint8_t value) {
|
|
if(address&1) {
|
|
LOG("Write to transmit register");
|
|
} else {
|
|
if((value&3) == 3) {
|
|
LOG("Reset");
|
|
} else {
|
|
switch(value & 3) {
|
|
default:
|
|
case 0: divider_ = 1; break;
|
|
case 1: divider_ = 16; break;
|
|
case 2: divider_ = 64; break;
|
|
}
|
|
switch((value >> 2) & 7) {
|
|
default:
|
|
case 0: word_size_ = 7; stop_bits_ = 2; parity_ = Parity::Even; break;
|
|
case 1: word_size_ = 7; stop_bits_ = 2; parity_ = Parity::Odd; break;
|
|
case 2: word_size_ = 7; stop_bits_ = 1; parity_ = Parity::Even; break;
|
|
case 3: word_size_ = 7; stop_bits_ = 1; parity_ = Parity::Odd; break;
|
|
case 4: word_size_ = 8; stop_bits_ = 2; parity_ = Parity::None; break;
|
|
case 5: word_size_ = 8; stop_bits_ = 1; parity_ = Parity::None; break;
|
|
case 6: word_size_ = 8; stop_bits_ = 1; parity_ = Parity::Even; break;
|
|
case 7: word_size_ = 8; stop_bits_ = 1; parity_ = Parity::Odd; break;
|
|
}
|
|
switch((value >> 5) & 3) {
|
|
case 0: set_ready_to_transmit(false); transmit_interrupt_enabled_ = false; break;
|
|
case 1: set_ready_to_transmit(false); transmit_interrupt_enabled_ = true; break;
|
|
case 2: set_ready_to_transmit(true); transmit_interrupt_enabled_ = false; break;
|
|
case 3: set_ready_to_transmit(false); transmit_interrupt_enabled_ = false; break; /* TODO: transmit a break level on the transmit output. */
|
|
}
|
|
receive_interrupt_enabled_ = value & 0x80;
|
|
LOG("Write to control register");
|
|
}
|
|
}
|
|
}
|
|
|
|
void ACIA::run_for(HalfCycles) {
|
|
}
|
|
|
|
void ACIA::set_ready_to_transmit(bool) {
|
|
|
|
}
|