nkeynes@30: /** nkeynes@470: * $Id: main.c,v 1.33 2007-10-28 08:29:29 nkeynes Exp $ nkeynes@30: * nkeynes@30: * Main program, initializes dreamcast and gui, then passes control off to nkeynes@30: * the gtk main loop (currently). nkeynes@30: * nkeynes@30: * FIXME: Remove explicit GTK/Gnome references from this file nkeynes@30: * nkeynes@30: * Copyright (c) 2005 Nathan Keynes. nkeynes@30: * nkeynes@30: * This program is free software; you can redistribute it and/or modify nkeynes@30: * it under the terms of the GNU General Public License as published by nkeynes@30: * the Free Software Foundation; either version 2 of the License, or nkeynes@30: * (at your option) any later version. nkeynes@30: * nkeynes@30: * This program is distributed in the hope that it will be useful, nkeynes@30: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@30: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@30: * GNU General Public License for more details. nkeynes@1: */ nkeynes@1: nkeynes@68: #include nkeynes@94: #include nkeynes@27: #include "dream.h" nkeynes@450: #include "config.h" nkeynes@105: #include "syscall.h" nkeynes@422: #include "mem.h" nkeynes@27: #include "dreamcast.h" nkeynes@422: #include "display.h" nkeynes@422: #include "loader.h" nkeynes@450: #include "gui.h" nkeynes@106: #include "aica/audio.h" nkeynes@422: #include "gdrom/gdrom.h" nkeynes@144: #include "maple/maple.h" nkeynes@422: #include "sh4/sh4core.h" nkeynes@11: nkeynes@77: #define S3M_PLAYER "s3mplay.bin" nkeynes@77: nkeynes@414: char *option_list = "a:m:s:A:V:puhbd:c:t:xD"; nkeynes@94: struct option longopts[1] = { { NULL, 0, 0, 0 } }; nkeynes@68: char *aica_program = NULL; nkeynes@77: char *s3m_file = NULL; nkeynes@144: char *disc_file = NULL; nkeynes@144: char *display_driver_name = "gtk"; nkeynes@106: char *audio_driver_name = "esd"; nkeynes@68: gboolean start_immediately = FALSE; nkeynes@77: gboolean headless = FALSE; nkeynes@87: gboolean without_bios = FALSE; nkeynes@402: gboolean use_xlat = TRUE; nkeynes@392: gboolean show_debugger = FALSE; nkeynes@372: uint32_t time_secs = 0; nkeynes@372: uint32_t time_nanos = 0; nkeynes@414: extern uint32_t sh4_cpu_multiplier; nkeynes@68: nkeynes@106: audio_driver_t audio_driver_list[] = { &audio_null_driver, nkeynes@106: &audio_esd_driver, nkeynes@106: NULL }; nkeynes@106: nkeynes@144: display_driver_t display_driver_list[] = { &display_null_driver, nkeynes@144: &display_gtk_driver, nkeynes@144: NULL }; nkeynes@106: nkeynes@30: int main (int argc, char *argv[]) nkeynes@1: { nkeynes@106: int opt, i; nkeynes@372: double t; nkeynes@1: #ifdef ENABLE_NLS nkeynes@68: bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); nkeynes@68: textdomain (PACKAGE); nkeynes@1: #endif nkeynes@435: gboolean ui_initialized = gui_parse_cmdline(&argc, &argv); nkeynes@464: nkeynes@94: while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) { nkeynes@68: switch( opt ) { nkeynes@68: case 'a': /* AICA only mode - argument is an AICA program */ nkeynes@68: aica_program = optarg; nkeynes@68: break; nkeynes@144: case 'c': /* Config file */ nkeynes@450: lxdream_set_config_filename(optarg); nkeynes@144: break; nkeynes@144: case 'd': /* Mount disc */ nkeynes@144: disc_file = optarg; nkeynes@144: break; nkeynes@392: case 'D': /* Launch w/ debugger */ nkeynes@392: show_debugger = TRUE; nkeynes@392: break; nkeynes@414: case 'm': /* Set SH4 CPU clock multiplier (default 0.5) */ nkeynes@414: t = strtod(optarg, NULL); nkeynes@414: sh4_cpu_multiplier = (int)(1000.0/t); nkeynes@414: break; nkeynes@77: case 's': /* AICA-only w/ S3M player */ nkeynes@77: aica_program = S3M_PLAYER; nkeynes@77: s3m_file = optarg; nkeynes@77: break; nkeynes@68: case 'A': /* Audio driver */ nkeynes@106: audio_driver_name = optarg; nkeynes@68: break; nkeynes@68: case 'V': /* Video driver */ nkeynes@144: display_driver_name = optarg; nkeynes@68: break; nkeynes@68: case 'p': /* Start immediately */ nkeynes@68: start_immediately = TRUE; nkeynes@77: break; nkeynes@209: case 'u': /* Allow unsafe dcload syscalls */ nkeynes@209: dcload_set_allow_unsafe(TRUE); nkeynes@182: break; nkeynes@87: case 'b': /* No BIOS */ nkeynes@87: without_bios = TRUE; nkeynes@87: break; nkeynes@77: case 'h': /* Headless */ nkeynes@77: headless = TRUE; nkeynes@77: break; nkeynes@372: case 't': /* Time limit */ nkeynes@372: t = strtod(optarg, NULL); nkeynes@372: time_secs = (uint32_t)t; nkeynes@372: time_nanos = (int)((t - time_secs) * 1000000000); nkeynes@379: break; nkeynes@402: case 'x': /* Disable translator */ nkeynes@402: use_xlat = FALSE; nkeynes@379: break; nkeynes@68: } nkeynes@68: } nkeynes@30: nkeynes@450: lxdream_load_config( ); nkeynes@144: nkeynes@68: if( aica_program == NULL ) { nkeynes@435: dreamcast_init(); nkeynes@68: } else { nkeynes@68: dreamcast_configure_aica_only(); nkeynes@68: mem_load_block( aica_program, 0x00800000, 2048*1024 ); nkeynes@77: if( s3m_file != NULL ) { nkeynes@77: mem_load_block( s3m_file, 0x00810000, 2048*1024 - 0x10000 ); nkeynes@77: } nkeynes@68: } nkeynes@1: nkeynes@87: if( without_bios ) { nkeynes@87: bios_install(); nkeynes@105: dcload_install(); nkeynes@87: } nkeynes@106: nkeynes@106: for( i=0; audio_driver_list[i] != NULL; i++ ) { nkeynes@106: if( strcasecmp( audio_driver_list[i]->name, audio_driver_name ) == 0 ) { nkeynes@111: if( audio_set_driver( audio_driver_list[i], 44100, AUDIO_FMT_16ST ) == FALSE ) { nkeynes@111: audio_set_driver( &audio_null_driver, 44100, AUDIO_FMT_16ST ); nkeynes@111: } nkeynes@106: break; nkeynes@106: } nkeynes@106: nkeynes@106: } nkeynes@106: if( audio_driver_list[i] == NULL ) { nkeynes@106: ERROR( "Audio driver '%s' not found, using null driver", audio_driver_name ); nkeynes@106: audio_set_driver( &audio_null_driver, 44100, AUDIO_FMT_16ST ); nkeynes@106: } nkeynes@106: nkeynes@106: if( headless ) { nkeynes@144: display_set_driver( &display_null_driver ); nkeynes@106: } else { nkeynes@435: gui_init(show_debugger); nkeynes@435: nkeynes@370: gboolean initialized = FALSE; nkeynes@144: for( i=0; display_driver_list[i] != NULL; i++ ) { nkeynes@144: if( strcasecmp( display_driver_list[i]->name, display_driver_name ) == 0 ) { nkeynes@370: initialized = display_set_driver( display_driver_list[i] ); nkeynes@106: break; nkeynes@106: } nkeynes@106: } nkeynes@370: if( !initialized ) { nkeynes@370: if( display_driver_list[i] == NULL ) { nkeynes@370: ERROR( "Video driver '%s' not found, using null driver", display_driver_name ); nkeynes@370: } else { nkeynes@370: ERROR( "Video driver '%s' failed to initialize, falling back to null driver", display_driver_name ); nkeynes@370: } nkeynes@144: display_set_driver( &display_null_driver ); nkeynes@106: } nkeynes@106: } nkeynes@106: nkeynes@144: maple_reattach_all(); nkeynes@180: INFO( "%s! ready...", APP_NAME ); nkeynes@446: nkeynes@446: for( ; optind < argc; optind++ ) { nkeynes@469: gboolean ok = gdrom_menu_open_file(argv[optind]); nkeynes@446: if( !ok ) { nkeynes@446: ok = file_load_magic( argv[optind] ); nkeynes@446: } nkeynes@446: if( !ok ) { nkeynes@446: ERROR( "Unrecognized file '%s'", argv[optind] ); nkeynes@446: } nkeynes@446: start_immediately = ok; nkeynes@94: } nkeynes@94: nkeynes@144: if( disc_file != NULL ) { nkeynes@470: gdrom_menu_open_file( disc_file ); nkeynes@144: } nkeynes@144: nkeynes@464: if( gdrom_get_current_disc() == NULL ) { nkeynes@464: disc_file = lxdream_get_config_value( CONFIG_GDROM ); nkeynes@464: if( disc_file != NULL ) { nkeynes@469: gdrom_menu_open_file( disc_file ); nkeynes@464: } nkeynes@464: } nkeynes@464: nkeynes@379: sh4_set_use_xlat( use_xlat ); nkeynes@379: nkeynes@372: if( start_immediately ) { nkeynes@372: if( time_nanos != 0 || time_secs != 0 ) { nkeynes@372: dreamcast_run_for(time_secs, time_nanos); nkeynes@372: return 0; nkeynes@372: } else { nkeynes@372: dreamcast_run(); nkeynes@372: } nkeynes@372: } nkeynes@77: if( !headless ) { nkeynes@435: gui_main_loop(); nkeynes@77: } nkeynes@68: return 0; nkeynes@1: } nkeynes@1: