1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-23 05:29:23 +00:00

Mostly hide state.

This commit is contained in:
Thomas Harte 2024-01-01 15:15:40 -05:00
parent 2698ac2d0f
commit 26123bf399

View File

@ -281,7 +281,7 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
control_is_pressed_ =
shift_is_pressed_ =
repeat_is_pressed_ =
key_is_down =
key_is_down_ =
character_is_pressed_ = false;
}
@ -348,7 +348,7 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
if constexpr (!is_iie()) {
if(is_pressed && (!is_repeat || character_is_pressed_)) {
keyboard_input = uint8_t(last_pressed_character_ | 0x80);
keyboard_input_ = uint8_t(last_pressed_character_ | 0x80);
}
}
return true;
@ -405,14 +405,14 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
if(is_pressed) {
last_pressed_character_ = value;
character_is_pressed_ = true;
keyboard_input = uint8_t(value | 0x80);
key_is_down = true;
keyboard_input_ = uint8_t(value | 0x80);
key_is_down_ = true;
} else {
if(value == last_pressed_character_) {
character_is_pressed_ = false;
}
if((keyboard_input & 0x3f) == value) {
key_is_down = false;
if((keyboard_input_ & 0x3f) == value) {
key_is_down_ = false;
}
}
@ -420,27 +420,38 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
}
uint8_t get_keyboard_input() {
if(string_serialiser) {
return string_serialiser->head() | 0x80;
if(string_serialiser_) {
return string_serialiser_->head() | 0x80;
} else {
return keyboard_input;
return keyboard_input_;
}
}
void clear_keyboard_input() {
keyboard_input_ &= 0x7f;
if(string_serialiser_ && !string_serialiser_->advance()) {
string_serialiser_.reset();
}
}
bool get_key_is_down() {
return key_is_down_;
}
void set_string_serialiser(std::unique_ptr<Utility::StringSerialiser> &&serialiser) {
string_serialiser_ = std::move(serialiser);
}
// The IIe has three keys that are wired directly to the same input as the joystick buttons.
bool open_apple_is_pressed = false;
bool closed_apple_is_pressed = false;
// Current keyboard input register, as exposed to the programmer; on the IIe the programmer
// can also poll for whether any key is currently down.
uint8_t keyboard_input = 0x00;
bool key_is_down = false;
// A string serialiser for receiving copy and paste.
std::unique_ptr<Utility::StringSerialiser> string_serialiser;
private:
// Current keyboard input register, as exposed to the programmer; on the IIe the programmer
// can also poll for whether any key is currently down.
uint8_t keyboard_input_ = 0x00;
bool key_is_down_ = false;
// ASCII input state, referenced by the REPT key on models before the IIe.
char last_pressed_character_ = 0;
bool character_is_pressed_ = false;
@ -452,6 +463,9 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
bool shift_is_pressed_ = false;
bool control_is_pressed_ = false;
// A string serialiser for receiving copy and paste.
std::unique_ptr<Utility::StringSerialiser> string_serialiser_;
// 6502 connection, for applying the reset button.
Processor *const m6502_;
};
@ -768,15 +782,11 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
break;
case 0xc010:
keyboard_.keyboard_input &= 0x7f;
if(keyboard_.string_serialiser) {
if(!keyboard_.string_serialiser->advance())
keyboard_.string_serialiser.reset();
}
keyboard_.clear_keyboard_input();
// On the IIe, reading C010 returns additional key info.
if(is_iie() && isReadOperation(operation)) {
*value = (keyboard_.key_is_down ? 0x80 : 0x00) | (keyboard_.keyboard_input & 0x7f);
*value = (keyboard_.get_key_is_down() ? 0x80 : 0x00) | (keyboard_.get_keyboard_input() & 0x7f);
}
break;
@ -920,7 +930,7 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
}
void type_string(const std::string &string) final {
keyboard_.string_serialiser = std::make_unique<Utility::StringSerialiser>(string, true);
keyboard_.set_string_serialiser(std::make_unique<Utility::StringSerialiser>(string, true));
}
bool can_type(char c) const final {