Skip to content

Commit 026eadd

Browse files
committed
add hardware joystick support (Android/Unix, WIP: axis/button config is not yet)
1 parent 09af728 commit 026eadd

File tree

4 files changed

+139
-48
lines changed

4 files changed

+139
-48
lines changed

x11/joystick.c

+106-33
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,16 @@ BYTE Joystick_get_vbtn_state(WORD n)
148148

149149
#endif
150150

151+
#ifndef PSP
152+
SDL_Joystick *sdl_joy;
153+
#endif
154+
151155
void Joystick_Init(void)
152156
{
157+
#ifndef PSP
158+
int i, nr_joys, nr_btns;
159+
#endif
160+
153161
joy[0] = 1; // active only one
154162
joy[1] = 0;
155163
JoyKeyState = 0;
@@ -165,6 +173,42 @@ void Joystick_Init(void)
165173
#if defined(ANDROID) || TARGET_OS_IPHONE
166174
Joystick_Vbtn_Update(WinUI_get_vkscale());
167175
#endif
176+
177+
#ifndef PSP
178+
sdl_joy = 0;
179+
180+
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
181+
182+
nr_joys = SDL_NumJoysticks();
183+
p6logd("joy num %d\n", nr_joys);
184+
for (i = 0; i < nr_joys; i++) {
185+
sdl_joy = SDL_JoystickOpen(i);
186+
if (sdl_joy) {
187+
p6logd("Name: %s\n", SDL_JoystickNameForIndex(i));
188+
p6logd("# of Axes: %d\n", SDL_JoystickNumAxes(sdl_joy));
189+
p6logd("# of Btns: %d\n", SDL_JoystickNumButtons(sdl_joy));
190+
p6logd("# of Balls: %d\n", SDL_JoystickNumBalls(sdl_joy));
191+
p6logd("# of Hats: %d\n", SDL_JoystickNumHats(sdl_joy));
192+
nr_btns = SDL_JoystickNumButtons(sdl_joy);
193+
if (nr_btns < 2) {
194+
sdl_joy = 0;
195+
} else {
196+
break;
197+
}
198+
} else {
199+
p6logd("can't open joy %d\n", i);
200+
}
201+
}
202+
#endif
203+
}
204+
205+
void Joystick_Cleanup(void)
206+
{
207+
#ifndef PSP
208+
if (SDL_JoystickGetAttached(sdl_joy)) {
209+
SDL_JoystickClose(sdl_joy);
210+
}
211+
#endif
168212
}
169213

170214
BYTE FASTCALL Joystick_Read(BYTE num)
@@ -202,7 +246,11 @@ void FASTCALL Joystick_Write(BYTE num, BYTE data)
202246
if ( (num==0)||(num==1) ) JoyPortData[num] = data;
203247
}
204248

