diff --git a/Machines/Commodore/Vic-20/Keyboard.cpp b/Machines/Commodore/Vic-20/Keyboard.cpp index e868c9772..2d4152b7b 100644 --- a/Machines/Commodore/Vic-20/Keyboard.cpp +++ b/Machines/Commodore/Vic-20/Keyboard.cpp @@ -24,7 +24,7 @@ uint16_t KeyboardMapper::mapped_key_for_key(Inputs::Keyboard::Key key) { BIND(Z, KeyZ); BIND(X, KeyX); BIND(C, KeyC); BIND(V, KeyV); BIND(B, KeyB); BIND(N, KeyN); BIND(M, KeyM); - BIND(BackTick, KeyLeft); + BIND(BackTick, KeyLeftArrow); BIND(Hyphen, KeyPlus); BIND(Equals, KeyDash); BIND(F11, KeyGBP); @@ -35,8 +35,8 @@ uint16_t KeyboardMapper::mapped_key_for_key(Inputs::Keyboard::Key key) { BIND(CloseSquareBracket, KeyAsterisk); BIND(Backslash, KeyRestore); - BIND(Hash, KeyUp); - BIND(F10, KeyUp); + BIND(Hash, KeyUpArrow); + BIND(F10, KeyUpArrow); BIND(Semicolon, KeyColon); BIND(Quote, KeySemicolon); @@ -56,6 +56,8 @@ uint16_t KeyboardMapper::mapped_key_for_key(Inputs::Keyboard::Key key) { BIND(Right, KeyRight); BIND(Down, KeyDown); + BIND(Left, KeyLeft); + BIND(Up, KeyUp); BIND(Enter, KeyReturn); BIND(Space, KeySpace); diff --git a/Machines/Commodore/Vic-20/Keyboard.hpp b/Machines/Commodore/Vic-20/Keyboard.hpp index 7437f3420..ec775fd96 100644 --- a/Machines/Commodore/Vic-20/Keyboard.hpp +++ b/Machines/Commodore/Vic-20/Keyboard.hpp @@ -20,7 +20,7 @@ enum Key: uint16_t { Key2 = key(7, 0x01), Key4 = key(7, 0x02), Key6 = key(7, 0x04), Key8 = key(7, 0x08), Key0 = key(7, 0x10), KeyDash = key(7, 0x20), KeyHome = key(7, 0x40), KeyF7 = key(7, 0x80), KeyQ = key(6, 0x01), KeyE = key(6, 0x02), KeyT = key(6, 0x04), KeyU = key(6, 0x08), - KeyO = key(6, 0x10), KeyAt = key(6, 0x20), KeyUp = key(6, 0x40), KeyF5 = key(6, 0x80), + KeyO = key(6, 0x10), KeyAt = key(6, 0x20), KeyUpArrow = key(6, 0x40), KeyF5 = key(6, 0x80), KeyCBM = key(5, 0x01), KeyS = key(5, 0x02), KeyF = key(5, 0x04), KeyH = key(5, 0x08), KeyK = key(5, 0x10), KeyColon = key(5, 0x20), KeyEquals = key(5, 0x40), KeyF3 = key(5, 0x80), KeySpace = key(4, 0x01), KeyZ = key(4, 0x02), KeyC = key(4, 0x04), KeyB = key(4, 0x08), @@ -29,12 +29,17 @@ enum Key: uint16_t { KeyN = key(3, 0x10), KeyComma = key(3, 0x20), KeySlash = key(3, 0x40), KeyDown = key(3, 0x80), KeyControl = key(2, 0x01), KeyA = key(2, 0x02), KeyD = key(2, 0x04), KeyG = key(2, 0x08), KeyJ = key(2, 0x10), KeyL = key(2, 0x20), KeySemicolon = key(2, 0x40), KeyRight = key(2, 0x80), - KeyLeft = key(1, 0x01), KeyW = key(1, 0x02), KeyR = key(1, 0x04), KeyY = key(1, 0x08), + KeyLeftArrow= key(1, 0x01), KeyW = key(1, 0x02), KeyR = key(1, 0x04), KeyY = key(1, 0x08), KeyI = key(1, 0x10), KeyP = key(1, 0x20), KeyAsterisk = key(1, 0x40), KeyReturn = key(1, 0x80), Key1 = key(0, 0x01), Key3 = key(0, 0x02), Key5 = key(0, 0x04), Key7 = key(0, 0x08), Key9 = key(0, 0x10), KeyPlus = key(0, 0x20), KeyGBP = key(0, 0x40), KeyDelete = key(0, 0x80), - KeyRestore = 0xfffd + // Virtual keys. + KeyUp = 0xfff0, + KeyLeft = 0xfff1, + + // Physical keys not within the usual matrix. + KeyRestore = 0xfffd, #undef key }; diff --git a/Machines/Commodore/Vic-20/Vic20.cpp b/Machines/Commodore/Vic-20/Vic20.cpp index 0697d5e96..5123f394d 100644 --- a/Machines/Commodore/Vic-20/Vic20.cpp +++ b/Machines/Commodore/Vic-20/Vic20.cpp @@ -479,10 +479,23 @@ class ConcreteMachine: } void set_key_state(uint16_t key, bool is_pressed) final { - if(key != KeyRestore) + if(key < 0xfff0) { keyboard_via_port_handler_->set_key_state(key, is_pressed); - else - user_port_via_.set_control_line_input(MOS::MOS6522::Port::A, MOS::MOS6522::Line::One, !is_pressed); + } else { + switch(key) { + case KeyRestore: + user_port_via_.set_control_line_input(MOS::MOS6522::Port::A, MOS::MOS6522::Line::One, !is_pressed); + break; + case KeyUp: + keyboard_via_port_handler_->set_key_state(KeyLShift, is_pressed); + keyboard_via_port_handler_->set_key_state(KeyDown, is_pressed); + break; + case KeyLeft: + keyboard_via_port_handler_->set_key_state(KeyLShift, is_pressed); + keyboard_via_port_handler_->set_key_state(KeyRight, is_pressed); + break; + } + } } void clear_all_keys() final {