diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-04-14 00:24:27 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-04-14 00:24:27 +0300 |
| commit | b907f409e0062a70cab114fff72db3d31c97ae2f (patch) | |
| tree | 5bf44f092f6ac340bea20877ea664d5abd68ee17 /atk16_emu | |
| parent | afe7b17b1de1a34d384e72f49d402ea5ee4591cd (diff) | |
Improve key mapping
Diffstat (limited to 'atk16_emu')
| -rw-r--r-- | atk16_emu/peripherals.py | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/atk16_emu/peripherals.py b/atk16_emu/peripherals.py index 343f32d..96db2a3 100644 --- a/atk16_emu/peripherals.py +++ b/atk16_emu/peripherals.py @@ -10,7 +10,7 @@ class Peripherals: def __init__(self, set_irq_line: Callable[[int], None]): pygame.init() self.graphics = Graphics() - self.keyboard = Keyboard() + self.keyboard = Keyboard(set_irq_line=set_irq_line) self.terminal = Terminal() self.set_irq_line = set_irq_line @@ -20,8 +20,9 @@ class Peripherals: if event.type == pygame.QUIT: sys.exit(0) elif event.type == pygame.KEYDOWN: - self.keyboard.set_latest_pressed(event.key) - self.set_irq_line(IRQ_LINE_KEYBOARD) + self.keyboard.set_key_down(event.key) + elif event.type == pygame.KEYUP: + self.keyboard.set_key_up(event.key) self.graphics.step() @@ -128,16 +129,35 @@ class DummyGraphics: pass class Keyboard: - def __init__(self): + def __init__(self, set_irq_line: Callable[[int], None]): # mimic electronic behaviour my assigning a random value at start self.latest_pressed: int = random.randrange(0, 2 ** 16) + self.shift_pressed = False + self.set_irq_line = set_irq_line - def set_latest_pressed(self, i: int): - if i < 0 or i > 0xFFFF: - # sometimes the keycodes are out of range, don't know why + def set_key_down(self, i: int): + print("key:", i) + + if i == pygame.K_LSHIFT or i == pygame.K_RSHIFT: + self.shift_pressed = True return - self.latest_pressed = i + if i == pygame.K_RETURN: + self.latest_pressed = 10 + + elif 0 <= i <= 0xFFFF: + # sometimes the keycodes are out of range, don't know why + if self.shift_pressed: + self.latest_pressed = i - 32 # FIXME this only works for uppercase letters + # for e.g. shift + 1 should be "!" but it's something else + else: + self.latest_pressed = i + + self.set_irq_line(IRQ_LINE_KEYBOARD) + + def set_key_up(self, i: int): + if i == pygame.K_LSHIFT or i == pygame.K_RSHIFT: + self.shift_pressed = False def read(self) -> int: return self.latest_pressed |
