summaryrefslogtreecommitdiff
path: root/ROMs/hid.c
blob: 11730e978c2cd04dc80868545c3d421569bdc7de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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);
}