Virtual GameBoy Advance
version 3.0
Contents
Disclaimers
- GameBoy and GameBoy Advance are registered trademarks of Nintendo.
- The author is in no way affiliated with Nintendo.
- The author is in no way affiliated with any pirate group out there.
- The author cannot and will not provide you with
any GameBoy or GameBoy Advance games.
- The author cannot be held responsible for anything this program
will do to your computer, brains, free time, housemates, pets, or
family members.
New in This Version
- Added a routine that guesses correct FlashROM ID and the FlashROM
or EEPROM size from the cartridge ID. Super Mario Brothers 3 and
Pokemon Sapphire work now. Use
-guesshw
and
-defaulthw
options to switch guessing on and off.
- Added DirectDraw-based full screen mode to VGBA-Windows.
Press [ALT]+[ENTER] to switch in and out of the full screen mode.
Use it with caution, as DirectDraw is notoriously unstable.
- Fixed ARM LDM/STM opcodes to ignore lower two bits of address.
- Fixed ARM MSR opcode to allow setting any of the four areas in
the CPSR and SPSR registers.
- Fixed a bug in the character screen drawing code that could crash
the program.
- Finally fixed the time counting bug that caused bad sound distortions
in many games, especially when using the
-ds 1
sound
rendering option.
- Now resetting the line coincidence flag on writes to DISPSTAT to
enable line coincidence interrupts at each scanline (F-Zero 2).
- Changed FastSet() BIOS call to round transfer size to the nearest
multiple of 8 quads (32 bytes) and check source address for bounds.
- Fixed several bugs in the MIDI logging code and the MIDI sound
driver in VGBA-Windows.
- Added fast-forwarding option ([PAGEUP]).
- Added TV raster simulation to VGBA-Windows and VGBA-MSDOS.
- Added VGBA-Windows options to set FlashROM ID and hardware guessing
mode.
- Raised the maximal "Sync to..." frequency to 200Hz.
- Window size and position are now saved on exit in VGBA-Windows.
History
New in Version 2.1
- Save (.SAV) file format has changed due to
addition of >64kB FlashROMs.
- State (.STA) file format has changed due to
addition of RTC and >64kB FlashROMs.
- The old
-flash
has been changed to -flashid
.
- The new
-flash
sets the number of FlashROM address bits
(≥16).
- Added RTC support (clock in Pokemon series).
- Added support for >64kB FlashROMs (Pokemon series, etc.).
- Added MIDIKey2Freq() to the BIOS emulation (thanks to Aaron Oneal).
- Fixed a bug in the ArcTan2() emulation (Castlevania: Aria Of Sorrow).
- Fixed possible memory corruption in EEPROM emulation (Lord Of The Rings).
- Fixed
SMULL/SMLAL
opcodes.
- VBlank interrupt now occurs with HBlank in line 160 (Robot Wars).
- Now recomputing sprites every time screen mode changes (Ice Age).
- Now setting unused
KEYSTAT
bits to zeroes (Defender Of The
Crown).
- Now updating
C
flag when immediate value is rotated
in an ALU operation (Desert Strike).
New in Version 2.0
- Majorly redesigned screen rendering routines, making them faster.
- Added sprite sorting and precomputation to speed things up.
- Fixed window rendering.
- Fixed multiple screen rendering bugs.
- Color effects can now be disabled in WININ/WINOUT registers.
- Alpha blending can now be applied multiple times (Lord Of The Rings).
- Disabled alpha blending for pixels with no second argument (Lord Of
The Rings).
- Added window support to bitmapped screen modes.
- Disabled display of the first 512 sprite patterns in bitmapped
screen modes.
- Changed LDM instructions not to write back base register if it has
just been loaded from memory (Golden Sun 2, Kong, VRally 3, etc.).
- Now setting R12=0x04000000 in VBlankIntrWait() and IntrWait() (Bubble
Bobble Old And New).
- Added QOpARM() and WOpARM() functions for fast opcode fetching.
- Removed data rotation in unaligned 32bit writes (Downforce).
- Modified BIOS decoders that write to VRAM to use words, not bytes.
- Now returning correct "broken" values when program tries to read
BIOS area by bytes and 16bit words.
- Now doubling byte writes to VRAM and palette.
- Now mirroring VRAM as 64kB+2*32kB.
- Now mirroring SRAM, OAM, and palette.
- Removed mirroring of I/O addresses.
- Now waiting for sound thread to die in VGBA-Unix.
New in Version 1.7
- Switched to the latest version of the OpenWatcom C/C++ compiler.
- The infamous Windows problem with spaces in directory names seems
to be fixed by using a newer compiler.
- Joystick problems in VGBA-Windows are fixed.
- Added joystick configuration to VGBA-Windows setup panel.
- Fixed sound in VGBA-Windows on Windows 2000.
New in Version 1.6
- VGBA-MSDOS now comes with the VGBA-Windows!
- Implemented BIOSChecksum() BIOS call (SWI#0D).
- Implemented BitUnpack() BIOS call (SWI#10).
- Implemented GetJumpList() BIOS call (SWI#2A).
- Added a -verbose bit to print sound-related messages.
New in Version 1.5
- Added strict type/source checking to BIOS uncompression routines.
- Fixed direct sound to melodic sound volume ratio.
- Added optional waveforms to melodic (non-PCM) channels.
- Fixed updates to the melodic PCM channel.
- Fixed melodic volume sweep.
- Fixed a bug that broke timers when restoring saved state.
- Fixed a problem with prematurely closed stdin in VGBA-Unix.
New in Version 1.4
- State save (.STA) file format has changed!
- Improved direct sound emulation by tinkering with sound driver API.
- Added BIOS read-protection.
- Added support for different EEPROM sizes (
-eeprom
).
Some new GBA games use 16384x64 EEPROMs (use -eeprom 14
option with these games).
- Fixed disassembler to show LDRH/STRH operations with immediate
offset.
- Added support for LDRH/STRH operations with post-indexing and
write-back modes both "on". This is still wrong, folks.
Please, read the ARM7TDMI documentation and modify your assemblers
to generate correct opcodes.
- Now updating timer data registers with current counter values.
- Now clearing OAM and some other registers on reset.
- Now enabling interrupts in VBlankIntrWait() and IntrWait().
- Now ignoring compression type tags in RLUncompress() (Lego Racers 2).
- Fixed LDM/STM opcodes to handle USER mode R13/R14 load/save.
- Fixed mode changes in LDM opcode.
- Fixed DMA debugging message.
- Added more manufacturer IDs to the database.
New in Version 1.3
- Added console-based debugger to the VGBA-Windows, by
public demand.
- Fixed MULL/SMULL opcode (thanks go to Santeri Paavolainen).
- Added forced VBlank emulation.
- Filled simulated BIOS area with the value that real copy-protected
BIOS returns on reads.
- Fixed EEPROM emulation a little bit.
- Made "channels active" sound register visible to the GBA.
- Added more manufacturer IDs to the database.
- Fixed rollover on the volume control button in VGBA-Windows.
- Fixed command line parsing in VGBA-Windows.
- Now turning off sound when VGBA-Windows dialog boxes get shown.
- VGBA-Windows now always uses .INI file in the same directory as
the .EXE file.
New in Version 1.2
- Implemented direct sound channels.
- Added dual banks for the melodic sound channel #3.
- Added master volume for direct and melodic sound (SOUNDCNT_H).
- Added direct sound DMA interrupts (Pac-Man Collection).
- Added serial I/O interrupts (Golf Master).
- Added Diff8bitUnFilterWRAM(), Diff8bitUnFilterVRAM(), and
Diff16bitUnFilter() BIOS calls.
- Added more manufacturer IDs to the database.
- Disabled DMA restart (sound in Wario World 4, etc.).
- Fixed a bug that screwed up timers after DMA transfers.
- Fixed WRdARM() function and macro handling of unaligned reads.
- Fixed IntrWait() and VBlankIntrWait() BIOS calls (SWI #4,5).
- Fixed long-multiply instructions (Tony Hawk Pro Skater 2).
- Fixed ARM-mode SWIs (Super Black Bass Advance).
- Somewhat changed timings during uncompression BIOS calls.
- Changed simulated BIOS contents a little (Tactics Ogre).
- Set USER mode stack to correct value.
- Now initializing CPU into SYSTEM mode, no other flags.
- Changed default FlashID to a real one (was 0x0000).
- Fixed LDSH/LDSB THUMB mnemonics in the disassembler.
- Added ability to supply FlashID from command line in VGBA-Unix and
VGBA-MSDOS.
- Added GBA-specific calls to the GameBoy sound chip API.
- Changed SetWave() sound API call to use shared buffers, as needed
for direct sound.
- Implemented threaded Unix sound driver.
- Shrunk sound buffer size in the Windows sound driver to 256 bytes
for clearer sound.
- Changed master volume control usage in all sound drivers for more
efficient and correct mixing.
- Updated documentation, fixing some HTML errors.
New in Version 1.1
- Added support for rectangular and sprite windows.
- Added BgAffineSet() BIOS call.
- Added more manufacturer IDs to the database.
- Added support for GZIPped ROM images and state file.
- Improved fast QRdARM() macro to handle unaligned addresses (albeit
not ideally).
- Fixed alpha-blending operation a bit.
- Now saving serial EEPROM contents in the .SAV file, after the FlashROM
contents.
- Removed CRC check as it was wrong and did not make any sense.
Only CMP is checked now.
- Fixed sprite priorities relative to background priorities in screen
modes 0..2.
- Optimized drawing routines for rotated/scaled backgrounds and sprites.
- Now saving EEPROM state in state files (.STA format has changed).
- Fixed joystick support in VGBA-Windows (somewhat).
- Fixed VGBA-Unix to allow window managers (like WindowMaker) create
an application icon for it.
New in Version 1.0
- VGBA-Windows is now available.
Register it NOW!
- VGBA-Unix is now available.
- Added facility to save and load emulation state.
- Added serial EEPROM emulation.
- Implemented more or less accurate CPU cycle counting (still not
accurate enough though).
- Implemented HuffUncomp() call.
- Fixed ObjAffineSet(), CpuSet(), CpuFastSet(), and SoftReset() calls.
- Fixed timers to reload values correctly.
- Majorly updated documentation.
- Fixed background color problem in the non-VESA (256 color) version
of VGBA-MSDOS.
New in Version 0.6
- Added JEDEC FlashROM support.
- Added CRC/CMP check. All failing cartridges will now be rejected
unless you use the
-nocrc
option.
- Implemented pending IRQ handling after IRQs were switched on.
- Disabled IRQs in the SVC mode.
- Added ObjAffineSet() BIOS call.
- Added Halt() and Stop() BIOS calls.
- Fixed several BIOS calls.
- Fixed a special case of DMA with the length of 0 items.
- Fixed LDR/STR/LDRB/STRB instruction display in the debugger.
- Improved cartridge information reporting.
- Added a lot of command line options.
- Added a lot of control keys.
New in Version 0.5
- Moved dummy GBA.ROM contents inside the VGBA code.
- Added DMA3 start at the beginning of HRefresh.
- Added 'v' command to the debugger to show GBA status.
- Fixed transparency effects in bitmap modes.
- Fixed transparency with multiple backgrounds.
- Now initializing rotation/scaling properly.
- No longer supporting 128kB flash ROM above the cartridge ROM.
New in Version 0.4
- Added MULL/MLAL ARM opcodes.
- Added color effects to all screen modes.
- Added rotation to all appropriate screen modes.
- Added rotation to sprites.
- Fixed DMA transfers to start correctly.
- Fixed DMA transfers to leave correct values in DMACONT registers.
- Added IRQ at the end of DMA transfer, if required.
- Fixed GB sound chip emulation.
- Added CPUSet() and CPUFastSet() BIOS calls.
- Added RLUnCompWRAM() and RLUnCompVRAM() BIOS calls.
- Now saving cartridge SRAM and flash ROM into a .SAV file.
- Both 16bit color and 8bit color versions are included. 16bit version
requires VESA-compatible video card. I still recommend it over the
8bit version as GBA programs are extremely ugly in 256 colors :)
Introduction
Virtual GameBoy Advance (VGBA) is an emulator of Nintendo's GameBoy
Advance handheld videogame console. VGBA can run most commercial GameBoy
Advance software on a desktop, palmtop, or any sufficiently fast computing
device. It will also run correctly written homebrewn software. You
can always get the latest version of VGBA at
http://www.komkon.org/fms/VGBA/
VGBA is a logical continuation of my previous work in videogame
emulation, namely, the
Virtual GameBoy
that emulates GameBoy Classic, GameBoy Pocket, Super GameBoy, and
GameBoy Color. VGBA is a completely different program though. It will
not run the original GameBoy software, so you will have to use VGB for
that.
I am mainly releasing VGBA for game developers and hobbyists who
would like to code for GBA but cannot afford to buy an official
development kit from Nintendo. VGBA is not a replacement for the real
development kit, as it does not contain any real GBA hardware, but it
is a cheap and reliable way to test your code and show your work to the
publisher.
VGBA Ports
So far, I have ported VGBA to MSDOS, Windows, and Unix. All three ports
are maintained by myself. I am also maintaining the
PocketPC port, formerly developed by Aaron
Oneal. If you wish to port VGBA to another platform, please, let me
know.
Windows 95/98/ME/NT/2000/XP
-
The Windows and MSDOS versions of VGBA are available from me, Marat
Fayzullin, for $35US. This fee ensures that you will get you the latest
full versions of both VGBA-Windows and VGBA-MSDOS with support
and free updates via email as long as I update these programs. For more
information, take a look at
http://www.komkon.org/fms/VGBA/VGBAWindows.html
You can register VGBA-Windows and VGBA-MSDOS by one of the following
methods:
- ORDER BY MAIL
-
Send $35US in cash, money order, or a US bank check to:
Marat Fayzullin
3030 Southview Road
Ellicott City, MD 21042
USA
Don't forget to include your email address and mention that you want
VGBA-Windows, as I'm selling several other products as well. The software
will be emailed to you as soon as I receive the money.
- ORDER ON THE WEB
-
Tell your WWW browser to go to
http://www.digibuy.com/cgi-bin/order.html?296825+99046733021
and use the online form to register VGBA-Windows. You can pay with a credit
card. They take MasterCard, Visa, Amex, or Discover and also allow to
register over the phone. The software will be emailed to you as soon as I
receive the notification from DigiBuy.
MSDOS
-
The first (<1.0) versions of VGBA were released for MSDOS. You may
find them on the Net for free, but they lack the compatibility and
features of the later versions. The newer (>1.5) versions of VGBA-MSDOS
are sold as part of the VGBA-Windows package.
VGBA-MSDOS has been compiled to run with the DOS4GW extender on
MSDOS and Windows platforms. It uses a 320x200x16bit VESA screen
and therefore requires VESA support. It will fail on
your computer if you do not have VESA support for the 320x200x16bit
screen mode.
Unix
-
I have compiled VGBA for several different flavors of Unix and made the
binaries available for free at the VGBA homepage. The current VGBA-Unix
has several important requirements though:
- Current VGBA core code will only run on low-endian systems. This
excludes SPARC, 680x0, PowerPC, and some other architectures from
the list of possible ports. I'm hoping to add high-endian support
in the future.
- As GBA video hardware is capable of displaying 32768 colors, and
GBA programs use this capability extensively, I am only providing
VGBA-Unix binary compiled for the 16bit color. If your Xserver is
unable to support this resolution, VGBA-Unix will not run on
it.
- Since version 1.2, VGBA-Unix uses threaded sound driver. This means
that your Unix must support POSIX ¥hreads, or VGBA-Unix will
not run. On the systems with optional threads support, please, add
this support prior to running VGBA-Unix.
Registered Users
If you've bought VGBA-Windows, please do not give your copy to
anybody. And I do mean anybody. There was a couple of cases when
registered users gave my programs away to their friends, relatives, or
just "KeWl" characters on the Net, and then I found my work pirated, spread
on IRC, put onto WWW pages, and even posted to USENET newsgroups. If I
find your personalized copy of VGBA being spread around, your
registration gets automatically cancelled which means no support and
no more updates.
I understand that the previous paragraph may sound threatening to some
people, but this kind of piracy really hurts my profits and feelings. I've
put a lot of effort into VGBA, and can only continue working on it if
people do not try to cheat on me.
It may also be a good idea to buy a real cartridge for each GameBoy
Advance ROM image you use with the emulator. GameBoy Advance software is
copyrighted, but as long as you own the real cartridge, you are protected
by the law allowing customers to backup bought software.
What is Included
This version of VGBA has emulation for the following:
- ARM7TDMI CPU with ARM and THUMB opcode sets.
- Internal RAM at addresses
0x03000000
(32kB) and
0x02000000
(256kB).
- Cartridge ROM at address
0x08000000
, mirrored at
0x0A000000
and 0x0C000000
.
- Cartridge RAM at address
0x0E000000
(64kB).
- Cartridge FlashROM (JEDEC) at address
0x0E000000
(64kB).
- Cartridge serial EEPROM at address
0x09000000
(64x64bits),
mirrored at 0x0B000000
and 0x0D000000
.
- Interrupts: VBlank, HBlank, line coincidence, timers, DMA, joypad.
- Timers: TIMER0, TIMER1, TIMER2, TIMER3.
- DMA channels: DMA0, DMA1, DMA2, DMA3.
- DMA modes (instantaneous, HBlank, VBlank, HRefresh) and repeat feature.
- Joypad buttons and interrupts.
- GameBoy-compatible melodic sound chip with GBA extensions.
- Two channels of GBA-specific "direct" sound.
Not emulated:
- DMA happens "instantly".
- CPU timings are close but not entirely correct. VGBA considers all
memory accesses as "sequential". There are some other discrepancies
as well, but overally, it should be pretty close.
GBA video subsystem is extremely complicated but has now been almost
fully emulated in the VGBA. Here is a list of emulated features:
Feature | Text BGs | Rotation BGs | MODE 3 | MODE 4 | MODE 5 | Sprites
|
Variable Size | YES | YES | N/A | N/A | N/A | YES
|
Tile Flipping | YES | N/A | N/A | N/A | N/A | YES
|
16/256-Color Tiles | YES | N/A | N/A | N/A | N/A | YES
|
Scrolling | YES | N/A | N/A | N/A | N/A | N/A
|
Mosaic | YES | YES | YES | YES | YES | rotated sprites only
|
Rotation | N/A | YES | YES | YES | YES | YES
|
Window | YES | YES | YES | YES | YES | YES
|
Color Effects | YES | YES | YES | YES | YES | YES
|
Including the real Nintendo BIOS with the emulator would be a copyright
violation. Therefore, I have tried to simulate GBA BIOS routines
by trapping and handling ARM SWI
opcodes. GBA BIOS is now
fully emulated except for the built-in music player and some networking
routines. Here is the list of supported BIOS calls:
Function | SWI # | Supported
|
BIOS_SoftReset | 0x00 | Yes
|
BIOS_RegisterRAMReset | 0x01 | Yes
|
BIOS_Halt | 0x02 | Yes
|
BIOS_Stop | 0x03 | Yes
|
BIOS_IntrWait | 0x04 | Yes
|
BIOS_VBlankIntrWait | 0x05 | Yes
|
BIOS_Div | 0x06 | Yes
|
BIOS_DivARM | 0x07 | Yes
|
BIOS_Sqrt | 0x08 | Yes
|
BIOS_ArcTan | 0x09 | Yes
|
BIOS_ArcTan2 | 0x0A | Yes
|
BIOS_CPUSet | 0x0B | Yes
|
BIOS_CPUFastSet | 0x0C | Yes
|
BIOS_BIOSChecksum | 0x0D | Yes
|
BIOS_BgAffineSet | 0x0E | Yes
|
BIOS_ObjAffineSet | 0x0F | Yes
|
BIOS_BitUnPack | 0x10 | Yes
|
BIOS_LZ77UnCompWRAM | 0x11 | Yes
|
BIOS_LZ77UnCompVRAM | 0x12 | Yes
|
BIOS_HuffUnComp | 0x13 | Yes
|
BIOS_RLUnCompWRAM | 0x14 | Yes
|
BIOS_RLUnCompVRAM | 0x15 | Yes
|
BIOS_Diff8bitUnFilterWRAM | 0x16 | Yes
|
BIOS_Diff8bitUnFilterVRAM | 0x17 | Yes
|
BIOS_Diff16bitUnFilter | 0x18 | Yes
|
BIOS_SoundBiasChange | 0x19 | No
|
BIOS_SoundDriverInit | 0x1A | No
|
BIOS_SoundDriverMode | 0x1B | No
|
BIOS_SoundDriverMain | 0x1C | No
|
BIOS_SoundDriverVSync | 0x1D | No
|
BIOS_SoundChannelClear | 0x1E | No
|
BIOS_MIDIKey2Freq | 0x1F | No
|
BIOS_MusicPlayerOpen | 0x20 | No
|
BIOS_MusicPlayerStart | 0x21 | No
|
BIOS_MusicPlayerStop | 0x22 | No
|
BIOS_MusicPlayerContinue | 0x23 | No
|
BIOS_MusicPlayerFadeOut | 0x24 | No
|
BIOS_MultiBoot | 0x25 | No
|
BIOS_HardReset | 0x26 | No
|
BIOS_CustomHalt | 0x27 | No
|
BIOS_SoundDriverVSyncOff | 0x28 | No
|
BIOS_SoundDriverVSyncOn | 0x29 | No
|
BIOS_GetJumpList | 0x2A | Yes
|
What is not Included
Absolutely no ROM images of commercial GameBoy Advance games are included.
These games are copyrighted by the companies which produced them, and
therefore, I cannot distribute any of these games. I'm also unable to tell
you where to find the games, so do not send me email asking for them. You
will have to look for them on your own.
The VGBA WWW page contains some links to GameBoy Advance cartridge copier
info. Cartridge copiers can be used to dump GameBoy Advance cartridges
into files. I cannot provide you with any additional information about
these copiers, so do not send me email asking for this information. Use
the copier-related links at the VGBA WWW page.
GameBoy Advance has a BIOS ROM inside with some useful subroutines.
Including the real Nintendo BIOS with the emulator would be clearly illegal.
Instead, VGBA tries to simulate GBA BIOS routines. It still has an option
to use the real BIOS supplied from the GBA.ROM
file in the
current directory. I cannot tell you where to find the real BIOS, so do
not ask me about it. The BIOS simulation is quite functional and becomes
better over time. It also runs faster than the real BIOS would on the
emulator.
Buttons
These button assignments apply to all three VGBA ports developed by myself.
They will work in Windows, Unix, and MSDOS.
[SPACE] - A button (also: [LALT],A,S,D,F,G,H,J,K,L)
[LCONTROL] - B button (also: Z,X,C,V,B,N,M)
[Q] - LEFT button (also: E,T,U,O)
[W] - RIGHT button (also: R,Y,I,P)
[TAB] - SELECT button
[ENTER] - START button
[ESC] - Quit emulation (also: [F12])
[F2] - Turn soundtrack logging on/off
[F3] - Turn A button autofire on/off
[F4] - Turn B button autofire on/off
[F5] - Turn LEFT button autofire on/off
[F6] - Turn RIGHT button autofire on/off
[F7] - Save emulation state to .STA file
[F8] - Load emulation state from .STA file
[F9] - Fast-forward emulation (also: [PAGEUP])
[F11] - Reset GBA hardware
[F12] - Quit emulation (also: [ESC])
[PAGEUP] - Fast-forward emulation (also: [F9])
[5]-[8] - Turn backgrounds display on/off
[9] - Turn sprites display on/off
With #define DEBUG:
[F1] - Go into the built-in debugger
With #define SOUND:
[-] - Decrease sound volume
[=] - Increase sound volume
[0] - Turn all sound on/off
[1]-[4] - Turn melodic sound channels on/off
[[],[]] - Turn direct sound channels on/off
Command Line Options
Start VGBA with the following command line:
vgba [-option1 [-option2...]] [FILENAME.GBA]
When no cartridge name is given, VGBA will print the list of keyboard
assignments and available command line options. Following is a list of
options supported in VGBA-MSDOS and VGBA-Unix. VGBA-Windows only accepts
the cartridge name.
-uperiod <period> - Number of interrupts per screen update [1]
-verbose <level> - Select debugging messages [1]
0 - Silent 1 - Startup messages
2 - I/O accesses 4 - Illegal memory accesses
8 - DMA transfers 16 - Illegal CPU ops
32 - SWI calls 64 - FlashROM/EEEPROM/RTC
128 - Sound messages
-crc/-nocrc - Check cartridge CRC/CMP [-crc]
-guesshw/-defaulthw - Guess FlashROM/EEPROM ID and size [-guesshw]
-flashid <id> - Set FlashROM maker/device ID [D4BFh]
-flash <bits> - Set FlashROM size, ≥16 bits [17]
-eeprom <bits> - Set EEPROM size, 6..16 bits [6]
-logsnd <filename> - Write soundtrack to a MIDI file [LOG.MID]
-ds <method> - Sound rendering method [0]
0 - Automatic 1 - Accurate
2 - Fast
-sync <frequency> - Sync screen updates to <frequency> [-nosync]
(<frequency> must be in 20Hz..100Hz range)
-nosync - Do not sync screen updates
With #define SOUND:
-sound [<quality>] - Sound emulation quality [44100]
0 - Off 1 - Adlib (MSDOS)
Values >8191 are treated as wave synthesis
frequencies.
-nosound - Same as '-sound 0'
With #define DEBUG:
-trap <address> - Trap execution when PC reaches address [FFFFh]
When a keyword 'now' is used in place of the
<address>, execution will trap immediately.
With #define MSDOS:
-vsync - Sync screen updates to VBlank [-nosync]
-tv/-notv - Simulate TV raster lines [-notv]
With #define UNIX:
-saver/-nosaver - Save CPU when inactive [-saver]
-scale <factor> - Scale window by <factor> [1]
With #define MITSHM:
-shm/-noshm - Use MIT SHM extensions for X [-shm]
Frequently Asked Questions
- I WANNA PLAY GAMES!!!! WHERE DO I GET GAMES???????
I do not know. I can't give you any due to both legal and moral reasons.
Please, do not mail me asking for games. I will delete your mail right
away, and you won't get an answer.
- Can I play GameBoy Classic and GameBoy Color games on VGBA?
No, you can't. GameBoy Advance hardware is completely different from the
older GameBoy and GameBoy Color models. To play older games, you may
want to consider my other emulator,
Virtual GameBoy
(VGB)
.
- How do I copy games from cartridges to a computer?
You can use a special device called cartridge copier, such as
Flash Advance Linker from
Lik-Sang. Don't forget to
get a rewritable flash card too.
- What is GameBoy Advance? How its hardware works?
GameBoy Advance (GBA) is a handheld videogame machine made by Nintendo. Its
hardware has nothing to do with GameBoy and GameBoy Color handhelds
previously produced by Nintendo. GBA is built around an ARM7TDMI 32bit
CPU running at 16MHz. GBA video subsystem is very similar to that of SNES,
but more advanced. The sound subsystem uses direct sample output. GBA also
includes the four-channel melodic sound chip from the original GameBoy.
In order to be compatible with the original GB/GBC, GBA includes the complete
set of GBC hardware. This hardware (aside from the sound chip) is not
accessible from the GBA side and only used when somebody inserts a GB/GBC
cartridge into GBA.
- There is no version of VGBA for my Unix!
I am trying to compile Unix binaries for as many flavors of Unix as
possible, but as I do not have access to many machines, do not expect
immediate support for every Unix flavor out there. Don't mail me asking
for the source either: VGBA source code is not publicly distrbutable,
as much as I regret to say this :(.
- My favorite game doesn't work on VGBA. What do I do?
There may be several reasons why a game has problems running on VGBA
or does not run at all.
- If emulator does not even recognize the ROM image, its CRC or CMP
may be wrong. Try turning CRC checking off by using the
-nocrc
option or clearing "Check Cartridge CMP" checkbox
in VGBA-Windows Setup Panel. You really ought to find an uncorrupted
ROM image though.
- The game may be using a different EEPROM type. EEPROM is a little
chip that sits on a cartridge and stores save-games. Some GBA games
use 64x64 EEPROMs (
-eeprom 6
) while others use
16384x64 EEPROMs (-eeprom 14
). In VGBA-Windows, you
can simply select the EEPROM type from the Setup Panel.
- If some sprites blink or do not appear at all, try changing
-uperiod
value (1 will give you the best picture, but
the slowest emulation), or moving an "Update Period" knob in the
VGBA-Windows Setup Panel.
- VGBA may not currently run this game. Not all games are supported at
this moment. Don't expect 100% compatibility with the real hardware.
At least, not yet :).
- There is no sound!
Since version 1.2, VGBA emulates both "melodic" (GameBoy-compatible)
and "direct" (GBA-specific) sound hardware. When using VGBA-Windows,
you will have to turn "Use MIDI for sound" option off to hear the
direct sound channels, as MIDI cannot be used to play direct sound.
Also make sure that direct sound channels are turned on in the Setup
Panel.
- Direct sound sounds really bad!
Use -ds
command line option (or corresponding options in the
VGBA-Windows Setup Panel) to choose the way VGBA renders direct sound. In
Windows, you should also try changing volume, sound rate, and the number
of sound buffers. If this doesn't help, you may be out of luck. Hopefully,
sound emulation becomes better in the upcoming versions.
- Why is VGBA so slow on my machine?
Because your machine is too slow to run VGBA. My experience shows that
you need at least a PentiumII/400 machine with fast video to run VGBA
at a reasonable speed. Following are the ways to speed things up:
- Increase Update Period. The picture will get more jerky, but VGBA
will become faster.
- On Unix, always use MIT Shared Memory Extension for X (MITSHM). This,
of course, means that you have to run VGB locally.
- On Windows and Unix, use 1:1 window to achieve the highest speed.
- On Windows, use MIDI sound, as wave synthesis takes quite a lot of
CPU time.
- VGBA is too fast on my machine! How do I slow it down?
Frankly, when I started writing VGBA, I never expected that it will be
too fast on any machine :). But times change...
- On Unix, use
-sync
option to tie screen updates to
the certain frequency (usually, 60Hz/UPeriod).
- On Windows, use "Sync To..." option in the Setup Panel to tie
screen updates to a certain frequency (usually, 60Hz divided by
UPeriod).
- Decrease Update Period to 2 or even to 1. The emulation
will become much slower, but smoother.
- On Windows and Unix, double or triple the window size.
- When starting VGBA-Unix, ld says that some library isn't found.
This may happen if the versions of your shared libraries are older than
the ones for which VGBA has been compiled. A decent way to deal with this
is to upgrade your Unix. A quick and dirty way is to make a symbolic link
from the existing library to a name required by VGBA.
- When starting VGBA-Unix, I get X_ShmAttach error.
You are probably trying to run VGBA-Unix on a remote Xterminal while it
attempts to use shared memory for interfacing with X. Use
-noshm
option to tell it not to use shared memory.
- When starting VGBA-Unix, I get X_PutImage error.
VGBA-Unix version currently needs 16bit X. Xterminals that do not support
16bit image format will not work.
- The sound is distorted in the VGBA-Windows. How do I fix it?
The wave-synthetized sound in VGBA may become distorted on slow or
highly loaded machines (no graphics acceleration, for example). There are
several ways you can improve sound:
- Use MIDI sound instead. It has both advantages and disadvantages
though.
- Make VGBA window smaller to decrease the load on the CPU. 1:1 is
the optimal size.
- Decrease the sound rate (in Setup Panel). The sound may become tinkier,
but less distorted.
- Increase the number of wave buffers (in Setup Panel). This may
cause sound to fall a second or two behind the screen action, but
the sound quality will become better.
- Does VGBA-Windows support joystick? My joystick doesn't work!
VGBA-Windows supports joystick. If your joystick does not work, go into
Windows Control Panel to see if it is configured and calibrated properly.
Also, some new joysticks working in esoteric standards (like GRiP) are
known to have problems.
- VGBA-Windows starts, but then quits immediately!
Check the pathname to wherever your VGBA is located. It should not contain
spaces. For example, "C:\Program Files\VGBA" is a bad place for VGBA, while
"C:\VGBA" will work. This bug is caused by an old version of C compiler I
am using. I hope to get rid of it when I switch to a new compiler.
UPDATE:
I have finally switched to a newer compiler in VGBA-Windows 1.7. If you
are still encountering this problem, please, let me know.
- Colors are all screwed up in VGBA-Windows!
VGBA-Windows requires Windows to be in 65536-color or better
color mode. When running Windows in 256-color mode, it will try to
approximate colors to existing ones, but expect results to be dismal.
- Black window in VGBA-Windows!
If you are running Windows in 256-color mode, then this is most likely
the cause of a problem. Try switching Windows into 65536-color or better
screen mode.
- Command line options don't work in VGBA-Windows!
They shouldn't. The demo version of VGBA-Windows supports no command
line interface at all. The full version will only accept the .GBA file
name at the command line, but no options. All configuration is done via
Setup Panel and VGBA.INI file.
- Volume control works strangely in VGBA-Windows!
It is a result of the volume control being shared between VGBA and other
Windows applications. You can usually restore normal volume by leaving VGBA
window and then activating it again.
- How do I save and load the GBA state during the game?
The GBA state can be saved by pressing [F7] button. The resulting
data file will have the same name as your .GBA file, but its extension is
going to be .STA. You can load state from this file by pressing [F8]
at any point in the game. This state file will also be loaded automatically
next time you start VGBA. The same state file is not guaranteed to work for
versions of VGBA running on a different hardware. State saving is not
perfect yet, so for some games state may not be correctly saved.
Notes to Demo Authors
This version of VGBA no longer simulates bugs of the previous emulators
(such as GBAEmu written by Tim Schuerewegen). This means that many demos
that made use of those bugs will not work on VGBA. But then, they would
not work on the real GBA hardware either. Following is a list of problems
that I've found. If you are a demo author, please, check your demos for
these problems and fix them:
- Prior to running the program, VGBA will check CMP and CRC of the
ROM image. If they do not match CMP/CRC given in the cartridge header,
VGBA will refuse to run the program. To make your program run, either
fix CMP/CRC (preferable) or use the
-nocrc
option. Also,
be aware that Nintendo requires CRC of a cartridge to be 0 i.e. your
ROM image must have padding bytes somewhere that compensate CRC to be
zero.
- Many demos use random areas of address space for RAM. Apparently,
GBAEmu will create RAM at any address accessed by the program. The
real GBA (according to the latest specification) is only going to
have RAM at addresses
0x03000000
(32kB) and
0x02000000
(256kB). Use only this memory.
- Many demos use cartridge address space (
0x08000000
and
up) as RAM. This is not correct as cartridge ROM is not
writable. Please, use RAM areas described above.
- In graphical screen modes (MODEs 3,4,5) the entire screen is treated
as background #2. This means that to actually show the screen you
have to enable background #2 in
DISPCONT
and set
appropriate bits in BG2CONT
.
- The backgrounds are shown in the order 0,1,2,3, with background #0
being on top and background #3 on the bottom. When you set different
background priorities, the backgrounds with lower priorities will
be on top.
- When using ARM data comparison opcodes, you should always set the
S
flag in the opcode. In fact, ARM7TDMI programming
manual explicitely requires this.
- At least two demos (FireDemo and ConsoleDev Demo) are
using reads from non-aligned addresses. While non-aligned reads are
a documented feature of ARM7TDMI CPU, they are rarely used and
cannot be efficiently simulated. The current VGBA binary has been
compiled to be compatible with these demos. In the next version,
I hope to use fast read functions that speed up emulation but
do not simulate non-aligned reads.
- Older (pre-TS2) development boards from Nintendo had hardware
different from the later boards (TS2 and up). VGBA will not
correctly run some programs compiled for TS1, such as programs using
interrupts.
Thanks
I would like to thank people from the EFNet #GBADEV IRC channel for
their help locating GBA specifications and testing the emulator.
© Copyright by
Marat Fayzullin
(fms [AT] cs /DOT/ umd <DOT> edu)