
GUIDE TO CONFIGURING GNUBOY


[ P A R T   I ]
  OVERVIEW

There are two major ways of configuring the way gnuboy behaves at
runtime: setting the values of variables, and binding commands to keys
and joystick buttons. Each can be done either on the command line, or
from a config (rc) file.

If you don't want to read all this detailed info, look at the sample
rc files provided, then browse back through this file to clarify
anything that seems confusing. You might also skip down to Part II if
you're already familiar with the syntax of gnuboy rc files and such;
the second part explains the configurable variables which you can play
with.


  WHAT HAPPENS AT STARTUP

When gnuboy is started, it first processes gnuboy.rc, the primary
configuration file. On *nix systems, gnuboy will initially look for
its rc files in ~/.gnuboy, or if that fails, the present working
directory. On DOS and Windows, the current directory will be searched
first, followed by the directory containing the gnuboy executable.

After finishing with gnuboy.rc, gnuboy next looks for an rc file with
the same base name as the rom to be loaded. For example, if the name
of the rom is mygame.gb, gnuboy will process mygame.rc, if it exists.
This allows you to configure different preferences on a per-rom
basis. The locations searched for the rom-specific rc file are the
same as those searched for gnuboy.rc, unless gnuboy.rc has changed the
search path (see below for more info).

Finally, options on the command line are processed. The command line
will override any settings in the auto-loaded rc files. This is a good
place for options that you just want to use occasionally, but not on a
regular basis.

After all of the above is finished, gnuboy loads the rom and starts
emulation.


  RC FILES

The rc files gnuboy uses are plain text files, with one command on
each line. Lines that start with # are treated as comments, that is to
say they are ignored, and blank lines are ignored as well.

There are three major types of commands.


  RC FILES -- SETTING VARIABLES

First of all, there is the "set" command, which is used for setting
the values of variables. For example,

  set scale 2

will set the screen scaling factor to 2. If you need to include a
space in the value of a variable, you can do something like this:

  set savename "I like spaces in my filenames"

and then your save files will be named something like:

  I like spaces in my filenames.sav
  I like spaces in my filenames.000
  I like spaces in my filenames.001
  I like spaces in my filenames.002
  etc.

Finally, some variables allow multiple numbers to be given. For
example, to set the video mode to 640x480, 16bpp, you might do
something like this:

  set vmode 640 480 16

Observe that each number is separate, and there are no quotation marks
used.


  RC FILES -- KEYBINDINGS

Next, we have commands that deal with key and joystick bindings. These
are fairly simple.

The "unbindall" command removes all existing keybindings -- be
careful! -- and its main use is for people who want to redefine their
keyboard controls entirely and throw away the defaults. Be warned that
if you unbind the quit key and don't bind a new key for quitting, you
may be unable to exit gnuboy cleanly!

The "unbind" command is similar, but it only unbinds one key at a
time. For example, to unbind the "space" key, use this command:

  unbind space

See below for a list of key names to use with unbind.

Now we get to the main useful keybinding command: "bind". For example,
if you want the "tab" key to perform the Gameboy "select" button
function, use the following bind command:

  bind tab +select

The significance of the + sign will be explained below. As with the
"set" command, quotation marks can be used with bind if the command
needs to contain spaces.


  KEY NAMES FOR BINDINGS

When using the bind and unbind commands, you need to tell gnuboy which
key you wish to affect. Most of the keys that correspond to a
character you can type can just be referenced by that character. For
example, the alphabetical keys are bound by the lowercase letter they
represent, and the numeral keys (on the main keyboard, not the numeric
keypad) can be bound by their numeral. Other keys require a name. Some
are really obvious:

  shift, ctrl, alt, up, down, right, left
  enter, tab, space, home, end, esc, pause
  f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12

