#include "libretro.h" #include "libretro-core.h" #include "retroscreen.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"; //TIME #ifdef __CELLOS_LV2__ #include "sys/sys_time.h" #include "sys/timer.h" #define usleep sys_timer_usleep #else #include #include #include #endif 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; 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; } long GetTicks(void) { // in MSec #ifndef _ANDROID_ #ifdef __CELLOS_LV2__ //#warning "GetTick PS3\n" unsigned long ticks_micro; uint64_t secs; uint64_t nsecs; sys_time_get_current_time(&secs, &nsecs); ticks_micro = secs * 1000000UL + (nsecs / 1000); return ticks_micro;///1000; #else struct timeval tv; gettimeofday (&tv, NULL); return (tv.tv_sec*1000000 + tv.tv_usec);///1000; #endif #else struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); return (now.tv_sec*1000000 + now.tv_nsec/1000);///1000; #endif } 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;xNPLGN-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; }