Writing a Game Boy Advance Game
reinterpretcast.com
reinterpretcast.com
If you're interested in development I suggest using the No Cash GB/GBA emulator; it's spot on and only had one glitch that Nintendo found in testing due to something about switching off the screen at the wrong time. I did almost all of my professional development in it and only had to burn to a Bung cartridge (used to be available from HK for cheap) for final testing infrequently. Much cheaper and probably better than the official dev kits available (but I wouldn't know, I never used one).
Nintendo tests third party emulators? I thought they were pretty vocally against the emulation scene.
What led you to using No$, and not having an official dev kit? I have no idea what the relationship would have been like with Nintendo...but did they wonder how you'd written the game if they'd never issued an official dev kit?
We were publishing through Mattel for those games as a 3rd party developer, so they handled all the dealings with Nintendo and I assume they had an in house dev kit or two, or at least it was just a 2 gorrila relationship.
It has the feature that 100% of it's functionality is controlled through memory-mapped structs. You can define the whole hardware API in a single c header of struct/address pairs. To do anything, you write to those addresses and stuff happens. No magic, black-box libraries required (I guess there is the BIOS...)
It's also incredibly underpowered. You get a low number of clock cycles per frame to do everything. The lack of power, lack of cache and simple instruction set makes it an actually really good target for self-modifying code.
And, not least of all: it's literally a device built for having fun!
You could easily teach a course on it. Have the students purchase a GBA flash linker and GBA and then teach the course. The students can flash their GBA games into the flash linkers, and you make the term project a completed game.
I did my tiny experiments in homebrew dev on an emulator. A year later, I bought a flash cart, booted up my old program on a real device and it worked! :D
The graphics modes are fun to program for too. You can start with a simple mode 4 that is a bunch of pixels, and eventually advance to "mode 7" with pseudo 3d made with tricks in hblank, and a custom vram tile allocator to support larger-than-vram scenes.
I got so far as having some sprites moving around the screen and shooting and had to put it all to rest before I got around to implementing collision detection but I learned an incredible amount from it.
The most interesting thing is that the solutions I came up with (and thought were very clever) I found out later were often the "way" things were actually done in the commercial world. Like screen buffering, how to define a sprite as data, sprite composition, the game loop, etc. I probably had to tackle and figure out a couple dozen challenges and most of them turned out to be reasonable solutions to the problem.
The hardware target being very simple also forced me to think about optimization and compute cost in ways I hadn't thought of before.
I wish it had been a formal course in Uni. Everbody had a TI calculator of some sort anyways, and a semester of building a simple game would have been tremendously educational.
I have a retropie set up for my son. Even though he's been exposed to all sorts of fancy stuff you can get on an Android, as well as Don't Starve Together, and Minecraft and a few other games on the Steam platform, he still really loves playing some of the older console games; especially stuff from the Megaman and Sonic franchises. I've also recently found Zelda for snes, which I never played as a kid. If anyone has any other old games to recommend for children on the SNES, NES, GBA, Genesis, etc. please reply.
Ice Hockey, Megaman 2, Super Mario Bros. 3, Solstice, Ninja Gaiden, Blaster Master, Ghosts n Goblins, Teenage Mutant Ninja Turtles, Bayou Billy, The Battle of Olympus, Legend of Zelda + Adventure of Link, Battletoads, Bump n’ Jump, Castlevania 1/2/3 (2 is really hard and different, but good), Chip n’ Dale: Rescue Rangers, Clash at Demonhead, Contra, Crystalis, Double Dragon 1/2/3, Dr. Chaos, Dr. Mario, Dragon Warrior 1/2/3 (2 and 3 are better on the gameboy), Ducktales 1 and 2, Final Fantasy 1, Galaga, Gauntlet (all of them), Kick Master, Kirby’s Adventure, Kung Fu Heroes, Legendary Wings, Metroid, Mike Tyson’s Punch-Out, Power Blade, River City Ransom, Silver Surfer, Street Fighter 2010, Shatterhand, StarTropics, Time Lord, 1942/1943, Xexyz
TNMT: https://www.youtube.com/watch?v=XjUz8IT0CYg Double Dragon 3: https://www.youtube.com/watch?v=kMg6_IXCjo4 Silver Surfer: https://www.youtube.com/watch?v=gvnRBywkUZ0
I've had great success with Super Mario Kart, Dynablaster etc..
Still for the SNES, I recommend Yoshi's Island, one of the best 2D platformers I've ever played. And of course, don't skip classics like The Legend of Zelda: A Link to the Past and Super Metroid.
Sorry, I love the SNES.
Uniracers, Metal Warriors, Yoshi's Island, Tetris Attack, Chrono Trigger, Zombies Ate My Neighbors, E.V.O. Search for Eden, Wildsnake, Donkey Kong Country 2, Ka-Blooey, King Arthur's World, King of Dragons, Lemmings, Lost Vikings, Rock n Roll Racing, Secret of Mana, NBA Jam Tournament Edition, Pocky & Rocky, SimAnt, Super Buster Bros.
This is some labor-of-love artisan work.
So many weekend hanging out with friends in grade school playing through Shining Force.
It's an interesting thing to try out. Especially to see what memory pre-allocation and limited resources can do to your way of modern thinking. It's also a nice exercise in C. You can do it via emulator, but linkers are rather cheap for GBA. There's something insanely satisfying seeing your crap run on mystical hardware of ye old(er) days.
My recovery time was completely lost in following the AtariAge forums and tutorials, and I ended up with this "game": https://github.com/mrspeaker/plops - you can test it out by grabbing the .bin file and dropping in the online emulator.
Not the most polished game ever, but was such a learning experience!
Unfortunately, parallel ports are exceedingly uncommon these days. However, it looks like this can be done easyly enough using something like a Teensy [0] or Arduino [1].
[0] https://github.com/tangrs/usb-gba-multiboot
[1] http://web.archive.org/web/20100815071014/http://blog.evildr...
Since there's only a fixed number of sprites the hardware acceleration can reference from memory to display on screen, it was really an eye-opener to debug commercial games and see how they worked around these limitations. In Wario Land, the Wario character onscreen had tons of animations, which would seem to break this limitation. By debugging the game, I was able to find the way they did it was by setting aside just a few sprite slots for Wario, loading all his animations into a different segment of RAM, then DMA'ing the frames into his sprite slot on a timer to do the animation.
Also, even though it's an LCD screen, the hardware simulated a CRT vertical and horizontal blank. I guess this was because this is the paradigm that console game-programmers were used to, as you'd do your game logic there between animation frames.
It's not a simulation, the LCD is actually serially refreshed in the same scan order as a CRT.