@@ -58,6 +58,8 @@ static bool force_gba = false;
5858static bool sgb_enabled = true ;
5959static bool sgb_border = true ;
6060static bool allow_up_down = false ;
61+ static int8_t dpad_vertical_latch = 0 ;
62+ static int8_t dpad_horizontal_latch = 0 ;
6163static bool bootrom_dmg = false ;
6264static bool bootrom_gbc = false ;
6365static bool color_correction = true ;
@@ -252,35 +254,112 @@ static void update_input(void)
252254 ib |= input_state_cb (0 , RETRO_DEVICE_JOYPAD, 0 , i) ? (1 << i) : 0 ;
253255 }
254256
255- if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP))
257+ bool raw_up = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) != 0 ;
258+ bool raw_down = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) != 0 ;
259+ bool raw_left = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) != 0 ;
260+ bool raw_right = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) != 0 ;
261+
262+ bool up = raw_up;
263+ bool down = raw_down;
264+ bool left = raw_left;
265+ bool right = raw_right;
266+
267+ if (!allow_up_down)
256268 {
257- if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)))
258- core->KeyPressed (Up_Key);
269+ if (raw_up && raw_down)
270+ {
271+ if (dpad_vertical_latch > 0 )
272+ {
273+ up = true ;
274+ down = false ;
275+ }
276+ else if (dpad_vertical_latch < 0 )
277+ {
278+ up = false ;
279+ down = true ;
280+ }
281+ else
282+ {
283+ up = true ;
284+ down = false ;
285+ dpad_vertical_latch = 1 ;
286+ }
287+ }
288+ else if (raw_up)
289+ {
290+ up = true ;
291+ down = false ;
292+ dpad_vertical_latch = 1 ;
293+ }
294+ else if (raw_down)
295+ {
296+ up = false ;
297+ down = true ;
298+ dpad_vertical_latch = -1 ;
299+ }
300+ else
301+ {
302+ up = false ;
303+ down = false ;
304+ dpad_vertical_latch = 0 ;
305+ }
306+
307+ if (raw_left && raw_right)
308+ {
309+ if (dpad_horizontal_latch > 0 )
310+ {
311+ left = true ;
312+ right = false ;
313+ }
314+ else if (dpad_horizontal_latch < 0 )
315+ {
316+ left = false ;
317+ right = true ;
318+ }
319+ else
320+ {
321+ left = true ;
322+ right = false ;
323+ dpad_horizontal_latch = 1 ;
324+ }
325+ }
326+ else if (raw_left)
327+ {
328+ left = true ;
329+ right = false ;
330+ dpad_horizontal_latch = 1 ;
331+ }
332+ else if (raw_right)
333+ {
334+ left = false ;
335+ right = true ;
336+ dpad_horizontal_latch = -1 ;
337+ }
338+ else
339+ {
340+ left = false ;
341+ right = false ;
342+ dpad_horizontal_latch = 0 ;
343+ }
259344 }
345+
346+ if (up)
347+ core->KeyPressed (Up_Key);
260348 else
261349 core->KeyReleased (Up_Key);
262350
263- if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN))
264- {
265- if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP)))
266- core->KeyPressed (Down_Key);
267- }
351+ if (down)
352+ core->KeyPressed (Down_Key);
268353 else
269354 core->KeyReleased (Down_Key);
270355
271- if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT))
272- {
273- if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)))
274- core->KeyPressed (Left_Key);
275- }
356+ if (left)
357+ core->KeyPressed (Left_Key);
276358 else
277359 core->KeyReleased (Left_Key);
278360
279- if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT))
280- {
281- if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)))
282- core->KeyPressed (Right_Key);
283- }
361+ if (right)
362+ core->KeyPressed (Right_Key);
284363 else
285364 core->KeyReleased (Right_Key);
286365
0 commit comments