249+
#ifdef PSP
205250
void FASTCALL Joystick_Update(void)
251+
#else
252+
void FASTCALL Joystick_Update(SDL_Keycode key)
253+
#endif
206254
{
207255
#if defined(PSP)
208256
BYTE ret0 = 0xff, ret1 = 0xff;
@@ -248,11 +296,13 @@ void FASTCALL Joystick_Update(void)
248296
JoyAnaPadX = psppad.Lx;
249297
JoyAnaPadY = psppad.Ly;
250298

251-
#elif defined(ANDROID) || TARGET_OS_IPHONE
299+
#else //defined(PSP)
252300
BYTE ret0 = 0xff, ret1 = 0xff;
253301
int num = 0; //xxx only joy1
254302
static BYTE pre_ret0 = 0xff;
303+
signed int x, y;
255304

305+
#if defined(ANDROID) || TARGET_OS_IPHONE
256306
SDL_Finger *finger;
257307
SDL_FingerID fid;
258308
float fx, fy;
@@ -322,18 +372,71 @@ void FASTCALL Joystick_Update(void)
322372
if (vbtn_state[5] == VBTN_ON) {
323373
ret0 ^= (Config.VbtnSwap == 0)? JOY_TRG2 : JOY_TRG1;
324374
}
375+
#endif //defined(ANDROID) || TARGET_OS_IPHONE
376+
377+
// real gamepad
378+
if (sdl_joy) {
379+
SDL_JoystickUpdate();
380+
x = SDL_JoystickGetAxis(sdl_joy, 0);
381+
y = SDL_JoystickGetAxis(sdl_joy, 1);
382+
383+
if (x < -256) {
384+
ret0 ^= JOY_LEFT;
385+
}
386+
if (x > 256) {
387+
ret0 ^= JOY_RIGHT;
388+
}
389+
if (y < -256) {
390+
ret0 ^= JOY_UP;
391+
}
392+
if (y > 256) {
393+
ret0 ^= JOY_DOWN;
394+
}
395+
if (SDL_JoystickGetButton(sdl_joy, 0)) {
396+
ret0 ^= JOY_TRG1;
397+
}
398+
if (SDL_JoystickGetButton(sdl_joy, 1)) {
399+
ret0 ^= JOY_TRG2;
400+
}
401+
}
402+
403+
// scan keycode for menu UI
404+
if (key != SDLK_UNKNOWN) {
405+
switch (key) {
406+
case SDLK_UP :
407+
ret0 ^= JOY_UP;
408+
break;
409+
case SDLK_DOWN:
410+
ret0 ^= JOY_DOWN;
411+
break;
412+
case SDLK_LEFT:
413+
ret0 ^= JOY_LEFT;
414+
break;
415+
case SDLK_RIGHT:
416+
ret0 ^= JOY_RIGHT;
417+
break;
418+
case SDLK_RETURN:
419+
ret0 ^= JOY_TRG1;
420+
break;
421+
case SDLK_ESCAPE:
422+
ret0 ^= JOY_TRG2;
423+
break;
424+
}
425+
}
325426

326427
JoyDownState0 = ~(ret0 ^ pre_ret0) | ret0;
327428
JoyUpState0 = (ret0 ^ pre_ret0) & ret0;
328429
pre_ret0 = ret0;
329-
#endif
330430

331-
#if defined(USE_OGLES11) || defined(PSP)
431+
#endif //defined(PSP)
432+
332433
// disable Joystick when software keyboard or mouse is active
333434
if (!Keyboard_IsSwKeyboard() && !Config.JoyOrMouse) {
334435
JoyState0[num] = ret0;
335436
JoyState1[num] = ret1;
336437
}
438+
439+
#if defined(USE_OGLES11) || defined(PSP)
337440
// update the states of the mouse buttons
338441
// when sw keyboard is inactive and mouse is active.
339442
// state is updated when menu is open, but don't care
@@ -355,36 +458,6 @@ void FASTCALL Joystick_Update(void)
355458
#endif
356459
}
357460

358-
#if !defined(PSP) && !defined(ANDROID)
359-
void menukey_update(signed int key)
360-
{
361-
BYTE ret0 = 0xff;
362-
switch (key) {
363-
case SDLK_UP :
364-
ret0 ^= JOY_UP;
365-
break;
366-
case SDLK_DOWN:
367-
ret0 ^= JOY_DOWN;
368-
break;
369-
case SDLK_LEFT:
370-
ret0 ^= JOY_LEFT;
371-
break;
372-
case SDLK_RIGHT:
373-
ret0 ^= JOY_RIGHT;
374-
break;
375-
case SDLK_RETURN:
376-
ret0 ^= JOY_TRG1;
377-
break;
378-
case SDLK_ESCAPE:
379-
ret0 ^= JOY_TRG2;
380-
break;
381-
382-
}
383-
JoyDownState0 = ret0;
384-
385-
}
386-
#endif
387-
388461
BYTE get_joy_downstate(void)
389462
{
390463
return JoyDownState0;

x11/joystick.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
#define winx68k_joy_h
33

44
#include "common.h"
5+
#ifndef PSP
6+
#include <SDL_keycode.h>
7+
#endif
8+
59

610
#define JOY_UP 0x01
711
#define JOY_DOWN 0x02
@@ -28,11 +32,15 @@ typedef struct _vbtn_points {
2832
#endif
2933

3034
void Joystick_Init(void);
35+
void Joystick_Cleanup(void);
3136
BYTE FASTCALL Joystick_Read(BYTE num);
3237
void FASTCALL Joystick_Write(BYTE num, BYTE data);
38+
#ifdef PSP
3339
void FASTCALL Joystick_Update(void);
40+
#else
41+
void FASTCALL Joystick_Update(SDL_Keycode key);
42+
#endif
3443

35-
void menukey_update(signed int key);
3644
BYTE get_joy_downstate(void);
3745
void reset_joy_downstate(void);
3846
BYTE get_joy_upstate(void);

x11/keyboard.c

+11-9
Original file line numberDiff line numberDiff line change
@@ -859,22 +859,24 @@ void Keyboard_skbd(void)
859859

860860
int skbd_mode = FALSE;
861861

862+
void Keyboard_ToggleSkbd(void)
863+
{
864+
skbd_mode = (skbd_mode == TRUE)? FALSE : TRUE;
865+
}
866+
867+
#endif //defined(PSP) || defined(USE_OGLES11)
868+
862869
int Keyboard_IsSwKeyboard(void)
863870
{
864-
#ifdef PSP
871+
#if defined(PSP)
865872
return skbd_mode;
866-
#else
873+
#elif defined(USE_OGLES11)
867874
if (kbd_x < 700) {
868875
return TRUE;
869876
} else {
870877
return FALSE;
871878
}
879+
#else
880+
return FALSE;
872881
#endif
873882
}
874-
875-
void Keyboard_ToggleSkbd(void)
876-
{
877-
skbd_mode = (skbd_mode == TRUE)? FALSE : TRUE;
878-
}
879-
880-
#endif

x11/winx68k.cpp

+13-5
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,11 @@ void WinX68k_Exec(void)
500500
}
501501
}
502502

