1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-09-29 16:55:59 +00:00

Possibly fixes ColecoVision input mapping.

Also provides symbolic input from the Mac.
This commit is contained in:
Thomas Harte 2018-02-25 22:47:47 -05:00
parent 204d5cc964
commit a074ee2071
4 changed files with 46 additions and 37 deletions

View File

@ -49,33 +49,33 @@ class Joystick: public Inputs::Joystick {
else { else {
uint8_t mask = 0xf; uint8_t mask = 0xf;
switch(digital_input.info.key.symbol) { switch(digital_input.info.key.symbol) {
case '0': mask = 0x5; break; case '8': mask = 0x1; break;
case '1': mask = 0xb; break; case '4': mask = 0x2; break;
case '2': mask = 0xe; break; case '5': mask = 0x3; break;
case '3': mask = 0x3; break; case '7': mask = 0x5; break;
case '4': mask = 0x4; break;
case '5': mask = 0xc; break;
case '6': mask = 0x7; break;
case '7': mask = 0xa; break;
case '8': mask = 0x8; break;
case '9': mask = 0xd; break;
case '*': mask = 0x9; break;
case '#': mask = 0x6; break; case '#': mask = 0x6; break;
case '2': mask = 0x7; break;
case '*': mask = 0x9; break;
case '0': mask = 0xa; break;
case '9': mask = 0xb; break;
case '3': mask = 0xc; break;
case '1': mask = 0xd; break;
case '6': mask = 0xe; break;
default: break; default: break;
} }
keypad_ = (keypad_ & 0xf0) | mask; keypad_ = (keypad_ & 0xf0) | (mask ^ 0xf);
} }
break; break;
case DigitalInput::Up: if(is_active) direction_ = direction_ &= ~0x08; else direction_ |= 0x08; break; case DigitalInput::Up: if(is_active) direction_ &= ~0x01; else direction_ |= 0x01; break;
case DigitalInput::Down: if(is_active) direction_ = direction_ &= ~0x02; else direction_ |= 0x02; break; case DigitalInput::Right: if(is_active) direction_ &= ~0x02; else direction_ |= 0x02; break;
case DigitalInput::Left: if(is_active) direction_ = direction_ &= ~0x01; else direction_ |= 0x01; break; case DigitalInput::Down: if(is_active) direction_ &= ~0x04; else direction_ |= 0x04; break;
case DigitalInput::Right: if(is_active) direction_ = direction_ &= ~0x04; else direction_ |= 0x04; break; case DigitalInput::Left: if(is_active) direction_ &= ~0x08; else direction_ |= 0x08; break;
case DigitalInput::Fire: case DigitalInput::Fire:
switch(digital_input.info.control.index) { switch(digital_input.info.control.index) {
default: break; default: break;
case 0: if(is_active) direction_ = direction_ &= ~0x10; else direction_ |= 0x10; break; case 0: if(is_active) direction_ &= ~0x40; else direction_ |= 0x40; break;
case 1: if(is_active) keypad_ = keypad_ &= ~0x10; else keypad_ |= 0x10; break; case 1: if(is_active) keypad_ &= ~0x40; else keypad_ |= 0x40; break;
} }
break; break;
} }
@ -202,13 +202,15 @@ class ConcreteMachine:
time_until_interrupt_ = vdp_->get_time_until_interrupt(); time_until_interrupt_ = vdp_->get_time_until_interrupt();
break; break;
case 7: case 7: {
const std::size_t joystick_id = (address&2) >> 1;
Joystick *joystick = static_cast<Joystick *>(joysticks_[joystick_id].get());
if(joysticks_in_keypad_mode_) { if(joysticks_in_keypad_mode_) {
*cycle.value = static_cast<Joystick *>(joysticks_[address&1].get())->get_keypad_input(); *cycle.value = joystick->get_keypad_input();
} else { } else {
*cycle.value = static_cast<Joystick *>(joysticks_[address&1].get())->get_direction_input(); *cycle.value = joystick->get_direction_input();
} }
break; } break;
default: default:
*cycle.value = 0xff; *cycle.value = 0xff;
@ -216,10 +218,11 @@ class ConcreteMachine:
} }
break; break;
case CPU::Z80::PartialMachineCycle::Output: case CPU::Z80::PartialMachineCycle::Output: {
switch((address >> 5) & 7) { const int eighth = (address >> 5) & 7;
switch(eighth) {
case 4: case 6: case 4: case 6:
joysticks_in_keypad_mode_ = ((address >> 5) & 7) == 4; joysticks_in_keypad_mode_ = eighth == 4;
break; break;
case 5: case 5:
@ -235,10 +238,9 @@ class ConcreteMachine:
default: break; default: break;
} }
break; } break;
default: default: break;
break;
} }
time_since_vdp_update_ += cycle.length; time_since_vdp_update_ += cycle.length;

