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; }
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; } }
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; }