Virtual GameBoy Advance Documentation

# Virtual GameBoy Advance
version 4.8

### by Marat Fayzullin

# Contents

- Disclaimers
- New in This Version
- Introduction
- VGBA Ports
- What is Included
- What is not Included
- Buttons
- Command Line Options
- Frequently Asked Questions
- History
- Thanks

# 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

- In VGBA-Windows, both full-screen and windowed modes now use Direct3D.
- Fixed switching between full-screen and windowed modes in VGBA-Windows.
- Ported fixes from VGBA-Android 4.8 to VGBA-Windows.
- Removed .STA files from the "Open File" dialog to avoid confusion.
- Fixed the documentation.

# Introduction

Virtual GameBoy Advance (VGBA) emulates 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://fms.komkon.org/VGBA/

VGBA is a logical continuation of my previous work in videogame emulation, namely, the Virtual GameBoy (VGB). VGB 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.

# VGBA Ports

Because VGBA is a very portable program, it can be compiled on many different platforms: Windows, Unix, Linux, Android, MacOS, MSDOS, etc. The complete up-to-date list of VGBA ports can be found at the VGBA homepage. Following are just the major VGBA ports:

## VGBA-Android

  The Android version of VGBA are available from Google Play:

  https://play.google.com/store/apps/details?id=com.fms.vgba2

  Once you download a copy, you should be able to use it on as many Android devices as you own, as long as they are all linked to the same Google Play account. Make sure to enable automatic updates, as VGBA-Android updates often. The Android version comes with many additional features, such as Cheatopedia with cheat codes for many popular games, State Exchange letting VGBA users exchange saved games, the Box Art Downloader, improved Network Play functionality, and more.

## VGBA-Windows

  The VGBA-Windows is now free for everyone to use and share. It can be downloaded from the VGBA homepage:

  http://fms.komkon.org/VGBA/

  For more information, take a look at my other products for Windows:

  http://fms.komkon.org/EmuWindows/

  As I have made VGBA-Windows free, it is no being sold via eSellerate. Existing users should go to the above site and download a fresh copy. If you wish to support my work on VGBA-Windows and other emulators, please consider buying VGBA-Android.

## VGBA-Unix and VGBA-Linux

  VGBA-Unix and VGBA-Linux are available freely in binary form from the VGBA homepage:

  http://fms.komkon.org/VGBA/

  I am always trying to compile it on as many different Unix and Linux flavors as I have handy at the moment.

## VGBA-Maemo and VGBA-Meego

  The VGBA-Maemo works on Nokia devices running Maemo or Meego OS. It is specifically optimized for Maemo platform and available for free from respective package repositories and VGBA homepage. As both Maemo and Meego platforms are dead, I am no longer developing for them though.

## VGBA-MSDOS

  I am no longer developing and supporting VGBA-MSDOS, as the MSDOS platform is completely dead nowadays. Older VGBA-MSDOS versions were sold as part of the VGBA-Windows package (now free) and used DOS4GW extender and VESA screen drivers on MSDOS and Windows platforms.

## VGBA-Symbian

  The VGBA-Symbian port ran on phones running the 3rd Edition of the Nokia S60 software. It is no longer being developed and supported, as Symbian and all its development tools are dead. You can still access some of my Symbian products at this address though:

  http://fms.komkon.org/EmuSymbian/

## VGBA-PocketPC

  The PocketPC version of VGBA has long been developed by Aaron Oneal. As PocketPC is long dead though, VGBA-PocketPC is dead as well. You can still get older PocketPC versions of VGBA and my other emulators from

  http://fms.komkon.org/MorphGear/

# 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 timings are not correct. 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.

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.

It may also be a good idea to buy a real cartridge for each GameBoy Advance ROM image you use with the emulator. Owning a real, physical cartridge is the right thing to do, both legally and ethically.

