Pokémon Red and Blue/MissingNo.
This is a sub-page of Pokémon Red and Blue.
One of the most popular oddities in Pokémon and gaming history in general is the presence of a mysterious, glitchy non-Pokémon called "MissingNo."
Known in Japanese as けつばん ("Ketsuban", literally "Missing Number"), this placeholder is used to fill the empty entries in the Pokémon ID list. In the localized versions Red and Blue, there are 39 instances of the string "MissingNo.", each used by an empty entry in the internal index table. However, in the Japanese games 38 of the entries use the name Ketsuban, with the final blank entry instead using the name ゴースト (Ghost) and the Pokémon Tower ghost sprite. As mentioned in the Sprites section below, the graphic is used during the encounter with the ghost in the Pokémon Tower. Despite its graphic being used, this name text isn't normally visible, even during the battle. It's also the only instance of ゴースト (Ghost) in the ROM, as Spirits are always referred to in-game as ゆうれい (Yuurei).
Out of all of the instances of MissingNo., 36 of them use interpret garbage data when displaying a sprite, and due to the abnormally large size of this garbled graphic, viewing it causes the player's Hall of Fame data to become corrupted. However, the final three MissingNo. have legitimate sprite data:
Of all of the MissingNo, 30 have cries whose base, pitch, and length are set to 0:
Two entries, meanwhile, share their cries with existing Pokémon, respectively Zubat and Dragonair:
The remaining seven entries have unique cries which are not used by any other Pokémon:
Each MissingNo. is numbered #000 in the Pokédex, and since a Pokémon's base stats are ordered by Pokédex number rather than internal index number this results in all 39 MissingNo. sharing the same basic information, including types, stats, moves, and Pokédex data. However, none of this data is actually valid, as the game is actually reading data far beyond the boundaries of the base stats table, misinterpreting data used to define the parties of trainers as base stats.
The Pokédex entry for MissingNo. defines it as a "??? Pokémon" with a height of "1m" (3.3 ft), a weight of "10kg" (22.1 lb), and a placeholder Pokédex entry reading 「コメント さくせいちゅう」 ("Comment under construction"). However, this information was not translated or localized in the English versions of the games and became garbled, resulting in the Pokédex entry displaying an erroneous height of "10ft" (3.1 m) and a weight of "3507.2lb" (1590.8 kg).
As mentioned previously, only the last three MissingNo. have actual sprite data, though, interestingly, a 2020 Pokémon Blue source code leak revealed the back sprite that was once assigned to most of the entries. More information here.
In the English Red and Blue versions, the best-known way to find yourself face-to-face with a MissingNo. is to follow these steps:
- Traveling to Viridian City, then talking to the old man who shows you how to catch Pokémon and accepting to watch his demonstration.
- Once the tutorial is over, immediately use Fly to travel to Cinnabar Island or surf to Seafoam Islands (water route encounters will not overwrite land encounter data if there is no tall grass on the same route).
- Once there, surf up and down the east coast of the island on the tiles where the water borders the land. Depending on the name you chose for your player character, an assortment of Pokémon and trainers at varying levels will appear.
- If you used one of the game's preset names, or input a custom name that included the characters G, H, J, M, S, :, ], a, b, c, m, o, p, v, w, x, or y, you may find yourself battling a MissingNo.
The reasons for this curiosity are twofold:
First off, land/water border tiles are normally programmed to function like water tiles, and thus generate encounters with wild water Pokémon. However, the land/water border tiles on Cinnabar Island are unusual in that they behave like grass tiles. This means they attempt to generate encounters from the wild Pokémon encounter table, a list of Pokémon defined for each map. This table is normally repopulated each time a player enters an area containing wild Pokémon. However, because Cinnabar Island has no Pokémon encounter data, entering the map doesn't cause the table to update. As such, encounter data from the player's previous location remains in memory without being overwritten.
Secondly, during the Pokémon-catching demonstration in Viridian City, the player's name is changed to "OLD MAN". In order to preserve the player's moniker, their original name is stored into the wild Pokémon encounter table for the duration of the battle, then copied back over once the demo ends. As soon as the player enters an area with wild Pokémon encounters, this table will be repopulated, so this little programming sleight-of-hand normally has no effect on the game.
The combination of these two quirks is where things start to fall apart. Because Cinnabar lacks encounter data, entering the map does not cause the encounter table to repopulate. As a result, flying directly from Viridian to Cinnabar after watching the old man's demonstration results in the player's name remaining in the encounter table. The characters that make up the player's name are thus treated as encounter data, but these don't always correspond to valid Pokémon IDs. As the battles triggered by surfing up and down the coast of Cinnabar Island are drawn from this table, the player can, accordingly, expect to encounter anything from rare or legendary Pokémon to MissingNo., 'M, and glitched Trainers at impossibly high levels.
For a full list of which characters generate which encounters, refer to this chart on Bulbapedia.
Hall of Fame Corruption
A well-known consequence of encountering MissingNo. in battle is the corruption of the Hall of Fame data in the player's PC. The reason for this corruption is that the games use SRAM as temporary storage when decompressing sprites. MissingNo.'s garbage data is interpreted as a compressed picture, resulting in an extraordinarily large sprite that extends beyond the bounds of the sprite decompression buffer, overflowing into the Hall of Fame data that follows it, and overwriting some of the data there (the size of MissingNo.'s sprite is also the reason for wild MissingNo. encounter taking an abnormally long time to load.)
On a side note, what follows the Hall of Fame data is the sound engine data. In Red and Blue, MissingNo.'s sprite data isn't large enough to extend into it. In Yellow, however, it is, resulting in the sound engine data being interpreted as a Pokémon cry, and thus causing an unholy shriek as the battle begins.
One of the contributors to MissingNo.'s fame is the item duplication glitch: Any time the player encounters MissingNo., 'M, or another glitch Pokémon with Pokédex number 000, the game attempts to set the "Pokémon has been seen" flag for that number in the Pokédex. Due to an integer underflow when calculating the address of this flag, the game instead sets the highest bit of the quantity of the sixth item in the player's bag, which results in a 128 unit increase.
If you catch the 'mon, the sixth item duplicates again (assuming it's been reduced to less than 128).
This glitch is not present in Japanese Red, Green, and Blue, as no Pokémon encounters occur on the land/water border tiles. Meanwhile, this glitch was also fixed in the Spanish and Italian versions of Red and Blue by programming the border tiles to behave as water tiles. However, it still remains in the German and French versions of these games, though in the French version encountering either MissingNo. or 'M causes the game to freeze.
The glitch was removed in all versions of Yellow by blanking the encounter table before overwriting it, and programming the border tiles to avoid triggering Pokémon encounters, as was already the case in the Japanese games.
The glitch Pokémon 'M (whose name consists of corrupted graphics with "'M" in the middle) is often confused with MissingNo., as both can be encountered using the Old Man glitch, and both share the Pokédex number 000. However, unlike MissingNo., 'M is not pulled from unused internal index entries, but from unrelated data that follows the internal index. Its similarities to MissingNo. are coincidental.