When we talk about fonts in video games, we are not talking about typography in the modern web sense. We are talking about letterforms burned into ROMs, squeezed into 8×8 pixel grids, and drawn by hand on graph paper before being converted to hexadecimal. These fonts are the visual voice of the machine. They tell you whether you are playing a 1977 Atari VCS cartridge, a 1985 Famicom disk, or a 1994 Neo Geo AES title. For anyone reverse-engineering old hardware or crafting pixel art from the 1977–1999 window, game fonts are a direct record of memory maps, tile budgets, and the creative decisions forced by technical constraints.
This article is not a nostalgia trip. It is a practical look at how game fonts were built, why some of them became iconic, and what they can teach us about working inside strict hardware limits. I will cover the tile-based systems that defined most of the era, the specific fonts that still hold up, and the tradeoffs designers made when every glyph had to earn its place in a character ROM.

Why Game Fonts Are a Hardware Story First
Before a font could be beautiful, it had to fit. On the Nintendo Entertainment System, the picture processing unit addressed two pattern tables, each holding 256 tiles of 8×8 pixels. A single tile could be a background element, a sprite, or a glyph. The font was not a separate asset. It lived inside the same character ROM as the rest of the game. If a designer wanted a full uppercase and lowercase alphabet, plus numbers and punctuation, that was already more than 60 tiles. Add Japanese kana, and the budget disappeared fast.
This is why so many early games used uppercase-only fonts. It was not a stylistic choice. It was a memory decision. Uppercase letters could be drawn more legibly in an 8×8 grid, and dropping lowercase saved dozens of tiles for enemy sprites or background patterns. The same logic applied to the Atari 2600, where the TIA chip had no native text mode at all. Programmers drew letters as playfield graphics, often using the two-line kernel to fake a six-digit score. The famous Atari font, with its blocky, squared-off digits, was a direct result of the playfield register’s 20-bit width and the need to update it in real time.
When I reverse-engineer a cartridge, I start by dumping the character ROM and looking at the tile order. The font is usually the first thing that makes sense. It is a map of the developer’s priorities. If the font is clean and complete, the team had time and ROM space. If it is cramped or missing punctuation, the game was fighting for every byte.
The Fonts That Defined the Era
The Nintendo “Chicago” Style
Nintendo’s first-party NES games used a font that many players now call the “Nintendo font.” It was not a single typeface. It was a family of 8×8 tile fonts with thick, rounded strokes and a slightly condensed width. The uppercase letters were designed to be readable on a CRT television, where the signal would blur the edges. The font’s heavy weight was a technical solution, not just an aesthetic one. Thin strokes would shimmer or disappear in composite video.
This font appears in Super Mario Bros., The Legend of Zelda, and dozens of other titles. It is often stored in the pattern table as a contiguous block, which makes it easy to find in a hex dump. The letters are not stored as ASCII. They are stored as tile indices, and the game’s text engine maps ASCII values to those indices. If you are hacking a ROM, changing the font is as simple as replacing the tile data, but you have to keep the same tile order or the text engine will print garbage.
The Atari 8-Bit System Font
The Atari 400 and 800 computers shipped with a built-in character set in ROM. It was a 128-character set, including uppercase and lowercase, with a clean, slightly italicized look. The font was designed for the ANTIC chip’s text modes, which could display 40 or 80 columns. The lowercase letters were a big deal. They meant the Atari could be used for word processing and programming, not just games.
What makes this font interesting from a reverse-engineering perspective is that it was stored as 8×8 bitmaps, but the ANTIC chip could also use a 4×8 mode for higher text density. The font data was the same; the chip just sampled every other pixel. This is a good example of how hardware could stretch a single font asset across multiple display modes. The Atari font is also one of the earliest examples of a system font that was designed to be legible on both NTSC and PAL displays, which had different aspect ratios and color artifacts.
The Commodore 64 PETSCII Set
The Commodore 64 did not use ASCII. It used PETSCII, a character encoding that mapped letters, numbers, and symbols to screen codes. The built-in font was stored in the character ROM, and it had two complete sets: uppercase/graphics and lowercase/uppercase. The font itself was a clean, slightly narrow design with a distinctive lowercase “a” and a squared-off “g.”
For pixel artists, the C64 font is a masterclass in working with a 8×8 grid. The designers had to make letters that were legible at 40 columns, which meant each glyph had to be readable at a width of 8 pixels with no anti-aliasing. The font’s spacing was handled by the VIC-II chip, which added a one-pixel gap between characters. This is why the C64 font looks airy compared to the NES font, even though both are 8×8. The hardware, not the font data, created the letter spacing.

