Files
libretro-atari800/libretro/core-mapper.c
T
Jean-André Santoni 181657a6ec Attempt to fix OSX build
2020-09-13 15:57:24 +07:00

564 lines
13 KiB
C

#include "libretro.h"
#include "libretro-core.h"
#include "retroscreen.h"
#include "platform.h"
#include "vkbd.h"
//CORE VAR
#ifdef _WIN32
char slash = '\\';
#else
char slash = '/';
#endif
extern const char *retro_save_directory;
extern const char *retro_system_directory;
extern const char *retro_content_directory;
char RETRO_DIR[512];
char DISKA_NAME[512]="\0";
char DISKB_NAME[512]="\0";
char TAPE_NAME[512]="\0";
extern void Screen_SetFullUpdate(int scr);
long frame=0;
unsigned long Ktime=0 , LastFPSTime=0;
//VIDEO
#ifdef RENDER16B
uint16_t Retro_Screen[400*300];
#else
unsigned int Retro_Screen[400*300];
#endif
//SOUND
short signed int SNDBUF[1024*2];
int snd_sampler_pal = 44100 / 50;
int snd_sampler_ntsc = 44100 / 60;
//PATH
char RPATH[512];
//EMU FLAGS
int NPAGE=-1, KCOL=1, BKGCOLOR=0;
int SHOWKEY=-1;
#if defined(ANDROID) || defined(__ANDROID__)
int MOUSE_EMULATED=1;
#else
int MOUSE_EMULATED=-1;
#endif
int SHIFTON=-1,MOUSEMODE=-1,PAS=4;
int SND=1; //SOUND ON/OFF
int pauseg=0; //enter_gui
int touch=-1; // gui mouse btn
//JOY
int al[2][2];//left analog1
int ar[2][2];//right analog1
unsigned char MXjoy[4]; // joy
#define JOYRANGE_UP_VALUE -16384 /* Joystick ranges in XY */
#define JOYRANGE_DOWN_VALUE 16383
#define JOYRANGE_LEFT_VALUE -16384
#define JOYRANGE_RIGHT_VALUE 16383
extern int a5200_joyhack;
extern int keyboard_type;
//MOUSE
extern int pushi; // gui mouse btn
int gmx,gmy; //gui mouse
int mouse_wu=0,mouse_wd=0;
//KEYBOARD
char Key_Sate[512];
char Key_Sate2[512];
static char old_Key_Sate[512];
int mbt[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//STATS GUI
int BOXDEC= 32+2;
int STAT_BASEY;
/*static*/ retro_input_state_t input_state_cb;
static retro_input_poll_t input_poll_cb;
extern void retro_audio_cb( short l, short r);
void retro_set_input_state(retro_input_state_t cb)
{
input_state_cb = cb;
}
void retro_set_input_poll(retro_input_poll_t cb)
{
input_poll_cb = cb;
}
int slowdown=0;
#if defined(ANDROID) || defined(__ANDROID__)
#define DEFAULT_PATH "/mnt/sdcard/"
#else
#ifdef PS3PORT
#define DEFAULT_PATH "/dev_hdd0/HOMEBREW/"
#else
#define DEFAULT_PATH "/"
#endif
#endif
#define RETRO_DEVICE_ATARI_KEYBOARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_KEYBOARD, 0)
#define RETRO_DEVICE_ATARI_JOYSTICK RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
void texture_uninit(void)
{
}
void texture_init(void)
{
memset(Retro_Screen, 0, sizeof(Retro_Screen));
memset(old_Key_Sate ,0, sizeof(old_Key_Sate));
gmx=(retrow/2)-1;
gmy=(retroh/2)-1;
}
int pushi=0; //mouse button
int keydown=0,keyup=0;
int KBMOD=-1;
int RSTOPON=-1;
int CTRLON=-1;
extern unsigned short int bmp[400*300];
extern unsigned atari_devices[ 4 ];
extern int UI_is_active;
extern int CURRENT_TV;
void retro_sound_update()
{
int x,stop=CURRENT_TV==312?885:742;//FIXME: 882/735?
if (! UI_is_active) {
Sound_Callback(SNDBUF, 1024*2*2);
for(x=0;x<stop*2;x+=2)
retro_audio_cb(SNDBUF[x],SNDBUF[x+2]);
}
}
extern void vkbd_key(int key,int pressed);
void vkbd_key(int key,int pressed){
//printf("key(%x)=%x shift:%d\n",key,pressed,SHIFTON);
if(pressed){
if(SHIFTON==1)
;
Key_Sate[key]=1;
// key is being held down
}
else {
if(SHIFTON==1)
;
Key_Sate[key]=0;
// key is being RELEASE
}
}
void retro_virtualkb(void)
{
// VKBD
int i;
// 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
static int oldi=-1;
static int vkx=0,vky=0;
if(oldi!=-1)
{
vkbd_key(oldi,0);
oldi=-1;
}
if(SHOWKEY==1)
{
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 )
vkflag[0]=1;
else if (vkflag[0]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP) )
{
vkflag[0]=0;
vky -= 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) && vkflag[1]==0 )
vkflag[1]=1;
else if (vkflag[1]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) )
{
vkflag[1]=0;
vky += 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) && vkflag[2]==0 )
vkflag[2]=1;
else if (vkflag[2]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) )
{
vkflag[2]=0;
vkx -= 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) && vkflag[3]==0 )
vkflag[3]=1;
else if (vkflag[3]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) )
{
vkflag[3]=0;
vkx += 1;
}
if(vkx<0)vkx=NPLGN-1;
if(vkx>NPLGN-1)vkx=0;
if(vky<0)vky=NLIGN-1;
if(vky>NLIGN-1)vky=0;
virtual_kdb(( char *)Retro_Screen,vkx,vky);
i=8;
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==0)
vkflag[4]=1;
else if( !input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==1)
{
vkflag[4]=0;
i=check_vkey2(vkx,vky);
if(i==-1){
oldi=-1;
}
if(i==-2)
{
NPAGE=-NPAGE;oldi=-1;
}
else if(i==-3)
{
//KDB bgcolor
KCOL=-KCOL;
oldi=-1;
}
else if(i==-4)
{
//VKbd show/hide
oldi=-1;
Screen_SetFullUpdate(0);
SHOWKEY=-SHOWKEY;
}
else if(i==-5)
{
oldi=-1;
}
else if(i==-6)
{
//Exit
//retro_deinit();
oldi=-1;
//SHUTDOWN
}
else if(i==-7)
{
oldi=-1;
}
else if(i==-8)
{
oldi=-1;
}
else
{
if(i==RETROK_LSHIFT) //SHIFT
{
SHIFTON=-SHIFTON;
oldi=-1;
}
else if(i==RETROK_LCTRL) //CTRL
{
CTRLON=-CTRLON;
oldi=-1;
}
else if(i==-12) //RSTOP
{
//(RETROK_ESCAPE);
RSTOPON=-RSTOPON;
oldi=-1;
}
else if(i==-13) //GUI
{
SHOWKEY=-SHOWKEY;
oldi=-1;
}
else if(i==-14) //JOY PORT TOGGLE
{
SHOWKEY=-SHOWKEY;
oldi=-1;
}
else
{
oldi=i;
vkbd_key(oldi,1);
}
}
}
}
}
void Screen_SetFullUpdate(int scr)
{
if(scr==0 ||scr>1)memset(Retro_Screen, 0, sizeof(Retro_Screen));
}
void Process_key()
{
int i;
if(keyboard_type==1)return;
for(i=0;i<320;i++)
Key_Sate[i]=input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0,i) ? 0x80: 0;
if(memcmp( Key_Sate,old_Key_Sate , sizeof(Key_Sate) ) )
for(i=0;i<320;i++)
if(Key_Sate[i] && Key_Sate[i]!=old_Key_Sate[i] )
{
/*
if(i==RETROK_F12){
continue;
}
*/
if(i==RETROK_RCTRL){
CTRLON=-CTRLON;
printf("Modifier crtl pressed %d \n",CTRLON);
continue;
}
if(i==RETROK_RSHIFT){
SHIFTON=-SHIFTON;
printf("Modifier shift pressed %d \n",SHIFTON);
continue;
}
if(i==RETROK_LALT){
KBMOD=-KBMOD;
printf("Modifier alt pressed %d \n",KBMOD);
continue;
}
//printf("press: %d \n",i);
//retro_key_down(i);
}
else if ( !Key_Sate[i] && Key_Sate[i]!=old_Key_Sate[i] )
{
/*
if(i==RETROK_F12){
continue;
}
*/
if(i==RETROK_RCTRL){
CTRLON=-CTRLON;
printf("Modifier crtl released %d \n",CTRLON);
continue;
}
if(i==RETROK_RSHIFT){
SHIFTON=-SHIFTON;
printf("Modifier shift released %d \n",SHIFTON);
continue;
}
if(i==RETROK_LALT){
KBMOD=-KBMOD;
printf("Modifier alt released %d \n",KBMOD);
continue;
}
//printf("release: %d \n",i);
//retro_key_up(i);
}
memcpy(old_Key_Sate,Key_Sate , sizeof(Key_Sate) );
}
int Retro_PollEvent()
{
// 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
int SAVPAS=PAS;
int i,j;
static int vbt[4][16]={
{0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0},
};
input_poll_cb();
int mouse_l;
int mouse_r;
int16_t mouse_x,mouse_y;
mouse_x=mouse_y=0;
if(SHOWKEY==-1 && pauseg==0)Process_key();
//Joy mode
for(j=0;j<4;j++){
for(i=4;i<10;i++)
{
if( input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, i)) {
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
}
}
if(a5200_joyhack) //hack for robotron right analog act as Joy1
{
//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][1] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y));
int x=ar[0][0];
int y=ar[0][1];
/* Directions */
if (ar[0][1] <= JOYRANGE_UP_VALUE)
MXjoy[1] |= 0x01;
else if (ar[0][1] >= JOYRANGE_DOWN_VALUE)
MXjoy[1] |= 0x02;
if (ar[0][0] <= JOYRANGE_LEFT_VALUE)
MXjoy[1] |= 0x04;
else if (ar[0][0] >= JOYRANGE_RIGHT_VALUE)
MXjoy[1] |= 0x08;
}
if(atari_devices[0]==RETRO_DEVICE_ATARI_JOYSTICK){
//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;
}
}
}//if atari_devices=joy
if(MOUSE_EMULATED==1){
if(slowdown>0)return 1;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 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 (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 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;
mouse_l=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A);
mouse_r=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B);
PAS=SAVPAS;
slowdown=1;
}
else {
//printf("-----------------%d \n",pauseg);
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);
//if(mouse_wu || mouse_wd)printf("-----------------MOUSE UP:%d DOWN:%d\n",mouse_wu, mouse_wd);
mouse_x = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
mouse_y = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
mouse_l = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT);
mouse_r = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT);
}
static int mmbL=0,mmbR=0;
if(mmbL==0 && mouse_l){
mmbL=1;
pushi=1;
touch=1;
}
else if(mmbL==1 && !mouse_l) {
mmbL=0;
pushi=0;
touch=-1;
}
if(mmbR==0 && mouse_r){
mmbR=1;
}
else if(mmbR==1 && !mouse_r) {
mmbR=0;
}
gmx+=mouse_x;
gmy+=mouse_y;
if(gmx<0)gmx=0;
if(gmx>retrow-1)gmx=retrow-1;
if(gmy<0)gmy=0;
if(gmy>retroh-1)gmy=retroh-1;
if(SHOWKEY==1 && pauseg==0)retro_virtualkb();
return 1;
}