The VGBA web 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 web 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 current BIOS simulation is quite functional. 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]        - FIRE-A button (also: [SHIFT],A,S,D,F,G,H,J,K,L)
      [CONTROL]      - FIRE-B button (also: Z,X,C,V,B,N,M)
      [Q]            - FIRE-L button (also: E,T,U,O)
      [W]            - FIRE-R 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 FIRE-A button autofire on/off
      [ALT]+[F3]     - Turn FIRE-L button autofire on/off
      [F4]           - Turn FIRE-B button autofire on/off
      [ALT]+[F4]     - Turn FIRE-R button autofire on/off
      [F5]           - Invoke built-in menu
      [F6]           - Load emulation state from .STA file
      [F7]           - Save emulation state to .STA file
      [F8]           - Replay last few seconds of gameplay
      [F9]           - Fast-forward emulation (also: [PGUP])
      [F11]          - Reset GBA hardware
      [F12]          - Quit emulation (also: [ESC])
      [PGUP]         - Fast-forward emulation (also: [F9])
      [PGDOWN]       - Toggle GameShark cheats
      [5]-[8]        - Turn backgrounds display on/off
      [9]            - Turn sprites display on/off
      [-]            - Descrease light level (Boktai)
      [=]            - Increase light level (Boktai)

    With #define DEBUG:
      [F1]           - Go into the built-in debugger

    With #define SOUND:
      [ALT]+[PGUP]   - Increase audio volume
      [ALT]+[PGDOWN] - Decrease audio volume
      [0]            - Turn all sound on/off
      [1]-[4]        - Turn melodic sound channels on/off
      [[],[]]        - Turn direct sound channels on/off

    With #define WINDOWS:
      [ALT]+[ENTER]  - Switch between full scren and window modes

# 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.

      -skip <percent>     - Percentage of frames to skip [25]
      -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]
      -tilt/-rtc          - Emulate tilt sensor or real time clock chip [-rtc]
      -gs0/-gs1/-gs3      - GameShark cheats encryption: none/v1/v3 [-gs3]
      -logsnd <filename>  - Write soundtrack to a MIDI file [LOG.MID]
      -ds <method>        - Sound rendering method [1]
                            0 - Off                1 - Automatic
                            2 - Accurate           3 - Fast

    With #define SOUND:
      -sound [<quality>]  - Sound emulation quality [22050]
      -nosound            - Same as '-sound 0'

    With #define DEBUG:
      -trap <address>     - Trap execution when PC reaches address [FFFFFFFFh]
                            When a keyword 'now' is used in place of the
                            <address>, execution will trap immediately.

    With #define MSDOS or UNIX:
      -sync <frequency>   - Sync screen updates to <frequency> [-nosync]
                            (<frequency> must be in 20Hz..100Hz range)
      -nosync             - Do not sync screen updates [-nosync]
      -tv/-notv           - Simulate TV raster lines [-notv]
      -soft/-nosoft       - Scale screen up with softening [-nosoft]

    With #define MSDOS:
      -vsync              - Sync screen updates to VBlank [-vsync]

    With #define UNIX:
      -saver/-nosaver     - Save CPU when inactive [-saver]
      -scale <factor>     - Scale window by <factor> [2]

    With #define MITSHM:
      -shm/-noshm         - Use MIT SHM extensions for X [-shm]

# Frequently Asked Questions

1. 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.

2. 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).

3. 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.

4. 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.

5. 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 :(.

6. 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 64x64bit EEPROMs (`-eeprom 6`) while others use 16384x64bit 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 `-skip` value (0 will give you the best picture, but the slowest emulation), or moving an "Skip Frames" 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 :).

7. 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.

8. 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.
9. 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.
   - On Windows, use "Sync To..." option in the Setup Panel to tie screen updates to a certain frequency.
   - Decrease "Skip Frames" (`-skip` on Unix) value. The emulation will become much slower, but smoother.
   - On Windows and Unix, double or triple the window size.
10. 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.

11. 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.

12. 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.

13. 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.
14. 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.

15. 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.

16. 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.

17. 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.

# History

## New in Version 4.7

- Fixed corrupted background in Golden Sun battles.
- Fixed hangup and walk-then-roll in Legend Of Zelda: The Minish Cap.
- Greatly improved sound quality, fixing audio in many games.
- Resetting rotation when background priority changes, not size.
- Added large ring buffer to account for audio jitter.
- Added correct legacy noise channel emulation.
- Added configurable random noise generator to EMULib.
- Fixed restoring legacy sound chip state.
- Fixed arithmetic bug in the EMULib audio mixing routine.
- Moved GBA timers emulation into a separate function.
- No longer muffling legacy noise channel (no more need).
- Cleaned audio in Metroid Fusion and Metroid Zero Mission.
- Fixed scratching sounds in Castlevania: Circle Of The Moon title.
- Fixed distortions in Golden Sun and Golden Sun 2 intros.
- Removed debug messages from the BIOS emulation, making things faster.

## New in Version 4.6

- Added automated cheat search tool (press [F5] and select "Search cheats").
- Added always-on gameplay recording to VGBA-Unix (press [F8] to replay).
- Added "Save unencrypted" option to built-in menu.
- MULS/MLAS instructions no longer change C/V flags.
- Fixed saving .SAV files in VBA-compatible format on VGBA-Windows.
- Fixed window resizing in VGBA-Unix.

