All source code can be found here
The main program is called clock.c. Why clock.c? Because I used my EE281 lab 3 (alarm clock) as a base, and I was to lazy to change the filename...
Much of the code is adapted from Pascal Stang's AVR-LIB, especially the ATA and FAT portions. There were significant changes that needed to be made, since Pascal's code was mostly customized for his own implementation. However, looking at his code helped me figure out how FAT and ATA work much faster than I would have otherwise.
Since I did not use external RAM, I was limited to the 2K on board that came on my AVR. This meant that I had to be very stingy with memory. I could only cache one sector (512 bytes) of the filespace at a time, with a one sector FAT table cache as well. As you can see, that already takes more than half of my allocated memory space. After that I became very paranoid about running out of memory, and tried to make my code as memory efficient as possible.