IF THIS FILE HAS NO LINE BREAKS: View it in a web browser.
Windows Notepad is a very popular text editor that comes with the Windows operating system, but it doesn't recognize line breaks in text files made on Linux or any other UNIX-like operating system.
Text files with UNIX line breaks display correctly in WordPad, Notepad++, Programmer's Notepad, Gedit, or a web browser, just not in Windows Notepad prior to the Windows 10 October 2018 Update.
This is a minimal working program for the Nintendo Entertainment System using the NROM-128 board.
- init code
- setting up a static background
- structure of a game loop
- DPCM-safe controller reading
- 8.8 fixed-point arithmetic
- acceleration-based character movement physics
- sprite drawing and animation, with horizontal flipping
- makefile-controlled conversion of sprite sheets
Setting up the build environment
You'll need the following software installed to build this demo:
- ca65 and ld65, the assembly language tools that ship with the cc65 C compiler
- Python, a programming language interpreter
- Pillow (Python Imaging Library), a Python extension to read and write bitmap images
- GNU Make, a program to calculate which files need to be rebuilt when other files change
- GNU Coreutils, a set of simple command-line utilities for file management and text processing
It also requires general familiarity with the command prompt. You are encouraged to read and understand the articles on general computer science topics listed at Before the basics.
To install Make, Python 3, and Pillow under Ubuntu:
Open a terminal.
Type the following, followed by the Enter key:
sudo apt-get install build-essential python3-pil
Type your password to authorize the installation.
To install Make, Python 3, and Pillow under Fedora: (instructions suggested by jroatch; not tested)
Open a terminal and use
suto become root.
Type the following, followed by the Enter key:
yum install make automake gcc gcc-c++ python3 python3-pillow
Because cc65 is a fairly niche tool, and because the C compiler portion (which this demo does not use) used to have non-free restrictions on distribution, your Linux distribution's default repository is unlikely to provide cc65. This means you will probably need to install it from source code.
Visit cc65 on GitHub.
Click Download ZIP
Unzip into a new folder.
In a terminal issue the following commands (suggested by jroatch):
cd [path to where you unzipped cc65] make make install PREFIX="$HOME/.local"
./configurestep, and the
PREFIXis case sensitive.
Insert the following in your
.bashrcfile, to automatically add the local executables to your
PATHthe next time you log in.
if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi
PATH is an environment variable that tells the command prompt which
folders to look in when you type a program name. The convention on
UNIX is to install all programs to a handful of folders. On Windows,
it's more common to install programs in each package to a separate
folder and then add each folder to
Path for Windows to find it.
Because the steps for setting
Path differ between versions of
Windows, you'll want to search the web for
windows x.x path variable, replacing
etc. In particular, Windows 10 makes adding folders to
more convenient than previous Windows versions.
The MSYS project ports Make, Coreutils, Bash, and other key parts of
the GNU operating environment to Windows. Git for Windows includes
Bash and Coreutils. To add Make, follow evanwill's instructions to
download the latest Make without Guile from ezwinports and merge
C:\Program Files\Git\mingw64. This method adds to
a folder called
bin directly inside your user profile folder, such
C:\Users\Pino\bin, so you can put things like
Another way to install MSYS is through the automated installer provided by devkitPro. This method may be more convenient if you also develop for Game Boy Advance or Nintendo DS.
- Visit devkitPro Getting Started.
- Follow the instructions there to download and run the devkitPro Automated Installer.
- Uncheck devkitARM, devkitPPC, devkitPSP, and libraries for newer platforms (libnds, etc.) unless you plan to start developing for one of those soon. Leave Minimal System (MSYS) checked.
To install Python under Windows:
- Visit Python home page.
- Under Downloads, click Windows.
- Scroll down to Python 3.6.2 - 2017-07-17 (or whatever the latest 3.x release is), then under that, click Windows x86 executable installer.
- In your web browser's downloads folder, run the downloaded
installer, whose name should resemble
- Follow the prompts through the installer wizard.
Python's installer also puts
Path for you.
To install Pillow under Windows, open a Command Prompt and enter the following command:
py -m pip install Pillow
To install cc65 under Windows:
- Visit cc65 introduction.
- Scroll to the bottom.
- Click "Windows Snapshot" to download a zip file.
- Open the zip file.
- Inside the zip file, open the bin folder.
ld65.exeinto a new folder.
ld65 available to Make, you'll need to add the
Path or put them in
a folder already on
Then open the makefile in a text editor and change EMU to the path of whatever NES emulator you have installed.
make dist to build a zipfile, you'll need to install the Zip
and UnZip command-line tools published by Info-ZIP. Be careful, as
unz600xn.exe is a self-extracting archive that extracts multiple
files to the current directory, like a tarbomb, so run it in a new
folder and then copy
unzip.exe to a folder on
Organization of the program
nes.inc: Register definitions and useful macros
global.inc: Global variable and function declarations
Source code files
nrom.s: iNES header for NROM
init.s: PPU and CPU I/O initialization code
main.s: Main program
bg.s: Background graphics setup
player.s: Player sprite graphics setup and movement
pads.s: Read the controllers in a DPCM-safe manner
ppuclear.s: Useful subroutines for interacting with the S-PPU
Each source code file is made up of subroutines that start with
.proc and end with
.endproc. See the ca65 Users Guide for
what these mean.
In my projects, the
tools folder contains command-line programs
written in Python to convert graphics into a form usable by the NES.
The makefile contains instructions to run the converter program again
whenever the original asset data changes.
pilbmp2nes.pyconverts indexed bitmap images in PNG or BMP format into tile data usable by several classic video game consoles. It has several options to control the data format; use
pilbmp2nes.py --helpfrom the command prompt to see them all.
- NESdev Wiki and forum contributors
- FCEUX team
- Joe Parsell (Memblers) for getting me into NESdev in the first place
- Jeremy Chadwick (koitsu) for more code organization tips
- Greg Caldwell of Retrotainment Games for testing the Windows instructions
The demo is distributed under the following license, based on the GNU All-Permissive License:
Copyright 2011-2016 Damian Yerrick
Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved in all source code copies. This file is offered as-is, without any warranty.