summaryrefslogtreecommitdiff
path: root/ROMs/hid.c
diff options
context:
space:
mode:
Diffstat (limited to 'ROMs/hid.c')
-rw-r--r--ROMs/hid.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/ROMs/hid.c b/ROMs/hid.c
new file mode 100644
index 0000000..11730e9
--- /dev/null
+++ b/ROMs/hid.c
@@ -0,0 +1,80 @@
+#include "std.c"
+
+#define BUS_HID_SK_START 0x6033
+#define BUS_HID_MS_INDEX 0x602F
+#define BUS_HID_MS_STATE 0x602F + 2
+
+#define SK_MAX 256
+#define SK_NEWLINE 13
+#define SK_BACKSPACE 8
+#define SK_SHIFT 160
+#define SK_A 65
+#define SK_B 66
+#define SK_C 67
+#define SK_D 68
+#define SK_E 69
+#define SK_F 70
+#define SK_G 71
+#define SK_H 72
+#define SK_I 73
+#define SK_J 74
+#define SK_K 75
+#define SK_L 76
+#define SK_M 77
+#define SK_N 78
+#define SK_O 79
+#define SK_P 80
+#define SK_Q 81
+#define SK_R 82
+#define SK_S 83
+#define SK_T 84
+#define SK_U 85
+#define SK_V 86
+#define SK_W 87
+#define SK_X 88
+#define SK_Y 89
+#define SK_Z 90
+
+#define MS_LEFT 1
+#define MS_RIGHT 2
+#define MS_MIDDLE 4
+
+int hid_getKeyState(int scanCode)
+{
+ char* sk_table = BUS_HID_SK_START;
+ int index = scanCode / 8;
+ int bit = scanCode % 8;
+
+ int val = sk_table[index - 1];
+ return (val & (1 << bit)) != 0;
+}
+
+int hid_getPressedKey()
+{
+ for (int sk = 0; sk < SK_MAX; sk++)
+ {
+ if (hid_getKeyState(sk) && sk != SK_SHIFT)
+ return sk;
+ }
+ return 0;
+}
+
+int hid_waitForPressedKey()
+{
+ while (true)
+ {
+ int sk = hid_getPressedKey();
+ if (sk != 0)
+ return sk;
+ }
+}
+
+int hid_getMouseIndex()
+{
+ return *(BUS_HID_MS_INDEX);
+}
+
+int hid_getMouseState()
+{
+ return *(BUS_HID_MS_STATE);
+} \ No newline at end of file