aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-11-12 21:47:23 -0500
committerFranklin Wei <git@fwei.tk>2015-11-12 21:47:23 -0500
commita810c8760d090dcbc5ee0854b4c124a0eea3d7e7 (patch)
tree281a7196ededfb311fddff608712ef70d97b80aa /src
parent142f530e6502ecb33af7a3095f5d049b8eca3c91 (diff)
downloadducky-a810c8760d090dcbc5ee0854b4c124a0eea3d7e7.zip
ducky-a810c8760d090dcbc5ee0854b4c124a0eea3d7e7.tar.gz
ducky-a810c8760d090dcbc5ee0854b4c124a0eea3d7e7.tar.bz2
ducky-a810c8760d090dcbc5ee0854b4c124a0eea3d7e7.tar.xz
add rockbox cross-compiler
Diffstat (limited to 'src')
-rw-r--r--src/compile.c453
-rw-r--r--src/ducky.h3
-rw-r--r--src/hid_codes.h749
-rw-r--r--src/interp.c6
-rw-r--r--src/opcodes.h6
-rw-r--r--src/vm.c2
6 files changed, 1213 insertions, 6 deletions
diff --git a/src/compile.c b/src/compile.c
index a5c3f9a..72b41c1 100644
--- a/src/compile.c
+++ b/src/compile.c
@@ -2,6 +2,9 @@
#include <platform.h>
#include "opcodes.h"
+#ifdef DUCKY_ROCKBOX
+#include "hid_codes.h"
+#endif
/*******************************************************************************
* Bytecode format (all numbers are little-endian):
@@ -750,7 +753,7 @@ static vartype eval_expr(char *str)
}
}
}
-
+
if(tstart)
{
//push_numstack(getValue(tstart, expr));
@@ -961,17 +964,194 @@ static int logchar_handler(char **save)
{
eval_expr(tok);
write_instr(LOGASCII);
- return OK;
}
else
error("expected expression after LOGCHAR");
+ return OK;
+}
+
+#ifdef DUCKY_ROCKBOX
+#define KEY_HANDLER(KEY, NAME) \
+ static int NAME ## _handler(char **save) \
+ { \
+ write_instr(PUSHIMM); \
+ write_imm(KEY); \
+ write_instr(SENDKEY); \
+ return OK; \
+ }
+
+KEY_HANDLER(HID_KEYBOARD_RETURN, enter);
+KEY_HANDLER(HID_KEYBOARD_DELETE, del);
+KEY_HANDLER(HID_KEYBOARD_TAB, tab);
+KEY_HANDLER(HID_KEYBOARD_ESCAPE, esc);
+KEY_HANDLER(HID_KEYBOARD_LEFT_GUI, gui);
+KEY_HANDLER(HID_KEYBOARD_RIGHT_GUI, rgui);
+KEY_HANDLER(HID_KEYBOARD_LEFT_CONTROL, ctrl);
+KEY_HANDLER(HID_KEYBOARD_RIGHT_CONTROL, rctrl);
+KEY_HANDLER(HID_KEYBOARD_LEFT_ALT, alt);
+KEY_HANDLER(HID_KEYBOARD_RIGHT_ALT, ralt);
+KEY_HANDLER(HID_KEYBOARD_LEFT_SHIFT, shift)
+KEY_HANDLER(HID_KEYBOARD_RIGHT_SHIFT, rshift);
+KEY_HANDLER(HID_KEYBOARD_MENU, menu);
+KEY_HANDLER(HID_KEYBOARD_PAUSE, pause);
+KEY_HANDLER(HID_KEYBOARD_PRINT_SCREEN, psn);
+KEY_HANDLER(HID_KEYPAD_NUM_LOCK_AND_CLEAR, numlck);
+KEY_HANDLER(HID_KEYBOARD_CAPS_LOCK, cpslck);
+KEY_HANDLER(HID_KEYBOARD_SCROLL_LOCK, scrllck);
+KEY_HANDLER(HID_KEYBOARD_SPACEBAR, space);
+KEY_HANDLER(HID_KEYBOARD_BACKSPACE, bksp);
+KEY_HANDLER(HID_KEYBOARD_UP_ARROW, up);
+KEY_HANDLER(HID_KEYBOARD_DOWN_ARROW, down);
+KEY_HANDLER(HID_KEYBOARD_LEFT_ARROW, left);
+KEY_HANDLER(HID_KEYBOARD_RIGHT_ARROW, right);
+KEY_HANDLER(HID_KEYBOARD_PAGE_UP, pgup);
+KEY_HANDLER(HID_KEYBOARD_PAGE_DOWN, pgdn);
+KEY_HANDLER(HID_KEYBOARD_INSERT, ins);
+KEY_HANDLER(HID_KEYBOARD_HOME, home);
+KEY_HANDLER(HID_KEYBOARD_F1, f1);
+KEY_HANDLER(HID_KEYBOARD_F2, f2);
+KEY_HANDLER(HID_KEYBOARD_F3, f3);
+KEY_HANDLER(HID_KEYBOARD_F4, f4);
+KEY_HANDLER(HID_KEYBOARD_F5, f5);
+KEY_HANDLER(HID_KEYBOARD_F6, f6);
+KEY_HANDLER(HID_KEYBOARD_F7, f7);
+KEY_HANDLER(HID_KEYBOARD_F8, f8);
+KEY_HANDLER(HID_KEYBOARD_F9, f9);
+KEY_HANDLER(HID_KEYBOARD_F10, f10);
+KEY_HANDLER(HID_KEYBOARD_F11, f11);
+KEY_HANDLER(HID_KEYBOARD_F12, f12);
+
+static int dfldel_handler(char **save)
+{
+ char *tok = strtok_r(NULL, ";", save);
+ if(tok)
+ {
+ eval_expr(tok);
+ write_instr(DFL_DELAY);
+ }
+ else
+ error("expected expression for DEFAULT_DELAY");
+ return OK;
+}
+
+static int strdel_handler(char **save)
+{
+ char *tok = strtok_r(NULL, ";", save);
+ if(tok)
+ {
+ eval_expr(tok);
+ write_instr(STR_DELAY);
+ }
+ else
+ error("expected expression for STRING_DELAY");
+ return OK;
+}
+
+static int out_handler(char **save)
+{
+ char *tok = strtok_r(NULL, ";", save);
+ if(tok)
+ {
+ eval_expr(tok);
+ /* types the expression in decimal */
+ write_instr(TYPE_DEC);
+ }
+ else
+ error("expected expression for default delay");
+ return OK;
}
+static int string_handler(char **save)
+{
+ char *str = strtok_r(NULL, "", save);
+
+ write_instr(TYPE_STR);
+ while(*str)
+ {
+ write_byte(*str++);
+ }
+ write_byte('\0');
+ return OK;
+}
+#endif
+
static struct token_t {
const char *tok;
int (*func)(char **save);
} tokens[] = {
+#ifdef DUCKY_ROCKBOX
+ { "ALT", alt_handler },
+ { "APP", menu_handler },
+ { "BACKSPACE", bksp_handler },
+ { "BKSP", bksp_handler },
+ { "BREAK", pause_handler },
+ { "CAPS", cpslck_handler },
+ { "CAPSLOCK", cpslck_handler },
+ { "CAPS_LOCK", cpslck_handler },
+ { "CONTROL", ctrl_handler },
+ { "CTRL", ctrl_handler },
+ { "DEFAULT_DELAY", dfldel_handler },
+ { "DEL", del_handler },
+ { "DELETE", del_handler },
+ { "DOWN", down_handler },
+ { "DOWNARROW", down_handler },
+ { "ENTER", enter_handler },
+ { "ESC", esc_handler },
+ { "ESCAPE", esc_handler },
+ { "F1", f1_handler },
+ { "F2", f2_handler },
+ { "F3", f3_handler },
+ { "F4", f4_handler },
+ { "F5", f5_handler },
+ { "F6", f6_handler },
+ { "F7", f7_handler },
+ { "F8", f8_handler },
+ { "F9", f9_handler },
+ { "F10", f10_handler },
+ { "F11", f11_handler },
+ { "F12", f12_handler },
+ { "GUI", gui_handler },
+ { "HOME", home_handler },
+ { "INS", ins_handler },
+ { "INSERT", ins_handler },
+ { "LEFT", left_handler },
+ { "LEFTARROW", left_handler },
+ { "LOGCHAR", logchar_handler },
+ { "MENU", menu_handler },
+ { "META", alt_handler },
+ { "NEWLINE", newline_handler },
+ { "NUMLOCK", numlck_handler },
+ { "NUM_LOCK", numlck_handler },
+ { "OUT", out_handler },
+ { "PAGEDOWN", pgdn_handler },
+ { "PAGEUP", pgup_handler },
+ { "PAUSE", pause_handler },
+ { "PGDOWN", pgdn_handler },
+ { "PGUP", pgup_handler },
+ { "PRINTSCREEN", psn_handler },
+ { "PRINT_SCREEN", psn_handler },
+ { "RALT", ralt_handler },
+ { "RCONTROL", rctrl_handler },
+ { "RCTRL", rctrl_handler },
+ { "REMTA", ralt_handler },
+ { "RGUI", rgui_handler },
+ { "RIGHT", right_handler },
+ { "RIGHTARROW", right_handler },
+ { "RSHIFT", rshift_handler },
+ { "SCROLL", scrllck_handler },
+ { "SCROLLLOCK", scrllck_handler },
+ { "SCROLL_LOCK", scrllck_handler },
+ { "SHIFT", shift_handler },
+ { "SPACE", space_handler },
+ { "SPACEBAR", space_handler },
+ { "STRING", string_handler },
+ { "STRING_DELAY", strdel_handler },
+ { "SYSRQ", psn_handler },
+ { "TAB", tab_handler },
+ { "UP", up_handler },
+ { "UPARROW", up_handler },
+#else
{ "LET", let_handler, },
{ "REPEAT", repeat_handler, },
{ "JUMP", goto_handler, },
@@ -994,6 +1174,7 @@ static struct token_t {
{ "LBL", rem_handler, },
{ "QUIT", quit_handler, },
{ "EXIT", quit_handler, },
+#endif
};
/* once again, this lookup table is implemented with a perfect hash map */
@@ -1001,6 +1182,265 @@ static struct token_t {
#define TOKMAP_SIZE ARRAYLEN(tokens)
static struct token_t tokmap[TOKMAP_SIZE];
+#ifdef DUCKY_ROCKBOX
+/* generated with mph 1.2 */
+/* sacrifices memory for SPEED! */
+/*
+ * d=3
+ * n=87
+ * m=70
+ * c=1.23
+ * maxlen=13
+ * minklen=2
+ * maxklen=13
+ * minchar=48
+ * maxchar=95
+ * loop=0
+ * numiter=64
+ * seed=
+ */
+
+static int g[] = {
+ 13, 53, 0, 0, 50, 4, 0, 40, -1, -1,
+ 24, 27, 16, 26, 57, 1, 0, 27, 48, -1,
+ 36, 32, 39, 12, 45, 0, 23, 37, 54, 37,
+ 29, 47, 37, 28, 0, 5, 27, 0, 59, 10,
+ 20, 0, 16, 68, 64, 45, -1, -1, 45, 29,
+ 21, 49, 20, 56, 29, 8, 13, 38, 0, 8,
+ 20, 17, 0, 58, 56, 56, 8, 6, 5, 53,
+ 33, 29, 0, 0, 34, 20, 42, -1, 7, 23,
+ 49, 0, 51, 51, 29, 12, 24,
+};
+
+static int T0[] = {
+ 0x08, 0x49, 0x24, 0x38, 0x28, 0x43, 0x0d, 0x20, 0x28, 0x15,
+ 0x54, 0x00, 0x3e, 0x2f, 0x53, 0x22, 0x52, 0x4a, 0x15, 0x2f,
+ 0x1c, 0x3e, 0x4e, 0x1b, 0x2d, 0x49, 0x4c, 0x25, 0x1c, 0x4a,
+ 0x13, 0x25, 0x3c, 0x37, 0x55, 0x0d, 0x23, 0x0b, 0x26, 0x43,
+ 0x18, 0x1b, 0x44, 0x56, 0x4a, 0x40, 0x22, 0x46, 0x10, 0x19,
+ 0x00, 0x27, 0x49, 0x50, 0x07, 0x20, 0x3a, 0x05, 0x0a, 0x15,
+ 0x19, 0x47, 0x43, 0x3d, 0x0f, 0x53, 0x09, 0x2c, 0x02, 0x27,
+ 0x2f, 0x29, 0x49, 0x10, 0x37, 0x39, 0x31, 0x31, 0x56, 0x41,
+ 0x4a, 0x56, 0x09, 0x34, 0x47, 0x10, 0x55, 0x2a, 0x15, 0x00,
+ 0x3f, 0x26, 0x47, 0x2b, 0x0d, 0x00, 0x35, 0x53, 0x1a, 0x07,
+ 0x45, 0x38, 0x4b, 0x1b, 0x40, 0x25, 0x27, 0x4c, 0x0c, 0x52,
+ 0x00, 0x07, 0x0e, 0x05, 0x0c, 0x40, 0x1c, 0x2b, 0x36, 0x38,
+ 0x46, 0x16, 0x18, 0x0c, 0x44, 0x1e, 0x08, 0x23, 0x1a, 0x22,
+ 0x2a, 0x00, 0x03, 0x16, 0x14, 0x3b, 0x3b, 0x3b, 0x28, 0x47,
+ 0x2e, 0x20, 0x47, 0x3c, 0x36, 0x37, 0x31, 0x31, 0x43, 0x27,
+ 0x49, 0x14, 0x26, 0x26, 0x29, 0x1d, 0x11, 0x0e, 0x02, 0x15,
+ 0x0a, 0x3e, 0x41, 0x2d, 0x47, 0x10, 0x2c, 0x52, 0x04, 0x29,
+ 0x30, 0x3e, 0x18, 0x48, 0x2b, 0x4e, 0x20, 0x54, 0x20, 0x0d,
+ 0x24, 0x0a, 0x19, 0x42, 0x30, 0x42, 0x09, 0x3a, 0x48, 0x03,
+ 0x4f, 0x4b, 0x41, 0x05, 0x48, 0x15, 0x18, 0x3b, 0x29, 0x52,
+ 0x29, 0x24, 0x3b, 0x18, 0x0e, 0x2f, 0x36, 0x2d, 0x44, 0x53,
+ 0x32, 0x15, 0x46, 0x42, 0x1b, 0x4e, 0x39, 0x34, 0x2d, 0x49,
+ 0x16, 0x17, 0x00, 0x4f, 0x14, 0x40, 0x06, 0x24, 0x1c, 0x2f,
+ 0x1f, 0x45, 0x4b, 0x03, 0x56, 0x51, 0x2b, 0x35, 0x27, 0x18,
+ 0x2d, 0x28, 0x1f, 0x55, 0x53, 0x35, 0x31, 0x2f, 0x13, 0x55,
+ 0x2c, 0x21, 0x00, 0x1e, 0x3c, 0x35, 0x43, 0x10, 0x07, 0x39,
+ 0x3d, 0x4a, 0x2f, 0x14, 0x0f, 0x3d, 0x34, 0x33, 0x25, 0x23,
+ 0x30, 0x4a, 0x4b, 0x4f, 0x41, 0x48, 0x2e, 0x1b, 0x20, 0x39,
+ 0x11, 0x44, 0x52, 0x11, 0x0b, 0x30, 0x3e, 0x4e, 0x36, 0x51,
+ 0x44, 0x19, 0x44, 0x2b, 0x22, 0x17, 0x02, 0x56, 0x44, 0x0a,
+ 0x00, 0x12, 0x38, 0x0d, 0x49, 0x3b, 0x27, 0x19, 0x34, 0x0e,
+ 0x4b, 0x29, 0x47, 0x03, 0x51, 0x27, 0x04, 0x51, 0x51, 0x3a,
+ 0x4b, 0x3f, 0x4b, 0x38, 0x0b, 0x0e, 0x4f, 0x06, 0x0d, 0x35,
+ 0x10, 0x0e, 0x47, 0x48, 0x13, 0x32, 0x17, 0x51, 0x12, 0x27,
+ 0x4d, 0x37, 0x0a, 0x18, 0x0f, 0x19, 0x53, 0x18, 0x3e, 0x43,
+ 0x16, 0x16, 0x28, 0x1f, 0x37, 0x4e, 0x2d, 0x30, 0x4b, 0x44,
+ 0x02, 0x2b, 0x51, 0x36, 0x4c, 0x17, 0x3a, 0x0c, 0x09, 0x44,
+ 0x2c, 0x56, 0x25, 0x36, 0x17, 0x2c, 0x47, 0x0c, 0x3c, 0x27,
+ 0x47, 0x4a, 0x35, 0x18, 0x1e, 0x39, 0x3d, 0x2e, 0x01, 0x47,
+ 0x4d, 0x07, 0x0f, 0x4f, 0x53, 0x1d, 0x37, 0x10, 0x17, 0x4b,
+ 0x1b, 0x36, 0x0b, 0x1d, 0x2e, 0x52, 0x43, 0x10, 0x2c, 0x2c,
+ 0x35, 0x17, 0x3f, 0x2a, 0x31, 0x06, 0x0d, 0x0f, 0x2d, 0x06,
+ 0x56, 0x23, 0x0d, 0x07, 0x13, 0x02, 0x24, 0x42, 0x0a, 0x3b,
+ 0x37, 0x25, 0x15, 0x42, 0x4c, 0x52, 0x25, 0x1c, 0x4e, 0x26,
+ 0x49, 0x39, 0x4d, 0x50, 0x32, 0x22, 0x0e, 0x4d, 0x42, 0x2b,
+ 0x3c, 0x35, 0x0c, 0x1f, 0x08, 0x23, 0x3b, 0x07, 0x3c, 0x2e,
+ 0x51, 0x0b, 0x13, 0x07, 0x4d, 0x09, 0x52, 0x14, 0x1d, 0x49,
+ 0x3a, 0x07, 0x23, 0x31, 0x00, 0x4d, 0x4b, 0x07, 0x3b, 0x2e,
+ 0x19, 0x0c, 0x08, 0x16, 0x0f, 0x03, 0x36, 0x0a, 0x25, 0x3d,
+ 0x05, 0x44, 0x01, 0x22, 0x56, 0x3c, 0x47, 0x36, 0x37, 0x02,
+ 0x40, 0x45, 0x07, 0x40, 0x27, 0x08, 0x36, 0x4f, 0x4c, 0x11,
+ 0x53, 0x0f, 0x1d, 0x53, 0x25, 0x24, 0x56, 0x04, 0x2e, 0x1c,
+ 0x3a, 0x34, 0x0a, 0x3b, 0x4e, 0x01, 0x18, 0x3e, 0x4a, 0x09,
+ 0x47, 0x23, 0x47, 0x14, 0x15, 0x48, 0x4f, 0x2e, 0x46, 0x0a,
+ 0x3d, 0x44, 0x23, 0x49, 0x08, 0x3a, 0x3b, 0x42, 0x36, 0x49,
+ 0x06, 0x52, 0x34, 0x46, 0x33, 0x2e, 0x14, 0x32, 0x23, 0x00,
+ 0x3b, 0x13, 0x23, 0x2b, 0x28, 0x31, 0x14, 0x20, 0x00, 0x04,
+ 0x2a, 0x3e, 0x40, 0x45, 0x28, 0x48, 0x36, 0x12, 0x0f, 0x2c,
+ 0x14, 0x36, 0x16, 0x0b, 0x42, 0x4b, 0x33, 0x22, 0x52, 0x07,
+ 0x42, 0x3a, 0x1a, 0x3c, 0x49, 0x19, 0x4e, 0x45, 0x3c, 0x05,
+ 0x05, 0x54, 0x53, 0x30, 0x1b, 0x51, 0x0b, 0x51, 0x0c, 0x1a,
+ 0x26, 0x20, 0x49, 0x3d, 0x24, 0x34, 0x29, 0x00, 0x4e, 0x25,
+ 0x08, 0x32, 0x08, 0x1a,
+};
+
+static int T1[] = {
+ 0x52, 0x34, 0x35, 0x46, 0x2e, 0x4c, 0x50, 0x13, 0x54, 0x44,
+ 0x20, 0x31, 0x20, 0x04, 0x3f, 0x11, 0x13, 0x2d, 0x4a, 0x14,
+ 0x52, 0x0a, 0x3b, 0x33, 0x44, 0x15, 0x30, 0x3c, 0x29, 0x28,
+ 0x18, 0x1c, 0x05, 0x4e, 0x03, 0x2c, 0x3b, 0x54, 0x3f, 0x38,
+ 0x39, 0x00, 0x0a, 0x03, 0x04, 0x49, 0x14, 0x17, 0x1a, 0x47,
+ 0x0c, 0x40, 0x13, 0x2a, 0x04, 0x00, 0x37, 0x4c, 0x30, 0x54,
+ 0x2a, 0x11, 0x23, 0x11, 0x17, 0x54, 0x3b, 0x45, 0x35, 0x41,
+ 0x27, 0x0f, 0x14, 0x4d, 0x3c, 0x00, 0x34, 0x55, 0x3e, 0x4e,
+ 0x3d, 0x42, 0x37, 0x48, 0x0d, 0x3b, 0x49, 0x44, 0x29, 0x1a,
+ 0x3a, 0x4b, 0x2b, 0x06, 0x05, 0x42, 0x53, 0x45, 0x45, 0x55,
+ 0x36, 0x44, 0x0b, 0x31, 0x40, 0x3a, 0x0a, 0x2f, 0x39, 0x04,
+ 0x56, 0x1b, 0x34, 0x1d, 0x09, 0x19, 0x48, 0x19, 0x29, 0x1f,
+ 0x17, 0x4a, 0x31, 0x3c, 0x00, 0x3d, 0x2a, 0x4b, 0x23, 0x18,
+ 0x41, 0x02, 0x54, 0x4c, 0x2b, 0x3d, 0x28, 0x36, 0x0d, 0x0a,
+ 0x32, 0x0c, 0x1d, 0x10, 0x1e, 0x1a, 0x4b, 0x1e, 0x2f, 0x36,
+ 0x24, 0x44, 0x20, 0x1f, 0x34, 0x25, 0x43, 0x21, 0x4f, 0x51,
+ 0x47, 0x19, 0x20, 0x25, 0x0e, 0x11, 0x49, 0x2f, 0x2d, 0x29,
+ 0x2a, 0x35, 0x32, 0x49, 0x24, 0x48, 0x0c, 0x19, 0x10, 0x3c,
+ 0x4f, 0x2c, 0x21, 0x19, 0x4b, 0x55, 0x36, 0x2f, 0x20, 0x26,
+ 0x29, 0x08, 0x00, 0x14, 0x41, 0x15, 0x18, 0x4c, 0x0e, 0x4a,
+ 0x46, 0x0d, 0x10, 0x33, 0x19, 0x0a, 0x0c, 0x16, 0x22, 0x07,
+ 0x00, 0x1f, 0x05, 0x22, 0x3b, 0x40, 0x51, 0x48, 0x45, 0x09,
+ 0x16, 0x2a, 0x48, 0x16, 0x3f, 0x2a, 0x2b, 0x4f, 0x1f, 0x31,
+ 0x43, 0x06, 0x3f, 0x4b, 0x3a, 0x50, 0x56, 0x46, 0x10, 0x21,
+ 0x4a, 0x4a, 0x14, 0x22, 0x28, 0x41, 0x4b, 0x42, 0x00, 0x51,
+ 0x33, 0x4e, 0x19, 0x56, 0x22, 0x21, 0x08, 0x16, 0x04, 0x3d,
+ 0x38, 0x3e, 0x0a, 0x3d, 0x0c, 0x55, 0x14, 0x47, 0x22, 0x36,
+ 0x31, 0x15, 0x21, 0x3d, 0x2f, 0x49, 0x1f, 0x23, 0x2c, 0x20,
+ 0x15, 0x01, 0x0f, 0x2f, 0x00, 0x31, 0x48, 0x01, 0x30, 0x0c,
+ 0x34, 0x43, 0x31, 0x51, 0x35, 0x4e, 0x10, 0x09, 0x3d, 0x23,
+ 0x1c, 0x15, 0x15, 0x4f, 0x02, 0x0c, 0x4a, 0x48, 0x27, 0x4b,
+ 0x22, 0x04, 0x01, 0x0f, 0x2e, 0x25, 0x43, 0x4e, 0x0b, 0x1c,
+ 0x03, 0x38, 0x08, 0x2c, 0x32, 0x3d, 0x24, 0x3b, 0x3e, 0x02,
+ 0x07, 0x03, 0x17, 0x14, 0x52, 0x12, 0x11, 0x2e, 0x32, 0x1a,
+ 0x49, 0x1a, 0x2e, 0x13, 0x55, 0x4b, 0x4b, 0x29, 0x44, 0x18,
+ 0x01, 0x38, 0x4c, 0x14, 0x30, 0x16, 0x4e, 0x44, 0x4b, 0x33,
+ 0x4d, 0x31, 0x4b, 0x38, 0x46, 0x43, 0x50, 0x4f, 0x1a, 0x2b,
+ 0x0a, 0x04, 0x3e, 0x30, 0x18, 0x34, 0x24, 0x04, 0x06, 0x0a,
+ 0x14, 0x00, 0x42, 0x09, 0x1b, 0x4a, 0x2b, 0x36, 0x3f, 0x4c,
+ 0x1a, 0x0e, 0x54, 0x3d, 0x0a, 0x01, 0x06, 0x27, 0x53, 0x41,
+ 0x51, 0x51, 0x25, 0x07, 0x10, 0x3b, 0x33, 0x2d, 0x0c, 0x33,
+ 0x48, 0x1d, 0x41, 0x51, 0x0c, 0x05, 0x44, 0x2f, 0x33, 0x24,
+ 0x1c, 0x4d, 0x32, 0x11, 0x33, 0x34, 0x0b, 0x32, 0x05, 0x07,
+ 0x1c, 0x56, 0x1d, 0x17, 0x1b, 0x2f, 0x0a, 0x51, 0x47, 0x3d,
+ 0x03, 0x23, 0x28, 0x18, 0x35, 0x1f, 0x33, 0x52, 0x26, 0x35,
+ 0x0c, 0x23, 0x31, 0x30, 0x03, 0x03, 0x3d, 0x33, 0x4f, 0x3a,
+ 0x52, 0x05, 0x44, 0x19, 0x1c, 0x08, 0x48, 0x1e, 0x52, 0x30,
+ 0x53, 0x55, 0x53, 0x24, 0x0e, 0x29, 0x43, 0x39, 0x24, 0x0b,
+ 0x4b, 0x01, 0x10, 0x47, 0x3d, 0x1e, 0x18, 0x01, 0x32, 0x4e,
+ 0x42, 0x41, 0x2f, 0x0a, 0x2d, 0x28, 0x38, 0x54, 0x29, 0x20,
+ 0x11, 0x37, 0x21, 0x1a, 0x32, 0x45, 0x18, 0x2e, 0x18, 0x48,
+ 0x18, 0x04, 0x49, 0x28, 0x4b, 0x27, 0x46, 0x0c, 0x28, 0x22,
+ 0x52, 0x0b, 0x04, 0x2a, 0x0d, 0x32, 0x52, 0x46, 0x53, 0x26,
+ 0x4f, 0x34, 0x11, 0x08, 0x2d, 0x46, 0x31, 0x33, 0x3b, 0x0e,
+ 0x19, 0x0f, 0x4c, 0x0b, 0x49, 0x2c, 0x3f, 0x06, 0x46, 0x4a,
+ 0x26, 0x25, 0x33, 0x3a, 0x35, 0x07, 0x42, 0x42, 0x2b, 0x36,
+ 0x09, 0x1c, 0x13, 0x1b, 0x24, 0x38, 0x02, 0x4d, 0x0c, 0x3d,
+ 0x04, 0x1e, 0x44, 0x51, 0x29, 0x36, 0x43, 0x37, 0x47, 0x23,
+ 0x0f, 0x38, 0x3c, 0x3d, 0x06, 0x30, 0x08, 0x3d, 0x27, 0x07,
+ 0x0b, 0x09, 0x3c, 0x0a, 0x14, 0x49, 0x43, 0x35, 0x2b, 0x34,
+ 0x38, 0x1e, 0x0d, 0x50, 0x01, 0x12, 0x09, 0x44, 0x41, 0x50,
+ 0x08, 0x48, 0x29, 0x3d, 0x2f, 0x2f, 0x0e, 0x37, 0x0e, 0x35,
+ 0x36, 0x11, 0x3e, 0x1b,
+};
+
+static int T2[] = {
+ 0x00, 0x46, 0x2f, 0x0e, 0x0b, 0x0c, 0x19, 0x2b, 0x28, 0x17,
+ 0x4c, 0x38, 0x30, 0x1f, 0x12, 0x55, 0x09, 0x42, 0x39, 0x2c,
+ 0x30, 0x14, 0x2d, 0x51, 0x26, 0x38, 0x49, 0x4e, 0x39, 0x06,
+ 0x48, 0x31, 0x44, 0x18, 0x40, 0x50, 0x24, 0x51, 0x1c, 0x4d,
+ 0x11, 0x11, 0x2e, 0x41, 0x30, 0x40, 0x37, 0x31, 0x37, 0x1e,
+ 0x18, 0x1d, 0x4b, 0x16, 0x22, 0x2f, 0x1a, 0x0d, 0x51, 0x2c,
+ 0x4d, 0x55, 0x1a, 0x19, 0x06, 0x13, 0x4d, 0x0b, 0x38, 0x44,
+ 0x24, 0x17, 0x32, 0x0a, 0x3f, 0x30, 0x1f, 0x28, 0x1b, 0x56,
+ 0x47, 0x2b, 0x1c, 0x33, 0x42, 0x36, 0x0b, 0x05, 0x3c, 0x06,
+ 0x29, 0x2a, 0x53, 0x43, 0x43, 0x51, 0x56, 0x0a, 0x0c, 0x28,
+ 0x42, 0x20, 0x15, 0x1c, 0x4b, 0x36, 0x3a, 0x11, 0x36, 0x3d,
+ 0x10, 0x07, 0x05, 0x0f, 0x01, 0x12, 0x1a, 0x02, 0x34, 0x27,
+ 0x4a, 0x04, 0x0a, 0x46, 0x0d, 0x0a, 0x05, 0x0d, 0x15, 0x12,
+ 0x2d, 0x4f, 0x2a, 0x42, 0x14, 0x1e, 0x19, 0x46, 0x27, 0x48,
+ 0x2c, 0x2f, 0x4f, 0x2a, 0x2d, 0x54, 0x19, 0x2a, 0x29, 0x2e,
+ 0x4d, 0x40, 0x30, 0x2b, 0x1a, 0x01, 0x16, 0x17, 0x28, 0x50,
+ 0x03, 0x1c, 0x4f, 0x35, 0x4c, 0x39, 0x17, 0x1b, 0x0d, 0x50,
+ 0x17, 0x34, 0x4c, 0x43, 0x10, 0x22, 0x38, 0x22, 0x44, 0x02,
+ 0x50, 0x32, 0x3a, 0x22, 0x07, 0x54, 0x23, 0x15, 0x0c, 0x43,
+ 0x0e, 0x07, 0x56, 0x47, 0x12, 0x4e, 0x0e, 0x56, 0x34, 0x43,
+ 0x36, 0x27, 0x1c, 0x01, 0x55, 0x02, 0x1d, 0x01, 0x4d, 0x44,
+ 0x30, 0x3b, 0x2d, 0x3c, 0x37, 0x27, 0x2a, 0x54, 0x1b, 0x21,
+ 0x46, 0x28, 0x3f, 0x45, 0x18, 0x52, 0x34, 0x1f, 0x51, 0x12,
+ 0x0b, 0x28, 0x31, 0x28, 0x21, 0x2f, 0x2a, 0x37, 0x28, 0x18,
+ 0x4b, 0x49, 0x04, 0x50, 0x10, 0x31, 0x56, 0x53, 0x02, 0x4f,
+ 0x11, 0x32, 0x51, 0x29, 0x1e, 0x45, 0x34, 0x4b, 0x10, 0x09,
+ 0x41, 0x35, 0x26, 0x54, 0x45, 0x25, 0x47, 0x51, 0x4d, 0x16,
+ 0x46, 0x39, 0x09, 0x43, 0x32, 0x19, 0x15, 0x29, 0x0d, 0x17,
+ 0x21, 0x16, 0x41, 0x1b, 0x40, 0x09, 0x09, 0x15, 0x05, 0x1f,
+ 0x34, 0x2d, 0x4c, 0x11, 0x4a, 0x0d, 0x45, 0x06, 0x20, 0x34,
+ 0x3f, 0x25, 0x12, 0x3e, 0x53, 0x17, 0x1e, 0x29, 0x36, 0x4f,
+ 0x29, 0x4c, 0x12, 0x17, 0x3f, 0x56, 0x3d, 0x15, 0x30, 0x42,
+ 0x34, 0x0d, 0x10, 0x21, 0x17, 0x52, 0x27, 0x54, 0x01, 0x47,
+ 0x31, 0x38, 0x15, 0x3c, 0x20, 0x11, 0x55, 0x29, 0x28, 0x03,
+ 0x43, 0x16, 0x3a, 0x19, 0x40, 0x36, 0x01, 0x33, 0x4a, 0x0e,
+ 0x56, 0x0e, 0x06, 0x3c, 0x11, 0x10, 0x1f, 0x51, 0x4b, 0x11,
+ 0x01, 0x50, 0x25, 0x3c, 0x3f, 0x54, 0x05, 0x3d, 0x1e, 0x26,
+ 0x41, 0x0a, 0x3c, 0x1c, 0x1b, 0x1e, 0x52, 0x15, 0x49, 0x3d,
+ 0x23, 0x48, 0x4c, 0x22, 0x3b, 0x2e, 0x09, 0x4d, 0x4c, 0x3e,
+ 0x42, 0x41, 0x0e, 0x14, 0x03, 0x1c, 0x4c, 0x40, 0x35, 0x48,
+ 0x26, 0x04, 0x15, 0x1b, 0x35, 0x24, 0x31, 0x14, 0x29, 0x02,
+ 0x2f, 0x0a, 0x19, 0x11, 0x39, 0x4c, 0x3f, 0x3b, 0x42, 0x2d,
+ 0x1a, 0x2d, 0x17, 0x20, 0x41, 0x12, 0x3c, 0x2e, 0x52, 0x12,
+ 0x1f, 0x1a, 0x17, 0x21, 0x23, 0x07, 0x4e, 0x26, 0x15, 0x1f,
+ 0x1d, 0x16, 0x1b, 0x19, 0x48, 0x14, 0x4c, 0x1b, 0x13, 0x46,
+ 0x3c, 0x37, 0x3d, 0x49, 0x0b, 0x32, 0x26, 0x3c, 0x2c, 0x1f,
+ 0x07, 0x08, 0x0b, 0x1e, 0x29, 0x2e, 0x1d, 0x21, 0x4c, 0x32,
+ 0x38, 0x0b, 0x40, 0x53, 0x1c, 0x31, 0x10, 0x11, 0x44, 0x1c,
+ 0x42, 0x2a, 0x49, 0x29, 0x50, 0x21, 0x1a, 0x16, 0x16, 0x56,
+ 0x03, 0x23, 0x4f, 0x2a, 0x04, 0x28, 0x49, 0x3b, 0x11, 0x39,
+ 0x0d, 0x0b, 0x40, 0x2e, 0x07, 0x05, 0x10, 0x30, 0x19, 0x36,
+ 0x4a, 0x05, 0x09, 0x3c, 0x26, 0x02, 0x55, 0x40, 0x10, 0x14,
+ 0x3f, 0x0c, 0x2f, 0x2f, 0x36, 0x2b, 0x4f, 0x20, 0x35, 0x0d,
+ 0x2f, 0x1c, 0x02, 0x15, 0x18, 0x2d, 0x3d, 0x41, 0x51, 0x3e,
+ 0x1c, 0x0e, 0x3b, 0x29, 0x0a, 0x39, 0x55, 0x0c, 0x3e, 0x00,
+ 0x27, 0x14, 0x4d, 0x16, 0x11, 0x50, 0x49, 0x00, 0x00, 0x1f,
+ 0x05, 0x27, 0x33, 0x08, 0x34, 0x43, 0x2d, 0x1b, 0x2d, 0x20,
+ 0x51, 0x41, 0x26, 0x2d, 0x0c, 0x30, 0x10, 0x1f, 0x32, 0x0c,
+ 0x18, 0x3f, 0x34, 0x07, 0x30, 0x0b, 0x28, 0x3d, 0x0b, 0x00,
+ 0x0a, 0x13, 0x1e, 0x49, 0x0c, 0x3e, 0x09, 0x41, 0x01, 0x19,
+ 0x1a, 0x4e, 0x41, 0x4e, 0x35, 0x01, 0x0e, 0x3d, 0x18, 0x40,
+ 0x41, 0x31, 0x28, 0x1e, 0x30, 0x50, 0x22, 0x50, 0x37, 0x2d,
+ 0x49, 0x39, 0x41, 0x10,
+};
+
+#define uchar unsigned char
+
+int
+tok_hash(const uchar *key)
+{
+ int i;
+ unsigned f0, f1, f2;
+ const uchar *kp = key;
+
+ for (i=-48, f0=f1=f2=0; *kp; ++kp) {
+ if (*kp < 48 || *kp > 95)
+ return -1;
+ if (kp-key > 12)
+ return -1;
+ f0 += T0[i + *kp];
+ f1 += T1[i + *kp];
+ f2 += T2[i + *kp];
+ i += 48;
+ }
+
+ if (kp-key < 2)
+ return -1;
+
+ f0 %= 87;
+ f1 %= 87;
+ f2 %= 87;
+
+ return (g[f0] + g[f1] + g[f2]) % 70;
+}
+#else
+
/* auto-generated with mph-1.2 */
/*
* d=3
@@ -1154,12 +1594,13 @@ tok_hash(const uchar *key)
return (g[f0] + g[f1] + g[f2]) % 22;
}
+#endif
static void tokmap_insert(struct token_t *tok)
{
uint32_t hash = tok_hash(tok->tok) % TOKMAP_SIZE;
if(hash < 0 || tokmap[hash].tok)
- error("FIXME: hash map collision");
+ error("FIXME: hash map collision %s %s", tok->tok, tokmap[hash].tok);
memcpy(tokmap+hash, tok, sizeof(*tok));
}
@@ -1218,7 +1659,7 @@ void ducky_compile(int fd, bool verbose, int out)
/* initialize some other constants */
makeConstantVariable(".", 0);
-
+
makeConstantVariable("true", 1);
makeConstantVariable("false", 0);
@@ -1271,7 +1712,9 @@ void ducky_compile(int fd, bool verbose, int out)
default:
error("FIXME: invalid return value");
}
- else if(tok[0] != '#')
+ else if(tok[0] == '#')
+ goto next_line;
+ else
{
error("unknown token `%s` on line %d %d", tok, current_line);
goto done;
diff --git a/src/ducky.h b/src/ducky.h
index 3e4d1b2..8b3176d 100644
--- a/src/ducky.h
+++ b/src/ducky.h
@@ -4,6 +4,9 @@
#define DUCKY_MAGIC 0x4475634B /* DucK */
#define VARFORMAT "%lld"
+/* define for rockbox cross-compile */
+#define DUCKY_ROCKBOX
+
#define ARRAYLEN(x) (sizeof(x)/sizeof(x[0]))
#define MIN(x,y) ((x<y)?(x):(y))
diff --git a/src/hid_codes.h b/src/hid_codes.h
new file mode 100644
index 0000000..ebdf023
--- /dev/null
+++ b/src/hid_codes.h
@@ -0,0 +1,749 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2009 by Tomer Shalev
+ *
+ * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef USB_HID_USAGE_TABLES_H
+#define USB_HID_USAGE_TABLES_H
+
+typedef enum usage_page
+{
+ HID_USAGE_PAGE_UNDEFINED = 0x00,
+ HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS = 0x01,
+ HID_USAGE_PAGE_SIMULATION_CONTROLS = 0x02,
+ HID_USAGE_PAGE_VR_CONTROLS = 0x03,
+ HID_USAGE_PAGE_SPORT_CONTROLS = 0x04,
+ HID_USAGE_PAGE_GAME_CONTROLS = 0x05,
+ HID_USAGE_PAGE_GENERIC_DEVICE_CONTROLS = 0x06,
+ HID_USAGE_PAGE_KEYBOARD_KEYPAD = 0x07,
+ HID_USAGE_PAGE_LEDS = 0x08,
+ HID_USAGE_PAGE_BUTTON = 0x09,
+ HID_USAGE_PAGE_ORDINAL = 0x0A,
+ HID_USAGE_PAGE_TELEPHONY = 0x0B,
+ HID_USAGE_PAGE_CONSUMER = 0x0C,
+ HID_USAGE_PAGE_DIGITIZER = 0x0D,
+ HID_USAGE_PAGE_PID_PAGE = 0x0F,
+ HID_USAGE_PAGE_UNICODE = 0x10,
+ HID_USAGE_PAGE_ALPHANUMERIC_DISPLAY = 0x14,
+ HID_USAGE_PAGE_MEDICAL_INSTRUMENTS = 0x40,
+ HID_USAGE_PAGE_BAR_CODE_SCANNER_PAGE = 0x8C,
+ HID_USAGE_PAGE_SCALE_PAGE = 0x8D,
+ HID_USAGE_PAGE_MAGNETIC_STRIPE_READING_DEVICES = 0x8E,
+ HID_USAGE_PAGE_CAMERA_CONTROL_PAGE = 0x90,
+ HID_USAGE_PAGE_ARCADE_PAGE = 0x91,
+} usage_page_t;
+
+/* Generic Desktop Page (0x01) */
+#define HID_GENERIC_DESKTOP_UNDEFINED 0x00
+#define HID_GENERIC_DESKTOP_POINTER 0x01
+#define HID_GENERIC_DESKTOP_MOUSE 0x02
+#define HID_GENERIC_DESKTOP_JOYSTICK 0x04
+#define HID_GENERIC_DESKTOP_GAME_PAD 0x05
+#define HID_GENERIC_DESKTOP_KEYBOARD 0x06
+#define HID_GENERIC_DESKTOP_KEYPAD 0x07
+#define HID_GENERIC_DESKTOP_MULTI_AXIS_CONTROLLER 0x08
+#define HID_GENERIC_DESKTOP_TABLET_PC_SYSTEM_CONTROLS 0x09
+#define HID_GENERIC_DESKTOP_X 0x30
+#define HID_GENERIC_DESKTOP_Y 0x31
+#define HID_GENERIC_DESKTOP_Z 0x32
+#define HID_GENERIC_DESKTOP_RX 0x33
+#define HID_GENERIC_DESKTOP_RY 0x34
+#define HID_GENERIC_DESKTOP_RZ 0x35
+#define HID_GENERIC_DESKTOP_SLIDER 0x36
+#define HID_GENERIC_DESKTOP_DIAL 0x37
+#define HID_GENERIC_DESKTOP_WHEEL 0x38
+#define HID_GENERIC_DESKTOP_HAT_SWITCH 0x39
+#define HID_GENERIC_DESKTOP_COUNTED_BUFFER 0x3A
+#define HID_GENERIC_DESKTOP_BYTE_COUNT 0x3B
+#define HID_GENERIC_DESKTOP_MOTION_WAKEUP 0x3C
+#define HID_GENERIC_DESKTOP_START 0x3D
+#define HID_GENERIC_DESKTOP_SELECT 0x3E
+#define HID_GENERIC_DESKTOP_VX 0x40
+#define HID_GENERIC_DESKTOP_VY 0x41
+#define HID_GENERIC_DESKTOP_VZ 0x42
+#define HID_GENERIC_DESKTOP_VBRX 0x43
+#define HID_GENERIC_DESKTOP_VBRY 0x44
+#define HID_GENERIC_DESKTOP_VBRZ 0x45
+#define HID_GENERIC_DESKTOP_VNO 0x46
+#define HID_GENERIC_DESKTOP_FEATURE_NOTIFICATION 0x47
+#define HID_GENERIC_DESKTOP_RESOLUTION_MULTIPLIER 0x48
+#define HID_GENERIC_DESKTOP_SYSTEM_CONTROL 0x80
+#define HID_GENERIC_DESKTOP_SYSTEM_POWER_DOWN 0x81
+#define HID_GENERIC_DESKTOP_SYSTEM_SLEEP 0x82
+#define HID_GENERIC_DESKTOP_SYSTEM_WAKE_UP 0x83
+#define HID_GENERIC_DESKTOP_SYSTEM_CONTEXT_MENU 0x84
+#define HID_GENERIC_DESKTOP_SYSTEM_MAIN_MENU 0x85
+#define HID_GENERIC_DESKTOP_SYSTEM_APP_MENU 0x86
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_HELP 0x87
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_EXIT 0x88
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_SELECT 0x89
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_RIGHT 0x8A
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_LEFT 0x8B
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_UP 0x8C
+#define HID_GENERIC_DESKTOP_SYSTEM_MENU_DOWN 0x8D
+#define HID_GENERIC_DESKTOP_SYSTEM_COLD_RESTART 0x8E
+#define HID_GENERIC_DESKTOP_SYSTEM_WARM_RESTART 0x8F
+#define HID_GENERIC_DESKTOP_D_PAD_UP 0x90
+#define HID_GENERIC_DESKTOP_D_PAD_DOWN 0x91
+#define HID_GENERIC_DESKTOP_D_PAD_RIGHT 0x92
+#define HID_GENERIC_DESKTOP_D_PAD_LEFT 0x93
+#define HID_GENERIC_DESKTOP_SYSTEM_DOCK 0xA0
+#define HID_GENERIC_DESKTOP_SYSTEM_UNDOCK 0xA1
+#define HID_GENERIC_DESKTOP_SYSTEM_SETUP 0xA2
+#define HID_GENERIC_DESKTOP_SYSTEM_BREAK 0xA3
+#define HID_GENERIC_DESKTOP_SYSTEM_DEBUGGER_BREAK 0xA4
+#define HID_GENERIC_DESKTOP_APPLICATION_BREAK 0xA5
+#define HID_GENERIC_DESKTOP_APPLICATION_DEBUGGER_BREAK 0xA6
+#define HID_GENERIC_DESKTOP_SYSTEM_SPEAKER_MUTE 0xA7
+#define HID_GENERIC_DESKTOP_SYSTEM_HIBERNATE 0xA8
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_INVERT 0xB0
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_INTERNAL 0xB1
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_EXTERNAL 0xB2
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_BOTH 0xB3
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_DUAL 0xB4
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_TOGGLE_INT_EXT 0xB5
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_SWAP_PRIMARY_SECONDARY 0xB6
+#define HID_GENERIC_DESKTOP_SYSTEM_DISPLAY_LCD_AUTOSCALE 0xB7
+
+/* Keyboard/Keypad Page (0x07) */
+#define HID_KEYBOARD_RESERVED 0x00
+#define HID_KEYBOARD_ERROR_ROLLOVER 0x01
+#define HID_KEYBOARD_POSTFAIL 0x02
+#define HID_KEYBOARD_ERROR_UNDEFINED 0x03
+#define HID_KEYBOARD_A 0x04
+#define HID_KEYBOARD_B 0x05
+#define HID_KEYBOARD_C 0x06
+#define HID_KEYBOARD_D 0x07
+#define HID_KEYBOARD_E 0x08
+#define HID_KEYBOARD_F 0x09
+#define HID_KEYBOARD_G 0x0A
+#define HID_KEYBOARD_H 0x0B
+#define HID_KEYBOARD_I 0x0C
+#define HID_KEYBOARD_J 0x0D
+#define HID_KEYBOARD_K 0x0E
+#define HID_KEYBOARD_L 0x0F
+#define HID_KEYBOARD_M 0x10
+#define HID_KEYBOARD_N 0x11
+#define HID_KEYBOARD_O 0x12
+#define HID_KEYBOARD_P 0x13
+#define HID_KEYBOARD_Q 0x14
+#define HID_KEYBOARD_R 0x15
+#define HID_KEYBOARD_S 0x16
+#define HID_KEYBOARD_T 0x17
+#define HID_KEYBOARD_U 0x18
+#define HID_KEYBOARD_V 0x19
+#define HID_KEYBOARD_W 0x1A
+#define HID_KEYBOARD_X 0x1B
+#define HID_KEYBOARD_Y 0x1C
+#define HID_KEYBOARD_Z 0x1D
+#define HID_KEYBOARD_1 0x1E
+#define HID_KEYBOARD_2 0x1F
+#define HID_KEYBOARD_3 0x20
+#define HID_KEYBOARD_4 0x21
+#define HID_KEYBOARD_5 0x22
+#define HID_KEYBOARD_6 0x23
+#define HID_KEYBOARD_7 0x24
+#define HID_KEYBOARD_8 0x25
+#define HID_KEYBOARD_9 0x26
+#define HID_KEYBOARD_0 0x27
+#define HID_KEYBOARD_RETURN 0x28
+#define HID_KEYBOARD_ESCAPE 0x29
+#define HID_KEYBOARD_BACKSPACE 0x2A
+#define HID_KEYBOARD_TAB 0x2B
+#define HID_KEYBOARD_SPACEBAR 0x2C
+#define HID_KEYBOARD_HYPHEN 0x2D
+#define HID_KEYBOARD_EQUAL_SIGN 0x2E
+#define HID_KEYBOARD_LEFT_BRACKET 0x2F
+#define HID_KEYBOARD_RIGHT_BRACKET 0x30
+#define HID_KEYBOARD_BACKSLASH 0x31
+#define HID_KEYBOARD_SEMICOLON 0x33
+#define HID_KEYBOARD_QUOTE 0x34
+#define HID_KEYBOARD_BACKTICK 0x35
+#define HID_KEYBOARD_COMMA 0x36
+#define HID_KEYBOARD_DOT 0x37
+#define HID_KEYBOARD_SLASH 0x38
+#define HID_KEYBOARD_CAPS_LOCK 0x39
+#define HID_KEYBOARD_F1 0x3A
+#define HID_KEYBOARD_F2 0x3B
+#define HID_KEYBOARD_F3 0x3C
+#define HID_KEYBOARD_F4 0x3D
+#define HID_KEYBOARD_F5 0x3E
+#define HID_KEYBOARD_F6 0x3F
+#define HID_KEYBOARD_F7 0x40
+#define HID_KEYBOARD_F8 0x41
+#define HID_KEYBOARD_F9 0x42
+#define HID_KEYBOARD_F10 0x43
+#define HID_KEYBOARD_F11 0x44
+#define HID_KEYBOARD_F12 0x45
+#define HID_KEYBOARD_PRINT_SCREEN 0x46
+#define HID_KEYBOARD_SCROLL_LOCK 0x47
+#define HID_KEYBOARD_PAUSE 0x48
+#define HID_KEYBOARD_INSERT 0x49
+#define HID_KEYBOARD_HOME 0x4A
+#define HID_KEYBOARD_PAGE_UP 0x4B
+#define HID_KEYBOARD_DELETE 0x4C
+#define HID_KEYBOARD_END 0x4D
+#define HID_KEYBOARD_PAGE_DOWN 0x4E
+#define HID_KEYBOARD_RIGHT_ARROW 0x4F
+#define HID_KEYBOARD_LEFT_ARROW 0x50
+#define HID_KEYBOARD_DOWN_ARROW 0x51
+#define HID_KEYBOARD_UP_ARROW 0x52
+#define HID_KEYPAD_NUM_LOCK_AND_CLEAR 0x53
+#define HID_KEYPAD_SLASH 0x54
+#define HID_KEYPAD_ASTERISK 0x55
+#define HID_KEYPAD_MINUS 0x56
+#define HID_KEYPAD_PLUS 0x57
+#define HID_KEYPAD_ENTER 0x58
+#define HID_KEYPAD_1_AND_END 0x59
+#define HID_KEYPAD_2_AND_DOWN_ARROW 0x5A
+#define HID_KEYPAD_3_AND_PAGE_DOWN 0x5B
+#define HID_KEYPAD_4_AND_LEFT_ARROW 0x5C
+#define HID_KEYPAD_5 0x5D
+#define HID_KEYPAD_6_AND_RIGHT_ARROW 0x5E
+#define HID_KEYPAD_7_AND_HOME 0x5F
+#define HID_KEYPAD_8_AND_UP_ARROW 0x60
+#define HID_KEYPAD_9_AND_PAGE_UP 0x61
+#define HID_KEYPAD_0_AND_INSERT 0x62
+#define HID_KEYPAD_PERIOD_AND_DELETE 0x63
+#define HID_KEYBOARD_APPLICATION 0x65
+#define HID_KEYBOARD_POWER 0x66
+#define HID_KEYPAD_EQUAL 0x67
+#define HID_KEYBOARD_F13 0x68
+#define HID_KEYBOARD_F14 0x69
+#define HID_KEYBOARD_F15 0x6A
+#define HID_KEYBOARD_F16 0x6B
+#define HID_KEYBOARD_F17 0x6C
+#define HID_KEYBOARD_F18 0x6D
+#define HID_KEYBOARD_F19 0x6E
+#define HID_KEYBOARD_F20 0x6F
+#define HID_KEYBOARD_F21 0x70
+#define HID_KEYBOARD_F22 0x71
+#define HID_KEYBOARD_F23 0x72
+#define HID_KEYBOARD_F24 0x73
+#define HID_KEYBOARD_EXECUTE 0x74
+#define HID_KEYBOARD_HELP 0x75
+#define HID_KEYBOARD_MENU 0x76
+#define HID_KEYBOARD_SELECT 0x77
+#define HID_KEYBOARD_STOP 0x78
+#define HID_KEYBOARD_AGAIN 0x79
+#define HID_KEYBOARD_UNDO 0x7A
+#define HID_KEYBOARD_CUT 0x7B
+#define HID_KEYBOARD_COPY 0x7C
+#define HID_KEYBOARD_PASTE 0x7D
+#define HID_KEYBOARD_FIND 0x7E
+#define HID_KEYBOARD_MUTE 0x7F
+#define HID_KEYBOARD_VOLUME_UP 0x80
+#define HID_KEYBOARD_VOLUME_DOWN 0x81
+#define HID_KEYBOARD_LOCKING_CAPS_LOCK 0x82
+#define HID_KEYBOARD_LOCKING_NUM_LOCK 0x83
+#define HID_KEYBOARD_LOCKING_SCROLL_LOCK 0x84
+#define HID_KEYPAD_COMMA 0x85
+#define HID_KEYPAD_EQUAL_SIGN 0x86
+#define HID_KEYBOARD_EX_SEL 0xA4
+#define HID_KEYBOARD_LEFT_CONTROL 0xE0
+#define HID_KEYBOARD_LEFT_SHIFT 0xE1
+#define HID_KEYBOARD_LEFT_ALT 0xE2
+#define HID_KEYBOARD_LEFT_GUI 0xE3
+#define HID_KEYBOARD_RIGHT_CONTROL 0xE4
+#define HID_KEYBOARD_RIGHT_SHIFT 0xE5
+#define HID_KEYBOARD_RIGHT_ALT 0xE6
+#define HID_KEYBOARD_RIGHT_GUI 0xE7
+
+/* LED Page (0x08) */
+#define HID_LED_UNDEFINED 0x00
+#define HID_LED_NUM_LOCK 0x01
+#define HID_LED_CAPS_LOCK 0x02
+#define HID_LED_SCROLL_LOCK 0x03
+#define HID_LED_COMPOSE 0x04
+#define HID_LED_KANA 0x05
+#define HID_LED_POWER 0x06
+#define HID_LED_SHIFT 0x07
+#define HID_LED_DO_NOT_DISTURB 0x08
+#define HID_LED_MUTE 0x09
+#define HID_LED_TONE_ENABLE 0x0A
+#define HID_LED_HIGH_CUT_FILTER 0x0B
+#define HID_LED_LOW_CUT_FILTER 0x0C
+#define HID_LED_EQUALIZER_ENABLE 0x0D
+#define HID_LED_SOUND_FIELD_ON 0x0E
+#define HID_LED_SURROUND_ON 0x0F
+#define HID_LED_REPEAT 0x10
+#define HID_LED_STEREO 0x11
+#define HID_LED_SAMPLING_RATE_DETECT 0x12
+#define HID_LED_SPINNING 0x13
+#define HID_LED_CAV 0x14
+#define HID_LED_CLV 0x15
+#define HID_LED_RECORDING_FORMAT_DETECT 0x16
+#define HID_LED_OFF_HOOK 0x17
+#define HID_LED_RING 0x18
+#define HID_LED_MESSAGE_WAITING 0x19
+#define HID_LED_DATA_MODE 0x1A
+#define HID_LED_BATTERY_OPERATION 0x1B
+#define HID_LED_BATTERY_OK 0x1C
+#define HID_LED_BATTERY_LOW 0x1D
+#define HID_LED_SPEAKER 0x1E
+#define HID_LED_HEAD_SET 0x1F
+#define HID_LED_HOLD 0x20
+#define HID_LED_MICROPHONE 0x21
+#define HID_LED_COVERAGE 0x22
+#define HID_LED_NIGHT_MODE 0x23
+#define HID_LED_SEND_CALLS 0x24
+#define HID_LED_CALL_PICKUP 0x25
+#define HID_LED_CONFERENCE 0x26
+#define HID_LED_STAND_BY 0x27
+#define HID_LED_CAMERA_ON 0x28
+#define HID_LED_CAMERA_OFF 0x29
+#define HID_LED_ON_LINE 0x2A
+#define HID_LED_OFF_LINE 0x2B
+#define HID_LED_BUSY 0x2C
+#define HID_LED_READY 0x2D
+#define HID_LED_PAPER_OUT 0x2E
+#define HID_LED_PAPER_JAM 0x2F
+#define HID_LED_REMOTE 0x30
+#define HID_LED_FORWARD 0x31
+#define HID_LED_REVERSE 0x32
+#define HID_LED_STOP 0x33
+#define HID_LED_REWIND 0x34
+#define HID_LED_FAST_FORWARD 0x35
+#define HID_LED_PLAY 0x36
+#define HID_LED_PAUSE 0x37
+#define HID_LED_RECORD 0x38
+#define HID_LED_ERROR 0x39
+#define HID_LED_USAGE_SELECTED_INDICATOR 0x3A
+#define HID_LED_USAGE_IN_USE_INDICATOR 0x3B
+#define HID_LED_USAGE_MULTI_MODE_INDICATOR 0x3C
+#define HID_LED_INDICATOR_ON 0x3D
+#define HID_LED_INDICATOR_FLASH 0x3E
+#define HID_LED_INDICATOR_SLOW_BLINK 0x3F
+#define HID_LED_INDICATOR_FAST_BLINK 0x40
+#define HID_LED_INDICATOR_OFF 0x41
+#define HID_LED_FLASH_ON_TIME 0x42
+#define HID_LED_SLOW_BLINK_ON_TIME 0x43
+#define HID_LED_SLOW_BLINK_OFF_TIME 0x44
+#define HID_LED_FAST_BLINK_ON_TIME 0x45
+#define HID_LED_FAST_BLINK_OFF_TIME 0x46
+#define HID_LED_USAGE_INDICATOR_COLOR 0x47
+#define HID_LED_INDICATOR_RED 0x48
+#define HID_LED_INDICATOR_GREEN 0x49
+#define HID_LED_INDICATOR_AMBER 0x4A
+#define HID_LED_GENERIC_INDICATOR 0x4B
+#define HID_LED_SYSTEM_SUSPEND 0x4C
+#define HID_LED_EXTERNAL_POWER_CONNECTED 0x4D
+
+/* Consumer Page (0x0C) */
+#define HID_CONSUMER_USAGE_UNASSIGNED 0x00
+#define HID_CONSUMER_USAGE_CONSUMER_CONTROL 0x1
+#define HID_CONSUMER_USAGE_NUMERIC_KEY_PAD 0x2
+#define HID_CONSUMER_USAGE_PROGRAMMABLE_BUTTONS 0x3
+#define HID_CONSUMER_USAGE_MICROPHONE 0x4
+#define HID_CONSUMER_USAGE_HEADPHONE 0x5
+#define HID_CONSUMER_USAGE_GRAPHIC_EQUALIZER 0x6
+#define HID_CONSUMER_USAGE_PLUS_10 0x20
+#define HID_CONSUMER_USAGE_PLUS_100 0x21
+#define HID_CONSUMER_USAGE_AM_PM 0x22
+#define HID_CONSUMER_USAGE_POWER 0x30
+#define HID_CONSUMER_USAGE_RESET 0x31
+#define HID_CONSUMER_USAGE_SLEEP 0x32
+#define HID_CONSUMER_USAGE_SLEEP_AFTER 0x33
+#define HID_CONSUMER_USAGE_SLEEP_MODE 0x34
+#define HID_CONSUMER_USAGE_ILLUMINATION 0x35
+#define HID_CONSUMER_USAGE_FUNCTION_BUTTONS 0x36
+#define HID_CONSUMER_USAGE_MENU 0x40
+#define HID_CONSUMER_USAGE_MENU_PICK 0x41
+#define HID_CONSUMER_USAGE_MENU_UP 0x42
+#define HID_CONSUMER_USAGE_MENU_DOWN 0x43
+#define HID_CONSUMER_USAGE_MENU_LEFT 0x44
+#define HID_CONSUMER_USAGE_MENU_RIGHT 0x45
+#define HID_CONSUMER_USAGE_MENU_ESCAPE 0x46
+#define HID_CONSUMER_USAGE_MENU_VALUE_INCREASE 0x47
+#define HID_CONSUMER_USAGE_MENU_VALUE_DECREASE 0x48
+#define HID_CONSUMER_USAGE_DATA_ON_SCREEN 0x60
+#define HID_CONSUMER_USAGE_CLOSED_CAPTION 0x61
+#define HID_CONSUMER_USAGE_CLOSED_CAPTION_SELECT 0x62
+#define HID_CONSUMER_USAGE_VCR_TV 0x63
+#define HID_CONSUMER_USAGE_BROADCAST_MODE 0x64
+#define HID_CONSUMER_USAGE_SNAPSHOT 0x65
+#define HID_CONSUMER_USAGE_STILL 0x66
+#define HID_CONSUMER_USAGE_SELECTION 0x80
+#define HID_CONSUMER_USAGE_ASSIGN_SELECTION 0x81
+#define HID_CONSUMER_USAGE_MODE_STEP 0x82
+#define HID_CONSUMER_USAGE_RECALL_LAST 0x83
+#define HID_CONSUMER_USAGE_ENTER_CHANNEL 0x84
+#define HID_CONSUMER_USAGE_ORDER_MOVIE 0x85
+#define HID_CONSUMER_USAGE_CHANNEL 0x86
+#define HID_CONSUMER_USAGE_MEDIA_SELECTION 0x87
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_COMPUTER 0x88
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_TV 0x89
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_WWW 0x8A
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_DVD 0x8B
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_TELEPHONE 0x8C
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_PROGRAM_GUIDE 0x8D
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_VIDEO_PHONE 0x8E
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_GAMES 0x8F
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_MESSAGES 0x90
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_CD 0x91
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_VCR 0x92
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_TUNER 0x93
+#define HID_CONSUMER_USAGE_QUIT 0x94
+#define HID_CONSUMER_USAGE_HELP 0x95
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_TAPE 0x96
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_CABLE 0x97
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_SATELLITE 0x98
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_SECURITY 0x99
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_HOME 0x9A
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_CALL 0x9B
+#define HID_CONSUMER_USAGE_CHANNEL_INCREMENT 0x9C
+#define HID_CONSUMER_USAGE_CHANNEL_DECREMENT 0x9D
+#define HID_CONSUMER_USAGE_MEDIA_SELECT_SAP 0x9E
+#define HID_CONSUMER_USAGE_VCR_PLUS 0xA0
+#define HID_CONSUMER_USAGE_ONCE 0xA1
+#define HID_CONSUMER_USAGE_DAILY 0xA2
+#define HID_CONSUMER_USAGE_WEEKLY 0xA3
+#define HID_CONSUMER_USAGE_MONTHLY 0xA4
+#define HID_CONSUMER_USAGE_PLAY 0xB0
+#define HID_CONSUMER_USAGE_PAUSE 0xB1
+#define HID_CONSUMER_USAGE_RECORD 0xB2
+#define HID_CONSUMER_USAGE_FAST_FORWARD 0xB3
+#define HID_CONSUMER_USAGE_REWIND 0xB4
+#define HID_CONSUMER_USAGE_SCAN_NEXT_TRACK 0xB5
+#define HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK 0xB6
+#define HID_CONSUMER_USAGE_STOP 0xB7
+#define HID_CONSUMER_USAGE_EJECT 0xB8
+#define HID_CONSUMER_USAGE_RANDOM_PLAY 0xB9
+#define HID_CONSUMER_USAGE_SELECT_DISC 0xBA
+#define HID_CONSUMER_USAGE_ENTER_DISC 0xBB
+#define HID_CONSUMER_USAGE_REPEAT 0xBC
+#define HID_CONSUMER_USAGE_TRACKING 0xBD
+#define HID_CONSUMER_USAGE_TRACK_NORMAL 0xBE
+#define HID_CONSUMER_USAGE_SLOW_TRACKING 0xBF
+#define HID_CONSUMER_USAGE_FRAME_FORWARD 0xC0
+#define HID_CONSUMER_USAGE_FRAME_BACK 0xC1
+#define HID_CONSUMER_USAGE_MARK 0xC2
+#define HID_CONSUMER_USAGE_CLEAR_MARK 0xC3
+#define HID_CONSUMER_USAGE_REPEAT_FROM_MARK 0xC4
+#define HID_CONSUMER_USAGE_RETURN_TO_MARK 0xC5
+#define HID_CONSUMER_USAGE_SEARCH_MARK_FORWARD 0xC6
+#define HID_CONSUMER_USAGE_SEARCH_MARK_BACKWARDS 0xC7
+#define HID_CONSUMER_USAGE_COUNTER_RESET 0xC8
+#define HID_CONSUMER_USAGE_SHOW_COUNTER 0xC9
+#define HID_CONSUMER_USAGE_TRACKING_INCREMENT 0xCA
+#define HID_CONSUMER_USAGE_TRACKING_DECREMENT 0xCB
+#define HID_CONSUMER_USAGE_STOP_EJECT 0xCC
+#define HID_CONSUMER_USAGE_PLAY_PAUSE 0xCD
+#define HID_CONSUMER_USAGE_PLAY_SKIP 0xCE
+#define HID_CONSUMER_USAGE_VOLUME 0xE0
+#define HID_CONSUMER_USAGE_BALANCE 0xE1
+#define HID_CONSUMER_USAGE_MUTE 0xE2
+#define HID_CONSUMER_USAGE_BASS 0xE3
+#define HID_CONSUMER_USAGE_TREBLE 0xE4
+#define HID_CONSUMER_USAGE_BASS_BOOST 0xE5
+#define HID_CONSUMER_USAGE_SURROUND_MODE 0xE6
+#define HID_CONSUMER_USAGE_LOUDNESS 0xE7
+#define HID_CONSUMER_USAGE_MPX 0xE8
+#define HID_CONSUMER_USAGE_VOLUME_INCREMENT 0xE9
+#define HID_CONSUMER_USAGE_VOLUME_DECREMENT 0xEA
+#define HID_CONSUMER_USAGE_SPEED_SELECT 0xF0
+#define HID_CONSUMER_USAGE_PLAYBACK_SPEED 0xF1
+#define HID_CONSUMER_USAGE_STANDARD_PLAY 0xF2
+#define HID_CONSUMER_USAGE_LONG_PLAY 0xF3
+#define HID_CONSUMER_USAGE_EXTENDED_PLAY 0xF4
+#define HID_CONSUMER_USAGE_SLOW 0xF5
+#define HID_CONSUMER_USAGE_FAN_ENABLE 0x100
+#define HID_CONSUMER_USAGE_FAN_SPEED 0x101
+#define HID_CONSUMER_USAGE_LIGHT_ENABLE 0x102
+#define HID_CONSUMER_USAGE_LIGHT_ILLUMINATION_LEVEL 0x103
+#define HID_CONSUMER_USAGE_CLIMATE_CONTROL_ENABLE 0x104
+#define HID_CONSUMER_USAGE_ROOM_TEMPERATURE 0x105
+#define HID_CONSUMER_USAGE_SECURITY_ENABLE 0x106
+#define HID_CONSUMER_USAGE_FIRE_ALARM 0x107
+#define HID_CONSUMER_USAGE_POLICE_ALARM 0x108
+#define HID_CONSUMER_USAGE_PROXIMITY 0x109
+#define HID_CONSUMER_USAGE_MOTION 0x10A
+#define HID_CONSUMER_USAGE_DURESS_ALARM 0x10B
+#define HID_CONSUMER_USAGE_HOLDUP_ALARM 0x10C
+#define HID_CONSUMER_USAGE_MEDICAL_ALARM 0x10D
+#define HID_CONSUMER_USAGE_BALANCE_RIGHT 0x150
+#define HID_CONSUMER_USAGE_BALANCE_LEFT 0x151
+#define HID_CONSUMER_USAGE_BASS_INCREMENT 0x152
+#define HID_CONSUMER_USAGE_BASS_DECREMENT 0x153
+#define HID_CONSUMER_USAGE_TREBLE_INCREMENT 0x154
+#define HID_CONSUMER_USAGE_TREBLE_DECREMENT 0x155
+#define HID_CONSUMER_USAGE_SPEAKER_SYSTEM 0x160
+#define HID_CONSUMER_USAGE_CHANNEL_LEFT 0x161
+#define HID_CONSUMER_USAGE_CHANNEL_RIGHT 0x162
+#define HID_CONSUMER_USAGE_CHANNEL_CENTER 0x163
+#define HID_CONSUMER_USAGE_CHANNEL_FRONT 0x164
+#define HID_CONSUMER_USAGE_CHANNEL_CENTER_FRONT 0x165
+#define HID_CONSUMER_USAGE_CHANNEL_SIDE 0x166
+#define HID_CONSUMER_USAGE_CHANNEL_SURROUND 0x167
+#define HID_CONSUMER_USAGE_CHANNEL_LOW_FREQUENCY_ENHANCEMENT 0x168
+#define HID_CONSUMER_USAGE_CHANNEL_TOP 0x169
+#define HID_CONSUMER_USAGE_CHANNEL_UNKNOWN 0x16A
+#define HID_CONSUMER_USAGE_SUB_CHANNEL 0x170
+#define HID_CONSUMER_USAGE_SUB_CHANNEL_INCREMENT 0x171
+#define HID_CONSUMER_USAGE_SUB_CHANNEL_DECREMENT 0x172
+#define HID_CONSUMER_USAGE_ALTERNATE_AUDIO_INCREMENT 0x173
+#define HID_CONSUMER_USAGE_ALTERNATE_AUDIO_DECREMENT 0x174
+#define HID_CONSUMER_USAGE_APPLICATION_LAUNCH_BUTTONS 0x180
+#define HID_CONSUMER_USAGE_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL 0x181
+#define HID_CONSUMER_USAGE_AL_PROGRAMMABLE_BUTTON_CONFIGUARTION 0x182
+#define HID_CONSUMER_USAGE_AL_CONSUMER_CONTROL_CONFIGURATION 0x183
+#define HID_CONSUMER_USAGE_AL_WORD_PROCESSOR 0x184
+#define HID_CONSUMER_USAGE_AL_TEXT_EDITOR 0x185
+#define HID_CONSUMER_USAGE_AL_SPREADSHEET 0x186
+#define HID_CONSUMER_USAGE_AL_GRAPHICS_EDITOR 0x187
+#define HID_CONSUMER_USAGE_AL_PRESENTATION_APP 0x188
+#define HID_CONSUMER_USAGE_AL_DATABASE_APP 0x189
+#define HID_CONSUMER_USAGE_AL_EMAIL_READER 0x18A
+#define HID_CONSUMER_USAGE_AL_NEWSREADER 0x18B
+#define HID_CONSUMER_USAGE_AL_VOICEMAIL 0x18C
+#define HID_CONSUMER_USAGE_AL_CONTACTS_ADDRESS_BOOK 0x18D
+#define HID_CONSUMER_USAGE_AL_CALENDAR_SCHEDULE 0x18E
+#define HID_CONSUMER_USAGE_AL_TASK_PROJECT_MANAGER 0x18F
+#define HID_CONSUMER_USAGE_AL_LOG_JOURNAL_TIMECARD 0x190
+#define HID_CONSUMER_USAGE_AL_CHECKBOOK_FINANCE 0x191
+#define HID_CONSUMER_USAGE_AL_CALCULATOR 0x192
+#define HID_CONSUMER_USAGE_AL_A_V_CAPTURE_PLAYBACK 0x193
+#define HID_CONSUMER_USAGE_AL_LOCAL_MACHINE_BROWSER 0x194
+#define HID_CONSUMER_USAGE_AL_LAN_WAN_BROWSER 0x195
+#define HID_CONSUMER_USAGE_AL_INTERNET_BROWSER 0x196
+#define HID_CONSUMER_USAGE_AL_REMOTE_NETWORKING_ISP_CONNECT 0x197
+#define HID_CONSUMER_USAGE_AL_NETWORK_CONFERENCE 0x198
+#define HID_CONSUMER_USAGE_AL_NETWORK_CHAT 0x199
+#define HID_CONSUMER_USAGE_AL_TELEPHONY_DIALER 0x19A
+#define HID_CONSUMER_USAGE_AL_LOGON 0x19B
+#define HID_CONSUMER_USAGE_AL_LOGOFF 0x19C
+#define HID_CONSUMER_USAGE_AL_LOGON_LOGOFF 0x19D
+#define HID_CONSUMER_USAGE_AL_TERMINAL_LOCK_SCREENSAVER 0x19E
+#define HID_CONSUMER_USAGE_AL_CONTROL_PANEL 0x19F
+#define HID_CONSUMER_USAGE_AL_COMMAND_LINE_PROCESSOR_RUN 0x1A0
+#define HID_CONSUMER_USAGE_AL_PROCESS_TASK_MANAGER 0x1A1
+#define HID_CONSUMER_USAGE_AL_SELECT_TASK_APPLICATION 0x1A2
+#define HID_CONSUMER_USAGE_AL_NEXT_TASK_APPLICATION 0x1A3
+#define HID_CONSUMER_USAGE_AL_PREVIOUS_TASK_APPLICATION 0x1A4
+#define HID_CONSUMER_USAGE_AL_PREEMPTIVE_HALT_TASK_APPLICATION 0x1A5
+#define HID_CONSUMER_USAGE_AL_INTEGRATED_HELP_CENTER 0x1A6
+#define HID_CONSUMER_USAGE_AL_DOCUMENTS 0x1A7
+#define HID_CONSUMER_USAGE_AL_THESAURUS 0x1A8
+#define HID_CONSUMER_USAGE_AL_DICTIONARY 0x1A9
+#define HID_CONSUMER_USAGE_AL_DESKTOP 0x1AA
+#define HID_CONSUMER_USAGE_AL_SPELL_CHECK 0x1AB
+#define HID_CONSUMER_USAGE_AL_GRAMMAR_CHECK 0x1AC
+#define HID_CONSUMER_USAGE_AL_WIRELESS_STATUS 0x1AD
+#define HID_CONSUMER_USAGE_AL_KEYBOARD_LAYOUT 0x1AE
+#define HID_CONSUMER_USAGE_AL_VIRUS_PROTECTION 0x1AF
+#define HID_CONSUMER_USAGE_AL_ENCRYPTION 0x1B0
+#define HID_CONSUMER_USAGE_AL_SCREEN_SAVER 0x1B1
+#define HID_CONSUMER_USAGE_AL_ALARMS 0x1B2
+#define HID_CONSUMER_USAGE_AL_CLOCK 0x1B3
+#define HID_CONSUMER_USAGE_AL_FILE_BROWSER 0x1B4
+#define HID_CONSUMER_USAGE_AL_POWER_STATUS 0x1B5
+#define HID_CONSUMER_USAGE_AL_IMAGE_BROWSER 0x1B6
+#define HID_CONSUMER_USAGE_AL_AUDIO_BROWSER 0x1B7
+#define HID_CONSUMER_USAGE_AL_MOVIE_BROWSER 0x1B8
+#define HID_CONSUMER_USAGE_AL_DIGITAL_RIGHTS_MANAGER 0x1B9
+#define HID_CONSUMER_USAGE_AL_DIGITAL_WALLET 0x1BA
+#define HID_CONSUMER_USAGE_AL_INSTANT_MESSAGING 0x1BC
+#define HID_CONSUMER_USAGE_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER 0x1BD
+#define HID_CONSUMER_USAGE_AL_OEM_HELP 0x1BE
+#define HID_CONSUMER_USAGE_AL_ONLINE_COMMUNITY 0x1BF
+#define HID_CONSUMER_USAGE_AL_ONLINE_SHOPPING_BROWSER 0x1C1
+#define HID_CONSUMER_USAGE_AL_ENTERTAINMENT_CONTENT_BROWSER 0x1C0
+#define HID_CONSUMER_USAGE_AL_SMARTCARD_INFORMATION_HELP 0x1C2
+#define HID_CONSUMER_USAGE_AL_MARKET_MONITOR_FINANCE_BROWSER 0x1C3
+#define HID_CONSUMER_USAGE_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER 0x1C4
+#define HID_CONSUMER_USAGE_AL_RESEARCH_SEARCH_BROWSER 0x1C6
+#define HID_CONSUMER_USAGE_AL_ONLINE_ACTIVITY_BROWSER 0x1C5
+#define HID_CONSUMER_USAGE_AL_AUDIO_PLAYER 0x1C7
+#define HID_CONSUMER_USAGE_GENERIC_GUI_APPLICATION_CONTROLS 0x200
+#define HID_CONSUMER_USAGE_AC_NEW 0x201
+#define HID_CONSUMER_USAGE_AC_OPEN 0x202
+#define HID_CONSUMER_USAGE_AC_CLOSE 0x203
+#define HID_CONSUMER_USAGE_AC_EXIT 0x204
+#define HID_CONSUMER_USAGE_AC_MAXIMIZE 0x205
+#define HID_CONSUMER_USAGE_AC_MINIMIZE 0x206
+#define HID_CONSUMER_USAGE_AC_SAVE 0x207
+#define HID_CONSUMER_USAGE_AC_PRINT 0x208
+#define HID_CONSUMER_USAGE_AC_PROPERTIES 0x209
+#define HID_CONSUMER_USAGE_AC_UNDO 0x21A
+#define HID_CONSUMER_USAGE_AC_COPY 0x21B
+#define HID_CONSUMER_USAGE_AC_CUT 0x21C
+#define HID_CONSUMER_USAGE_AC_PASTE 0x21D
+#define HID_CONSUMER_USAGE_AC_SELECT_ALL 0x21E
+#define HID_CONSUMER_USAGE_AC_FIND 0x21F
+#define HID_CONSUMER_USAGE_AC_FIND_AND_REPLACE 0x220
+#define HID_CONSUMER_USAGE_AC_SEARCH 0x221
+#define HID_CONSUMER_USAGE_AC_GO_TO 0x222
+#define HID_CONSUMER_USAGE_AC_HOME 0x223
+#define HID_CONSUMER_USAGE_AC_BACK 0x224
+#define HID_CONSUMER_USAGE_AC_FORWARD 0x225
+#define HID_CONSUMER_USAGE_AC_STOP 0x226
+#define HID_CONSUMER_USAGE_AC_REFRESH 0x227
+#define HID_CONSUMER_USAGE_AC_PREVIOUS_LINK 0x228
+#define HID_CONSUMER_USAGE_AC_NEXT_LINK 0x229
+#define HID_CONSUMER_USAGE_AC_BOOKMARKS 0x22A
+#define HID_CONSUMER_USAGE_AC_HISTORY 0x22B
+#define HID_CONSUMER_USAGE_AC_SUBSCRIPTIONS 0x22C
+#define HID_CONSUMER_USAGE_AC_ZOOM_IN 0x22D
+#define HID_CONSUMER_USAGE_AC_ZOOM_OUT 0x22E
+#define HID_CONSUMER_USAGE_AC_ZOOM 0x22F
+#define HID_CONSUMER_USAGE_AC_FULL_SCREEN_VIEW 0x230
+#define HID_CONSUMER_USAGE_AC_NORMAL_VIEW 0x231
+#define HID_CONSUMER_USAGE_AC_VIEW_TOGGLE 0x232
+#define HID_CONSUMER_USAGE_AC_SCROLL_UP 0x233
+#define HID_CONSUMER_USAGE_AC_SCROLL_DOWN 0x234
+#define HID_CONSUMER_USAGE_AC_SCROLL 0x235
+#define HID_CONSUMER_USAGE_AC_PAN_LEFT 0x236
+#define HID_CONSUMER_USAGE_AC_PAN_RIGHT 0x237
+#define HID_CONSUMER_USAGE_AC_PAN 0x238
+#define HID_CONSUMER_USAGE_AC_NEW_WINDOW 0x239
+#define HID_CONSUMER_USAGE_AC_TILE_HORIZONTALLY 0x23A
+#define HID_CONSUMER_USAGE_AC_TILE_VERTICALLY 0x23B
+#define HID_CONSUMER_USAGE_AC_FORMAT 0x23C
+#define HID_CONSUMER_USAGE_AC_EDIT 0x23D
+#define HID_CONSUMER_USAGE_AC_BOLD 0x23E
+#define HID_CONSUMER_USAGE_AC_ITALICS 0x23F
+#define HID_CONSUMER_USAGE_AC_UNDERLINE 0x240
+#define HID_CONSUMER_USAGE_AC_STRIKETHROUGH 0x241
+#define HID_CONSUMER_USAGE_AC_SUBSCRIPT 0x242
+#define HID_CONSUMER_USAGE_AC_SUPERSCRIPT 0x243
+#define HID_CONSUMER_USAGE_AC_ALL_CAPS 0x244
+#define HID_CONSUMER_USAGE_AC_ROTATE 0x245
+#define HID_CONSUMER_USAGE_AC_RESIZE 0x246
+#define HID_CONSUMER_USAGE_AC_FLIP_HORIZONTAL 0x247
+#define HID_CONSUMER_USAGE_AC_FLIP_VERTICAL 0x248
+#define HID_CONSUMER_USAGE_AC_MIRROR_HORIZONTAL 0x249
+#define HID_CONSUMER_USAGE_AC_MIRROR_VERTICAL 0x24A
+#define HID_CONSUMER_USAGE_AC_FONT_SELECT 0x24B
+#define HID_CONSUMER_USAGE_AC_FONT_COLOR 0x24C
+#define HID_CONSUMER_USAGE_AC_FONT_SIZE 0x24D
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_LEFT 0x24E
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_CENTER_H 0x24F
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_RIGHT 0x250
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_BLOCK_H 0x251
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_TOP 0x252
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_CENTER_V 0x253
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_BOTTOM 0x254
+#define HID_CONSUMER_USAGE_AC_JUSTIFY_BLOCK_V 0x255
+#define HID_CONSUMER_USAGE_AC_INDENT_DECREASE 0x256
+#define HID_CONSUMER_USAGE_AC_INDENT_INCREASE 0x257
+#define HID_CONSUMER_USAGE_AC_NUMBERED_LIST 0x258
+#define HID_CONSUMER_USAGE_AC_RESTART_NUMBERING 0x259
+#define HID_CONSUMER_USAGE_AC_BULLETED_LIST 0x25A
+#define HID_CONSUMER_USAGE_AC_PROMOTE 0x25B
+#define HID_CONSUMER_USAGE_AC_DEMOTE 0x25C
+#define HID_CONSUMER_USAGE_AC_YES 0x25D
+#define HID_CONSUMER_USAGE_AC_NO 0x25E
+#define HID_CONSUMER_USAGE_AC_CANCEL 0x25F
+#define HID_CONSUMER_USAGE_AC_CATALOG 0x260
+#define HID_CONSUMER_USAGE_AC_BUY_CHECKOUT 0x261
+#define HID_CONSUMER_USAGE_AC_ADD_TO_CART 0x262
+#define HID_CONSUMER_USAGE_AC_EXPAND 0x263
+#define HID_CONSUMER_USAGE_AC_EXPAND_ALL 0x264
+#define HID_CONSUMER_USAGE_AC_COLLAPSE 0x265
+#define HID_CONSUMER_USAGE_AC_COLLAPSE_ALL 0x266
+#define HID_CONSUMER_USAGE_AC_PRINT_PREVIEW 0x267
+#define HID_CONSUMER_USAGE_AC_PASTE_SPECIAL 0x268
+#define HID_CONSUMER_USAGE_AC_INSERT_MODE 0x269
+#define HID_CONSUMER_USAGE_AC_DELETE 0x26A
+#define HID_CONSUMER_USAGE_AC_LOCK 0x26B
+#define HID_CONSUMER_USAGE_AC_UNLOCK 0x26C
+#define HID_CONSUMER_USAGE_AC_PROTECT 0x26D
+#define HID_CONSUMER_USAGE_AC_UNPROTECT 0x26E
+#define HID_CONSUMER_USAGE_AC_ATTACH_COMMENT 0x26F
+#define HID_CONSUMER_USAGE_AC_DELETE_COMMENT 0x270
+#define HID_CONSUMER_USAGE_AC_VIEW_COMMENT 0x271
+#define HID_CONSUMER_USAGE_AC_SELECT_WORD 0x272
+#define HID_CONSUMER_USAGE_AC_SELECT_SENTENCE 0x273
+#define HID_CONSUMER_USAGE_AC_SELECT_PARAGRAPH 0x274
+#define HID_CONSUMER_USAGE_AC_SELECT_COLUMN 0x275
+#define HID_CONSUMER_USAGE_AC_SELECT_ROW 0x276
+#define HID_CONSUMER_USAGE_AC_SELECT_TABLE 0x277
+#define HID_CONSUMER_USAGE_AC_SELECT_OBJECT 0x278
+#define HID_CONSUMER_USAGE_AC_REDO_REPEAT 0x279
+#define HID_CONSUMER_USAGE_AC_SORT 0x27A
+#define HID_CONSUMER_USAGE_AC_SORT_ASCENDING 0x27B
+#define HID_CONSUMER_USAGE_AC_SORT_DESCENDING 0x27C
+#define HID_CONSUMER_USAGE_AC_FILTER 0x27D
+#define HID_CONSUMER_USAGE_AC_SET_CLOCK 0x27E
+#define HID_CONSUMER_USAGE_AC_VIEW_CLOCK 0x27F
+#define HID_CONSUMER_USAGE_AC_SELECT_TIME_ZONE 0x280
+#define HID_CONSUMER_USAGE_AC_EDIT_TIME_ZONES 0x281
+#define HID_CONSUMER_USAGE_AC_SET_ALARM 0x282
+#define HID_CONSUMER_USAGE_AC_CLEAR_ALARM 0x283
+#define HID_CONSUMER_USAGE_AC_SNOOZE_ALARM 0x284
+#define HID_CONSUMER_USAGE_AC_RESET_ALARM 0x285
+#define HID_CONSUMER_USAGE_AC_SYNCHRONIZE 0x286
+#define HID_CONSUMER_USAGE_AC_SEND_RECEIVE 0x287
+#define HID_CONSUMER_USAGE_AC_SEND_TO 0x288
+#define HID_CONSUMER_USAGE_AC_REPLY 0x289
+#define HID_CONSUMER_USAGE_AC_REPLY_ALL 0x28A
+#define HID_CONSUMER_USAGE_AC_FORWARD_MSG 0x28B
+#define HID_CONSUMER_USAGE_AC_SEND 0x28C
+#define HID_CONSUMER_USAGE_AC_ATTACH_FILE 0x28D
+#define HID_CONSUMER_USAGE_AC_UPLOAD 0x28E
+#define HID_CONSUMER_USAGE_AC_DOWNLOAD_SAVE_TARGET_AS 0x28F
+#define HID_CONSUMER_USAGE_AC_SET_BORDERS 0x290
+#define HID_CONSUMER_USAGE_AC_INSERT_ROW 0x291
+#define HID_CONSUMER_USAGE_AC_INSERT_COLUMN 0x292
+#define HID_CONSUMER_USAGE_AC_INSERT_FILE 0x293
+#define HID_CONSUMER_USAGE_AC_INSERT_PICTURE 0x294
+#define HID_CONSUMER_USAGE_AC_INSERT_OBJECT 0x295
+#define HID_CONSUMER_USAGE_AC_INSERT_SYMBOL 0x296
+#define HID_CONSUMER_USAGE_AC_SAVE_AND_CLOSE 0x297
+#define HID_CONSUMER_USAGE_AC_RENAME 0x298
+#define HID_CONSUMER_USAGE_AC_MERGE 0x299
+#define HID_CONSUMER_USAGE_AC_SPLIT 0x29A
+#define HID_CONSUMER_USAGE_AC_DISRIBUTE_HORIZONTALLY 0x29B
+#define HID_CONSUMER_USAGE_AC_DISTRIBUTE_VERTICALLY 0x29C
+
+#ifdef HAVE_USB_HID_MOUSE
+/* Mouse defines (custom made - Rockbox specific) */
+#define HID_MOUSE_NONE 0x00
+#define HID_MOUSE_UP 0x01
+#define HID_MOUSE_UP_REP 0x02
+#define HID_MOUSE_DOWN 0x03
+#define HID_MOUSE_DOWN_REP 0x04
+#define HID_MOUSE_LEFT 0x05
+#define HID_MOUSE_LEFT_REP 0x06
+#define HID_MOUSE_RIGHT 0x07
+#define HID_MOUSE_RIGHT_REP 0x08
+#define HID_MOUSE_LDRAG_UP 0x09
+#define HID_MOUSE_LDRAG_UP_REP 0x0A
+#define HID_MOUSE_LDRAG_DOWN 0x0B
+#define HID_MOUSE_LDRAG_DOWN_REP 0x0C
+#define HID_MOUSE_LDRAG_LEFT 0x0D
+#define HID_MOUSE_LDRAG_LEFT_REP 0x0E
+#define HID_MOUSE_LDRAG_RIGHT 0x0F
+#define HID_MOUSE_LDRAG_RIGHT_REP 0x10
+#define HID_MOUSE_RDRAG_UP 0x11
+#define HID_MOUSE_RDRAG_UP_REP 0x12
+#define HID_MOUSE_RDRAG_DOWN 0x13
+#define HID_MOUSE_RDRAG_DOWN_REP 0x14
+#define HID_MOUSE_RDRAG_LEFT 0x15
+#define HID_MOUSE_RDRAG_LEFT_REP 0x16
+#define HID_MOUSE_RDRAG_RIGHT 0x17
+#define HID_MOUSE_RDRAG_RIGHT_REP 0x18
+#define HID_MOUSE_SCROLL_UP 0x19
+#define HID_MOUSE_SCROLL_DOWN 0x1A
+#define HID_MOUSE_BUTTON_LEFT 0x1B
+#define HID_MOUSE_BUTTON_LEFT_REL 0x1C
+#define HID_MOUSE_BUTTON_RIGHT 0x1D
+#define HID_MOUSE_BUTTON_RIGHT_REL 0x1E
+#endif /* HAVE_USB_HID_MOUSE */
+
+#endif
diff --git a/src/interp.c b/src/interp.c
index 9a53c22..8a2b91a 100644
--- a/src/interp.c
+++ b/src/interp.c
@@ -848,6 +848,8 @@ static int repeat_handler(char **save, int *repeats_left)
(void) save;
if(*repeats_left > 0)
{
+ if(repeat_line + 1 != current_line)
+ error("nested REPEAT");
--(*repeats_left);
if(*repeats_left)
jump_line(file_des, repeat_line);
@@ -1312,7 +1314,9 @@ void ducky_main(int fd, bool verbose)
default:
error("FIXME: invalid return value");
}
- else if(tok[0] != '#')
+ else if(tok[0] == '#')
+ goto next_line;
+ else
{
error("unknown token `%s` on line %d %d", tok, current_line);
goto done;
diff --git a/src/opcodes.h b/src/opcodes.h
index a08157b..5654b9f 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -38,4 +38,10 @@
#define RSH 0x25
#define SQRT 0x26
#define DECL_CONST 0x27
+#define SENDKEY 0x28
+#define DFL_DELAY 0x29
+#define STR_DELAY 0x2A
+#define TYPE_DEC 0x2B
+#define TYPE_STR 0x2C
+/* new opcodes here, be sure to update vm.c */
#define LINEMARK 0xFF
diff --git a/src/vm.c b/src/vm.c
index 82a780e..b2395f2 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -213,6 +213,8 @@ void repeat_handler(void)
{
if(repeats_left > 0)
{
+ if(repeat_line + 1 != current_line)
+ error("nested REPEAT");
--repeats_left;
if(repeats_left > 0)
{