h0ffman strips away the nostalgia to reveal that retro mastery is less about artistic whim and more about the rigorous engineering of constraints. It is a definitive masterclass in why disciplined tooling remains the silent backbone of any successful creative endeavor.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
How Not to Get Into Game Development, with h0ffmanAdded:
Today we have an audience with Hoffman taking us on an in-depth look into his journey into game development for our favorite retro systems hosted right here at the Retro Collective. Our museum is made possible by you for watching, by our patrons, and by our sponsor pcbway.com, which is the place to go, not just for PCB design and manufacturing, but also to give your projects the perfect finish, thanks to their CNC, sheet metal, 3D printing, and injection molding services. Order online now at pcbway.com and enjoy rewards as a returning customer and sign up discounts for new ones. Thank you to PCBway.com for all the support. And now over to Hoffman.
Hello. Welcome to my talk, How Not to Get into Game Development. A cautionary tale of curiosity getting out of hand again and again and again. And by that I mean uh just like if you're into retro and tinkering like you'll find something that oh that's quite interesting and then it just it balloons gets out of hand and the next thing you know you spent six months on something. That's kind of that's the story. There's a few people nodding like that's kind of you know that's that's how probably most of us have ended up in this room already.
So a bit about me. Uh my name's my name is uh Hoffman or Ian. You know there's not many people that call me that. I'm fine. You can call me Hoff, call me whatever, it doesn't matter. Um, I'm a musician, um, a DJ, a coder, a demo scener, a game dev, and I do streaming on Twitch. Um, uh, yeah, I do a lot of stuff. I like I like tinkering with mostly old computers, but I also like doing things on new computers, particularly when someone will only give us 64K to do something. It's pretty interesting to me. Uh, my computer history is probably quite the same as quite a few people in here. Uh I grew up uh in our house we had a ZX Spectrum uh Commodore 64. Eventually uh finally upgrading to the uh the the AmIGGA. Uh interestingly out of these two systems, the ZX Spectrum and C64, I didn't really do anything kind of creative with them.
I was a bit younger. Um so there wasn't any I wasn't coding or doing any music.
But uh when the Omega landed, that's when I started really getting into how a system would work. Uh writing music for it. um and then collaborating with uh local friends in my area to actually get into the demo scene and do fun creative things that way. My friend also had one of these, an MSX machine. Don't say that too quickly. And it was kind of unique as a lot of other people that you used to hang out with back in like the 80s and 90s. This was kind of a rare machine. People didn't really have these, you know, you wouldn't see them that that often. Uh, and it was quite characteristic in the fact that the, uh, the sprites would flicker like mad, uh, because it had the, you know, that's just the way they work. And the scrolling was pretty jerky on these machines. But the games were absolutely fantastic. So, it's got three here, for example, uh, Nemesis 2, uh, Nightmare, uh, and the original, uh, stealth game, Metal Gear, not Metal Gear Solid, Metal Gear for the MSX, which is the original version of Metal Gear, the very first one for the MSX. If anyone says to you the NEZ version is all right, they're they're lying. This it's awful. We'll leap frog because if you saw my last talk, it mostly goes into kind of all the stuff I was doing when I was a teenager. So, kind of we kind of fast forward to to 2010. Um, which is what I call my demo scene activity phase two.
So, uh, uh, Rory, who's here, there he is, uh, dragged me back into the demo scene in 2010. Um, and I haven't stopped since. I've been absolutely active and getting involved with stuff uh for years uh ever since. Just I can't I can't leave it alone. Um I went to a lot of demo parties, met a lot of cool people.
Um and uh earned some awards and stuff, made some demos, um and more importantly learned Omega 68,000 code whilst I was kind of kind of making demos and stuff.
Uh uh so was a revision this weekend.
Uh, I did a track to music tune which got first place. I did the soundtrack to the winning AmIGGA demo, Second Nature.
If any and have you seen it?
>> Yeah.
>> Good.
Um, and also uh we picked up one of these uh which is a meteoric which is uh it's effectively like they it's effectively the Oscars of the demo scene. So every year they'll have um Yeah. Yeah. So, we won it for our Neo Geo demo we did last year called Vaporus. If you've not seen that on real hardware, I'm not surprised. They're quite hard to come by. So, um so fast forward to 2020. Oh dear. Um okay, no demo parties for a bit then. I wonder why. Probably because we're all sat at home with uh and we're not allowed to go out and probably definitely not allowed to go to Europe.
So, uh yeah, that's not help helping, is it? Yeah. At this point my creative output was getting a little bit stifled and what I did miss is obviously you know working with people making stuff and then you know go and hang out with people and and you know socializing all that. So I kind of needed to find something else to do. Um, and that's when uh one bor afternoon I stumbled across this which was the GitHub repository for Metal Gear MSX fully annotated source code fully disassembled by a chap called Manuel Pazos uh and incredibly well structured. I looked at this thing and it's like it's almost like someone has given you the original source code. In fact, it's probably better commented the the original source code if I'm honest. Um, and yeah, so it kind of got me thinking, well, you know, I've done demos, but I've never done a game. So, it got me thinking like, oh, well, this, so this is the spark of curiosity, right? I, oh, how does that work? I mean, I I love I used to love playing this game, you know, my friend had an MSX. How does the hardware work?
How does any of this work? How does any of it fit together?
Um so the first thing you when you kind of confronted with a new system that you've not worked on before the first thing to do is go and find the technical documentation for it. Um which will tell you you know it'll tell you how the hardware works like what chips are in it how it talks to it how the graphics are formatted for that system. Um so you obviously you can get that uh technical documentation there. Um also how does the Z80 work? I've only done 68000.
That's a 16- bit processor. an 8bit processor. It's I'm sure it's going to be slightly different, but there's going to be a lot of similarities in how they function. Um, I didn't bother to put a link there. There's literally thousands upon thousands of pages about the Z80 because it is the one of the most prolific CPUs ever made. So, where to start? I thought for this project, well, let's just let's just have a look at the source code, see if we can find where some of the graphics are, right? See, right, how does the graphics work? See where it's uploading it to the MSX. Can we convert that and view them on the PC? If I can do that, then I've got graphics in a format that I can manipulate and and move around and do whatever whatever we need to. Maybe even we can find some room data.
So, hunting around the source code, I find this which is uh labeled as a tile sets index, which is a bit of a giveaway as to what it is. Um, so there's like eight tile sets within the game that it uses. And these tile sets are built up of these little um these little packages of different uh graphics packs. Um, and it'll load them into into memory at these different addresses. It kind of set tells you where all this kind of stuff is going to going to be pointing to. So from that we can build a tile set. So Oh, that's okay. We've got a tile set now. Now I've got all of the graphics for all of the rooms in the game.
That's Oh dear, we're starting to get out of control already.
Um, and then uh I find the room information. Now on 8-bit platforms, because the memory is is limited, the way they would construct a room is they would use this thing called a metatile.
So like you've only got a bite which is 0 to 255.
And what that bite then represents is a collection of four tiles. So you kind of instead of having 8 by8 tiles and loads of bites, you have a smaller room, but then that references like so this bite will reference half a crate and then this bite will reference the other half of a crate. So you're not having to have all of those bites all on the all on the ROM because that would be expensive. Um so yeah, this kind of that's how they structure that. Um, so once I discovered all that, I thought, well, why don't we add, why don't we just put it all together in a little rubbish C application and now I can go and browse every single room that's in Metal Gear.
So, just pulled all the data out, pulled it into a C app, and then I can now just view all the rooms. And I'm like, this is getting quite exciting now.
Like, this game from my childhood, I'm now basically starting to pull it apart.
and and yeah.
Uh so shall we go all in? We've got graphics conversion tools built. Project seems challenging but a lot of fun. Uh should learn a lot about how games actually physically work underneath. Um and if we get to the end, there'll be a new AmIGGA game, right?
What's the worst that can happen?
So time to start porting.
Um so a little system comparison here.
here. So, we've got the MX2 on the left and the Omega on the right. Uh, obviously CPU wise, uh, we're almost double, but it's a 16- bit CPU. The way you can do things is is, you know, we can process 16 bits of information instead of 8 bits at a time. So, there are some wins there. Um, uh, 512 colors.
Uh, it's actually very comparable to the Atari ST in terms of its palette and how many colors it can it can display.
They're very similar, the MSX2 and the Atari ST. So on the Omega, we've got uh 32 colors on screen, 4,96 to choose from. Uh MSX has got 32 sprites, which are 16 by 16. Um but the flick, this is where I was talking about the flickering because you can only have eight on a horizontal line before the video chip goes, "No, no, no. Too many, too many."
So that's where the flickering comes on.
Comes from on the Omega. We have eight sprites, but they're weird.
Um hands up if you know why they're weird.
Yeah, there we go. I won't explain to you why they're weird. They just are.
They're very weird. Uh on sound, obviously we've got a Yamaha 3 channel PSG. That's basically the same as what you find in the uh MSX. Uh oh, sorry, not the MSX, the ZedX Spectrum and the CPC and the Oric. It's basically the same thing in and even the Atari ST. Um uh obviously on the Omega, we got four channel of PCM sound. So yeah, plenty of plenty of breathing space there. That's all good. Uh, and then, uh, storage and RAM wise, uh, 64K of RAM, 64K of video RAM, and the game cartridge fits in 128K. So, the whole game is 128K. On the Omega, loads of space. Yeah, that's fine. We can just expand that out. It won't be a problem. We definitely won't run out of RAM, right? Definitely.
Definitely not. No, that won't be a problem.
>> Um, yeah. So, uh, we're starting a project, we think, okay, so what we going to aim for? So it's always good when you're doing this thing like right let's let's give ourselves a boundary right what what do we want to achieve and uh what is our target right and try and aim for that so we're going to go for an A5 classic old school A500 512K of chip 512K of uh slow RAM and one floppy disc for the whole thing on there uh graphics um the MSX2 is fairly close to the Omega um so I'm going to keep all the graphics the same cuz I can't do graphics, so that makes that easier. The original game actually runs at 25 to 30 Hz because most of the time it it takes so long for it to process a frame. Uh it actually splits over to two. Uh I know that on the Omega we're going to be able to fly through that. So we're going to have to adjust everything to run at 50 50/60 Hz. Um audio wise, um completely different sound chips. So we definitely can't use the original code for that sound driver, can we? So, we'll need a new complete soundtrack. We'll also need a complete new set of uh sampled sound effects. Uh, which was really interesting for me because I've never done sound effects.
So, it became a sound design challenge, which is really fun. Um, other other things to consider, the game is regarded as a classic.
I mean, when you're talking about old games like this, they're regarded as a classic. You don't want pitchforks.
Very important. So you want to make sure the game is is as 100% authentic as you can obviously but you know leveraging some like okay so we're going to run it at higher frame rate but the gameplay mustn't be affected. Um you know anything that we do the the original game has to still run as it meant to back in the day but just with a little liquor paint and a little bit of this that and here. Um, consider any other things that don't uh include uh gameplay things like CD32 pad support, multiple languages, you know, so we've got RAM for this stuff. It's fine. Clear text rendering, you know, just bells and whistles, stuff that you can like chip away at. To kind of help with the process, um, I also set up a process for MSX debugging. So, this is Open MSX emulator. Um, so using the original source code, I could build uh a copy of the ROM. Also, I can build a copy of the ROM with modifications to it. So, if I need to cheat or jump to certain rooms, I could go in and modify the ROM and then bounce that out. It also gives me debug symbols, which are half useful.
You will kind of just see them there.
You'll see that why is the elevator control right next to snake sprite IDs?
Um, which they shouldn't be. Um, it's because the MSX is a uh Z80, so the ROM is banked. So basically all of the addresses are in this section here but actually across the cartridge they're like that but because they get banked they all kind of get overlaid on top of each other. So yeah very confus half useful but not great but I can now step through code in this emulator and actually inspect exactly how the Z8 would work. Right? So if I'm looking at some code because Z8 I don't really understand it. I don't really know how that works. I can fire up the emulator, set a break point around that function, get to that part in the game, and then just actually step through and see what it's doing with all the registers and how everything reacts with each other.
Um, set up on the Omega is um, uh, VS Code, Amigga assembly plug-in. Um, the game changer I call this thing. Um, it is an amazing plug-in for Visual Studio Code. Um, if you want to get into Omega assembly programming, I could highly recommend this. um it it'll um it it's got loads of bells and whistles to it, but the most important thing is that when you're writing your code, you can just hit a a little breakpoint sign on the side of it, fire it off, and it will jump straight into your code, and you can debug it straight against that code, and you can put memory watch points. It is just fantastic. Great bit of kit.
Yeah. So, to set up the kind of code side on the Omega, we set up the screen setup that mimics the MSX because the Omega is super flexible. It can do any size of screen in any number of color depths that you want. It's perfect. It's great for that stuff. Um, and then for the graphics converter that we've got, we just add a like an Omega format export to that and then we just pull all the stuff all the room data we've already got in. Just pull all that in.
The question is though, where do you even start? Right? You've got a mass of code. Where where's a good starting point? Well, the starting point is the entry point that the code actually starts when it's running the game.
Right? So just go where does the g where does the game start? Let's grab that. So you'll have a chunk of Z80 code there and you kind of read it and understand it and then you create a 68,000 version of it. Um and it's basically like a rinse and repeat kind of uh spider web that you crawl down. So like that will start there that will call that sub routine. Okay, let's go off and look at that one. Do that one. Oh, that's calling these routines there. There. And eventually you just kind of just by virtue of just drilling down and down and down you end up porting the entire game.
Uh so here's a little example of a bit of code. You got the Z80 on the left there and then 68,000 version of the right. You can see they're pretty similar. There are some idiosyncratic differences in terms of how you would use your registers and stuff, but on the whole, we can see we can check to see if an enemy is punchable because some of them you can't punch. Uh the first thing I've discovered after after it's done its system initialization, uh it fires off this interrupt that runs every frame. So every time like the beam has finished its its cycle, it fires off this interrupt and then runs it code. And this is basically the master the master list of functions that or game states it could be in. So we've got this Konami logo waiting demo play game over pause ending all these different functions. So it can be in different states of you know if you died okay we'll switch it to game over. Then it will show you game over for example. Um but obviously we're starting at the top. So the first thing we have to port is the Konami logo.
Um, now this was the biggest actually the probably one of the one of the biggest uh concepts in terms of uh game development that I learned was this concept of actors. Now other people might call it other things. You might call it just enemies for example, but an actor can be anything, right? It could be an enemy. It could be a bullet. It could be an item to collect. It could be doors. It could be triggers for things.
It could be anything. But the point being is that you'll have like a set of common properties for it. Like where is it? What direction does it move? it is it pointing uh does it have any hit points um what's its status uh can I move can I be collected or whatever and they have a life cycle for these things so uh an enemy will be spawned and then every frame once it's spawned it will just run its code and then if things change it will change its own status so for example a guard if it sees you it will change its status to say no I'm now an attacking guard and then run that different bit of code there and of course when they they either get killed or deactivated So, um, yeah, and then what happens is, uh, for each room in the game, it'll have a list of these types of actors, where they're going to spawn, what their properties might be when they spawn. Um, and also an actor can spawn another actor. So, for example, if a guard is in attack mode and he sees you, it can spawn a bullet, which is then firing towards your direction, taken from where they're currently standing, for example.
Uh, how many actors? Uh, 64. Oh my god.
Right. Uh, that's a lot to do, right?
That was uh, yeah, you finally find the actors bit and go, "Oh, that's really clever." And then you go, "Oh, I've got to pull all 64 of these." Do we do all of them at once? No. No. No. No. So, the trick with this is uh, obviously you have your list of them all here. You'll see uh, in init gas. You initialize the gas. Um, so you basically just put these, you point these to just a null process, just something that does nothing. So, it won't initialize, it won't do anything. Um, that means when you're wandering around the game, uh, when it tries to spawn these things, it won't do anything, but it also won't make the game crash, which is very important. Um, and then you go through each room and you go, "Right, okay, we're in the first room. What's the first what's the first actor we see?
It's a guard. Okay, I'll go and port the guard. I've done all the stuff for the guard. Okay, that guard's now done. We go to the next room. Oh, there's a camera. We'll do the camera now." So, you basically just kind of wander around the game. Go. it pops up and says, "I'm gonna do this actor." And you haven't done it yet. Okay, well, we'll do that one now. It's just a process of going around all the map. Um, and it kind of there there's kind of this plateau moment with it where um you kind of every single room you get to, it's I've got to port another enemy. I've got to port another bullet. I've got to port something else. And eventually you get to like the last few stages and you walk into a room and it goes, "No, you've got them all here."
God.
And the other thing I learned was how even the most simplest of game logic can really make a game come alive. Um, so these are the guards in Metal Gear. Now, you'll notice that they basic they just follow a path, right? They follow a path. But every junction on that path, they will basically do a roll of the dice, a random number generation. And on that random number, they'll say whether they're going to carry on walking or they're going to stop and look around.
And they'll look around in random directions as well. But just that one little bit makes them unpredictable, which then pulls the stakes up quite a lot when you're actually playing it. But it is the simplest little bit of code.
Like just give me a random number. Is it a zero? One. Well, zero. We'll carry on walking. One, you know. Uh oh, yeah. And the other thing to remember is things will fail. You will invest time and they will fail. That is fine. So for example, I thought, oh great, I can use Amigga sprites. I can do a multiplexer. This would be great. I won't have to do any complex drawing or blitting. It'll be great. I spent two to three weeks building this amazing sprite multiplexer. And then we get all of the guards, all of the bullets, uh, all of the craziness happening when there's alert and then there's like loads of enemies on screen. They're all firing everywhere. And then the sprite multiplexer goes, "Nah, no, no, no, no, no." It's really great when it hides uh a guard's bullet and you can't see it coming towards you.
That's not good. Um, so yeah, literally had to take all of that. I thought it was a pristine piece of code and then we went actually no, just throw it all away. Just got to ditch it. Um, so if you do get into game dev, expect this to happen a lot.
Um, and then we move kind of at this point like a lot of the graphics, a lot of the levels, a lot of the base game is kind of running but it's not making any noise yet. So now we get on to the sound setup. Now, interestingly, I don't know if this is like a heritage from Konami's um arcade uh experience, but they're basically their the way they set their sound in their MSX games is by one bite.
Now, if you know an arcade system, uh the main CPU will just fire one bite out to the sounds sound CPU and then that will trigger it to do any one of 256 things. And it's exactly the same here.
So it an ID will come in and it will relate to a laser, a bullet shot, a boomerang, a pitfall, punch guard, for example. So just this big list of sound effects and music just all based off this one number. So actually to replace the sound system, we've got one function and one parameter and that's it.
Obviously underneath that, we now need to build a massive sound tool.
So uh we just grab that list. Again, this this kind of C's code, so if you're not a fair with languages, C#'s a high level language. You don't need to worry about memory. Don't need to worry about anything like that. You it's really easy to kind of pick up and mess about with um so you can just kind of throw stuff in here. So I grab the list of sound effects um and then set up some parameters. Okay, I can replace a missile shot with a W file now. Um but because it's in this tool, it's just basically creating a list of information for me. And then I've got an export button which will just grab all of those W files, resample them, turn them into 8 bit that's compatible with the amigga and then just spit out a bunch of data.
So, and then that's a flexible tool. Oh, I don't like that gunshot. I'll just replace it with another wave. I found this lorry sound is too big. I'll just resample it down a bunch of like half an octave or whatever and make it smaller.
Now, dealing with music. Um, Prot Tracker is obvious choice here because on the AmIGGA it's incredibly popular.
It's a very well-known format. I may have a little experience with it. Um, there's a really good replayer for this as well on the AmIGGA that's super fast and has a sound effects engine built in, which is great because I'm already building a game that I've not done before. I don't really want to build a sound effects engine as well. So, great.
That's uh, but the question is then is what do you aim for? Do you want to do an accurate clone of the soundtrack so it's exactly the same or do you want to pick it up and kind of reinterpret that and then you know do it another way? I obviously went for the latter. So we've got the original here.
Right.
Get the idea.
I mean, I love to listen to that for the rest of the afternoon, but you know. Uh, and then this was my reinterpretation of it.
It's a bit more stealthy. All right.
Creeping around.
get the general idea.
And of course, audio data is big. It's very big. And I mean, compared to everything else that you're dealing with, even graphics, audio data is massive. Even on an Omega, it is huge.
It is very annoying. Um, I always say, uh, having done a few Omega games now, uh, you always go through the project think, I've got loads of RAM. I've got loads of RAM. And then you put the soundtrack on and go, I've got no RAM.
Where's it all gone? And then you've got sound effects as well. I can't put them anywhere. Um, so the big challenge to deal with here is, um, if you don't know, Protraer is what's known as a module format. So with a Protraer file, a song file, you'll have all the song data and all of the samples for that song in one big file. Uh, the problem is I've got nine songs to do. Um, and I probably want to share some of these samples between different tunes, right?
So if got some drums, I don't want to have to put them in memory twice or three or four times if I'm using the same drums in different different tunes.
we have to tool it up. So, uh, we create a process where, um, our tool has all of the songs listed in it. So, it just goes through every single song and goes, "Right, uh, out of all the samples we've got, what's the unique pack? What have we got?" So, get rid of all of our duplicates. We just go. Okay. So, we've got that that kick. We've got that once.
And then it goes for each of the songs and basically just removes the samples from them completely and then just puts an identifier in there to say I'm kick drum in I'm sample seven in the in the kit uh in the pack of samples. I'm eight, I'm nine, I'm three or whatever.
Um so that then takes all the samples from like multiple tunes into one unique sample pack. And then for the songs, we've got we just strip them down. So they're just song data now. just note information and sample IDs. And then we pack those because they're taking up too much RAM as well. Um, and then when we don't and in the game, if we want to play something, we we grab a particular song, we unpack it into memory, and then we link all of those samples that we've listed back to our sample pack here. So, we're basically just like stripping away loads of useless, unneeded data. And of course, feature creep because once your game's finished, of course you're going to keep doing extra stuff to it, right?
Uh so, as I mentioned earlier, uh uh the sound chip's completely different. We're not definitely not going to use the original sound driver and make it sound like the MSX. No, of course, we're going to completely convert all of the Z80 for that sound chip. uh and and do an MSX emulated sound mode because I'm a glutton for punishment and it took me about a week and it was hell but we did it anyway. Um, so now you the game can now flick for the real purists. They can play the original game with the original sound and music and sound effects or you can obviously by default we go amigga enhanced. Um, the game ending game endings on 8-bit games were rubbish.
Right. Yes. Now I didn't want I didn't want that to be the case. There is a bit of an ending on Metal Gear for the for the cartridge version. It's not amazing.
Um, but I ported all of that and then uh used half of the remaining disc to do a cinematic outro uh with uh with scrolling credits and uh um I found a load of um uh original artwork and like uh proof of concept drawings from Metal Gear uh series and kind of put those as the background scrolling. It was it's very swish. Um you're only going to find it unless you complete the game though.
So, um, uh, and whilst I was looking for those, I found some original portraits of the characters in the game. Um, now this is a really nice little additional feature. So, uh, Tony Gavas, who will, we'll speak of a bit more in the next bit. Um, he took those original, um, uh, portraits that we found in the game manual and then did, uh, 16 color versions of them. And then for all the dialogue, I linked them to a character ID. So when the character is actually talking in the game, you now get a picture of them by the side. So it helps to obviously you're playing the game like rather than it just being text and a little sprite on the screen, you get their face up and it kind of helps connect you with that character a little bit more. And of course uh we need a crack intro, right?
Unfortunately, I I'm I have failed. This is far too readable.
Far too readable.
So, yeah.
>> Oh, yeah. We stole stole stuff. Uh, so the game's finished.
Of course, regulars on my stream will know exactly what that means. Um, so there we go. That's it. That's that's No, we're not finished yet, obviously.
Um, so what did I learn? Uh, I learned a lot about game mechanics. I mean, we didn't kind of touch on things like collision detections, um, all that kind of stuff. I learned all that, but really important lessons on how to structure your game code, how to make it structured so that it's like a lot easier to understand. You don't want one massive file with thousands of lines in it. That's a terrible way to do things.
You just structure it well.
Uh the simple game logic, even the simplest little things can really make a game come alive. Um I can kind of read set 80 now, which is great. Um and I got better at um uh 68,000, but the biggest lesson of all is tooling is king, right?
If you're making games, try don't just sit yourself into like uh if you're doing on retro machines, don't just sit at that level, right? Try and build stuff at a top level on a PC. easy stuff, just stuff that will help you convert graphics. If you're going to pull a PNG in, uh, trying to do that on a ZX Spectrum is probably going to be a bit difficult. Um, but if you do it at another stage and then put convert your data into something that that can then be pulled in, that's, you know, that's the way to do things. Well, one way of doing things. Um, so what's next? What's the next project? Well, it got me thinking. How did Manuel Pazos create that detailed source code?
How do you even disassemble something from byes into code? Oh dear, here we go again.
So, we picked a target.
Um, so again, another one of my favorite games from the MSX era. It is uh uh Nightmare by Konami. So, I picked this specifically uh because it's a 32 kilobyte game and how hard can that be, right? 32 32,000 bytes must be easy to understand what they all mean, right?
>> Yeah. So, um the way you go about this is uh obviously pick whatever disassembly you're going to use. Um and then you have to kind of map out how the memory is laid out on that system in your disassembler. Right? So, uh for the MSX, there's some BIOS bits down the bottom. uh that was RAM and this was ROM. So the once you've set that out in your disassembler, it knows, oh okay, that's where the RAM's going to be, that's where the BIOS calls will be. Um so for the BIOS calls down the bottom, we can like label those up with the with the MSX documentation. And then when you're looking at code and it's trying to jump to that, you go, "Oh, I see what that's trying to do. It's it makes makes more sense."
Um so you just set all that up and then you start disassembling and then you end up with this. Uh so the thing I loved about disassembly was it's like a massive jigsaw puzzle. It's huge but you get these moments like for example uh you'll see here call unpack gfx3. It's probably not the best uh uh description of a function but the thing is is once you label that function in the disassembler everything that calls it then suddenly says unpack gfx3. So it's not like I have to go through and change them all. I change the one function address there and then the holders and you kind of get these little points where it's like oh that's print message and then you look at the code and go oh I can see all the print messages now. So again I run the game in open MSX the emulator we saw earlier. Uh means I can de I can debug it. I can then run bits of code and go what is that doing? Oh that's that enemy. Label all that up. Um well here we go again. Right. Spent three months disassembling the game.
I've got it all I know exactly where everything goes now. Now I know exactly all the enemies, uh, how it does the title screen, everything. Literally everything.
Be a shame to let that go to waste, wouldn't it? Let's port it to the Omega.
Uh, okay. So, again, what we aiming for here? It's same as before, except this is an MSX1 game. So, you can see in terms graphically, we are we are a shade below what the Amigga can do here, right? It's uh so we're going to need to boost that up. Um, so my friend Tony Galves, uh, who did the portraits in Metal Gear, um, is also an MSX fanatic like me. Um, so he was very much like he's played all these games, so he knows them really well. So he instantly offered his support.
Uh, however, graphics are going to take some time. It's not it's not it's not quick work. He has to fit it in. Um, but we need to somehow work concurrently on this. Um, so what we do is we basically extract everything that Tony's going to be working on. We extract and put into like a PCbased format, right? Um, so I'll just show you here for example. So, so I I do that extraction and then hand those over to Tony. So, for example, uh, all the level maps, I extract them all and I put them into this app called Tiled. Has anyone ever used Tiled before? Yeah. Yeah. There we go. Uh, great bit. It's free bit software. You probably should send them some money.
It's on HIO. Um, but I could put all of the graphics from the MSX into here and then just hand Tony that file, right?
The game itself currently imports this file as MSX graphics into the Omega game. So when Tony's finished doing his repainting and everything, I just swap the file out and then bam, the graphics are in.
Similarly, I generate him a bunch of sprite sheets. This was slightly more complicated because uh Tony redid some of these and they weren't in the same place on the sprite sheet anymore.
But uh the result was, you know, it just meant I had to just pack around with some numbers in a JSON JSON sheet a bit more. But effectively, again, extracted everything from the game, gave it to Tony. Tony could go off pixeling. I could go off with the physical work of actually porting the rest of this game into Amigga code whilst just using these current assets. So, it still look rubbish. Well, sorry. It'll still look like the original.
Don't call it rubbish here. Um, uh, but it means, yeah, we can just kind of work concurrently. He can go off pixeling. I can go off do the code. Uh, music. Why did I do this? Um, so the original game of Nightmare has eight levels with eight bosses and two tunes for each in-game and two tunes for each boss and it repeats them. And I thought, "No, we're not having that. Let's do 16 unique tunes for this." Yeah. Um, I just massively underestimated this. And um, yeah, it was I mean, the end result is really worth it because uh, the soundtrack actually helps. And also because it's not repeating tunes, it does make the game more interesting. But yeah, it it took so long. Um production process is largely the same as what we've done on Metal Gear, right? But with still a little feature creep. Uh Tony challenged me to do a bit map uh scaling logo for the intro. Uh it took me about uh 4 days uh over a weekend as well. Um and uh yeah, it looks really impressive for a 500. A big Bitmap logo.
Um, but yeah, um, again, we boosted the ending. We put a few extra little details in there. Um, we did I I did take a little bit of, uh, uh, artistic licensing on the gameplay for this one.
Um, so it is quite brutal. It's basically a shoot them up, but like with a knight. Um, but when you die, you lose all your powerups. And you know what that's like when you're kind of level six in and you lose all your power-ups?
You're probably going to die. Um, so I hid uh secret shops in the game. There's one on every level and you can trade your score for permanent powerups. So you will lose some of your score, but every time you die, that powerup will then come back and back again. Um, I also added a secret Gradius power up. So it turns your little knight into the Gradius ship. It plays a Gradius music and you shoot lasers for a bit and then I should have I should have got a video of that one. Never mind. Um, okay. This is what the game looked like before that scrolling so smooth.
And this is on the MSX. This is the original MSX version.
And then this is what we ended up with on the Omega in the end.
I picked this one cuz this seems to be everyone's favorite uh tune out of the soundtrack.
I don't think we I think I stole this uh play back from someone else online. They don't know where any of the secrets are.
You have all the incidental music that happens if you pick certain power-ups.
It has to pause the soundtrack, play another Protractor soundtrack briefly, and then restart the music again, which is Yeah, that crashed a few times.
Um, so yeah, there we go. Oh, and uh if you do this, you need thick skin. Um, I'll let you read this because uh it's uh uh I'll just I'll just leave you to soak that up a bit actually. I don't know if you can read it at the back there.
I don't like the colors. I think my favorite uh what's the my favorite one?
Uh the arrows that shoot the enemy are too ornated.
It is not good at all. I don't like it really and I appreciate the their effort but man no way.
Um the thing is you have to remember like you know we have nostalgia for all these things right like they like and we feel passionate about it. I mean it's very important that we don't turn into that >> right we have to respect other people's passions but yes uh just let it be known if you're going to play with some old 8 bit or 16 bit game and you're going to do something with it man if it's you're going to get this even if you get it spot on. I still This is my favorite one. This is better than the original game. No.
>> Quickly, this said it was November 2021.
When did you make that?
>> Uh that was 2020. So I think that took about a year I think to make um production on that was quite slow um because I just you know it's I'm doing stuff for the first time. I've never you know I've not built these kind of tools before, not really read Z80. to the process. This was a bit quicker. I think this was probably um it was three months for the disassembly and I think probably about another three months for getting the game together >> and then far too much time on the bloody soundtrack.
>> You know, you got that feedback obviously from the community, but did you ever get feedback from for example saying >> no gladly? No. No. No. No. See, yeah. We I never So I You make a good point though, right? We're We're mcking about with IP that I don't own. I'm not licensed to do this. I don't care.
I always figured it's going to run two one of two ways, right? I'm either going to get I'm either going to get away Well, three ways. I'm e going to get away with it. I'll get a cease and desist or I might get employed.
Either way, it's great, right? Like if I get employed, great. If I get cease and desist, that's going on the wall.
If I get away with it, great.
But, uh, Graeme put this, they do the Norwich Omega Group. He put Nightmare on and my now boss played it.
And then one one day during my stream, I I said, "Uh, h I was just really disappointed with my current employer."
And I said, "Is anyone looking for someone?" And Francis said, "Yes, I am."
And now I've been there for two and a bit years now.
Um, so what next?
Okay, so we've produced two games, right? Both Konami IP, right? How about getting permission this time? Might be nice, wouldn't it? You know, maybe we can release something a bit more, you know, uh, signed off, so to speak. Um, and that's when we get to seeoid, and it's pronounced.
Say it any other way. Gareth corruptor who made it calls it seeenoid. the secret. Um, so, uh, uh, so he's a good friend of mine. Uh, he made this game in about six to eight weeks in Unity, right? Um, that's including the bonus game as well. Uh, about 6 to 8 weeks. I mean, you know, he's professional. He knows what he's doing, right? So, um, uh, but it's all made in Unity, so I've got complete source code for it. Uh, and mate, it's just black and white, right?
That's totally doable. black and white, mate. This might be a problem.
The realization really kicks in quite quickly on this one. Yeah, we do this not because it's easy, be because we thought it would be easy.
>> Yes. Um, so system comparison. So see Yeah. Yeah. Yeah. Shader based multi-threading. No. Yeah, we don't have any of that. No. No, no. So, I guess the point to make here is that um I think it even says on the next slide um going from Unity to AmIGGA, right? Now, this is a different kettle of fish. From MSX, we're like 4 MHz to 7 MHz. Uh 128K around a meg, right? So, yeah, we got room to play. We're going the other direction this time, right? So, Unity, for example, provides a huge tool set.
You want to see if two spheres have smashed together? There we go. Great.
What's the mathematics behind that? I don't know.
Um, it all could it can also do floating point maths which you am can't do. So, you have to do it as fixed point. Um, so yeah, effectively the AMGA is a blank slate. There's no flighting point mass functions. None of those tools are there. Um, everything needs to be built from the ground up. Everything, every system, collisions, the lot. Um, and it needs to be quick as well because uh we we'll get we'll get across this anyway.
So, uh, so as a starter point, um, obviously we've got the Unity project, got all the source code, all the assets, all the audio, everything in there. Uh, it's fully debugable. Great. Um, all the information is there. I've also got Gareth. I can ring him up and go, "How does that work? I'm looking at the code.
I don't really understand it." So, that's great. Uh, the guys at Thalamus had actually taken the original game map and shrunk it down a bit to fit. Um, they were actually intending this to be for the C64 version, which hasn't materialized, but I stole the map because it fit on the Omega screen. So, uh, it's like 320 by 200, I think it was, something like that. Um, which also fits into NTSC, so we can run a power line NTSC, which is great. Um, so we've got a similar process again, right? We start by we we'll grab that map, we'll write some code to import that in, and then we'll start rendering that map, and we can browse around that map, and then we'll just go through each room, right?
getting to the the first enemy we see and then porting that enemy across into code.
Oh my god, this is the second room.
Uh yeah, lasers. Who would have thought they'd be so complicated? They're very complicated to do in seven meghertz. So the problem is it can do scenery collision detection. So if you look at the laser when it hits that block, hey, there we go. Oh, okay. So that does ray casting. You got a breakdown the expensive thing that they do on Doom, right? Uh and also the player has to be destructed by this. So how what are the maths for that? Like oh my god, what are we going to do? Um yeah, so the solution was basically just to make also there were rooms with like six of these in, right? So right if you get one to run in a frame, but it's taking the whole frame, but you put six in there, the game's going to run at half the speed.
It's going to be no good. Um, so yeah, I managed to just about get a ray casting um, uh, set up that was pretty quick. It would fall. It would basically the collision map that you see on the screen. Well, you don't see this collision map, but the collision maps are 8 by8 squares. So, anything that's an 8 by8 square, you can either not go through it or go through it. Um, so the raycaster only has to jump eight pixels at a time. So, there's only so many steps it needs to do before it'll hit something. And when it hits something, it then goes backwards a bit and goes, "Do some slightly smaller steps. There's the edge."
There is a way of doing that properly, but I didn't know. Um, but it was fast enough. Uh, the line intersection detection, um, I went down a serious rabbit hole trying to work out the math for that until my friend said, "Well, if one of the lines is straight, that does make it a lot easier." Oh, okay. So, uh, the way it works is there's effectively the player ship has two straight lines.
one that way and one that way. And then you do line intersection check for that one and then that one. Um so it makes it so much simpler to do. Um I can't remember the maths for it. I've got it on a piece of paper somewhere at home like this the formula for it. Um but yeah, again for those like the complex math stuff, I did it in like C first.
Don't do that stuff in assembly language first. work out the maths in a language that isn't rooted into your game code at this point. Just work it out. See if you can like follow the problem in a nice simple high level language and then Oh yeah, that's going to be a lot easier to port afterwards.
Oh god.
Oh no. So this I actually I I I foolishly because I did the thing of like oh well look at the first few levels of the game. Ah this will be easy. It won't be a problem. I hadn't actually completed the game at this point and then I found this. So this is the amigga version of the of the room but the PC version is like it's basically the same. Um so all the collision detections in the game are effectively known as AABB or axis aligned bounding uh box. So basically you're just checking boxes hit other boxes, right? It's the really quick and simple uh collision detection method as you can see from Let's get that playing again. You can see from these these aren't boxes. They're quite large. Um, so we we I just Yeah, trying to do some kind of collision mechanism for each of those individual panels wasn't going to work. I came up with this crazy idea that well actually it's just a circle, right? And we have a center of a circle and we can I've got a calculation that will get us the distance you are from the center of the circle, right? So we have distances then of the outer edge and the inner edge. And if the player hits the distance of the outer edge, push it outwards. If the player hits the inner edge, push it inwards. And that's and that's all it was. It's kind of like a weird uh it's it's not a collision detection as such. It's just it's trying to keep you in or out of the edges of a circle. Um and then this bit in the middle because we have a rotation and that's got an angle that's going around.
We basically have a section that says oh if the player is in this angle of the circle don't do anything. So so and then obviously you can like you can uh there's what you do is you kind of do this this process of rather than doing all the calculations what's your earliest exit you can do. So the first exit is are they in that box? Super quick. No don't do anything right just skip out. Okay you are in that box.
What's your distance? We can calculate that. Okay, you are in or out the distance range. That's that's fine.
Don't need to do anything. Are you in that bit there? Okay, then we check that angle. So, you just have to organize your your uh your functions to be like what's what's the quickest way out?
What's the simplest, shortest bit of code we can do that will get us out and we don't need to do anything else. And then just order it. So, okay, what are our most complicated things to do? Just order it in the right order.
Uh oh, particles. Now, this was a non-negotiable with Gareth when I took on the game. He said the particles was an important game feature. Um, and a good friend of mine for called E-Moon from the Black Lotus. You may have heard of them, the demo group. Um, the interesting story of this one was uh uh whilst I I was doing development of this on stream. Um, and during my streams, you also watched some AmIGGA demos, right? And then we put on some Omega demo and I offh hand said, "Oh, it's got a lot more pixels and dots than I have."
And then Emoon came back three days later saying, "I've disassembled the demo. I found out how it works."
Okay. Yeah. Yeah. It's known as a Blitter SMC. He's like, "What? Okay, that sounds interesting." Um, it's a technique where basically we use the Blitter to generate code and then execute the code. It's I won't go into too much deeper detail than that. um when you all become Omega demo encoders, we'll tell you about them, right?
But effectively, it enabled us to have a thousand particles um on the Omega 500, not expanded um uh and the game would still run fine. However, you do get into a situation where the game gets busier and you don't really want to be processing a thousand particles. Um so we created this uh so so after getting the original thing from E-Moon, I created a a frame drop detector. So if the frame goes over and it would slow down the gate, uh it goes to the particle engine goes right clip off 100 and bring down our maximum particles.
If it drops again, uh within less than a second, no, cut more, bring them down, cut more, bring them down, cut more until eventually, if it's still like hitting that frame, there'll basically be no particles. So you'll see, it'll be quite hard to see in this video, but you'll see. Um I put it on loop, actually.
So you see here as it starts when it starts the next level you see. Okay, I've got there's quite a lot on screen.
You've got some particles. Oh no. You see the particles suddenly disappear when things and it's getting really busy now. Like part No, no particles. Oh, that's really busy now. Look at all those collectibles. Yeah. And then screen gets tidied up. Hey, you're allowed again now. So it's just like it's like selfbalancing. So So we can like when it when we got the time to do it, let's have all the particles. It will look great. If we haven't got time to do it, we try not to slow down the game. Want that to be kind of getting through. So, so yeah, it just prevents slowdown in the game. I mean, there is still slowdown on an A500, particularly in that mode. My goodness, it gets too busy.
Um, oh yeah, for sound. Um, but yeah, really threw the book at it. Um, the music player in game has got six channels. Uh, and the sound effects engine has four channels. So, you've actually got 10 channels of audio in game whilst you're playing. Um uh so there is a I won't go into too much detail on this the music player uh trick that we've got there. Um there's I did a write up about uh doing the soundtrack for Eon uh that ama you all seen Eon?
>> Yeah. Yeah. Uh fantastic demo. Um I go into a lot of detail about how we basically had more channels and made a tune for a demo that wouldn't even fit into RAM. Um the sound effects player uses a single channel of audio but then live mixes uh sound effects. um uh and does four basically. So you can spend one Omega channel and get four channels of sound effects and it has the added bonus of none of those need to be in chip memory which is great which frees you up more chip memory for other stuff to do. Um so yeah just like you know I know it's black and white. I know I know that some people are not going to like that but we want to make sure that like at every turn like we are putting as much as we can to make it as performant playable and just you know get the presentation up as much as possible to be fast enough samples of anybody just a bit quiet and you just add them together without having to divide it down.
>> Exactly. Yeah, that's exactly it. So yeah, it's spot on.
Yeah. So, if you're adding Yeah. If it's four channels, then they have to be four times quieter.
>> Yeah.
>> Because you add four samples together.
You don't want it to be Yeah. Yeah.
>> Uh, egg hunting.
>> So, uh, the base game was actually quite short. Um, and this is where the feature creep comes in because I added a lot of Easter eggs and I mean a lot. And I'll show you the first one here. Now, this is an interesting one because someone someone said to me uh the other day. Oh, really good faux ZX Spectrum noises in your uh Easter egg.
>> Nice.
>> Right, I won't subject you to the whole thing, but >> what game does that look?
Uh, well, I can tell you the I mean, the game's been out long enough. I can tell you what the three Easter eggs are. So, there's three cassettes that you can pick up. So, for the Amigga, on the Omega, I built a ZedX Spectrum tap player. So, it'll actually play a ZedX Spectrum tap file out of your out of your sound outputs. And you can plug your sound outputs into a real Spectrum and load this data directly into it.
Right. So the first one there, that is actually a uh ZedX Spectrum beeper music disc that I built for this um for four for four tunes. I think we'll put that out publicly anyway. Um another is a two-factor authentication system and the game will randomly generate a six-digit number the first time you switch it on. So there's no point snapping the code and expecting it to work again because it's different every boot time. Um, and that will unlock a secret lemming style sub game that I added in there as well.
>> Um, and then the third one is a ZX Spectrum version of Seenoid hidden inside.
Um, I was um, Terrible Fire has a little gathering every uh, every year around October. And I don't know if you know who Chucky is. You might know Chucky. Um uh but we had this the CD32 and a ZedX Spectrum rack next to it and I was just demonstrating to the guys that oh yeah this is all the Easter eggs and Chucky came over he's like h wouldn't it be funny if there was another game in there and then it popped up on screen anyway and he just uh did an exploitive and walked off.
Uh and then what's Oh yeah, again remember I said you have to be thick skinned. Um, so one particular uh evening during a development stream, we decided to get a little cathartic.
Um, so yeah, so uh there's a popular uh uh uh blog site called Indie Retro News, and when the first previews of this came out, I had no idea this was going on. Uh someone showed me afterwards that some really spicy uh uh really spicy comments were being made. Um and I'm to be I'm pretty thick skinned about this. I think it's hilarious, right? that someone would be that upset about someone making a a computer game for a machine that's been 30 40 years out of production.
Right. Someone said Simon said he wants an Atari ST port. So now we destroyed that with a laser as well.
Um yeah, Uratron. So hang on, let me just uh I'll mute it as well cuz it does get a bit noisy. This was a bonus game that was um part of Seconoid. Um like a rootron style, but yeah, twin stick shoot blah blah blah. Um uh but yeah, after the main game was finished, uh this mode of the game basically shared uh loads of the basic. So like the collision systems, uh enemy logic, pretty much most of it was just wholesale just it could just use it, right? Um the only things I really had to do to get this up and running, um was uh obviously set up the waves for it. Um get all that data together. Um there was a few additional enemies. A key point of this though is um so for Gareth who made the original, this was his baby, right?
Uh so I tell you an interesting little story is I went I went to visit him with like an early build of the game. He had his twin twin sticks out and he played it and he played this for about half an hour and afterwards he went, "Can you make the collision box on the player one pixel smaller?"
And then I did and I put a build back on and he went, "Yeah, that's it. That's it. That's it. Just that just that one pixel difference just to get you past something. Um, but yeah, we had a reduced player area. So, it's kind of kind of a win-win really because the compared to the original PC version, it's on a 16x9. It's quite a big area, you know, to kind of move around in. Um, but here we're quite small. So, um, all I did uh mostly just to save on processing time was to reduce all the types of enemies by half, right? And it had the perfect It just seemed to be the perfect balance of okay, we've we we're still fast enough and it's not too cluttered. You can still play it. Yeah.
So, it's just the perfect the perfect and obviously I gave this to Gareth who was like because this mode he he wasn't bothered about the mainoid game. He said you can do what you want with it. Um so I did but this mode he was like no no this this has to be right. And the funny thing that that after all of this, like playing the other game and playing this one, this is the one that I absolutely love. Like the the my favorite way to play it is with twin sticks and the music up really loud.
Um it's what you end up in what's known as once you know some of the basic principles of like, you know, how the bonuses work and how the scoring works and how you can kind of milk stuff and kind of how these kind of things work.
um all that kind of gets second nature and then you end up in what's known as a flow state. And when I play this, if I've got if I'm if I'm comfortable and I've got the sound up loud, I can I just I get lost in it. Completely and utly lost in it. Uh testing. If you've got friends that will play a game and not and not obviously, you know, put it out on bloody BBS's for everyone to download. If you get good friends that will test your game, uh what they'll also do is is when it crashes, they'll clip it for you. And that is it's just it's so helpful because you end up with video evidence. You can see what happened leading up to the crash. Uh ship it. There we go. So we did all right. I think this came out all right.
Phys. We had a physical release as you can see. Is it there?
>> Was there earlier?
>> Uh oh no. There. There we go.
There. There we go. And we do have Yeah.
Let's have a look.
>> You got felies. You got a black disc.
Look at that. That's lovely, isn't it? I think there are still some of these about um if you get aus. Um were there any bugs after shipping? Yes, there was one and it was found. It was about um I don't know couple of months I think afterwards. Um so I stole the scoreboard code from Nightmare because you know as you've seen like each project Well, let's not reinvent the wheel. Let's just grab that. Let's grab that. So, I got the uh scoreboard from Nightmare. It only supports seven characters.
>> And then someone got 10 million and then what happens is the scoreboard goes, "Right, okay. Uh uh how many how many space characters do I need to put in front of this?" Uh minus one. Okay.
Minus one. Okay. Let's write space 256 times in memory.
Yeah. So, uh uh it kind of Yeah. The scoreboard really crashed. like hideously crashes. So, you can carry on playing. The game won't crash until you get to the scoreboard, at which point, nah.
And actually, if you manage to save it like that, your scoreboard would crash every time.
But no, it crashes before it saves it.
So, it's fine. Um, but as far as I know, that is the only bug that we found since. So, uh, yeah, it's, uh, you've got to test stuff and test stuff with your friends. Remember, like no hardware is different. the way someone else will play a game. Well, they'll play it differently to you. Um, particularly as a game de like, well, I just do this bit and this bit. I know the sequence of events, and then someone comes along and does them in the wrong order and then locks themselves out of a room or something, right?
Oh, yeah. Then we get into the uh the the fun part. So, I ordered a Mr. FPGA.
I was thinking, uh, all right. Now, let's let's just bite the bullet. Let's order one. Okay. This at the price I'm happy with the price of it. I'll get a Mr. FPGA. It'd be great. and I was bored waiting for it to turn up because it wasn't going to turn up for another three months. So, I started disassembling arcade games because that sounds like fun, right?
Shinobi, how does that hardware actually work? How does the AR Oh. Oh, we're doing it again, aren't we? Oh, no. Oh, right. Okay. Uh oh. Oh, we're in fairly uh familiar territory here. 68,000 CPU, a Z80 CPU, tile map, sprites, uh, FM, ADPCM. Oh, that sounds quite cool. All right.
Uh, how do you disassemble, uh, an arcade game? Essentially the same, right? So, you have a memory map. So, you see here we got the ROM, tile RAM, tile RAM, text RAM, pallet RAM, uh, MIS.io, all these other bits and pieces, all these areas of MA of of the 68,000 address space that the the arcade hardware will have allocated. certain functions and certain bits and pieces.
So, you just replicate that in your disassembler, load in the ROM, and dive in.
Um, so the Mr. FPGA turns up. At this point, I disassembled all of the graphic functions. I'd ripped all of the sprites to PC. I'd ripped all of the level maps and all the level tiles to PC. Had them all in like PNG format and everything else. Uh, how the game starts and how its menu kind of works. Kind of found that out. the actual game logic in terms of all the enemies and everything. No idea. Not a clue.
But what do we want to do with it now?
How about we put on an EO? Right. So the thing about So I don't know how an EOGO works. So oh look, that's another system to go and have a look at and let's have a dive in there. Oh yeah, why not? Uh we can learn that system. We can build hello world. Can this run shinobi?
So, system comparison again, uh, Sega System 16 hardware, CPU's slightly slower, so we've got a bit of leeway there. That's good. Uh, flexible sprite engine, uh, with the Neo Geo has 380 sprites and they're 16 pixels x 512.
Um, uh, the three parallax tile maps.
No, we No. Do you know sprites? Sprites.
Anything? No. No. Sprites all the way down. Sprites. So, if you not if you don't know anything about the Neo Geo hardware, it is sprites all the way down. There's no tile maps, there's no level maps. It is just sprites. Um, which is super simple and super flexible and super weird. Um, again, the the kind of sound hardware is kind of fairly evenly matched. We got a lot more ADPCM channels, but you know, horses for courses really. Um, can we cheat a port?
Right. So when we're doing stuff from like the Z80 to 68,000, we have to understand how everything works, right?
Because we have to rewrite everything in 68,000. You know, there's an enemy. We need to understand how that enemy works.
We need to write a version of it. But if we're able to disassemble the code from an arcade machine and just have it labeled as LB134280C, but the code is disassembled correctly, surely if we assemble that code and run it on another system, it will still work. We don't know how we don't know what it's doing, but we know that it's there.
Um, so what is needed in terms of doing uh something from the arcade to the Neo Geo, which is effectively an arcade system, but they're two different systems. So the first things first is graphically you'll need to replace all of the graphics functions. Anything that you can see or hear will need to be replaced. Um, you'll need to remap things like the input controls, credits, start buttons, all that kind of stuff.
Um, and probably and we also need to imple implement some basic Neo Geo bars functions, but nothing major, just kind of ancillary stuff. But can we get away with just having that top level stuff doing some graphics conversion and then just leaving all of this massive mysterious code just there? What is it?
I don't know. I don't even know. I don't know.
>> Yes, we can.
we can uh so once I'd uh converted the sprites and replaced the sprite uh system with a Neo Geo uh equivalent like basically the game we just let the game write its sprite list out for the original hardware and then when when the Neo the Neo Geo code kicks in reads that table and goes oh we just we use that one there we use that there that there so it basically just converts the result the game can do whatever it wants right it'll the at the start of a frame and said, "But there's there's the sprites I want you to display." So, all we do is we come with the Neo Geo code and go, "No, I care that links to that, that link to that." Do that as quickly as we can. There we go. So, you end up with the game can move the sprites wherever it wants. Our conversion code will just deal with it. Um, the other point is the uh the tile backgrounds, their scrolling routines. You do have to kind of dig into those quite a bit just to kind of understand how they do their wraparounds and stuff, but essentially again, just create a Neo Geo version of those. then the game just wherever it's moving those those tile maps to on Neo Geo is just yeah okay that's fine that's where that needs to be. Um the kind of annoying stuff is the comp complexity with the ancillary stuff. So things like the title screen, uh the mission intro, the bonus stage, the ending, the scoreboard, all of that stuff. Uh they tend to use um like custom bits of code to put stuff on screen, which means you can't just go, "Oh, just I can't just plug that into something. I've got to rewrite that." And it's really frustrating, especially when you do the first two bits, the sprites and the tile maps, and put some controls in. And the game's working, but then obviously you go to do the next mission, and it's there's nothing on screen. And then you start the next mission. So, oh, uh, yes. So, the next video is, um, how accurate this ended up being. Um, so this this isn't my video. So, on the left is from the Neo Geo CD and on the right is from the Nintendo Switch running like a arcade emulator ROM version. Uh, I made it silent because the double sound does get very annoying.
Someone did this comparison video and it's like, "Oh yeah, we've got that pretty bob on.
You seeing it side by side?" Yep.
Done. There we go. But all these bits and pieces like all these little details that we you would normally need to understand like uh Okay. So it's it's showing the power thing when it comes up when you pick up the power up. I don't know where that code is. I have no It's in there somewhere. It's labeled as uh LB138417 for all I know. But yeah, the fact is is that I was able to disassemble it in such a way that okay, I can see that that's code, that's data, these are pointers. I don't know what they do, but as long as it's structured correctly, you could just build it and drop it on another system. The CPU is the same.
There's no reason why it can't execute that code. You just don't need to know what it does.
Uh again we get to Golden Ax basically the same process right this it's a Sega system 16 game um I normally would have gone for at this point gone for uh just picking a different system something else more interesting to kind of pick apart you know find out how that worked but um the reaction to Shinobi was pretty big and I thought well if we could do Golden Axe that would be pretty big cuz everyone loves Golden Axe and yeah it it was it was so popular in fact that AliExpress had it as available to purchase as a cartridge within 24 hours of release.
>> I nearly bought one.
>> Uh oh, this is another little side quest. Um uh so if you seen that there was a Turkade cartridge released recently. Uh I did all the work for the Amigga stuff on that. Um so they were they were given um I did there was I mean I did sign did I sign an NDA with them? No, I was covered by another one.
So doesn't matter. Um, uh, essentially the version of the game that they were given, um, wasn't working with WHD load.
If you know what that is, it's like a a system for the Amigga to help you install games onto hard drive. All of their games on Evercade, if they're running through Amigga, really need to be in WHD load. So, I had to create WHD load uh slaves for all three versions of the Omega games and uh fix a load of bugs that apparently weren't bugs in the version that Factor 5 had, but we definitely had them. So, I had to fix them. So, so yeah, not sure why that was a thing, but there we go. Oh, there's a new game, >> Head Over Hills. You may have seen the trailer that popped out this weekend.
Uh, so this is a a game by Colin Porch, uh, who did the Atarist version. He's been working on this game for 35 years, right? Uh, on and off. Um, and I tell you what, all credit to him, the game was made on an Atari ST with one meg of RAM and a floppy drive, >> right? No, no, no crossdev, no none of this, none of this. No, no, no fancies pants stuff. No, no. when I got source code, it was delivered to me by post on disk. So, um, so my task was really just, uh, I ported it to the AmIgga. I did one of those things that you all hate it back in the day, a loweffort one day port, right? Literally. Um, but yeah, I I spent a few days on it just to like looking at how the graphics system worked. Maybe we could do some and I looked at it and went actually um, one, we'll be probably pulling it away from what the experience is on the Atari ST. Uh two, uh it was going to be way too complicated to muck about with this. So effectively it was just there was basically like one screen setup and one draw to screen function that got replaced and then the whole game just I mean obviously apart from controls and stuff, the whole game just worked. Um I did all the sound effects design for it.
uh demo scene legend Virgil. We actually uh uh parachuted him in to do our Amigga soundtrack cuz uh I had a couple of pops at it and it just it wasn't really me, right? You have to know that if you're doing music for something, you have to know when to tap out, right? And this was mine. Like my friend uh Gareth Corruptor said, "Yeah, you just you don't do twe." I was like, "Yeah, no.
Banging bass." Yeah. Twe. No. Um so Virgil gave us an absolutely fantastic amigga soundtrack. Um, but he doesn't do Atari ST. So, I ported all the mods to uh uh the Atari ST uh using the YM chip.
Um, and uh yeah, we've got a digital release on the 4th of May. The physical release will be a single floppy disc. A single floppy disc you can put in an Atari ST and boot the game. And you can take the same disc out, put it in your Amigga, and it will boot the game. So, you remember those old cover discs that were dual dual format? We've developed that for this.
Um, what are you working on now? Um, so actually, uh, Seconoid 2 is in a is in Seconoid 2 is is in a is in a planning stage at the moment. Um, I've spoken to Gareth, who obviously made the original. Um, he's given me full permission to kind of go off and do it. I shared within my what our idea is and it's kind of like imagine a puzzle game but you have to do sections with massively hard twin stick shooter action in the middle.
Something like that. Yeah, that's kind of the idea. But yeah, >> put some colors in.
>> No. Oh, >> maybe blue.
>> Maybe. Maybe. Oh, no. No. We've got one where actually I think one of the ideas I've written down is uh there's a room that you go in and it inverts the screen colors so it's all white.
Um thank you for watching everyone. Huge thanks to Hoffman for giving this talk.
Please do check out all the links in the video description to his hundreds of projects and where to find him if you want to go and follow him. And if you're a patron at patreon.com/theret retrocolctive, stay tuned for an additional Q&A section very shortly.
Related Videos
Agentforce NOW AMA: Build with React and Salesforce Multi-Framework
SalesforceDevs
490 views•2026-05-28
How agent o11y differs from traditional o11y — Phil Hetzel, Braintrust
aiDotEngineer
450 views•2026-05-28
WEB TECHNOLOGIES UNIT-2 | Degree 4th sem BCOM Computers web technologies unit-2 full explanation💯✅
LearnwithSahera
1K views•2026-05-29
More tests are always better? How to use AI to identify tests that bring little value
Alliance4Qualification
335 views•2026-05-29
Search Algorithms Explained in 60 Seconds! 🤖💨
samarthtuliofficial
218 views•2026-06-01
People of Game of Thrones using JavaScript DOM
AltCampus
296 views•2026-05-30
Introduction to Problem Solving Part - 1 | Lecture 1 | Intermediate DSA
ascensionix
107 views•2026-05-29
🚀 BCS613C Compiler Design | Module 1 to 5 Schema Evaluation 🔥 | VTU 6th Sem 💯 #VTU #bcs613c #exam
Pranavaa-y4y
104 views•2026-06-02











