Software Design
The project was implemented with ARM Thumb-2 Assembly code and Verilog.
Software timers vs. Hardware timers
We handled most of our timing with verilog timers and counters. The only software timers we used were for writing to the LCDs and to delay interrupts. Delaying the interrupts and the LCD writes were more convenient to handle in software because they are the two main components that the software dealt with.
The main issue we ran into was reading the busy flag on the LCD screens. We solved it by switching to a timer after every write.
How do interrupts change the state of the game?
The START, A, and B buttons of the N64 controller and two light sensors were all attached to an interrupt signal. Our interrupt handler would read a memory mapped IO location to determine the cause of the interrupt, and proceed accordingly. We used timers to delay after writing to the LCD screens, and to disable recurring interrupts for a short period after the light sensors signaled.