## New in Version 4.5

- Improved audio quality.
- Now saving VBA-compatible .SAV files by default.
- Added GameShark cheats emulation (both v1 and v3).
- Added backward compatibility with VBA .SAV files.
- Added week day register to the RTC emulation.
- Added light sensor emulation (Boktai and Boktai 2).
- Added gyro sensor emulation (Warioware Twisted).
- Added tilt sensor emulation (Yoshi Topsy Turvy, etc).
- Fixed RumblePak emulation (Warioware Twisted and Drill Dozer).
- Fixed sprite color blending (Boktai 2 and other games).
- Fixed FlashROM saves in Pokemon and other games.
- No longer generating HBlank and VBlank IRQs at the same time (EZ-Talk).
- No longer allowing ICount to fall too far behind after a DMA transfer (Lego Racers 2, etc.).
- Fixed rotation parameters initialization in ResetGBA() (Lego Racers 2, etc.).
- Fixed ResetCPU() to request THUMB-to-ARM switch from the emulation loop.
- Fixed handling of >16MB games by disabling EEPROM at 0x09000000.
- Fixed ArcTan2() BIOS function (Mario and Luigi dyeing minigame).
- Fixed SoftReset() BIOS function, no longer accepting an argument.
- Fixed CPUSet() BIOS function (Galidor and Final Fantasy 6).
- Fixed RegisterRAMReset() BIOS function to unconditionally reset DISPCONT and BLDCONT VDP registers (Spyro+Crash Fusion).
- Fixed tilt sensor emulation to use separate developer supplied Tilt() function rather than FIREL/FIRER button bits.
- Added BIOS read protection to ARMonARM emulation (Tetris Worlds, Onimusha Tactics, Salt Lake City 2002, etc.).
- Fixed ARM V-flag computation after subtraction (Caravan Heart).
- Fixed THUMB PUSH instruction for cases where DMA is initiated with PUSH.
- Fixed MOVLR/BLL instruction sequence in THUMB mode to correctly perform a call (Mario Golf Advance Tour).
- Fixed LDM/STM instructions accessing stack at misaligned addresses (Mario Golf Advance Tour).
- Fixed a typo in the SMLAL instruction (Lego Racers 2, etc.).
- Fixed color #0 transparency in VDP MODE4.
- Fixed `-ds` command line parameter to take values from 0 ("mute") to 3 ("fast").
- Disabling windows with invalid coordinates (fixed Sword Of Mana).
- Resetting rotation when BG size changes (fixed Rayman 3 Swamp Zone).
- Fixed After Burner in Sega Arcade Gallery (by handling illegal reads).
- Fixed playfield and in-game saves in Crazy Taxi (no longer hangs).
- VGBA-Windows, VGBA-MSDOS, and VGBA-Unix now use mouse buttons to simulate tilt sensor.
- Switched VGBA-Windows to Direct3D in full-screen mode.
- Fixed VGBA-Unix to correctly restore sound when mouse focus returns to the window.
- Reduced audio latency setting in VGBA-Unix to 50ms.

## New in Version 3.6

- Sound quality improved in games that frequently switch sampling frequency (Star Wars, etc.).
- Now saving melodic sound chip state. State file format changed.
- Added more graceful handling of fail conditions when loading state.
- Fixed LSR/ASR #0 instructions in ARMonARM emulation to act as LSR/ASR #32, in both THUMB and ARM modes.
- Fixed unaligned memory reads in ARMonARM emulation to work the same way they do on a real ARM (Pokemon no longer has glitches).
- Fixed STRB/STRH instructions in ARMonARM emulation to clear unused argument bits before calling BWrARM()/WWrARM().
- Moved state loading to `[F6]`, L/R button autofire toggles to `[ALT]+[F3]/[F4]`. This makes VGBA consistent with my other emulators.
- Added `[F8]` to toggle scanline simulation effect, `[ALT]+[F8]` to toggle image softening.
- Made VGBA-Symbian compatible with the S60 5th Edition found in Nokia 5800 and upcoming N97.
- VGBA-Maemo now uses x3 magnification when running in full-screen mode.
- Fixed `[F3]`, `[F4]`, `[F5]`, and `[F6]` keys in VGBA-Unix.

## New in Version 3.5

