Skip to content

Commit d15b2bd

Browse files
authored
Merge pull request #3 from alanjian85/rv32emu
Support bidirectional queue system
2 parents 284a26a + 5bde81d commit d15b2bd

File tree

1 file changed

+66
-22
lines changed

1 file changed

+66
-22
lines changed

src/riscv/i_system.c

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ typedef struct {
5151
} key_event_t;
5252

5353
typedef struct {
54-
int32_t xrel;
55-
int32_t yrel;
54+
int32_t xrel, yrel;
5655
} mouse_motion_t;
5756

5857
typedef struct {
@@ -69,16 +68,57 @@ typedef struct {
6968
mouse_button_t button;
7069
} mouse;
7170
};
72-
} rv32emu_event_t;
71+
} emu_event_t;
72+
73+
typedef struct {
74+
emu_event_t *base;
75+
size_t start;
76+
} event_queue_t;
77+
78+
enum {
79+
RELATIVE_MODE_SUBMISSION = 0,
80+
};
81+
82+
typedef struct {
83+
uint32_t type;
84+
union {
85+
union {
86+
uint8_t enabled;
87+
} mouse;
88+
};
89+
} emu_submission_t;
90+
91+
typedef struct {
92+
emu_submission_t *base;
93+
size_t end;
94+
} submission_queue_t;
7395

7496
/* Video Ticks tracking */
7597
static uint16_t vt_last = 0;
7698
static uint32_t vt_base = 0;
7799

100+
static event_queue_t event_queue = {
101+
.base = NULL,
102+
.start = 0,
103+
};
104+
static submission_queue_t submission_queue = {
105+
.base = NULL,
106+
.end = 0,
107+
};
108+
static unsigned int event_count = 0;
109+
const int queues_capacity = 128;
78110

79111
void
80112
I_Init(void)
81113
{
114+
void *base = malloc(sizeof(emu_event_t) * queues_capacity + sizeof(emu_submission_t) * queues_capacity);
115+
event_queue.base = base;
116+
submission_queue.base = base;
117+
register int a0 asm("a0") = (uintptr_t) base;
118+
register int a1 asm("a1") = queues_capacity;
119+
register int a2 asm("a2") = (uintptr_t) &event_count;
120+
register int a7 asm("a7") = 0xc0de;
121+
asm volatile("scall" : "+r"(a0) : "r"(a1), "r"(a2), "r"(a7));
82122
}
83123

84124

@@ -104,12 +144,16 @@ I_GetTime(void)
104144
return vt_base + vt_now;
105145
}
106146

107-
static int PollEvent(rv32emu_event_t* event)
147+
static int PollEvent(emu_event_t* event)
108148
{
109-
register int a0 asm("a0") = (uintptr_t) event;
110-
register int a7 asm("a7") = 0xc0de;
111-
asm volatile("scall" : "+r"(a0) : "r"(a7));
112-
return a0;
149+
if (event_count <= 0)
150+
return 0;
151+
152+
*event = event_queue.base[event_queue.start++];
153+
event_queue.start &= queues_capacity - 1;
154+
--event_count;
155+
156+
return 1;
113157
}
114158

115159
static void
@@ -123,10 +167,10 @@ I_GetRemoteEvent(void)
123167
int mdx = 0;
124168
int mdy = 0;
125169

126-
rv32emu_event_t rv32emu_event;
127-
while (PollEvent(&rv32emu_event)) {
128-
if (rv32emu_event.type == KEY_EVENT && rv32emu_event.key_event.keycode & 0x40000000) {
129-
uint32_t keycode = rv32emu_event.key_event.keycode;
170+
emu_event_t emu_event;
171+
while (PollEvent(&emu_event)) {
172+
if (emu_event.type == KEY_EVENT && emu_event.key_event.keycode & 0x40000000) {
173+
uint32_t keycode = emu_event.key_event.keycode;
130174
switch (keycode) {
131175
case 0x40000050:
132176
keycode = KEY_LEFTARROW;
@@ -189,25 +233,25 @@ I_GetRemoteEvent(void)
189233
keycode = KEY_F12;
190234
break;
191235
}
192-
rv32emu_event.key_event.keycode = keycode;
236+
emu_event.key_event.keycode = keycode;
193237
}
194238

195-
switch (rv32emu_event.type) {
239+
switch (emu_event.type) {
196240
case KEY_EVENT:
197-
event.type = rv32emu_event.key_event.state ? ev_keydown : ev_keyup;
198-
event.data1 = rv32emu_event.key_event.keycode;
241+
event.type = emu_event.key_event.state ? ev_keydown : ev_keyup;
242+
event.data1 = emu_event.key_event.keycode;
199243
D_PostEvent(&event);
200244
break;
201245
case MOUSE_BUTTON_EVENT:
202-
if (rv32emu_event.mouse.button.state)
203-
s_btn |= (1 << (rv32emu_event.mouse.button.button - 1));
246+
if (emu_event.mouse.button.state)
247+
s_btn |= (1 << (emu_event.mouse.button.button - 1));
204248
else
205-
s_btn &= ~(1 << (rv32emu_event.mouse.button.button - 1));
249+
s_btn &= ~(1 << (emu_event.mouse.button.button - 1));
206250
mupd = true;
207251
break;
208252
case MOUSE_MOTION_EVENT:
209-
mdx += rv32emu_event.mouse.motion.xrel;
210-
mdy += rv32emu_event.mouse.motion.yrel;
253+
mdx += emu_event.mouse.motion.xrel;
254+
mdy += emu_event.mouse.motion.yrel;
211255
mupd = true;
212256
break;
213257
}
@@ -216,7 +260,7 @@ I_GetRemoteEvent(void)
216260
if (mupd) {
217261
event.type = ev_mouse;
218262
event.data1 = s_btn;
219-
event.data2 = mdx << 2;
263+
event.data2 = mdx << 2;
220264
event.data3 = - mdy << 2; /* Doom is sort of inverted ... */
221265
D_PostEvent(&event);
222266
}

0 commit comments

Comments
 (0)