SNES Development
Secret of Evermore SRAM Format

This is a guide to the Secret of Evermore SRAM, the section of memory in the Secret of Evermore cartridge used to save your progress.

SRAM Basics

Secret of Evermore, like most SNES games, used an SRAM of 0x2000 (8 KB) bytes to store its information. Up to four games could be save. Each game used 0x331 bytes of SRAM. This means 0xCC4 bytes of SRAM are reserved for the game data, with 0x133C bytes used for other things (some unused). In this document, we are only interested in the 0xCC4 bytes of save game data.

Not all of the information contained in the save game data is known. Most of what is undocumented is related to quest progress and opened or already found treasure. The only major items of interest that I’ve yet to find are the save location, and the rare quest items.

Here is a short listing of what is known in no particular order. The sanity (aka checksum) data, the known alchemys and their levels, the boy’s and dog’s stats (name, experience, level, HP, and MP), the money (talons, jewels, gold coins, and credits), and the inventory (alchemy ingredients, items, armors, weapons, helmets, gauntlets, collars, trade goods, and charms).

The first game starts at 0x2 in the SRAM, and after its 0x331 bytes, the second game starts and so on for the four games.

SRAM Offsets

This information is presented in no particular order. Similar information will be grouped together.

When an offset is listed, this offset is relative to the start of the game data. For example, if I said the boy’s name is at offset 0x26, this would be 0x28 (0x2 + 0x26) from the start of SRAM for game 1, and 0x359 (0x2 + 0x331 + 0x26), and so on.

Data in the SRAM is stored in little endian format, the format used by the SNES processor. This means words are stored with their least significant byte first. For instance, 400 is 0x190 in hex, which is two bytes 0x01 and 0x90. In little endian, this would be 0x9001 [90 01]. Mostly, this just means reverse the bytes. There are plenty of endian guides on the web if you need a more in-depth explanation.

