From 78100ad8e11d5959ea1186403340b0c8ab035ce1 Mon Sep 17 00:00:00 2001 From: topicchi Date: Fri, 13 Mar 2026 17:57:54 +0000 Subject: [PATCH] --- .../advanced/CircuitPython 10.x/code.py | 221 ++++++++++++++++++ .../lib/adafruit_hid/__init__.mpy | Bin 0 -> 744 bytes .../lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 625 bytes .../adafruit_hid/consumer_control_code.mpy | Bin 0 -> 379 bytes .../lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1203 bytes .../lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1216 bytes .../lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 338 bytes .../lib/adafruit_hid/keycode.mpy | Bin 0 -> 1978 bytes .../lib/adafruit_hid/mouse.mpy | Bin 0 -> 856 bytes .../CircuitPython 10.x/lib/adafruit_ticks.mpy | Bin 0 -> 694 bytes .../lib/asyncio/__init__.mpy | Bin 0 -> 473 bytes .../CircuitPython 10.x/lib/asyncio/core.mpy | Bin 0 -> 3312 bytes .../CircuitPython 10.x/lib/asyncio/event.mpy | Bin 0 -> 388 bytes .../CircuitPython 10.x/lib/asyncio/funcs.mpy | Bin 0 -> 1147 bytes .../CircuitPython 10.x/lib/asyncio/lock.mpy | Bin 0 -> 597 bytes .../CircuitPython 10.x/lib/asyncio/stream.mpy | Bin 0 -> 2203 bytes .../CircuitPython 10.x/lib/asyncio/task.mpy | Bin 0 -> 1403 bytes .../lib/asyncio/traceback.mpy | Bin 0 -> 649 bytes .../advanced/CircuitPython 9.x/code.py | 221 ++++++++++++++++++ .../lib/adafruit_hid/__init__.mpy | Bin 0 -> 744 bytes .../lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 625 bytes .../adafruit_hid/consumer_control_code.mpy | Bin 0 -> 379 bytes .../lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1203 bytes .../lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1216 bytes .../lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 338 bytes .../lib/adafruit_hid/keycode.mpy | Bin 0 -> 1978 bytes .../lib/adafruit_hid/mouse.mpy | Bin 0 -> 856 bytes .../CircuitPython 9.x/lib/adafruit_ticks.mpy | Bin 0 -> 694 bytes .../lib/asyncio/__init__.mpy | Bin 0 -> 473 bytes .../CircuitPython 9.x/lib/asyncio/core.mpy | Bin 0 -> 3312 bytes .../CircuitPython 9.x/lib/asyncio/event.mpy | Bin 0 -> 388 bytes .../CircuitPython 9.x/lib/asyncio/funcs.mpy | Bin 0 -> 1147 bytes .../CircuitPython 9.x/lib/asyncio/lock.mpy | Bin 0 -> 597 bytes .../CircuitPython 9.x/lib/asyncio/stream.mpy | Bin 0 -> 2203 bytes .../CircuitPython 9.x/lib/asyncio/task.mpy | Bin 0 -> 1403 bytes .../lib/asyncio/traceback.mpy | Bin 0 -> 649 bytes .../advanced/README.txt | 8 + .../basic/CircuitPython 10.x/code.py | 43 ++++ .../lib/adafruit_hid/__init__.mpy | Bin 0 -> 744 bytes .../lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 625 bytes .../adafruit_hid/consumer_control_code.mpy | Bin 0 -> 379 bytes .../lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1203 bytes .../lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1216 bytes .../lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 338 bytes .../lib/adafruit_hid/keycode.mpy | Bin 0 -> 1978 bytes .../lib/adafruit_hid/mouse.mpy | Bin 0 -> 856 bytes .../basic/CircuitPython 9.x/code.py | 43 ++++ .../lib/adafruit_hid/__init__.mpy | Bin 0 -> 744 bytes .../lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 625 bytes .../adafruit_hid/consumer_control_code.mpy | Bin 0 -> 379 bytes .../lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1203 bytes .../lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1216 bytes .../lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 338 bytes .../lib/adafruit_hid/keycode.mpy | Bin 0 -> 1978 bytes .../lib/adafruit_hid/mouse.mpy | Bin 0 -> 856 bytes .../basic/README.txt | 8 + 56 files changed, 544 insertions(+) create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/code.py create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/consumer_control_code.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_ticks.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/core.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/event.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/funcs.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/lock.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/stream.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/task.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/traceback.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/code.py create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/consumer_control_code.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_ticks.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/core.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/event.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/funcs.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/lock.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/stream.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/task.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/traceback.mpy create mode 100644 trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/README.txt create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/code.py create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/consumer_control_code.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/code.py create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/consumer_control_code.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy create mode 100644 trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/README.txt diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/code.py b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/code.py new file mode 100644 index 00000000..ca037f67 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/code.py @@ -0,0 +1,221 @@ +# SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Commodore 16 to USB HID adapter with Adafruit KB2040 +# +# Note that: +# * This matrix is different than the (more common) Commodore 64 matrix +# * There are no diodes, not even on modifiers, so there's only 2-key rollover. + +import asyncio.core +import board +import keypad +from adafruit_hid.keycode import Keycode as K +from adafruit_hid.keyboard import Keyboard +import usb_hid + +# True to use a more POSITIONAL mapping, False to use a more PC-style mapping +POSITIONAL = True + +# Keyboard schematic from +# https://archive.org/details/SAMS_Computerfacts_Commodore_C16_1984-12_Howard_W_Sams_Co_CC8/page/n9/mode/2up +# 1 3 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # connector pins +# R5 C7 R7 C4 R1 C5 C6 R3 R2 R4 C2 C1 R6 C3 C0 R0 # row/column in schematic +# D2 D3 D4 D5 D6 D7 D8 D9 D10 MOSI MISO SCK A0 A1 A2 A3 # conencted to kb2040 at +# results in the the following assignment of rows and columns: +rows = [board.A3, board.D6, board.D10, board.D9, board.MOSI, board.D2, board.A0, board.D4] +cols = [board.A2, board.SCK, board.MISO, board.A1, board.D5, board.D7, board.D8, board.D3] + +# ROM listing of key values from ed7.src in +# http://www.zimmers.net/anonftp/pub/cbm/src/plus4/ted_kernal_basic_src.tar.gz +# shows key matrix arrangement (it's nuts) +# del return £ f8 f1 f2 f3 @ +# 3 w a 4 z s e shift +# 5 r d 6 c f t x +# 7 y g 8 b h u v +# 9 i j 0 m k o n +# down p l up . : - , +# left * ; right escape = + / +# 1 home control 2 space c=key q stop + +# Implement an FN-key for some keys not present on the default keyboard +class FnState: + def __init__(self): + self.state = False + + def fn_event(self, event): + self.state = event.pressed + + def fn_modify(self, keycode): + if self.state: + return self.mods.get(keycode, keycode) + return keycode + + mods = { + K.ONE: K.F1, + K.TWO: K.F2, + K.THREE: K.F3, + K.FOUR: K.F4, + K.FIVE: K.F5, + K.SIX: K.F6, + K.SEVEN: K.F7, + K.EIGHT: K.F8, + K.NINE: K.F9, + K.ZERO: K.F10, + K.F1: K.F11, + K.F2: K.F12, + K.UP_ARROW: K.PAGE_UP, + K.DOWN_ARROW: K.PAGE_DOWN, + K.LEFT_ARROW: K.HOME, + K.RIGHT_ARROW: K.END, + K.BACKSPACE: K.DELETE, + K.F3: K.INSERT, + } +fn_state = FnState() + +K_FN = fn_state.fn_event + +# A tuple is special, it: +# * Clears shift modifiers & pressed keys +# * Presses the given sequence +# * Releases all pressed keys +# * Restores the original modifiers +# It's mostly used to send a key that requires a shift keypress on a standard +# keyboard (or which is mapped to a shifted key but requires that shift NOT +# be pressed) +# +# A consequence of this is that the key will not repeat, even if it is held +# down. So for example in the positional mapping, shift-1 will repeat "!" +# but shift-7 will not repeat "'" and shift-0 will not repeat "^". +K_AT = (K.SHIFT, K.TWO) +K_PLUS = (K.SHIFT, K.EQUALS) +K_ASTERISK = (K.SHIFT, K.EIGHT) +K_COLON = (K.SHIFT, K.SEMICOLON) + +# We need these mask values for the reasons discussed above +MASK_LEFT_SHIFT = K.modifier_bit(K.LEFT_SHIFT) +MASK_RIGHT_SHIFT = K.modifier_bit(K.RIGHT_SHIFT) +MASK_ANY_SHIFT = (MASK_LEFT_SHIFT | MASK_RIGHT_SHIFT) + +if POSITIONAL: + keycodes = [ + K.BACKSPACE, K.ENTER, K.BACKSLASH, K.F8, K.F1, K.F2, K.F3, K_AT, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K_COLON, K.MINUS, K.COMMA, + K.LEFT_ARROW, K_ASTERISK, K.SEMICOLON, K.RIGHT_ARROW, K.ESCAPE, K.EQUALS, K_PLUS, + K.FORWARD_SLASH, K.ONE, K_FN, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, + ] + + shifted = { + K.TWO: (K.SHIFT, K.QUOTE), # double quote + K.SIX: (K.SHIFT, K.SEVEN), # ampersand + K.SEVEN: (K.QUOTE,), # single quote + K.EIGHT: (K.SHIFT, K.NINE), # left paren + K.NINE: (K.SHIFT, K.ZERO), # right paren + K.ZERO: (K.SHIFT, K.SIX), # caret + K_AT: (K.SHIFT, K.LEFT_BRACKET), + K_PLUS: (K.SHIFT, K.RIGHT_BRACKET), + K_COLON: (K.LEFT_BRACKET,), + K.SEMICOLON: (K.RIGHT_BRACKET,), + K.EQUALS: (K.TAB,), + } +else: + # TODO clear/home, up/down positional arrows + keycodes = [ + K.BACKSPACE, K.ENTER, K.LEFT_ARROW, K.F8, K.F1, K.F2, K.F3, K.LEFT_BRACKET, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K.SEMICOLON, K.QUOTE, K.COMMA, + K.BACKSLASH, K_ASTERISK, K.SEMICOLON, K.EQUALS, K.ESCAPE, K.RIGHT_ARROW, K.RIGHT_BRACKET, + K.FORWARD_SLASH, K.ONE, K.HOME, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, + ] + + shifted = { + } +class AsyncEventQueue: + def __init__(self, events): + self._events = events + + async def __await__(self): + await asyncio.core._io_queue.queue_read(self._events) + return self._events.get() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + +class XKROFilter: + """Perform an X-key rollover algorithm, blocking ghosts if more than X keys are pressed at once + +A key matrix without diodes can support 2-key rollover. + """ + def __init__(self, rollover=2): + self._count = 0 + self._rollover = rollover + self._real = [0] * 64 + self._ghost = [0] * 64 + + def __call__(self, event): + self._ghost[event.key_number] = event.pressed + if event.pressed: + if self._count < self._rollover: + self._real[event.key_number] = True + yield event + self._count += 1 + else: + self._real[event.key_number] = False + yield event + self._count -= 1 + +twokey_filter = XKROFilter(2) + +async def key_task(): + # Initialize Keyboard + kbd = Keyboard(usb_hid.devices) + + with keypad.KeyMatrix(rows, cols) as keys, AsyncEventQueue(keys.events) as q: + while True: + ev = await q + for ev in twokey_filter(ev): + keycode = keycodes[ev.key_number] + if callable(keycode): + keycode = keycode(ev) + keycode = fn_state.fn_modify(keycode) + if keycode is None: + continue + old_report_modifier = kbd.report_modifier[0] + shift_pressed = old_report_modifier & MASK_ANY_SHIFT + if shift_pressed: + keycode = shifted.get(keycode, keycode) + if isinstance(keycode, tuple): + if ev.pressed: + kbd.report_modifier[0] = old_report_modifier & ~MASK_ANY_SHIFT + kbd.press(*keycode) + kbd.release_all() + kbd.report_modifier[0] = old_report_modifier + elif ev.pressed: + kbd.press(keycode) + else: + kbd.release(keycode) + + +async def forever_task(): + while True: + await asyncio.sleep(.1) + +async def main(): + forever = asyncio.create_task(forever_task()) + key = asyncio.create_task(key_task()) + await asyncio.gather( # Don't forget the await! + forever, + key, + ) + +asyncio.run(main()) diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5f156d1581b8bfe5e1f820b57ac6d25a49df2daf GIT binary patch literal 744 zcmYjN%Wl&^6dfmVaMRRvonWAigyp2DK(YH$LEQk3Nt04Uttv{5ga+51BqOD^vB#Cl z%H4Ir#}u0EktqBDLfz063;u#h`cP*vbMBmT&wW(0;QlnbV7qoZj4^>->}n8Vk3y&h z2VhdNJkXLh5I=2Lm+IUk1_Hb1oGq{z+MOB4YZGG z%*WC0&>G}c)kXCg;D@<>On}tJo(tUzRWXk24uS!_KyHLVF6to^06vVpQMu`%k>h(F zatLz48wtXF6h^c;+K~WZhytG?{=zW=hs*w9)n?bagapx=rgbps#=ENH?`c;fYcH>6 zuj0_5JJ>oPUFuhF7%G(mc059~$DwmbqjJ@cd#+4(A`g3)_iW;H>8vu<%NJ!;z@-<} z1$L=s;~sKl;>*K@V!MYwp_@9n5y{PMUA`XZIXK#!uP`6vB)3^p-qw_+qcm$3HxW{g zn3;4bC8eyyoXJR;I!9ktVmBsQQ{uT%vrLMa_jNuIvQ&Djl$Em9Ms7q_txJZZ%vgz& zIO|3lM@bi!&s+bFj*=H^`P&oxc=99}dstCspDJ^+9j!h8 zN{JrKDNF03bX;auQigH-nE7U&9>dqlk3nJL%bBq=DDYp;3{#W_BSn31YSE+XdZ};z zG1kR9<wV{1a`<=W-S29}vc!Ak46V_3{sWn(*iQfe literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ae562e436d9047648f3edf5328676a07fc00c231 GIT binary patch literal 625 zcmYjNU2hUW6rBMIg>IMG55|^{cH2Iv4MIfZ!T3O=X-LyXNx#B_!F6}qZiL-+X0}R< z$$(AM2Y(FsSA6i%zv8SV#+P%?%{e*e=62Fxa|^a@*S?^U#|KxQTXzDVMI%B7l5iRf zYvCB=(`?K@*&BsJG9o^=xfl3Ay(W~!Wb#;HoJI}@_`>tuflIDEhkztHCLbf>ORDg3 z==qmGjoACR1#EN{HFCx+V8@J@eMttP1d#j7fy%uR2_g=x_?Y{v7TM~6k}#kgObfY? z62^c^$&lEL06nyw4+GEV0Z6^<0?dd!Y2iMqKY2bi)cX(yCb0M~*a=($mY#n3YI)4^ z18%V>j2nn+dA`;0s3Sl0X3Vbw-)hu8TLHC(!6!n&ty?X_cb3TPSC94&w+~-CqE|}b zgqARpMoOH1`?YtZt?vMHNh`Ks6A~$>ae9I>yRfue&frYHYYLQ=TdthN*}l|Q@XA5% zTwDLW*XbX?wwX%VPC9+h{%#r#XBb6h((saYc|t$%~bemq=`s1VJrq)?v^^_Jf&Oz-mCih*2R3g&orvf3~YZ zr7^F#@1ApMob2zATDRZ5pUj3+^)T!gdZU-u+4EqcqGvi8Jw@3c9FN~fI!_lW$}dAB zK?+CZBxls;6|!5kg;Z6ax9q4zwB>jevL~qRDUY?KlH8^@B>xQp&YF%NiUl-<^aGM$ zHAW@L26g*Z1$HPHG2Kuyl56_)&}FK^C}%G7T db4a3gA%*%5wopGp8ubt?oR1-c^AT(}dY^Owv@J(X*)fZQlMK}WRNXbYfZeunSl@}bh}t;HJfRfIpD;?)R}3u z7wQ>OYCnPB!7FF@vwQ2V>?Yp27i1Ho#$>Ne`~;r<0W~p`%z2;pJm>knGlzGA*=1^_ zDpwD*hGK}HDDv{BsI{+FH91vpfeF)Z9>N3VSQcf}R3rpOd|Rj`sWJjSV(b_6F8Zv2 zj>)FiXw{YDL*Q%Z`@Jkc6LUWd%rOnUdWgh2c>#C720lYMLTbYRG4Td^gYjypu4)FD z8LZ-wDk}#H(f}Mb$N?Qdv4&((H>yTM2kyFtbR8^-Rax%k^=1O${{kuT2(j5NeL-UGSm>{ z?YY!ru)Tcmop5eV5O<2(VlK~bfk;pB@891Y$eEtp(1A%YM`U=d)l|^ufbNm{_wl8Z0^rnGicpmp9?LD|;<>!EifP9pH8m1- zKu6i6M@fArItoWg?IiVB)CryC4F=OLqQ;{x=qlsFlpDG?-6enQH-Rs2QV%~!1KN{u zKuq)p3}wyPa(hr8qcyD(0B;G78)CotKD^IiBxVUgN> z8$fTGf}yknhSMW3k{*Rq={pdnop92>kRHoWa60XRvju7V6uh9KUUqQ;vv^$Vj;S#< zFly7UnY6D%Pn=~sloh4}Z+0_e^#_)$pg%)lGvz2+;lNOy6#6na2dpqtkWN;A!g!Sq zv3MPalB_Lmxu04LJj+sLE@K60=5-Q6#H};T;tKZMIw$|nxxxA(EUw3rDa>t_o?sGT z@0qVk-E01>@_$0j%6A0sn__XZ5?ipCkZrz8l`STc1q9joVsjp{WB9As0>3RJ6DSd1 z+f1$moJ`ctQcur>Z7UeS9~RGk|9Fr4fnb6^V(z2T)%iv7*(H7{tlQ@odj;vzekpJT zi44%W=I@pa3Wd#|@T!{N-*?agg4h2$Ha2glwKQol{ EH}z(GO#lD@ literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4f04cda1f1922197fc1c3125ece9f09c13aabdb6 GIT binary patch literal 1216 zcmZ9JUsD=a6u|GIAP|BpySX(6;}!%W7*I-?j86zFe}t$APD-Yo%et(>6kTRntxU#t z*U|~oevm%&Wr6qs65B6eU(yGgnS24K4}I_5MLM0%ojL#RIlpu6xhV@+ST$w28h0R_ zG-On7)FNLCoqds$YN*L|#1k3qb8R8q>VRo``J~kpfJ5%I8pnr#%-u1Vq?RPK+rYh>%Vf)Fy--G}ZFU3DrED%; zM(M(OW^5aAC<#pg6A;&If{Pr3_&O&cSwwgQUaSd#-rCq;bxvj%%%!%UCv#ia&u>&p zfHtBdrn=;43bHInz;b+YWV}ExZ-b8NTS45ucq*($pZy;`o5fRZ?4tEjDwhL{p-_2S z#~af!p2A+L zuvp8^DWoY#JeqKupsAvglh`)9C*fpe)Ba+H`M{t zQ4gRq2;jmpfR9N#q_KVw1@PWZkSKjdKu1y6Cg_Szz`5uooR69zRpc#abIyByvyxD3 zeQnlUe<~7Pp-`6N-oT&6QYWkMl)z$UKw|5sLzA()G zoiP&!l_LLR_NSS!%fA#3ZrV=ugO5R~VznhXy0w1u;Sx6#x94O}i|E7*R?7{cVwdZGGvV^GB2m#TD@B19}5X zfl>y~hoAIrp!~u9ht?m_uo}@q;0o`9zF~7i`q5}j17l64A??;EQg^OzgC@M3WCo`U zurcJnw|d|_Zuzq^6$%FYt`O#F)Z-g=6HCL}<1rQo(pdKQc!j^HM|G7{e*k?MVzK}L literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..90951e9e435ed336be90732d1d532a7ab94610f1 GIT binary patch literal 338 zcmZ=}W02=!bV*D}Oe-qQEQ!y^OwrFytxU>KEJ}&bNvzB-Er~BJ)+?xF;8*d6iu-_t zof3;v88pz&$e`E!5@Y6%>_}RaDhB8*kIwzGHq%Yg>CqXIFPmZ(sj} ziIXNznL2IyjG41$&zY-lXs~##DGMtbI|nBhHxDl#zkr~Su!yLbxP+vXw2bWfjT^T5 zFf`dn2rwonG_dD%Pj3`p(qfcmmSGZOiVQJg5MU8xGGP{D5o8f#4NPWiG+^Li>ELe= UQV?VlV;5i%<4|T0;|xp&08!Lkz5oCK literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..9a350a7f8594b22bbc86ff09550a10023ed3a4bb GIT binary patch literal 1978 zcmb7EX>$`t5N!`e2w{w5oEOI-;53Gigv;{Dt(CO079G3Zl`PvFvMt$QE`xz2Bm`zt zImkuGec$&Dm4CypNLBtoX0=*EQhZ5G_1o^A?N-meH%f(QgS(2h&(vq;mo6?`s2*Ra z?>ISkskT_3+kW;Et!dBs0d<{TtS`(j%q>-C7cNj&UeA=ODYICz%{+D3#%Q)w9W5KQ zW80w6NF+(5NTf;VBr+sMNn}YFBo30uk;s!MkSLNcNmwMtNZ2GC5+xF465}K)Bqm5q zl9-~9S=1?1s+bfhWo=!jaK;&IQqC=q=@bfLE)mI3c^#mtt#|lNw=xZ z)=Oo(NNu{4(kz`il3FU~SX#A6x>iw~@mUo(mP1>qTFHyID z*dX+q<+$YDo7^(8#9EifZAX zR zo@UsPRD(chmX$YBTFLMPV3`%Az@VrpC`DDj$Jc-dgB}cdFzmsI2Oh6+kJq@zYdr3O zR}mke_TbX_WH?zPqa@`&qCP+Q5`{DcZKl;2!cTj*Gvq;g#V9KB9IurUqT;(L>7a9y zbH8WvZhQUQRiWCc^VHt_e;~Ir8flsCk>OIDqGCWmjMZBHsE4nI#kJKky0Pbfuf)A8 zdhc`!yxyMwtVD0(?#!m1J1f!feDt${A3Xi+z42b}{F75&uc`}dbI;vtQz90^il{*N zd8~W^kr%P*CA3|`>X*^}3f8=e=xd0*j*jbC`vy91;J!D3w{ZX4=z0eayo>Jl@ZkGc z_W>UI5bHm}hL6$n2_F6w{24ZWj@~b@=}T<>3Xgn^E#KhLZ}Hf7c>H^8{Q=uz+pzsd z?Dz>ge@5Rgh{xjS{}ltjVeoeh@lFhLA4WKiUEGh|Jb*nsh`l_7eLRf)Jc0wf3klv0 zjrSnQdy(RONb`Q^d;l4i35>GTkY$;K!7_z|EYrxb)RAYIL4oBciY&7*SsJid9>f^S z9Bh_(I4lb&u`Hs@(!@AR3l)}Qm|$sRlBI(wmL(iwS;k?O<2b^yf}<=aP-QuZX_ix% zVR;C%EDxi`@(AiIk7ABx74s~oag5~*j84IgisUkKqi<<5*<5 zfU_)5;2g`7SYmk!=UJY{1(s)Uk>w(uV0ji#vOI^UST5lb%ky}e-D$MOTJa3KGq@bP zjAz-M#g*68yK8{q|pf)@1E(0K&ub literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy new file mode 100644 index 0000000000000000000000000000000000000000..412d8bceda72440edc9761a99b347d3505233787 GIT binary patch literal 856 zcmY*UO>YuW6n!&Lpp*^+jL*`d9Ra~kt8FNvOIm29mDWHVcpswk&&Vs^4n zs!GC@@*Xh5EwPwQWrZD)7l4Ld6Yf`qBBmyJuPhd~0acYY+ZJG4YI}f-sY;n`Ayviz zj2#XrSu6;pstkrxo#0-asUnn16&V=I6+x1)Dhc?nVhK;}2!N^xc_D)%VV9&b`8+W4 zd6B;d44n~EDlZm98NiOQo3=E0`6`Ug&Bs%->+$&VEikmYa3k`k8(vxnhof^n5zfwp zZuT0-{POC?%xbvT*T?EM>i6vuPzY+XD$Av!1jt=L?g8V2oFL?ZAuCEU&=tfYhRiN# zI3^e(%_4o&8C~WTn&gNPje~?_GQuEQi@QFD7HX3yHll;NMdOAAehr6`i^Scy572r) z3H33a*q@-U>knYi#dcrtz}B!d`m@1?^@*pUx15DTv>w_OI9!J#4d^(4=bpjyF^*W9 z2GHOmAmt+=?bASuPYbOGAx^V4-3M(x9W+};eR@9unHX=VuY4w;fxR$*+^D~jX02qC z?pJ7IogQfU_X%~#WOX+DxDLj6CC$+k>q6JiAg9^}(e3r-w>t@yF$X{rt2vIQu^LGS z$GhsM@BheCc9VrgG1i0H>R;Q6leS`80#RO-p_&0AsWNoC#Q4X-5040sjdfr2pd7Nh zyk0NIapP|H>_?Bve1?C;4A*#Q3xT literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_ticks.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/adafruit_ticks.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c01fc8c08137332286a9c53f22d4b0d20ef9b4dd GIT binary patch literal 694 zcmYLEQE$>v7`-hkl!C17*aZiPq}zi5Lqk(zT+|>#vP?81#$a7cWu=TpprkD`ix1u+ zamoBMuydvb&%|uJ<~CJhNkvxz%Lo#eN&^^1aTiW zjaF-cJGyNHsH(@hWgBKsRROE2mfklpdU4>2yuZnO=7zcqosUrC|2c3UGhQ}entI1+ z04?g#0`PwcP>)p@yKx6gTuULcE!cD;?u?1JBFp<^Y>4jHeSZd$YTSb5+2SN zJqMrN=wwX1aI0f}1mCuPklV!j42oB`MkzteRbGDOh3d0Y?q2nbAB9FVV#zF#3ZzL$ zD(nipwFzKsH-=aWSA%H^Qp(<8om=JDEO}Y}i4;^zg z`jmN?6J`h@FsUC*D`CN%<7uh%Rw+LpPp*XFod4DM+na<;=)=CiMmADtSj;^bPp)s$ fF3x@1)eZOA^~Jg7(n2(f`_GDeWIT~cG}ZnAP5s%# literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/__init__.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..625c413b3d6993931992281c8782ea6870618011 GIT binary patch literal 473 zcmYk1QBT`25P&bGZbMqA8@li?O-L&gfwp9fYMS_W#|I;Apgra`l?FUHlbHqY^J8#twD<<@X~lM7jpP$}RlW@vn@LkBoiPTK zF(Y%0S(|ZdO#yBd;INE(XfVmOK?f-J$U$mtUVMt8v9jqj35A|Shu3^$rpo?L*pV^< zFTT!giu3>N5@HLG){`!q6hKxlQWUyA=OcM?!^c26I+qy}I?JT6CU7h&?WCK>ueYAg&t^$$yUxocMe9MQ4*`ASQ9>IDC4C1$n+bL4 zGNNBgs7G4~ZTFWd)GLq*jU?#4hhQZZ&fUi^{)&IQy|Xolw*78zbrFB4{ko6;9H01W ci=iX^p8w)Lj?c;=Sqy8xAN*hli^~V`7a~Q44gdfE literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/core.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/core.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f67026fc3968727211fd6763d7a7f0f3c949cc8e GIT binary patch literal 3312 zcmaJ?U2NOd6~2=H7)6n(E18lL)uCnCaummLXvS%?v{5D5vFs!^<)73|Gm0i@OSMcY z5|ua@)>5v4+ARjCdsw%p?qR@yzD$x8Zv%$?Bx(9IU|4~ndsw>HJq*RLJ`X#Wtdn3Z zrk~4ue(yQoIrlKxiB1;V`=s(cP0s6QWxb@17Vn{McUdi{vVl6w_sR$xd3mEON{WK~ z_EyQSt)Y;lNNc4^-ViM&qHWn`8TA!QdCd^jEmyVjy&W!x3q}dn>uvNJy2Fu zTiIXHo~rvTmI%Nph_Ux~OL@R(+u_PvhcN`eHRw$O`u3S>cdSgZJZ!J0SOf|0DHXGz z_=XavsB2QC@NM=kyOFQGnoQfSWL-1VEd$YjnT?mJF0TdiYKW}98@q9L{0VgWp0g15a@w|&ks>dY(P@J067{koV^Hx|Hl**Uph0#uQFC z87Hi5Oq)r!(;YGAiOx_v(;n(zI#x`&E9L;Yi@CZo?J;Qzs3ReYp;l(-mFn}Psf*VBx(UbAFLp zSy|)|?eWg>ZH#A;bI{%1dDwQ(IBqR+PMWqTdZcXt(cV>o#_;#8282bfjrQ|S#_#p> zDCSrgZ)bvB2XkVP>!f>t-{bAE`CUwCk)vn^cno)hd4Y2=eF8B!%Jg$?W`sM&oDl*U zA+WH>dFTMB1xz#MTo~_WMmd@}YZG1|Ff+#am~-B9JX#TCe-$ChvwN2HE;38BhglY6 z!s*`SZBF+ghu*yyw{&R2*^VIEznfNA_*z^)v&)LIk;{0|#%sX0Dpl=(z^5NnXLn2OPXZ#qIbikMN3F=bgN>5$tWq z)vH_J%K+)CTsxD1 z_DFJ_%%C85RbRB={pl&}^uIU(;J!2hOGJ=&v$O2QT>ee-XCp&{vDag>Ew@YpOX@ml zU)YljTjnwmU$Vs2=fqW8T(yl-^DQE@B59IHWXo5|I`x$%Ie?Vo8VSN8FA?&qw*cW6 zd#M+0n*YFW)Uk_qrV@1-_tl}j-$DKUzG3srZ2VL-HjHo8>65$@?#XutoaCOk>R99v z@B9M^mK38Qe@OqUP3xD;|HRp7G#(Czqsj59fy8EXAQ2hZ$VTqW3=W)%gr~w+hSI|k zB|JJC*bL3!mCKse zo#;GMlLUDug<^ppzZp*|S$GdpJ1%%q|le&OAjz5G@HH)d>c7+zSn(Pul>SSoook#SsZ|A z4zk=2O^16_U90^%jsx;EqR!TSM|N9>{Kr{*mPc|mPPxZwe~b@BaR#b!1+NdZk)F@U k+pp2gx!PaMuK3i{0Ceq99tEwm924d!4nLIjEMw4#M@6jAnKEL8sBpd<}|7W=jegsg+*fTneKgqM&z!aO|z< zio)S%Fp5UgcaTRR4rv6NGQv?(bPJOW!|xdT#5yabU_jLo|ynxLiL?hb}a)I*Gv}LrqdFcGpOK9{Fnj{4&NGrfRWA h-)_CW)DmO!Eq#&`llCu2lcgu~h6|?Yf;a4U$REUiTuuN0 literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/funcs.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/funcs.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c805f0942934950ec493be3462af2fba71b5c6e1 GIT binary patch literal 1147 zcmYk4OLN**7>19;MZzXF7DOS5>rk)+hQ!Vg%F69fBx)eGYvH&K&14ki_}C@^L?n?k z?V^&$o!-{n_a}hCX}fa`&Z4`vi*(ux^n^2!`JqMFCR5b)#V|pE-7MPGLsG&YZAgUpwtukpg?JAUAXnZ~*PdzoQttNCRWKfi-|%Zlb3+-7D-7^p@I0fOXX5 zCvDV5fNr(*T@YHV*K`A_jn;d>Z_DBXZsi#eCXCUIVBy9)dvn&NCF~&UUD5#KZam_# zmx~*bvm5uP!(qaltnUZDP44@@rmO&&B(A!qNtUdp0ZUDhL3ff^zeTYAG|4h|(yo9f zL$aRr>tHS5eR#{wh9v0uBK+I2X_~n!)LS!VFq&A2rj~YcMSnL$XMwbPTp5(vP3GEb z@xx)sBOUh#k~B=X@0W@DouE%T6)T<4SQd!488S59JIIoquup>D1pXS>qBs3B5w|&O zjwQI=wfuZ}zQ9Kd+mHDKp1#n@5=ULEQ0$DZg19)rPz)KI>}1F+F(_U*=w^sfvszx< z#GUciqCPCm^@9O%2|vt@{QJ_$p)Jz0F{*uZSUD9xz%6S79-{wPN8R3;78aU9RwOyW z%tXvplVbdxF0KVLE@&;%Ue8z6skhl^z{AF-X44=;uwe-jIUgNPn)f95-Sj`dm`6vs zS47BbDi0pSgfB1gu~dmqEUk!-p70NOK6*15t>a28xzb9O^~fv)6x|hs6o8!{evAOu zahkxZ4a_*jaJ>v+=7;9yu-D%RUc~sT2RI5}#?ZC&xGo-N00io!e z{1s0uF^L$aMAn(dl6OJ z6f>70#gbFQytxtR_ZXC;M1iAF50d+Le{x4Jr&6ipb+aCMl;cYUUd(eO-q>^cyO@_C z-g%Yb`;GyHew@fJbArj-I6`L_RO`)})JiG@%; G4gUp6FG^_u literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/lock.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/lock.mpy new file mode 100644 index 0000000000000000000000000000000000000000..905ca20449844d284d0269d31fc1fbf3e522ca07 GIT binary patch literal 597 zcmXwz(QndF7{$Mq!b-(bN_T}0H{zz-FuK{y#z!)0+{j*PmMA8q)Y}^&kOHOXc)Oh> z`s#n-V}10^8Q*PP(S#Cco4pW0kpkShFFm$S&@el)OnFHq&x0xyDPaiWHMR={0wEPa7dOZ=4tU#x@)YBrVIv zEgPKIToibp4V7;jD#L7{bG({%@u$7-KPjcndqtDBdi9gD{o}(%d*?xWhjH}A`AvCW zWmS!}nC7ZdIw`WRbQ_Ga4Q{{F-hah>D!0fAK&?X6^1K?XK$hFUQcF(f|Me literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/stream.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/stream.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ebf96b71098f25e8dd31509089a01f378a46a412 GIT binary patch literal 2203 zcmZ`&+f&=v9X=AqIF3VvrPaEGWL*rt0fq>prI&OaUlJKeK)#f5rWsk5Pl7kbawU<3 z?sSnErxSMep?&B-(7v>9zJOu#(n3f`JAGF$>!9|B8D-aC0vgQ_WWufvADu8|@Ry0AX$|@`a zmuODV_(-W}5V)-op@1uL9o7U%uGOHVRpc6Qsj~C{YJg6qZ?9!mZ)Q^2EO2c>MXAYv zz7I9ATvjTzduWkeO)Lx9Tqbq>7NAwAm8$5|O6@)v?&ATc^_g8&tANU8R}ykfgO4@f zN65L=#OjKWTgeKEm2~QM4pCOby3j9wMKyH@8?vg^#7zhyWm(t|Yh`sqd;kUcOU}S8 zRAk|YTW|{k+8l(wNI?)y69nKs!>I*Ylsx$VCYEYfG4{uWK#KT>UuJn z0gh6ohMcQbR1MYuEg{1-C}^Vk0Jtn9;4oK&T7|GKY^q=^A=V^Vt-^9jQDgWlfI~1WZ)rkl>mC?G?h42rMHEbf8y6cNP?jWAy$l*Zri~Fk z7A38^4H`QXk_eHbiXb2x(EKs#xd5C{s>T;a8p*cA6DQa&{)SG0=x!N1S%o+$2U~ z^mW2U$ESgT1?VXTqh}eMo?`}RJ7c4-GK2IyW2d9c5WT=S=n!*`4)c<;vGz-hnBt~q z^wEilcFQx}X?bRRpyi41(&N$LS?;#(EqYtzOgk^d&N=2dJ-|zi#h?9F*Y%jo&gs*} z=`=ORf&wq?a=$PShOcs~`a+R$8{-^7#;oWvh}eUax~{<+lxG^R;5%z)O{|~vqf|GXV&2cArv%Qo5=+k7pEyXEbYJ%`+ z2&t$Qy{S-W+#hI>k%VX{4I%a?9rvwv6hpUpsblcD+3xTWJb&C;CnN1QcMPYWaK|PM zPngp`EC$EpOvFFqUO_lf>{vgEzi$#6{a+(P77~kDLX(C(tJ+@@7y3>7cm-{ z&P0-YTmQK}lv<9=2F7!NW#42fHMiqxKL;>jJaME_Nn1kTi+)yvNk>c za-TZi)APMXzPFoa2hI*DVvWTL-1$Rlq_>kt)1^!6?$qbW+^e+nh;$#kPR5TQ&%X*f z?k-_>JIT#X=CkB&RD=B8ClvJw`4%#zn~1lbcPRRhc)Lq@*4QTY1+Lq67{z{X2|oNX zH_x7hacQ>)VSpimn6A20dV(U$-7)V}i2L?y$I?KSsG=!HYif0d;wwys}Te z(_jZsc`te)CXa7+(cm78f|o|U9_2e|xk+|_#d@9zjzD{p`hQ)y+;=5+mUi~~9XNzv zXy{4JjiXZ|%%edry|nz(%VGbdKNRTbuM?^6&gJx$K9PzlQ+yq_q^TdbpL5S OHuEhOT2%Ne-Tn`ft(n*W literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/task.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/task.mpy new file mode 100644 index 0000000000000000000000000000000000000000..466dce0ab1239f5853163f24e1d389307e6aa550 GIT binary patch literal 1403 zcmZ`&OK;;;6ux$o)_Jsbu8r$vN*i3~QTH`X%?KeOD#uMh3`0FFNF$AuS~s^%)J&2| zT%bFrji4-G&7K7dHg+=AtdOQH^9yDHtNa#@ok2)QSUUH9K9BF7?;g7}iI%pRMZ0_6 zB=y#&V|PzC+UIDNBdrca6ZjAu))_schzlT^Y1b;xXrqcmr%q10m1_O?7$w1ZO3x7w zJE_$nn*Ik>8g|zStD5v%2j#%ush`xGXRWSNY1~k2?Qao z+GJowk|%RC%sZ{JDM6FJLb=HY2z4OKIPMliyN8#e4p>H{*dnRtj64%SYRdgNfAkt zMMjz~veL|9ae|NNtQ0vcM))Xzs70dRe^A_*RF>VjtddnWm-FSEs;Wj#&8w>%M|>gXg*fI32}u0} z+;K=r`otpr!q(!n>fTorMOAZP`E~2YsCl=L`^p+Xoi%!6THamwK9m!9axm1{TRiCx zboM5QmatELEPVKAhR?b?Sye47%9^>6Qx#|)ILoTC7J{s)su1?Qk@*OkzJ(5BczU2S z#J@Alp^&%(3;6V*ki7GULTqFnK=aV@LtjV?1TdpM69i@xgAYY zi=n7e2@4biSfdbu1aT1Db!lLfVao43K)%euHAB75hJ+V8^Sq?F=PGc3_vYVXJPnjO z6J)_{_@tLn;&a-n>*5(m^xxKB>fA!~>N|JpD&C(q`?J-fP*PMXgi^+`(y6qx0^jKZ z$XWzhOCal#|Ak4E4&3OhQG43g^K|BIh{4X1R&0Na1I=k5pjTw`rAKo XJSzAZ|1!S{!~ad(0q=XkRgu2|()y1O literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/traceback.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 10.x/lib/asyncio/traceback.mpy new file mode 100644 index 0000000000000000000000000000000000000000..e18e5a7eb1f66c38392c873e3d8dd6b17f700d79 GIT binary patch literal 649 zcmYL_UvJV-7{*UaVTi0Nr&v_jYzi~Lh$KRGvBbpCvJt{!nz>9a40c^Hjin`R6Cs3H z2#H?!VG0cN%4p`M_gp2gz61kT{~YUn5u{VDME zD)!V7;{-#95rXz-@q+?j0;0H3#6baLC{e~=vws{c9k>x89k`h-b6m=M_fx5@vG_xH z1Q|#qK@k_qkf2vSIcKGwO9wx@^tJO-I&?9ouYZ}-;jb{3#G9zHGpC6fclB&(HZ9jLrVx VN{28;(a}}7J}YAL?JE~i{tKH>!UzBW literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/code.py b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/code.py new file mode 100644 index 00000000..ca037f67 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/code.py @@ -0,0 +1,221 @@ +# SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Commodore 16 to USB HID adapter with Adafruit KB2040 +# +# Note that: +# * This matrix is different than the (more common) Commodore 64 matrix +# * There are no diodes, not even on modifiers, so there's only 2-key rollover. + +import asyncio.core +import board +import keypad +from adafruit_hid.keycode import Keycode as K +from adafruit_hid.keyboard import Keyboard +import usb_hid + +# True to use a more POSITIONAL mapping, False to use a more PC-style mapping +POSITIONAL = True + +# Keyboard schematic from +# https://archive.org/details/SAMS_Computerfacts_Commodore_C16_1984-12_Howard_W_Sams_Co_CC8/page/n9/mode/2up +# 1 3 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # connector pins +# R5 C7 R7 C4 R1 C5 C6 R3 R2 R4 C2 C1 R6 C3 C0 R0 # row/column in schematic +# D2 D3 D4 D5 D6 D7 D8 D9 D10 MOSI MISO SCK A0 A1 A2 A3 # conencted to kb2040 at +# results in the the following assignment of rows and columns: +rows = [board.A3, board.D6, board.D10, board.D9, board.MOSI, board.D2, board.A0, board.D4] +cols = [board.A2, board.SCK, board.MISO, board.A1, board.D5, board.D7, board.D8, board.D3] + +# ROM listing of key values from ed7.src in +# http://www.zimmers.net/anonftp/pub/cbm/src/plus4/ted_kernal_basic_src.tar.gz +# shows key matrix arrangement (it's nuts) +# del return £ f8 f1 f2 f3 @ +# 3 w a 4 z s e shift +# 5 r d 6 c f t x +# 7 y g 8 b h u v +# 9 i j 0 m k o n +# down p l up . : - , +# left * ; right escape = + / +# 1 home control 2 space c=key q stop + +# Implement an FN-key for some keys not present on the default keyboard +class FnState: + def __init__(self): + self.state = False + + def fn_event(self, event): + self.state = event.pressed + + def fn_modify(self, keycode): + if self.state: + return self.mods.get(keycode, keycode) + return keycode + + mods = { + K.ONE: K.F1, + K.TWO: K.F2, + K.THREE: K.F3, + K.FOUR: K.F4, + K.FIVE: K.F5, + K.SIX: K.F6, + K.SEVEN: K.F7, + K.EIGHT: K.F8, + K.NINE: K.F9, + K.ZERO: K.F10, + K.F1: K.F11, + K.F2: K.F12, + K.UP_ARROW: K.PAGE_UP, + K.DOWN_ARROW: K.PAGE_DOWN, + K.LEFT_ARROW: K.HOME, + K.RIGHT_ARROW: K.END, + K.BACKSPACE: K.DELETE, + K.F3: K.INSERT, + } +fn_state = FnState() + +K_FN = fn_state.fn_event + +# A tuple is special, it: +# * Clears shift modifiers & pressed keys +# * Presses the given sequence +# * Releases all pressed keys +# * Restores the original modifiers +# It's mostly used to send a key that requires a shift keypress on a standard +# keyboard (or which is mapped to a shifted key but requires that shift NOT +# be pressed) +# +# A consequence of this is that the key will not repeat, even if it is held +# down. So for example in the positional mapping, shift-1 will repeat "!" +# but shift-7 will not repeat "'" and shift-0 will not repeat "^". +K_AT = (K.SHIFT, K.TWO) +K_PLUS = (K.SHIFT, K.EQUALS) +K_ASTERISK = (K.SHIFT, K.EIGHT) +K_COLON = (K.SHIFT, K.SEMICOLON) + +# We need these mask values for the reasons discussed above +MASK_LEFT_SHIFT = K.modifier_bit(K.LEFT_SHIFT) +MASK_RIGHT_SHIFT = K.modifier_bit(K.RIGHT_SHIFT) +MASK_ANY_SHIFT = (MASK_LEFT_SHIFT | MASK_RIGHT_SHIFT) + +if POSITIONAL: + keycodes = [ + K.BACKSPACE, K.ENTER, K.BACKSLASH, K.F8, K.F1, K.F2, K.F3, K_AT, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K_COLON, K.MINUS, K.COMMA, + K.LEFT_ARROW, K_ASTERISK, K.SEMICOLON, K.RIGHT_ARROW, K.ESCAPE, K.EQUALS, K_PLUS, + K.FORWARD_SLASH, K.ONE, K_FN, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, + ] + + shifted = { + K.TWO: (K.SHIFT, K.QUOTE), # double quote + K.SIX: (K.SHIFT, K.SEVEN), # ampersand + K.SEVEN: (K.QUOTE,), # single quote + K.EIGHT: (K.SHIFT, K.NINE), # left paren + K.NINE: (K.SHIFT, K.ZERO), # right paren + K.ZERO: (K.SHIFT, K.SIX), # caret + K_AT: (K.SHIFT, K.LEFT_BRACKET), + K_PLUS: (K.SHIFT, K.RIGHT_BRACKET), + K_COLON: (K.LEFT_BRACKET,), + K.SEMICOLON: (K.RIGHT_BRACKET,), + K.EQUALS: (K.TAB,), + } +else: + # TODO clear/home, up/down positional arrows + keycodes = [ + K.BACKSPACE, K.ENTER, K.LEFT_ARROW, K.F8, K.F1, K.F2, K.F3, K.LEFT_BRACKET, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K.SEMICOLON, K.QUOTE, K.COMMA, + K.BACKSLASH, K_ASTERISK, K.SEMICOLON, K.EQUALS, K.ESCAPE, K.RIGHT_ARROW, K.RIGHT_BRACKET, + K.FORWARD_SLASH, K.ONE, K.HOME, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, + ] + + shifted = { + } +class AsyncEventQueue: + def __init__(self, events): + self._events = events + + async def __await__(self): + await asyncio.core._io_queue.queue_read(self._events) + return self._events.get() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + +class XKROFilter: + """Perform an X-key rollover algorithm, blocking ghosts if more than X keys are pressed at once + +A key matrix without diodes can support 2-key rollover. + """ + def __init__(self, rollover=2): + self._count = 0 + self._rollover = rollover + self._real = [0] * 64 + self._ghost = [0] * 64 + + def __call__(self, event): + self._ghost[event.key_number] = event.pressed + if event.pressed: + if self._count < self._rollover: + self._real[event.key_number] = True + yield event + self._count += 1 + else: + self._real[event.key_number] = False + yield event + self._count -= 1 + +twokey_filter = XKROFilter(2) + +async def key_task(): + # Initialize Keyboard + kbd = Keyboard(usb_hid.devices) + + with keypad.KeyMatrix(rows, cols) as keys, AsyncEventQueue(keys.events) as q: + while True: + ev = await q + for ev in twokey_filter(ev): + keycode = keycodes[ev.key_number] + if callable(keycode): + keycode = keycode(ev) + keycode = fn_state.fn_modify(keycode) + if keycode is None: + continue + old_report_modifier = kbd.report_modifier[0] + shift_pressed = old_report_modifier & MASK_ANY_SHIFT + if shift_pressed: + keycode = shifted.get(keycode, keycode) + if isinstance(keycode, tuple): + if ev.pressed: + kbd.report_modifier[0] = old_report_modifier & ~MASK_ANY_SHIFT + kbd.press(*keycode) + kbd.release_all() + kbd.report_modifier[0] = old_report_modifier + elif ev.pressed: + kbd.press(keycode) + else: + kbd.release(keycode) + + +async def forever_task(): + while True: + await asyncio.sleep(.1) + +async def main(): + forever = asyncio.create_task(forever_task()) + key = asyncio.create_task(key_task()) + await asyncio.gather( # Don't forget the await! + forever, + key, + ) + +asyncio.run(main()) diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5f156d1581b8bfe5e1f820b57ac6d25a49df2daf GIT binary patch literal 744 zcmYjN%Wl&^6dfmVaMRRvonWAigyp2DK(YH$LEQk3Nt04Uttv{5ga+51BqOD^vB#Cl z%H4Ir#}u0EktqBDLfz063;u#h`cP*vbMBmT&wW(0;QlnbV7qoZj4^>->}n8Vk3y&h z2VhdNJkXLh5I=2Lm+IUk1_Hb1oGq{z+MOB4YZGG z%*WC0&>G}c)kXCg;D@<>On}tJo(tUzRWXk24uS!_KyHLVF6to^06vVpQMu`%k>h(F zatLz48wtXF6h^c;+K~WZhytG?{=zW=hs*w9)n?bagapx=rgbps#=ENH?`c;fYcH>6 zuj0_5JJ>oPUFuhF7%G(mc059~$DwmbqjJ@cd#+4(A`g3)_iW;H>8vu<%NJ!;z@-<} z1$L=s;~sKl;>*K@V!MYwp_@9n5y{PMUA`XZIXK#!uP`6vB)3^p-qw_+qcm$3HxW{g zn3;4bC8eyyoXJR;I!9ktVmBsQQ{uT%vrLMa_jNuIvQ&Djl$Em9Ms7q_txJZZ%vgz& zIO|3lM@bi!&s+bFj*=H^`P&oxc=99}dstCspDJ^+9j!h8 zN{JrKDNF03bX;auQigH-nE7U&9>dqlk3nJL%bBq=DDYp;3{#W_BSn31YSE+XdZ};z zG1kR9<wV{1a`<=W-S29}vc!Ak46V_3{sWn(*iQfe literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ae562e436d9047648f3edf5328676a07fc00c231 GIT binary patch literal 625 zcmYjNU2hUW6rBMIg>IMG55|^{cH2Iv4MIfZ!T3O=X-LyXNx#B_!F6}qZiL-+X0}R< z$$(AM2Y(FsSA6i%zv8SV#+P%?%{e*e=62Fxa|^a@*S?^U#|KxQTXzDVMI%B7l5iRf zYvCB=(`?K@*&BsJG9o^=xfl3Ay(W~!Wb#;HoJI}@_`>tuflIDEhkztHCLbf>ORDg3 z==qmGjoACR1#EN{HFCx+V8@J@eMttP1d#j7fy%uR2_g=x_?Y{v7TM~6k}#kgObfY? z62^c^$&lEL06nyw4+GEV0Z6^<0?dd!Y2iMqKY2bi)cX(yCb0M~*a=($mY#n3YI)4^ z18%V>j2nn+dA`;0s3Sl0X3Vbw-)hu8TLHC(!6!n&ty?X_cb3TPSC94&w+~-CqE|}b zgqARpMoOH1`?YtZt?vMHNh`Ks6A~$>ae9I>yRfue&frYHYYLQ=TdthN*}l|Q@XA5% zTwDLW*XbX?wwX%VPC9+h{%#r#XBb6h((saYc|t$%~bemq=`s1VJrq)?v^^_Jf&Oz-mCih*2R3g&orvf3~YZ zr7^F#@1ApMob2zATDRZ5pUj3+^)T!gdZU-u+4EqcqGvi8Jw@3c9FN~fI!_lW$}dAB zK?+CZBxls;6|!5kg;Z6ax9q4zwB>jevL~qRDUY?KlH8^@B>xQp&YF%NiUl-<^aGM$ zHAW@L26g*Z1$HPHG2Kuyl56_)&}FK^C}%G7T db4a3gA%*%5wopGp8ubt?oR1-c^AT(}dY^Owv@J(X*)fZQlMK}WRNXbYfZeunSl@}bh}t;HJfRfIpD;?)R}3u z7wQ>OYCnPB!7FF@vwQ2V>?Yp27i1Ho#$>Ne`~;r<0W~p`%z2;pJm>knGlzGA*=1^_ zDpwD*hGK}HDDv{BsI{+FH91vpfeF)Z9>N3VSQcf}R3rpOd|Rj`sWJjSV(b_6F8Zv2 zj>)FiXw{YDL*Q%Z`@Jkc6LUWd%rOnUdWgh2c>#C720lYMLTbYRG4Td^gYjypu4)FD z8LZ-wDk}#H(f}Mb$N?Qdv4&((H>yTM2kyFtbR8^-Rax%k^=1O${{kuT2(j5NeL-UGSm>{ z?YY!ru)Tcmop5eV5O<2(VlK~bfk;pB@891Y$eEtp(1A%YM`U=d)l|^ufbNm{_wl8Z0^rnGicpmp9?LD|;<>!EifP9pH8m1- zKu6i6M@fArItoWg?IiVB)CryC4F=OLqQ;{x=qlsFlpDG?-6enQH-Rs2QV%~!1KN{u zKuq)p3}wyPa(hr8qcyD(0B;G78)CotKD^IiBxVUgN> z8$fTGf}yknhSMW3k{*Rq={pdnop92>kRHoWa60XRvju7V6uh9KUUqQ;vv^$Vj;S#< zFly7UnY6D%Pn=~sloh4}Z+0_e^#_)$pg%)lGvz2+;lNOy6#6na2dpqtkWN;A!g!Sq zv3MPalB_Lmxu04LJj+sLE@K60=5-Q6#H};T;tKZMIw$|nxxxA(EUw3rDa>t_o?sGT z@0qVk-E01>@_$0j%6A0sn__XZ5?ipCkZrz8l`STc1q9joVsjp{WB9As0>3RJ6DSd1 z+f1$moJ`ctQcur>Z7UeS9~RGk|9Fr4fnb6^V(z2T)%iv7*(H7{tlQ@odj;vzekpJT zi44%W=I@pa3Wd#|@T!{N-*?agg4h2$Ha2glwKQol{ EH}z(GO#lD@ literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4f04cda1f1922197fc1c3125ece9f09c13aabdb6 GIT binary patch literal 1216 zcmZ9JUsD=a6u|GIAP|BpySX(6;}!%W7*I-?j86zFe}t$APD-Yo%et(>6kTRntxU#t z*U|~oevm%&Wr6qs65B6eU(yGgnS24K4}I_5MLM0%ojL#RIlpu6xhV@+ST$w28h0R_ zG-On7)FNLCoqds$YN*L|#1k3qb8R8q>VRo``J~kpfJ5%I8pnr#%-u1Vq?RPK+rYh>%Vf)Fy--G}ZFU3DrED%; zM(M(OW^5aAC<#pg6A;&If{Pr3_&O&cSwwgQUaSd#-rCq;bxvj%%%!%UCv#ia&u>&p zfHtBdrn=;43bHInz;b+YWV}ExZ-b8NTS45ucq*($pZy;`o5fRZ?4tEjDwhL{p-_2S z#~af!p2A+L zuvp8^DWoY#JeqKupsAvglh`)9C*fpe)Ba+H`M{t zQ4gRq2;jmpfR9N#q_KVw1@PWZkSKjdKu1y6Cg_Szz`5uooR69zRpc#abIyByvyxD3 zeQnlUe<~7Pp-`6N-oT&6QYWkMl)z$UKw|5sLzA()G zoiP&!l_LLR_NSS!%fA#3ZrV=ugO5R~VznhXy0w1u;Sx6#x94O}i|E7*R?7{cVwdZGGvV^GB2m#TD@B19}5X zfl>y~hoAIrp!~u9ht?m_uo}@q;0o`9zF~7i`q5}j17l64A??;EQg^OzgC@M3WCo`U zurcJnw|d|_Zuzq^6$%FYt`O#F)Z-g=6HCL}<1rQo(pdKQc!j^HM|G7{e*k?MVzK}L literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..90951e9e435ed336be90732d1d532a7ab94610f1 GIT binary patch literal 338 zcmZ=}W02=!bV*D}Oe-qQEQ!y^OwrFytxU>KEJ}&bNvzB-Er~BJ)+?xF;8*d6iu-_t zof3;v88pz&$e`E!5@Y6%>_}RaDhB8*kIwzGHq%Yg>CqXIFPmZ(sj} ziIXNznL2IyjG41$&zY-lXs~##DGMtbI|nBhHxDl#zkr~Su!yLbxP+vXw2bWfjT^T5 zFf`dn2rwonG_dD%Pj3`p(qfcmmSGZOiVQJg5MU8xGGP{D5o8f#4NPWiG+^Li>ELe= UQV?VlV;5i%<4|T0;|xp&08!Lkz5oCK literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..9a350a7f8594b22bbc86ff09550a10023ed3a4bb GIT binary patch literal 1978 zcmb7EX>$`t5N!`e2w{w5oEOI-;53Gigv;{Dt(CO079G3Zl`PvFvMt$QE`xz2Bm`zt zImkuGec$&Dm4CypNLBtoX0=*EQhZ5G_1o^A?N-meH%f(QgS(2h&(vq;mo6?`s2*Ra z?>ISkskT_3+kW;Et!dBs0d<{TtS`(j%q>-C7cNj&UeA=ODYICz%{+D3#%Q)w9W5KQ zW80w6NF+(5NTf;VBr+sMNn}YFBo30uk;s!MkSLNcNmwMtNZ2GC5+xF465}K)Bqm5q zl9-~9S=1?1s+bfhWo=!jaK;&IQqC=q=@bfLE)mI3c^#mtt#|lNw=xZ z)=Oo(NNu{4(kz`il3FU~SX#A6x>iw~@mUo(mP1>qTFHyID z*dX+q<+$YDo7^(8#9EifZAX zR zo@UsPRD(chmX$YBTFLMPV3`%Az@VrpC`DDj$Jc-dgB}cdFzmsI2Oh6+kJq@zYdr3O zR}mke_TbX_WH?zPqa@`&qCP+Q5`{DcZKl;2!cTj*Gvq;g#V9KB9IurUqT;(L>7a9y zbH8WvZhQUQRiWCc^VHt_e;~Ir8flsCk>OIDqGCWmjMZBHsE4nI#kJKky0Pbfuf)A8 zdhc`!yxyMwtVD0(?#!m1J1f!feDt${A3Xi+z42b}{F75&uc`}dbI;vtQz90^il{*N zd8~W^kr%P*CA3|`>X*^}3f8=e=xd0*j*jbC`vy91;J!D3w{ZX4=z0eayo>Jl@ZkGc z_W>UI5bHm}hL6$n2_F6w{24ZWj@~b@=}T<>3Xgn^E#KhLZ}Hf7c>H^8{Q=uz+pzsd z?Dz>ge@5Rgh{xjS{}ltjVeoeh@lFhLA4WKiUEGh|Jb*nsh`l_7eLRf)Jc0wf3klv0 zjrSnQdy(RONb`Q^d;l4i35>GTkY$;K!7_z|EYrxb)RAYIL4oBciY&7*SsJid9>f^S z9Bh_(I4lb&u`Hs@(!@AR3l)}Qm|$sRlBI(wmL(iwS;k?O<2b^yf}<=aP-QuZX_ix% zVR;C%EDxi`@(AiIk7ABx74s~oag5~*j84IgisUkKqi<<5*<5 zfU_)5;2g`7SYmk!=UJY{1(s)Uk>w(uV0ji#vOI^UST5lb%ky}e-D$MOTJa3KGq@bP zjAz-M#g*68yK8{q|pf)@1E(0K&ub literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy new file mode 100644 index 0000000000000000000000000000000000000000..412d8bceda72440edc9761a99b347d3505233787 GIT binary patch literal 856 zcmY*UO>YuW6n!&Lpp*^+jL*`d9Ra~kt8FNvOIm29mDWHVcpswk&&Vs^4n zs!GC@@*Xh5EwPwQWrZD)7l4Ld6Yf`qBBmyJuPhd~0acYY+ZJG4YI}f-sY;n`Ayviz zj2#XrSu6;pstkrxo#0-asUnn16&V=I6+x1)Dhc?nVhK;}2!N^xc_D)%VV9&b`8+W4 zd6B;d44n~EDlZm98NiOQo3=E0`6`Ug&Bs%->+$&VEikmYa3k`k8(vxnhof^n5zfwp zZuT0-{POC?%xbvT*T?EM>i6vuPzY+XD$Av!1jt=L?g8V2oFL?ZAuCEU&=tfYhRiN# zI3^e(%_4o&8C~WTn&gNPje~?_GQuEQi@QFD7HX3yHll;NMdOAAehr6`i^Scy572r) z3H33a*q@-U>knYi#dcrtz}B!d`m@1?^@*pUx15DTv>w_OI9!J#4d^(4=bpjyF^*W9 z2GHOmAmt+=?bASuPYbOGAx^V4-3M(x9W+};eR@9unHX=VuY4w;fxR$*+^D~jX02qC z?pJ7IogQfU_X%~#WOX+DxDLj6CC$+k>q6JiAg9^}(e3r-w>t@yF$X{rt2vIQu^LGS z$GhsM@BheCc9VrgG1i0H>R;Q6leS`80#RO-p_&0AsWNoC#Q4X-5040sjdfr2pd7Nh zyk0NIapP|H>_?Bve1?C;4A*#Q3xT literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_ticks.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/adafruit_ticks.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c01fc8c08137332286a9c53f22d4b0d20ef9b4dd GIT binary patch literal 694 zcmYLEQE$>v7`-hkl!C17*aZiPq}zi5Lqk(zT+|>#vP?81#$a7cWu=TpprkD`ix1u+ zamoBMuydvb&%|uJ<~CJhNkvxz%Lo#eN&^^1aTiW zjaF-cJGyNHsH(@hWgBKsRROE2mfklpdU4>2yuZnO=7zcqosUrC|2c3UGhQ}entI1+ z04?g#0`PwcP>)p@yKx6gTuULcE!cD;?u?1JBFp<^Y>4jHeSZd$YTSb5+2SN zJqMrN=wwX1aI0f}1mCuPklV!j42oB`MkzteRbGDOh3d0Y?q2nbAB9FVV#zF#3ZzL$ zD(nipwFzKsH-=aWSA%H^Qp(<8om=JDEO}Y}i4;^zg z`jmN?6J`h@FsUC*D`CN%<7uh%Rw+LpPp*XFod4DM+na<;=)=CiMmADtSj;^bPp)s$ fF3x@1)eZOA^~Jg7(n2(f`_GDeWIT~cG}ZnAP5s%# literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/__init__.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..625c413b3d6993931992281c8782ea6870618011 GIT binary patch literal 473 zcmYk1QBT`25P&bGZbMqA8@li?O-L&gfwp9fYMS_W#|I;Apgra`l?FUHlbHqY^J8#twD<<@X~lM7jpP$}RlW@vn@LkBoiPTK zF(Y%0S(|ZdO#yBd;INE(XfVmOK?f-J$U$mtUVMt8v9jqj35A|Shu3^$rpo?L*pV^< zFTT!giu3>N5@HLG){`!q6hKxlQWUyA=OcM?!^c26I+qy}I?JT6CU7h&?WCK>ueYAg&t^$$yUxocMe9MQ4*`ASQ9>IDC4C1$n+bL4 zGNNBgs7G4~ZTFWd)GLq*jU?#4hhQZZ&fUi^{)&IQy|Xolw*78zbrFB4{ko6;9H01W ci=iX^p8w)Lj?c;=Sqy8xAN*hli^~V`7a~Q44gdfE literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/core.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/core.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f67026fc3968727211fd6763d7a7f0f3c949cc8e GIT binary patch literal 3312 zcmaJ?U2NOd6~2=H7)6n(E18lL)uCnCaummLXvS%?v{5D5vFs!^<)73|Gm0i@OSMcY z5|ua@)>5v4+ARjCdsw%p?qR@yzD$x8Zv%$?Bx(9IU|4~ndsw>HJq*RLJ`X#Wtdn3Z zrk~4ue(yQoIrlKxiB1;V`=s(cP0s6QWxb@17Vn{McUdi{vVl6w_sR$xd3mEON{WK~ z_EyQSt)Y;lNNc4^-ViM&qHWn`8TA!QdCd^jEmyVjy&W!x3q}dn>uvNJy2Fu zTiIXHo~rvTmI%Nph_Ux~OL@R(+u_PvhcN`eHRw$O`u3S>cdSgZJZ!J0SOf|0DHXGz z_=XavsB2QC@NM=kyOFQGnoQfSWL-1VEd$YjnT?mJF0TdiYKW}98@q9L{0VgWp0g15a@w|&ks>dY(P@J067{koV^Hx|Hl**Uph0#uQFC z87Hi5Oq)r!(;YGAiOx_v(;n(zI#x`&E9L;Yi@CZo?J;Qzs3ReYp;l(-mFn}Psf*VBx(UbAFLp zSy|)|?eWg>ZH#A;bI{%1dDwQ(IBqR+PMWqTdZcXt(cV>o#_;#8282bfjrQ|S#_#p> zDCSrgZ)bvB2XkVP>!f>t-{bAE`CUwCk)vn^cno)hd4Y2=eF8B!%Jg$?W`sM&oDl*U zA+WH>dFTMB1xz#MTo~_WMmd@}YZG1|Ff+#am~-B9JX#TCe-$ChvwN2HE;38BhglY6 z!s*`SZBF+ghu*yyw{&R2*^VIEznfNA_*z^)v&)LIk;{0|#%sX0Dpl=(z^5NnXLn2OPXZ#qIbikMN3F=bgN>5$tWq z)vH_J%K+)CTsxD1 z_DFJ_%%C85RbRB={pl&}^uIU(;J!2hOGJ=&v$O2QT>ee-XCp&{vDag>Ew@YpOX@ml zU)YljTjnwmU$Vs2=fqW8T(yl-^DQE@B59IHWXo5|I`x$%Ie?Vo8VSN8FA?&qw*cW6 zd#M+0n*YFW)Uk_qrV@1-_tl}j-$DKUzG3srZ2VL-HjHo8>65$@?#XutoaCOk>R99v z@B9M^mK38Qe@OqUP3xD;|HRp7G#(Czqsj59fy8EXAQ2hZ$VTqW3=W)%gr~w+hSI|k zB|JJC*bL3!mCKse zo#;GMlLUDug<^ppzZp*|S$GdpJ1%%q|le&OAjz5G@HH)d>c7+zSn(Pul>SSoook#SsZ|A z4zk=2O^16_U90^%jsx;EqR!TSM|N9>{Kr{*mPc|mPPxZwe~b@BaR#b!1+NdZk)F@U k+pp2gx!PaMuK3i{0Ceq99tEwm924d!4nLIjEMw4#M@6jAnKEL8sBpd<}|7W=jegsg+*fTneKgqM&z!aO|z< zio)S%Fp5UgcaTRR4rv6NGQv?(bPJOW!|xdT#5yabU_jLo|ynxLiL?hb}a)I*Gv}LrqdFcGpOK9{Fnj{4&NGrfRWA h-)_CW)DmO!Eq#&`llCu2lcgu~h6|?Yf;a4U$REUiTuuN0 literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/funcs.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/funcs.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c805f0942934950ec493be3462af2fba71b5c6e1 GIT binary patch literal 1147 zcmYk4OLN**7>19;MZzXF7DOS5>rk)+hQ!Vg%F69fBx)eGYvH&K&14ki_}C@^L?n?k z?V^&$o!-{n_a}hCX}fa`&Z4`vi*(ux^n^2!`JqMFCR5b)#V|pE-7MPGLsG&YZAgUpwtukpg?JAUAXnZ~*PdzoQttNCRWKfi-|%Zlb3+-7D-7^p@I0fOXX5 zCvDV5fNr(*T@YHV*K`A_jn;d>Z_DBXZsi#eCXCUIVBy9)dvn&NCF~&UUD5#KZam_# zmx~*bvm5uP!(qaltnUZDP44@@rmO&&B(A!qNtUdp0ZUDhL3ff^zeTYAG|4h|(yo9f zL$aRr>tHS5eR#{wh9v0uBK+I2X_~n!)LS!VFq&A2rj~YcMSnL$XMwbPTp5(vP3GEb z@xx)sBOUh#k~B=X@0W@DouE%T6)T<4SQd!488S59JIIoquup>D1pXS>qBs3B5w|&O zjwQI=wfuZ}zQ9Kd+mHDKp1#n@5=ULEQ0$DZg19)rPz)KI>}1F+F(_U*=w^sfvszx< z#GUciqCPCm^@9O%2|vt@{QJ_$p)Jz0F{*uZSUD9xz%6S79-{wPN8R3;78aU9RwOyW z%tXvplVbdxF0KVLE@&;%Ue8z6skhl^z{AF-X44=;uwe-jIUgNPn)f95-Sj`dm`6vs zS47BbDi0pSgfB1gu~dmqEUk!-p70NOK6*15t>a28xzb9O^~fv)6x|hs6o8!{evAOu zahkxZ4a_*jaJ>v+=7;9yu-D%RUc~sT2RI5}#?ZC&xGo-N00io!e z{1s0uF^L$aMAn(dl6OJ z6f>70#gbFQytxtR_ZXC;M1iAF50d+Le{x4Jr&6ipb+aCMl;cYUUd(eO-q>^cyO@_C z-g%Yb`;GyHew@fJbArj-I6`L_RO`)})JiG@%; G4gUp6FG^_u literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/lock.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/lock.mpy new file mode 100644 index 0000000000000000000000000000000000000000..905ca20449844d284d0269d31fc1fbf3e522ca07 GIT binary patch literal 597 zcmXwz(QndF7{$Mq!b-(bN_T}0H{zz-FuK{y#z!)0+{j*PmMA8q)Y}^&kOHOXc)Oh> z`s#n-V}10^8Q*PP(S#Cco4pW0kpkShFFm$S&@el)OnFHq&x0xyDPaiWHMR={0wEPa7dOZ=4tU#x@)YBrVIv zEgPKIToibp4V7;jD#L7{bG({%@u$7-KPjcndqtDBdi9gD{o}(%d*?xWhjH}A`AvCW zWmS!}nC7ZdIw`WRbQ_Ga4Q{{F-hah>D!0fAK&?X6^1K?XK$hFUQcF(f|Me literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/stream.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/stream.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ebf96b71098f25e8dd31509089a01f378a46a412 GIT binary patch literal 2203 zcmZ`&+f&=v9X=AqIF3VvrPaEGWL*rt0fq>prI&OaUlJKeK)#f5rWsk5Pl7kbawU<3 z?sSnErxSMep?&B-(7v>9zJOu#(n3f`JAGF$>!9|B8D-aC0vgQ_WWufvADu8|@Ry0AX$|@`a zmuODV_(-W}5V)-op@1uL9o7U%uGOHVRpc6Qsj~C{YJg6qZ?9!mZ)Q^2EO2c>MXAYv zz7I9ATvjTzduWkeO)Lx9Tqbq>7NAwAm8$5|O6@)v?&ATc^_g8&tANU8R}ykfgO4@f zN65L=#OjKWTgeKEm2~QM4pCOby3j9wMKyH@8?vg^#7zhyWm(t|Yh`sqd;kUcOU}S8 zRAk|YTW|{k+8l(wNI?)y69nKs!>I*Ylsx$VCYEYfG4{uWK#KT>UuJn z0gh6ohMcQbR1MYuEg{1-C}^Vk0Jtn9;4oK&T7|GKY^q=^A=V^Vt-^9jQDgWlfI~1WZ)rkl>mC?G?h42rMHEbf8y6cNP?jWAy$l*Zri~Fk z7A38^4H`QXk_eHbiXb2x(EKs#xd5C{s>T;a8p*cA6DQa&{)SG0=x!N1S%o+$2U~ z^mW2U$ESgT1?VXTqh}eMo?`}RJ7c4-GK2IyW2d9c5WT=S=n!*`4)c<;vGz-hnBt~q z^wEilcFQx}X?bRRpyi41(&N$LS?;#(EqYtzOgk^d&N=2dJ-|zi#h?9F*Y%jo&gs*} z=`=ORf&wq?a=$PShOcs~`a+R$8{-^7#;oWvh}eUax~{<+lxG^R;5%z)O{|~vqf|GXV&2cArv%Qo5=+k7pEyXEbYJ%`+ z2&t$Qy{S-W+#hI>k%VX{4I%a?9rvwv6hpUpsblcD+3xTWJb&C;CnN1QcMPYWaK|PM zPngp`EC$EpOvFFqUO_lf>{vgEzi$#6{a+(P77~kDLX(C(tJ+@@7y3>7cm-{ z&P0-YTmQK}lv<9=2F7!NW#42fHMiqxKL;>jJaME_Nn1kTi+)yvNk>c za-TZi)APMXzPFoa2hI*DVvWTL-1$Rlq_>kt)1^!6?$qbW+^e+nh;$#kPR5TQ&%X*f z?k-_>JIT#X=CkB&RD=B8ClvJw`4%#zn~1lbcPRRhc)Lq@*4QTY1+Lq67{z{X2|oNX zH_x7hacQ>)VSpimn6A20dV(U$-7)V}i2L?y$I?KSsG=!HYif0d;wwys}Te z(_jZsc`te)CXa7+(cm78f|o|U9_2e|xk+|_#d@9zjzD{p`hQ)y+;=5+mUi~~9XNzv zXy{4JjiXZ|%%edry|nz(%VGbdKNRTbuM?^6&gJx$K9PzlQ+yq_q^TdbpL5S OHuEhOT2%Ne-Tn`ft(n*W literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/task.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/task.mpy new file mode 100644 index 0000000000000000000000000000000000000000..466dce0ab1239f5853163f24e1d389307e6aa550 GIT binary patch literal 1403 zcmZ`&OK;;;6ux$o)_Jsbu8r$vN*i3~QTH`X%?KeOD#uMh3`0FFNF$AuS~s^%)J&2| zT%bFrji4-G&7K7dHg+=AtdOQH^9yDHtNa#@ok2)QSUUH9K9BF7?;g7}iI%pRMZ0_6 zB=y#&V|PzC+UIDNBdrca6ZjAu))_schzlT^Y1b;xXrqcmr%q10m1_O?7$w1ZO3x7w zJE_$nn*Ik>8g|zStD5v%2j#%ush`xGXRWSNY1~k2?Qao z+GJowk|%RC%sZ{JDM6FJLb=HY2z4OKIPMliyN8#e4p>H{*dnRtj64%SYRdgNfAkt zMMjz~veL|9ae|NNtQ0vcM))Xzs70dRe^A_*RF>VjtddnWm-FSEs;Wj#&8w>%M|>gXg*fI32}u0} z+;K=r`otpr!q(!n>fTorMOAZP`E~2YsCl=L`^p+Xoi%!6THamwK9m!9axm1{TRiCx zboM5QmatELEPVKAhR?b?Sye47%9^>6Qx#|)ILoTC7J{s)su1?Qk@*OkzJ(5BczU2S z#J@Alp^&%(3;6V*ki7GULTqFnK=aV@LtjV?1TdpM69i@xgAYY zi=n7e2@4biSfdbu1aT1Db!lLfVao43K)%euHAB75hJ+V8^Sq?F=PGc3_vYVXJPnjO z6J)_{_@tLn;&a-n>*5(m^xxKB>fA!~>N|JpD&C(q`?J-fP*PMXgi^+`(y6qx0^jKZ z$XWzhOCal#|Ak4E4&3OhQG43g^K|BIh{4X1R&0Na1I=k5pjTw`rAKo XJSzAZ|1!S{!~ad(0q=XkRgu2|()y1O literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/traceback.mpy b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/CircuitPython 9.x/lib/asyncio/traceback.mpy new file mode 100644 index 0000000000000000000000000000000000000000..e18e5a7eb1f66c38392c873e3d8dd6b17f700d79 GIT binary patch literal 649 zcmYL_UvJV-7{*UaVTi0Nr&v_jYzi~Lh$KRGvBbpCvJt{!nz>9a40c^Hjin`R6Cs3H z2#H?!VG0cN%4p`M_gp2gz61kT{~YUn5u{VDME zD)!V7;{-#95rXz-@q+?j0;0H3#6baLC{e~=vws{c9k>x89k`h-b6m=M_fx5@vG_xH z1Q|#qK@k_qkf2vSIcKGwO9wx@^tJO-I&?9ouYZ}-;jb{3#G9zHGpC6fclB&(HZ9jLrVx VN{28;(a}}7J}YAL?JE~i{tKH>!UzBW literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/README.txt b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/README.txt new file mode 100644 index 00000000..eae40302 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/advanced/CircuitPython_Commodore_16_KB2040/advanced/README.txt @@ -0,0 +1,8 @@ +This bundle contains multiple folders for different versions of CircuitPython. You must use the files that match the version of CircuitPython you're currently using. For example, if you are using CircuitPython X.x, copy the files from the corresponding CircuitPython X.x folder to your CIRCUITPY drive. +To use this project bundle, simply copy the contents of the CircuitPython version folder you're using from the zip file to your CIRCUITPY drive. +Contents in each version include: +* the code.py file +* the lib/ folder and all of its contents (including subfolders and .mpy or .py files) +* any assets (such as images, sounds, etc.) +NOTE: This will replace the current code.py, and the lib folder and its contents. Back up any desired code before copying these files! + This zip was downloaded from https://learn.adafruit.com/commodore-keyboard-to-usb-hid-with-circuitpython/advanced-keyboard-features on March 13, 2026. diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/code.py b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/code.py new file mode 100644 index 00000000..b3e00863 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/code.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Commodore 16 to USB HID adapter with Adafruit KB2040 +# +# Note that: +# * This matrix is different than the (more common) Commodore 64 matrix +# * There are no diodes, not even on modifiers, so there's only 2-key rollover. +# * This is a "physical" keymap, so that the functions of the keys are similar to the +# function of a standard PC keyboard key in the same location. +# +# See the guide or the advanced code for more information about the key matrix + +import board +import keypad +from adafruit_hid.keycode import Keycode as K +from adafruit_hid.keyboard import Keyboard +import usb_hid + +rows = [board.A3, board.D6, board.D10, board.D9, board.MOSI, board.D2, board.A0, board.D4] +cols = [board.A2, board.SCK, board.MISO, board.A1, board.D5, board.D7, board.D8, board.D3] + +keycodes = [ + K.BACKSPACE, K.ENTER, K.LEFT_ARROW, K.F8, K.F1, K.F2, K.F3, K.LEFT_BRACKET, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K.SEMICOLON, K.BACKSLASH, K.COMMA, + K.MINUS, K.WINDOWS, K.QUOTE, K.EQUALS, K.ESCAPE, K.RIGHT_ARROW, K.RIGHT_BRACKET, + K.FORWARD_SLASH, K.ONE, K.HOME, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, +] + +kbd = Keyboard(usb_hid.devices) + +with keypad.KeyMatrix(rows, cols) as keys: + while True: + if ev := keys.events.get(): + keycode = keycodes[ev.key_number] + if ev.pressed: + kbd.press(keycode) + else: + kbd.release(keycode) diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5f156d1581b8bfe5e1f820b57ac6d25a49df2daf GIT binary patch literal 744 zcmYjN%Wl&^6dfmVaMRRvonWAigyp2DK(YH$LEQk3Nt04Uttv{5ga+51BqOD^vB#Cl z%H4Ir#}u0EktqBDLfz063;u#h`cP*vbMBmT&wW(0;QlnbV7qoZj4^>->}n8Vk3y&h z2VhdNJkXLh5I=2Lm+IUk1_Hb1oGq{z+MOB4YZGG z%*WC0&>G}c)kXCg;D@<>On}tJo(tUzRWXk24uS!_KyHLVF6to^06vVpQMu`%k>h(F zatLz48wtXF6h^c;+K~WZhytG?{=zW=hs*w9)n?bagapx=rgbps#=ENH?`c;fYcH>6 zuj0_5JJ>oPUFuhF7%G(mc059~$DwmbqjJ@cd#+4(A`g3)_iW;H>8vu<%NJ!;z@-<} z1$L=s;~sKl;>*K@V!MYwp_@9n5y{PMUA`XZIXK#!uP`6vB)3^p-qw_+qcm$3HxW{g zn3;4bC8eyyoXJR;I!9ktVmBsQQ{uT%vrLMa_jNuIvQ&Djl$Em9Ms7q_txJZZ%vgz& zIO|3lM@bi!&s+bFj*=H^`P&oxc=99}dstCspDJ^+9j!h8 zN{JrKDNF03bX;auQigH-nE7U&9>dqlk3nJL%bBq=DDYp;3{#W_BSn31YSE+XdZ};z zG1kR9<wV{1a`<=W-S29}vc!Ak46V_3{sWn(*iQfe literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/consumer_control.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ae562e436d9047648f3edf5328676a07fc00c231 GIT binary patch literal 625 zcmYjNU2hUW6rBMIg>IMG55|^{cH2Iv4MIfZ!T3O=X-LyXNx#B_!F6}qZiL-+X0}R< z$$(AM2Y(FsSA6i%zv8SV#+P%?%{e*e=62Fxa|^a@*S?^U#|KxQTXzDVMI%B7l5iRf zYvCB=(`?K@*&BsJG9o^=xfl3Ay(W~!Wb#;HoJI}@_`>tuflIDEhkztHCLbf>ORDg3 z==qmGjoACR1#EN{HFCx+V8@J@eMttP1d#j7fy%uR2_g=x_?Y{v7TM~6k}#kgObfY? z62^c^$&lEL06nyw4+GEV0Z6^<0?dd!Y2iMqKY2bi)cX(yCb0M~*a=($mY#n3YI)4^ z18%V>j2nn+dA`;0s3Sl0X3Vbw-)hu8TLHC(!6!n&ty?X_cb3TPSC94&w+~-CqE|}b zgqARpMoOH1`?YtZt?vMHNh`Ks6A~$>ae9I>yRfue&frYHYYLQ=TdthN*}l|Q@XA5% zTwDLW*XbX?wwX%VPC9+h{%#r#XBb6h((saYc|t$%~bemq=`s1VJrq)?v^^_Jf&Oz-mCih*2R3g&orvf3~YZ zr7^F#@1ApMob2zATDRZ5pUj3+^)T!gdZU-u+4EqcqGvi8Jw@3c9FN~fI!_lW$}dAB zK?+CZBxls;6|!5kg;Z6ax9q4zwB>jevL~qRDUY?KlH8^@B>xQp&YF%NiUl-<^aGM$ zHAW@L26g*Z1$HPHG2Kuyl56_)&}FK^C}%G7T db4a3gA%*%5wopGp8ubt?oR1-c^AT(}dY^Owv@J(X*)fZQlMK}WRNXbYfZeunSl@}bh}t;HJfRfIpD;?)R}3u z7wQ>OYCnPB!7FF@vwQ2V>?Yp27i1Ho#$>Ne`~;r<0W~p`%z2;pJm>knGlzGA*=1^_ zDpwD*hGK}HDDv{BsI{+FH91vpfeF)Z9>N3VSQcf}R3rpOd|Rj`sWJjSV(b_6F8Zv2 zj>)FiXw{YDL*Q%Z`@Jkc6LUWd%rOnUdWgh2c>#C720lYMLTbYRG4Td^gYjypu4)FD z8LZ-wDk}#H(f}Mb$N?Qdv4&((H>yTM2kyFtbR8^-Rax%k^=1O${{kuT2(j5NeL-UGSm>{ z?YY!ru)Tcmop5eV5O<2(VlK~bfk;pB@891Y$eEtp(1A%YM`U=d)l|^ufbNm{_wl8Z0^rnGicpmp9?LD|;<>!EifP9pH8m1- zKu6i6M@fArItoWg?IiVB)CryC4F=OLqQ;{x=qlsFlpDG?-6enQH-Rs2QV%~!1KN{u zKuq)p3}wyPa(hr8qcyD(0B;G78)CotKD^IiBxVUgN> z8$fTGf}yknhSMW3k{*Rq={pdnop92>kRHoWa60XRvju7V6uh9KUUqQ;vv^$Vj;S#< zFly7UnY6D%Pn=~sloh4}Z+0_e^#_)$pg%)lGvz2+;lNOy6#6na2dpqtkWN;A!g!Sq zv3MPalB_Lmxu04LJj+sLE@K60=5-Q6#H};T;tKZMIw$|nxxxA(EUw3rDa>t_o?sGT z@0qVk-E01>@_$0j%6A0sn__XZ5?ipCkZrz8l`STc1q9joVsjp{WB9As0>3RJ6DSd1 z+f1$moJ`ctQcur>Z7UeS9~RGk|9Fr4fnb6^V(z2T)%iv7*(H7{tlQ@odj;vzekpJT zi44%W=I@pa3Wd#|@T!{N-*?agg4h2$Ha2glwKQol{ EH}z(GO#lD@ literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_base.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4f04cda1f1922197fc1c3125ece9f09c13aabdb6 GIT binary patch literal 1216 zcmZ9JUsD=a6u|GIAP|BpySX(6;}!%W7*I-?j86zFe}t$APD-Yo%et(>6kTRntxU#t z*U|~oevm%&Wr6qs65B6eU(yGgnS24K4}I_5MLM0%ojL#RIlpu6xhV@+ST$w28h0R_ zG-On7)FNLCoqds$YN*L|#1k3qb8R8q>VRo``J~kpfJ5%I8pnr#%-u1Vq?RPK+rYh>%Vf)Fy--G}ZFU3DrED%; zM(M(OW^5aAC<#pg6A;&If{Pr3_&O&cSwwgQUaSd#-rCq;bxvj%%%!%UCv#ia&u>&p zfHtBdrn=;43bHInz;b+YWV}ExZ-b8NTS45ucq*($pZy;`o5fRZ?4tEjDwhL{p-_2S z#~af!p2A+L zuvp8^DWoY#JeqKupsAvglh`)9C*fpe)Ba+H`M{t zQ4gRq2;jmpfR9N#q_KVw1@PWZkSKjdKu1y6Cg_Szz`5uooR69zRpc#abIyByvyxD3 zeQnlUe<~7Pp-`6N-oT&6QYWkMl)z$UKw|5sLzA()G zoiP&!l_LLR_NSS!%fA#3ZrV=ugO5R~VznhXy0w1u;Sx6#x94O}i|E7*R?7{cVwdZGGvV^GB2m#TD@B19}5X zfl>y~hoAIrp!~u9ht?m_uo}@q;0o`9zF~7i`q5}j17l64A??;EQg^OzgC@M3WCo`U zurcJnw|d|_Zuzq^6$%FYt`O#F)Z-g=6HCL}<1rQo(pdKQc!j^HM|G7{e*k?MVzK}L literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..90951e9e435ed336be90732d1d532a7ab94610f1 GIT binary patch literal 338 zcmZ=}W02=!bV*D}Oe-qQEQ!y^OwrFytxU>KEJ}&bNvzB-Er~BJ)+?xF;8*d6iu-_t zof3;v88pz&$e`E!5@Y6%>_}RaDhB8*kIwzGHq%Yg>CqXIFPmZ(sj} ziIXNznL2IyjG41$&zY-lXs~##DGMtbI|nBhHxDl#zkr~Su!yLbxP+vXw2bWfjT^T5 zFf`dn2rwonG_dD%Pj3`p(qfcmmSGZOiVQJg5MU8xGGP{D5o8f#4NPWiG+^Li>ELe= UQV?VlV;5i%<4|T0;|xp&08!Lkz5oCK literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..9a350a7f8594b22bbc86ff09550a10023ed3a4bb GIT binary patch literal 1978 zcmb7EX>$`t5N!`e2w{w5oEOI-;53Gigv;{Dt(CO079G3Zl`PvFvMt$QE`xz2Bm`zt zImkuGec$&Dm4CypNLBtoX0=*EQhZ5G_1o^A?N-meH%f(QgS(2h&(vq;mo6?`s2*Ra z?>ISkskT_3+kW;Et!dBs0d<{TtS`(j%q>-C7cNj&UeA=ODYICz%{+D3#%Q)w9W5KQ zW80w6NF+(5NTf;VBr+sMNn}YFBo30uk;s!MkSLNcNmwMtNZ2GC5+xF465}K)Bqm5q zl9-~9S=1?1s+bfhWo=!jaK;&IQqC=q=@bfLE)mI3c^#mtt#|lNw=xZ z)=Oo(NNu{4(kz`il3FU~SX#A6x>iw~@mUo(mP1>qTFHyID z*dX+q<+$YDo7^(8#9EifZAX zR zo@UsPRD(chmX$YBTFLMPV3`%Az@VrpC`DDj$Jc-dgB}cdFzmsI2Oh6+kJq@zYdr3O zR}mke_TbX_WH?zPqa@`&qCP+Q5`{DcZKl;2!cTj*Gvq;g#V9KB9IurUqT;(L>7a9y zbH8WvZhQUQRiWCc^VHt_e;~Ir8flsCk>OIDqGCWmjMZBHsE4nI#kJKky0Pbfuf)A8 zdhc`!yxyMwtVD0(?#!m1J1f!feDt${A3Xi+z42b}{F75&uc`}dbI;vtQz90^il{*N zd8~W^kr%P*CA3|`>X*^}3f8=e=xd0*j*jbC`vy91;J!D3w{ZX4=z0eayo>Jl@ZkGc z_W>UI5bHm}hL6$n2_F6w{24ZWj@~b@=}T<>3Xgn^E#KhLZ}Hf7c>H^8{Q=uz+pzsd z?Dz>ge@5Rgh{xjS{}ltjVeoeh@lFhLA4WKiUEGh|Jb*nsh`l_7eLRf)Jc0wf3klv0 zjrSnQdy(RONb`Q^d;l4i35>GTkY$;K!7_z|EYrxb)RAYIL4oBciY&7*SsJid9>f^S z9Bh_(I4lb&u`Hs@(!@AR3l)}Qm|$sRlBI(wmL(iwS;k?O<2b^yf}<=aP-QuZX_ix% zVR;C%EDxi`@(AiIk7ABx74s~oag5~*j84IgisUkKqi<<5*<5 zfU_)5;2g`7SYmk!=UJY{1(s)Uk>w(uV0ji#vOI^UST5lb%ky}e-D$MOTJa3KGq@bP zjAz-M#g*68yK8{q|pf)@1E(0K&ub literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 10.x/lib/adafruit_hid/mouse.mpy new file mode 100644 index 0000000000000000000000000000000000000000..412d8bceda72440edc9761a99b347d3505233787 GIT binary patch literal 856 zcmY*UO>YuW6n!&Lpp*^+jL*`d9Ra~kt8FNvOIm29mDWHVcpswk&&Vs^4n zs!GC@@*Xh5EwPwQWrZD)7l4Ld6Yf`qBBmyJuPhd~0acYY+ZJG4YI}f-sY;n`Ayviz zj2#XrSu6;pstkrxo#0-asUnn16&V=I6+x1)Dhc?nVhK;}2!N^xc_D)%VV9&b`8+W4 zd6B;d44n~EDlZm98NiOQo3=E0`6`Ug&Bs%->+$&VEikmYa3k`k8(vxnhof^n5zfwp zZuT0-{POC?%xbvT*T?EM>i6vuPzY+XD$Av!1jt=L?g8V2oFL?ZAuCEU&=tfYhRiN# zI3^e(%_4o&8C~WTn&gNPje~?_GQuEQi@QFD7HX3yHll;NMdOAAehr6`i^Scy572r) z3H33a*q@-U>knYi#dcrtz}B!d`m@1?^@*pUx15DTv>w_OI9!J#4d^(4=bpjyF^*W9 z2GHOmAmt+=?bASuPYbOGAx^V4-3M(x9W+};eR@9unHX=VuY4w;fxR$*+^D~jX02qC z?pJ7IogQfU_X%~#WOX+DxDLj6CC$+k>q6JiAg9^}(e3r-w>t@yF$X{rt2vIQu^LGS z$GhsM@BheCc9VrgG1i0H>R;Q6leS`80#RO-p_&0AsWNoC#Q4X-5040sjdfr2pd7Nh zyk0NIapP|H>_?Bve1?C;4A*#Q3xT literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/code.py b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/code.py new file mode 100644 index 00000000..b3e00863 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/code.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Commodore 16 to USB HID adapter with Adafruit KB2040 +# +# Note that: +# * This matrix is different than the (more common) Commodore 64 matrix +# * There are no diodes, not even on modifiers, so there's only 2-key rollover. +# * This is a "physical" keymap, so that the functions of the keys are similar to the +# function of a standard PC keyboard key in the same location. +# +# See the guide or the advanced code for more information about the key matrix + +import board +import keypad +from adafruit_hid.keycode import Keycode as K +from adafruit_hid.keyboard import Keyboard +import usb_hid + +rows = [board.A3, board.D6, board.D10, board.D9, board.MOSI, board.D2, board.A0, board.D4] +cols = [board.A2, board.SCK, board.MISO, board.A1, board.D5, board.D7, board.D8, board.D3] + +keycodes = [ + K.BACKSPACE, K.ENTER, K.LEFT_ARROW, K.F8, K.F1, K.F2, K.F3, K.LEFT_BRACKET, + K.THREE, K.W, K.A, K.FOUR, K.Z, K.S, K.E, K.LEFT_SHIFT, + K.FIVE, K.R, K.D, K.SIX, K.C, K.F, K.T, K.X, + K.SEVEN, K.Y, K.G, K.EIGHT, K.B, K.H, K.U, K.V, + K.NINE, K.I, K.J, K.ZERO, K.M, K.K, K.O, K.N, + K.DOWN_ARROW, K.P, K.L, K.UP_ARROW, K.PERIOD, K.SEMICOLON, K.BACKSLASH, K.COMMA, + K.MINUS, K.WINDOWS, K.QUOTE, K.EQUALS, K.ESCAPE, K.RIGHT_ARROW, K.RIGHT_BRACKET, + K.FORWARD_SLASH, K.ONE, K.HOME, K.LEFT_CONTROL, K.TWO, K.SPACE, K.ALT, K.Q, K.GRAVE_ACCENT, +] + +kbd = Keyboard(usb_hid.devices) + +with keypad.KeyMatrix(rows, cols) as keys: + while True: + if ev := keys.events.get(): + keycode = keycodes[ev.key_number] + if ev.pressed: + kbd.press(keycode) + else: + kbd.release(keycode) diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5f156d1581b8bfe5e1f820b57ac6d25a49df2daf GIT binary patch literal 744 zcmYjN%Wl&^6dfmVaMRRvonWAigyp2DK(YH$LEQk3Nt04Uttv{5ga+51BqOD^vB#Cl z%H4Ir#}u0EktqBDLfz063;u#h`cP*vbMBmT&wW(0;QlnbV7qoZj4^>->}n8Vk3y&h z2VhdNJkXLh5I=2Lm+IUk1_Hb1oGq{z+MOB4YZGG z%*WC0&>G}c)kXCg;D@<>On}tJo(tUzRWXk24uS!_KyHLVF6to^06vVpQMu`%k>h(F zatLz48wtXF6h^c;+K~WZhytG?{=zW=hs*w9)n?bagapx=rgbps#=ENH?`c;fYcH>6 zuj0_5JJ>oPUFuhF7%G(mc059~$DwmbqjJ@cd#+4(A`g3)_iW;H>8vu<%NJ!;z@-<} z1$L=s;~sKl;>*K@V!MYwp_@9n5y{PMUA`XZIXK#!uP`6vB)3^p-qw_+qcm$3HxW{g zn3;4bC8eyyoXJR;I!9ktVmBsQQ{uT%vrLMa_jNuIvQ&Djl$Em9Ms7q_txJZZ%vgz& zIO|3lM@bi!&s+bFj*=H^`P&oxc=99}dstCspDJ^+9j!h8 zN{JrKDNF03bX;auQigH-nE7U&9>dqlk3nJL%bBq=DDYp;3{#W_BSn31YSE+XdZ};z zG1kR9<wV{1a`<=W-S29}vc!Ak46V_3{sWn(*iQfe literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/consumer_control.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ae562e436d9047648f3edf5328676a07fc00c231 GIT binary patch literal 625 zcmYjNU2hUW6rBMIg>IMG55|^{cH2Iv4MIfZ!T3O=X-LyXNx#B_!F6}qZiL-+X0}R< z$$(AM2Y(FsSA6i%zv8SV#+P%?%{e*e=62Fxa|^a@*S?^U#|KxQTXzDVMI%B7l5iRf zYvCB=(`?K@*&BsJG9o^=xfl3Ay(W~!Wb#;HoJI}@_`>tuflIDEhkztHCLbf>ORDg3 z==qmGjoACR1#EN{HFCx+V8@J@eMttP1d#j7fy%uR2_g=x_?Y{v7TM~6k}#kgObfY? z62^c^$&lEL06nyw4+GEV0Z6^<0?dd!Y2iMqKY2bi)cX(yCb0M~*a=($mY#n3YI)4^ z18%V>j2nn+dA`;0s3Sl0X3Vbw-)hu8TLHC(!6!n&ty?X_cb3TPSC94&w+~-CqE|}b zgqARpMoOH1`?YtZt?vMHNh`Ks6A~$>ae9I>yRfue&frYHYYLQ=TdthN*}l|Q@XA5% zTwDLW*XbX?wwX%VPC9+h{%#r#XBb6h((saYc|t$%~bemq=`s1VJrq)?v^^_Jf&Oz-mCih*2R3g&orvf3~YZ zr7^F#@1ApMob2zATDRZ5pUj3+^)T!gdZU-u+4EqcqGvi8Jw@3c9FN~fI!_lW$}dAB zK?+CZBxls;6|!5kg;Z6ax9q4zwB>jevL~qRDUY?KlH8^@B>xQp&YF%NiUl-<^aGM$ zHAW@L26g*Z1$HPHG2Kuyl56_)&}FK^C}%G7T db4a3gA%*%5wopGp8ubt?oR1-c^AT(}dY^Owv@J(X*)fZQlMK}WRNXbYfZeunSl@}bh}t;HJfRfIpD;?)R}3u z7wQ>OYCnPB!7FF@vwQ2V>?Yp27i1Ho#$>Ne`~;r<0W~p`%z2;pJm>knGlzGA*=1^_ zDpwD*hGK}HDDv{BsI{+FH91vpfeF)Z9>N3VSQcf}R3rpOd|Rj`sWJjSV(b_6F8Zv2 zj>)FiXw{YDL*Q%Z`@Jkc6LUWd%rOnUdWgh2c>#C720lYMLTbYRG4Td^gYjypu4)FD z8LZ-wDk}#H(f}Mb$N?Qdv4&((H>yTM2kyFtbR8^-Rax%k^=1O${{kuT2(j5NeL-UGSm>{ z?YY!ru)Tcmop5eV5O<2(VlK~bfk;pB@891Y$eEtp(1A%YM`U=d)l|^ufbNm{_wl8Z0^rnGicpmp9?LD|;<>!EifP9pH8m1- zKu6i6M@fArItoWg?IiVB)CryC4F=OLqQ;{x=qlsFlpDG?-6enQH-Rs2QV%~!1KN{u zKuq)p3}wyPa(hr8qcyD(0B;G78)CotKD^IiBxVUgN> z8$fTGf}yknhSMW3k{*Rq={pdnop92>kRHoWa60XRvju7V6uh9KUUqQ;vv^$Vj;S#< zFly7UnY6D%Pn=~sloh4}Z+0_e^#_)$pg%)lGvz2+;lNOy6#6na2dpqtkWN;A!g!Sq zv3MPalB_Lmxu04LJj+sLE@K60=5-Q6#H};T;tKZMIw$|nxxxA(EUw3rDa>t_o?sGT z@0qVk-E01>@_$0j%6A0sn__XZ5?ipCkZrz8l`STc1q9joVsjp{WB9As0>3RJ6DSd1 z+f1$moJ`ctQcur>Z7UeS9~RGk|9Fr4fnb6^V(z2T)%iv7*(H7{tlQ@odj;vzekpJT zi44%W=I@pa3Wd#|@T!{N-*?agg4h2$Ha2glwKQol{ EH}z(GO#lD@ literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_base.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4f04cda1f1922197fc1c3125ece9f09c13aabdb6 GIT binary patch literal 1216 zcmZ9JUsD=a6u|GIAP|BpySX(6;}!%W7*I-?j86zFe}t$APD-Yo%et(>6kTRntxU#t z*U|~oevm%&Wr6qs65B6eU(yGgnS24K4}I_5MLM0%ojL#RIlpu6xhV@+ST$w28h0R_ zG-On7)FNLCoqds$YN*L|#1k3qb8R8q>VRo``J~kpfJ5%I8pnr#%-u1Vq?RPK+rYh>%Vf)Fy--G}ZFU3DrED%; zM(M(OW^5aAC<#pg6A;&If{Pr3_&O&cSwwgQUaSd#-rCq;bxvj%%%!%UCv#ia&u>&p zfHtBdrn=;43bHInz;b+YWV}ExZ-b8NTS45ucq*($pZy;`o5fRZ?4tEjDwhL{p-_2S z#~af!p2A+L zuvp8^DWoY#JeqKupsAvglh`)9C*fpe)Ba+H`M{t zQ4gRq2;jmpfR9N#q_KVw1@PWZkSKjdKu1y6Cg_Szz`5uooR69zRpc#abIyByvyxD3 zeQnlUe<~7Pp-`6N-oT&6QYWkMl)z$UKw|5sLzA()G zoiP&!l_LLR_NSS!%fA#3ZrV=ugO5R~VznhXy0w1u;Sx6#x94O}i|E7*R?7{cVwdZGGvV^GB2m#TD@B19}5X zfl>y~hoAIrp!~u9ht?m_uo}@q;0o`9zF~7i`q5}j17l64A??;EQg^OzgC@M3WCo`U zurcJnw|d|_Zuzq^6$%FYt`O#F)Z-g=6HCL}<1rQo(pdKQc!j^HM|G7{e*k?MVzK}L literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..90951e9e435ed336be90732d1d532a7ab94610f1 GIT binary patch literal 338 zcmZ=}W02=!bV*D}Oe-qQEQ!y^OwrFytxU>KEJ}&bNvzB-Er~BJ)+?xF;8*d6iu-_t zof3;v88pz&$e`E!5@Y6%>_}RaDhB8*kIwzGHq%Yg>CqXIFPmZ(sj} ziIXNznL2IyjG41$&zY-lXs~##DGMtbI|nBhHxDl#zkr~Su!yLbxP+vXw2bWfjT^T5 zFf`dn2rwonG_dD%Pj3`p(qfcmmSGZOiVQJg5MU8xGGP{D5o8f#4NPWiG+^Li>ELe= UQV?VlV;5i%<4|T0;|xp&08!Lkz5oCK literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..9a350a7f8594b22bbc86ff09550a10023ed3a4bb GIT binary patch literal 1978 zcmb7EX>$`t5N!`e2w{w5oEOI-;53Gigv;{Dt(CO079G3Zl`PvFvMt$QE`xz2Bm`zt zImkuGec$&Dm4CypNLBtoX0=*EQhZ5G_1o^A?N-meH%f(QgS(2h&(vq;mo6?`s2*Ra z?>ISkskT_3+kW;Et!dBs0d<{TtS`(j%q>-C7cNj&UeA=ODYICz%{+D3#%Q)w9W5KQ zW80w6NF+(5NTf;VBr+sMNn}YFBo30uk;s!MkSLNcNmwMtNZ2GC5+xF465}K)Bqm5q zl9-~9S=1?1s+bfhWo=!jaK;&IQqC=q=@bfLE)mI3c^#mtt#|lNw=xZ z)=Oo(NNu{4(kz`il3FU~SX#A6x>iw~@mUo(mP1>qTFHyID z*dX+q<+$YDo7^(8#9EifZAX zR zo@UsPRD(chmX$YBTFLMPV3`%Az@VrpC`DDj$Jc-dgB}cdFzmsI2Oh6+kJq@zYdr3O zR}mke_TbX_WH?zPqa@`&qCP+Q5`{DcZKl;2!cTj*Gvq;g#V9KB9IurUqT;(L>7a9y zbH8WvZhQUQRiWCc^VHt_e;~Ir8flsCk>OIDqGCWmjMZBHsE4nI#kJKky0Pbfuf)A8 zdhc`!yxyMwtVD0(?#!m1J1f!feDt${A3Xi+z42b}{F75&uc`}dbI;vtQz90^il{*N zd8~W^kr%P*CA3|`>X*^}3f8=e=xd0*j*jbC`vy91;J!D3w{ZX4=z0eayo>Jl@ZkGc z_W>UI5bHm}hL6$n2_F6w{24ZWj@~b@=}T<>3Xgn^E#KhLZ}Hf7c>H^8{Q=uz+pzsd z?Dz>ge@5Rgh{xjS{}ltjVeoeh@lFhLA4WKiUEGh|Jb*nsh`l_7eLRf)Jc0wf3klv0 zjrSnQdy(RONb`Q^d;l4i35>GTkY$;K!7_z|EYrxb)RAYIL4oBciY&7*SsJid9>f^S z9Bh_(I4lb&u`Hs@(!@AR3l)}Qm|$sRlBI(wmL(iwS;k?O<2b^yf}<=aP-QuZX_ix% zVR;C%EDxi`@(AiIk7ABx74s~oag5~*j84IgisUkKqi<<5*<5 zfU_)5;2g`7SYmk!=UJY{1(s)Uk>w(uV0ji#vOI^UST5lb%ky}e-D$MOTJa3KGq@bP zjAz-M#g*68yK8{q|pf)@1E(0K&ub literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/CircuitPython 9.x/lib/adafruit_hid/mouse.mpy new file mode 100644 index 0000000000000000000000000000000000000000..412d8bceda72440edc9761a99b347d3505233787 GIT binary patch literal 856 zcmY*UO>YuW6n!&Lpp*^+jL*`d9Ra~kt8FNvOIm29mDWHVcpswk&&Vs^4n zs!GC@@*Xh5EwPwQWrZD)7l4Ld6Yf`qBBmyJuPhd~0acYY+ZJG4YI}f-sY;n`Ayviz zj2#XrSu6;pstkrxo#0-asUnn16&V=I6+x1)Dhc?nVhK;}2!N^xc_D)%VV9&b`8+W4 zd6B;d44n~EDlZm98NiOQo3=E0`6`Ug&Bs%->+$&VEikmYa3k`k8(vxnhof^n5zfwp zZuT0-{POC?%xbvT*T?EM>i6vuPzY+XD$Av!1jt=L?g8V2oFL?ZAuCEU&=tfYhRiN# zI3^e(%_4o&8C~WTn&gNPje~?_GQuEQi@QFD7HX3yHll;NMdOAAehr6`i^Scy572r) z3H33a*q@-U>knYi#dcrtz}B!d`m@1?^@*pUx15DTv>w_OI9!J#4d^(4=bpjyF^*W9 z2GHOmAmt+=?bASuPYbOGAx^V4-3M(x9W+};eR@9unHX=VuY4w;fxR$*+^D~jX02qC z?pJ7IogQfU_X%~#WOX+DxDLj6CC$+k>q6JiAg9^}(e3r-w>t@yF$X{rt2vIQu^LGS z$GhsM@BheCc9VrgG1i0H>R;Q6leS`80#RO-p_&0AsWNoC#Q4X-5040sjdfr2pd7Nh zyk0NIapP|H>_?Bve1?C;4A*#Q3xT literal 0 HcmV?d00001 diff --git a/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/README.txt b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/README.txt new file mode 100644 index 00000000..e3963fb6 --- /dev/null +++ b/trunk/workspace/BMC/Keyboard/basic/CircuitPython_Commodore_16_KB2040/basic/README.txt @@ -0,0 +1,8 @@ +This bundle contains multiple folders for different versions of CircuitPython. You must use the files that match the version of CircuitPython you're currently using. For example, if you are using CircuitPython X.x, copy the files from the corresponding CircuitPython X.x folder to your CIRCUITPY drive. +To use this project bundle, simply copy the contents of the CircuitPython version folder you're using from the zip file to your CIRCUITPY drive. +Contents in each version include: +* the code.py file +* the lib/ folder and all of its contents (including subfolders and .mpy or .py files) +* any assets (such as images, sounds, etc.) +NOTE: This will replace the current code.py, and the lib folder and its contents. Back up any desired code before copying these files! + This zip was downloaded from https://learn.adafruit.com/commodore-keyboard-to-usb-hid-with-circuitpython/coding-the-keyboard on March 13, 2026.