void exit() { uae_quit(); if(ctrlstate == UADE_R_STATE) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "We are in R STATE ?!"); if (uade_receive_message(um, sizeof(space), &uadeipc) <= 0) __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Can not receive events from uade"); else __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Got msg %d", um->msgtype); } if (uade_send_short_message(UADE_COMMAND_REBOOT, &state.ipc)) { __android_log_print(ANDROID_LOG_VERBOSE, "UADEPlugin", "Send reboot failed"); } __android_log_print(ANDROID_LOG_VERBOSE, "UADEPlugin", "Waiting for UAE to exit"); int rc = pthread_join(thread, NULL); __android_log_print(ANDROID_LOG_VERBOSE, "UADEPlugin", "Exit with %d", rc); thread = 0; if(soundBuffer) free(soundBuffer); soundBuffer = 0; }
static void my_kbd_handlerx (int scancode, int newstate) { int akey = scancode2amiga (scancode); assert (scancode >= 0 && scancode < 0x100); if (scancode == SCODE_F12) { uae_quit (); } else if (scancode == SCODE_F11) { gui_requested = 1; } if (keystate[scancode] == newstate) return; keystate[scancode] = newstate; if (akey == -1) return; if (newstate == KEY_EVENTPRESS) { if (akey == AK_inhibit) toggle_inhibit_frame (0); else record_key (akey << 1); } else record_key ((akey << 1) | 1); /* "Affengriff" */ if ((keystate[AK_CTRL] || keystate[AK_RCTRL]) && keystate[AK_LAMI] && keystate[AK_RAMI]) uae_reset (); }
/* 0 = normal, 1 = nogui, -1 = disable nogui */ void uae_restart (int opengui, char *cfgfile) { uae_quit (); restart_program = opengui > 0 ? 1 : (opengui == 0 ? 2 : 3); restart_config[0] = 0; if (cfgfile) strcpy (restart_config, cfgfile); }
/* 0 = normal, 1 = nogui, -1 = disable nogui */ void uae_restart (int opengui, TCHAR *cfgfile) { uae_quit (); restart_program = opengui > 0 ? 1 : (opengui == 0 ? 2 : 3); restart_config[0] = 0; default_config = 0; if (cfgfile) _tcscpy (restart_config, cfgfile); }
static void REGPARAM2 filesys_bput (uaecptr addr, uae_u32 b) { write_log ("filesys_bput called. This usually means that you are using\n"); write_log ("Kickstart 1.2. Please give UAE the \"-a\" option next time\n"); write_log ("you start it. If you are _not_ using Kickstart 1.2, then\n"); write_log ("there's a bug somewhere.\n"); write_log ("Exiting...\n"); uae_quit (); }
static void ersatz_failed (void) { if (already_failed) return; already_failed = 1; #if 0 notify_user (NUMSG_KICKREPNO); uae_restart (-1, NULL); #endif uae_quit (); }
bool UAE::QuitRequested(void) { // Quit the thread uae_quit(); status_t status; wait_for_thread(fEmulationThread, &status); ShowCursor(); return true; }
/* 0 = normal, 1 = nogui, -1 = disable nogui */ void uae_restart (int opengui, const TCHAR *cfgfile) { #ifdef FSUAE write_log("uae_restart\n"); #endif uae_quit (); restart_program = opengui > 0 ? 1 : (opengui == 0 ? 2 : 3); restart_config[0] = 0; default_config = 0; if (cfgfile) _tcscpy (restart_config, cfgfile); target_restart (); }
static int do_gui (int mode) { char cwd[1024]; if (getcwd (cwd, 1024) == NULL) return 0; tui_setup (); for (;;) { int c; tui_selwin (0); print_configuration (); c = tui_menubrowse (mode == 0 ? mainmenu2 : mainmenu, MENU_COL_OFFSET, 4, 0, MAX_MENU_HEIGHT); if (c == -1) { tui_shutdown (); return -2; } if (mode == 1) { if (c == 8) break; switch (c) { case 0: DiskOptions (); break; case 1: VideoOptions (); break; case 2: MemoryOptions (); break; case 3: CPUOptions (); break; case 4: HDOptions (); break; case 5: SoundOptions (); break; case 6: OtherOptions (); break; case 7: save_settings (); break; } } else { if (c == 5) break; switch (c) { case 0: DiskOptions (); break; case 1: OtherOptions (); break; case 2: save_settings (); break; case 3: uae_reset (0); break; case 4: uae_quit (); break; } } } tui_shutdown (); chdir (cwd); return 0; }
void ersatz_perform (uae_u16 what) { switch (what) { case EOP_INIT: ersatz_init (); break; case EOP_SERVEINT: /* Just reset all the interrupt request bits */ put_word (0xDFF09C, get_word (0xDFF01E) & 0x3FFF); break; case EOP_DOIO: ersatz_doio (); break; case EOP_AVAILMEM: _68k_dreg(0) = _68k_dreg(1) & 4 ? 0 : 0x70000; break; case EOP_ALLOCMEM: _68k_dreg(0) = _68k_dreg(1) & 4 ? 0 : 0x0F000; break; case EOP_ALLOCABS: _68k_dreg(0) = _68k_areg(1); break; case EOP_NIMP: write_log ("Unimplemented Kickstart function called\n"); uae_quit (); /* fall through */ case EOP_LOOP: _68k_setpc (0xF80010); break; case EOP_OPENLIB: default: write_log ("Internal error. Giving up.\n"); return; } }
/* there's a problem remaining with the semantics of the '#' key on U.S. keyboards */ static int scancode2amiga (int keycode, int scancode) { static int firstscan=0; if (!firstscan) { keyboardlayoutid=GetKeyboardLayout(0); keyboardlangid=LOWORD(keyboardlayoutid); firstscan=1; } #if DEBUG_KBD write_log ( "keycode = 0x%x, scancode = 0x%x\n", keycode, scancode ); #endif if(keyboardlangid==MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN)) { if (keystate[AK_CTRL] && keystate[AK_RALT]) { switch (keycode & 0xff) { case 0xdb: return AK_BACKSLASH; case 0x51: //@ record_key ((AK_CTRL << 1)+1); return 0x10; case 0xbb: //~ record_key ((AK_CTRL << 1)+1); return 0x1b; } } } #define USE_OLD_SHIFT_CODE switch (keycode & 0xff) { #ifndef USE_OLD_SHIFT_CODE case VK_SHIFT: { SHORT lsh, rsh; lsh = GetKeyState( VK_LSHIFT ); rsh = GetKeyState( VK_RSHIFT ); if( !keystate[AK_RSH] && (rsh & 0x8000)) return AK_RSH; if( keystate[AK_RSH] && !(rsh & 0x8000)) return AK_RSH; if( !keystate[AK_LSH] && (lsh & 0x8000)) return AK_LSH; if( keystate[AK_LSH] && !(lsh & 0x8000)) return AK_LSH; } #endif case VK_INSERT: case VK_LWIN: return AK_LAMI; case VK_HOME: case VK_RWIN: return AK_RAMI; case VK_MENU: return scancode & KF_EXTENDED ? AK_RALT:AK_LALT; case VK_APPS: /* Map Windows "Menu" key to Right-Alt of Amiga, for Stefan Stuntz */ return AK_RALT; case VK_SCROLL: return AK_inhibit; case VK_F11: #if 0 if( currprefs.win32_ctrl_F11_is_quit ) { if (GetAsyncKeyState (VK_CONTROL)&0x8000) uae_quit(); } #endif return AK_BACKSLASH; case VK_F12: if (GetAsyncKeyState (VK_CONTROL)&0x8000) return -6; if( shiftpressed() ) return -5; else return -2; break; case VK_PAUSE: return -3; case VK_DECIMAL: return AK_NPDEL; case VK_DIVIDE: return AK_NPDIV; case VK_MULTIPLY: return AK_NPMUL; case VK_SUBTRACT: return AK_NPSUB; case VK_ADD: return AK_NPADD; case VK_NUMPAD0: return AK_NP0; case VK_NUMPAD1: return AK_NP1; case VK_NUMPAD2: return AK_NP2; case VK_NUMPAD3: return AK_NP3; case VK_NUMPAD4: return AK_NP4; case VK_NUMPAD5: return AK_NP5; case VK_NUMPAD6: return AK_NP6; case VK_NUMPAD7: return AK_NP7; case VK_NUMPAD8: return AK_NP8; case VK_NUMPAD9: return AK_NP9; case VK_UP: return AK_UP; case VK_DOWN: return AK_DN; case VK_LEFT: return AK_LF; case VK_RIGHT: return AK_RT; case VK_CONTROL: return scancode & KF_EXTENDED ? AK_RCTRL : AK_CTRL; case VK_RETURN: return scancode & KF_EXTENDED ? AK_ENT : AK_RET; case VK_CAPITAL: return -4; case VK_F1: if (helppressed ()) return -10 - shiftpressed (); return AK_F1; case VK_F2: if (helppressed ()) return -12 - shiftpressed (); return AK_F2; case VK_F3: if (helppressed ()) return -14 - shiftpressed (); return AK_F3; case VK_F4: if (helppressed ()) return -16 - shiftpressed (); return AK_F4; case VK_F5: return AK_F5; case VK_F6: return AK_F6; case VK_F7: return AK_F7; case VK_F8: return AK_F8; case VK_F9: return AK_F9; case VK_F10: return AK_F10; case VK_NEXT: return AK_HELP; } switch (scancode) { case 0x01: return 0x45; case 0x29: return 0x00; case 0x02: return 0x01; case 0x03: return 0x02; case 0x04: return 0x03; case 0x05: return 0x04; case 0x06: return 0x05; case 0x07: return 0x06; case 0x08: return 0x07; case 0x09: return 0x08; case 0x0a: return 0x09; case 0x0b: return 0x0a; case 0x0c: return 0x0b; case 0x0d: return 0x0c; case 0x57: /* This is F11 */ return AK_BACKSLASH; case 0x0e: return 0x41; case 0x0f: return 0x42; case 0x10: return 0x10; case 0x11: return 0x11; case 0x12: return 0x12; case 0x13: return 0x13; case 0x14: return 0x14; case 0x15: return 0x15; case 0x16: return 0x16; case 0x17: return 0x17; case 0x18: return 0x18; case 0x19: return 0x19; case 0x1a: return 0x1a; case 0x1b: return 0x1b; /* special handling for caps lock: return 0x63*/ case 0x3a: return 0x62; case 0x1e: return 0x20; case 0x1f: return 0x21; case 0x20: return 0x22; case 0x21: return 0x23; case 0x22: return 0x24; case 0x23: return 0x25; case 0x24: return 0x26; case 0x25: return 0x27; case 0x26: return 0x28; case 0x27: return AK_SEMICOLON; case 0x28: return AK_QUOTE; case 0x2b: /* This scancode is \ on US keyboards, but # on German ones - figure out which! */ if( getascii( keycode & 0xFF, scancode ) == '#' ) return AK_NUMBERSIGN; else return AK_BACKSLASH; break; #ifdef USE_OLD_SHIFT_CODE case 0x2a: return AK_LSH; case 0x36: return AK_RSH; #endif case 0x56: return AK_LTGT; case 0x2c: return 0x31; case 0x2d: return 0x32; case 0x2e: return 0x33; case 0x2f: return 0x34; case 0x30: return 0x35; case 0x31: return 0x36; case 0x32: return 0x37; case 0x33: return 0x38; case 0x34: return 0x39; case 0x35: return 0x3a; case 0x38: return 0x64; case 0x39: return 0x40; case 0x153: return 0x46; case 0x51: return 0x5f; case 0x52: return AK_LAMI; case 0x47: return AK_RAMI; case 0x4b: return 0x4f; case 0x50: return 0x4d; case 0x4d: return 0x4e; case 0x48: return 0x4c; case 0x4e: return 0x5e; case 0x4a: return 0x4a; case 0x37: return 0x5d; } return -1; }
static void ersatz_init (void) { int32_t f; uaecptr request; uaecptr a; already_failed = 0; write_log (_T("initializing kickstart replacement\n")); if (disk_empty (0)) { already_failed = 1; notify_user (NUMSG_KICKREP); uae_quit (); //uae_restart (-1, NULL); return; } regs.s = 0; /* Set some interrupt vectors */ for (a = 8; a < 0xC0; a += 4) { put_long (a, 0xF8001A); } regs.isp = regs.msp = regs.usp = 0x800; m68k_areg (regs, 7) = 0x80000; regs.intmask = 0; /* Build a dummy execbase */ put_long (4, m68k_areg (regs, 6) = 0x676); put_byte (0x676 + 0x129, 0); for (f = 1; f < 105; f++) { put_word (0x676 - 6*f, 0x4EF9); put_long (0x676 - 6*f + 2, 0xF8000C); } /* Some "supported" functions */ put_long (0x676 - 456 + 2, 0xF80014); put_long (0x676 - 216 + 2, 0xF80020); put_long (0x676 - 198 + 2, 0xF80026); put_long (0x676 - 204 + 2, 0xF8002c); put_long (0x676 - 210 + 2, 0xF8002a); /* Build an IORequest */ request = 0x800; put_word (request + 0x1C, 2); put_long (request + 0x28, 0x4000); put_long (request + 0x2C, 0); put_long (request + 0x24, 0x200 * 4); m68k_areg (regs, 1) = request; ersatz_doio (); /* kickstart disk loader */ if (get_long (0x4000) == 0x4b49434b) { /* a kickstart disk was found in drive 0! */ write_log (_T("Loading Kickstart rom image from Kickstart disk\n")); /* print some notes... */ write_log (_T("NOTE: if UAE crashes set CPU to 68000 and/or chipmem size to 512KB!\n")); /* read rom image from kickstart disk */ put_word (request + 0x1C, 2); put_long (request + 0x28, 0xF80000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); m68k_areg (regs, 1) = request; ersatz_doio (); /* read rom image once again to mirror address space. not elegant, but it works... */ put_word (request + 0x1C, 2); put_long (request + 0x28, 0xFC0000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); m68k_areg (regs, 1) = request; ersatz_doio (); disk_eject (0); m68k_setpc (0xFC0002); fill_prefetch (); uae_reset (0); ersatzkickfile = 0; return; } m68k_setpc (0x400C); fill_prefetch (); /* Init the hardware */ put_long (0x3000, 0xFFFFFFFEul); put_long (0xDFF080, 0x3000); put_word (0xDFF088, 0); put_word (0xDFF096, 0xE390); put_word (0xDFF09A, 0xE02C); put_word (0xDFF09E, 0x0000); put_word (0xDFF092, 0x0038); put_word (0xDFF094, 0x00D0); put_word (0xDFF08E, 0x2C81); put_word (0xDFF090, 0xF4C1); put_word (0xDFF02A, 0x8000); put_byte (0xBFD100, 0xF7); put_byte (0xBFEE01, 0); put_byte (0xBFEF01, 0x08); put_byte (0xBFDE00, 0x04); put_byte (0xBFDF00, 0x84); put_byte (0xBFDD00, 0x9F); put_byte (0xBFED01, 0x9F); }
extern "C" void JAVA_EXPORT_NAME(DemoActivity_nativeQuit) ( JNIEnv* env, jobject thiz) { uae_quit(); exit(0); }
void handle_events (void) { SDL_Event rEvent; int iAmigaKeyCode; int i, j; int iIsHotKey = 0; #ifdef DEBUG_EVENTS dbg("Function: handle_events"); #endif #ifdef MAX_AUTOEVENTS { static unsigned cuenta=0; // /* switch(cuenta&63) { case 8: if ((cuenta<6500)||(cuenta>8000)) joy1button=1; break; case 16: buttonstate[0]=1; break; case 24: joy1button=0; break; case 28: if (cuenta>11000) joy1dir=3; break; case 32: buttonstate[0]=0; break; case 62: joy1dir=0; break; } // lastmy+=8; switch(cuenta&127) { case 20: record_key(0x12); break; case 40: record_key(0x13); break; case 60: record_key(0x88); break; case 80: record_key(0x89); break; } if (cuenta==7700) { strcpy(changed_df[0],"prueba2.adz"); real_changed_df[0]=1; joy1button=1; } // */ // Defender of the Crown /* switch(cuenta) { case 2600: lastmx+=80; break; case 2610: buttonstate[0]=1; break; break; case 2615: buttonstate[0]=0; break; break; case 4500: lastmy+=100; break; case 4510: buttonstate[0]=1; break; break; case 4515: buttonstate[0]=0; break; break; case 4640: lastmy-=60; lastmx+=550; break; case 4700: lastmx+=200; break; case 4710: buttonstate[0]=1; break; break; case 4715: buttonstate[0]=0; break; break; } // printf("%i -> %.8X\n",cuenta,chipmem_checksum()); */ printf("%i\n",cuenta); fflush(stdout); #ifdef START_DEBUG if (cuenta>START_DEBUG) DEBUG_AHORA=1; #endif #ifdef DEBUG_EVENTS dbgf(" AUTO EVENTS: %i =?= %i\n",cuenta,MAX_AUTOEVENTS); #endif if (cuenta>MAX_AUTOEVENTS) exit(0); else dbgf("handle_events %i\n",cuenta); cuenta++; } #else /* Handle GUI events */ gui_handle_events (); while (SDL_PollEvent(&rEvent)) { switch (rEvent.type) { case SDL_QUIT: #ifdef DEBUG_EVENTS dbg("Event: quit"); #endif uae_quit(); break; break; case SDL_JOYBUTTONDOWN: #if defined (GP2X) || defined (PSP) || defined (GIZMONDO) if (gp2xButtonRemappingOn && is_overridden_button(rEvent.jbutton.button)) { // handle the buttons as specified handle_remapped_button_down(rEvent.jbutton.button); } #ifdef GP2X else if (rEvent.jbutton.button==GP2X_BUTTON_A) #else #ifdef GIZMONDO else if (rEvent.jbutton.button==GIZ_BACK) #else else if (rEvent.jbutton.button==PSP_BUTTON_SQUARE) #endif #endif { // critical: temporary hack to send return and space when the A button // is pressed if (!uae4all_keystate[AK_RET]) { uae4all_keystate[AK_RET] = 1; record_key(AK_RET << 1); } if (!uae4all_keystate[AK_SPC]) { uae4all_keystate[AK_SPC] = 1; record_key(AK_SPC << 1); } } #ifdef GP2X else if (rEvent.jbutton.button==GP2X_BUTTON_START) #else #ifdef GIZMONDO else if (rEvent.jbutton.button==GIZ_STOP) #else else if (rEvent.jbutton.button==PSP_BUTTON_START) #endif #endif { if (!vkbd_mode) { // only do this if the virtual keyboard isn't visible // state moves thus: // joystick mode (with virt keyboard on L and R) // mouse mode (with mouse buttons on L and R) // if specified: // remapping mode (with whatever's been supplied) // back to start of state if (!hasGp2xButtonRemapping) { // skip the remapping state gp2xMouseEmuOn = !gp2xMouseEmuOn; } else { // start condition is gp2xMouseEmuOn = 0, gp2xButtonRemappingOn = 0 if (!gp2xButtonRemappingOn && !gp2xMouseEmuOn) { // move to mouse emu mode gp2xMouseEmuOn = 1; gp2xButtonRemappingOn = 0; } else if (gp2xMouseEmuOn && !gp2xButtonRemappingOn) { // move to button remapping mode gp2xMouseEmuOn = 0; gp2xButtonRemappingOn = 1; } else if (!gp2xMouseEmuOn && gp2xButtonRemappingOn) { gp2xMouseEmuOn = 0; gp2xButtonRemappingOn = 0; } } show_inputmode = 1; } } else if (gp2xMouseEmuOn) { #ifdef GP2X if (rEvent.jbutton.button==GP2X_BUTTON_L) buttonstate[0] = 1; if (rEvent.jbutton.button==GP2X_BUTTON_R) buttonstate[2] = 1; #else #ifdef GIZMONDO if (rEvent.jbutton.button==GIZ_LTRIG) buttonstate[0] = 1; if (rEvent.jbutton.button==GIZ_RTRIG) buttonstate[2] = 1; #else if (rEvent.jbutton.button==PSP_BUTTON_L) buttonstate[0] = 1; if (rEvent.jbutton.button==PSP_BUTTON_R) buttonstate[2] = 1; #endif #endif } else if ((!gp2xMouseEmuOn) && (!gp2xButtonRemappingOn) && (!vkbd_mode) && (vkbd_button2!=(SDLKey)0)) { if (vkbd_button2) rEvent.key.keysym.sym=vkbd_button2; else break; } #ifdef GP2X if (rEvent.jbutton.button==GP2X_BUTTON_VOLUP) { if (soundVolume <100) { soundVolume+= 10; gp2x_set_volume(soundVolume); } show_volumecontrol = 1; } else if (rEvent.jbutton.button==GP2X_BUTTON_VOLDOWN) { int vol; if (soundVolume > 0) { soundVolume-= 10; gp2x_set_volume(soundVolume); } show_volumecontrol = 1; } #endif #else if ((rEvent.jbutton.button==6) && (!vkbd_mode) && (vkbd_button2!=(SDLKey)0)) { if (vkbd_button2) rEvent.key.keysym.sym=vkbd_button2; else break; } #endif else break; case SDL_KEYDOWN: #ifdef DEBUG_EVENTS dbg("Event: key down"); #endif #if !defined (DREAMCAST) && !defined (GP2X) if ((rEvent.key.keysym.sym!=SDLK_F11)&&(rEvent.key.keysym.sym!=SDLK_F12)&&(rEvent.key.keysym.sym!=SDLK_PAGEUP)) #endif { iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym)); if (iAmigaKeyCode >= 0) { if (!uae4all_keystate[iAmigaKeyCode]) { if (iAmigaKeyCode == AK_P) { joy0button = 1; } uae4all_keystate[iAmigaKeyCode] = 1; record_key(iAmigaKeyCode << 1); } } } break; case SDL_JOYBUTTONUP: #if defined (GP2X) || defined (PSP) || defined (GIZMONDO) if (gp2xButtonRemappingOn && is_overridden_button(rEvent.jbutton.button)) { // handle the buttons as specified handle_remapped_button_up(rEvent.jbutton.button); } #ifdef GP2X else if (rEvent.jbutton.button==GP2X_BUTTON_A) #else #ifdef GIZMONDO else if (rEvent.jbutton.button==GIZ_BACK) #else else if (rEvent.jbutton.button==PSP_BUTTON_SQUARE) #endif #endif { // critical: temporary hack to send return and space when the A button // is pressed uae4all_keystate[AK_RET] = 0; record_key((AK_RET << 1) | 1); uae4all_keystate[AK_SPC] = 0; record_key((AK_SPC << 1) | 1); } else if (gp2xMouseEmuOn) { #ifdef GP2X if (rEvent.jbutton.button==GP2X_BUTTON_L) { buttonstate[0] = 0; } else if (rEvent.jbutton.button==GP2X_BUTTON_R) { buttonstate[2] = 0; } #else #ifdef GIZMONDO if (rEvent.jbutton.button==GIZ_LTRIG) { buttonstate[0] = 0; } else if (rEvent.jbutton.button==GIZ_RTRIG) { buttonstate[2] = 0; } #else if (rEvent.jbutton.button==PSP_BUTTON_L) { buttonstate[0] = 0; } else if (rEvent.jbutton.button==PSP_BUTTON_R) { buttonstate[2] = 0; } #endif #endif } #ifdef GP2X if (rEvent.jbutton.button==GP2X_BUTTON_VOLDOWN || rEvent.jbutton.button==GP2X_BUTTON_VOLUP) { show_volumecontrol = 0; } #endif #ifdef GP2X if (rEvent.jbutton.button==GP2X_BUTTON_START) #else #ifdef GIZMONDO if (rEvent.jbutton.button==GIZ_STOP) #else if (rEvent.jbutton.button==PSP_BUTTON_START) #endif #endif { show_inputmode = 0; } #else if ((rEvent.jbutton.button==6) && (!vkbd_mode) && (vkbd_button2!=(SDLKey)0)) { if (vkbd_button2) rEvent.key.keysym.sym=vkbd_button2; else break; } #endif else break; case SDL_KEYUP: #ifdef DEBUG_EVENTS dbg("Event: key up"); #endif #if !defined (DREAMCAST) && !defined (GP2X) if ((rEvent.key.keysym.sym!=SDLK_F11)&&(rEvent.key.keysym.sym!=SDLK_F12)&&(rEvent.key.keysym.sym!=SDLK_PAGEUP)) #endif { iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym)); if (iAmigaKeyCode >= 0) { if (iAmigaKeyCode == AK_P) { joy0button = 0; } uae4all_keystate[iAmigaKeyCode] = 0; record_key((iAmigaKeyCode << 1) | 1); } } break; case SDL_MOUSEBUTTONDOWN: #ifdef DEBUG_EVENTS dbg("Event: mouse button down"); #endif #ifdef DREAMCAST if (__sdl_dc_emulate_mouse) { if (rEvent.button.button==5) buttonstate[0] = 1; else if (rEvent.button.button==1) buttonstate[2] = 1; } else if (rEvent.button.button) buttonstate[2]=1; else buttonstate[0]=1; #else #ifdef ANDROID if (right_mouse == 1) buttonstate[2] = 1; else buttonstate[(rEvent.button.button-1)%3] = 1; #else buttonstate[(rEvent.button.button-1)%3] = 1; #endif #endif break; case SDL_MOUSEBUTTONUP: #ifdef DEBUG_EVENTS dbg("Event: mouse button up"); #endif #ifdef DREAMCAST if (__sdl_dc_emulate_mouse) { if (rEvent.button.button==5) buttonstate[0] = 0; else if (rEvent.button.button==1) buttonstate[2] = 0; } else if (rEvent.button.button) buttonstate[2]=0; else buttonstate[0]=0; #else #ifdef ANDROID if (right_mouse == 1) buttonstate[2] = 0; else buttonstate[(rEvent.button.button-1)%3] = 0; #else buttonstate[(rEvent.button.button-1)%3] = 0; #endif #endif break; case SDL_MOUSEMOTION: #ifdef DEBUG_EVENTS dbg("Event: mouse motion"); #endif lastmx += rEvent.motion.xrel<<1; lastmy += rEvent.motion.yrel<<1; newmousecounters = 1; break; } } #endif /* Handle UAE reset */ /* if ((uae4all_keystate[AK_CTRL] || uae4all_keystate[AK_RCTRL]) && uae4all_keystate[AK_LAMI] && uae4all_keystate[AK_RAMI]) uae_reset (); */ #ifdef DEBUG_EVENTS dbg(" handle_events -> terminado"); #endif }
/* * Here's where all the action takes place! */ void real_main (int argc, char **argv) { show_version (); #if defined (NATMEM_OFFSET) if (NATMEM_OFFSET == 0 && sizeof (void*) < 8) { write_log ("NATMEM_OFFSET is 0; I hope you used 'uae-preloader' to load me, or else ...\n"); } #endif #ifdef FILESYS currprefs.mountinfo = changed_prefs.mountinfo = &options_mountinfo; #endif restart_program = 1; #ifdef _WIN32 sprintf (restart_config, "%sConfigurations\\", start_path); #endif strcat (restart_config, OPTIONSFILENAME); /* Initial state is stopped */ uae_target_state = UAE_STATE_STOPPED; while (uae_target_state != UAE_STATE_QUITTING) { int want_gui; set_state (uae_target_state); do_preinit_machine (argc, argv); /* Should we open the GUI? TODO: This mess needs to go away */ want_gui = currprefs.start_gui; if (restart_program == 2) want_gui = 0; else if (restart_program == 3) want_gui = 1; changed_prefs = currprefs; if (want_gui) { /* Handle GUI at start-up */ int err = gui_open (); if (err >= 0) { do { gui_handle_events (); uae_msleep (10); } while (!uae_state_change_pending ()); } else if (err == - 1) { if (restart_program == 3) { restart_program = 0; uae_quit (); } } else uae_quit (); currprefs = changed_prefs; fix_options (); inputdevice_init (); } restart_program = 0; if (uae_target_state == UAE_STATE_QUITTING) break; uae_target_state = UAE_STATE_COLD_START; /* Start emulator proper. */ if (!do_init_machine ()) break; while (uae_target_state != UAE_STATE_QUITTING && uae_target_state != UAE_STATE_STOPPED) { /* Reset */ set_state (uae_target_state); do_reset_machine (uae_state == UAE_STATE_COLD_START); /* Running */ uae_target_state = UAE_STATE_RUNNING; /* * Main Loop */ do { set_state (uae_target_state); /* Run emulator. */ do_run_machine (); if (uae_target_state == UAE_STATE_PAUSED) { /* Paused */ set_state (uae_target_state); audio_pause (); /* While UAE is paused we have to handle * input events, etc. ourselves. */ do { gui_handle_events (); handle_events (); /* Manually pump input device */ inputdevicefunc_keyboard.read (); inputdevicefunc_mouse.read (); inputdevicefunc_joystick.read (); inputdevice_handle_inputcode (); /* Don't busy wait. */ uae_msleep (10); } while (!uae_state_change_pending ()); audio_resume (); } } while (uae_target_state == UAE_STATE_RUNNING); /* * End of Main Loop * * We're no longer running or paused. */ set_inhibit_frame (IHF_QUIT_PROGRAM); #ifdef FILESYS /* Ensure any cached changes to virtual filesystem are flushed before * resetting or exitting. */ filesys_prepare_reset (); #endif } /* while (!QUITTING && !STOPPED) */ do_exit_machine (); /* TODO: This stuff is a hack. What we need to do is * check whether a config GUI is available. If not, * then quit. */ restart_program = 3; } zfile_exit (); }
/* * Exits the emulator */ static uae_u32 emulib_ExitEmu (void) { uae_quit (); return 1; }
static void ersatz_init (void) { int f; uaecptr request; uaecptr a; if (disk_empty (0)) { write_log ("You need to have a diskfile in DF0 to use the Kickstart replacement!\n"); uae_quit (); _68k_setpc (0xF80010); return; } _68k_sreg = 0; /* Set some interrupt vectors */ for (a = 8; a < 0xC0; a += 4) { put_long (a, 0xF8001A); } _68k_ispreg = _68k_mspreg = _68k_uspreg = 0x800; _68k_areg(7) = 0x80000; #ifndef USE_FAME_CORE _68k_intmask = 0; #endif /* Build a dummy execbase */ put_long (4, _68k_areg(6) = 0x676); put_byte (0x676 + 0x129, 0); for (f = 1; f < 105; f++) { put_word (0x676 - 6*f, 0x4EF9); put_long (0x676 - 6*f + 2, 0xF8000C); } /* Some "supported" functions */ put_long (0x676 - 456 + 2, 0xF80014); put_long (0x676 - 216 + 2, 0xF80020); put_long (0x676 - 198 + 2, 0xF80026); put_long (0x676 - 204 + 2, 0xF8002c); put_long (0x676 - 210 + 2, 0xF8002a); /* Build an IORequest */ request = 0x800; put_word (request + 0x1C, 2); put_long (request + 0x28, 0x4000); put_long (request + 0x2C, 0); put_long (request + 0x24, 0x200 * 4); _68k_areg(1) = request; ersatz_doio (); /* kickstart disk loader */ if (get_long(0x4000) == 0x4b49434b) { /* a kickstart disk was found in drive 0! */ write_log ("Loading Kickstart rom image from Kickstart disk\n"); /* print some notes... */ write_log ("NOTE: if UAE crashes set CPU to 68000 and/or chipmem size to 512KB!\n"); /* read rom image from kickstart disk */ put_word (request + 0x1C, 2); put_long (request + 0x28, 0xF80000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); _68k_areg(1) = request; ersatz_doio (); /* read rom image once ajain to mirror address space. not elegant, but it works... */ put_word (request + 0x1C, 2); put_long (request + 0x28, 0xFC0000); put_long (request + 0x2C, 0x200); put_long (request + 0x24, 0x200 * 512); _68k_areg(1) = request; ersatz_doio (); disk_eject (0); _68k_setpc (0xFC0002); fill_prefetch_0 (); uae_reset (); ersatzkickfile = 0; return; } _68k_setpc (0x400C); fill_prefetch_0 (); /* Init the hardware */ put_long (0x3000, 0xFFFFFFFEul); put_long (0xDFF080, 0x3000); put_word (0xDFF088, 0); put_word (0xDFF096, 0xE390); put_word (0xDFF09A, 0xE02C); put_word (0xDFF09E, 0x0000); put_word (0xDFF092, 0x0038); put_word (0xDFF094, 0x00D0); put_word (0xDFF08E, 0x2C81); put_word (0xDFF090, 0xF4C1); put_word (0xDFF02A, 0x8000); put_byte (0xBFD100, 0xF7); put_byte (0xBFEE01, 0); put_byte (0xBFEF01, 0x08); put_byte (0xBFDE00, 0x04); put_byte (0xBFDF00, 0x84); put_byte (0xBFDD00, 0x9F); put_byte (0xBFED01, 0x9F); }
static void parsemessage(TCHAR *in, struct uae_prefs *p, TCHAR *out, int outsize) { int mode; out[0] = 0; my_trim (in); if (!_tcsicmp (in, _T("IPC_QUIT"))) { uae_quit (); return; } if (!_tcsicmp (in, _T("ipc_config"))) { ipcmode = 1; _tcscat (out, _T("200\n")); return; } else if (!_tcsicmp (in, _T("ipc_event"))) { ipcmode = 2; _tcscat (out, _T("200\n")); return; } else if (!_tcsicmp (in, _T("ipc_debug"))) { ipcmode = 3; _tcscat (out, _T("200\n")); return; } else if (!_tcsicmp (in, _T("ipc_restore"))) { ipcmode = 0; _tcscat (out, _T("200\n")); return; } mode = 0; if (ipcmode == 1) { mode = 1; } else if (ipcmode == 2) { mode = 1; } else if (ipcmode == 3) { mode = 2; } else if (!_tcsnicmp (in, _T("CFG "), 4) || !_tcsnicmp (in, _T("EVT "), 4)) { mode = 1; in += 4; } else if (!_tcsnicmp (in, _T("DBG "), 4)) { mode = 2; in += 4; } if (mode == 1) { TCHAR tmpout[256]; int index = -1; int cnt = 0; for (;;) { int ret; tmpout[0] = 0; ret = cfgfile_modify (index, in, _tcslen (in), tmpout, sizeof (tmpout) * sizeof (TCHAR)); index++; if (_tcslen (tmpout) > 0) { if (_tcslen (out) == 0) _tcscat (out, _T("200 ")); _tcsncat (out, _T("\n"), outsize); _tcsncat (out, tmpout, outsize); } cnt++; if (ret >= 0) break; } if (out[0] == 0) _tcscat (out, _T("404")); } else if (mode == 2) { debug_parser (in, out, outsize); if (!out[0]) _tcscpy (out, _T("404")); } else { _tcscpy (out, _T("501")); } }
static void QUIT (void) { uae_quit (); }
void handle_events (void) { SDL_Event rEvent; int iAmigaKeyCode; int i, j; int iIsHotKey = 0; #ifdef DEBUG_EVENTS dbg("Function: handle_events"); #endif #if defined(MAX_AUTOEVENTS) || defined(AUTOEVENTS) { static unsigned cuenta=0; /* switch(cuenta&63) { case 8: if ((cuenta<6500)||(cuenta>8000)) joy1button=1; break; case 16: buttonstate[0]=1; break; case 24: joy1button=0; break; case 28: if (cuenta>11000) joy1dir=3; break; case 32: buttonstate[0]=0; break; case 62: joy1dir=0; break; } // lastmy+=8; switch(cuenta&127) { case 20: record_key(0x12); break; case 40: record_key(0x13); break; case 60: record_key(0x88); break; case 80: record_key(0x89); break; } */ /* if (cuenta==7700) { strcpy(changed_df[0],"prueba2.adz"); real_changed_df[0]=1; joy1button=1; } */ // Defender of the Crown /* switch(cuenta) { case 2600: lastmx+=80; break; case 2610: buttonstate[0]=1; break; break; case 2615: buttonstate[0]=0; break; break; case 4500: lastmy+=100; break; case 4510: buttonstate[0]=1; break; break; case 4515: buttonstate[0]=0; break; break; case 4640: lastmy-=60; lastmx+=550; break; case 4700: lastmx+=200; break; case 4710: buttonstate[0]=1; break; break; case 4715: buttonstate[0]=0; break; break; } // printf("%i -> %.8X\n",cuenta,chipmem_checksum()); */ #if defined(START_DEBUG) && !defined(START_DEBUG_SAVESTATE) if (cuenta==START_DEBUG) { #ifdef DEBUG_FILE if (!DEBUG_STR_FILE) DEBUG_STR_FILE=fopen(DEBUG_FILE,"wt"); #endif DEBUG_AHORA=1; } #else #ifdef START_DEBUG_SAVESTATE if (cuenta==START_DEBUG) savestate_state = STATE_DOSAVE; #endif #endif #ifdef AUTO_SAVESTATE if (cuenta==AUTO_SAVESTATE) savestate_state = STATE_DORESTORE; #endif #ifdef MAX_AUTOEVENTS #ifdef DEBUG_EVENTS dbgf(" AUTO EVENTS: %i =?= %i\n",cuenta,MAX_AUTOEVENTS); #endif if (cuenta>MAX_AUTOEVENTS) { int i; #ifdef DEBUG_FILE fclose(DEBUG_STR_FILE); SDL_Delay(100); for(i=0;i<0x10000;i+=78) { SDL_FillRect(prSDLScreen, NULL, i); SDL_Flip(prSDLScreen); } SDL_Delay(333); #endif exit(0); } else dbgf("handle_events %i\n",cuenta); #endif cuenta++; } #else /* Handle GUI events */ gui_handle_events (); #ifdef EMULATED_JOYSTICK { if ((vkbd_button3==(SDLKey)0)&&(!vkbd_mode)) buttonstate[0]=emulated_mouse_button1; if ((vkbd_button4==(SDLKey)0)&&(!vkbd_mode)) buttonstate[2]=emulated_mouse_button2; } #endif while (SDL_PollEvent(&rEvent)) { switch (rEvent.type) { case SDL_QUIT: #ifdef DEBUG_EVENTS dbg("Event: quit"); #endif uae_quit(); break; break; case SDL_JOYBUTTONDOWN: if (vkbd_mode) break; if ((rEvent.jbutton.button==6) && (vkbd_button2!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button2; else if ((rEvent.jbutton.button==5) && (vkbd_button3!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button3; else if ((rEvent.jbutton.button==1) && (vkbd_button4!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button4; else break; case SDL_KEYDOWN: #ifdef DEBUG_EVENTS dbg("Event: key down"); #endif #ifndef DREAMCAST if ((rEvent.key.keysym.sym!=SDLK_F11)&&(rEvent.key.keysym.sym!=SDLK_F12)&&(rEvent.key.keysym.sym!=SDLK_PAGEUP) #ifdef EMULATED_JOYSTICK &&(rEvent.key.keysym.sym!=SDLK_ESCAPE)&&((rEvent.key.keysym.sym!=SDLK_SPACE)||((rEvent.key.keysym.sym==SDLK_SPACE)&&(vkbd_button3!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_LCTRL)&&((rEvent.key.keysym.sym!=SDLK_LALT)||((rEvent.key.keysym.sym==SDLK_LALT)&&(vkbd_button2!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_RETURN)&&((rEvent.key.keysym.sym!=SDLK_LSHIFT)||((rEvent.key.keysym.sym==SDLK_LSHIFT)&&(vkbd_button4!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_TAB)&&(rEvent.key.keysym.sym!=SDLK_BACKSPACE)&&(rEvent.key.keysym.sym!=SDLK_UP)&&(rEvent.key.keysym.sym!=SDLK_DOWN)&&(rEvent.key.keysym.sym!=SDLK_LEFT)&&(rEvent.key.keysym.sym!=SDLK_RIGHT) #endif ) { if ((rEvent.key.keysym.sym==SDLK_LALT)&&(vkbd_button2!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button2; else if ((rEvent.key.keysym.sym==SDLK_LSHIFT)&&(vkbd_button4!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button4; else if ((rEvent.key.keysym.sym==SDLK_SPACE)&&(vkbd_button3!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button3; #else { #endif iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym)); if (iAmigaKeyCode >= 0) { if (!uae4all_keystate[iAmigaKeyCode]) { uae4all_keystate[iAmigaKeyCode] = 1; record_key(iAmigaKeyCode << 1); } } } break; case SDL_JOYBUTTONUP: if (vkbd_mode) break; if ((rEvent.jbutton.button==6) && (vkbd_button2!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button2; else if ((rEvent.jbutton.button==5) && (vkbd_button3!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button3; else if ((rEvent.jbutton.button==1) && (vkbd_button4!=(SDLKey)0)) rEvent.key.keysym.sym=vkbd_button4; else break; case SDL_KEYUP: #ifdef DEBUG_EVENTS dbg("Event: key up"); #endif #ifndef DREAMCAST if ((rEvent.key.keysym.sym!=SDLK_F11)&&(rEvent.key.keysym.sym!=SDLK_F12)&&(rEvent.key.keysym.sym!=SDLK_PAGEUP) #ifdef EMULATED_JOYSTICK &&(rEvent.key.keysym.sym!=SDLK_ESCAPE)&&((rEvent.key.keysym.sym!=SDLK_SPACE)||((rEvent.key.keysym.sym==SDLK_SPACE)&&(vkbd_button3!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_LCTRL)&&((rEvent.key.keysym.sym!=SDLK_LALT)||((rEvent.key.keysym.sym==SDLK_LALT)&&(vkbd_button2!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_RETURN)&&((rEvent.key.keysym.sym!=SDLK_LSHIFT)||((rEvent.key.keysym.sym==SDLK_LSHIFT)&&(vkbd_button4!=(SDLKey)0)&&(!vkbd_mode)))&&(rEvent.key.keysym.sym!=SDLK_TAB)&&(rEvent.key.keysym.sym!=SDLK_BACKSPACE)&&(rEvent.key.keysym.sym!=SDLK_UP)&&(rEvent.key.keysym.sym!=SDLK_DOWN)&&(rEvent.key.keysym.sym!=SDLK_LEFT)&&(rEvent.key.keysym.sym!=SDLK_RIGHT) #endif ) { if ((rEvent.key.keysym.sym==SDLK_LALT)&&(vkbd_button2!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button2; else if ((rEvent.key.keysym.sym==SDLK_LSHIFT)&&(vkbd_button4!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button4; else if ((rEvent.key.keysym.sym==SDLK_SPACE)&&(vkbd_button3!=(SDLKey)0)&&(!vkbd_mode)) rEvent.key.keysym.sym=vkbd_button3; #else { #endif iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym)); if (iAmigaKeyCode >= 0) { uae4all_keystate[iAmigaKeyCode] = 0; record_key((iAmigaKeyCode << 1) | 1); } } break; case SDL_MOUSEBUTTONDOWN: #ifdef DEBUG_EVENTS dbg("Event: mouse button down"); #endif #ifdef DREAMCAST if (__sdl_dc_emulate_mouse) { if (vkbd_mode) break; if (rEvent.button.button==5 ) { if (vkbd_button3==(SDLKey)0) buttonstate[0] = 1; else break; } else if (rEvent.button.button==1) { if (vkbd_button4==(SDLKey)0) buttonstate[2] = 1; else break; } } else if (rEvent.button.button) buttonstate[2]=1; else buttonstate[0]=1; #else buttonstate[(rEvent.button.button-1)%3] = 1; #endif break; case SDL_MOUSEBUTTONUP: #ifdef DEBUG_EVENTS dbg("Event: mouse button up"); #endif #ifdef DREAMCAST if (__sdl_dc_emulate_mouse) { if (vkbd_mode) break; if (rEvent.button.button==5) { if (vkbd_button3==(SDLKey)0) buttonstate[0] = 0; else break; } else if (rEvent.button.button==1) { if (vkbd_button4==(SDLKey)0) buttonstate[2] = 0; else break; } } else if (rEvent.button.button) buttonstate[2]=0; else buttonstate[0]=0; #else buttonstate[(rEvent.button.button-1)%3] = 0; #endif break; case SDL_MOUSEMOTION: #ifdef DEBUG_EVENTS dbg("Event: mouse motion"); #endif lastmx += rEvent.motion.xrel<<1; lastmy += rEvent.motion.yrel<<1; newmousecounters = 1; break; } } #endif /* Handle UAE reset */ /* if ((uae4all_keystate[AK_CTRL] || uae4all_keystate[AK_RCTRL]) && uae4all_keystate[AK_LAMI] && uae4all_keystate[AK_RAMI]) uae_reset (); */ #ifdef DEBUG_EVENTS dbg(" handle_events -> terminado"); #endif } int check_prefs_changed_gfx (void) { extern int mainMenu_vpos; static int last_vpos=0; int ret=(last_vpos!=mainMenu_vpos); last_vpos=mainMenu_vpos; return ret; } int debuggable (void) { return 1; } int needmousehack (void) { return 1; } #if !defined(DREAMCAST) && !defined(DINGOO) int lockscr (void) { #ifdef DEBUG_GFX dbg("Function: lockscr"); #endif if (SDL_MUSTLOCK(prSDLScreen)) SDL_LockSurface(prSDLScreen); return 1; } void unlockscr (void) { #ifdef DEBUG_GFX dbg("Function: unlockscr"); #endif if (SDL_MUSTLOCK(prSDLScreen)) SDL_UnlockSurface(prSDLScreen); }
int amiga_quit() { printf("UAE: Calling uae_quit\n"); uae_quit(); return 1; }