GroupOffsetLengthDescription
Sanity Data0x0000x02The Sanity / Checksum Word
Boy’s Stats0x0260x22Name
Boy’s Stats0x09DLevel
Boy’s Stats0x06E0x02Current HP
Boy’s Stats0x08E0x02Max HP
Boy’s Stats0x09A0x03Experience
Dog’s Stats0x04A0x22Name
Dog’s Stats0x0DELevel
Dog’s Stats0x0AF0x02Current HP
Dog’s Stats0x0CF0x02Max HP
Dog’s Stats0x0DB0x03Experience
Money Types0x0FC0x03Talons
Money Types0x0FF0x03Jewels
Money Types0x1020x03Gold Coins
Money Types0x1050x03Credits
Weapon Inventory0x279Bit 1Bone Crusher
Weapon Inventory0x279Bit 2Gladiator Sword
Weapon Inventory0x279Bit 3Crusader Sword
Weapon Inventory0x279Bit 4Neutron Blade
Weapon Inventory0x279Bit 5Spider’s Claw
Weapon Inventory0x279Bit 6Bronze Axe
Weapon Inventory0x279Bit 7Knight Basher
Weapon Inventory0x27ABit 0Atom Smasher
Weapon Inventory0x27ABit 1Horn Spear
Weapon Inventory0x27ABit 2Bronze Spear
Weapon Inventory0x27ABit 3Lance
Weapon Inventory0x27ABit 4Laser Lance
Weapon Inventory0x27ABit 5Bazooka
Weapon Levels0x1150x01Minor: Bone Crusher
Weapon Levels0x1160x01Major: Bone Crusher
Weapon Levels0x1170x01Minor: Gladiator Sword
Weapon Levels0x1180x01Major: Gladiator Sword
Weapon Levels0x1190x01Minor: Crusader Sword
Weapon Levels0x11A0x01Major: Crusader Sword
Weapon Levels0x11B0x01Minor: Neutron Sword
Weapon Levels0x11C0x01Major: Neutron Sword
Weapon Levels0x11D0x01Minor: Spider’s Claw
Weapon Levels0x11E0x01Major: Spider’s Claw
Weapon Levels0x11F0x01Minor: Bronze Axe
Weapon Levels0x1200x01Major: Bronze Axe
Weapon Levels0x1210x01Minor: Knight Basher
Weapon Levels0x1220x01Major: Knight Basher
Weapon Levels0x1230x01Minor: Atom Smasher
Weapon Levels0x1240x01Major: Atom Smasher
Weapon Levels0x1250x01Minor: Horn Spear
Weapon Levels0x1260x01Major: Horn Spear
Weapon Levels0x1270x01Minor: Bronze Spear
Weapon Levels0x1280x01Major: Bronze Spear
Weapon Levels0x1290x01Minor: Lance
Weapon Levels0x12A0x01Major: Lance
Weapon Levels0x12A0x01Minor: Laser Lance
Weapon Levels0x12B0x01Major: Laser Lance
Weapon Levels0x13D0x01Minor: Dog’s Attack Level
Weapon Levels0x13E0x01Major: Dog’s Attack Level
Alchemy Ingredients0x2890x01Wax
Alchemy Ingredients0x28A0x01Water
Alchemy Ingredients0x28B0x01Vinegar
Alchemy Ingredients0x28C0x01Root
Alchemy Ingredients0x28D0x01Oil
Alchemy Ingredients0x28E0x01Mushroom
Alchemy Ingredients0x28F0x01Mud Pepper
Alchemy Ingredients0x2900x01Meteorite
Alchemy Ingredients0x2910x01Limestone
Alchemy Ingredients0x2920x01Iron
Alchemy Ingredients0x2930x01Gunpowder
Alchemy Ingredients0x2940x01Grease
Alchemy Ingredients0x2950x01Feather
Alchemy Ingredients0x2960x01Ethanol
Alchemy Ingredients0x2970x01Dry Ice
Alchemy Ingredients0x2980x01Crystal
Alchemy Ingredients0x2990x01Clay
Alchemy Ingredients0x29A0x01Brimstone
Alchemy Ingredients0x29B0x01Bone
Alchemy Ingredients0x29C0x01Atlas Medallion
Alchemy Ingredients0x29D0x01Ash
Alchemy Ingredients0x29E0x01Acorn
Alchemy Inventory0x1F7Bit 0Acid Rain
Alchemy Inventory0x1F7Bit 1Atlas
Alchemy Inventory0x1F7Bit 2Barrier
Alchemy Inventory0x1F7Bit 3Call Up
Alchemy Inventory0x1F7Bit 4Corrosion
Alchemy Inventory0x1F7Bit 5Crush
Alchemy Inventory0x1F7Bit 6Cure
Alchemy Inventory0x1F7Bit 7Defend
Alchemy Inventory0x1F8Bit 0Double Drain
Alchemy Inventory0x1F8Bit 1Drain
Alchemy Inventory0x1F8Bit 2Energize
Alchemy Inventory0x1F8Bit 3Escape
Alchemy Inventory0x1F8Bit 4Explosion
Alchemy Inventory0x1F8Bit 5Fireball
Alchemy Inventory0x1F8Bit 6Fire Power
Alchemy Inventory0x1F8Bit 7Flash
Alchemy Inventory0x1F9Bit 0Force Field
Alchemy Inventory0x1F9Bit 1Hard Ball
Alchemy Inventory0x1F9Bit 2Heal
Alchemy Inventory0x1F9Bit 3Lance
Alchemy Inventory0x1F9Bit 4Laser (Dummied Alchemy)
Alchemy Inventory0x1F9Bit 5Levitate
Alchemy Inventory0x1F9Bit 6Lightning Storm
Alchemy Inventory0x1F9Bit 7Miracle Cure
Alchemy Inventory0x1FABit 0Nitro
Alchemy Inventory0x1FABit 1One Up
Alchemy Inventory0x1FABit 2Reflect
Alchemy Inventory0x1FABit 3Regrowth
Alchemy Inventory0x1FABit 4Revealer
Alchemy Inventory0x1FABit 5Revive
Alchemy Inventory0x1FABit 6Slow Burn
Alchemy Inventory0x1FABit 7Speed
Alchemy Inventory0x1FBBit 0Sting
Alchemy Inventory0x1FBBit 1Stop
Alchemy Inventory0x1FBBit 2Super Heal
Alchemy Levels0x1550x02Minor: Acid Rain
Alchemy Levels0x1570x02Minor: Atlas
Alchemy Levels0x1590x02Minor: Barrier
Alchemy Levels0x15B0x02Minor: Call Up
Alchemy Levels0x15D0x02Minor: Corrosion
Alchemy Levels0x15F0x02Minor: Crush
Alchemy Levels0x1610x02Minor: Cure
Alchemy Levels0x1630x02Minor: Defend
Alchemy Levels0x1650x02Minor: Double Drain
Alchemy Levels0x1670x02Minor: Drain
Alchemy Levels0x1690x02Minor: Energize
Alchemy Levels0x16B0x02Minor: Escape
Alchemy Levels0x16D0x02Minor: Explosion
Alchemy Levels0x16F0x02Minor: Fireball
Alchemy Levels0x1710x02Minor: Fire Power
Alchemy Levels0x1730x02Minor: Flash
Alchemy Levels0x1750x02Minor: Force Field
Alchemy Levels0x1770x02Minor: Hard Ball
Alchemy Levels0x1790x02Minor: Heal
Alchemy Levels0x17B0x02Minor: Lance
Alchemy Levels0x17D0x02Minor: Laser (Dummied Alchemy)
Alchemy Levels0x17F0x02Minor: Levitate
Alchemy Levels0x1810x02Minor: Lightning Storm
Alchemy Levels0x1830x02Minor: Miracle Cure
Alchemy Levels0x1850x02Minor: Nitro
Alchemy Levels0x1870x02Minor: One Up
Alchemy Levels0x1890x02Minor: Reflect
Alchemy Levels0x18B0x02Minor: Regrowth
Alchemy Levels0x18D0x02Minor: Revealer
Alchemy Levels0x18F0x02Minor: Revive
Alchemy Levels0x1910x02Minor: Slow Burn
Alchemy Levels0x1930x02Minor: Speed
Alchemy Levels0x1950x02Minor: Sting
Alchemy Levels0x1970x02Minor: Stop
Alchemy Levels0x1990x02Minor: Super Heal
Alchemy Levels0x19B0x02Major: Acid Rain
Alchemy Levels0x19D0x02Major: Atlas
Alchemy Levels0x19F0x02Major: Barrier
Alchemy Levels0x1A10x02Major: Call Up
Alchemy Levels0x1A30x02Major: Corrosion
Alchemy Levels0x1A50x02Major: Crush
Alchemy Levels0x1A70x02Major: Cure
Alchemy Levels0x1A90x02Major: Defend
Alchemy Levels0x1AB0x02Major: Double Drain
Alchemy Levels0x1AD0x02Major: Drain
Alchemy Levels0x1AF0x02Major: Energize
Alchemy Levels0x1B10x02Major: Escape
Alchemy Levels0x1B30x02Major: Explosion
Alchemy Levels0x1B50x02Major: Fireball
Alchemy Levels0x1B70x02Major: Fire Power
Alchemy Levels0x1B90x02Major: Flash
Alchemy Levels0x1BB0x02Major: Force Field
Alchemy Levels0x1BD0x02Major: Hard Ball
Alchemy Levels0x1BF0x02Major: Heal
Alchemy Levels0x1C10x02Major: Lance
Alchemy Levels0x1C30x02Major: Laser (Dummied Alchemy)
Alchemy Levels0x1C50x02Major: Levitate
Alchemy Levels0x1C70x02Major: Lightning Storm
Alchemy Levels0x1C90x02Major: Miracle Cure
Alchemy Levels0x1CB0x02Major: Nitro
Alchemy Levels0x1CD0x02Major: One Up
Alchemy Levels0x1CF0x02Major: Reflect
Alchemy Levels0x1D10x02Major: Regrowth
Alchemy Levels0x1D30x02Major: Revealer
Alchemy Levels0x1D50x02Major: Revive
Alchemy Levels0x1D70x02Major: Slow Burn
Alchemy Levels0x1D90x02Major: Speed
Alchemy Levels0x1DB0x02Major: Sting
Alchemy Levels0x1DD0x02Major: Stop
Alchemy Levels0x1DF0x02Major: Super Heal
Inventory Items0x29F0x01Petal
Inventory Items0x2A00x01Nectar
Inventory Items0x2A10x01Honey
Inventory Items0x2A20x01Dog Biscuit
Inventory Items0x2A30x01Wings
Inventory Items0x2A40x01Essence
Inventory Items0x2A50x01Pixie Dust
Inventory Items0x2A60x01Call Bead
Inventory Items0x2A70x01Grass Vest
Inventory Items0x2A80x01Shell Plate
Inventory Items0x2A90x01Dino Skin
Inventory Items0x2AA0x01Bronze Armor
Inventory Items0x2AB0x01Stone Vest
Inventory Items0x2AC0x01Centurion Cape
Inventory Items0x2AD0x01Silver Mail
Inventory Items0x2AE0x01Gold Plated Vest
Inventory Items0x2AF0x01Shining Armor
Inventory Items0x2B00x01Magna Mail
Inventory Items0x2B10x01Titanium Vest
Inventory Items0x2B20x01Virtual Vest
Inventory Items0x2B30x01Grass Hat
Inventory Items0x2B40x01Shell Hat
Inventory Items0x2B50x01Dino Helm
Inventory Items0x2B60x01Bronze Helmet
Inventory Items0x2B70x01Obsidian Helm
Inventory Items0x2B80x01Centurion Helm
Inventory Items0x2B90x01Titan’s Crown
Inventory Items0x2BA0x01Dragon Helm
Inventory Items0x2BB0x01Knight’s Helm
Inventory Items0x2BC0x01Lightning Helm
Inventory Items0x2BD0x01Old Reliable
Inventory Items0x2BE0x01Brainstorm
Inventory Items0x2BF0x01Vine Bracelet
Inventory Items0x2C00x01Mammoth Guard
Inventory Items0x2C10x01Claw Guard
Inventory Items0x2C20x01Serpent Bracer
Inventory Items0x2C30x01Bronze Gauntlet
Inventory Items0x2C40x01Gloves of Ra
Inventory Items0x2C50x01Iron Bracer
Inventory Items0x2C60x01Magician’s Ring
Inventory Items0x2C70x01Dragon’s Claw
Inventory Items0x2C80x01Cyberglove
Inventory Items0x2C90x01Protector Ring
Inventory Items0x2CA0x01Virtual Glove
Inventory Items0x2CB0x01Leather Collar
Inventory Items0x2CC0x01Spiky Collar
Inventory Items0x2CD0x01Defender Collar
Inventory Items0x2CE0x01Spot’s Collar
Inventory Items0x2CF0x01Thunderball
Inventory Items0x2D00x01Particle Bomb
Inventory Items0x2D10x01Cryo-Blast
Inventory Items0x3150x01Annihilation Amulet
Inventory Items0x3160x01Beads
Inventory Items0x3170x01Ceramic Pot
Inventory Items0x3180x01Chicken
Inventory Items0x3190x01Golden Jackal
Inventory Items0x31A0x01Jeweled Scarab
Inventory Items0x31B0x01Limestone Tablet
Inventory Items0x31C0x01Perfume
Inventory Items0x31D0x01Rice
Inventory Items0x31E0x01Spice
Inventory Items0x31F0x01Souvenir Spoon
Inventory Items0x3200x01Tapestry
Inventory Items0x3210x01Ticket for Exhibition
Charms0x200Bit 5Armor Polish
Charms0x200Bit 6Chocobo Egg
Charms0x200Bit 7Insect Incense
Charms0x201Bit 0Jade Disk
Charms0x201Bit 1Jaguar Ring
Charms0x201Bit 2Magic Gourd
Charms0x201Bit 3Moxa Stick
Charms0x201Bit 4Oracle Bone
Charms0x201Bit 5Ruby Heart
Charms0x201Bit 6Silver Sheath
Charms0x201Bit 7Staff of Life
Charms0x202Bit 0Sun Stone
Charms0x202Bit 1Thug’s Cloak
Charms0x202Bit 2Wizard’s Coin

