diff --git a/keyboards/massdrop/alt/keymaps/charlesrocket/config.h b/keyboards/massdrop/alt/keymaps/charlesrocket/config.h
new file mode 100644
index 0000000000..90b4a27f33
--- /dev/null
+++ b/keyboards/massdrop/alt/keymaps/charlesrocket/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2022 charlesrocket
+ *
+ * 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 2 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 .
+ */
+
+#pragma once
+
+#define UNICODE_SELECTED_MODES UC_BSD, UC_MAC, UC_LNX
diff --git a/keyboards/massdrop/alt/keymaps/charlesrocket/keymap.c b/keyboards/massdrop/alt/keymaps/charlesrocket/keymap.c
index bd11bad72f..8d4b3523eb 100644
--- a/keyboards/massdrop/alt/keymaps/charlesrocket/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/charlesrocket/keymap.c
@@ -17,43 +17,207 @@
#include QMK_KEYBOARD_H
enum alt_keycodes {
- U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
- U_T_AGCR, //USB Toggle Automatic GCR control
- DBG_TOG, //DEBUG Toggle On / Off
- DBG_MTRX, //DEBUG Toggle Matrix Prints
- DBG_KBD, //DEBUG Toggle Keyboard Prints
- DBG_MOU, //DEBUG Toggle Mouse Prints
- MD_BOOT, //Restart into bootloader after hold timeout
+ L_BRI = SAFE_RANGE, //LED Brightness Increase //Working
+ L_BRD, //LED Brightness Decrease //Working
+ L_EDG_I, //LED Edge Brightness Increase
+ L_EDG_D, //LED Edge Brightness Decrease
+ L_EDG_M, //LED Edge lighting mode
+ L_PTN, //LED Pattern Select Next //Working
+ L_PTP, //LED Pattern Select Previous //Working
+ L_PSI, //LED Pattern Speed Increase //Working
+ L_PSD, //LED Pattern Speed Decrease //Working
+ L_RATIOD,
+ L_RATIOI,
+ L_T_MD, //LED Toggle Mode //Working
+ L_T_ONF, //LED Toggle On / Off //Broken
+ L_ON, //LED On //Broken
+ L_OFF, //LED Off //Broken
+ L_T_BR, //LED Toggle Breath Effect //Working
+ L_T_PTD, //LED Toggle Scrolling Pattern Direction //Working
+ U_T_AGCR, //USB Toggle Automatic GCR control //Working
+ DBG_TOG, //DEBUG Toggle On / Off //
+ DBG_MTRX, //DEBUG Toggle Matrix Prints //
+ DBG_KBD, //DEBUG Toggle Keyboard Prints //
+ DBG_MOU, //DEBUG Toggle Mouse Prints //
+ DBG_FAC, //DEBUG Factory light testing (All on white)
+ MD_BOOT //Restart into bootloader after hold timeout //Working
};
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = LAYOUT_65_ansi_blocker(
+ [0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
- [1] = LAYOUT_65_ansi_blocker(
+ [1] = LAYOUT(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE,
- _______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END,
- _______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, KC_VOLU,
- _______, RGB_TOG, _______, _______, _______, MD_BOOT, NK_TOGG, DBG_TOG, _______, _______, _______, _______, KC_PGUP, KC_VOLD,
- _______, LAG_SWP, LAG_NRM, _______, KC_APP, _______, KC_HOME, KC_PGDN, KC_END
+ L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END,
+ L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU,
+ _______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, NK_TOGG, _______, _______, _______, _______, _______, KC_PGUP, KC_VOLD,
+ MO(2), _______, _______, DBG_FAC, KC_APP, _______, KC_HOME, KC_PGDN, KC_END
+ ),
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, EEP_RST, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, UC_RMOD, UC_MOD, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, LAG_SWP, LAG_NRM, _______, _______, TG(3), _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ XP(0,1), XP(2,3), XP(4,5), XP(6,7), XP(8,9), XP(10,11), XP(12,13), XP(14,15), XP(16,17), XP(18,19), XP(20,21), XP(22,23), XP(24,25), _______, _______,
+ _______, KC_QUES, XP(27,28), XP(29,31), X(32), XP(33,34), X(35), X(36), XP(37,38), XP(39,40), XP(41,42), XP(43,44), XP(45,46), _______, _______,
+ _______, XP(47,48), X(49), X(50), KC_UNDS, XP(52,5), XP(53,54), XP(55,56), KC_QUOT, XP(59,60), XP(61,62), XP(63,64), _______, _______,
+ _______, XP(65,66), X(67), XP(68,69), X(70), X(71), X(72), X(73), KC_PIPE, XP(75,76), X(77), XP(78,79), _______, _______,
+ _______, _______, _______, _______, _______, TG(3), _______, _______, _______
),
};
-
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
-
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint32_t key_timer;
-
+ static uint8_t scroll_effect = 0;
switch (keycode) {
- case U_T_AUTO:
- if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
- TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
+ case L_BRI ... U_T_AGCR:
+ if (record->event.pressed) {
+ md_led_changed();
+ }
+ break;
+ }
+ switch (keycode) {
+ case L_BRI:
+ if (record->event.pressed) {
+ if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
+ else gcr_desired += LED_GCR_STEP;
+ if (led_animation_breathing) gcr_breathe = gcr_desired;
+ }
+ return false;
+ case L_BRD:
+ if (record->event.pressed) {
+ if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
+ else gcr_desired -= LED_GCR_STEP;
+ if (led_animation_breathing) gcr_breathe = gcr_desired;
+ }
+ return false;
+ case L_EDG_M:
+ if (record->event.pressed) {
+ led_edge_mode++;
+ if (led_edge_mode > LED_EDGE_MODE_MAX) {
+ led_edge_mode = LED_EDGE_MODE_ALL;
+ }
+ }
+ return false;
+ case L_EDG_I:
+ if (record->event.pressed) {
+ led_edge_brightness += 0.1;
+ if (led_edge_brightness > 1) { led_edge_brightness = 1; }
+ }
+ return false;
+ case L_EDG_D:
+ if (record->event.pressed) {
+ led_edge_brightness -= 0.1;
+ if (led_edge_brightness < 0) { led_edge_brightness = 0; }
+ }
+ return false;
+ case L_RATIOI:
+ if (record->event.pressed) {
+ led_ratio_brightness += 0.2;
+ if (led_ratio_brightness > 2.0) { led_ratio_brightness = 2.0; }
+ }
+ return false;
+ case L_RATIOD:
+ if (record->event.pressed) {
+ led_ratio_brightness -= 0.2;
+ if (led_ratio_brightness < 0.0) { led_ratio_brightness = 0.0; }
+ }
+ return false;
+ case L_PTN:
+ if (record->event.pressed) {
+ if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
+ else led_animation_id++;
+ }
+ return false;
+ case L_PTP:
+ if (record->event.pressed) {
+ if (led_animation_id == 0) led_animation_id = led_setups_count - 1;
+ else led_animation_id--;
+ }
+ return false;
+ case L_PSI:
+ if (record->event.pressed) {
+ led_animation_speed += ANIMATION_SPEED_STEP;
+ }
+ return false;
+ case L_PSD:
+ if (record->event.pressed) {
+ led_animation_speed -= ANIMATION_SPEED_STEP;
+ if (led_animation_speed < 0) led_animation_speed = 0;
+ }
+ return false;
+ case L_T_MD:
+ if (record->event.pressed) {
+ led_lighting_mode++;
+ if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL;
+ }
+ return false;
+ case L_T_ONF:
+ if (record->event.pressed) {
+ led_enabled = !led_enabled;
+ I2C3733_Control_Set(led_enabled);
+ }
+ return false;
+ case L_ON:
+ if (record->event.pressed) {
+ led_enabled = 1;
+ I2C3733_Control_Set(led_enabled);
+ }
+ return false;
+ case L_OFF:
+ if (record->event.pressed) {
+ led_enabled = 0;
+ I2C3733_Control_Set(led_enabled);
+ }
+ return false;
+ case L_T_BR:
+ if (record->event.pressed) {
+ led_animation_breathing = !led_animation_breathing;
+ if (led_animation_breathing) {
+ gcr_breathe = gcr_desired;
+ led_animation_breathe_cur = BREATHE_MIN_STEP;
+ breathe_dir = 1;
+ }
+ }
+ return false;
+ case L_T_PTD:
+ if (record->event.pressed) {
+ scroll_effect++;
+ if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
+ led_animation_direction = 1;
+ led_animation_orientation = 0;
+ led_animation_circular = 0;
+ } else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
+ led_animation_direction = 1;
+ led_animation_orientation = 1;
+ led_animation_circular = 0;
+ } else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
+ led_animation_direction = 0;
+ led_animation_orientation = 1;
+ led_animation_circular = 0;
+ } else if (scroll_effect == 4) { //Patterns with scroll explode from center
+ led_animation_direction = 0;
+ led_animation_orientation = 0;
+ led_animation_circular = 1;
+ } else if (scroll_effect == 5) { //Patterns with scroll implode on center
+ led_animation_direction = 1;
+ led_animation_orientation = 0;
+ led_animation_circular = 1;
+ } else { //Patterns with scroll move horizontal (Left to right)
+ scroll_effect = 0;
+ led_animation_direction = 0;
+ led_animation_orientation = 0;
+ led_animation_circular = 0;
+ }
}
return false;
case U_T_AGCR:
@@ -61,6 +225,18 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
}
return false;
+ case DBG_FAC:
+ if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
+ led_lighting_mode = LED_MODE_NORMAL;
+ led_edge_brightness = 1;
+ led_edge_mode = LED_EDGE_MODE_ALL;
+ led_animation_breathing = 0;
+ led_animation_id = 7; //led_programs.c led_setups leds_white index
+ gcr_desired = LED_GCR_MAX;
+ led_enabled = 1;
+ I2C3733_Control_Set(led_enabled);
+ }
+ return false;
case DBG_TOG:
if (record->event.pressed) {
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
@@ -90,33 +266,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}
return false;
- case RGB_TOG:
- if (record->event.pressed) {
- switch (rgb_matrix_get_flags()) {
- case LED_FLAG_ALL: {
- rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR);
- rgb_matrix_set_color_all(0, 0, 0);
- }
- break;
- case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR): {
- rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
- rgb_matrix_set_color_all(0, 0, 0);
- }
- break;
- case LED_FLAG_UNDERGLOW: {
- rgb_matrix_set_flags(LED_FLAG_NONE);
- rgb_matrix_disable_noeeprom();
- }
- break;
- default: {
- rgb_matrix_set_flags(LED_FLAG_ALL);
- rgb_matrix_enable_noeeprom();
- }
- break;
- }
- }
- return false;
default:
return true;
}
}
+ led_instruction_t led_instructions[] = {
+ { .flags = LED_FLAG_USE_ROTATE_PATTERN },
+ { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id0 = 0x1, .b = 253, .layer = 1 },
+ { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id0 = 0x1, .r = 253, .b = 253, .layer = 2 },
+ { .flags = LED_FLAG_MATCH_LAYER | LED_FLAG_USE_PATTERN, .pattern_id = 8, .layer = 3 },
+ { .end = 1 }
+ };
diff --git a/keyboards/massdrop/alt/keymaps/charlesrocket/rules.mk b/keyboards/massdrop/alt/keymaps/charlesrocket/rules.mk
new file mode 100644
index 0000000000..d684e3a615
--- /dev/null
+++ b/keyboards/massdrop/alt/keymaps/charlesrocket/rules.mk
@@ -0,0 +1,3 @@
+OPT_DEFS += -DUSE_MASSDROP_CONFIGURATOR
+UNICODEMAP_ENABLE = yes
+APL_ENABLE = yes
diff --git a/users/charlesrocket/apl.c b/users/charlesrocket/apl.c
new file mode 100644
index 0000000000..63d835c909
--- /dev/null
+++ b/users/charlesrocket/apl.c
@@ -0,0 +1,183 @@
+/* Copyright 2022 charlesrocket
+ *
+ * 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 2 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 QMK_KEYBOARD_H
+
+enum unicode_names {
+ DIAMOND,
+ QUAD_DIAMOND,
+ DIAERESIS,
+ IBEAM,
+ MACRON,
+ DEL_TILDE,
+ LESS,
+ DEL_STILE,
+ LESS_EQUAL,
+ DELTA_STILE,
+ EQUALS,
+ CIRCLE_STILE,
+ GREATER_EQUAL,
+ CIRCLE_BACKSLASH,
+ GREATER,
+ CIRCLED_MINUS,
+ NOT_EQUAL,
+ CIRCLE_STAR,
+ OR,
+ DOWN_CARET_TILDE,
+ AND,
+ UP_CARET_TILDE,
+ MULT,
+ EXCL,
+ DIVISION,
+ QUAD_DIVIDE,
+ QUESTION_MARK,
+ OMEGA,
+ OMEGA_UNDERBAR,
+ EPSILON,
+ SMALL_ELEMENT,
+ EPSILON_UNDERBAR,
+ RHO,
+ TILDE,
+ TILDE_DIAERESIS,
+ UPWARDS_ARROW,
+ DOWNWARDS_ARROW,
+ IOTA,
+ IOTA_UNDERBAR,
+ WHITE_CIRCLE,
+ CIRCLE_DIAERESIS,
+ STAR_OPERATOR,
+ STAR_DIAERESIS,
+ LEFT_ARROW,
+ QUOTE_QUAD,
+ RIGHT_ARROW,
+ ZILDE,
+ ALPHA,
+ ALPHA_UNDERBAR,
+ LEFT_CEILING,
+ LEFT_FLOOR,
+ LOW_LINE,
+ NABLA,
+ INCREMENT,
+ DELTA_UNDERBAR,
+ RING_OPERATOR,
+ JOT_DIAERESIS,
+ APOSTROPHE,
+ QUAD_EQUAL,
+ QUAD,
+ SQUISH_QUAD,
+ DOWN_TACK_JOT,
+ IDENTICAL,
+ UP_TACK_JOT,
+ NOT_IDENTICAL,
+ RIGHT_TACK,
+ LEFT_TACK,
+ SUBSET,
+ SUPERSET,
+ CHI,
+ INTERSECTION,
+ UNION,
+ UP_TACK,
+ DOWN_TACK,
+ VERTICAL_LINE,
+ UP_SHOE_JOT,
+ COMMA_BAR,
+ BACKSLASH_BAR,
+ SLASH_BAR,
+ QUAD_COLON
+};
+
+const uint32_t PROGMEM unicode_map[] = {
+ [DIAMOND] = 0x25CA, // ◊ 0
+ [QUAD_DIAMOND] = 0x233A, // ⌺
+ [DIAERESIS] = 0x00A8, // ¨
+ [IBEAM] = 0x2336, // ⌶
+ [MACRON] = 0x00AF, // ¯
+ [DEL_TILDE] = 0x236B, // ⍫ 5
+ [LESS] = 0x003C, // <
+ [DEL_STILE] = 0x2352, // ⍒
+ [LESS_EQUAL] = 0x2264, // ≤
+ [DELTA_STILE] = 0x234B, // ⍋
+ [EQUALS] = 0x003D, // = 10
+ [CIRCLE_STILE] = 0x233D, // ⌽
+ [GREATER_EQUAL] = 0x2265, // ≥
+ [CIRCLE_BACKSLASH] = 0x2349, // ⍉
+ [GREATER] = 0x003E, // >
+ [CIRCLED_MINUS] = 0x2296, // ⊖ 15
+ [NOT_EQUAL] = 0x2260, // ≠
+ [CIRCLE_STAR] = 0x235F, // ⍟
+ [OR] = 0x2228, // ∨
+ [DOWN_CARET_TILDE] = 0x2371, // ⍱
+ [AND] = 0x2227, // ∧ 20
+ [UP_CARET_TILDE] = 0x2372, // ⍲
+ [MULT] = 0x00D7, // ×
+ [EXCL] = 0x0021, // !
+ [DIVISION] = 0x00F7, // ÷
+ [QUAD_DIVIDE] = 0x2339, // ⌹ 25
+ [QUESTION_MARK] = 0x003F, // ?
+ [OMEGA] = 0x2375, // ⍵
+ [OMEGA_UNDERBAR] = 0x2379, // ⍹
+ [EPSILON] = 0x03B5, // ε
+ [SMALL_ELEMENT] = 0x220A, // ∊ 30
+ [EPSILON_UNDERBAR] = 0x2377, // ⍷
+ [RHO] = 0x2374, // ⍴
+ [TILDE] = 0x007E, // ~
+ [TILDE_DIAERESIS] = 0x2368, // ⍨
+ [UPWARDS_ARROW] = 0x2191, // ↑ 35
+ [DOWNWARDS_ARROW] = 0x2193, // ↓
+ [IOTA] = 0x2373, // ⍳
+ [IOTA_UNDERBAR] = 0x2378, // ⍸
+ [WHITE_CIRCLE] = 0x25CB, // ○
+ [CIRCLE_DIAERESIS] = 0x2365, // ⍥ 40
+ [STAR_OPERATOR] = 0x22C6, // ⋆
+ [STAR_DIAERESIS] = 0x2363, // ⍣
+ [LEFT_ARROW] = 0x2190, // ←
+ [QUOTE_QUAD] = 0x235E, // ⍞
+ [RIGHT_ARROW] = 0x2192, // → 45
+ [ZILDE] = 0x236C, // ⍬
+ [ALPHA] = 0x237A, // ⍺
+ [ALPHA_UNDERBAR] = 0x2376, // ⍶
+ [LEFT_CEILING] = 0x2308, // ⌈
+ [LEFT_FLOOR] = 0x230A, // ⌊ 50
+ [LOW_LINE] = 0x005F, // _
+ [NABLA] = 0x2207, // ∇
+ [INCREMENT] = 0x2206, // ∆
+ [DELTA_UNDERBAR] = 0x2359, // ⍙
+ [RING_OPERATOR] = 0x2218, // ∘ 55
+ [JOT_DIAERESIS] = 0x2364, // ⍤
+ [APOSTROPHE] = 0x0027, // '
+ [QUAD_EQUAL] = 0x2338, // ⌸
+ [QUAD] = 0x2395, // ⎕
+ [SQUISH_QUAD] = 0x2337, // ⌷ 60
+ [DOWN_TACK_JOT] = 0x234E, // ⍎
+ [IDENTICAL] = 0x2261, // ≡
+ [UP_TACK_JOT] = 0x2355, // ⍕
+ [NOT_IDENTICAL] = 0x2262, // ≢
+ [RIGHT_TACK] = 0x22A2, // ⊢ 65
+ [LEFT_TACK] = 0x22A3, // ⊣
+ [SUBSET] = 0x2282, // ⊂
+ [SUPERSET] = 0x2283, // ⊃
+ [CHI] = 0x03C7, // χ
+ [INTERSECTION] = 0x2229, // ∩ 70
+ [UNION] = 0x222A, // ∪
+ [UP_TACK] = 0x22A5, // ⊥
+ [DOWN_TACK] = 0x22A4, // ⊤
+ [VERTICAL_LINE] = 0x007C, // |
+ [UP_SHOE_JOT] = 0x235D, // ⍝ 75
+ [COMMA_BAR] = 0x236A, // ⍪
+ [BACKSLASH_BAR] = 0x2340, // ⍀
+ [SLASH_BAR] = 0x233F, // ⌿
+ [QUAD_COLON] = 0x2360, // ⍠ 79
+};
diff --git a/users/charlesrocket/rules.mk b/users/charlesrocket/rules.mk
new file mode 100644
index 0000000000..ec5aa5585d
--- /dev/null
+++ b/users/charlesrocket/rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(APL_ENABLE)), yes)
+ SRC += apl.c
+endif