1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Merge pull request #437 from TomHarte/AppleIIPaste

Implements `type_string` for the Apple II.
This commit is contained in:
Thomas Harte 2018-05-13 11:32:45 -04:00 committed by GitHub
commit 8f1a516a2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -117,6 +117,10 @@ class ConcreteMachine:
} }
} }
// MARK - typing
std::string input_string_;
std::size_t input_string_pointer_ = std::numeric_limits<std::size_t>::max();
public: public:
ConcreteMachine(): ConcreteMachine():
m6502_(*this), m6502_(*this),
@ -197,7 +201,11 @@ class ConcreteMachine:
default: break; default: break;
case 0xc000: case 0xc000:
*value = keyboard_input_; if(input_string_pointer_ != std::numeric_limits<std::size_t>::max()) {
*value = static_cast<uint8_t>(input_string_[input_string_pointer_]) | 0x80;
} else {
*value = keyboard_input_;
}
break; break;
} }
} else { } else {
@ -217,6 +225,11 @@ class ConcreteMachine:
case 0xc010: case 0xc010:
keyboard_input_ &= 0x7f; keyboard_input_ &= 0x7f;
if(input_string_pointer_ != std::numeric_limits<std::size_t>::max()) {
++input_string_pointer_;
if(input_string_pointer_ == input_string_.size())
input_string_pointer_ = std::numeric_limits<std::size_t>::max();
}
break; break;
case 0xc030: case 0xc030:
@ -347,6 +360,25 @@ class ConcreteMachine:
return *this; return *this;
} }
void type_string(const std::string &string) override {
input_string_.clear();
input_string_.reserve(string.size());
// Commute any \ns that are not immediately after \rs to \rs; remove the rest.
bool saw_carriage_return = false;
for(auto character: string) {
if(character != '\n') {
input_string_.push_back(character);
} else {
if(!saw_carriage_return) {
input_string_.push_back('\r');
}
}
saw_carriage_return = character == '\r';
}
input_string_pointer_ = 0;
}
// MARK: ConfigurationTarget // MARK: ConfigurationTarget
void configure_as_target(const Analyser::Static::Target *target) override { void configure_as_target(const Analyser::Static::Target *target) override {
using Target = Analyser::Static::AppleII::Target; using Target = Analyser::Static::AppleII::Target;