Names

The boy and dog’s names have storage space for 34 characters (null terminated). However the game limits you to 15 character names. Using longer names is untested.

The name is ASCII encoded, and names can consist of the entire alphabet (upper and lowercase), the numbers 0-9, and the characters , (comma), . (period), ! (exclamation point), ’ (apostrophe), \ (backslash), - (hyphen), & (ampersand), # (pound), and (space). This is the alphabet the game limits you to using. Using characters outside this alphabet is untested.

The German and Spanish versions have slightly different alphabets for the names. In the Spanish version, # is replaced by the ñ. It is encoded in the name with the value 0xD7, not the unicode value 0x00F1.

In the German version, the numbers 0, and 4-9 are replaced by the capital and lower case vowels with umlauts and the eszett ß character. Their values are encoded as follows:

CharacterCode
Ä0xCB
Ö0xDB
Ü0xDF
ä0xE3
ö0xEF
ü0xF3
ß0xC6

The byte immediately after the character’s name must be the null terminator (00). If there is no terminator, the game will crash on load.

Levels

The valid range for levels are 1-99.

Health Points

The valid range for HP is 0-999, though the max should probably be at least 1.

Experience

The valid range for experience is 0-7562471. The high value is the dog’s level 99 experience. Anything more than that is pointless.

Money Types

