356 lines
12 KiB
Plaintext
356 lines
12 KiB
Plaintext
|
|
||
|
GNUBOY README
|
||
|
|
||
|
|
||
|
INTRO
|
||
|
|
||
|
Welcome to gnuboy, one of the few pieces of Free Software to emulate
|
||
|
the Game Boy handheld game console. Written in ANSI C with a few
|
||
|
optional assembler optimizations for particular cpus, gnuboy supports
|
||
|
a wide range of host systems, and has been tested successfully on:
|
||
|
|
||
|
GNU/Linux
|
||
|
FreeBSD
|
||
|
OpenBSD
|
||
|
BeOS
|
||
|
Linux/390 (IBM S/390 Mainframe)
|
||
|
SunOS/Sun Ultra60
|
||
|
IRIX/SGI O2
|
||
|
IRIX/SGI Indy
|
||
|
AIX/Unknown
|
||
|
DR-DOS
|
||
|
MS-DOS
|
||
|
Windows DOS box
|
||
|
Windows 9x/NT/2k
|
||
|
|
||
|
Additionally, gnuboy should run on any other *nix variants that have
|
||
|
ANSI C compilers and that are remotely POSIX compliant. As gnuboy is
|
||
|
Free Software, you're welcome to fix any problems you encounter
|
||
|
building it for a particular system, or to port it to entirely new
|
||
|
systems.
|
||
|
|
||
|
For build instructions, see the file INSTALL. For information on the
|
||
|
structure of the source tree, program flow, design decisions and
|
||
|
guidelines, porting, and so on, read HACKING.
|
||
|
|
||
|
|
||
|
GENERAL USAGE
|
||
|
|
||
|
Just pass the name of the rom to load on the command line. Default
|
||
|
keybindings are as follows:
|
||
|
|
||
|
esc - exit
|
||
|
arrow keys - d-pad
|
||
|
alt - a
|
||
|
ctrl - b
|
||
|
space - select
|
||
|
enter - start
|
||
|
0-9 - select savestate slot
|
||
|
ins - save current state
|
||
|
del - return to saved state
|
||
|
|
||
|
joypad - d-pad
|
||
|
joy0 - b
|
||
|
joy1 - a
|
||
|
joy2 - select
|
||
|
joy3 - start
|
||
|
|
||
|
(Note: joystick is not available on all platforms at this time.)
|
||
|
|
||
|
If you want to change these or other options, you should create a
|
||
|
gnuboy.rc file. See the system-specific info below for where to put
|
||
|
it.
|
||
|
|
||
|
The rc subsystem is very similar to Quake's console in many
|
||
|
respects. You have commands and variables. First, the commands:
|
||
|
|
||
|
quit - exit gnuboy (saving sram)
|
||
|
reset - reset to powerup state
|
||
|
source - process another rc file
|
||
|
set - set a variable's value
|
||
|
bind - bind keys
|
||
|
unbind - remove a keybinding
|
||
|
unbindall - remove all keybindings
|
||
|
savestate - save current state
|
||
|
loadstate - return to saved state
|
||
|
|
||
|
Additionally, each gameboy pad button has two commands, one to press
|
||
|
it, and another to release it -- for example, +start and -start. When
|
||
|
a key is bound to one of these commands that starts with a +, it will
|
||
|
perform the corresponding - command when it's released, as expected.
|
||
|
|
||
|
Here's a list of the + commands, though they should be obvious:
|
||
|
|
||
|
+start +select +a +b +up +down +left +right
|
||
|
|
||
|
Now for the variables. To set any of the rc variables, just put the
|
||
|
command of the form "set variable value" in your gnuboy.rc or other rc
|
||
|
file. Some of the more interesting variables are:
|
||
|
|
||
|
rcpath - search path for loading extra rc files
|
||
|
savedir - the directory where save files will be stored
|
||
|
savename - base of filename to use for sram and savestates
|
||
|
forcedmg - set to 1/true/yes to force color roms to play mono
|
||
|
framelen - delay in microseconds between frames
|
||
|
framecount - run only the given number of frames, then exit
|
||
|
|
||
|
dmg_bgp - specify 4 custom colors to be used for mono background
|
||
|
dmg_wndp - same thing, but for the window layer
|
||
|
dmg_obp0 - and for sprite palette 0
|
||
|
dmg_obp1 - and sprite palette 1
|
||
|
|
||
|
scale - factor for screen scaling; currently only 1 and 2 work
|
||
|
density - density level for screen scaling; see description below
|
||
|
|
||
|
sprsort - x-sort sprites for correctness on dmg roms
|
||
|
|
||
|
syncrtc - fake elapsed time on rtc since last session at startup
|
||
|
|
||
|
trace - output a complete cpu trace to stdout
|
||
|
sprdebug - display bars indicating sprite count per line
|
||
|
|
||
|
There are a few others which may or not be useful. Also, certain
|
||
|
system and display targets have their own variables, which will be
|
||
|
described in the relevant sections below. For more info on how the
|
||
|
variables work, read the source.
|
||
|
|
||
|
For sample rc files, look in the etc/ directory.
|
||
|
|
||
|
Finally, to display help, version, or copying information, use the
|
||
|
--help, --version, or --copying options respectively on the gnuboy
|
||
|
command line.
|
||
|
|
||
|
|
||
|
USAGE - *NIX SYSTEMS
|
||
|
|
||
|
The file gnuboy.rc should be placed in ~/.gnuboy/. If it is not found
|
||
|
in this location, the current working directory will be
|
||
|
searched. The following defaults will be used:
|
||
|
|
||
|
rcpath - ~/.gnuboy:.
|
||
|
savedir - ~/.gnuboy/saves
|
||
|
|
||
|
If you don't like these, override them with gnuboy.rc.
|
||
|
|
||
|
There are presently four *nix targets supported: X11, SDL, and Linux
|
||
|
fbcon and svgalib. In the future other fb devices (such as the Sun
|
||
|
console) should be supported as well.
|
||
|
|
||
|
If you have problems with gnuboy running too slowly on svgalib, turn
|
||
|
off the vsync option, i.e. set vsync 0. Putting --no-vsync on the
|
||
|
command line works as well. At this point svgalib is the only one that
|
||
|
supports vsync, so it's a non-issue on the others.
|
||
|
|
||
|
|
||
|
USAGE - DOS and Windows
|
||
|
|
||
|
Place your gnuboy.rc in the same directory as gnuboy.exe. You need to
|
||
|
specify a save directory in it; otherwise the working directory will
|
||
|
be used, which is probably not what you want. For example, if you've
|
||
|
installed gnuboy.exe in c:/gnuboy, and you want your saves to be
|
||
|
stored in c:/gnuboy/saves, place the following in a plain text file
|
||
|
called gnuboy.rc in c:/gnuboy.
|
||
|
|
||
|
set savedir c:/gnuboy/saves
|
||
|
|
||
|
By default stereo sound is disabled on DOS since it doesn't work right
|
||
|
on some of the systems we've tested; to enable it, add the following
|
||
|
line to your gnuboy.rc:
|
||
|
|
||
|
set stereo 1
|
||
|
|
||
|
|
||
|
VIDEO MODES
|
||
|
|
||
|
Now all the display targets except Linux fbcon support the uniform
|
||
|
"vmode" rcvar to set the video mode. From the rc file, you can specify
|
||
|
a video mode like this (for 640x480, 16bpp):
|
||
|
|
||
|
set vmode 640 480 16
|
||
|
|
||
|
Or you can specify the mode on the command line, as
|
||
|
|
||
|
--vmode=640,480,16
|
||
|
|
||
|
If the requested video mode is not available, gnuboy may either give
|
||
|
an error message or use a similar available mode.
|
||
|
|
||
|
|
||
|
SCREEN SCALING
|
||
|
|
||
|
Scaling by integral factors 1-4 is now supported. Just set the rcvar
|
||
|
"scale" to the desired scaling factor. Most of the display targets
|
||
|
will automatically choose a video mode appropriate to the chosen
|
||
|
scale, but DOS and Linux fbcon users should be aware they they need to
|
||
|
set the mode manually, as described above. Of course, if you prefer,
|
||
|
you can always set it manually.
|
||
|
|
||
|
By default, for performance reasons, vertical scaling will not be
|
||
|
fully dense but will leave some blank scanlines. This behavior can be
|
||
|
adjusted by means of the "density" rcvar. Density 0, the default,
|
||
|
skips every other line. Nonzero values N fill in the first N copies of
|
||
|
the scanline, and leave the remaining scale-N scanlines blank. So, if
|
||
|
you want a fully filled in display (and the worst performance), you
|
||
|
should set density to the same value as scale.
|
||
|
|
||
|
Please be aware that this code is still slightly experimental, and the
|
||
|
ways of configuring scaling may change considerably in the next few
|
||
|
releases.
|
||
|
|
||
|
|
||
|
HARDWARE ACCELERATED YUV-SPACE SCREEN SCALING
|
||
|
|
||
|
If you're using the SDL display target and your video card/driver
|
||
|
supports it, hardware screen scaling is available. This feature
|
||
|
provides scaling to any size with almost no cpu usage! It's enabled by
|
||
|
default if the screen resolution is set to 320x288 or higher; manually
|
||
|
set the "yuv" rcvar to 0 or 1 to force it off or on, respectively.
|
||
|
|
||
|
Scaling will be performed to fill the entire requested video mode.
|
||
|
For example, to scale to 640x480, either add the following line to
|
||
|
your gnuboy.rc:
|
||
|
|
||
|
set vmode 640 480
|
||
|
|
||
|
or put --vmode=640,480 on the command line. A better alternative is to
|
||
|
just request a particular scale, for example with:
|
||
|
|
||
|
set scale 4
|
||
|
|
||
|
or --scale=4 on the command line; this way the gameboy's near 1:1
|
||
|
aspect ratio won't become distorted.
|
||
|
|
||
|
|
||
|
SOUND SUPPORT
|
||
|
|
||
|
At this point all features are implemented and everything should be
|
||
|
right, so any incorrect sound output should be treated as a bug, which
|
||
|
we'll try to fix as soon as possible.
|
||
|
|
||
|
|
||
|
JOYSTICK AND GAMEPAD SUPPORT
|
||
|
|
||
|
At this time, the Linux and SDL joystick devices are the only ones
|
||
|
supported. We hope to have DOS joystick support soon.
|
||
|
|
||
|
Binding joystick controls works the same way as for the keyboard. Just
|
||
|
use the key names joyup, joydown, joyright, joyleft, joy0, joy1, joy2,
|
||
|
etc. Default bindings should probably be ok for most users, except
|
||
|
that A/B might be backwards on some gamepads.
|
||
|
|
||
|
|
||
|
PERFORMANCE
|
||
|
|
||
|
Here are some performance estimates i've gathered (given in percent
|
||
|
cpu utilization, running at full 60 fps)...
|
||
|
|
||
|
Optimized C Assembly
|
||
|
AMD K6-2/450 12% 8%
|
||
|
Pentium/75 (too slow) 70%
|
||
|
SGI O2 25% (no asm)
|
||
|
SGI Indy 70% (no asm)
|
||
|
Sun Ultra60 3-20% (no asm)
|
||
|
IBM S/390 about 0.3% (no asm)
|
||
|
|
||
|
Note that these figures were computed before sound was implemented.
|
||
|
Until the sound code is further optimized, gnuboy may run somewhat
|
||
|
slower than these numbers suggest.
|
||
|
|
||
|
|
||
|
SUPPORTED MEMORY BANK CONTROLLERS (MBCS)
|
||
|
|
||
|
At this time, gnuboy supports MBC1, MBC2, MBC3 (including realtime
|
||
|
clock), and MBC5 (including the version with rumble support, although
|
||
|
that functionality is omitted).
|
||
|
|
||
|
|
||
|
GRAPHICS SUPPORT
|
||
|
|
||
|
Color Gameboy roms are supported completely, including so-called
|
||
|
"highcolor" tricks. Yes, even in 256-color mode, although in games
|
||
|
that use too many colors on one screen, the later ones will only be
|
||
|
approximated. Use a 16 bpp (or higher) display mode if this is a
|
||
|
problem.
|
||
|
|
||
|
Alternatively, for games that look bad in 256 color mode, you can
|
||
|
run in simulated 3/3/2 bits per channel truecolor. Just set the
|
||
|
variable rgb332 to something nonzero (or just putting --rgb332 on the
|
||
|
command line will work). Color precision is lost somewhat, especially
|
||
|
in smooth gradients, but for the most part it looks very good.
|
||
|
|
||
|
Much care has been put into ensuring that the lcd timings and
|
||
|
interrupts behave as closely to the real hardware as possible. A few
|
||
|
features remain unimplemented, such as reduced length HBLANK depending
|
||
|
on the number of sprites visible on the scanline, but the vast
|
||
|
majority of display tricks used in current roms work fine.
|
||
|
|
||
|
We do, however, lack information on proper GDMA timings, which could
|
||
|
theoretically cause problems for some roms. If you can provide us with
|
||
|
accurate information, please do!
|
||
|
|
||
|
|
||
|
COMPATIBILITY
|
||
|
|
||
|
Eventually I'll put detailed information here. For now, just see known
|
||
|
bugs for the few cases where roms fails.
|
||
|
|
||
|
|
||
|
KNOWN BUGS
|
||
|
|
||
|
The portal between the temple and the Talon in FFL3 is glitched and
|
||
|
the game freezes for a second or two building the incorrect animation
|
||
|
when entering those screens.
|
||
|
|
||
|
GDMA finishes instantly, whereas it should take time. Making it take
|
||
|
time breaks Wacky Races, last I checked, so apparently the documents I
|
||
|
have on GDMA timing are incorrect. Same goes for HDMA. Good
|
||
|
information would be much appreciated.
|
||
|
|
||
|
The main loop in emu_run is very sloppy and not quite right, but it
|
||
|
works.
|
||
|
|
||
|
Sound mixing is taking way too much cpu time. I have some ideas for
|
||
|
fixing this, and I plan to write optimized assembly code for sound
|
||
|
eventually. If it's a problem try turning down the sample rate.
|
||
|
|
||
|
YUV-space hardware scaling only supports the common "YUY2" mode so
|
||
|
far. More modes will be added in the future.
|
||
|
|
||
|
|
||
|
REPORTING OR FIXING BUGS
|
||
|
|
||
|
Found a bug not mentioned above, or better yet, fixed one? Send bug
|
||
|
reports or patches to gnuboy@starfox.org. Please be aware that
|
||
|
distribution of any code based on gnuboy must follow the provisions of
|
||
|
the GPL, so if you don't agree to this, don't send code to us or
|
||
|
anyone else. Let us know if you wish to be included in the credits.
|
||
|
|
||
|
For guidelines regarding code contributions, see the file HACKING.
|
||
|
|
||
|
Please be aware that evaluating contributed code and figuring out if
|
||
|
or how to work it in can take time. If we haven't done anything with
|
||
|
your code yet, please be patient.
|
||
|
|
||
|
|
||
|
THANKS
|
||
|
|
||
|
Thanks goes out to everyone who's expressed interest in gnuboy by
|
||
|
writing -- users, porters, authors of other emulators, and so forth.
|
||
|
Apologies if we don't get a personal response out to everyone, but
|
||
|
either way, consider your feedback well appreciated.
|
||
|
|
||
|
|
||
|
EPILOGUE
|
||
|
|
||
|
OK, that looks like about it. More to come, stick around...
|
||
|
|
||
|
|
||
|
|
||
|
-Laguna
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|