SMBNeo explained: a native Super Mario Bros. port for Neo Geo

Putting Super Mario Bros. on the Neo Geo sounds straightforward until you compare the two machines. The NES was designed around tiny tiles, strict sprite limits and an 8-bit processor. The Neo Geo was built to move large arcade sprites, handle richer graphics and use dedicated sound hardware. SMBNeo connects those very different systems. It doesn’t hide an NES emulator inside a Neo Geo cartridge. Instead, it takes the game logic, compiles it for the Neo Geo’s Motorola 68000 processor and replaces the hardware-specific parts with new code. Graphics, sound, controls, memory and timing all needed their own solutions. That’s the important part. SMBNeo is a native port.

The game runs as Neo Geo software

An emulator recreates another machine through software. SMBNeo doesn’t work that way. The game logic runs directly on the Neo Geo processor, while custom platform code communicates with the console’s graphics and sound systems.

That creates plenty of technical problems. The two machines don’t draw images in the same way. They don’t arrange memory in the same way either, and their audio hardware has almost nothing in common.

The completed build includes the separate program, graphics, sound and display data expected from a Neo Geo cartridge. It behaves like software made for the system rather than an NES game running inside a virtual console. A separate compatibility build is available for emulators that expect recognised internal cartridge entries. That changes how the software identifies itself, but it doesn’t change the underlying port.

The graphics system needed a complete rethink

This is where SMBNeo becomes especially interesting. The obvious method would be to draw a complete 256 by 240 pixel frame in memory, then copy it to the display. That approach works on many machines. On the Neo Geo, it would waste valuable memory and processor time while ignoring the console’s strongest feature: its sprite hardware. So the port builds the world from Neo Geo sprites.

The background uses 33 vertical sprite strips arranged as a circular scrolling system. When Mario moves, the game usually shifts those strips instead of redrawing the entire level. Once the camera passes a tile boundary, the strip entering the screen receives the next section of scenery. It’s efficient. It also plays to the Neo Geo’s strengths.

Enemies, items and moving objects use double buffering. The game prepares one group of sprites while the previous group remains visible, then switches them during the screen’s vertical blanking period. This reduces the risk of partially updated objects appearing on screen. The score and status information use the Neo Geo’s FIX layer, which suits text and interface graphics.

NES tiles become Neo Geo graphics

The NES uses 8 by 8 pixel tiles. Neo Geo graphics are organised around larger 16 by 16 pixel tiles, so SMBNeo converts the original artwork during the build process. The port then uses the Neo Geo’s hardware zoom controls to reduce those tiles on screen. This brings them back to their intended size while keeping the graphics compatible with the target hardware.

The visible game area sits inside a 256 by 224 pixel frame. Some vertical information is cropped because the NES and Neo Geo use different display dimensions. Colours also require conversion because each system stores and displays its palette differently. The result remains close to the original game, but it doesn’t pretend the machines are identical.

Crowded scenes can look cleaner

The NES can display only a limited number of sprites on each horizontal line. When too many enemies or objects appear together, some sprites flicker or disappear. SMBNeo doesn’t need to reproduce that restriction.

The Neo Geo can handle many more sprites, so the port keeps visible objects on screen during crowded sections. Enemy placement and game logic stay the same, but scenes can appear steadier because the new hardware isn’t forced to drop sprites. It’s a small difference, but an obvious one.

The soundtrack uses completely different hardware

Audio required another major redesign. The NES produces sound through pulse, triangle and noise channels. The Neo Geo uses a Z80 sound processor alongside Yamaha’s YM2610 audio chip.

SMBNeo translates the game’s audio activity into commands the Neo Geo can process. Pulse sounds move to tone channels, noise uses the chip’s noise generator and the triangle voice is recreated through a looping sample.

It works, but it doesn’t sound perfectly identical. The audio chips create waveforms differently, and their timing and mixing behaviour don’t match exactly. That’s expected. This is a hardware adaptation, not an audio emulator.

Play SMBNeo directly in a browser

You don’t need to build a cartridge image or configure a desktop emulator just to try it. SMBNeo also has an online version that runs through a web browser, making the port much easier to access and test.

The browser release gives users a quick way to see how the game has been adapted for the Neo Geo architecture. It’s also useful for checking the graphics, controls and general performance without installing a complete Neo Geo development environment.

Complete, but not verified on real hardware

SMBNeo can run through all 32 stages and reach the ending. It can also be built with Neo Geo development tools and tested through compatible emulators. There’s one important limitation, though. The port hasn’t been tested on an actual Neo Geo console. Emulator testing can reveal a great deal, but it can’t guarantee that timing, audio, graphics and cartridge behaviour will work identically on real hardware.

Other areas could still improve. Audio accuracy isn’t exact, save-state and memory-card support aren’t included, and demanding sections may not always update at the ideal rate. Even so, SMBNeo already proves its core idea. It takes a game designed around NES limitations and rebuilds it around the Neo Geo’s architecture. No hidden emulator. No simple wrapper. Just a direct port engineered for a very different machine.

Spread the love
error: