libretro: use input bitmask

This commit is contained in:
trioan
2020-09-21 01:57:33 +00:00
parent 9a82110aa8
commit 801032b513
2 changed files with 101 additions and 106 deletions
+94 -106
View File
@@ -55,6 +55,7 @@ int touch=-1; // gui mouse btn
int al[2][2];//left analog1 int al[2][2];//left analog1
int ar[2][2];//right analog1 int ar[2][2];//right analog1
unsigned char MXjoy[4]; // joy unsigned char MXjoy[4]; // joy
int16_t joypad_bits[4];
#define JOYRANGE_UP_VALUE -16384 /* Joystick ranges in XY */ #define JOYRANGE_UP_VALUE -16384 /* Joystick ranges in XY */
#define JOYRANGE_DOWN_VALUE 16383 #define JOYRANGE_DOWN_VALUE 16383
@@ -84,6 +85,7 @@ int STAT_BASEY;
static retro_input_poll_t input_poll_cb; static retro_input_poll_t input_poll_cb;
extern void retro_audio_cb( short l, short r); extern void retro_audio_cb( short l, short r);
extern bool libretro_supports_bitmasks;
void retro_set_input_state(retro_input_state_t cb) void retro_set_input_state(retro_input_state_t cb)
{ {
@@ -183,41 +185,41 @@ void retro_virtualkb(void)
if(oldi!=-1) if(oldi!=-1)
{ {
vkbd_key(oldi,0); vkbd_key(oldi,0);
oldi=-1; oldi=-1;
} }
if(SHOWKEY==1) if(SHOWKEY==1)
{ {
static int vkflag[5]={0,0,0,0,0}; static int vkflag[5]={0,0,0,0,0};
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP) && vkflag[0]==0 ) if ( (joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) && vkflag[0]==0 )
vkflag[0]=1; vkflag[0]=1;
else if (vkflag[0]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP) ) else if (vkflag[0]==1 && !(joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) )
{ {
vkflag[0]=0; vkflag[0]=0;
vky -= 1; vky -= 1;
} }
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) && vkflag[1]==0 ) if ( (joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) && vkflag[1]==0 )
vkflag[1]=1; vkflag[1]=1;
else if (vkflag[1]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) ) else if (vkflag[1]==1 && !(joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) )
{ {
vkflag[1]=0; vkflag[1]=0;
vky += 1; vky += 1;
} }
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) && vkflag[2]==0 ) if ( (joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) && vkflag[2]==0 )
vkflag[2]=1; vkflag[2]=1;
else if (vkflag[2]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) ) else if (vkflag[2]==1 && !(joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) )
{ {
vkflag[2]=0; vkflag[2]=0;
vkx -= 1; vkx -= 1;
} }
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) && vkflag[3]==0 ) if ( (joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) && vkflag[3]==0 )
vkflag[3]=1; vkflag[3]=1;
else if (vkflag[3]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) ) else if (vkflag[3]==1 && !(joypad_bits[0] & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) )
{ {
vkflag[3]=0; vkflag[3]=0;
vkx += 1; vkx += 1;
@@ -231,19 +233,19 @@ void retro_virtualkb(void)
virtual_kdb(( char *)Retro_Screen,vkx,vky); virtual_kdb(( char *)Retro_Screen,vkx,vky);
i=8; i=8;
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==0) if( (joypad_bits[0] & (1 << i)) && vkflag[4]==0 )
vkflag[4]=1; vkflag[4]=1;
else if( !input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==1) else if( !(joypad_bits[0] & (1 << i)) && vkflag[4]==1 )
{ {
vkflag[4]=0; vkflag[4]=0;
i=check_vkey2(vkx,vky); i=check_vkey2(vkx,vky);
if(i==-1){ if(i==-1)
oldi=-1; oldi=-1;
}
if(i==-2) if(i==-2)
{ {
NPAGE=-NPAGE;oldi=-1; NPAGE=-NPAGE;
oldi=-1;
} }
else if(i==-3) else if(i==-3)
{ {
@@ -259,31 +261,15 @@ void retro_virtualkb(void)
SHOWKEY=-SHOWKEY; SHOWKEY=-SHOWKEY;
} }
else if(i==-5) else if(i==-5)
{
oldi=-1; oldi=-1;
}
else if(i==-6) else if(i==-6)
{ oldi=-1;
//Exit
//retro_deinit();
oldi=-1;
//SHUTDOWN
}
else if(i==-7) else if(i==-7)
{
oldi=-1; oldi=-1;
}
else if(i==-8) else if(i==-8)
{
oldi=-1; oldi=-1;
}
else else
{ {
if(i==RETROK_LSHIFT) //SHIFT if(i==RETROK_LSHIFT) //SHIFT
{ {
SHIFTON=-SHIFTON; SHIFTON=-SHIFTON;
@@ -296,19 +282,19 @@ void retro_virtualkb(void)
oldi=-1; oldi=-1;
} }
else if(i==-12) //RSTOP else if(i==-12) //RSTOP
{ {
//(RETROK_ESCAPE); //(RETROK_ESCAPE);
RSTOPON=-RSTOPON; RSTOPON=-RSTOPON;
oldi=-1; oldi=-1;
} }
else if(i==-13) //GUI else if(i==-13) //GUI
{ {
SHOWKEY=-SHOWKEY; SHOWKEY=-SHOWKEY;
oldi=-1; oldi=-1;
} }
else if(i==-14) //JOY PORT TOGGLE else if(i==-14) //JOY PORT TOGGLE
{ {
SHOWKEY=-SHOWKEY; SHOWKEY=-SHOWKEY;
oldi=-1; oldi=-1;
@@ -316,15 +302,11 @@ void retro_virtualkb(void)
else else
{ {
oldi=i; oldi=i;
vkbd_key(oldi,1); vkbd_key(oldi,1);
} }
} }
} }
} }
} }
void Screen_SetFullUpdate(int scr) void Screen_SetFullUpdate(int scr)
@@ -400,13 +382,12 @@ void Process_key()
} }
memcpy(old_Key_Sate,Key_Sate , sizeof(Key_Sate) ); memcpy(old_Key_Sate,Key_Sate , sizeof(Key_Sate) );
} }
int Retro_PollEvent() int Retro_PollEvent()
{ {
// RETRO B Y SLT STA UP DWN LEFT RGT A X L R L2 R2 L3 R3 // RETRO B Y SLT STA UP DWN LEFT RGT A X L R L2 R2 L3 R3
// INDEX 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // INDEX 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int SAVPAS=PAS; int SAVPAS=PAS;
int i,j; int i,j;
@@ -419,6 +400,18 @@ int Retro_PollEvent()
input_poll_cb(); input_poll_cb();
for (j = 0; j < 4; j++)
{
if (libretro_supports_bitmasks)
joypad_bits[j] = input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK);
else
{
joypad_bits[j] = 0;
for (i = 0; i < (RETRO_DEVICE_ID_JOYPAD_R3+1); i++)
joypad_bits[j] |= input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, i) ? (1 << i) : 0;
}
}
int mouse_l; int mouse_l;
int mouse_r; int mouse_r;
int16_t mouse_x,mouse_y; int16_t mouse_x,mouse_y;
@@ -427,27 +420,27 @@ int Retro_PollEvent()
if(SHOWKEY==-1 && pauseg==0)Process_key(); if(SHOWKEY==-1 && pauseg==0)Process_key();
//Joy mode //Joy mode
for(j=0;j<4;j++){ for(j=0;j<4;j++)
{
for(i=4;i<10;i++) for(i=4;i<10;i++)
{ {
if( input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, i)) { if(joypad_bits[j] & (1 << i))
MXjoy[j] |= vbt[j][i]; // Joy press MXjoy[j] |= vbt[j][i]; // Joy press
fprintf(stderr, "[Libretro-atari800]: MXjoy press controller %u slot %u.\n", j, i); else if( MXjoy[j] & vbt[j][i])
} MXjoy[j] &= ~vbt[j][i]; // Joy press
else if( MXjoy[j]&vbt[j][i])MXjoy[j] &= ~vbt[j][i]; // Joy press
} }
}
} if(a5200_joyhack) //hack for robotron right analog act as Joy1
{
int x,y;
if(a5200_joyhack) //hack for robotron right analog act as Joy1
{
//emulate Joy1 with joy analog right //emulate Joy1 with joy analog right
ar[0][0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X)); ar[0][0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X));
ar[0][1] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y)); ar[0][1] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y));
int x=ar[0][0]; x=ar[0][0];
int y=ar[0][1]; y=ar[0][1];
/* Directions */ /* Directions */
@@ -463,38 +456,36 @@ int Retro_PollEvent()
} }
if(atari_devices[0]==RETRO_DEVICE_ATARI_JOYSTICK){ if(atari_devices[0]==RETRO_DEVICE_ATARI_JOYSTICK)
//shortcut for joy mode only {
//shortcut for joy mode only
//Button B Y SLT STA
// 0 1 2 3
for(i=0;i<4;i++){
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) {
mbt[i]=1;
fprintf(stderr, "[Libretro-atari800]: atari_devices press slot %u.\n", i);
}
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) )
{
mbt[i]=0;
if(i==2)MOUSE_EMULATED=-MOUSE_EMULATED;
}
}
//Button L R L2 R2 L3 R3
// 10 11 12 13 14 15
for(i=10;i<16;i++){
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) {
fprintf(stderr, "[Libretro-atari800]: atari_devices press slot %u.\n", i);
mbt[i]=1;
}
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) )
{
mbt[i]=0;
if(i==14)SHOWKEY=-SHOWKEY;
}
}
//Button B Y SLT STA
// 0 1 2 3
for(i=0;i<4;i++)
{
if ( (joypad_bits[0] & (1 << i)) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && !(joypad_bits[0] && (1 << i)) )
{
mbt[i]=0;
if(i==2)
MOUSE_EMULATED = -MOUSE_EMULATED;
}
}
//Button L R L2 R2 L3 R3
// 10 11 12 13 14 15
for(i=10;i<16;i++)
{
if ( (joypad_bits[0] & (1 << i)) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && !(joypad_bits[0] & (1 << i)) )
{
mbt[i]=0;
if(i==14)
SHOWKEY = -SHOWKEY;
}
}
}//if atari_devices=joy }//if atari_devices=joy
@@ -502,18 +493,19 @@ int Retro_PollEvent()
if(slowdown>0)return 1; if(slowdown>0)return 1;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT))mouse_x += PAS; if (joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) mouse_x += PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT))mouse_x -= PAS; if (joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) mouse_x -= PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN))mouse_y += PAS; if (joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) mouse_y += PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP))mouse_y -= PAS; if (joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_UP)) mouse_y -= PAS;
mouse_l=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A); mouse_l = joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_A) ? 1 : 0;
mouse_r=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B); mouse_r = joypad_bits[0] && (1 << RETRO_DEVICE_ID_JOYPAD_B) ? 1 : 0;
PAS=SAVPAS; PAS=SAVPAS;
slowdown=1; slowdown=1;
} }
else { else
{
//printf("-----------------%d \n",pauseg); //printf("-----------------%d \n",pauseg);
mouse_wu = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP); mouse_wu = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP);
mouse_wd = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN); mouse_wd = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN);
@@ -526,26 +518,23 @@ int Retro_PollEvent()
static int mmbL=0,mmbR=0; static int mmbL=0,mmbR=0;
if(mmbL==0 && mouse_l){ if(mmbL==0 && mouse_l)
{
mmbL=1; mmbL=1;
pushi=1; pushi=1;
touch=1; touch=1;
} }
else if(mmbL==1 && !mouse_l) { else if(mmbL==1 && !mouse_l)
{
mmbL=0; mmbL=0;
pushi=0; pushi=0;
touch=-1; touch=-1;
} }
if(mmbR==0 && mouse_r){ if(mmbR==0 && mouse_r)
mmbR=1; mmbR=1;
} else if(mmbR==1 && !mouse_r)
else if(mmbR==1 && !mouse_r) {
mmbR=0; mmbR=0;
}
gmx+=mouse_x; gmx+=mouse_x;
gmy+=mouse_y; gmy+=mouse_y;
@@ -555,9 +544,8 @@ int Retro_PollEvent()
if(gmy>retroh-1)gmy=retroh-1; if(gmy>retroh-1)gmy=retroh-1;
if(SHOWKEY==1 && pauseg==0)retro_virtualkb(); if(SHOWKEY==1 && pauseg==0)retro_virtualkb();
return 1;
return 1;
} }
+7
View File
@@ -66,6 +66,8 @@ static retro_audio_sample_t audio_cb;
static retro_audio_sample_batch_t audio_batch_cb; static retro_audio_sample_batch_t audio_batch_cb;
static retro_environment_t environ_cb; static retro_environment_t environ_cb;
bool libretro_supports_bitmasks = false;
static void fallback_log(enum retro_log_level level, const char *fmt, ...) static void fallback_log(enum retro_log_level level, const char *fmt, ...)
{ {
@@ -546,6 +548,9 @@ log_cb(RETRO_LOG_INFO, "PIXEL FORMAT is not supported.\n");
Emu_init(); Emu_init();
texture_init(); texture_init();
if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL))
libretro_supports_bitmasks = true;
} }
extern void main_exit(); extern void main_exit();
@@ -566,6 +571,8 @@ log_cb(RETRO_LOG_INFO, "exit main\n");
} }
log_cb(RETRO_LOG_INFO, "Retro DeInit\n"); log_cb(RETRO_LOG_INFO, "Retro DeInit\n");
libretro_supports_bitmasks = false;
} }
unsigned retro_api_version(void) unsigned retro_api_version(void)