Programming guide: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Moved the battery holder project from programming guide to NES Hardware projects on Nesdev Homepage and the projects page. It didn't seem to be much of a programming issue)
(Link to the article about CRC32 calculation.)
 
(34 intermediate revisions by 8 users not shown)
Line 1: Line 1:
This programming guide is the complement to the [[NES reference guide]].  You will find more in-depth documentation about specific topics, tutorials on the most common problems encountered,  a list of existing tools that will assist you during you development phase and more. If you're new to NES development, you should give a look to the "[[Getting started]]" section first.
This programming guide is the complement to the [[NES reference guide]].  You will find more in-depth documentation about specific topics, tutorials on the most common problems encountered,  a list of existing tools that will assist you during you development phase and more. If you're new to NES development, you should give a look to the "[[#Getting started|getting started]]" section first.


=== Getting started ===
=== Getting started ===
*[[Before the basics]]
*[[Before the basics]]
*[[Commissioning]] - suggestions for a non-programmer seeking help
*[[Programming Basics]]
*[[Installing CC65]]
*[[Installing CC65]]
*[[Programming Basics]]


=== General reference ===
=== General reference ===
* [[Registers]]
* [[PPU power up state#Best practice|Waiting for the PPU to power on]]
* [[PPU power up state#Best practice|Waiting for the PPU to power on]]
* [[CHR-ROM vs CHR-RAM]] and how to switch an NROM project from the former to the latter
* [[CHR-ROM vs CHR-RAM]] and how to switch an NROM project from the former to the latter
* [[Emulation Libraries]]
* [[Emulation Libraries]]
* [[Catch-up]] technique used by emulators
* [[Catch-up]] technique used by emulators
* [[PowerPak]] / [[Everdrive N8]]
* [[:Category:Flash Cartridge|Flash Cartridges]] ([[PowerPak]] / [[Everdrive N8]] / [[Everdrive N8 Pro]] / [[KrzysioCart]])
* [[Music]]: [[:Category:Expansion audio|Expansion audio]]
* [[Music]]: [[:Category:Expansion audio|Expansion audio]]
* [[Tools]] — includes assemblers, disassemblers, graphics, music/audio, and emulator-related utilities
* [[Tools]] — includes assemblers, disassemblers, graphics, music/audio, and emulator-related utilities
Line 17: Line 19:
=== Tutorials ===  
=== Tutorials ===  
* [[CPU|CPU basics]]
* [[CPU|CPU basics]]
* [[PPU|PPU reference]]
* [[APU basics]]
* [[APU basics]]
* [[Compression]]
* [[Compression]]
Line 25: Line 28:
* Programming Techniques
* Programming Techniques
** [[6502 assembly optimisations]]
** [[6502 assembly optimisations]]
** [[Cycle counting]]
** [[RTS Trick]]
** [[RTS Trick]]
** [[Jump Table]]
** [[Jump Table]]
Line 32: Line 36:
** [[Programming with unofficial opcodes]]
** [[Programming with unofficial opcodes]]
** [[Pointer table]]s
** [[Pointer table]]s
** [[Divide by 3]]
** [[Multibyte constant]]
** [[Multibyte constant]]
* [[Limitations]]
* [[Limitations]]
* [[Emulation Tutorials]]
* [[Emulation Tutorials]]
* How to organize data (interleaved, column based, screen based compressed etc)
* [[Sample RAM map]]
* [[Sample RAM map]]
* [[PPU scrolling]]
* [[PPU scrolling]]
Line 44: Line 46:
** How to do parallax scrolling with the scroll register
** How to do parallax scrolling with the scroll register
* [[Sprite size]]
* [[Sprite size]]
* [[How to make raster effects]] by Bregalad ([http://jonathan.microclub.ch/NES_raster/nes_raster.txt external link])
* [http://story.monoroch.net/nes_raster.html How to make raster effects] by Bregalad
* How to keep state
* Frame based algorithm
* [[The frame and NMIs]] by Disch
* [[The frame and NMIs]] by Disch
** [[NMI thread]]: Make your status bar rock-solid
** [[NMI thread]]: Make your status bar rock-solid
* Trick of the trade from well known commercial games
* [[Nerdy Nights sound]]
* Music, how to make, to play, sound fx
* [[Palette change mid frame]]
** [[Nerdy Nights sound]]
* [[Don't hardcode OAM addresses]]
* Do and don't
* [[Interrupt forwarding]]
* [[Sprite cel streaming]]
* [[Drawing terrain]]
* [[Releasing on modern platforms]]


=== Libraries and samples ===
=== Libraries and samples ===
* [[Programming Libraries]]
 
==== System ====
* [[Init code]]
 
==== Input ====
* [[Controller reading]]
* [[Controller reading code]]
 
==== Graphics ====
* [[Detecting video standard]]
* [[Placeholder graphics]]
* [[Placeholder graphics]]
* [[Nerdtracker player in NESASM]]
* [http://forums.nesdev.org/viewtopic.php?p=142703#p142703 RLE decompression code for CHR] by [[User:Koitsu|koitsu]]
* [http://forums.nesdev.org/viewtopic.php?p=142703#p142703 RLE decompression code for CHR] by [[User:Koitsu|koitsu]]
==== Math ====
* [[Multiplication by a constant integer]]
* [[Fast signed multiply]] - Fast table driven multiplication
* [[8-bit Multiply]] - Multiplies two 8-bit integers to a 16-bit result
* [[8-bit Divide]] - Divide two 8-bit integers to a 16-bit result
* [[Division by a constant integer]]
* [[Divide by 3]]
* [[16-bit BCD]] - An efficient 16-bit binary to decimal converter
* [[Base 100]] - An alternate method of storing numbers, to simplify BCD conversion
* [[Random number generator]]
* [[Random number generator]]
==== Audio ====
* [[APU period table]]
* [[Audio drivers]]
* [[Nerdtracker player in NESASM]]
==== Misc ====
* [//forums.nesdev.org/viewtopic.php?p=194826#p194826 Skipping the FDS license screen]
* [[Calculate CRC32|CRC32 checksum calculation]]
==== Examples ====
* [[Projects]] - includes many useful open-source examples.
* [https://nerdy-nights.nes.science/ Nerdy Nights Out (aka: Learning 6502)] by BunnyBoy
* [https://shiru.untergrund.net/articles/programming_nes_games_in_c.htm Programming NES Games in C] by Shiru
* [https://nesdoug.com/ How to Program an NES game in C] by dougeff
* [https://nes-starter-kit.nes.science Simple game and editing guide (in C)]
* [https://pineight.com/nes/#template Project template] by tepples
* [//forums.nesdev.org/viewtopic.php?t=11151 Minimal NES example using ca65] by rainwarrior


=== Reverse engineered techniques ===
=== Reverse engineered techniques ===
* [[Bad Apple]] video compression
* [[Bad Apple]] video compression
* [http://forums.nesdev.org/viewtopic.php?t=5860 Codemasters tile compression]
* [//forums.nesdev.org/viewtopic.php?t=5860 Codemasters tile compression]
* [http://forums.nesdev.org/viewtopic.php?t=8675 Big Bird's Hide and Speak sample compression]
* [//forums.nesdev.org/viewtopic.php?t=8675 Big Bird's Hide and Speak sample compression]
* [http://forums.nesdev.org/viewtopic.php?t=8609 Battletoads text compression] (Huffman coding)
* [//forums.nesdev.org/viewtopic.php?t=8609 Battletoads text compression] (Huffman coding)
* [http://forums.nesdev.org/viewtopic.php?t=8588 Rad Racer rendering]
* [//forums.nesdev.org/viewtopic.php?t=8588 Rad Racer rendering]


=== Useful reference materials ===
=== Useful reference materials ===
==== Books ====
==== Books ====
* Cady, Fredrick M. (1997). ''Microcontrollers and Microcomputers: Principles of Software and Hardware Engineering''. New York: Oxford University Press. ISBN 0-19-511008-0.
* Cady, Fredrick M. (1997). ''Microcontrollers and Microcomputers: Principles of Software and Hardware Engineering''. New York: Oxford University Press. ISBN 0-19-511008-0.
* Eyes, David; Lichty, Ron (1986). ''Programming the 65816 including the 6502, 65C02, and 65802''. New York: Brady Books/Prentice Hall Press (Simon & Schuster, Inc). ISBN 0-89303-789-3.
* Eyes, David; Lichty, Ron (1986). ''Programming the 65816 including the 6502, 65C02, and 65802''. New York: Brady Books/Prentice Hall Press (Simon & Schuster, Inc). ISBN 0-89303-789-3. Rights later purchased by Western Design Center.
* Fernandez, Judi N. (1983). ''6502 Assembly Language Programming (Self-teaching Guides)''. John Wiley & Sons Inc. ISBN 978-0471861201.
* Fernandez, Judi N. (1983). ''6502 Assembly Language Programming (Self-teaching Guides)''. John Wiley & Sons Inc. ISBN 978-0471861201.
* Leventhal, Lance A. (1986). ''6502 Assembly Language Programming 2nd Edition''. Osborne/McGraw-Hill. ISBN 0-07-881216-X.
* Leventhal, Lance A. (1986). ''6502 Assembly Language Programming 2nd Edition''. Osborne/McGraw-Hill. ISBN 0-07-881216-X.
Line 79: Line 118:


==== Online ====
==== Online ====
* [http://65xx.com/Products/Programming_and_Hardware-Manuals/ Programming the 65816 (including the 6502, 65C02, and 65802)] by Western Design Center
* [http://wdc65xx.com/Programming-Manual/ Programming the 65816 (including the 6502, 65C02, and 65802)] by Western Design Center
*# [http://www.westerndesigncenter.com/wdc/documentation/Programmingthe65816_ProgManual.pdf Programmingthe65816_ProgManual.pdf] — 54MBytes, created 2015/03/27.
*# [http://www.westerndesigncenter.com/wdc/documentation/Programmingthe65816_ProgManual.pdf Programmingthe65816_ProgManual.pdf] — 54MBytes, created 2015/03/27.
*#* This is a full scan of the original Eyes/Lichty book using full images for each page, with the added bonus of OCR being applied so that text is searchable and copy-paste-able.  Accurate/reliable given the nature of the scan. A backup copy, if the 65xx.com site is down, [http://jdc.koitsu.org/lj/Programmingthe65816_ProgManual.pdf is available] via [[User:Koitsu|Koitsu]].
*#* This is a full scan of the original Eyes/Lichty book using full images for each page, with the added bonus of OCR being applied so that text is searchable and copy-paste-able.  Accurate/reliable given the nature of the scan.
*#**[https://drive.google.com/file/d/1cMzhGjAZPkxlkJxS7c6cRtRO53KC9v1s/view?usp=sharing backup copy] via [[User:Koitsu|Koitsu]] (primary)
*#**[https://jdc.koitsu.org/lj/Programmingthe65816_ProgManual.pdf backup copy] via [[User:Koitsu|Koitsu]] (secondary)
*# [[Media:Programmanual.pdf|Programmanual.pdf]] (a.k.a. WDC65C816_Program_Manual.pdf) — 1.7MBytes, created 2007/04/16.
*# [[Media:Programmanual.pdf|Programmanual.pdf]] (a.k.a. WDC65C816_Program_Manual.pdf) — 1.7MBytes, created 2007/04/16.
*#* This is a "pure text" version of the Eyes/Lichty book, however it is rife with very dangerous typos (wrong opcodes, etc.) in many areas, and contains a large number of formatting/layout mistakes not present in the original book.  Bill Mensch (6502/65C02/65816 architect/designer) [http://forums.nesdev.org/viewtopic.php?p=142722#p142722 confirmed these mistakes], stating WDC is in the process of fixing them.  If at all possible, use the newer PDF mentioned above.
*#* This is a "pure text" version of the Eyes/Lichty book, however it is rife with very dangerous typos (wrong opcodes, etc.) in many areas, and contains a large number of formatting/layout mistakes not present in the original book.  Bill Mensch (6502/65C02/65816 architect/designer) [http://forums.nesdev.org/viewtopic.php?p=142722#p142722 confirmed these mistakes], stating WDC is in the process of fixing them.  If at all possible, use the newer PDF mentioned above.

Latest revision as of 08:21, 23 June 2024

This programming guide is the complement to the NES reference guide. You will find more in-depth documentation about specific topics, tutorials on the most common problems encountered, a list of existing tools that will assist you during you development phase and more. If you're new to NES development, you should give a look to the "getting started" section first.

Getting started

General reference

Tutorials

Libraries and samples

System

Input

Graphics

Math

Audio

Misc

Examples

Reverse engineered techniques

Useful reference materials

Books

  • Cady, Fredrick M. (1997). Microcontrollers and Microcomputers: Principles of Software and Hardware Engineering. New York: Oxford University Press. ISBN 0-19-511008-0.
  • Eyes, David; Lichty, Ron (1986). Programming the 65816 including the 6502, 65C02, and 65802. New York: Brady Books/Prentice Hall Press (Simon & Schuster, Inc). ISBN 0-89303-789-3. Rights later purchased by Western Design Center.
  • Fernandez, Judi N. (1983). 6502 Assembly Language Programming (Self-teaching Guides). John Wiley & Sons Inc. ISBN 978-0471861201.
  • Leventhal, Lance A. (1986). 6502 Assembly Language Programming 2nd Edition. Osborne/McGraw-Hill. ISBN 0-07-881216-X.
  • Zaks, Rodnay (1983). Programming the 6502 (Fourth Edition). Sybex, Inc. ISBN 0-89588-135-7.
  • Zaks, Rodnay (1982). Advanced 6502 Programming. Sybex, Inc. ISBN 0-89588-089-X.
  • Zaks, Rodnay (1980). Programming the 6502 (Third Edition). Sybex, Inc. ISBN 0-89588-046-6.

Online

  • Programming the 65816 (including the 6502, 65C02, and 65802) by Western Design Center
    1. Programmingthe65816_ProgManual.pdf — 54MBytes, created 2015/03/27.
      • This is a full scan of the original Eyes/Lichty book using full images for each page, with the added bonus of OCR being applied so that text is searchable and copy-paste-able. Accurate/reliable given the nature of the scan.
    2. Programmanual.pdf (a.k.a. WDC65C816_Program_Manual.pdf) — 1.7MBytes, created 2007/04/16.
      • This is a "pure text" version of the Eyes/Lichty book, however it is rife with very dangerous typos (wrong opcodes, etc.) in many areas, and contains a large number of formatting/layout mistakes not present in the original book. Bill Mensch (6502/65C02/65816 architect/designer) confirmed these mistakes, stating WDC is in the process of fixing them. If at all possible, use the newer PDF mentioned above.
      • It is suspected that WDC has pulled this PDF entirely from their website, instead advocating purchasing a "redone" version of the Lichty/Eyes book via Amazon. Kindle and paperback versions are available, but I (Koitsu) have not reviewed it.

Links