Group projects
C group programming project
This was my first programming group project that I took part in during my time at Imperial College London. During this project, my group was asked to implement an emulator and assembler for an ARMV8 processor, we were given a total of 4 weeks for the project, also being requested to design an extension project in C.

I worked as part of a team of 4, with myself as the group leader, so I was responsible for assigning tasks as well as tracking the general progress of the project. I believe that I was a capable leader for the project, having finished all parts well before the deadline and also being among those nominated for the most interesting extension, a wordle solving algorithm featuring a variation of the trie data structure. More about my contributions to the extension can be seen in the 'C' section of my website, feel free to check it out.
The Emulator
The first part of this project was an emulator, in this section, we had to develop a program in C that would read object code and perform operations, altering values both in memory and in registers. For this, we had to first develop a way to represent registers, memory, the program counter as well as a few flags which will be required for operations such as arithmetic and flow control. Another task that we had to do was to read data from the object code file and pass it through the program to the relevant functions in order to operate on that data, this part of the program can be split into two main parts. We also needed to be able to read the current state of the program and store that in a text file.

The number of main tasks to be done was exactly four, so we were able to split the tasks among ourselves, however, some tasks turned out to be too large to assign to a given individual. We were able to fix this towards the end of this section by creating template methods to be filled in, adding in relevant comments to provide clarity. This way, other members of the project could work on these areas if they currently had no work, I believe that this was the best way to handle both time and resources.
The Assembler
This part of the project was handled similarly to the emulator, however, by creating the template methods initially, we were able to properly distribute the workload so that no member is overworked. This part ran more smoothly that the emulator because of this.

This part of the program required us to create a program that will read an assembly file and convert it into object code. The first step was to read the assembly file and store it in a list, from here, we would iterate over the list twice, this was done in order to allow for us to also convert labels that may appear in the assembly code. The next step was to take each line and parse it appropriately, this was achieved by creating handlers for the main operation types (arithmetic, branching, logical and special operations), from here, we would pass it further into specific operation handlers. Doing it this way would help significantly with debugging. This is because whenever there is an error with an operation, we would only need to check 2/3 main functions, this helped our group develop an elegant solution efficiently and effectively