Hello everyone, I'm a long time reader of this forum and first time poster. For a while now I've been considering what unique contribution I might be able to make to this community. I've been taking stock of the few weak areas that exist in the brilliant repository of information that is the nesdev community, and trying to synchronize some of those weaknesses with my particular skill set. I'm only a mediocre programmer, so offering original advice to anyone other than absolute beginners is probably best left to the more skillful. I have no experience with reverse engineering, so any contribution on that front is really out of the question. What I do have, however, is a certain precise, clear, and logical command of the English language, which is a byproduct of my current educational situation and future profession, i.e., professor of theology/logic/philosophy. I also have the luxury of time, considering that the office job that pays my tuition requires very little effort and provides ample opportunity for what I have termed "real work." That being said, one of the primary weaknesses that exists within the community is the lack of a unified, comprehensive, go-to resource for complete beginners.
Invariably, when a total beginner asks for advice, they are pointed to a vast stratum of scattered resources that provide only part of the total knowledge required to get started with NES programming. In many cases, these resources further refer the reader to more necessarily prerequisite resources. The end result is that beginner is thrown into a endless loop of documentation grepping. In order to solve this problem, I propose to write a single, comprehensive, unified resource that gently guides complete beginners through every step (inasmuch as is reasonably possible; definition of "reasonably" forthcoming) of the NES development process. This guide will assume that the reader knows absolutely nothing about programming and will work from that point to provide a firm foundation in the wide array of skills and knowledge necessary to develop for the NES.
While there is certainly a large dose of practical truth to the conventional wisdom that one's first exposure to programming should not be assembly language, it is also true that this is not an impossible feat; I'm a living, breathing example of someone who only shallowly dabbled in high-level languages before truly learning to program with assembly. Furthermore, this can easily become another of those endlessly recursive loop situations. The fact is, you have to start somewhere, and you might as well start with the language that immediately enables you to reach your end goal (i.e. 6502 assembly for NES development) rather than an endless regression of stepping stones. I would also contend, from personal experience, that high level languages are often more understandable with a heavy dose of experience in assembly.
Therefore, the book will be laced throughout with a thorough introduction to the 6502 microprocessor and its associated assembly language, and will be written in a progressive tutorial style with separate elements of development (scrolling, collision detection, NMI handling, etc.) broken up into modules. Readers will be involved in hands-on development by writing two games in a step-by-step fashion, one game that will be pre-written and systematically revealed throughout the book and another complementary game that the reader will write to exercise their new skills. Besides technical skills pertaining directly to game mechanics, like those previously mentioned, the book will also guide the reader through game planning, character and story development, music, artwork, best practices, etc. In addition to the tutorial that comprises the main body of the work, there will be a series of extensive appendices which compile all available technical information concerning the NES in a unified format. This will hopefully enable the book to serve as a valuable resource for experienced developers as well as total beginners.
This is obviously a huge a undertaking, and I don't presume to have the requisite knowledge, skill, or authority to do it alone. (For the more skeptical among you who may be in doubt at this point, the length and complexity of such a project is not really an issue; I'm a grad student, so excessively copious amounts of technical writing is my daily bread.) That's why I'm presenting it here. I plan to make this book available during writing, in true open source development style. I haven't yet decided the best way to do this; I will obviously need to be able to maintain some level of control to retain a unified style and vision. My current solution is to make the brainstorming, code, and outlines for every chapter open source, and make the actual chapter text available for discussion and fact-checking rather than direct editing.
At every step of the process I will be dependent upon the knowledge of the community, and I also want to make myself accountable to the community. If this is going to be a resource that is beneficial to the widest audience, it will depend on your advice, needs, experience, and wisdom. The knowledge required to learn NES development is already here, as evidenced by the fact that this is my first post; I've been hanging around here for a while now but have never posted, or even joined the forum until a few days ago, because all my questions already have answers. The community has given and given to me, and it's time that I stopped leeching and started giving back. I will probably host the project on github (info forthcoming), but first, I'd like to get some feedback.
Any advice about the content and process of this project, or whether the project is even wanted/needed, will be greatly appreciated. Thanks so much to the whole community for the role that you've played in my development as a programmer; I hope that this project can serve as a true sign of my gratitude. Stay posted for a broad project outline and a list of guiding principles.
Invariably, when a total beginner asks for advice, they are pointed to a vast stratum of scattered resources that provide only part of the total knowledge required to get started with NES programming. In many cases, these resources further refer the reader to more necessarily prerequisite resources. The end result is that beginner is thrown into a endless loop of documentation grepping. In order to solve this problem, I propose to write a single, comprehensive, unified resource that gently guides complete beginners through every step (inasmuch as is reasonably possible; definition of "reasonably" forthcoming) of the NES development process. This guide will assume that the reader knows absolutely nothing about programming and will work from that point to provide a firm foundation in the wide array of skills and knowledge necessary to develop for the NES.
While there is certainly a large dose of practical truth to the conventional wisdom that one's first exposure to programming should not be assembly language, it is also true that this is not an impossible feat; I'm a living, breathing example of someone who only shallowly dabbled in high-level languages before truly learning to program with assembly. Furthermore, this can easily become another of those endlessly recursive loop situations. The fact is, you have to start somewhere, and you might as well start with the language that immediately enables you to reach your end goal (i.e. 6502 assembly for NES development) rather than an endless regression of stepping stones. I would also contend, from personal experience, that high level languages are often more understandable with a heavy dose of experience in assembly.
Therefore, the book will be laced throughout with a thorough introduction to the 6502 microprocessor and its associated assembly language, and will be written in a progressive tutorial style with separate elements of development (scrolling, collision detection, NMI handling, etc.) broken up into modules. Readers will be involved in hands-on development by writing two games in a step-by-step fashion, one game that will be pre-written and systematically revealed throughout the book and another complementary game that the reader will write to exercise their new skills. Besides technical skills pertaining directly to game mechanics, like those previously mentioned, the book will also guide the reader through game planning, character and story development, music, artwork, best practices, etc. In addition to the tutorial that comprises the main body of the work, there will be a series of extensive appendices which compile all available technical information concerning the NES in a unified format. This will hopefully enable the book to serve as a valuable resource for experienced developers as well as total beginners.
This is obviously a huge a undertaking, and I don't presume to have the requisite knowledge, skill, or authority to do it alone. (For the more skeptical among you who may be in doubt at this point, the length and complexity of such a project is not really an issue; I'm a grad student, so excessively copious amounts of technical writing is my daily bread.) That's why I'm presenting it here. I plan to make this book available during writing, in true open source development style. I haven't yet decided the best way to do this; I will obviously need to be able to maintain some level of control to retain a unified style and vision. My current solution is to make the brainstorming, code, and outlines for every chapter open source, and make the actual chapter text available for discussion and fact-checking rather than direct editing.
At every step of the process I will be dependent upon the knowledge of the community, and I also want to make myself accountable to the community. If this is going to be a resource that is beneficial to the widest audience, it will depend on your advice, needs, experience, and wisdom. The knowledge required to learn NES development is already here, as evidenced by the fact that this is my first post; I've been hanging around here for a while now but have never posted, or even joined the forum until a few days ago, because all my questions already have answers. The community has given and given to me, and it's time that I stopped leeching and started giving back. I will probably host the project on github (info forthcoming), but first, I'd like to get some feedback.
Any advice about the content and process of this project, or whether the project is even wanted/needed, will be greatly appreciated. Thanks so much to the whole community for the role that you've played in my development as a programmer; I hope that this project can serve as a true sign of my gratitude. Stay posted for a broad project outline and a list of guiding principles.