C/C++ Embedded Systems & Algorithms
PowerPoint in Assembly is a slide presentation tool built entirely in 6502 assembly, running natively on the NES. Instead of a traditional slide editor, presentations are written in a simple markdown-style text format using special escape sequences, \s marks a new slide, \t inserts a tab, and \\ escapes a literal backslash. That raw text file is parsed directly by the NES itself and rendered as a fully navigable slideshow, with support for all printable ASCII characters, multi-line slides, automatic word wrapping for long lines, and smooth animated transitions between slides.
Navigation works through the NES controller (or even a compatible light gun), with a slide index indicator showing your position in the deck, animation speed and indicator placement are both configurable through a dedicated settings file. Later versions added sound effects on slide transitions and page navigation, plus support for jumping back to the previous slide.
Building this on real NES hardware meant designing around some serious limitations:
Working in a team of 4 (a 5th member had to step away before development really began), we built this project over 1-2 months while simultaneously learning 6502 assembly from scratch. My main contributions were:
\s, \t, \\)Sound effects were the one piece of the project I didn’t personally work on, everything else in the pipeline, from raw text to what actually appears on screen, went through code I wrote or co-wrote.
Since the NES’s tile-based rendering has no built-in concept of ASCII text, we needed a fast, reliable way to convert raw characters from the file into tile indices the PPU could actually display. We solved this by deliberately placing all ASCII characters in the pattern table at positions that mirrored their real ASCII values. That meant converting a character to its tile index was just a single subtraction, no lookup tables, no branching logic, just fast, predictable math well suited to the 6502.
This went through a few iterations. Our first approach used a pointer that walked through every character in the file from the very start, tracking its offset. The problem: this only left enough room to display 8 bytes of characters, including escape sequences, nowhere near enough for a real slide. We reworked the pointer to instead track the offset from the start of the current slide rather than the whole file, which bumped our limit up to 255 characters per slide using a single-byte pointer. That held up for a while, but eventually we hit that ceiling too, so we switched to a 2-byte pointer, removing the 255-character cap entirely and letting slides hold significantly more content than the screen could actually display.
The NES only has 2 unique nametables (plus a mirrored copy of each), but our navigation needed a “current,” “next,” and “previous” slide all conceptually available at once. To handle this, we first built an algorithm to scan forward through the file and locate the next slide’s escape sequence.
From there, navigation split into two cases: