#!/usr/bin/perl -w
############################################################################
#vbafe (V-Buffy) is Copyright (C) 2003 Derrick Wirth (Sypherce).
############################################################################
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
############################################################################
#Refer to gpl.txt for information on the GNU GPL license.
############################################################################
#Contact me at sypherce@softhome.net
############################################################################
use IO::File;
use Gtk;
use strict;	

set_locale Gtk;
init Gtk;

#Arrays
my @settingsarray;
#Check Buttons		
my $agbprintcheckbutton = new Gtk::CheckButton("AGB Print");
my $debugcheckbutton = new Gtk::CheckButton("Debug");
my $inactivitypausecheckbutton = new Gtk::CheckButton("Inactivity Pause");
my $mmxcheckbutton = new Gtk::CheckButton("MMX");
my $rtccheckbutton = new Gtk::CheckButton("RTC");
#Combo Selections
my $filtercombo = new Gtk::Combo();
my $flashsizecombo = new Gtk::Combo();
my $frameskipcombo = new Gtk::Combo();
my $gdbcombo = new Gtk::Combo();
my $interframeblendingcombo = new Gtk::Combo();
my $savetypecombo = new Gtk::Combo();
my $sizecombo = new Gtk::Combo();
my $showspeedcombo = new Gtk::Combo();
my $throttlecombo = new Gtk::Combo();
my $verbosecombo = new Gtk::Combo();
my $yuvcombo = new Gtk::Combo();
#Entry Boxs
my $biosentry = new Gtk::Entry();
my $ipsentry = new Gtk::Entry();
my $romentry = new Gtk::Entry();
#Open Buttons
my $openbios = new Gtk::FileSelection("Open BIOS...");
my $openips = new Gtk::FileSelection("Open IPS...");
my $openrom = new Gtk::FileSelection("Open ROM...");
my $openvisualboyadvance = new Gtk::FileSelection("Open VisualBoy Advance...");
#Other
my $button;
my $false = 0;
my $frame;
my $hbox1 = new Gtk::HBox($false, 8);
my $hbox2 = new Gtk::HBox($false, 8);
my $hbox3 = new Gtk::HBox($false, 8);
my $hbox4 = new Gtk::HBox($false, 8);
my $homedir = $ENV{HOME};
my $label;
my $settingsfile;
my $true = 1;
my $vbox1 = new Gtk::VBox($false, 8);
my $vbox2 = new Gtk::VBox($false, 8);
my $vbox3 = new Gtk::VBox($false, 8);
my $vbox4 = new Gtk::VBox($false, 8);
my $window = new Gtk::Window("toplevel");
my $vbaexe = "/usr/bin/VisualBoyAdvance";
my $version = "0.1a";
#Strings
my $agbprintstring;
my $biosstring;
my $debugstring;
my $filterstring;
my $flashsizestring;
my $frameskipstring;
my $gdbstring;
my $inactivitypausestring;
my $interframeblendingstring;
my $ipspatchstring;
my $ipsstring;
my $mmxstring;
my $romstring;
my $romimagestring;
my $rtcstring;
my $savetypestring;
my $sizestring;
my $showspeedstring;
my $throttlestring;
my $verbosestring;
my $versionstring;
my $visualboyadvancestring;
my $yuvstring;

# Create the window
$window->signal_connect("destroy", \&destroywindow);
$window->set_title("vbafe (v0.1a)");
$window->add($hbox1);
$hbox1->pack_start($vbox1, $false, $false, 0);
$window->border_width(8);

# biosentry start
$frame = new Gtk::Frame("BIOS Image");
$frame->add($hbox2);
$hbox2->pack_start($vbox2, $false, $false, 0);
# $biosentry->border_width (4);
$vbox2->pack_start($biosentry, $false, $false, 0);
$vbox2 = new Gtk::VBox($false, 8);
$hbox2->pack_start($vbox2, $false, $false, 0);
$button = new Gtk::Button();
$button->signal_connect("clicked", \&DotDotDot1);
$label = new Gtk::Label("...");
$button->add($label);
#$button->border_width (4);
$vbox2->pack_start($button, $false, $false, 0);
$vbox1->pack_start($frame, $false, $false, 0);
# biosentry end

