int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShowCmd)
{
	ReserveBottomMemory();

	tick_thd.Start();

	int argc=0;
	wchar* cmd_line=GetCommandLineA();
	wchar** argv=CommandLineToArgvA(cmd_line,&argc);
	if(strstr(cmd_line,"NoConsole")==0)
	{
		if (AllocConsole())
		{
			freopen("CON","w",stdout);
			freopen("CON","w",stderr);
			freopen("CON","r",stdin);
		}
		SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
	}

	SetupPath();

	//SetUnhandledExceptionFilter(&ExeptionHandler);
	__try
	{
		int dc_init(int argc,wchar* argv[]);
		void dc_run();
		void dc_term();
		dc_init(argc,argv);

		#ifdef _WIN64
				setup_seh();
		#endif

		dc_run();
		dc_term();
	}
	__except( ExeptionHandler(GetExceptionInformation()) )
	{
		printf("Unhandled exception - Emulation thread halted...\n");
	}
	SetUnhandledExceptionFilter(0);

	return 0;
}
Exemple #2
0
void input_sdl_handle(u32 port)
{
	static int keys[13];
	static int mouse_use = 0;
	SDL_Event event;
	int k, value;
	int xx, yy;
	const char *num_mode[] = {"Off", "Up/Down => RT/LT", "Left/Right => LT/RT", "U/D/L/R => A/B/X/Y"};
	while (SDL_PollEvent(&event))
	{
		switch (event.type)
		{
			case SDL_QUIT:
							 die("death by SDL request");
							 break;
			case SDL_KEYDOWN:
			case SDL_KEYUP:
				k = event.key.keysym.sym;
				value = (event.type == SDL_KEYDOWN) ? 1 : 0;
				 //printf("type %i key %i \n", event.type, k);
				switch (k) {
					//TODO: Better keymaps for non-pandora platforms
					case SDLK_SPACE:    keys[0] = value; break;
					case SDLK_UP:       keys[1] = value; break;
					case SDLK_DOWN:     keys[2] = value; break;
					case SDLK_LEFT:     keys[3] = value; break;
					case SDLK_RIGHT:    keys[4] = value; break;
					case SDLK_PAGEUP:   keys[5] = value; break;
					case SDLK_PAGEDOWN: keys[6] = value; break;
					case SDLK_END:      keys[7] = value; break;
					case SDLK_HOME:     keys[8] = value; break;
					case SDLK_MENU:
					case SDLK_ESCAPE:   keys[9]  = value; break;
					case SDLK_RSHIFT:   keys[11] = value; break;
					case SDLK_RCTRL:    keys[10] = value; break;
					case SDLK_LALT:     keys[12] = value; break;
					case SDLK_k:        KillTex = true; break;
				#if defined(TARGET_PANDORA)
					case SDLK_n:
						if (value)
						{
							mouse_use = (mouse_use + 1) % 4;
							snprintf(OSD_Info, 128, "Right Nub mode: %s\n", num_mode[mouse_use]);
							OSD_Delay=300;
						}
						break;  
					case SDLK_s:
						if (value)
						{
							settings.aica.NoSound = !settings.aica.NoSound;
							snprintf(OSD_Info, 128, "Sound %s\n", (settings.aica.NoSound) ? "Off" : "On");
							OSD_Delay=300;
						}
						break;
					case SDLK_f:
						if (value)
						{
							FrameSkipping = !FrameSkipping;
							snprintf(OSD_Info, 128, "FrameSkipping %s\n", (FrameSkipping) ? "On" : "Off");
							OSD_Delay = 300;
						}
						break;  
					case SDLK_c:
						if (value)
						{
							OSD_Counter = 1 - OSD_Counter;
						}
						break;
				#endif
				}
				break;
			case SDL_JOYBUTTONDOWN:
			case SDL_JOYBUTTONUP:
				value = (event.type == SDL_JOYBUTTONDOWN) ? 1 : 0;
				k = event.jbutton.button;
				{
					u32 mt = sdl_map_btn[k] >> 16;
					u32 mo = sdl_map_btn[k] & 0xFFFF;
					
					// printf("BUTTON %d,%d\n",JE.number,JE.value);
					
					if (mt == 0)
					{
						// printf("Mapped to %d\n",mo);
						if (value)
						kcode[port] &= ~mo;
						else
						kcode[port] |= mo;
					}
					else if (mt == 1)
					{
						// printf("Mapped to %d %d\n",mo,JE.value?255:0);
						if (mo == 0)
						{
							lt[port] = value ? 255 : 0;
						}
						else if (mo == 1)
						{
							rt[port] = value ? 255 : 0;
						}
					}
					
				}
				break;
			case SDL_JOYAXISMOTION:
				k = event.jaxis.axis;
				value = event.jaxis.value;
				{
					u32 mt = sdl_map_axis[k] >> 16;
					u32 mo = sdl_map_axis[k] & 0xFFFF;
					
					//printf("AXIS %d,%d\n",JE.number,JE.value);
					s8 v=(s8)(value/256); //-127 ... + 127 range
					#ifdef TARGET_PANDORA
						v = JSensitivity[128+v];
					#endif
					
					if (mt == 0)
					{
						kcode[port] |= mo;
						kcode[port] |= mo*2;
						if (v < -64)
						{
							kcode[port] &= ~mo;
						}
						else if (v > 64)
						{
							kcode[port] &= ~(mo*2);
						}
						
						// printf("Mapped to %d %d %d\n",mo,kcode[port]&mo,kcode[port]&(mo*2));
					}
					else if (mt == 1)
					{
						if (v >= 0) v++;  //up to 255
						
						//   printf("AXIS %d,%d Mapped to %d %d %d\n",JE.number,JE.value,mo,v,v+127);
						
						if (mo == 0)
						{
							lt[port] = v + 127;
						}
						else if (mo == 1)
						{
							rt[port] = v + 127;
						}
					}
					else if (mt == 2)
					{
						//  printf("AXIS %d,%d Mapped to %d %d [%d]",JE.number,JE.value,mo,v);
						if (mo == 0)
						{
							joyx[port] = v;
						}
						else if (mo==1)
						{
							joyy[port] = v;
						}
					}
				}
				break;
			case SDL_MOUSEMOTION:
					xx = event.motion.xrel;
					yy = event.motion.yrel;
					
					// some caping and dead zone...
					if (abs(xx) < 4)
					{
						xx = 0;
					}
					if (abs(yy) < 4)
					{
						yy = 0;
					}
					
					xx = xx * 255 / 20;
					yy = yy * 255 / 20;
					
					if (xx > 255)
					{
						xx = 255;
					}
					else if (xx<-255)
					{
						xx = -255;
					}
					
					if (yy > 255)
					{
						yy = 255;
					}
					else if (yy<-255)
					{
						yy = -255;
					}
					
					//if (abs(xx)>0 || abs(yy)>0) printf("mouse %i, %i\n", xx, yy);
					switch (mouse_use)
					{
						case 0:  // nothing
							break;
						case 1:  // Up=RT, Down=LT
							if (yy<0)
							{
								rt[port] = -yy;
							}
							else if (yy>0)
							{
								lt[port] = yy;
							}
							break;
						case 2:  // Left=LT, Right=RT
							if (xx < 0)
							{
								lt[port] = -xx;
							}
							else if (xx > 0)
							{
								rt[port] = xx;
							}
							break;
						case 3:  // Nub = ABXY
							if (xx < -127)
							{
								kcode[port] &= ~DC_BTN_X;
							}
							else if (xx > 127)
							{
								kcode[port] &= ~DC_BTN_B;
							}
							if (yy < -127)
							{
								kcode[port] &= ~DC_BTN_Y;
							}
							else if (yy > 127)
							{
								kcode[port] &= ~DC_BTN_A;
							}
							break;
					}
				break;
		}
	}
			
	if (keys[0]) { kcode[port] &= ~DC_BTN_C; }
	if (keys[6]) { kcode[port] &= ~DC_BTN_A; }
	if (keys[7]) { kcode[port] &= ~DC_BTN_B; }
	if (keys[5]) { kcode[port] &= ~DC_BTN_Y; }
	if (keys[8]) { kcode[port] &= ~DC_BTN_X; }
	if (keys[1]) { kcode[port] &= ~DC_DPAD_UP; }
	if (keys[2]) { kcode[port] &= ~DC_DPAD_DOWN; }
	if (keys[3]) { kcode[port] &= ~DC_DPAD_LEFT; }
	if (keys[4]) { kcode[port] &= ~DC_DPAD_RIGHT; }
	if (keys[12]){ kcode[port] &= ~DC_BTN_START; }
	if (keys[9])
	{ 
		dc_term();
	
		// is there a proper way to exit? dc_term() doesn't end the dc_run() loop it seems
		die("death by escape key"); 
	} 
	if (keys[10])
	{
		rt[port] = 255;
	}
	if (keys[11])
	{
		lt[port] = 255;
	}
}
Exemple #3
0
JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_stop(JNIEnv *env,jobject obj)
{
	dc_term();
}
bool HandleEvents(u32 port) {
	static int keys[13];
	static int mouse_use = 0;
	SDL_Event event;
	int k, value;
	int xx, yy;
	char *num_mode[] = {"Off", "Up/Down => RT/LT", "Left/Right => LT/RT", "U/D/L/R => A/B/X/Y"};
	while (SDL_PollEvent(&event)) {
		switch (event.type) {
			case SDL_QUIT:
							 die("death by SDL request");
							 break;
			case SDL_KEYDOWN:
			case SDL_KEYUP:
				k = event.key.keysym.sym;
				value = (event.type==SDL_KEYDOWN)?1:0;
				 //printf("type %i key %i \n", event.type, k);
				switch (k) {				
					case SDLK_SPACE: 	keys[0]=value; break;
					case SDLK_UP:		keys[1]=value; break;
					case SDLK_DOWN:		keys[2]=value; break;
					case SDLK_LEFT:		keys[3]=value; break;
					case SDLK_RIGHT:	keys[4]=value; break;
					case SDLK_PAGEUP:	keys[5]=value; break;
					case SDLK_PAGEDOWN:	keys[6]=value; break;
					case SDLK_END:		keys[7]=value; break;
					case SDLK_HOME:		keys[8]=value; break;
					case SDLK_MENU:
					case SDLK_ESCAPE:	keys[9]=value; break;
					case SDLK_RSHIFT:	keys[11]=value; break;
					case SDLK_RCTRL:	keys[10]=value; break;
					case SDLK_LALT:		keys[12]=value; break;
					case SDLK_k:		break;
					case SDLK_n:    if (value) {mouse_use=(mouse_use+1)%4; /*snprintf(OSD_Info, 128, "Right Nub mode: %s\n", num_mode[mouse_use]); OSD_Delay=300;*/}; break;  
					case SDLK_s:        if (value) {settings.aica.NoSound=!settings.aica.NoSound; /*snprintf(OSD_Info, 128, "Sound %s\n", (settings.aica.NoSound)?"Off":"On"); OSD_Delay=300;*/};break;
					case SDLK_c:    if (value) {/*OSD_Counter=1-OSD_Counter;*/};break;
				}
				break;
			case SDL_JOYBUTTONDOWN:
			case SDL_JOYBUTTONUP:
				value = (event.type==SDL_JOYBUTTONDOWN)?1:0;
				k = event.jbutton.button;
				{
					u32 mt=JMapBtn[k]>>16;
					u32 mo=JMapBtn[k]&0xFFFF;
					
					// printf("BUTTON %d,%d\n",JE.number,JE.value);
					
					if (mt==0)
					{
						// printf("Mapped to %d\n",mo);
						if (value)
						kcode[port]&=~mo;
						else
						kcode[port]|=mo;
					}
					else if (mt==1)
					{
						// printf("Mapped to %d %d\n",mo,JE.value?255:0);
						if (mo==0)
						lt[port]=value?255:0;
						else if (mo==1)
						rt[port]=value?255:0;
					}
					
				}
				break;
			case SDL_JOYAXISMOTION:
				k = event.jaxis.axis;
				value = event.jaxis.value;
				{
					u32 mt=JMapAxis[k]>>16;
					u32 mo=JMapAxis[k]&0xFFFF;
					
					//printf("AXIS %d,%d\n",JE.number,JE.value);
					s8 v=(s8)(value/256); //-127 ... + 127 range			
					if (mt==0)
					{
						kcode[port]|=mo;
						kcode[port]|=mo*2;
						if (v<-64)
						{
							kcode[port]&=~mo;
						}
						else if (v>64)
						{
							kcode[port]&=~(mo*2);
						}
						
						// printf("Mapped to %d %d %d\n",mo,kcode[port]&mo,kcode[port]&(mo*2));
					}
					else if (mt==1)
					{
						if (v>=0) v++;	//up to 255
						
						//   printf("AXIS %d,%d Mapped to %d %d %d\n",JE.number,JE.value,mo,v,v+127);
						
						if (mo==0)
						lt[port]=v+127;
						else if (mo==1)
						rt[port]=v+127;
					}
					else if (mt==2)
					{
						//  printf("AXIS %d,%d Mapped to %d %d [%d]",JE.number,JE.value,mo,v);
						if (mo==0)
						joyx[port]=v;
						else if (mo==1)
						joyy[port]=v;
					}
				}
				break;
      case SDL_MOUSEMOTION:
          xx = event.motion.xrel;
          yy = event.motion.yrel;
          // some caping and dead zone...
          if (abs(xx)<4) xx = 0;
          if (abs(yy)<4) yy = 0;
          xx = xx*255/20; yy = yy*255/20;
          if (xx>255) xx = 255; if (xx<-255) xx = -255;
          if (yy>255) yy = 255; if (yy<-255) yy = -255;
          //if (abs(xx)>0 || abs(yy)>0) printf("mouse %i, %i\n", xx, yy);
          switch (mouse_use) {
            case 0:  // nothing
              break;
            case 1:  // Up=RT, Down=LT
              if (yy<0) rt[port]=-yy;
              if (yy>0) lt[port]=yy;
              break;
            case 2:  // Left=LT, Right=RT
              if (xx<0) lt[port]=-xx;
              if (xx>0) rt[port]=xx;
              break;
            case 3:  // Nub = ABXY
              if (xx<-127) kcode[port] &= ~Btn_X;
              if (xx>127) kcode[port] &= ~Btn_B;
              if (yy<-127) kcode[port] &= ~Btn_Y;
              if (yy>127) kcode[port] &= ~Btn_A;
              break;
          }
        break;
		}
			
	}
			
	if (keys[0]) { kcode[port] &= ~Btn_C; }
	if (keys[6]) { kcode[port] &= ~Btn_A; }
	if (keys[7]) { kcode[port] &= ~Btn_B; }
	if (keys[5]) { kcode[port] &= ~Btn_Y; }
	if (keys[8]) { kcode[port] &= ~Btn_X; }
	if (keys[1]) { kcode[port] &= ~DPad_Up;    }
	if (keys[2]) { kcode[port] &= ~DPad_Down;  }
	if (keys[3]) { kcode[port] &= ~DPad_Left;  }
	if (keys[4]) { kcode[port] &= ~DPad_Right; }
	if (keys[12]){ kcode[port] &= ~Btn_Start; }
	if (keys[9]){ 
			//die("death by escape key"); 
			//printf("death by escape key\n"); 
			// clean exit
			dc_term();
		
			// is there a proper way to exit? dc_term() doesn't end the dc_run() loop it seems
			die("death by escape key"); 
		} 
	if (keys[10]) rt[port]=255;
	if (keys[11]) lt[port]=255;
	
	return true;
}