![]() ![]() He told me that the reason he did this was to squeeze every bit of performance out of the Game Boy Advance, as a clock cycle saved here and there really adds up when a lot of calculations are being performed. That sounds like a lot, but when you need to calculate and draw every pixel on the screen, those quickly add up and it becomes important to shave as many operations off as you can. The CPU itself is a 16.78 MHz processor, meaning it can complete 16780000 cycles per second. As Linden tells me, it was possible to switch registers and retrieve a value in one clock cycle, as opposed to storing a value in the RAM of the Game Boy Advance, which takes longer. Switching the CPU modes to gain additional registers is an incredibly clever maneuver that allows quick access to values close to the CPU so that they can be retrieved in a single clock cycle. Switched the CPU "mode" to gain access to additional registers (that are like "variables") without having to save and restore the registers' values.Used a series of look-up tables for things like reciprocal, sine, cosine, tangent, etc.Self-modified the code before it was executed, so fewer instructions were required.Three things that he did to speed up that execution time included the following: He spent a lot of time focusing on optimizations to ensure that it was able to obtain the fastest execution time possible. The graphics were also stored and displayed here. VRAM was used to store the results of the polygonal transformation output into edge tables because there wasn't enough IWRAM, but VRAM on the Game Boy Advance is still faster than EWRAM. The edges closest to the camera are active and rendered, and it's essentially a large Binary Space Partitioning (BSP) tree. The scanline renderer used up most of the 32kb IWRAM. ![]() It consists of over 10,000 lines of highly-optimized ARM assembly code which is designed to draw a set of pixels to VRAM. The EWRAM was used for storing the output of the 3D math transformation logic which was basically the list of polygon edges that were then traced out scanline-by-scanline by the rasterization code.Īs Linden tells me, the most complex and difficult part of the entire port was the scanline renderer. This means that while EWRAM is slower to access, Thumb instructions being efficient can often still end up just as fast as ARM instructions stored in IWRAM, though the downside of Thumb instructions is that sometimes there isn't quite the Thumb equivalent of an ARM instruction you want to execute. They have all the benefits of 32-bit instructions without taking up as much space, making them efficient for optimized development. Thumb instructions are a subset of 32-bit ARM instructions, and are a set of instructions encoded into 16-bit words. This port has no official relation to id Software or ZeniMax and was developed as a solo project by Linden. ![]() We would also like to thank Modern Vintage Gamer for allowing us to use any stills from his video that were needed. We would like to thank Randy Linden for dedicating time to answering our questions and ensuring the technical accuracy of this article. Forest of Illusion is a project aimed at preserving the history of Nintendo's games, and Linden reached out in order to distribute the copy of the Quake port he found on a 256MB flash card in his possession. This port has come to light thanks to Linden's own release of it through the Forest of Illusion project. Linden's development proficiency proved that if anyone was going to be able to make Quake on the Game Boy Advance a reality, it was probably him. If you're unfamiliar with Linden, he's best known for being the developer of both bleem! (a PlayStation emulator) and the SNES port of DOOM, an accomplishment that John Romero, co-founder of id Software, once said in an interview with Shacknews he didn't think was possible. Photo of the Quake port played on an Analogue Pocket used with permission from Modern Vintage Gamer ![]()
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |