mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-27 15:29:34 +00:00
Use detection for play button; allow computer to set motor.
This commit is contained in:
parent
74db978b81
commit
f0711a9fbc
@ -249,13 +249,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto output = io_output_ | ~io_direction_;
|
const auto output = io_output_ | ~io_direction_;
|
||||||
// tape_player_->set_motor_control(~output & 0x08);
|
tape_player_->set_motor_control(~output & 0x08);
|
||||||
serial_port_.set_output(Serial::Line::Data, Serial::LineLevel(~output & 0x01));
|
serial_port_.set_output(Serial::Line::Data, Serial::LineLevel(~output & 0x01));
|
||||||
serial_port_.set_output(Serial::Line::Clock, Serial::LineLevel(~output & 0x02));
|
serial_port_.set_output(Serial::Line::Clock, Serial::LineLevel(~output & 0x02));
|
||||||
serial_port_.set_output(Serial::Line::Attention, Serial::LineLevel(~output & 0x04));
|
serial_port_.set_output(Serial::Line::Attention, Serial::LineLevel(~output & 0x04));
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf("%04x: %02x %c\n", address, *value, isReadOperation(operation) ? 'r' : 'w');
|
|
||||||
} else if(address < 0xfd00 || address >= 0xff40) {
|
} else if(address < 0xfd00 || address >= 0xff40) {
|
||||||
if(isReadOperation(operation)) {
|
if(isReadOperation(operation)) {
|
||||||
*value = map_.read(address);
|
*value = map_.read(address);
|
||||||
@ -269,9 +267,9 @@ public:
|
|||||||
if((address & 0xfff0) == 0xfd10) {
|
if((address & 0xfff0) == 0xfd10) {
|
||||||
// 6529 parallel port, about which I know only what I've found in kernel ROM disassemblies.
|
// 6529 parallel port, about which I know only what I've found in kernel ROM disassemblies.
|
||||||
|
|
||||||
// If tape motor is not currently running and this read is immediately followed by
|
// If play button is not currently pressed and this read is immediately followed by
|
||||||
// an AND 4, turn the tape motor on.
|
// an AND 4, press it. The kernel will deal with motor control subsequently.
|
||||||
if(!tape_player_->motor_control()) {
|
if(!play_button_) {
|
||||||
const uint16_t pc = m6502_.value_of(CPU::MOS6502::Register::ProgramCounter);
|
const uint16_t pc = m6502_.value_of(CPU::MOS6502::Register::ProgramCounter);
|
||||||
const uint8_t next[] = {
|
const uint8_t next[] = {
|
||||||
map_.read(pc+0),
|
map_.read(pc+0),
|
||||||
@ -283,11 +281,11 @@ public:
|
|||||||
// TODO: boil this down to a PC check. It's currently in this form as I'm unclear what
|
// TODO: boil this down to a PC check. It's currently in this form as I'm unclear what
|
||||||
// diversity of kernels exist.
|
// diversity of kernels exist.
|
||||||
if(next[0] == 0x29 && next[1] == 0x04 && next[2] == 0xd0 && next[3] == 0xf4) {
|
if(next[0] == 0x29 && next[1] == 0x04 && next[2] == 0xd0 && next[3] == 0xf4) {
|
||||||
tape_player_->set_motor_control(true); // TODO: match to tape motor IO state.
|
play_button_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*value = 0xff ^ (tape_player_->motor_control() ? 0x4 :0x0);
|
*value = 0xff ^ (play_button_ ? 0x4 :0x0);
|
||||||
} else {
|
} else {
|
||||||
*value = 0xff;
|
*value = 0xff;
|
||||||
}
|
}
|
||||||
@ -568,6 +566,7 @@ private:
|
|||||||
SerialPort serial_port_;
|
SerialPort serial_port_;
|
||||||
|
|
||||||
std::unique_ptr<Storage::Tape::BinaryTapePlayer> tape_player_;
|
std::unique_ptr<Storage::Tape::BinaryTapePlayer> tape_player_;
|
||||||
|
bool play_button_ = false;
|
||||||
uint8_t io_direction_ = 0x00, io_output_ = 0x00;
|
uint8_t io_direction_ = 0x00, io_output_ = 0x00;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user