The next offsets are for the money types in the game. Their valid range is 0-16,777,215. The high value is the max value for an unsigned 24-bit number.

Weapon Inventory

The next offsets are for the weapon inventory. There is a single bit for each weapon. The first value is the offset in the SRAM, and the second is the bit that controls it. A set bit (1) means you have the weapon, and a clear bit means you do not have it.

Bit number start at 0 and go through 7 and run right to left. For example, in the byte with bit pattern 10010010, bit 0 is clear and bit 7 is set.

Weapon Levels

The next set of offsets are for the weapon levels. The first offset is for the major level (1-3), and the second is for the minor (power up progression).

The minor level ranges from 0-255. The status screen only shows values from 0-99. To convert between the actual value and the shown value, just divide the minor level by 2.56 and ignore the decimal places.

Alchemy Ingredients

The next set of offsets are for the alchemy ingredients. Their valid range is from 0-99.

Alchemy Inventory

The next offsets are for the alchemy inventory. Just like the weapon inventory, the first value is the offset and the second is the bit that controls it. A set bit means you know the alchemy, and a clear bit means you don’t.

Alchemy Levels

The next set of offsets are for the alchemy levels. The first offset is their major level (0-9), and the second is their minor level (power-up progress). The minor level can range from 0-99. For some reason, both of these offsets are 2 bytes, but since the values never exceed 255, you can just ignore their second byte and treat them like a single byte value.

