512-Byte Boot Sector Pong Game

512-Byte Boot Sector Pong Game

written by - Akshat Joshi

Sometime back, I set myself a crazy constraint:


Load only one thing at boot - A Pong game that fits in one floppy disk sector — 512 bytes.

Why would I build this?

I have played with Operating Systems and their workings by customizing them and tweaking their behavior. But this was about pushing constraints to the extreme. Can I have an OS which just loads one PONG GAME ?

The challenge

  • No operating system.
  • No drivers.
  • No libraries.
  • Just raw x86 assembly, BIOS interrupts, and the video memory at 0xB800.

The boot sector is the first 512 bytes a computer loads from disk. It has to end with the magic bytes 0x55 0xAA — leaving only 510 bytes for actual code.
I wanted to see if I could fit:

  • Player paddle (W/S keys)
  • CPU opponent
  • Ball with velocity
  • Scoring
  • Color toggle (C key)
  • Full reset (R key)

After learning about Operating systems and the bootup flow, I finally managed to get a pong game running 😄

How it works!

The game runs in 80x25 text mode (VGA mode 03h) using BIOS interrupt 10h.
Everything is drawn directly into video memory (0xB800) with stosw — of course no graphics libraries here.

Controls

W / S — Move your paddle
C — Cycle paddle and midline colors
R — Reset game (reboots the sector)

It’s a deterministic ball-tracking logic. It checks the ball’s Y position every frame:

  • If ball is above paddle → move up
  • If below → move down
  • Never goes off-screen

Simple. Fast. Fits in 510 bytes.

0:00
/0:20

Demo run

Key Technical Highlights

  • Video Memory Direct Access Used ES:DI = 0xB800:0000 and rep stosw to clear screen in one instruction.
  • Efficient Positioning - imul di, [playerY], 160 → converts row to video offset (80 cols × 2 bytes per char).
  • Real-Time Input - BIOS int 0x16 with ah=1 (peek) → non-blocking keyboard check.
  • Physics & Collision - Ball velocity stored in single bytes (ballVeloX, ballVeloY). Reversed on wall/paddle hit using neg byte.
  • Delay Loop - Used BIOS timer at 0x46C for frame pacing — no hlt, no busy-wait burn.
  • Color Cycling - C key increments drawColour by 0x10 → rotates through 16 background colors.

The Full Code

The entire game is in one file: pong.asm
Publicly available on GitHub:
https://github.com/akshat666/-bootponggame

Run It Yourself

  1. Clone the repo
  2. Assemble with NASM
  3. Run in QEMU (or burn to USB and boot on old hardware)

Akshat Joshi

Akshat Joshi

Senior Technical Specialist
Washington DC