# flashsizecombo start
$flashsizecombo->border_width (4);
$flashsizecombo->set_popdown_strings("None", "64K", "128K");
$flashsizecombo->set_use_arrows($true);
$frame = new Gtk::Frame("Flash Size");
$frame->add($flashsizecombo);
$vbox1->pack_start($frame, $false, $false, 0);
# flashsizecombo end

# gdbcombo start
$gdbcombo->border_width (4);
$gdbcombo->set_popdown_strings("None", "tcp", "tcp:PORT", "pipe");
$gdbcombo->set_use_arrows($true);

$frame = new Gtk::Frame("GDB");
$frame->add($gdbcombo);

$vbox1->pack_start($frame, $false, $false, 0);
# gdbcombo end

$hbox3->pack_start($vbox3, $false, $false, 0);

# ipsentry start
$frame = new Gtk::Frame("IPS Patch");
$frame->add($hbox3);
#!$hbox3->pack_start($vbox3, $false, $false, 0);
# $ipsentry->border_width (4);
$vbox3->pack_start($ipsentry, $false, $false, 0);
$vbox3 = new Gtk::VBox($false, 8);
$hbox3->pack_start($vbox3, $false, $false, 0);
$button = new Gtk::Button();
$button->signal_connect("clicked", \&DotDotDot2);
$label = new Gtk::Label("...");
$button->add($label);
#$button->border_width (4);
$vbox3->pack_start($button, $false, $false, 0);
$vbox1->pack_start($frame, $false, $false, 0);
# ipsentry end

# savetypecombo start
$savetypecombo->border_width (4);
$savetypecombo->set_popdown_strings("Automatic", "EEPROM", "SRAM", "FLASH", "EEPROM+Sensor", "None");
$savetypecombo->set_use_arrows($true);
$frame = new Gtk::Frame("Save Type");
$frame->add($savetypecombo);
$vbox1->pack_start($frame, $false, $false, 0);
# savetypecombo end

# sizecombo start
$sizecombo->border_width (4);
$sizecombo->set_popdown_strings("1x", "2x", "3x", "4x", "1x Full Screen", "2x Full Screen", "3x Full Screen", "4x Full Screen");
$sizecombo->set_use_arrows($true);
$frame = new Gtk::Frame("Size");
$frame->add($sizecombo);
$vbox1->pack_start($frame, $false, $false, 0);
# sizecombo end

# verbosecombo start
$verbosecombo->border_width (4);
$verbosecombo->set_popdown_strings("None", "SWI", "Unaligned memory access", "Illegal memory write", "Illegal memory read", "DMA 0", "DMA 1", "DMA 2", "DMA 3", "Undefined instruction", "AGBPrint messages");
$verbosecombo->set_use_arrows($true);
$frame = new Gtk::Frame("Verbose");
$frame->add($verbosecombo);
$vbox1->pack_start($frame, $false, $false, 0);
# verbosecombo end

$agbprintcheckbutton->show();
$inactivitypausecheckbutton->show();
$rtccheckbutton->show();
$vbox1->pack_start($agbprintcheckbutton, $false, $false, 0);
$vbox1->pack_start($inactivitypausecheckbutton, $false, $false, 0);
$vbox1->pack_start($rtccheckbutton, $false, $false, 0);
$vbox1 = new Gtk::VBox($false, 8);
$hbox1->pack_start($vbox1, $false, $false, 0);

# filtercombo start
$filtercombo->border_width (4);
$filtercombo->set_popdown_strings("None", "TV Mode", "2xSaI", "Super 2xSaI", "Super Eagle", "Pixelate", "Motion Blur", "AdvanceMAME Scale2x", "Simple2x", "Bilinear", "Bilinear Plus", "Scanlines");
$filtercombo->set_use_arrows($true);
$frame = new Gtk::Frame("Filter");
$frame->add($filtercombo);
$vbox1->pack_start($frame, $false, $false, 0);
# filtercombo end