- Ported VGBA to Unix using the new EMULib framework. I will try to compile the new VGBA-Unix for as many Unix flavors as possible. At the moment, only Ubuntu Linux binaries are available.
- Ported VGBA to Maemo OS2008 used in N800 and N810 internet tablets from Nokia. VGBA-Maemo is specifically optimized for internet tablets using assembler modules from VGBA-Symbian.
- Renamed `-zoom/-nozoom` to `-soft/-nosoft`.
- Added `-scale` option to scale window on Unix.
- Options `-tv/-notv`, `-soft/-nosoft` now work for MSDOS, Unix, and Maemo.
- Changed VGBA-Maemo touch screen layout to place directional buttons on the left, fire buttons on the right.
- VGBA-Symbian display routines rewritten in ARM assembler for speed. This should mainly affect UIQ3 users but S60 users will also benefit.
- Split VGBA-Symbian configuration menu into four tabs, making "Video" and "Audio" settings separate.
- Added "Audio Latency", "Skip Frames", and "Sync Updates" settings to VGBA-Symbian.
- Documentation and built-in help changed, many inconsistencies removed.

## New in Version 3.4

- Fixed line coincidence bit not being cleared with each new scanline. This made Treasure Planet dialogs work.
- Fixed inline `WRdARM()` function to read from serial EEPROM.
- Fixed a memory corruption bug in the `SoftReset()` and `RegisterRAMReset()` routines. Lufia no longer crashes after a quick-save.
- Moved FlashROM and EEPROM memory allocation to `ResetGBA()` where it belongs.
- Now preserving debugger breakpoint settings when loading state.
- Now locking keyboard processing when inside built-in configuration menu or debugger.
- Added GBA-specific debugger view (press [N] in debugger).
- Added new, much better, scanline simulation and video softening effects to VGBA-Windows.
- VGBA-Windows full-screen mode now runs in 640x480 resolution.
- Now switching sound off when entering built-in menu in VGBA-Windows. This mainly affects melodic sound mode (i.e. MIDI).
- VGBA-MSDOS now runs in 640x480x15bpp VESA screen mode when `-zoom` or `-tv` options used, otherwise it runs in 320x200x15bpp screen mode.
- Added new "Fill & Soften" zoom mode to VGBA-Symbian. It is rather slow though.
- Added screen orientation and backlight controls to VGBA-Symbian.
- Fixed possible source of instabilities in the S60 open file dialog in VGBA-Symbian.
- Fixed exit via Symbian-specific menu.
- Fixed premature termination of the emulation thread when exiting VGBA-Symbian, soundtrack recording and config saving work again.
- VGBA-Symbian signed with a new certificate, as the old one has expired.

## New in Version 3.3

- Fixed rotated sprite mask rendering.
- Somewhat optimized rotated sprite rendering.
- Optimized BIOS emulation to use less floating point operations.
- Fixed an LDR/STR display bug in the ARM debugger.
- Added a universal LoadFile() function.
- Rehashed built-in menu options to make them more accessible.
- Further extended and optimized Symbian screen rendering routines.
- Fixed a bug in VGBA-Windows that started MIDI logging on entering the debugger.
- Finally fixed opendir() problem in EMULib-Symbian. All built-in menu file dialogs work now!
- VGBA-Symbian application menu is now split into three pages.
- Added configurable button and key mappings to VGBA-Symbian.
- Added "fill screen" zoom option to VGBA-Symbian.
- Added frame rate display option to VGBA-Symbian.
- Added MIDI soundtrack logging to VGBA-Symbian (melodic sound only, saved into E:\Sounds and can be used as ringtones).
- Fixed and optimized TV scanline simulation in VGBA-Symbian.
- Made scanline effect stronger in VGBA-Symbian.

## New in Version 3.2

- Fixed immediate argument handling in MSR opcode.
- Accelerated BX opcode.
- Fixed and improved built-in debugger.
- Added built-in configuration menu ([F5]). FIRE-L autofire switch has moved to [CONTROL]+[F5].
- Introduced mode bits and the proper ResetGBA() function (state file format has changed).
- Made VGBA reuse previously allocated memory if the new allocation fails. This should help VGBA-Symbian on the phones with small memory.

## New in Version 3.1

- MSDOS and Windows versions are now based on the new framework.
- Windows version has got a new simplified user interface.
- Windows version now runs faster with larger windows.
- Started adding Nintendo DS emulation (not yet complete).
- Added tilt sensor emulation (use `-tilt` option).
- Added screen buffer based ARM debugger.
- Replaced "updates per VBlank" (`-uperiod`) with "percentage of skipped frames" option (`-skip`).
- Further improved audio quality.

## New in Version 3.0

- 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.

## 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 :)

# 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 (marat [AT] komkon /DOT/ org)