Inventory Items

The next offsets are for the inventory items, which include the common items, equipment, and trade goods. In other words, anything that can be bought, sold, or traded.

Most items have a valid range of 0-6, but a few can be up to 99. These include call beads, bazooka ammunition, and all the trade goods.

Charms

The final offsets are for the charms. They are just like the weapon and alchemy inventories. The first value is the offset, and the second is the controlling bit.

Unknown

The remaining values in the SRAM are unknown. Please update this guide if there you figure them out.

The Sanity Algorithm

As described earlier, Secret of Evermore uses two bytes of sanity data to ensure the SRAM is still being saved by the battery. This section describes that algorithm.

The following is the actual algorithm in the US version, obtained using Geiger’s Snes9x debugger. I have commented each line.

$8D/B469 A0 2F 03    LDY #$032F             ; load 0x32F into counter
$8D/B46C 22 78 B4 8D JSL $8DB478[$8D:B478]  ; jump to subroutine

$8D/B478 A9 3F 04    LDA #$043F             ; a = 0x43F
$8D/B47B E2 20       SEP #$20               ; use 8-bit accumulator
$8D/B47D 18          CLC                    ; clear carry
$8D/B47E 7D 00 00    ADC $0000,x[$30:6666]  ; add data[offset]

$8D/B481 88          DEY                    ; y = y - 1
$8D/B482 F0 0B       BEQ $0B    [$B48F]     ; branch if y = 0
$8D/B484 E8          INX                    ; x = x + 1
$8D/B485 C2 20       REP #$20               ; use 16-bit accumulator
$8D/B487 0A          ASL A                  ; shift left
$8D/B488 E2 20       SEP #$20               ; use 8-bit accumulator
$8D/B48A 7D 00 00    ADC $0000,x[$30:6667]  ; add data[offset]
$8D/B48D 80 F2       BRA $F2    [$B481]     ; branch always

$8D/B48F C2 20       REP #$20               ; use 16-bit accumulator
$8D/B491 6B          RTL                    ; return from subroutine

The algorithm is fairly straightforward. First, we take an accumulator and initialize it with 0x043F. The first byte of game data is added to the lower byte of our accumulator. If a carry results, we ignore it.