View File

@ -209,17 +209,17 @@ class MachineDocument:
} }
func keyDown(_ event: NSEvent) { func keyDown(_ event: NSEvent) {
self.machine.setKey(event.keyCode, isPressed: true) self.machine.setKey(event.keyCode, characters: event.characters, isPressed: true)
} }
func keyUp(_ event: NSEvent) { func keyUp(_ event: NSEvent) {
self.machine.setKey(event.keyCode, isPressed: false) self.machine.setKey(event.keyCode, characters: event.characters, isPressed: false)
} }
func flagsChanged(_ newModifiers: NSEvent) { func flagsChanged(_ newModifiers: NSEvent) {
self.machine.setKey(VK_Shift, isPressed: newModifiers.modifierFlags.contains(.shift)) self.machine.setKey(VK_Shift, characters: nil, isPressed: newModifiers.modifierFlags.contains(.shift))
self.machine.setKey(VK_Control, isPressed: newModifiers.modifierFlags.contains(.control)) self.machine.setKey(VK_Control, characters: nil, isPressed: newModifiers.modifierFlags.contains(.control))
self.machine.setKey(VK_Command, isPressed: newModifiers.modifierFlags.contains(.command)) self.machine.setKey(VK_Command, characters: nil, isPressed: newModifiers.modifierFlags.contains(.command))
self.machine.setKey(VK_Option, isPressed: newModifiers.modifierFlags.contains(.option)) self.machine.setKey(VK_Option, characters: nil, isPressed: newModifiers.modifierFlags.contains(.option))
} }
} }

View File

@ -41,7 +41,7 @@
- (void)setView:(CSOpenGLView *)view aspectRatio:(float)aspectRatio; - (void)setView:(CSOpenGLView *)view aspectRatio:(float)aspectRatio;
- (void)drawViewForPixelSize:(CGSize)pixelSize onlyIfDirty:(BOOL)onlyIfDirty; - (void)drawViewForPixelSize:(CGSize)pixelSize onlyIfDirty:(BOOL)onlyIfDirty;
- (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed; - (void)setKey:(uint16_t)key characters:(NSString *)characters isPressed:(BOOL)isPressed;
- (void)clearAllKeys; - (void)clearAllKeys;
@property (nonatomic, strong) CSAudioQueue *audioQueue; @property (nonatomic, strong) CSAudioQueue *audioQueue;

View File

@ -192,7 +192,7 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
} }
} }
- (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed { - (void)setKey:(uint16_t)key characters:(NSString *)characters isPressed:(BOOL)isPressed {
auto keyboard_machine = _machine->keyboard_machine(); auto keyboard_machine = _machine->keyboard_machine();
if(keyboard_machine) { if(keyboard_machine) {
@synchronized(self) { @synchronized(self) {
@ -267,8 +267,15 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
case VK_RightArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Right, isPressed); break; case VK_RightArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Right, isPressed); break;
case VK_UpArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Up, isPressed); break; case VK_UpArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Up, isPressed); break;
case VK_DownArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Down, isPressed); break; case VK_DownArrow: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Down, isPressed); break;
case VK_Space: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Fire, isPressed); break;
case VK_ANSI_A: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput(Inputs::Joystick::DigitalInput::Fire, 0), isPressed); break;
case VK_ANSI_S: joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput(Inputs::Joystick::DigitalInput::Fire, 1), isPressed); break;
default: default:
joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Fire, isPressed); break; if(characters) {
joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput([characters characterAtIndex:0]), isPressed);
} else {
joysticks[0]->set_digital_input(Inputs::Joystick::DigitalInput::Fire, isPressed);
}
break; break;
} }
} }