Others are a bit less obvious but still should make sense. Some of
these can also be referenced by other names; read the source file
keytable.c for a full list:

  bs            Backspace
  ins           Insert
  del           Delete
  prior         Page Up
  next          Page Down
  caps          Caps Lock
  numlock       Num Lock
  scroll        Scroll Lock
  minus         - or _
  equals        = or +
  tilde         ` or ~
  slash         / or ?
  bslash        \ or |
  semi          ; or :
  quote         ' or "

The numeric keypad is referenced as follows

  num0-num9     Numeral keys 0-9 (on keypad)
  numplus       Numeric keypad +
  numminus      Numeric keypad -
  nummul        Numeric keypad *
  numdiv        Numeric keypad /
  numdot        Numeric keypad .
  numenter      Numeric keypad Enter key

Joystick buttons and directions also have names for binding, and they
are bound just like ordinary keys. Their names are as follows:

  joyup         Joystick up
  joydown       Joystick down
  joyleft       Joystick left
  joyright      Joystick right
  joy0-joy15    Joystick buttons

The way joystick buttons are numbered varies from one joystick to
another. Experiment to find the names that are right for the buttons
you want to use.


  RC FILES -- THE SOURCE COMMAND

The "source" command simply causes gnuboy to process another rc file
before resuming processing of the current one. It is useful for
splitting up your config into multiple parts, perhaps one file
auto-generated by a front-end and another hand-customized. Use of this
command is very simple:

  source myfile.rc

will perform all the commands in myfile.rc. Note that the source
command also provides a method for binding multiple commands to a
single key. For example, simply

  bind f1 "source f1stuff.rc"

and then f1stuff.rc will be run whenever you press F1.


  RC FILES -- ACTION COMMANDS

Finally, we have rc commands that perform actions. These commands are
probably only useful when bound to a key, and might cause unexpected
behavior or even crashes if used by themselves in an rc file loaded at
startup.

First of all, the "quit" command should be obvious. It simply exits
the emulator. If the rom that's loaded uses battery backed save ram or
realtime clock, these files will automatically be saved at exit.

The "reset" command should also be fairly obvious. It acts as a reset
button, restarting execution of the loaded rom at the beginning, as if
you turned the Gameboy power off and back on.

Slightly more interesting are the "savestate" and "loadstate"
commands. These are used for saving and resuming "saved state" files,
which allow you to save the exact status of the emulation environment
and restore it later, effectively letting you "save game" at any point
in any game. If a number is specified after either of those commands,
the indicated save slot number is used. Otherwise, the slot set in the
"saveslot" variable will be used. See the information on variables
below for more info.

Most importantly, we have the action commands that control the
emulated Gameboy input pad. They are described below:


  COMMANDS THAT BEGIN WITH A PLUS SIGN

Normally, gnuboy only performs the command bound to a key when the key
is pressed; nothing happens when it is released. But for some things,
particularly the Gameboy pad buttons, it's important for something to
happen when the bound key is released. This is the purpose of commands
that begin with a + sign. When a key is released, gnuboy checks to see
if the bound command begins with +, and if so, it changes the + to -
and performs the resulting command. This causes the Gameboy pad
buttons to go back to their normal state when the keys bound to them
are released.

The Gameboy pad commands, which should be self-explanatory, are as
follows:

  +a, +b, +start, +select, +up, +down, +left, +right

If you're at all familiar with Quake's config system, this should all
be clear.


  THE GNUBOY COMMAND LINE

Additional rc files to process, variable settings, and keybindings can
be specified on the command line when gnuboy is run.

Processing an extra config file is simple:

  gnuboy --source myfile.rc game.gb

Specifying an extra rc file on the command line like this is
especially useful for frontends, which may want to put all the options
they set in one rc file so they don't have to pass a super-long
command line to gnuboy.

Binding keys is also pretty simple. Just use something like:

  gnuboy --bind tab +select game.gb

Setting variables is where things get a bit more complicated. For
on/off (boolean) settings, you can just do something like

  gnuboy --no-sound game.gb

to turn a variable (sound) off, i.e. set it to 0. Likewise, boolean
variables can be turned on via something like

  gnuboy --rgb332 game.gb

which turns the "rgb332" variable on (see below for information on
what it does).

For other variables where you actually want to set a number or a
string, use this form:

  gnuboy --savename=mygame2 game.gb

Finally, for variables with multiple numbers to be set, you can
separate them by commas as follows:

  gnuboy --vmode=512,384,32

to avoid having to quote the spaces.


[ P A R T   I I ]
  GUIDE TO CONFIGURABLE VARIABLES

What follows is a detailed explanation of most of the configuration
variables available for your tweaking. They are organized by what part
of gnuboy's behavior they affect -- graphics, sound, emulation, and so
on.

Some variables may or may not be available depending on how gnuboy was
built. For example, if you built gnuboy on a system without sound
support, some variables related to sound may not exist for you, and
attempts to set them will be silently ignored. In most cases, it's
noted in the documentation when variables might not be available.

Also, there are a few highly system-specific variables, such as names
of devices to use for video and sound on *nix systems. These are
listed separately at the end, and it should go without saying that
they will not be available on all builds of gnuboy.


  VIDEO AND GRAPHICS SETTINGS

Since this is everyone's favorite thing to customize, video seems a
good place to start.


  SCREEN SCALING

There are a number of variables that control how gnuboy scales the
display. The most basic is the "scale" option, which is just the
factor to scale by. For example

  set scale 2

will double the size of the display. Set the scale factor to 1 for no
scaling.

There are two ways gnuboy can go about doing scaling. The preferable
way is to use your computer's graphics hardware to do all the work.
This cuts down on the amount of CPU time consumed and provides
filtering to smooth out the blocky pixels, but it's not available on
all systems. The other way is for gnuboy to scale the screen itself.

Normally gnuboy will choose hardware scaling automatically if it's
available, but if you want to force it on or off, you can set the
option "yuv" (for hardware YUV-colorspace scaling) to 1 or 0. Yes,
this option is poorly named, and is likely to change in future
versions of gnuboy.

On one display platform, Linux fbcon, it's possible to disable the
interpolation filter in the hardware scaling. To do this, set the
variable "yuvinterp" to 0. Some users who like a crisper display may
prefer this setting, especially on video cards that make the picture
look "muddy" when they scale it. Unfortunately SDL does not seem to
provide such an option, so interpolation is always enabled on the SDL
based ports.

When hardware scaling is disabled or not available, gnuboy will do its
own scaling. However, the scale factor is limited to 1, 2, 3, or 4.
Also, when performing its own scaling, gnuboy defaults to leaving some
scanlines blank. This saves a lot of CPU time and allows gnuboy to run
full speed on slower systems. You can configure what portion gets
filled in with the "density" variable. For example.

  set scale 4
  set density 4

will give you 4x scaling with no blank scanlines. Keep in mind that a
fairly fast computer (at least 400 MHz or so on x86, or something
comparable on other types of CPUs) is required to run fullspeed with
this setting. In general, "density" is the number of lines that get
filled in, so set it the same as "scale" if you want everything filled
in, or lower if you need more speed.


  VIDEO MODE

The variable for setting the desired video mode is called "vmode", and
it's made up of three parts: width, height, and bits-per-pixel. For
example, to set 640x480x16bpp mode, use

  set vmode 640 480 16

By default gnuboy will enable hardware scaling and try to scale to the
entire screen size if a video mode at least 320x288 is specified. If
you don't want this behavior, set the "yuv" option (see above) to 0.
Also, if you're setting the "scale" variable to do scaling, you
probably don't need to use the "vmode" option, since gnuboy will
try to automatically pick a mode that fits the scale. It's there in
case you need it, though.

Note that the DOS port is not yet capable of auto-choosing a video
mode, so if you want anything but the default 320x200x8bpp you'll have
to set "vmode" yourself. Also, not all ports are capable of all modes.
Experiment to find what works for you. Video mode selection is a
little bit messy and confusing at this time, and we hope to improve it
a good deal in the future.


  FULLSCREEN VIDEO

Some versions of gnuboy provide both fullscreen and windowed
operation. The variable "fullscreen" can be set to 1 or 0 to enable or
disable fullscreen mode. Also, the variable "altenter" can be set to
enable or disable switching between fullscreen and windowed mode at
runtime with the Alt+Enter key combination. Unfortunately, this does
not yet work on Windows; we hope to fix this limitation in the
future.


  DMG PALETTE SELECTION

gnuboy allows you to set the palette used for grayscale when running
DMG (original mono Gameboy) roms. There are four variables for this
purpose, allowing the background, window, and both sprite palettes to
be colored differently. Each one is made up of four numbers, the color
to use for each shade of gray, from lightest to darkest. Colors are
represented as 24bit numbers, with red in the low (rightmost) places
and blue in the upper (leftmost) places. Although you could specify
colors in decimal (base 10) if you really wanted, they'd be very
difficult to read, so it's preferable to use hex (base 16).

For example, to set the background to shades of white, the window to
shades of red, and the sprite palettes to shades of green and blue,
you could use:

  set dmg_bgp  0xffffff 0xaaaaaa 0x555555 0x000000
  set dmg_wndp 0x0000ff 0x0000aa 0x000055 0x000000
  set dmg_obp0 0x00ff00 0x00aa00 0x005500 0x000000
  set dmg_obp1 0xff0000 0xaa0000 0x550000 0x000000

This will of course look rather ugly, but it does the job illustrating
how you set various colors.

For more extensive examples, see the sample file palette.rc included
with gnuboy, which provides a number of sample palettes to try.


  RGB MODE WITH ONLY 256 COLORS

Normally when run in 256-color (8bpp) modes, gnuboy will dynamically
allocate colors in the palette as they're needed. However, on the
Gameboy Color, it's possible to have well over 1000 colors on the
screen at a time, and in games that make use of these "hicolor"
tricks, gnuboy will run out of colors and things will look bad.

If you prefer, you can set the "rgb332" variable:

  set rgb332 1

This tells gnuboy that instead of using 256-color mode as a
palette-based mode, you want it to setup a static palette and pretend
8bpp is just a really low quality "truecolor" mode, with only 3 bits
of precision in red and green, and only 2 bits of precision in blue.
In general this will make most games look worse, since colors have to
be approximated fairly poorly and since smooth color gradients are not
possible, but it will make "hicolor" Gameboy Color games look a good
deal better. Also, rgb332 mode should run slightly faster since it
avoids the overhead in dynamic palette allocation.

If you have to run at 8bpp mode, try it with and without this option
and see which way you like better. Of course, the better solution, if
at all possible, is to use 16bpp or higher mode, but that may run too
slowly on older computers.


  COLOR FILTERING

Optionally, gnuboy can filter screen colors to make them look more
washed out or faded like on a real GBC. To enable this feature,

  set colorfilter 1

By default, gnuboy will not apply the filter when running DMG (mono)
games, since many of the sample palettes are already designed to
immitate a Gameboy LCD. If you would like to have the filter also take
effect when running in DMG mode,

  set filterdmg 1

You can also customize the filter parameters to get different color
effects from the default ones. See the sample file filters.rc for
examples.


  SPRITE SORTING

Normally sprites are sorted and prioritized according to their x
coordinate when in DMG mode. However, this takes a little bit of extra
cpu time, and it's not needed by most DMG games, so it can be disabled
as follows:

  set sprsort 0

Note that although sprite sorting was disabled in previous releases
because it was not working properly, it now works great, so unless you
really need to maximize performance, you should probably leave it
enabled.


  SOUND OPTIONS

Fortunately sound is a lot simpler than video. At this time, there are
no fancy interpolation or filtering options, only your basic audio
parameters.

To enable or disable sound, set the "sound" variable to 1 or 0. By
default, it's enabled.

To enable or disable stereo sound, set the "stereo" variable to 1 or
0.  It defaults to 1 on most ports, but since stereo sometimes fails
to work properly on DOS, it's disabled by default on the DOS port.
Disabling stereo in no way improves performance, so it should only be
done if stereo mode causes a problem on your computer.

To set the audio sampling rate, use the "samplerate" variable. The
default is 44100 Hz. Setting this lower can improve performance. For
example, if you have a really slow computer, you might use:

  set samplerate 8000

Keep in mind that this will sound really really bad.


  FILESYSTEM OPTIONS

There are a good deal of options that affect where and how files are
saved and loaded by gnuboy. First, there's "rcpath", which specifies
where gnuboy searches for rc files. The default depends on your
operating system; see the beginning of this file for details.

The search path for rc files can contain multiple directories.
Normally, the list is separated by colons (:), but on DOS and Windows
the colon is used for drive letters, so semicolon (;) must be used
instead. Here are some examples, first for *nix:

  set rcpath "/home/laguna/.gnuboy:/usr/local/etc/gnuboy"
  set rcpath "."

and for DOS/Windows:

  set rcpath "c:/gnuboy;."
  set rcpath "c:/Program Files/Gnuboy"

If you really insist on using backslashes on DOS or Windows, you'll
have to double them up, since the backslash normally means "treat the
next character literally." For example,

  set rcpath "c:\\gnuboy"

This is untested, and your milage may vary. I recommend just using
forward slashes and keeping things simple.


  SAVE RELATED OPTIONS

These are all fairly simple, so I'll just list them quickly, then give
a couple examples.

  savedir     - directory to store saved games (SRAM and savestates) in
  savename    - base filename to use for saves
  saveslot    - which savestate slot to use
  forcebatt   - always save SRAM even on carts that don't have battery
  nobatt      - never save SRAM
  syncrtc     - resync the realtime clock for elapsed time when loading

The "savename" variable is particularly useful if you wish to have
more than one save associated with a particular rom. Just do something
like:

  gnuboy --savename=mygame2 mygame.gb

and the save files will be called mygame2.sav, mygame2.000, etc rather
than just mygame.sav, etc.

The "saveslot" variable is normally just changed by keybindings, so
you can pick a savestate slot while you're playing a game. However, if
you for example prefer that the default slot at startup be 1 rather
than 0, you can use:

  set saveslot 1

The "forcebatt" and "nobatt" options are fairly self-explanatory and
not very useful, except perhaps for debugging or use with corrupted
roms.

The "syncrtc" option needs a bit of explanation. Some roms, notably
Pokemon ones and Harvest Moon, use a realtime clock to keep track of
the time of day even when they're not running. Since gnuboy is just an
emulator, it can't work like a real cartridge and make things like
this keep happening while the emulator is not running. However, it can
resync the Gameboy realtime clock based on your computer's clock when
it starts. This is what the "syncrtc" option does. By default it's
enabled. If you disable it, then no time will seem to have elapsed
between when you exit the emulator once and when you start it again
the next time.


  JOYSTICK OPTIONS

So far there is just one joystick option, "joy", used to enable or
disable joystick support.


  DEBUGGING OPTIONS

These probably won't be useful to most people, but if you're trying to
debug a homebrew game you're writing or fix a bug in gnuboy they might
be of help:

The "trace" variable, if enabled, dumps a full execution trace to
stdout. Be prepared for at least 20 megs of logs to look through at
minimum, and more like 150 megs if you want enough to find anything
useful. Redirecting stdout to a file is a must!

The "sprdebug" variable is used to see how many sprites are visible
per line. Try it and see!


  PLATFORM-SPECIFIC OPTIONS

On certain *nix systems, you may need to specify device nodes to use
if the defaults don't work:

  oss_device  - Open Sound System "DSP" device
  fb_device   - Video framebuffer device
  joy_device  - Joystick device
  
The Linux fbcon version of gnuboy does not support the "vmode" option
yet, but it can set the mode for you by running the "fbset" program,
if you have it. Just set the "fb_mode" variable to the exact name of
the mode you want in /etc/fb.modes. For example,

  set fb_mode 640x480-90

You can also override the default color depth with the "fb_depth"
variable.

The DOS port of gnuboy has support for real console system gamepads
via the "Directpad Pro" (DPP) connector. To enable this feature, set
"dpp" to 1, set "dpp_port" to the IO port number the pad is connected
to (e.g. 0x378 -- be sure to prefix it with 0x for hex!!), and set
"dpp_pad" to the number of the pad you want to use. This code has not
been heavily tested, so it may or may not work for you. Be sure to get
the port number right or bad things may happen!


  CONCLUSION

Well, that's about it for configuration. Hopefully this document
clears up a lot of the confusion about what you can and can't
configure in gnuboy yet, and how you go about doing it. Again, check
the sample.rc, palette.rc, and classic.rc files for lots of examples
of how rc files work.

As always, more info will come as time passes on. Keep on the lookout
for new releases and more features. Thank you for flying gnuboy and
have a nice day.



                                                 - Laguna
