diff --git a/converter/news_usb/README.md b/converter/news_usb/README.md
index 64bbbb1d..7bc2bcc2 100644
--- a/converter/news_usb/README.md
+++ b/converter/news_usb/README.md
@@ -23,8 +23,8 @@ Use PD2(USART RXD) for 'Keyboard Data' pin and give power with VCC and GND. Othe
------------------------
PD2 Keyboard Data
PD3 Keyboard Command
- PD4 Mouse Data
- PD0 BZ
+ PD0 Mouse Data
+ PD1 BZ
Target microcontroller is Atmel ATMega32U2 by default but porting this project to other 8-bit AVR controllers would be easy.
diff --git a/converter/news_usb/binary/news_usb_unimap.hex b/converter/news_usb/binary/news_usb_unimap.hex
index 25222043..ea542ef0 100644
--- a/converter/news_usb/binary/news_usb_unimap.hex
+++ b/converter/news_usb/binary/news_usb_unimap.hex
@@ -25,7 +25,7 @@
:10018000370A004C45443A20253032580A000A4CC0
:100190006F6F702073746172742E0A000A55534297
:1001A00020636F6E666967757265642E0A000A5473
-:1001B0004D4B3A3735666238622F4C5546413A64AA
+:1001B0004D4B3A6266383266312F4C5546413A64AF
:1001C00036613764660A0009025400030100A03258
:1001D00009040000010301010009211101000122AD
:1001E00040000705810308000A090401000103011A
@@ -92,9 +92,9 @@
:1005B0005553454B45592045585452414B455920B8
:1005C000434F4E534F4C4520434F4D4D414E4420D9
:1005D0004B45594D41505F53454354494F4E20348C
-:1005E0003039360A004255494C443A203735666264
-:1005F0003862202832333A32393A3535204E6F7618
-:100600002020372032303233290A005649443A201C
+:1005E0003039360A004255494C443A206266383266
+:1005F0006631202831313A35353A3435204E6F7620
+:100600002020392032303233290A005649443A201A
:1006100030784645454428544D4B29205049443AAA
:100620002030783530323128534F4E59204E4557BF
:1006300053206B6579626F61726420636F6E7665BB
@@ -1008,7 +1008,7 @@
:103EF000FF91EF919F918F910F900FBE0F901F90A8
:103F000018951F920F920FB60F9211248F939F93C3
:103F1000AF93BF938091BD019091BE01A091BF016D
-:103F2000B091C001892B8A2B8B2B69F18BB191E069
+:103F2000B091C001892B8A2B8B2B69F18BB192E068
:103F300089278BB98091BD019091BE01A091BF01ED
:103F4000B091C001181619061A061B069CF4809140
:103F5000BD019091BE01A091BF01B091C001019738
@@ -1016,7 +1016,7 @@
:103F7000B093C001BF91AF919F918F910F900FBEF1
:103F80000F901F90189580916F008D7F80936F0028
:103F900010928000109281008FB7F89410928900DF
-:103FA000109288008FBF5898E5CF0E94DC1F68945C
+:103FA000109288008FBF5998E5CF0E94DC1F68945B
:103FB000B1110C946B2008950E94502088F09F57F7
:103FC00098F0B92F9927B751B0F0E1F0660F771F3D
:103FD000881F991F1AF0BA95C9F714C0B13091F033
diff --git a/converter/news_usb/matrix.c b/converter/news_usb/matrix.c
index 693d5b6a..8fe5d8b8 100644
--- a/converter/news_usb/matrix.c
+++ b/converter/news_usb/matrix.c
@@ -133,7 +133,7 @@ uint8_t matrix_scan(void)
// make code
if (!matrix_is_on(ROW(code), COL(code))) {
matrix[ROW(code)] |= (1<
+
+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 "unimap_trans.h"
+
+
+#define AC_L1 ACTION_LAYER_MOMENTARY(1)
+#define AC_L2 ACTION_LAYER_MOMENTARY(2)
+#define AC_SLS2 ACTION_LAYER_TAP_KEY(2, KC_SLSH)
+#define AC_SCL3 ACTION_LAYER_TAP_KEY(3, KC_SCLN)
+#define AC_SPC4 ACTION_LAYER_TAP_KEY(4, KC_SPC)
+#define AC_BACK ACTION_MODS_KEY(MOD_LALT, KC_LEFT)
+#define AC_FRWD ACTION_MODS_KEY(MOD_LALT, KC_RIGHT)
+#define AC_ENT_ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT)
+
+
+#ifdef KEYMAP_SECTION_ENABLE
+const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
+#else
+const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
+#endif
+ /* 0:
+ * ,-----------------------------------------------------------.
+ * |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ |
+ * |-----------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bspc|
+ * |-----------------------------------------------------------|
+ * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Enter |
+ * |-----------------------------------------------------------|
+ * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift |
+ * |-----------------------------------------------------------'
+ * |Ctrl|Gui |Alt | Space |Alt |App | L1 |
+ * `-----------------------------------------------------------'
+ */
+ [0] = UNIMAP_ALPS64( \
+ ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSLS,
+ TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC,
+ LCTL,A, S, D, F, G, H, J, K, L, SCL3,QUOT, ENT_,
+ LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLS2, RSFT,L1,
+ L2, LGUI,LALT, SPC4, APP, RALT,RGUI,L1),
+
+ [1] = UNIMAP_ALPS64( \
+ GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,GRV,
+ CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, DEL,
+ TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS, TRNS,TRNS,
+ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
+
+ [2] = UNIMAP_ALPS64(
+ GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
+ TRNS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, TRNS,
+ TRNS,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, TRNS,
+ TRNS,TRNS,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, TRNS,TRNS,
+ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
+
+ [3] = UNIMAP_ALPS64(
+ GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
+ TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BACK,FRWD, TRNS,
+ TRNS,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, TRNS,
+ TRNS,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS,
+ TRNS,TRNS,TRNS, BTN1, TRNS,TRNS,TRNS,TRNS),
+
+ [4] = UNIMAP_ALPS64(
+ GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
+ TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5, TAB,
+ LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT,
+ LSFT,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS,
+ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
+};
diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile
index b0e7a30e..c6237d57 100644
--- a/keyboard/gh60/Makefile
+++ b/keyboard/gh60/Makefile
@@ -113,7 +113,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
diff --git a/keyboard/gh60/Makefile.pjrc b/keyboard/gh60/Makefile.pjrc
index 11bd3b78..aeec17fd 100644
--- a/keyboard/gh60/Makefile.pjrc
+++ b/keyboard/gh60/Makefile.pjrc
@@ -48,8 +48,7 @@ TMK_DIR = ../../tmk_core
TARGET_DIR = .
# project specific files
-SRC = keymap_common.c \
- matrix.c \
+SRC = matrix.c \
led.c
ifdef KEYMAP
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index be316697..6a1b5f3d 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -142,6 +142,108 @@ static uint8_t current_layer_for_key(keypos_t key)
}
+#ifdef BOOTMAGIC_ENABLE
+#include "keymap.h"
+extern keymap_config_t keymap_config;
+
+static uint8_t config_keymap(uint8_t keycode)
+{
+ switch (keycode) {
+ case KC_CAPSLOCK:
+ case KC_LOCKING_CAPS:
+ if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
+ return KC_LCTL;
+ }
+ return keycode;
+ case KC_LCTL:
+ if (keymap_config.swap_control_capslock) {
+ return KC_CAPSLOCK;
+ }
+ return KC_LCTL;
+ case KC_LALT:
+ if (keymap_config.swap_lalt_lgui) {
+ if (keymap_config.no_gui) {
+ return KC_NO;
+ }
+ return KC_LGUI;
+ }
+ return KC_LALT;
+ case KC_LGUI:
+ if (keymap_config.swap_lalt_lgui) {
+ return KC_LALT;
+ }
+ if (keymap_config.no_gui) {
+ return KC_NO;
+ }
+ return KC_LGUI;
+ case KC_RALT:
+ if (keymap_config.swap_ralt_rgui) {
+ if (keymap_config.no_gui) {
+ return KC_NO;
+ }
+ return KC_RGUI;
+ }
+ return KC_RALT;
+ case KC_RGUI:
+ if (keymap_config.swap_ralt_rgui) {
+ return KC_RALT;
+ }
+ if (keymap_config.no_gui) {
+ return KC_NO;
+ }
+ return KC_RGUI;
+ case KC_GRAVE:
+ if (keymap_config.swap_grave_esc) {
+ return KC_ESC;
+ }
+ return KC_GRAVE;
+ case KC_ESC:
+ if (keymap_config.swap_grave_esc) {
+ return KC_GRAVE;
+ }
+ return KC_ESC;
+ case KC_BSLASH:
+ if (keymap_config.swap_backslash_backspace) {
+ return KC_BSPACE;
+ }
+ return KC_BSLASH;
+ case KC_BSPACE:
+ if (keymap_config.swap_backslash_backspace) {
+ return KC_BSLASH;
+ }
+ return KC_BSPACE;
+ default:
+ return keycode;
+ }
+}
+
+static action_t get_action(uint8_t layer, keypos_t key)
+{
+ action_t act = action_for_key(layer, key);
+ switch (act.kind.id) {
+ case ACT_LMODS:
+ case ACT_RMODS:
+ case ACT_LMODS_TAP:
+ case ACT_RMODS_TAP:
+ act.key.code = config_keymap(act.key.code);
+ break;
+ case ACT_LAYER_TAP:
+ case ACT_LAYER_TAP_EXT:
+ act.layer_tap.code = config_keymap(act.layer_tap.code);
+ break;
+ default:
+ break;
+ }
+ return act;
+}
+#else
+static action_t get_action(uint8_t layer, keypos_t key)
+{
+ return action_for_key(layer, key);
+}
+#endif
+
+
#ifndef NO_TRACK_KEY_PRESS
/* record layer on where key is pressed */
static uint8_t layer_pressed[MATRIX_ROWS][MATRIX_COLS] = {};
@@ -161,5 +263,5 @@ action_t layer_switch_get_action(keyevent_t event)
#else
layer = current_layer_for_key(event.key);
#endif
- return action_for_key(layer, event.key);
+ return get_action(layer, event.key);
}
diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c
index 5bd47dc6..5556609d 100644
--- a/tmk_core/common/avr/eeconfig.c
+++ b/tmk_core/common/avr/eeconfig.c
@@ -2,6 +2,8 @@
#include
#include
#include "eeconfig.h"
+#include "keymap.h"
+#include "print.h"
void eeconfig_init(void)
{
@@ -22,7 +24,12 @@ void eeconfig_enable(void)
void eeconfig_disable(void)
{
- eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
+ eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
+ eeprom_write_byte(EECONFIG_DEBUG, 0xFF);
+ eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0xFF);
+ eeprom_write_byte(EECONFIG_KEYMAP, 0xFF);
+ eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0xFF);
+ eeprom_write_byte(EECONFIG_BACKLIGHT, 0xFF);
}
bool eeconfig_is_enabled(void)
@@ -43,3 +50,13 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
#endif
+
+void eeconfig_debug(void)
+{
+ xprintf("eeprom:");
+ for (int i = 0; i < 16 /* E2END + 1 */; i++) {
+ if ((i % 16) == 0) { xprintf("\n%04X: ", i); }
+ xprintf("%02X ", eeprom_read_byte((uint8_t *)i));
+ }
+ xprintf("\n");
+}
diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c
index 220eb14f..e54fe0ab 100644
--- a/tmk_core/common/bootmagic.c
+++ b/tmk_core/common/bootmagic.c
@@ -34,7 +34,7 @@ void bootmagic(void)
/* eeconfig clear */
if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
- eeconfig_init();
+ eeconfig_disable();
}
/* bootloader */
@@ -45,6 +45,10 @@ void bootmagic(void)
/* user-defined checks */
hook_bootmagic();
+ if (!eeconfig_is_enabled()) {
+ goto WAIT;
+ }
+
/* debug enable */
debug_config.raw = eeconfig_read_debug();
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
@@ -61,35 +65,38 @@ void bootmagic(void)
eeconfig_write_debug(debug_config.raw);
/* keymap config */
- keymap_config.raw = eeconfig_read_keymap();
+ keymap_config_t kc;
+ kc.raw = eeconfig_read_keymap();
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) {
- keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
+ kc.swap_control_capslock = !kc.swap_control_capslock;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) {
- keymap_config.capslock_to_control = !keymap_config.capslock_to_control;
+ kc.capslock_to_control = !kc.capslock_to_control;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) {
- keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
+ kc.swap_lalt_lgui = !kc.swap_lalt_lgui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) {
- keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
+ kc.swap_ralt_rgui = !kc.swap_ralt_rgui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) {
- keymap_config.no_gui = !keymap_config.no_gui;
+ kc.no_gui = !kc.no_gui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) {
- keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc;
+ kc.swap_grave_esc = !kc.swap_grave_esc;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
- keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
+ kc.swap_backslash_backspace = !kc.swap_backslash_backspace;
}
if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) {
- keymap_config.nkro = !keymap_config.nkro;
+ kc.nkro = !kc.nkro;
}
- eeconfig_write_keymap(keymap_config.raw);
+ eeconfig_write_keymap(kc.raw);
#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE)
- keyboard_nkro = keymap_config.nkro;
+ if (kc.nkro) {
+ keyboard_nkro = !keyboard_nkro;
+ }
#endif
/* default layer */
@@ -109,6 +116,18 @@ void bootmagic(void)
default_layer = eeconfig_read_default_layer();
default_layer_set((uint32_t)default_layer);
}
+
+ keymap_config = kc;
+
+ // wait until all key is released
+WAIT:
+ matrix_scan();
+ for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
+ if (matrix_get_row(r)) {
+ goto WAIT;
+ wait_ms(10);
+ }
+ }
}
static bool scan_key(uint16_t code)
diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c
index 74255736..b429a181 100644
--- a/tmk_core/common/command.c
+++ b/tmk_core/common/command.c
@@ -19,7 +19,6 @@ along with this program. If not, see .
#include "wait.h"
#include "keycode.h"
#include "host.h"
-#include "keymap.h"
#include "print.h"
#include "debug.h"
#include "util.h"
@@ -145,6 +144,9 @@ static void command_common_help(void)
}
#ifdef BOOTMAGIC_ENABLE
+#include "keymap.h"
+__attribute__ ((weak)) void eeconfig_debug(void) {}
+
static void print_eeconfig(void)
{
print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
@@ -176,6 +178,8 @@ static void print_eeconfig(void)
print(".enable: "); print_dec(bc.enable); print("\n");
print(".level: "); print_dec(bc.level); print("\n");
#endif
+
+ eeconfig_debug();
}
#endif
diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h
index 3cd1a174..5fd2bb0a 100644
--- a/tmk_core/common/eeconfig.h
+++ b/tmk_core/common/eeconfig.h
@@ -72,4 +72,6 @@ uint8_t eeconfig_read_backlight(void);
void eeconfig_write_backlight(uint8_t val);
#endif
+void eeconfig_debug(void);
+
#endif
diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c
index 2bd4a253..1ea1dd8b 100644
--- a/tmk_core/common/keymap.c
+++ b/tmk_core/common/keymap.c
@@ -27,10 +27,6 @@ along with this program. If not, see .
#include
#endif
-#ifdef BOOTMAGIC_ENABLE
-extern keymap_config_t keymap_config;
-#endif
-
static action_t keycode_to_action(uint8_t keycode);
@@ -42,71 +38,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
switch (keycode) {
case KC_FN0 ... KC_FN31:
return keymap_fn_to_action(keycode);
-#ifdef BOOTMAGIC_ENABLE
- case KC_CAPSLOCK:
- case KC_LOCKING_CAPS:
- if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
- return keycode_to_action(KC_LCTL);
- }
- return keycode_to_action(keycode);
- case KC_LCTL:
- if (keymap_config.swap_control_capslock) {
- return keycode_to_action(KC_CAPSLOCK);
- }
- return keycode_to_action(KC_LCTL);
- case KC_LALT:
- if (keymap_config.swap_lalt_lgui) {
- if (keymap_config.no_gui) {
- return keycode_to_action(KC_NO);
- }
- return keycode_to_action(KC_LGUI);
- }
- return keycode_to_action(KC_LALT);
- case KC_LGUI:
- if (keymap_config.swap_lalt_lgui) {
- return keycode_to_action(KC_LALT);
- }
- if (keymap_config.no_gui) {
- return keycode_to_action(KC_NO);
- }
- return keycode_to_action(KC_LGUI);
- case KC_RALT:
- if (keymap_config.swap_ralt_rgui) {
- if (keymap_config.no_gui) {
- return keycode_to_action(KC_NO);
- }
- return keycode_to_action(KC_RGUI);
- }
- return keycode_to_action(KC_RALT);
- case KC_RGUI:
- if (keymap_config.swap_ralt_rgui) {
- return keycode_to_action(KC_RALT);
- }
- if (keymap_config.no_gui) {
- return keycode_to_action(KC_NO);
- }
- return keycode_to_action(KC_RGUI);
- case KC_GRAVE:
- if (keymap_config.swap_grave_esc) {
- return keycode_to_action(KC_ESC);
- }
- return keycode_to_action(KC_GRAVE);
- case KC_ESC:
- if (keymap_config.swap_grave_esc) {
- return keycode_to_action(KC_GRAVE);
- }
- return keycode_to_action(KC_ESC);
- case KC_BSLASH:
- if (keymap_config.swap_backslash_backspace) {
- return keycode_to_action(KC_BSPACE);
- }
- return keycode_to_action(KC_BSLASH);
- case KC_BSPACE:
- if (keymap_config.swap_backslash_backspace) {
- return keycode_to_action(KC_BSLASH);
- }
- return keycode_to_action(KC_BSPACE);
-#endif
default:
return keycode_to_action(keycode);
}