The Sega Genesis System Font
The Sega Genesis, or Mega Drive, had a more flexible tile system than the NES. The VDP could address 64 KB of VRAM, and tiles could be 8×8 or 16×16. The system font used in many Sega games was a bold, slightly italicized design that felt more aggressive than Nintendo’s rounded letters. It was often stored in the VRAM as a set of 8×8 tiles, but the text engine could use 16×16 tiles for larger, more detailed glyphs.
One of the most interesting things about the Genesis font is how it changed between regions. Japanese Mega Drive games often used a font with full-width katakana and hiragana, while Western releases replaced those tiles with a Latin alphabet. The font was not just a visual asset; it was a localization tool. When I dump a Genesis ROM, I can often tell which region it was built for by looking at the character set before I even check the header.
What Makes a Game Font Good?
A good game font is not just legible. It is legible under specific, often hostile, conditions. It has to survive composite video blur, RF interference, low-resolution CRTs, and the player’s distance from the screen. It has to be readable in a single frame, because text boxes in action games do not wait. It has to be small enough to fit in a tile budget, but large enough to be parsed instantly.
The best fonts of the era share a few traits. They use thick, even strokes. They avoid fine details that would disappear in the signal. They keep the x-height high, so lowercase letters do not shrink into illegibility. They use consistent spacing, even if that means wasting a pixel or two on the right side of a narrow letter. And they are designed as a system, not as individual glyphs. The letter “I” and the number “1” are distinct. The “O” and the zero are not ambiguous. The punctuation is visible, not an afterthought.
These are the same principles that apply to modern pixel fonts, but the stakes were higher. A bad font in a 1986 game was not just ugly. It was unreadable. And an unreadable font could make a game impossible to play.
Reverse-Engineering a Font from a ROM
If you want to see how a game font was built, the process is straightforward. Dump the ROM, find the character data, and render the tiles as bitmaps. On the NES, the font is usually in the pattern table, which is stored in the CHR ROM or in the PRG ROM if the game uses CHR RAM. The tile data is 16 bytes per tile, with each byte representing one row of 8 pixels. The first 8 bytes are the low bit plane, and the next 8 bytes are the high bit plane. The two planes are combined to produce a 2-bit color index for each pixel.
On the Game Boy, the font is stored in the same way, but the tile data is 16 bytes per tile with a 2-bit color depth. The Game Boy’s screen is 160×144 pixels, so the font had to be even smaller and more legible. The Pokémon games used a font that was stored in the ROM as a set of 8×8 tiles, but the text engine could use a variable-width font by storing a width table alongside the tile data. This is a good example of how a font could be more than just a set of bitmaps. It could include metadata that changed how the text engine rendered each glyph.
When I teach this in a workshop, I start with a simple exercise: take a 8×8 grid, draw a letter, and then convert it to hex by hand. It takes about ten minutes per letter. That is the pace the original designers worked at, except they had to do it for an entire alphabet, and they had to do it without a preview window. The graph paper was the preview window.
The Pixel-Art Connection
Game fonts are pixel art. They are the most constrained form of pixel art, because every glyph has to work in the same grid, and the grid is tiny. A 8×8 tile gives you 64 pixels. That is enough for a letter, but not enough for a letter with personality. The designers who made the best fonts understood this. They did not try to make a serif font in 8×8. They made a font that looked like it belonged on the hardware.
This is the same lesson that applies to sprite design. The best sprites are not the ones that try to look like high-resolution art. They are the ones that use the grid’s limitations as a design language. The NES font’s rounded corners are not a compromise. They are a choice. The C64 font’s narrow letters are not a flaw. They are a response to the 40-column screen. When you study these fonts, you are studying how to make creative decisions inside a fixed system.

Tradeoffs and Hard Limits
Every font in this era was a tradeoff. The NES font was legible but took up a lot of tiles. The Atari font was elegant but required a computer with a real text mode. The C64 font was clean but had to share its character set with graphics symbols. The Genesis font was bold but had to be localized for different regions. None of these fonts were perfect. They were all responses to specific hardware constraints.
This is why I avoid the word “iconic” when I talk about game fonts. Iconic implies that the font was chosen for its looks. It was not. It was chosen because it worked. The fact that it also looks good is a bonus. The designers who made these fonts were not trying to create a brand. They were trying to make a game that could be read on a 13-inch CRT in a living room with the lights on.
If you are building a retro-style game today, you have a choice. You can use a modern pixel font that mimics the look of the era, or you can build your own font from scratch. I recommend the second option, not because it is easier, but because it forces you to think about the same constraints the original designers faced. You will learn more from drawing a 8×8 alphabet than from downloading a font pack.
FAQ
Why did so many old games use only uppercase letters?
Uppercase letters were easier to draw legibly in an 8×8 pixel grid, and dropping lowercase saved dozens of tiles in the character ROM. On systems like the NES, the font shared tile space with sprites and background graphics, so every glyph had to justify its memory cost.
How were game fonts stored in ROM?
Most fonts were stored as 8×8 pixel tiles, with each tile using 16 bytes of data. The text engine mapped ASCII or PETSCII values to tile indices. Some games used variable-width fonts by storing a width table alongside the tile data, which allowed tighter text layout without sacrificing legibility.
Can I extract a font from a ROM and use it in my own project?
Yes, but you need to respect the original copyright. The font data is part of the game’s code and assets. For personal study or reverse-engineering practice, extracting and rendering the font is fine. For a commercial project, you should draw your own font or use a font with a clear license. The techniques are the same; the legal context is different.
What is the best way to learn pixel font design?
Start with a 8×8 grid and draw a full uppercase alphabet by hand. Convert each letter to hex, then write a small program to render the font on screen. This is the same workflow the original designers used, and it teaches you more than any font editor. Once you can do 8×8, try a 16×16 font and see how the extra space changes your decisions.
If you want to go deeper, the next step is to dump a specific game’s character ROM and compare the font to the system font. Look at the tile order, the spacing, and the way the text engine handles line breaks. That is where the real lessons are. And if you have a favorite game font from the 1977–1999 window, send me a note. I am always looking for new examples to study.