diff --git a/libretro/core-mapper.c b/libretro/core-mapper.c index a0e5fcc..5f1dfbb 100644 --- a/libretro/core-mapper.c +++ b/libretro/core-mapper.c @@ -196,12 +196,12 @@ extern int UI_is_active; void retro_sound_update() { - int x,silent=POKEYSND_enable_new_pokey?24449:32768; + int x;//silent=POKEYSND_enable_new_pokey?24449:32768; if (! UI_is_active) { - POKEYSND_Process(SNDBUF,snd_sampler_pal*2); - for(x=0;x +#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 MAXPAS=6,SHIFTON=-1,MOUSEMODE=-1,PAS=4; +int SND=1; //SOUND ON/OFF +static int firstps=0; +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[2]; // joy +int NUMjoy=1; +int NUMDRV=1; + +//MOUSE +extern int pushi; // gui mouse btn +int gmx,gmy; //gui mouse +int c64mouse_enable=0; +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; + +void gui_poll_events(void) +{ + Ktime = GetTicks(); + + if(Ktime - LastFPSTime >= 1000/50) + { + slowdown=0; + frame++; + LastFPSTime = Ktime; + + co_switch(mainThread); + + } +} + +void retro_mouse(int a,int b) {} +void retro_mouse_but0(int a) {} +void retro_mouse_but1(int a) {} +void enter_options(void) {} + +#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 + +int STATUTON=-1; +#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 bitstart=0; +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[ 2 ]; + +#include "pokeysnd.h" +extern int UI_is_active; + +void retro_sound_update() +{ + int x,silent=POKEYSND_enable_new_pokey?24449:32768; + + if (! UI_is_active) { + POKEYSND_Process(SNDBUF,snd_sampler_pal*4); + for(x=0;x> 4] &= ~bit_values2[0x25 & 7]; // key needs to be SHIFTed + + //keyboard_matrix[(unsigned char)key >> 4] &= ~bit_values2[(unsigned char)key & 7]; // key is being held down + + } + else { + if(SHIFTON==1) + ;//keyboard_matrix[0x25 >> 4] |= bit_values2[0x25 & 7]; // make sure key is unSHIFTed + + //keyboard_matrix[(unsigned char)key >> 4] |= bit_values2[(unsigned char)key & 7]; + + } + +} + +void retro_key_down(int key) +{ + int code; +/* + if(key<512) + code=KeySymToCPCKey[key]; + else code = CPC_KEY_NULL; + CPC_SetKey(code); +*/ +} + +void retro_key_up(int key) +{ + int code; +/* + if(key<512) + code=KeySymToCPCKey[key]; + else code = CPC_KEY_NULL; + CPC_ClearKey(code); +*/ +} + +static int joy0_flag[6]={0,0,0,0,0,0}; + //0x01,0x02,0x04,0x08,0x80 0x40 + // UP DWN LEFT RGT BTN0 BTN1 + // 0 1 2 3 4 5 +void retro_joy0_test(unsigned char joy0) +{ + + if(joy0&0x01 && joy0_flag[0]==0 ){ + //keyboard_matrix[(unsigned char)0x90 >> 4] &= ~bit_values2[(unsigned char)0x90 & 7]; + joy0_flag[0]=1; + } + else if(joy0_flag[0]){ + //keyboard_matrix[(unsigned char)0x90 >> 4] |= bit_values2[(unsigned char)0x90 & 7]; + joy0_flag[0]=0; + } + + if(joy0&0x02 && joy0_flag[1]==0 ){ + //keyboard_matrix[(unsigned char)0x91 >> 4] &= ~bit_values2[(unsigned char)0x91 & 7]; + joy0_flag[1]=1; + } + else if(joy0_flag[1]){ + //keyboard_matrix[(unsigned char)0x91 >> 4] |= bit_values2[(unsigned char)0x91 & 7]; + joy0_flag[1]=0; + } + + if(joy0&0x04 && joy0_flag[2]==0 ){ + //keyboard_matrix[(unsigned char)0x92 >> 4] &= ~bit_values2[(unsigned char)0x92 & 7]; + joy0_flag[2]=1; + } + else if(joy0_flag[2]){ + //keyboard_matrix[(unsigned char)0x92 >> 4] |= bit_values2[(unsigned char)0x92 & 7]; + joy0_flag[2]=0; + } + + if(joy0&0x08 && joy0_flag[3]==0 ){ + //keyboard_matrix[(unsigned char)0x93 >> 4] &= ~bit_values2[(unsigned char)0x93 & 7]; + joy0_flag[3]=1; + } + else if(joy0_flag[3]){ + //keyboard_matrix[(unsigned char)0x93 >> 4] |= bit_values2[(unsigned char)0x93 & 7]; + joy0_flag[3]=0; + } + + if(joy0&0x40 && joy0_flag[5]==0 ){ + //keyboard_matrix[(unsigned char)0x95 >> 4] &= ~bit_values2[(unsigned char)0x95 & 7]; + joy0_flag[5]=1; + } + else if(joy0_flag[5]){ + //keyboard_matrix[(unsigned char)0x95 >> 4] |= bit_values2[(unsigned char)0x95 & 7]; + joy0_flag[5]=0; + } + + if(joy0&0x80 && joy0_flag[4]==0 ){ + //keyboard_matrix[(unsigned char)0x94 >> 4] &= ~bit_values2[(unsigned char)0x94 & 7]; + joy0_flag[4]=1; + } + else if(joy0_flag[4]){ + //keyboard_matrix[(unsigned char)0x94 >> 4] |= bit_values2[(unsigned char)0x94 & 7]; + joy0_flag[4]=0; + } + +} + + +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) + { + //retro_key_up(oldi); + 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) + { + //FLIP DSK PORT 1-2 + NUMDRV=-NUMDRV; + oldi=-1; + } + else if(i==-6) + { + //Exit + retro_deinit(); + oldi=-1; + exit(0); + } + else if(i==-7) + { + //SNA SAVE + // snapshot_save (RPATH); + oldi=-1; + } + else if(i==-8) + { + //PLAY TAPE + // play_tape(); + oldi=-1; + } + + else + { + + if(i==0x25 /*i==-10*/) //SHIFT + { +// if(SHIFTON == 1)retro_key_up(RETROK_RSHIFT); +// else retro_key_down(RETROK_LSHIFT); + SHIFTON=-SHIFTON; + + oldi=-1; + } + else if(i==0x27/*i==-11*/) //CTRL + { +// if(CTRLON == 1)retro_key_up(RETROK_LCTRL); +/// else retro_key_down(RETROK_LCTRL); + CTRLON=-CTRLON; + + oldi=-1; + } + else if(i==-12) //RSTOP + { +// if(RSTOPON == 1)retro_key_up(RETROK_ESCAPE); +// else retro_key_down(RETROK_ESCAPE); + RSTOPON=-RSTOPON; + + oldi=-1; + } + else if(i==-13) //GUI + { + // pauseg=1; + + SHOWKEY=-SHOWKEY; + Screen_SetFullUpdate(0); + oldi=-1; + } + else if(i==-14) //JOY PORT TOGGLE + { + //cur joy toggle + //cur_port++;if(cur_port>2)cur_port=1; + SHOWKEY=-SHOWKEY; + oldi=-1; + } + else + { + oldi=i; + //retro_key_down(oldi); + vkbd_key(oldi,1); + } + + } + } + + } + + +} + +void Screen_SetFullUpdate(int scr) +{ + if(scr==0 ||scr>1)memset(Retro_Screen, 0, sizeof(Retro_Screen)); + // if(scr>0)memset(bmp,0,sizeof(bmp)); +} + +void Process_key() +{ + int i; + + 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){ + //play_tape(); + continue; + } +/* + if(i==RETROK_RCTRL){ + //CTRLON=-CTRLON; + printf("Modifier crtl pressed %d \n",CTRLON); + continue; + } + if(i==RETROK_RSHIFT){ + //SHITFON=-SHITFON; + 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){ + //kbd_buf_feed("|tape\nrun\"\n^"); + 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) ); + +} +/* +void Print_Statut(void) +{ + DrawFBoxBmp(bmp,0,CROP_HEIGHT,CROP_WIDTH,STAT_YSZ,RGB565(0,0,0)); + + Draw_text(bmp,STAT_DECX+40 ,STAT_BASEY,0xffff,0x8080,1,2,40,(SND>0?"SND":"")); + Draw_text(bmp,STAT_DECX+80 ,STAT_BASEY,0xffff,0x8080,1,2,40,"F:%d",dwFPS); + Draw_text(bmp,STAT_DECX+120,STAT_BASEY,0xffff,0x8080,1,2,40,"DSK%c",NUMDRV>0?'A':'B'); + if(ZOOM>-1) + Draw_text(bmp,(384-Mres[ZOOM].x)/2,(272-Mres[ZOOM].y)/2,0xffff,0x8080,1,2,40,"x:%3d y:%3d",Mres[ZOOM].x,Mres[ZOOM].y); +} +*/ + + +/* +In joy mode +L3 GUI LOAD +R3 GUI SNAP +L2 STATUS ON/OFF +R2 AUTOLOAD TAPE +L CAT +R RESET +SEL MOUSE/JOY IN GUI +STR ENTER/RETURN +A FIRE1/VKBD KEY +B RUN +X FIRE2 +Y VKBD ON/OFF +In Keayboard mode +F8 LOAD DSK/TAPE +F9 MEM SNAPSHOT LOAD/SAVE +F10 MAIN GUI +F12 PLAY TAPE +*/ + +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; + static int vbt[16]={0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0}; + //MXjoy[0]=0; + + 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(); + + +if(pauseg==0){ // if emulation running + + //Joy mode + + for(i=4;i<10;i++) + { + if( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i)) + MXjoy[0] |= vbt[i]; // Joy press + else if( MXjoy[0]&vbt[i])MXjoy[0] &= ~vbt[i]; // Joy press + } + + if(SHOWKEY==-1)retro_joy0_test(MXjoy[0]); + + +if(atari_devices[0]==RETRO_DEVICE_ATARI_JOYSTICK){ + //shortcut for joy mode only + + i=1;//show vkbd toggle + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ) + { + mbt[i]=0; + SHOWKEY=-SHOWKEY; + } + + i=3;//type ENTER + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ) + { + mbt[i]=0; + // kbd_buf_feed("\n"); + } + +/* + i=10;//type DEL / ZOOM + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + ZOOM++;if(ZOOM>4)ZOOM=-1; + + } +*/ + + i=0;//type RUN" + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + // kbd_buf_feed("RUN\""); + } + + i=10;//Type CAT\n + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + // kbd_buf_feed("CAT\n"); + //Screen_SetFullUpdate(); + } + + i=12;//show/hide statut + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + STATUTON=-STATUTON; + // Screen_SetFullUpdate(); + } + + i=13;//auto load tape + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + // kbd_buf_feed("|tape\nrun\"\n^"); + } + + i=11;//reset + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + //emu_reset(); + } + + i=2;//mouse/joy toggle + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + MOUSE_EMULATED=-MOUSE_EMULATED; + } + + // L3 -> gui load + if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 14)){ + + } + // R3 -> gui snapshot + if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 15)){ + + } + +}//if atari_devices=joy + + +}// if pauseg=0 +else{ + // if in gui + + i=2;//mouse/joy toggle + if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 ) + mbt[i]=1; + else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){ + mbt[i]=0; + MOUSE_EMULATED=-MOUSE_EMULATED; + } + +} + + 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; + } + +if(pauseg==0 && c64mouse_enable){ +/* + mouse_move((int)mouse_x, (int)mouse_y); + mouse_button(0,mmbL); + mouse_button(1,mmbR); +*/ +} + + 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 && pauseg==0)retro_virtualkb(); + +return 1; + +} + diff --git a/libretro/platform.c b/libretro/platform.c index dcd8629..f3c1c39 100644 --- a/libretro/platform.c +++ b/libretro/platform.c @@ -61,7 +61,7 @@ int skel_main(int argc, char **argv) printf("Failed to initialise!\n"); return 3; } - + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, 44100, 2, 0); retro_sound_finalized=1; printf("First retrun to main thread!\n"); diff --git a/libretro/platform.c~ b/libretro/platform.c~ new file mode 100644 index 0000000..df3939c --- /dev/null +++ b/libretro/platform.c~ @@ -0,0 +1,402 @@ +/* + * platform.c - platform interface implementation for libretro + * + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +/* Atari800 includes */ +#include "atari.h" +#include "input.h" +#include "log.h" +#include "monitor.h" +#include "platform.h" +#include "sound.h" +#include "videomode.h" +#include "cpu.h" +#include "devices.h" +#include "akey.h" +#include "pokeysnd.h" +#include "sound.h" +#include "screen.h" +#include "colours.h" + +extern char Key_Sate[512]; + +#include "libretro-core.h" +#include "libretro.h" +#include "retroscreen.h" + +extern int UI_is_active; + +static int swap_joysticks = FALSE; +int PLATFORM_kbd_joy_0_enabled = TRUE; /* enabled by default, doesn't hurt */ +int PLATFORM_kbd_joy_1_enabled = FALSE; /* disabled, would steal normal keys */ +extern unsigned char MXjoy[2]; // joy +extern int mbt[16]; +extern int retro_sound_finalized; + +static UWORD *palette = NULL; + +int skel_main(int argc, char **argv) +{ + + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)){ + printf("Failed to initialise!\n"); + return 3; + } + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, 44100, 1, 0); + retro_sound_finalized=1; + + printf("First retrun to main thread!\n"); + co_switch(mainThread); + + /* main loop */ + for (;;) { + INPUT_key_code = PLATFORM_Keyboard(); + //SDL_INPUT_Mouse(); + Atari800_Frame(); + if (Atari800_display_screen) + PLATFORM_DisplayScreen(); + + } +} + + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ + + Log_print("Core init"); + + retro_InitGraphics(); + + Devices_enable_h_patch = FALSE; + INPUT_direct_mouse = TRUE; + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + if (CPU_cim_encountered) { + Log_print("CIM encountered"); + return TRUE; + } + + Log_print("Core_exit"); + + retro_ExitGraphics(); + + return FALSE; +} + +int PLATFORM_Keyboard(void) +{ + + /* OPTION / SELECT / START keys */ + INPUT_key_consol = INPUT_CONSOL_NONE; + if (Key_Sate[RETROK_F2]) + INPUT_key_consol &= (~INPUT_CONSOL_OPTION); + if (Key_Sate[RETROK_F3]) + INPUT_key_consol &= (~INPUT_CONSOL_SELECT); + if (Key_Sate[RETROK_F4]) + INPUT_key_consol &= (~INPUT_CONSOL_START); + + /* FIXME handle all keys */ + if (Key_Sate[RETROK_SPACE]) + return AKEY_SPACE; + if (Key_Sate[RETROK_F1]) + return AKEY_UI; + + if (Key_Sate[RETROK_LEFT])return AKEY_LEFT; + if (Key_Sate[RETROK_RIGHT])return AKEY_RIGHT; + if (Key_Sate[RETROK_UP])return AKEY_UP; + if (Key_Sate[RETROK_DOWN])return AKEY_DOWN; + if (Key_Sate[RETROK_RETURN])return AKEY_RETURN; + if (Key_Sate[RETROK_ESCAPE])return AKEY_ESCAPE; + + /* FIXME joy bind */ + if (mbt[RETRO_DEVICE_ID_JOYPAD_SELECT]) + INPUT_key_consol &= (~INPUT_CONSOL_SELECT); + if (mbt[RETRO_DEVICE_ID_JOYPAD_START]) + INPUT_key_consol &= (~INPUT_CONSOL_START); + if (mbt[RETRO_DEVICE_ID_JOYPAD_L]) + INPUT_key_consol &= (~INPUT_CONSOL_OPTION); + if (mbt[RETRO_DEVICE_ID_JOYPAD_R]) + return AKEY_UI; + if (mbt[RETRO_DEVICE_ID_JOYPAD_L2]) + return AKEY_SPACE; + if (mbt[RETRO_DEVICE_ID_JOYPAD_R2]) + return AKEY_ESCAPE; + if (mbt[RETRO_DEVICE_ID_JOYPAD_B]) + return AKEY_RETURN; + + if (UI_is_active){ + // whitout kbd in GUI + if (MXjoy[0]&0x04) + return AKEY_LEFT; + if (MXjoy[0]&0x08) + return AKEY_RIGHT; + if (MXjoy[0]&0x01) + return AKEY_UP; + if (MXjoy[0]&0x02) + return AKEY_DOWN; + if (MXjoy[0]&0x80) + return AKEY_RETURN; + if (MXjoy[0]&0x40) + return AKEY_ESCAPE; + } + + return AKEY_NONE; + +} + +/* +int PLATFORM_GetRawKey(void) +{ + + input_poll_cb(); + + for(i=0;i<320;i++) + Key_Sate[i]=input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0,i) ? 0x80: 0; + +} +*/ + +void PLATFORM_DisplayScreen(void) +{ + retro_Render(); +} + +double PLATFORM_Time(void) +{ + return GetTicks()/1000 ;//* 1e-3; +} + +void PLATFORM_PaletteUpdate(void) +{ + retro_PaletteUpdate(); +} + +static void get_platform_PORT(unsigned char *s0, unsigned char *s1) +{ + int stick0, stick1; + stick0 = stick1 = INPUT_STICK_CENTRE; + + if (PLATFORM_kbd_joy_0_enabled) { + if (MXjoy[0]&0x04) + stick0 &= INPUT_STICK_LEFT; + if (MXjoy[0]&0x08) + stick0 &= INPUT_STICK_RIGHT; + if (MXjoy[0]&0x01) + stick0 &= INPUT_STICK_FORWARD; + if (MXjoy[0]&0x02) + stick0 &= INPUT_STICK_BACK; + } + if (PLATFORM_kbd_joy_1_enabled) { + if (MXjoy[1]&0x04) + stick1 &= INPUT_STICK_LEFT; + if (MXjoy[1]&0x08) + stick1 &= INPUT_STICK_RIGHT; + if (MXjoy[1]&0x01) + stick1 &= INPUT_STICK_FORWARD; + if (MXjoy[1]&0x02) + stick1 &= INPUT_STICK_BACK; + } + + if (swap_joysticks) { + *s1 = stick0; + *s0 = stick1; + } + else { + *s0 = stick0; + *s1 = stick1; + } + + } + +static void get_platform_TRIG(unsigned char *t0, unsigned char *t1) +{ + int trig0, trig1; + trig0 = trig1 = 1; + + if (PLATFORM_kbd_joy_0_enabled) { + trig0 = MXjoy[0]&0x80?0:1; + } + + if (PLATFORM_kbd_joy_1_enabled) { + trig1 = MXjoy[1]&0x80?0:1; + } + + if (swap_joysticks) { + *t1 = trig0; + *t0 = trig1; + } + else { + *t0 = trig0; + *t1 = trig1; + } + +} + +int PLATFORM_PORT(int num) +{ + if (num == 0) { + UBYTE a, b; + get_platform_PORT(&a, &b); + + return (b << 4) | (a & 0x0f); + } + + return 0xff; +} + +int PLATFORM_TRIG(int num) +{ + UBYTE a, b; + get_platform_TRIG(&a, &b); + + switch (num) { + case 0: + return a; + case 1: + return b; + default: + break; + } + + return 0x01; +} + + +///////////////////////////////////////////////////////////// +// SOUND +///////////////////////////////////////////////////////////// + + +int PLATFORM_SoundSetup(Sound_setup_t *setup) +{ + //force 16 bit stereo sound at 44100 + setup->freq=44100; + setup->sample_size=2; + setup->channels=2; + setup->buffer_ms=20; + + return TRUE; +} + +void PLATFORM_SoundExit(void) +{ + +} + +void PLATFORM_SoundPause(void) +{ + +} + +void PLATFORM_SoundContinue(void) +{ + +} + +void PLATFORM_SoundLock(void) +{ + +} + +void PLATFORM_SoundUnlock(void) +{ + +} + +///////////////////////////////////////////////////////////// +// VIDEO +///////////////////////////////////////////////////////////// + + +void retro_PaletteUpdate(void) +{ + int i; + + if (!palette) { + if ( !(palette = malloc(256 * sizeof(UWORD))) ) { + Log_print("Cannot allocate memory for palette conversion."); + return; + } + } + memset(palette, 0, 256 * sizeof(UWORD)); + + for (i = 0; i < 256; i++){ + + palette[i] = ((Colours_table[i] & 0x00f80000) >> 8) | + ((Colours_table[i] & 0x0000fc00) >> 5) | + ((Colours_table[i] & 0x000000f8) >> 3); + + } + + /* force full redraw */ + Screen_EntireDirty(); +} + +int retro_InitGraphics(void) +{ + + /* Initialize palette */ + retro_PaletteUpdate(); + + return TRUE; +} + +void retro_Render(void) +{ + int x, y; + UBYTE *src, *src_line; + UWORD *dst, *dst_line; + + src_line = ((UBYTE *) Screen_atari) + 24; + dst_line = Retro_Screen; + + for (y = 0; y < 240; y++) { + + src = src_line; + dst = dst_line; + + for (x = 0; x < 336; x += 8) { + + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + } + + src_line += 384; + dst_line += 336; + } +} + + +void retro_ExitGraphics(void) +{ + + if (palette) + free(palette); + palette = NULL; +} +