Next we start a loop. We shift the accumulator left by 1. The shifted bit is placed in the carry. Then we add the next byte of data to the lower byte of our accumulator. The carry is also added here and reset to 0. If our addition results in a carry, it will be placed in the carry. This process is repeated for every byte of game data. Note that the carry from our addition will be ignored due to the shift that always occurs following the next iteration of the loop.

In the European versions, the algorithm is only slightly different. Change the initial value 0x43F to 0x16FF. This is the only difference.

Here is the C++ routine from soesrame I wrote (based on C source from phonymike).

    quint16 SRAMFile::checksum(int game) const {
    	quint32 checksum = 0x43F;
    	unsigned char temp = checksum + sram[SRAM_GAME_OFFSET + 2 + game * SRAM_GAME_SIZE];
    	for(int i = 3; i < SRAM_GAME_SIZE; ++i){
    		checksum &= 0xFF00;
    		checksum |= temp;
    		checksum <<= 1;
    		if(checksum > 0xFFFF){
    			checksum -= 0xFFFF;
    		}
    		temp = checksum + sram[SRAM_GAME_OFFSET + i + game * SRAM_GAME_SIZE];
    	}
    	return static_cast<quint16>(checksum);
    }

To clear up any confusion, a quint16 is a 16-bit unsigned integer and a quint32 is an unsigned 32-bit integer. These are types defined by the Qt library which is used by soesrame.

When you edit the SRAM by hand, the checksum will be wrong. To get around this, you can either fix the checksum, or have the game skip the sanity check. The latter can be accomplished by using a game gene code. DDA4-17E1 will do this. If you try to skip the sanity check with a game genie code, and have invalid game data in any of the four slots, the game is quite likely to crash.

You can get the code for a C program which will fix the sanity data for an SRAM file, as well as a Windows & Mac OS X binary here: Secret of Evermore - SRAM Checksum Tool. For other platforms, you will need to compile it yourself. It is written in standard ANSI C, so it should run anywhere.

If you are compiling on a big endian platform, you will need to define BYTE_ORDER_BIGENDIAN at compile time. PowerPC and Sparc machines are probably the most common big endian platforms. Intel machines (x86) are little endian.

gcc -o soe-sanity soe-sanity.c

Will build the program using gcc on a little endian platform.

gcc -DBYTE_ORDER_BIGENDIAN -o soe-sanity soe-sanity.c

Will build the program using gcc on a big endian machine. I don’t have much experience with compilers other than gcc, so you’ll have to figure it out yourself if you’re using something else.

The program has a simple interface. Specify the sram filename, the game that needs fixing, and the version of the game (us or europe). It defaults to game 1 and the US version.

Examples:
  soe-sanity "Secret of Evermore (U).srm"
  soe-sanity "Secret of Evermore (G).srm" --game 2 --version europe

The first one fixes the checksum for the first game using the US algorithm. The second one fixes the checksum for the second game using the European algorithm.

soesrame - Secret of Evermore SRAM Editor

For those that don’t want to play around with the SRAM directly, I have written a program that edits all the values documented here. It’s also nice in that it keeps the values within their valid ranges, and handles the sanity data for you.

You can find it at http://games.technoplaza.net/soesrame/. There are binaries for Windows, Mac OS X, and Linux. It should work on any platform that supports Qt, so it should work on any unice with X Windows. The full source is available as well.

Credits & Acknowledgements

I want to thank phonymike for discovering and documenting the checksum algorithm used by Secret of Evermore. He was also very helpful in answering questions I had about his code.

Thanks to Geiger for his debugging Snes9x version and the entire Snes9x team for Snes9x. Without it, it would have been very difficult to find the SRAM offsets.

Written by John David Ratliff (webmaster at technoplaza dot net / http://www.technoplaza.net/feedback.php)

The most recent version of this guide can always be found at http://games.technoplaza.net/soesrame/sram-doc.txt

Copyright (C) 2006-2008 emuWorks (http://games.technoplaza.net/)

This document is Copyright (C) 2006 emuWorks (http://games.technoplaza.net/). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at http://www.gnu.org/licenses/fdl.html

Basically, it is free documentation in much the same way software under the GNU General Public License is free software. You can modify it, redistribute it, sell it, publish it, etc.