--- /dev/null
+#ifndef _GPXE_KEYS_H
+#define _GPXE_KEYS_H
+
+/** @file
+ *
+ * Key definitions
+ *
+ */
+
+/*
+ * Symbolic names for some standard ASCII characters
+ *
+ */
+
+#define NUL 0x00
+#define CTRL_A 0x01
+#define CTRL_B 0x02
+#define CTRL_C 0x03
+#define CTRL_D 0x04
+#define CTRL_E 0x05
+#define CTRL_F 0x06
+#define CTRL_G 0x07
+#define CTRL_H 0x08
+#define CTRL_I 0x09
+#define CTRL_J 0x0a
+#define CTRL_K 0x0b
+#define CTRL_L 0x0c
+#define CTRL_M 0x0d
+#define CTRL_N 0x0e
+#define CTRL_O 0x0f
+#define CTRL_P 0x10
+#define CTRL_Q 0x11
+#define CTRL_R 0x12
+#define CTRL_S 0x13
+#define CTRL_T 0x14
+#define CTRL_U 0x15
+#define CTRL_V 0x16
+#define CTRL_W 0x17
+#define CTRL_X 0x18
+#define CTRL_Y 0x19
+#define CTRL_Z 0x1a
+
+#define BACKSPACE CTRL_H
+#define TAB CTRL_I
+#define ENTER CTRL_M
+#define ESC 0x1b
+
+/*
+ * Special keys outside the normal ASCII range
+ *
+ *
+ * These values are chosen to facilitate easy conversion from a
+ * received ANSI escape sequence to a KEY_XXX constant. The KEY_XXX
+ * constant is simply 0x100 plus the first byte following CSI in the
+ * ANSI escape sequence. For example, KEY_LEFT is 0x144, since a left
+ * cursor key is transmitted as the ANSI sequence "^[[D".
+ */
+
+#define KEY_ANSI( character ) ( 0x100 + (character) )
+
+#define KEY_MIN 0x101
+#define KEY_UP KEY_ANSI ( 'A' )
+#define KEY_DOWN KEY_ANSI ( 'B' )
+#define KEY_RIGHT KEY_ANSI ( 'C' )
+#define KEY_LEFT KEY_ANSI ( 'D' )
+#define KEY_END KEY_ANSI ( 'E' )
+#define KEY_HOME KEY_ANSI ( 'H' )
+#define KEY_PPAGE KEY_ANSI ( '5' )
+#define KEY_NPAGE KEY_ANSI ( '6' )
+#define KEY_MAX 0x1ff
+
+/* Not in the [KEY_MIN,KEY_MAX] range; terminals seem to send these as
+ * normal ASCII values.
+ */
+#define KEY_BACKSPACE BACKSPACE
+#define KEY_ENTER ENTER
+
+#endif /* _GPXE_KEYS_H */