# frameskipcombo start
$frameskipcombo->border_width (4);
$frameskipcombo->set_popdown_strings("Automatic", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
$frameskipcombo->set_use_arrows($true);
$frame = new Gtk::Frame("Frame Skip");
$frame->add($frameskipcombo);
$vbox1->pack_start($frame, $false, $false, 0);
# frameskipcombo end

# interframeblendingcombo start
$interframeblendingcombo->border_width (4);
$interframeblendingcombo->set_popdown_strings("None", "Motion-Blur", "Smart");
$interframeblendingcombo->set_use_arrows($true);
$frame = new Gtk::Frame("Interframe Blending");
$frame->add($interframeblendingcombo);
$vbox1->pack_start($frame, $false, $false, 0);
# interframeblendingcombo end

# romentry start
$frame = new Gtk::Frame("ROM Image");
$frame->add($hbox4);
$hbox4->pack_start($vbox4, $false, $false, 0);
# $romentry->border_width (4);
$vbox4->pack_start($romentry, $false, $false, 0);
$vbox4 = new Gtk::VBox($false, 8);
$hbox4->pack_start($vbox4, $false, $false, 0);
$button = new Gtk::Button();
$button->signal_connect("clicked", \&DotDotDot3);
$label = new Gtk::Label("...");
$button->add($label);
#$button->border_width (4);
$vbox4->pack_start($button, $false, $false, 0);
$vbox1->pack_start($frame, $false, $false, 0);
# romentry end

# showspeedcombo start
$showspeedcombo->border_width (4);
$showspeedcombo->set_popdown_strings("Normal", "Detailed", "None");
$showspeedcombo->set_use_arrows($true);
$frame = new Gtk::Frame("Show Speed");
$frame->add($showspeedcombo);
$vbox1->pack_start($frame, $false, $false, 0);
# showspeedcombo end

# throttlecombo start
$throttlecombo->border_width (4);
$throttlecombo->set_popdown_strings("None", "0", "1", "5", "10", "25", "50", "100", "1000");
$throttlecombo->set_use_arrows($true);
$frame = new Gtk::Frame("Throttle");
$frame->add($throttlecombo);
$vbox1->pack_start($frame, $false, $false, 0);
# throttlecombo end

# yuvcombo start
$yuvcombo->border_width (4);
$yuvcombo->set_popdown_strings("None", "YV12", "UYVY", "YVYU", "YUY2", "IYUV");
$yuvcombo->set_use_arrows($true);
$frame = new Gtk::Frame("YUV");
$frame->add($yuvcombo);
$vbox1->pack_start($frame, $false, $false, 0);
# yuvcombo end

$debugcheckbutton->show();
$vbox1->pack_start($debugcheckbutton, $false, $false, 0);
$mmxcheckbutton->set_active($true);
$mmxcheckbutton->show();
$vbox1->pack_start($mmxcheckbutton, $false, $false, 0);

# executebutton start
$button = new Gtk::Button();
$button->signal_connect("clicked", \&ClickedButtonEvent);
$label = new Gtk::Label("Execute");
$button->add($label);
$button->border_width (4);	
$button->can_default($true);
$vbox1->pack_start($button, $false, $false, 0);
# button1 end

# Load the settings
if (-s "$homedir/.vbafe")
{
  $settingsfile = new IO::File "$homedir/.vbafe";
  {
    @settingsarray = readline $settingsfile;
  }
  close($settingsfile);
  chop($settingsarray[0]);
  chop($settingsarray[1]);
  chop($settingsarray[2]);
  chop($settingsarray[3]);
  chop($settingsarray[4]);
  chop($settingsarray[5]);
  chop($settingsarray[6]);
  chop($settingsarray[7]);
  chop($settingsarray[8]);
  chop($settingsarray[9]);
  chop($settingsarray[10]);
  chop($settingsarray[11]);
  chop($settingsarray[12]);
  chop($settingsarray[13]);
  chop($settingsarray[14]);
  chop($settingsarray[15]);
  chop($settingsarray[16]);
  chop($settingsarray[17]);
  chop($settingsarray[18]);
  chop($settingsarray[19]);
  $versionstring = $settingsarray[0];
  if ($versionstring =~ "0.1a")
  {
    $agbprintcheckbutton->set_active($settingsarray[1]);
    $biosentry->set_text($settingsarray[2]);
    $debugcheckbutton->set_active($settingsarray[3]);
    $filtercombo->entry->set_text($settingsarray[4]);
    $flashsizecombo->entry->set_text($settingsarray[5]);
    $frameskipcombo->entry->set_text($settingsarray[6]);
    $gdbcombo->entry->set_text($settingsarray[7]);
    $inactivitypausecheckbutton->set_active($settingsarray[8]);
    $interframeblendingcombo->entry->set_text($settingsarray[9]);
    $ipsentry->set_text($settingsarray[10]);
    $mmxcheckbutton->set_active($settingsarray[11]);
    $romentry->set_text($settingsarray[12]);
    $rtccheckbutton->set_active($settingsarray[13]);
    $savetypecombo->entry->set_text($settingsarray[14]);
    $showspeedcombo->entry->set_text($settingsarray[15]);
    $sizecombo->entry->set_text($settingsarray[16]);
    $throttlecombo->entry->set_text($settingsarray[17]);
    $verbosecombo->entry->set_text($settingsarray[18]);
    $visualboyadvancestring = $settingsarray[19];
    $yuvcombo->entry->set_text($settingsarray[20]);
  }
  else
  {
    $agbprintcheckbutton->set_active($settingsarray[14]);
    $biosentry->set_text($settingsarray[0]);
    $debugcheckbutton->set_active($settingsarray[15]);
    $filtercombo->entry->set_text($settingsarray[9]);
    $flashsizecombo->entry->set_text($settingsarray[3]);
    $frameskipcombo->entry->set_text($settingsarray[10]);
    $gdbcombo->entry->set_text($settingsarray[4]);
    $inactivitypausecheckbutton->set_active($settingsarray[17]);
    $interframeblendingcombo->entry->set_text($settingsarray[11]);
    $ipsentry->set_text($settingsarray[1]);
    $mmxcheckbutton->set_active($settingsarray[16]);
    $romentry->set_text($settingsarray[2]);
    $rtccheckbutton->set_active($settingsarray[18]);
    $savetypecombo->entry->set_text($settingsarray[5]);
    $showspeedcombo->entry->set_text($settingsarray[12]);
    $sizecombo->entry->set_text($settingsarray[6]);
    $throttlecombo->entry->set_text($settingsarray[7]);
    $verbosecombo->entry->set_text($settingsarray[13]);
    $yuvcombo->entry->set_text($settingsarray[8]);
  }
  if (-e $vbaexe)
  {
    $visualboyadvancestring = $vbaexe
  }
  elsif ($visualboyadvancestring =~ "")
  {
    $openvisualboyadvance->ok_button->signal_connect("clicked", sub {  $visualboyadvancestring = $openvisualboyadvance->get_filename(); $openvisualboyadvance->hide; }, $openvisualboyadvance);
    $openvisualboyadvance->cancel_button->signal_connect("clicked", sub { $openips->hide; });
    $openvisualboyadvance->show();#popup window
  }
  elsif (-e $visualboyadvancestring)
  {
  }
  else
  {
    $openvisualboyadvance->ok_button->signal_connect("clicked", sub {  $visualboyadvancestring = $openvisualboyadvance->get_filename(); $openvisualboyadvance->hide; }, $openvisualboyadvance);
    $openvisualboyadvance->cancel_button->signal_connect("clicked", sub { $openips->hide; });
    $openvisualboyadvance->show();#popup window
  }
}

# Show the window
$window->show_all();

main Gtk;
exit(0);

# END FORM

sub DotDotDot1
{
  $openbios->ok_button->signal_connect("clicked", sub { $biosentry->set_text($openbios->get_filename()); $openbios->hide; }, $openbios);
  $openbios->cancel_button->signal_connect("clicked", sub { $openbios->hide; });
  $openbios->set_filename( $biosentry->get_text() );
  $openbios->complete( "*" );
  $openbios->show();
}

sub DotDotDot2
{
  $openips->ok_button->signal_connect("clicked", sub { $ipsentry->set_text($openips->get_filename()); $openips->hide; }, $openips);
  $openips->cancel_button->signal_connect("clicked", sub { $openips->hide; });
  $openips->set_filename( $ipsentry->get_text() );
  $openips->complete( "*.ips" );
  $openips->show();
}

sub DotDotDot3
{
  $openrom->ok_button->signal_connect( "clicked", sub { $romentry->set_text($openrom->get_filename()); $openrom->hide; }, $openrom);
  $openrom->cancel_button->signal_connect("clicked", sub { $openrom->hide; });
  $openrom->set_filename( $romentry->get_text() );
  $openrom->complete( "*" );
  $openrom->show();
}

sub destroywindow
{
  $agbprintstring = $agbprintcheckbutton->get_active();
  $biosstring = $biosentry->get_text();
  $debugstring = $debugcheckbutton->get_active();
  $filterstring = $filtercombo->entry->get_text();
  $flashsizestring = $flashsizecombo->entry->get_text();
  $frameskipstring = $frameskipcombo->entry->get_text();
  $gdbstring = $gdbcombo->entry->get_text();
  $inactivitypausestring = $inactivitypausecheckbutton->get_active();
  $interframeblendingstring = $interframeblendingcombo->entry->get_text();
  $ipsstring = $ipsentry->get_text();
  $mmxstring = $mmxcheckbutton->get_active();
  $romstring = $romentry->get_text();
  $rtcstring = $rtccheckbutton->get_active();
  $savetypestring = $savetypecombo->entry->get_text();
  $showspeedstring = $showspeedcombo->entry->get_text();
  $sizestring = $sizecombo->entry->get_text();
  $throttlestring = $throttlecombo->entry->get_text();
  $verbosestring = $verbosecombo->entry->get_text();
  $yuvstring = $yuvcombo->entry->get_text();
  unlink "$homedir/.vbafe";
  $settingsfile = new IO::File ">>$homedir/.vbafe";
  {
    if ($agbprintstring =~ "1")
    {
    }
    else
    {
      $agbprintstring = 0
    }
    if ($debugstring =~ "1")
    {
    }
    else
    {
      $debugstring = 0
    }
    if ($inactivitypausestring =~ "1")
    {
    }
    else
    {
      $inactivitypausestring = 0
    }
    if ($mmxstring =~ "1")
    {
    }
    else
    {
      $mmxstring = 0
    }
    if ($rtcstring =~ "1")
    {
    }
    else
    {
      $rtcstring = 0
    }
    print $settingsfile "$version\n$agbprintstring\n$biosstring\n$debugstring\n$filterstring\n$flashsizestring\n$frameskipstring\n$gdbstring\n$inactivitypausestring\n$interframeblendingstring\n$ipsstring\n$mmxstring\n$romstring\n$rtcstring\n$savetypestring\n$showspeedstring\n$sizestring\n$throttlestring\n$verbosestring\n$visualboyadvancestring\n$yuvstring"
  }
  close($settingsfile);
  Gtk->exit(0);
}

sub ClickedButtonEvent
{
  $biosstring = $biosentry->get_text();
  $ipsstring = $ipsentry->get_text();
  $romstring = $romentry->get_text();
  $flashsizestring = $flashsizecombo->entry->get_text();
  $gdbstring = $gdbcombo->entry->get_text();
  $savetypestring = $savetypecombo->entry->get_text();
  $sizestring = $sizecombo->entry->get_text();
  $throttlestring = $throttlecombo->entry->get_text();
  $yuvstring = $yuvcombo->entry->get_text();
  $filterstring = $filtercombo->entry->get_text();
  $frameskipstring = $frameskipcombo->entry->get_text();
  $interframeblendingstring = $interframeblendingcombo->entry->get_text();
  $showspeedstring = $showspeedcombo->entry->get_text();
  $verbosestring = $verbosecombo->entry->get_text();
  $agbprintstring = $agbprintcheckbutton->get_active();
  $debugstring = $debugcheckbutton->get_active();
  $mmxstring = $mmxcheckbutton->get_active();
  $inactivitypausestring = $inactivitypausecheckbutton->get_active();
  $rtcstring = $rtccheckbutton->get_active();
  if ($flashsizestring =~ "64K")
  {
    $flashsizestring = "--flash-64k";
  }
  elsif ($flashsizestring =~ "128K")
  {
    $flashsizestring = "--flash-128k";
  }
  else
  {
    $flashsizestring = "";
  }

  if ($savetypestring =~ "Automatic")
  {
    $savetypestring = "--save-auto";
  }
  elsif ($savetypestring =~ "EEPROM")
  {
    $savetypestring = "--save-eeprom";
  }
  elsif ($savetypestring =~ "SRAM")
  {
    $savetypestring = "--save-sram";
  }
  elsif ($savetypestring =~ "FLASH")
  {
    $savetypestring = "--save-flash";
  }
  elsif ($savetypestring =~ "EEPROM+Sensor")
  {
    $savetypestring = "--save-sensor";
  }
  else
  {
    $savetypestring = "--save-none";
  }

  if ($sizestring =~ "1x Full Screen")
  {
    $sizestring = "--video-1x --fullscreen";
  }
  elsif ($sizestring =~ "2x Full Screen")
  {
    $sizestring = "--video-2x --fullscreen";
  }
  elsif ($sizestring =~ "3x Full Screen")
  {
    $sizestring = "--video-3x --fullscreen";
  }
  elsif ($sizestring =~ "4x Full Screen")
  {
    $sizestring = "--video-4x --fullscreen";
  }
  elsif ($sizestring =~ "2x")
  {
    $sizestring = "--video-2x";
  }
  elsif ($sizestring =~ "3x")
  {
    $sizestring = "--video-3x";
  }
  elsif ($sizestring =~ "4x")
  {
    $sizestring = "--video-4x";
  }
  else
  {
    $sizestring = "--video-1x";
  }

  if ($filterstring =~ "TV Mode")
  {
    $filterstring = "--filter-tv-mode";
  }
  elsif ($filterstring =~ "2xSaI")
  {
    $filterstring = "--filter-2xsai";
  }
  elsif ($filterstring =~ "Super 2xSaI")
  {
    $filterstring = "--filter-super-2xsai";
  }
  elsif ($filterstring =~ "Super Eagle")
  {
    $filterstring = "--filter-super-eagle";
  }
  elsif ($filterstring =~ "Pixelate")
  {
    $filterstring = "--filter-pixelate";
  }
  elsif ($filterstring =~ "Motion Blur")
  {
    $filterstring = "--filter-motion-blur";
  }
  elsif ($filterstring =~ "AdvanceMAME Scale2x")
  {
    $filterstring = "--filter-advmame";
  }
  elsif ($filterstring =~ "Simple2x")
  {
    $filterstring = "--filter-simple2x";
  }
  elsif ($filterstring =~ "Bilinear")
  {
    $filterstring = "--filter-bilinear";
  }
  elsif ($filterstring =~ "Bilinear Plus")
  {
    $filterstring = "--filter-bilinear+";
  }
  elsif ($filterstring =~ "Scanlines")
  {
    $filterstring = "--filter-scanlines";
  }
  else
  {
    $filterstring = "--filter-normal";
  }

  if ($frameskipstring =~ "Automatic")
  {
    $frameskipstring = "--auto-frameskip";
  }
  elsif ($frameskipstring =~ "0")
  {
    $frameskipstring = "--frameskip=0";
  }
  elsif ($frameskipstring =~ "1")
  {
    $frameskipstring = "--frameskip=1";
  }
  elsif ($frameskipstring =~ "2")
  {
    $frameskipstring = "--frameskip=2";
  }
  elsif ($frameskipstring =~ "3")
  {
    $frameskipstring = "--frameskip=3";
  }
  elsif ($frameskipstring =~ "4")
  {
    $frameskipstring = "--frameskip=4";
  }
  elsif ($frameskipstring =~ "5")
  {
    $frameskipstring = "--frameskip=5";
  }
  elsif ($frameskipstring =~ "6")
  {
    $frameskipstring = "--frameskip=6";
  }
  elsif ($frameskipstring =~ "7")
  {
    $frameskipstring = "--frameskip=7";
  }
  elsif ($frameskipstring =~ "8")
  {
    $frameskipstring = "--frameskip=8";
  }
  elsif ($frameskipstring =~ "9")
  {
    $frameskipstring = "--frameskip=9";
  }

  if ($gdbstring =~ "None")
  {
    $gdbstring = "";
  }
  elsif ($gdbstring =~ "tcp:PORT")
  {
    $gdbstring = "--gdb=tcp";
  }
  else
  {
    $gdbstring = "--gdb=$gdbstring";
  }

  if ($interframeblendingstring =~ "Motion-Blur")
  {
    $interframeblendingstring = "--ifb-motion-blur";
  }
  elsif ($interframeblendingstring =~ "Smart")
  {
    $interframeblendingstring = "--ifb-smart";
  }
  else
  {
    $interframeblendingstring = "--ifb-none";
  }

  if ($showspeedstring =~ "Detailed")
  {
    $showspeedstring = "--show-speed-detailed";
  }
  elsif ($showspeedstring =~ "None")
  {
    $showspeedstring = "--no-show-speed";
  }
  else
  {
    $showspeedstring = "--show-speed-normal";
  }

  if ($throttlestring =~ "None")
  {
    $throttlestring = "--no-throttle";
  }
  else
  {
    $throttlestring = "--throttle=$throttlestring";
  }

  if ($verbosestring =~ "None")
  {
    $verbosestring = "";
  }
  elsif ($verbosestring =~ "SWI")
  {
    $verbosestring = "--verbose=0";
  }
  elsif  ($verbosestring =~ "Unaligned memory access")
  {
    $verbosestring = "--verbose=1";
  }
  elsif  ($verbosestring =~ "Illegal memory write")
  {
    $verbosestring = "--verbose=2";
  }
  elsif  ($verbosestring =~ "Illegal memory read")
  {
    $verbosestring = "--verbose=3";
  }
  elsif  ($verbosestring =~ "DMA 0")
  {
    $verbosestring = "--verbose=4";
  }
  elsif  ($verbosestring =~ "DMA 1")
  {
    $verbosestring = "--verbose=5";
  }
  elsif  ($verbosestring =~ "DMA 2")
  {
    $verbosestring = "--verbose=6";
  }
  elsif  ($verbosestring =~ "DMA 3")
  {
    $verbosestring = "--verbose=7";
  }
  elsif  ($verbosestring =~ "Undefined instruction")
  {
    $verbosestring = "--verbose=8";
  }
  elsif  ($verbosestring =~ "AGBPrint messages")
  {
    $verbosestring = "--verbose=9";
  }

  if ($yuvstring =~ "None")
  {
    $yuvstring = "";
  }
  elsif ($yuvstring =~ "YV12")
  {
    $yuvstring = "--yuv=0";
  }
  elsif ($yuvstring =~ "UYVY")
  {
    $yuvstring = "--yuv=1";
  }
  elsif ($yuvstring =~ "YVYU")
  {
    $yuvstring = "--yuv=2";
  }
  elsif ($yuvstring =~ "YUY2")
  {
    $yuvstring = "--yuv=3";
  }
  elsif ($yuvstring =~ "IYUV")
  {
    $yuvstring = "--yuv=4";
  }

  if ($agbprintstring =~ "1")
  {
    $agbprintstring = "--agb-print"
  }
  else
  {
    $agbprintstring = "--no-agb-print"
  }
  if ($debugstring =~ "1")
  {
    $debugstring = "--debug"
  }
  else
  {
    $debugstring = ""
  }
  if ($mmxstring =~ "1")
  {
    $mmxstring = ""
  }
  else
  {
    $mmxstring = "--no-mmx"
  }
  if ($inactivitypausestring =~ "1")
  {
    $inactivitypausestring = "--rtc"
  }
  else
  {
    $inactivitypausestring = "--no-rtc"
  }
  if ($rtcstring =~ "1")
  {
    $rtcstring = "--pause-when-inactive"
  }
  else
  {
    $rtcstring = "--no-pause-when-inactive"
  }

   print "$visualboyadvancestring --bios='$biosstring' --ips='$ipsstring' $agbprintstring $debugstring $flashsizestring $filterstring $frameskipstring $gdbstring $inactivitypausestring $interframeblendingstring $mmxstring $rtcstring $savetypestring $showspeedstring $sizestring $throttlestring $verbosestring $yuvstring '$romstring'\n";
   system "$visualboyadvancestring --bios='$biosstring' --ips='$ipsstring' $agbprintstring $debugstring $flashsizestring $filterstring $frameskipstring $gdbstring $inactivitypausestring $interframeblendingstring $mmxstring $rtcstring $savetypestring $showspeedstring $sizestring $throttlestring $verbosestring $yuvstring '$romstring'";
}
