Hello everyone!
I’m in the final couple weeks of the second term of my senior project. This term served as the development phase of the project. Last term, my group worked to establish a game plan for this development. We did a lot of research and created documents that detailed how a NES emulator functioned at a high level. This development phase was structured as two sprints that were four weeks each. It was up to our group to define the deadlines and goals for each sprint. The only official requirement set by the class itself was to have a Minimum Viable Product (MVP) completed by the end of the term. Working toward this goal has had its ups and downs. As somewhat inexperienced developers/software engineers, we did our best to plan as much as possible during the planning phase. However, there were some significant speed bumps toward the end of development. Conceptually, the NES emulation became a bit more complicated than we had expected. I’d like to talk about my experience with this project, so far, in this blog post.
For the first four weeks, during the first sprint, we decided to work on the emulation of the CPU. We figured that the CPU was the core component of the emulator, and so therefore, should take the most development time and would need to be correctly implemented for further development. With these two constraints in mind, we assigned all five of our group members to CPU development for the first sprint. This went well. We had a lot of brainpower working on understanding the technical complexities of the NES CPU’s architecture. By the end of the first sprint, we had an MVP-viable CPU implemented in our emulator. For the second sprint, we decided to split up the workload for the remaining components.
Remaining Components
Audio Processing Unit (APU)
Mappers
Picture Processing Unit (PPU)
GUI for display/testing
In terms of my responsibilities, my only assigned component was the PPU. The PPU ended up being way more complex than the CPU and, conceptually, much more difficult to wrap our head around. While documentation for CPU development was very easy to find and very easy to understand, documentation for PPU development was slightly less abundant. Also, the documentation that was available took longer than I would like to admit to grasp. While NESDev Wiki forum posts on the CPU were easy to follow, NESDev Wiki forum posts on the PPU wracked my brain every time I went down a rabbit hole. It was clear that our research during the planning phase did not adequately cover the PPU. Admittedly, this was probably mostly my fault. During the first term, we split up the research for our documents based on which component each person wanted to work on. Since everyone had been assigned to the CPU, the other components were up for grabs. I chose the PPU because it sounded like the most interesting aspect of emulation. So, research for the PPU was my responsibility. I broke down PPU emulation into four main steps. In hindsight, I should have broken down these four steps into much smaller steps and done research on every little aspect individually. Essentially, to understand the PPU as a functional component of the NES, we needed to break down these four steps into much smaller steps and research them… during our second sprint. This slowed down development and complicated our trajectories. I let my group know as soon as possible that the scope of PPU development was way over my head as an individual. From there, we employed more brainpower toward its development. One group member in particular went above and beyond to help me understand this component and significantly contributed to PPU development.
Retrospective Evaluation
Looking back, there are a couple things that I could have done differently that would have made life a little easier for this project. First, I could have delved deeper into PPU research, as mentioned previously. However, there is one other thing that I would like to mention, as I think recognition of this is important for my personal growth as an engineer and team member. When researching the PPU, I stumbled across a post that detailed expected time spent on each component relative to the whole project. For example, the CPU was valued at about 25% development time of the project. The APU was valued at about 10%. The PPU was valued at about 50%. So, theoretically, the PPU required roughly twice the amount of time/effort than the CPU. I brought this up with my group when I found this out. The resolution was to assign another person to the PPU for the second sprint. While this was with good intentions, it still didn’t quite make the most sense to me. If we were assigning five people to the CPU for four weeks, why would we assign two people to a component that takes twice as long to implement, yet given the same time frame? I didn’t say much more after this about my concerns. I just went with the game plan. In future projects, I will voice my concerns louder and more vocally. Outside of university classes, things can be much less forgiving. Mistakes and inaction like this could have much more serious implications.
Final Thoughts
Overall, this senior project has been eye opening. I initially picked this project because of the enjoyment that I got from my class on Assembly languages. I loved the low-level architecture stuff. During the past two terms, I have learned so much about computer hardware, ranging from the history of processors to the technical reasoning for design choices made for hardware, both back then and today. I have worked as a part of a team for a substantial amount of time. I have (mostly) successfully communicated with my team. This project has been part of a significant amount of personal growth. I look forward to the next term and the finalization of our emulator. I have a few more terms of classes before I graduate. It feels like my entry into my career is right around the corner!
As always, thank you for reading my post! Catch ya next time.