@@ -51,8 +51,7 @@ typedef struct {
5151} key_event_t ;
5252
5353typedef struct {
54- int32_t xrel ;
55- int32_t yrel ;
54+ int32_t xrel , yrel ;
5655} mouse_motion_t ;
5756
5857typedef 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 */
7597static uint16_t vt_last = 0 ;
7698static 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
79111void
80112I_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
115159static 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