Programming guide: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Add the flash cart category and other flash carts to the general section)
(Link to the article about CRC32 calculation.)
 
(12 intermediate revisions by 6 users not shown)
Line 3: Line 3:
=== 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 ===
Line 35: 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]]
Line 52: Line 52:
* [[Palette change mid frame]]
* [[Palette change mid frame]]
* [[Don't hardcode OAM addresses]]
* [[Don't hardcode OAM addresses]]
* [[Interrupt forwarding]]
* [[Sprite cel streaming]]
* [[Drawing terrain]]
* [[Releasing on modern platforms]]


=== Libraries and samples ===
=== Libraries and samples ===
Line 69: Line 73:
==== Math ====
==== Math ====
* [[Multiplication by a constant integer]]
* [[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]]
* [[Division by a constant integer]]
* [[16-bit BCD|An efficient 16-bit binary to decimal converter]]
* [[Divide by 3]]
* [[8-bit Multiply|Multiplies two 8-bit integers to a 16-bit result]]
* [[16-bit BCD]] - An efficient 16-bit binary to decimal converter
* [[8-bit Divide|Divide two 8-bit integers to a 16-bit result]]
* [[Base 100]] - An alternate method of storing numbers, to simplify BCD conversion
* [[Fast signed multiply|Fast table driven multiplication]]
* [[Random number generator]]
* [[Random number generator]]


Line 83: Line 89:
==== Misc ====
==== Misc ====
* [//forums.nesdev.org/viewtopic.php?p=194826#p194826 Skipping the FDS license screen]
* [//forums.nesdev.org/viewtopic.php?p=194826#p194826 Skipping the FDS license screen]
* [[Calculate CRC32|CRC32 checksum calculation]]


==== Examples ====
==== Examples ====
* [[Projects]] - includes many useful open-source examples.
* [[Projects]] - includes many useful open-source examples.
* [http://nintendoage.com/pub/faq/NA/index.html?load=nerdy_nights_out.html Nerdy Nights Out (aka: Learning 6502)] by BunnyBoy
* [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://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://nesdoug.com/ How to Program an NES game in C] by dougeff
* [https://cppchriscpp.github.io/nes-starter-kit Simple game and editing guide (in C)] by cppchriscpp
* [https://nes-starter-kit.nes.science Simple game and editing guide (in C)]
* [https://pineight.com/nes/#template Project template] by tepples
* [https://pineight.com/nes/#template Project template] by tepples
* [//forums.nesdev.org/viewtopic.php?t=11151 Minimal NES example using ca65] by rainwarrior
* [//forums.nesdev.org/viewtopic.php?t=11151 Minimal NES example using ca65] by rainwarrior
Line 116: Line 123:
*#**[https://drive.google.com/file/d/1cMzhGjAZPkxlkJxS7c6cRtRO53KC9v1s/view?usp=sharing backup copy] via [[User:Koitsu|Koitsu]] (primary)
*#**[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)
*#**[https://jdc.koitsu.org/lj/Programmingthe65816_ProgManual.pdf backup copy] via [[User:Koitsu|Koitsu]] (secondary)
*#**[http://alle.fi/mirror/Programmingthe65816_ProgManual.pdf backup copy] via [[User:Qalle|Qalle]]
*# [[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