|
|
1.1 ! root 1: /* ! 2: Hatari - main.c ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. ! 6: ! 7: Main initialization and event handling routines. ! 8: */ ! 9: ! 10: #include <time.h> ! 11: #include <signal.h> ! 12: #include <sys/time.h> ! 13: #include <unistd.h> ! 14: #include <signal.h> ! 15: ! 16: #include <SDL.h> ! 17: ! 18: #include "main.h" ! 19: #include "audio.h" ! 20: #include "../m68000.h" ! 21: #include "hostcall.h" ! 22: #include "input.h" ! 23: #include "keymap.h" ! 24: #include "screen.h" ! 25: #include "shortcut.h" ! 26: ! 27: ! 28: #define FORCE_WORKING_DIR /* Set default directory to cwd */ ! 29: ! 30: ! 31: BOOL bQuitProgram=FALSE; /* Flag to quit program cleanly */ ! 32: BOOL bUseFullscreen=FALSE; ! 33: BOOL bEmulationActive=TRUE; /* Run emulation when started */ ! 34: BOOL bAppActive = FALSE; ! 35: char szBootDiscImage[MAX_FILENAME_LENGTH] = { "" }; ! 36: ! 37: char szWorkingDir[MAX_FILENAME_LENGTH] = { "" }; ! 38: char szCurrentDir[MAX_FILENAME_LENGTH] = { "" }; ! 39: ! 40: /*-----------------------------------------------------------------------*/ ! 41: /* ! 42: Error handler ! 43: */ ! 44: void Main_SysError(char *Error,char *Title) ! 45: { ! 46: fprintf(stderr,"%s : %s\n",Title,Error); ! 47: } ! 48: ! 49: ! 50: /*-----------------------------------------------------------------------*/ ! 51: /* ! 52: Bring up message(handles full-screen as well as Window) ! 53: */ ! 54: int Main_Message(char *lpText, char *lpCaption/*,unsigned int uType*/) ! 55: { ! 56: int Ret=0; ! 57: ! 58: /* Show message */ ! 59: fprintf(stderr,"%s: %s\n", lpCaption, lpText); ! 60: ! 61: return(Ret); ! 62: } ! 63: ! 64: ! 65: /*-----------------------------------------------------------------------*/ ! 66: /* ! 67: Pause emulation, stop sound ! 68: */ ! 69: void Main_PauseEmulation(void) ! 70: { ! 71: if( bEmulationActive ) ! 72: { ! 73: Audio_EnableAudio(FALSE); ! 74: bEmulationActive = FALSE; ! 75: } ! 76: } ! 77: ! 78: /*-----------------------------------------------------------------------*/ ! 79: /* ! 80: Start emulation ! 81: */ ! 82: void Main_UnPauseEmulation(void) ! 83: { ! 84: if( !bEmulationActive ) ! 85: { ! 86: Audio_EnableAudio(1); ! 87: bEmulationActive = TRUE; ! 88: } ! 89: } ! 90: ! 91: /* ----------------------------------------------------------------------- */ ! 92: /* ! 93: Message handler ! 94: Here we process the SDL events (keyboard, mouse, ...) and map it to ! 95: Atari IKBD events. ! 96: */ ! 97: void Main_EventHandler() ! 98: { ! 99: SDL_Event event; ! 100: ! 101: while (SDL_PollEvent (&event)) ! 102: switch( event.type ) ! 103: { ! 104: case SDL_QUIT: ! 105: bQuitProgram = TRUE; ! 106: SDL_Quit (); ! 107: exit (0); ! 108: break; ! 109: case SDL_MOUSEMOTION: /* Read/Update internal mouse position */ ! 110: input.motion_x += event.motion.xrel; ! 111: input.motion_y += event.motion.yrel; ! 112: input.abs_x = event.motion.x; ! 113: input.abs_y = event.motion.y; ! 114: break; ! 115: case SDL_MOUSEBUTTONDOWN: ! 116: Input_MousePress (event.button.button); ! 117: break; ! 118: case SDL_MOUSEBUTTONUP: ! 119: Input_MouseRelease (event.button.button); ! 120: break; ! 121: case SDL_KEYDOWN: ! 122: Keymap_KeyDown(&event.key.keysym); ! 123: break; ! 124: case SDL_KEYUP: ! 125: Keymap_KeyUp(&event.key.keysym); ! 126: break; ! 127: } ! 128: Input_Update (); ! 129: } ! 130: ! 131: ! 132: /*-----------------------------------------------------------------------*/ ! 133: /* ! 134: Check for any passed parameters ! 135: */ ! 136: void Main_ReadParameters(int argc, char *argv[]) ! 137: { ! 138: int i; ! 139: ! 140: /* Scan for any which we can use */ ! 141: for(i=1; i<argc; i++) ! 142: { ! 143: if (strlen(argv[i])>0) ! 144: { ! 145: if (!strcmp(argv[i],"--help") || !strcmp(argv[i],"-h")) ! 146: { ! 147: printf("Usage:\n frontier [options]\n" ! 148: "Where options are:\n" ! 149: " --help or -h Print this help text and exit.\n" ! 150: " --fullscreen or -f Try to use fullscreen mode.\n" ! 151: " --nosound Disable sound (faster!).\n" ! 152: " --size w h Start at specified window size.\n" ! 153: ); ! 154: exit(0); ! 155: } ! 156: else if (!strcmp(argv[i],"--fullscreen") || !strcmp(argv[i],"-f")) ! 157: { ! 158: bUseFullscreen=TRUE; ! 159: } ! 160: else if ( !strcmp(argv[i],"--nosound") ) ! 161: { ! 162: bDisableSound=TRUE; ! 163: } ! 164: else if ( !strcmp(argv[i],"--size") ) ! 165: { ! 166: screen_h = 0; ! 167: if (++i < argc) screen_w = atoi (argv[i]); ! 168: if (++i < argc) screen_h = atoi (argv[i]); ! 169: /* fe2 likes 1.6 aspect ratio until i fix the mouse position ! 170: * to 3d object position code... */ ! 171: if (screen_h == 0) screen_h = 5*screen_w/8; ! 172: } ! 173: else ! 174: { ! 175: /* some time make it possible to read alternative ! 176: * names for fe2.bin from command line */ ! 177: fprintf(stderr,"Illegal parameter: %s\n",argv[i]); ! 178: } ! 179: } ! 180: } ! 181: } ! 182: ! 183: ! 184: /*-----------------------------------------------------------------------*/ ! 185: /* ! 186: Initialise emulation ! 187: */ ! 188: void Main_Init(void) ! 189: { ! 190: /* Init SDL's video subsystem. Note: Audio and joystick subsystems ! 191: will be initialized later (failures there are not fatal). */ ! 192: if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) ! 193: { ! 194: fprintf(stderr, "Could not initialize the SDL library:\n %s\n", SDL_GetError() ); ! 195: exit(-1); ! 196: } ! 197: ! 198: Screen_Init(); ! 199: Init680x0(); /* Init CPU emulation */ ! 200: Audio_Init(); ! 201: Keymap_Init(); ! 202: ! 203: if(bQuitProgram) ! 204: { ! 205: SDL_Quit(); ! 206: exit(-2); ! 207: } ! 208: } ! 209: ! 210: ! 211: /*-----------------------------------------------------------------------*/ ! 212: /* ! 213: Un-Initialise emulation ! 214: */ ! 215: void Main_UnInit(void) ! 216: { ! 217: Audio_UnInit(); ! 218: Screen_UnInit(); ! 219: ! 220: /* SDL uninit: */ ! 221: SDL_Quit(); ! 222: } ! 223: ! 224: static Uint32 vbl_callback () ! 225: { ! 226: FlagException (0); ! 227: return 20; ! 228: } ! 229: ! 230: void sig_handler (int signum) ! 231: { ! 232: if (signum == SIGSEGV) { ! 233: printf ("Segfault! All is lost! Abandon ship!\n"); ! 234: Call_DumpDebug (); ! 235: abort (); ! 236: } ! 237: } ! 238: ! 239: /*-----------------------------------------------------------------------*/ ! 240: /* ! 241: Main ! 242: */ ! 243: int main(int argc, char *argv[]) ! 244: { ! 245: signal (SIGSEGV, sig_handler); ! 246: ! 247: /* Generate random seed */ ! 248: srand( time(NULL) ); ! 249: ! 250: /* Check for any passed parameters */ ! 251: Main_ReadParameters(argc, argv); ! 252: ! 253: /* Init emulator system */ ! 254: Main_Init(); ! 255: ! 256: /* Switch immediately to fullscreen if user wants to */ ! 257: if( bUseFullscreen ) ! 258: Screen_ToggleFullScreen(); ! 259: ! 260: SDL_AddTimer (20, &vbl_callback, NULL); ! 261: ! 262: /* Run emulation */ ! 263: Main_UnPauseEmulation(); ! 264: Start680x0(); /* Start emulation */ ! 265: ! 266: /* Un-init emulation system */ ! 267: Main_UnInit(); ! 268: ! 269: return(0); ! 270: } ! 271: ! 272:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.