mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-18 01:30:56 +00:00
Possibly fixes ColecoVision input mapping.
Also provides symbolic input from the Mac.
This commit is contained in:
parent
204d5cc964
commit
a074ee2071
@ -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;
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user