Projects

Listed below are some of my most impressive projects. I have a lot of smaller projects, but those tend to be shorter-lived or highly context specific. I really like to tinker around, learning a bunch about many different systems and processes, even if they don’t lead directly into a massive project. This mindset has gotten me to: read data sheets for microcontrollers, spend hours debugging theming issues, building projects declaritively, and many more late-night projects.

Assembler & Custom CPU

For my digital logic design lab class, my team and I had to program a CPU on an FPGA, and then write a game to run on that CPU. Since this was a large project, each member had multiple responsibilities. On top of helping write and debug CPU components, I was also tasked with writing an assembler that the final program code would be written in.

The assembler, which I named frank, was my first large project written within Rust. It was really satisfying see everything click together and form an “assembly+” language. It followed closely to assembly, but had a linker, functions, if-statements, blocks, references, and compile-time macros and variables. It also had some sanity checking built-in to make sure that declared numbers weren’t too large for registers. It allowed us to not have to worry about the finer details of writing the program, such as line numbers, program size, and memory addresses.

Working on this project taught me a lot about programming languages, grammars, and parsers, and also gave me great experience in Rust. I really enjoyed the guarantees within the Rust language, and how it guides you into more optimized and elegant solutions. I also gained a huge respect for all the things most languages do with intermediate representations, a true linker, complex project topology, libraries, optimizations, actual compilation, and so much more.

Portable Matrix Display Game Device

My team and I worked on making a small, portable gaming device that ran on an STM Discovery using a HUB matrix display. This was a really fun project where we got to work out several problems—some unexpected—to make our device work. The main challenges were figuring out some weird STM pin layouts, power supply regulation, and the HUB matrix display protocol.

The HUB matrix has very little documentation online since it’s an unofficial protocol. With a bit of trial and error we able to make it work. The end result had three bits of color depth, a marble rolling demo, a snake game demo, and a showcase of how the rendering works internally.

The responsibilities were split well, and I focused heavily on software near the end. It was great practicing my C skills, as well as interacting with third party hardware libraries.

Assembled HUB matrix display device. A 64 by 32 pixel display with purple handles on the left and right of it. The left side has a knob for input, and the right side has two buttons.

HUB Matrix display hooked up to breadboard with a bunch of wires and buttons

Assembled HUB matrix display device, oriented on the backside showing the STM discovery board, as well as a PCB

Other

Writing about these ones soon…

  • NixOS Desktop & Server Administration
  • Personal Portfolio (this website)