From 233cda3e25d2a8d0f18ef72b27f55c795cf89e37 Mon Sep 17 00:00:00 2001 From: Dave Date: Sun, 28 Nov 2021 23:50:28 -0600 Subject: [PATCH] Add back the upper/lower Apple map Port the old .h macro-based keymap definition to new C module based definition. --- firmware/asdf/CMakeLists.txt | 2 +- firmware/asdf/keymap_list.cmake | 4 +- firmware/asdf/src/CMakeLists.txt | 2 + .../asdf/src/Keymaps/asdf_keymap_apple2.c | 57 +--- .../asdf/src/Keymaps/asdf_keymap_apple2.h | 253 +----------------- .../src/Keymaps/asdf_keymap_apple2_add_map.c | 166 ++++++++++++ .../src/Keymaps/asdf_keymap_apple2_add_map.h | 78 ++++++ .../asdf/src/Keymaps/asdf_keymap_classic.c | 8 +- .../src/Keymaps/asdf_keymap_classic_add_map.h | 8 +- 9 files changed, 270 insertions(+), 308 deletions(-) create mode 100644 firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.c create mode 100644 firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.h diff --git a/firmware/asdf/CMakeLists.txt b/firmware/asdf/CMakeLists.txt index 64e681a..1e6d8a9 100644 --- a/firmware/asdf/CMakeLists.txt +++ b/firmware/asdf/CMakeLists.txt @@ -25,7 +25,7 @@ elseif(ARCH MATCHES atmega2560) endif() project("asdf" - VERSION 1.6.0 + VERSION 1.6.1 DESCRIPTION "A customizable keyboard matrix controller for retrocomputers" LANGUAGES C) diff --git a/firmware/asdf/keymap_list.cmake b/firmware/asdf/keymap_list.cmake index 3291584..d5fef8f 100644 --- a/firmware/asdf/keymap_list.cmake +++ b/firmware/asdf/keymap_list.cmake @@ -1,9 +1,9 @@ list(APPEND keymap_list "" "" -# "" + "" # "" - "" + "" ) diff --git a/firmware/asdf/src/CMakeLists.txt b/firmware/asdf/src/CMakeLists.txt index bc962b8..cd67e4b 100644 --- a/firmware/asdf/src/CMakeLists.txt +++ b/firmware/asdf/src/CMakeLists.txt @@ -86,6 +86,8 @@ list (APPEND SOURCES Keymaps/asdf_keymap_classic.c Keymaps/asdf_keymap_classic_caps.c Keymaps/asdf_keymap_classic_add_map.c + Keymaps/asdf_keymap_apple2.c + Keymaps/asdf_keymap_apple2_add_map.c Keymaps/asdf_keymap_sol.c main.c ) diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_apple2.c b/firmware/asdf/src/Keymaps/asdf_keymap_apple2.c index 344fa24..69d57ca 100644 --- a/firmware/asdf/src/Keymaps/asdf_keymap_apple2.c +++ b/firmware/asdf/src/Keymaps/asdf_keymap_apple2.c @@ -24,8 +24,10 @@ // -#include "asdf_keymap_apple2.h" -#include "asdf_keymap_defs_dipswitch.h" +#include "asdf_keymaps.h" +#include "asdf_virtual.h" +#include "asdf_modifiers.h" +#include "asdf_keymap_apple2_add_map.h" // PROCEDURE: // INPUTS: @@ -41,39 +43,12 @@ // // COMPLEXITY: // - - - -// PROCEDURE: apple_add_map - -// INPUTS: asdf_keycode_t (*matrix) - a SOL_NUM_ROWS x SOL_NUM_COLS matrix of -// keycodes for each physical row/column pair -// modifier_index_t modifier index - the modifier state corresponding to -// the keycode matrix -// -// OUTPUTS: none -// DESCRIPTION: Passes the keycode matrix and modifier state through to -// asdf_keymaps_add_map(), along with the row/column dimensions. -// -// SIDE EFFECTS: the matrix is added to the keymap -// -// SCOPE: private -// -// COMPLEXITY: 1 -// -static void apple_add_map(const asdf_keycode_t (*matrix)[APPLE_NUM_COLS], - modifier_index_t modifier_index) +void setup_apple2_keymap(void) { - asdf_keymaps_add_map(&matrix[0][0], modifier_index, (uint8_t) APPLE_NUM_ROWS, - (uint8_t) APPLE_NUM_COLS); -} - -void setup_classic_keymap(void) -{ - apple_add_map(apple_plain_map, MOD_PLAIN_MAP); - apple_add_map(apple_caps_map, MOD_CAPS_MAP); - apple_add_map(apple_shift_map, MOD_SHIFT_MAP); - apple_add_map(apple_ctrl_map, MOD_CTRL_MAP); + apple_add_map(APPLE_PLAIN_MAP, MOD_PLAIN_MAP); + apple_add_map(APPLE_CAPS_MAP, MOD_CAPS_MAP); + apple_add_map(APPLE_SHIFT_MAP, MOD_SHIFT_MAP); + apple_add_map(APPLE_CTRL_MAP, MOD_CTRL_MAP); asdf_virtual_init(); @@ -81,16 +56,11 @@ void setup_classic_keymap(void) // Attach the physical POWER LED as the CAPS LED. Assign no triggered // function, and initialize to initial state of the CAPS logic. The CAPS LED // will be controlled by the state of the CAPSLOCK logic. - { .virtual_device = VCAPS_LED, .physical_device = APPLE_POWER_LED, .initial_value = 0 }, \ - asdf_virtual_assign(VCAPS_LED, APPLE_POWER_LED, V_NOFUNC, APPLE_POWER_LED_INIT_VALUE); - // Assign CAPS LED to virtual CAPS LED, and initialize to the INIT value, to - // match the initial CAPSLOCK state. The capslock state code will alter the - // virtual LED according to the state. - asdf_virtual_assign(VCAPS_LED, APPLE_CAPS_LED, V_NOFUNC, APPLE_CAPS_LED_INIT_VALUE); - { .virtual_device = APPLE_VIRTUAL_DISABLED_LED, \ - .physical_device = APPLE_DISABLED_LED, \ - .initial_value = 0 }, \ + asdf_virtual_assign(VCAPS_LED, APPLE_POWER_LED, V_NOFUNC, APPLE_POWER_LED_INIT_VALUE); + + // Assign CAPS LED to off (disabled) + asdf_virtual_assign(APPLE_VIRTUAL_DISABLED_LED, APPLE_DISABLED_LED, V_NOFUNC, APPLE_DISABLED_INIT_VALUE); // assign RESET output to the virtual RESET output, configure to produce a short pulse when activated asdf_virtual_assign(APPLE_VIRTUAL_RESET, APPLE_RESET_OUTPUT, V_PULSE_SHORT, !APPLE_RESET_ACTIVE_VALUE); @@ -100,7 +70,6 @@ void setup_classic_keymap(void) } - //-------|---------|---------+---------+---------+---------+---------+---------+ // Above line is 80 columns, and should display completely in the editor. diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_apple2.h b/firmware/asdf/src/Keymaps/asdf_keymap_apple2.h index b91dcfc..1b4e7d9 100644 --- a/firmware/asdf/src/Keymaps/asdf_keymap_apple2.h +++ b/firmware/asdf/src/Keymaps/asdf_keymap_apple2.h @@ -39,259 +39,12 @@ #if !defined(ASDF_KEYMAP_DEFS_APPLE2_H) #define ASDF_KEYMAP_DEFS_APPLE2_H +// include DIP switch definitions +#include "asdf_keymap_defs_dipswitch.h" + // Edit the number of rows and columns used in this map. If the number is less // than the maxium, the unused elements will be initialized to 0. -#define ASDF_APPLE2_NUM_ROWS 9 // DIP switches are row 8 (zero-based) -#define ASDF_APPLE2_NUM_COLS 8 - -#define APPLE_ACTION_RESET ACTION_VOUT1 -#define APPLE_VIRTUAL_RESET VOUT1 -#define APPLE_RESET_OUTPUT PHYSICAL_OUT3_OPEN_HI -#define APPLE_RESET_ACTIVE_VALUE 0 - -#define APPLE_ACTION_CLEAR ACTION_VOUT2 -#define APPLE_VIRTUAL_CLR_SCR VOUT2 -#define APPLE_CLR_SCR_OUTPUT PHYSICAL_OUT1_OPEN_LO -#define APPLE_CLR_SCR_ACTIVE_VALUE 1 - -#define APPLE_VIRTUAL_POWER_LED VLED1 -#define APPLE_POWER_LED PHYSICAL_LED1 -#define APPLE_POWER_LED_INIT_VALUE 1 - -#define APPLE_VIRTUAL_DISABLED_LED VLED2 -#define APPLE_DISABLED_LED PHYSICAL_LED3 -#define APPLE_DISABLED_INIT_VALUE 0 - -// The PLAIN map uses the "power" button as a caps-lock, so map the CAPS LED to -// the power button LED. -#define ASDF_APPLE2_PLAIN_KEYMAP_INITIALIZER \ - { \ - { .virtual_device = VCAPS_LED, .physical_device = APPLE_POWER_LED, .initial_value = 0 }, \ - { .virtual_device = APPLE_VIRTUAL_DISABLED_LED, \ - .physical_device = APPLE_DISABLED_LED, \ - .initial_value = 0 }, \ - { .virtual_device = APPLE_VIRTUAL_RESET, \ - .physical_device = APPLE_RESET_OUTPUT, \ - .function = V_PULSE_SHORT, \ - .initial_value = !APPLE_RESET_ACTIVE_VALUE }, \ - { \ - .virtual_device = APPLE_VIRTUAL_CLR_SCR, .physical_device = APPLE_CLR_SCR_OUTPUT, \ - .function = V_PULSE_LONG, .initial_value = !APPLE_CLR_SCR_ACTIVE_VALUE \ - } \ - } - -// The ALL CAPS map is the classic Apple II/II+ map. There is no CAPS LED, since -// CAPS doesn't matter in the ALL CAPS keymap. -#define ASDF_APPLE2_CAPS_KEYMAP_INITIALIZER \ - { \ - { .virtual_device = APPLE_VIRTUAL_POWER_LED, \ - .physical_device = APPLE_POWER_LED, \ - .initial_value = APPLE_POWER_LED_INIT_VALUE }, \ - { .virtual_device = APPLE_VIRTUAL_DISABLED_LED, \ - .physical_device = APPLE_DISABLED_LED, \ - .initial_value = 0 }, \ - { .virtual_device = APPLE_VIRTUAL_RESET, \ - .physical_device = APPLE_RESET_OUTPUT, \ - .function = V_PULSE_SHORT, \ - .initial_value = !APPLE_RESET_ACTIVE_VALUE }, \ - { \ - .virtual_device = APPLE_VIRTUAL_CLR_SCR, .physical_device = APPLE_CLR_SCR_OUTPUT, \ - .function = V_PULSE_LONG, .initial_value = !APPLE_CLR_SCR_ACTIVE_VALUE \ - } \ - } - - -#define ASDF_APPLE2_KEYMAP_INITIALIZER \ - ASDF_APPLE2_PLAIN_KEYMAP_INITIALIZER, ASDF_APPLE2_CAPS_KEYMAP_INITIALIZER - -// Structure to initialize hooks. No hook functions are needed for APPLE2 keyboard. -#define ASDF_APPLE2_KEYMAP_HOOK_INITIALIZER_LENGTH 0 -#define ASDF_APPLE2_PLAIN_KEYMAP_HOOK_INITIALIZER \ - { \ - } -#define ASDF_APPLE2_CAPS_KEYMAP_HOOK_INITIALIZER \ - { \ - } -#define ASDF_APPLE2_KEYMAP_HOOK_INITIALIZER \ - ASDF_APPLE2_PLAIN_KEYMAP_HOOK_INITIALIZER, ASDF_APPLE2_CAPS_KEYMAP_HOOK_INITIALIZER - - -// Key Matrix for combination of ASCII controller and Classic ASCII matrix -// -// Col-> 0 1 2 3 4 5 6 7 -// Row 0 POWER R-Shift L-Shift (no key) ESC TAB CTRL \(backslash) -// Row 1 Rubout P ; / SPACEBAR Z A Q -// Row 2 Break ,(comma) M N B V C X -// Row 3 Spare K J H G F D A -// Row 4 Rt arrow I U Y T R E W -// Row 5 LT arrow Repeat CapsLock Return LineFeed O(alpha) L .(period) -// Row 6 ~(tilde) ] [ -(dash) :(colon) 0(numeral) 9 8 -// Row 7 @(at) 7 6 5 4 3 2 1 -// -// Row 15 DIP switches 0-7 -// -// Notes: -// -// 1) The keys above correspond to the silk screen on the PCB. For the OSI and -// Apple layouts, the keys may not all match the silk screen. When creating a -// layout different from the silk screen, look up the row and column for the -// silk screen label at the desired position, and then place the desired -// function in the keymap definition at the desired row and column. For -// example, the Apple 2 keymap places the "RESET" key at the "[" silk-screen -// position, Row 6, Col 2. The keymap places ACTION_RESET at Row 6, Col 2 in -// the "ASDF_APPLE2_CTRL_MAP" to map the RESET function to the CTRL-RESET key -// combination. -// -// 2) To ensure consistent DIP switch operation within the keymap, a -// ASDF_ASCII_DIP_SWITCHES macro is defined. Keeping the ACTION_MAPSEL0-3 -// definitions in positions 0-3 ensures consistent map selection among all -// keymaps. - -#define ASDF_APPLE2_DIP_SWITCHES ASDF_KEYMAP_DIP_SWITCHES - -#define APPLE_LEFT_ARROW ASCII_CTRL_H -#define APPLE_RIGHT_ARROW ASCII_CTRL_U - -// clang-format off -#define ASDF_APPLE2_PLAIN_MAP \ - { \ - [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, \ - ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, \ - [1] = { ASCII_DEL, 'p', ';', '/', ASCII_SPACE, 'z', 'a', 'q' }, \ - [2] = { ACTION_NOTHING, ASCII_COMMA, 'm', 'n', 'b', 'v', 'c', 'x' }, \ - [3] = { ACTION_NOTHING, 'k', 'j', 'h', 'g', 'f', 'd', 's' }, \ - [4] = { ACTION_NOTHING, 'i', 'u', 'y', 't', 'r', 'e', 'w' }, \ - [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, '^', 'o', 'l', ASCII_PERIOD }, \ - [6] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, '-', ':', ASCII_ZERO, '9', '8' }, \ - [7] = { APPLE_LEFT_ARROW, '7', '6', '5', '4', '3', '2', '1' }, \ - ASDF_APPLE2_DIP_SWITCHES \ - } - -#define ASDF_APPLE2_SHIFT_MAP \ - { \ - [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, \ - ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, \ - [1] = { ACTION_NOTHING, 'P', '+', '?', ASCII_SPACE, 'Z', 'A', 'Q' }, \ - [2] = { ACTION_NOTHING, '<', 'M', 'N', 'B', 'V', 'C', 'X' }, \ - [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, \ - [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, \ - [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ASCII_AT, 'O', 'L', '>' }, \ - [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_CLEAR, '=', \ - '*', ASCII_ZERO, ASCII_RT_PAREN, ASCII_LT_PAREN }, \ - [7] = { APPLE_LEFT_ARROW, ASCII_SINGLE_QUOTE, '&', '%', '$', '#', ASCII_DOUBLE_QUOTE, '!' }, \ - ASDF_APPLE2_DIP_SWITCHES \ - } - -#define ASDF_APPLE2_CAPS_MAP \ - { \ - [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, \ - ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, \ - [1] = { ACTION_NOTHING, 'P', ';', '/', ASCII_SPACE, 'Z', 'A', 'Q' }, \ - [2] = { ACTION_NOTHING, ASCII_COMMA, 'M', 'N', 'B', 'V', 'C', 'X' }, \ - [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, \ - [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, \ - [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ACTION_REPEAT, 'O', 'L', ASCII_PERIOD }, \ - [6] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, '-', ':', ASCII_ZERO, '9', '8' }, \ - [7] = { APPLE_LEFT_ARROW, '7', '6', '5', '4', '3', '2', '1' }, \ - ASDF_APPLE2_DIP_SWITCHES \ - } - - -#define ASDF_APPLE2_SHIFT_CAPS_MAP \ - { \ - [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, \ - ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, \ - [1] = { ACTION_NOTHING, ASCII_AT, '+', '?', ASCII_SPACE, 'Z', 'A', 'Q' }, \ - [2] = { ACTION_NOTHING, '<', 'M', '^', 'B', 'V', 'C', 'X' }, \ - [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, \ - [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, \ - [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ACTION_REPEAT, 'O', 'L', '>' }, \ - [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_CLEAR, '=', \ - '*', ASCII_ZERO, ASCII_RT_PAREN, ASCII_LT_PAREN }, \ - [7] = { APPLE_LEFT_ARROW, ASCII_SINGLE_QUOTE, '&', '%', '$', '#', ASCII_DOUBLE_QUOTE, '!' }, \ - ASDF_APPLE2_DIP_SWITCHES \ - } - -#define ASDF_APPLE2_CTRL_MAP \ - { \ - [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, \ - ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, \ - [1] = { ACTION_NOTHING, ASCII_CTRL_P, ACTION_NOTHING, ACTION_NOTHING, \ - ASCII_SPACE, ASCII_CTRL_Z, ASCII_CTRL_A, ASCII_CTRL_Q }, \ - [2] = { ACTION_NOTHING, ASCII_COMMA, ASCII_CTRL_M, ASCII_CTRL_N, \ - ASCII_CTRL_B, ASCII_CTRL_V, ASCII_CTRL_C, ASCII_CTRL_X }, \ - [3] = { ACTION_NOTHING, ASCII_CTRL_K, ASCII_CTRL_J, ASCII_CTRL_H, \ - ASCII_CTRL_G, ASCII_CTRL_F, ASCII_CTRL_D, ASCII_CTRL_S }, \ - [4] = { ACTION_NOTHING, ASCII_CTRL_I, ASCII_CTRL_U, ASCII_CTRL_Y, \ - ASCII_CTRL_T, ASCII_CTRL_R, ASCII_CTRL_E, ASCII_CTRL_W }, \ - [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, \ - ACTION_REPEAT, ASCII_CTRL_O, ASCII_CTRL_L, ACTION_NOTHING }, \ - [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_RESET, ACTION_NOTHING, \ - ACTION_NOTHING, ACTION_FN_10, ACTION_FN_9, ACTION_FN_8 }, \ - [7] = { APPLE_LEFT_ARROW, ACTION_FN_7, ACTION_FN_6, ACTION_FN_5, \ - ACTION_FN_4, ACTION_FN_3, ACTION_FN_2, ACTION_FN_1 }, \ - ASDF_APPLE2_DIP_SWITCHES \ - } -// clang-format on - -#define ASDF_APPLE2_MAP_DECLARATIONS \ - static const FLASH keycode_matrix_t apple2_plain_matrix = ASDF_APPLE2_PLAIN_MAP; \ - static const FLASH keycode_matrix_t apple2_shift_matrix = ASDF_APPLE2_SHIFT_MAP; \ - static const FLASH keycode_matrix_t apple2_caps_matrix = ASDF_APPLE2_CAPS_MAP; \ - static const FLASH keycode_matrix_t apple2_caps_shift_matrix = ASDF_APPLE2_SHIFT_CAPS_MAP; \ - static const FLASH keycode_matrix_t apple2_ctrl_matrix = ASDF_APPLE2_CTRL_MAP; - - -// Here, you can specify which maps are associated with which modifier keys. -// There can be multiple definitions. For example, as shown here, an ALL CAPS -// keymap can be made by assigning the caps map to the "no modifier" position. -// Or, more additional keymaps can be defined above, and keymap sets can be -// defined below that pick and choose between them. The modifiers are assigned as follows: -// -// [0]: plain (no modifiers) -// [1]: shift (shift key or shift lock active) -// [2]: caps (caps lock active) -// [3]: ctrl: (control key active) - -#define ASDF_APPLE2_PLAIN_MAP_DEFS \ - { \ - [MOD_PLAIN_MAP] = &apple2_plain_matrix, [MOD_SHIFT_MAP] = &apple2_shift_matrix, \ - [MOD_CAPS_MAP] = &apple2_caps_matrix, [MOD_CTRL_MAP] = &apple2_ctrl_matrix \ - } - -#define ASDF_APPLE2_CAPS_MAP_DEFS \ - { \ - [MOD_PLAIN_MAP] = &apple2_caps_matrix, [MOD_SHIFT_MAP] = &apple2_caps_shift_matrix, \ - [MOD_CAPS_MAP] = &apple2_caps_matrix, [MOD_CTRL_MAP] = &apple2_ctrl_matrix \ - } - -#define ASDF_APPLE2_ALL_MAPS ASDF_APPLE2_PLAIN_MAP_DEFS, ASDF_APPLE2_CAPS_MAP_DEFS - -#define ASDF_APPLE2_ALL_MAPS_COUNT 2 - -#if !defined(ASDF_NUM_ROWS) || (ASDF_NUM_ROWS < ASDF_APPLE2_NUM_ROWS) -#undef ASDF_NUM_ROWS -#define ASDF_NUM_ROWS ASDF_APPLE2_NUM_ROWS -#endif - -#if !defined(ASDF_NUM_COLS) || (ASDF_NUM_COLS < ASDF_APPLE2_NUM_COLS) -#undef ASDF_NUM_COLS -#define ASDF_NUM_COLS ASDF_APPLE2_NUM_COLS -#endif - -#if !defined(ASDF_KEYMAP_INITIALIZER_LENGTH) \ - || (ASDF_KEYMAP_INITIALIZER_LENGTH < ASDF_APPLE2_KEYMAP_INITIALIZER_LENGTH) -#undef ASDF_KEYMAP_INITIALIZER_LENGTH -#define ASDF_KEYMAP_INITIALIZER_LENGTH ASDF_APPLE2_KEYMAP_INITIALIZER_LENGTH -#endif - -#if !defined(ASDF_KEYMAP_HOOK_INITIALIZER_LENGTH) \ - || (ASDF_KEYMAP_HOOK_INITIALIZER_LENGTH < ASDF_APPLE2_KEYMAP_HOOK_INITIALIZER_LENGTH) -#undef ASDF_KEYMAP_HOOK_INITIALIZER_LENGTH -#define ASDF_KEYMAP_HOOK_INITIALIZER_LENGTH ASDF_APPLE2_KEYMAP_HOOK_INITIALIZER_LENGTH -#endif - #endif /* !defined (ASDF_KEYMAP_DEFS_APPLE2_H) */ //-------|---------|---------+---------+---------+---------+---------+---------+ diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.c b/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.c new file mode 100644 index 0000000..bbd6c64 --- /dev/null +++ b/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.c @@ -0,0 +1,166 @@ +// -*- mode: C; tab-width: 2 ; indent-tabs-mode: nil -*- +// +// Unified Keyboard Project +// ASDF keyboard firmware +// +// asdf_keymap_classic.c +// +// defines the keymap matrices used by the "classic" ADM 3A style keymap variants +// +// Copyright 2019 David Fenyes +// +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program. If not, see . +// + +#include "asdf_arch.h" +#include "asdf.h" +#include "asdf_ascii.h" +#include "asdf_keymaps.h" +#include "asdf_keymap_apple2_add_map.h" + +// Key Matrix for combination of ASCII controller and Apple ASCII matrix +// +// Col-> 0 1 2 3 4 5 6 7 +// Row 0 POWER R-Shift L-Shift (no key) ESC TAB CTRL \(backslash) +// Row 1 Rubout P ; / SPACEBAR Z A Q +// Row 2 Break ,(comma) M N B V C X +// Row 3 Spare K J H G F D A +// Row 4 Rt arrow I U Y T R E W +// Row 5 LT arrow Repeat CapsLock Return LineFeed O(alpha) L .(period) +// Row 6 ~(tilde) ] [ -(dash) :(colon) 0(numeral) 9 8 +// Row 7 @(at) 7 6 5 4 3 2 1 +// +// Row 15 DIP switches 0-7 +// +// Notes: +// +// 1) The keys above correspond to the silk screen on the PCB. For the OSI and +// Apple layouts, the keys may not all match the silk screen. When creating a +// layout different from the silk screen, look up the row and column for the +// silk screen label at the desired position, and then place the desired +// function in the keymap definition at the desired row and column. For +// example, the Apple 2 keymap places the "RESET" key at the "[" silk-screen +// position, Row 6, Col 2. The keymap places ACTION_RESET at Row 6, Col 2 in +// the "ASDF_APPLE2_CTRL_MAP" to map the RESET function to the CTRL-RESET key +// combination. +// +// 2) To ensure consistent DIP switch operation within the keymap, a +// ASDF_ASCII_DIP_SWITCHES macro is defined. Keeping the ACTION_MAPSEL0-3 +// definitions in positions 0-3 ensures consistent map selection among all +// keymaps. + +#define ASDF_APPLE2_DIP_SWITCHES ASDF_KEYMAP_DIP_SWITCHES + +typedef asdf_keycode_t apple_keycode_matrix_t[ASDF_APPLE2_NUM_ROWS][ASDF_APPLE2_NUM_COLS]; + + +const FLASH apple_keycode_matrix_t apple_plain_matrix = { + [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, + ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, + [1] = { ASCII_DEL, 'p', ';', '/', ASCII_SPACE, 'z', 'a', 'q' }, + [2] = { ACTION_NOTHING, ASCII_COMMA, 'm', 'n', 'b', 'v', 'c', 'x' }, + [3] = { ACTION_NOTHING, 'k', 'j', 'h', 'g', 'f', 'd', 's' }, + [4] = { ACTION_NOTHING, 'i', 'u', 'y', 't', 'r', 'e', 'w' }, + [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, '^', 'o', 'l', ASCII_PERIOD }, + [6] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, '-', ':', ASCII_ZERO, '9', '8' }, + [7] = { APPLE_LEFT_ARROW, '7', '6', '5', '4', '3', '2', '1' }, + ASDF_APPLE2_DIP_SWITCHES +}; + +const FLASH apple_keycode_matrix_t apple_shift_matrix = { + [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, + ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, + [1] = { ACTION_NOTHING, 'P', '+', '?', ASCII_SPACE, 'Z', 'A', 'Q' }, + [2] = { ACTION_NOTHING, '<', 'M', 'N', 'B', 'V', 'C', 'X' }, + [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, + [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, + [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ASCII_AT, 'O', 'L', '>' }, + [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_CLEAR, '=', + '*', ASCII_ZERO, ASCII_RT_PAREN, ASCII_LT_PAREN }, + [7] = { APPLE_LEFT_ARROW, ASCII_SINGLE_QUOTE, '&', '%', '$', '#', ASCII_DOUBLE_QUOTE, '!' }, + ASDF_APPLE2_DIP_SWITCHES +}; + +const FLASH apple_keycode_matrix_t apple_caps_shift_matrix = { + [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, + ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, + [1] = { ACTION_NOTHING, ASCII_AT, '+', '?', ASCII_SPACE, 'Z', 'A', 'Q' }, + [2] = { ACTION_NOTHING, '<', 'M', '^', 'B', 'V', 'C', 'X' }, + [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, + [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, + [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ACTION_REPEAT, 'O', 'L', '>' }, + [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_CLEAR, '=', + '*', ASCII_ZERO, ASCII_RT_PAREN, ASCII_LT_PAREN }, + [7] = { APPLE_LEFT_ARROW, ASCII_SINGLE_QUOTE, '&', '%', '$', '#', ASCII_DOUBLE_QUOTE, '!' }, + ASDF_APPLE2_DIP_SWITCHES +}; + +const FLASH apple_keycode_matrix_t apple_caps_matrix = { + [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, + ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, + [1] = { ACTION_NOTHING, 'P', ';', '/', ASCII_SPACE, 'Z', 'A', 'Q' }, + [2] = { ACTION_NOTHING, ASCII_COMMA, 'M', 'N', 'B', 'V', 'C', 'X' }, + [3] = { ACTION_NOTHING, 'K', 'J', 'H', 'G', 'F', 'D', 'S' }, + [4] = { ACTION_NOTHING, 'I', 'U', 'Y', 'T', 'R', 'E', 'W' }, + [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, ACTION_REPEAT, 'O', 'L', ASCII_PERIOD }, + [6] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, '-', ':', ASCII_ZERO, '9', '8' }, + [7] = { APPLE_LEFT_ARROW, '7', '6', '5', '4', '3', '2', '1' }, + ASDF_APPLE2_DIP_SWITCHES +}; + +const FLASH apple_keycode_matrix_t apple_ctrl_matrix = { + [0] = { ACTION_CAPS, ACTION_SHIFT, ACTION_SHIFT, ACTION_NOTHING, + ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, APPLE_RIGHT_ARROW }, + [1] = { ACTION_NOTHING, ASCII_CTRL_P, ACTION_NOTHING, ACTION_NOTHING, + ASCII_SPACE, ASCII_CTRL_Z, ASCII_CTRL_A, ASCII_CTRL_Q }, + [2] = { ACTION_NOTHING, ASCII_COMMA, ASCII_CTRL_M, ASCII_CTRL_N, + ASCII_CTRL_B, ASCII_CTRL_V, ASCII_CTRL_C, ASCII_CTRL_X }, + [3] = { ACTION_NOTHING, ASCII_CTRL_K, ASCII_CTRL_J, ASCII_CTRL_H, + ASCII_CTRL_G, ASCII_CTRL_F, ASCII_CTRL_D, ASCII_CTRL_S }, + [4] = { ACTION_NOTHING, ASCII_CTRL_I, ASCII_CTRL_U, ASCII_CTRL_Y, + ASCII_CTRL_T, ASCII_CTRL_R, ASCII_CTRL_E, ASCII_CTRL_W }, + [5] = { ACTION_NOTHING, ACTION_NOTHING, ACTION_NOTHING, ASCII_CR, + ACTION_REPEAT, ASCII_CTRL_O, ASCII_CTRL_L, ACTION_NOTHING }, + [6] = { ACTION_NOTHING, ACTION_NOTHING, APPLE_ACTION_RESET, ACTION_NOTHING, + ACTION_NOTHING, ACTION_FN_10, ACTION_FN_9, ACTION_FN_8 }, + [7] = { APPLE_LEFT_ARROW, ACTION_FN_7, ACTION_FN_6, ACTION_FN_5, + ACTION_FN_4, ACTION_FN_3, ACTION_FN_2, ACTION_FN_1 }, + ASDF_APPLE2_DIP_SWITCHES +}; + + + +static const apple_keycode_matrix_t *apple_maps[] = { + [APPLE_CAPS_MAP] = &apple_caps_matrix, + [APPLE_PLAIN_MAP] = &apple_plain_matrix, + [APPLE_SHIFT_MAP] = &apple_shift_matrix, + [APPLE_CTRL_MAP] = &apple_ctrl_matrix, + [APPLE_CAPS_SHIFT_MAP] = &apple_caps_shift_matrix +}; + + void apple_add_map(const apple_map_index_t map_index, + modifier_index_t modifier_index) +{ + + asdf_keycode_t (*matrix)[ASDF_APPLE2_NUM_COLS] = + (asdf_keycode_t (*)[ASDF_APPLE2_NUM_COLS]) apple_maps[map_index]; + + asdf_keymaps_add_map(&matrix[0][0], modifier_index, (uint8_t) ASDF_APPLE2_NUM_ROWS, + (uint8_t) ASDF_APPLE2_NUM_COLS); +} + + + +//-------|---------|---------+---------+---------+---------+---------+---------+ +// Above line is 80 columns, and should display completely in the editor. diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.h b/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.h new file mode 100644 index 0000000..a2b511a --- /dev/null +++ b/firmware/asdf/src/Keymaps/asdf_keymap_apple2_add_map.h @@ -0,0 +1,78 @@ +// -*- mode: C; tab-width: 4 ; indent-tabs-mode: nil -*- +// +// Unfified Keyboard Project +// ASDF keyboard firmware +// +// asdf_keymap_apple_add_map.h +// +// defines keymap matrices and add_map() function for apple2 layouts +// +// Copyright 2019 David Fenyes +// +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program. If not, see . + + +// To use this ascii for a new keymap, edit the keymaps definitions as +// desired. The keymaps are organized from row 0, counting upward, and each row +// includes the columns from 0-NUM_COLS. +// + +#if !defined(ASDF_KEYMAP_APPLE_ADD_MAP_H) +#define ASDF_KEYMAP_APPLE_ADD_MAP_H + +#include "asdf_keymap_defs_dipswitch.h" +#include "asdf_modifiers.h" + +#define ASDF_APPLE2_NUM_ROWS 9 // DIP switches are row 8 (zero-based) +#define ASDF_APPLE2_NUM_COLS 8 + +#define APPLE_ACTION_RESET ACTION_VOUT1 +#define APPLE_VIRTUAL_RESET VOUT1 +#define APPLE_RESET_OUTPUT PHYSICAL_OUT3_OPEN_HI +#define APPLE_RESET_ACTIVE_VALUE 0 + +#define APPLE_ACTION_CLEAR ACTION_VOUT2 +#define APPLE_VIRTUAL_CLR_SCR VOUT2 +#define APPLE_CLR_SCR_OUTPUT PHYSICAL_OUT1_OPEN_LO +#define APPLE_CLR_SCR_ACTIVE_VALUE 1 + +#define APPLE_VIRTUAL_POWER_LED VLED1 +#define APPLE_POWER_LED PHYSICAL_LED1 +#define APPLE_POWER_LED_INIT_VALUE 1 + +#define APPLE_VIRTUAL_DISABLED_LED VLED2 +#define APPLE_DISABLED_LED PHYSICAL_LED3 +#define APPLE_DISABLED_INIT_VALUE 0 + +#define ASDF_APPLE2_DIP_SWITCHES ASDF_KEYMAP_DIP_SWITCHES + +#define APPLE_LEFT_ARROW ASCII_CTRL_H +#define APPLE_RIGHT_ARROW ASCII_CTRL_U + +typedef enum { + APPLE_PLAIN_MAP, + APPLE_CAPS_MAP, + APPLE_SHIFT_MAP, + APPLE_CAPS_SHIFT_MAP, + APPLE_CTRL_MAP +} apple_map_index_t; + + +// function prototypes +void apple_add_map(const apple_map_index_t map_index, modifier_index_t modifier_index); + +#endif /* !defined (ASDF_KEYMAP_APPLE_ADD_MAP_H) */ + +//-------|---------|---------+---------+---------+---------+---------+---------+ +// Above line is 80 columns, and should display completely in the editor. diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_classic.c b/firmware/asdf/src/Keymaps/asdf_keymap_classic.c index 15ac907..7686756 100644 --- a/firmware/asdf/src/Keymaps/asdf_keymap_classic.c +++ b/firmware/asdf/src/Keymaps/asdf_keymap_classic.c @@ -28,8 +28,7 @@ #include "asdf_modifiers.h" #include "asdf_keymap_classic.h" #include "asdf_keymap_classic_add_map.h" -//FIXME: remove unused arch.h call -#include "asdf_arch.h" + // PROCEDURE: // INPUTS: // OUTPUTS: @@ -47,15 +46,10 @@ void setup_classic_keymap(void) { - asdf_arch_send_code('*'); classic_add_map(CLASSIC_PLAIN_MAP, MOD_PLAIN_MAP); - asdf_arch_send_code('*'); classic_add_map(CLASSIC_CAPS_MAP, MOD_CAPS_MAP); - asdf_arch_send_code('*'); classic_add_map(CLASSIC_SHIFT_MAP, MOD_SHIFT_MAP); - asdf_arch_send_code('*'); classic_add_map(CLASSIC_CTRL_MAP, MOD_CTRL_MAP); - asdf_arch_send_code('*'); asdf_virtual_init(); diff --git a/firmware/asdf/src/Keymaps/asdf_keymap_classic_add_map.h b/firmware/asdf/src/Keymaps/asdf_keymap_classic_add_map.h index bf8d973..e5b0e17 100644 --- a/firmware/asdf/src/Keymaps/asdf_keymap_classic_add_map.h +++ b/firmware/asdf/src/Keymaps/asdf_keymap_classic_add_map.h @@ -34,10 +34,10 @@ #include "asdf_modifiers.h" typedef enum { - CLASSIC_PLAIN_MAP = 0, - CLASSIC_CAPS_MAP = 1, - CLASSIC_SHIFT_MAP = 2, - CLASSIC_CTRL_MAP = 3, + CLASSIC_PLAIN_MAP, + CLASSIC_CAPS_MAP, + CLASSIC_SHIFT_MAP, + CLASSIC_CTRL_MAP, } classic_map_index_t;