503+
#ifdef PSP
503504
Joystick_Update();
505+
#else
506+
Joystick_Update(SDLK_UNKNOWN);
507+
#endif
504508
FDD_SetFDInt();
505509
if ( !DispFrame )
506510
WinDraw_Draw();
@@ -569,6 +573,7 @@ int main(int argc, char *argv[])
569573
{
570574
#ifndef PSP
571575
SDL_Event ev;
576+
SDL_Keycode menu_key_down;
572577
#endif
573578
#if defined(ANDROID) || TARGET_OS_IPHONE
574579
int vk_cnt = -1;
@@ -789,6 +794,8 @@ int main(int argc, char *argv[])
789794
}
790795
}
791796
#ifndef PSP
797+
menu_key_down = SDLK_UNKNOWN;
798+
792799
while (SDL_PollEvent(&ev)) {
793800
switch (ev.type) {
794801
case SDL_QUIT:
@@ -874,9 +881,7 @@ int main(int argc, char *argv[])
874881
}
875882
#endif
876883
if (menu_mode != menu_out) {
877-
#if !defined(PSP) && !defined(ANDROID) && TARGET_OS_IPHONE == 0
878-
menukey_update(ev.key.keysym.sym);
879-
#endif
884+
menu_key_down = ev.key.keysym.sym;
880885
} else {
881886
Keyboard_KeyDown(ev.key.keysym.sym);
882887
}
@@ -947,8 +952,11 @@ int main(int argc, char *argv[])
947952
if (menu_mode != menu_out) {
948953
int ret;
949954

955+
#ifdef PSP
950956
Joystick_Update();
951-
957+
#else
958+
Joystick_Update(menu_key_down);
959+
#endif
952960
ret = WinUI_Menu(menu_mode == menu_enter);
953961
menu_mode = menu_in;
954962
if (ret == WUM_MENU_END) {
@@ -988,7 +996,6 @@ int main(int argc, char *argv[])
988996

989997
}
990998
end_loop:
991-
992999
Memory_WriteB(0xe8e00d, 0x31); // SRAM書き込み許可
9931000
Memory_WriteD(0xed0040, Memory_ReadD(0xed0040)+1); // 積算稼働時間(min.)
9941001
Memory_WriteD(0xed0044, Memory_ReadD(0xed0044)+1); // 積算起動回数
@@ -998,6 +1005,7 @@ int main(int argc, char *argv[])
9981005
Mcry_Cleanup();
9991006
#endif
10001007

1008+
Joystick_Cleanup();
10011009
SRAM_Cleanup();
10021010
FDD_Cleanup();
10031011
//CDROM_Cleanup();

0 commit comments

Comments
 (0)