In short
Podcast Notes: Emulating Retro Games on Modern Consoles with Robin Lavallée and Bill Litshauer
Episode Overview In this episode of Software Engineering Daily, Robin Lavallée and Bill Litshauer discuss the intricate world of emulating retro games on modern consoles. They delve into the technical challenges, business models, and innovative solutions that their company, Implicit Conversions, employs to bring classic titles back to life with enhanced features.
Key Concepts
- Emulation Explained: The process of emulating retro games involves running a simulated machine to allow classic games to function on modern hardware without access to the original source code.
- Implicit Conversions: A company focused on emulating and enhancing retro games, primarily targeting PlayStation titles.
Guests' Backgrounds
- Robin Lavallée: CEO of Implicit Conversions with a background in programming and game development at companies like Ubisoft and Meta.
- Bill Litshauer: COO of Implicit Conversions with experience in casual gaming and quality assurance.
Key Discussions
Emulation Technology
- Syrup Emulation Engine: A proprietary engine allowing the integration of various emulation plugins for different game consoles.
- Game Examples: Focused on PlayStation systems (PS1, PS2, PSP) with plans to expand to others.
- Unique Features: Addition of save states, widescreen support, and interactive manuals to retro games.
Technical Challenges
- Compatibility Issues: Ensuring that old games function correctly on new hardware without the original code.
- Timing Management: Addressing delays from older hardware that can affect performance on modern systems.
- Game-specific Limitations: Each emulated game presents unique challenges in terms of speed, performance, and graphics.
Performance Optimization
- Ahead-of-Time Compilation (AOT): Converts game code into a more efficient format to reduce runtime overhead.
- Profiling and Monitoring: QA team plays through games to identify performance hotspots for further optimization.
Networking and Multiplayer Support
- Implementation Challenges: Introduction of features like online play in previously single-player games.
- GGPO Framework: Used for managing latency and syncing states, particularly for multiplayer scenarios.
Patching and Augmentations
- Use of Lua Scripts: Employed for implementing patches, achievements, and fixes for game issues.
- Localization: Adding support for different languages and updating graphics or content as necessary.
Business Model
- Work for Hire: Collaborating with publishers to port games and handle compliance testing.
- Syrup SDK: An upcoming self-service tool for smaller studios to use Implicit Conversions technology for their own games.
Community Engagement
- Feedback and Requests: The importance of community input in deciding which games to emulate and enhance.
- Active Discord Community: A platform for fans to connect, submit feedback, and suggest features.
Future Aspirations
- Upcoming Challenges: Emulating PS3 games presents new complexities due to unique hardware architecture and memory constraints.
- Expanding Reach: Goals to make retro games accessible and profitable for both developers and gamers, emphasizing the potential market for previously unreleased titles.
Conclusion The discussion encapsulates the technical and business aspects of game emulation, shedding light on how companies like Implicit Conversions are changing the landscape for retro gaming. By addressing both the nostalgia of classic gaming and the demands of modern technology, they aim to preserve and innovate within this cherished domain.
Additional Resources
- For more information and updates, visit [Implicit Conversions](https://implicitconversions.com).
- Connect with the community on Discord for discussions about retro gaming and emulation.
Written by AI. May contain mistakes. Listen to the episode to check what was said.
Transcript
Automatic transcript. May contain errors.0:00Emulating retro games on modern consoles is a growing trend and allows players to experience classic titles with improved performance, enhanced resolution, and added added features like save states. and rewinding. However, this process raises many challenging technical questions related to hardware compatibility, performance optimization, rendering, and state management. Implicit Conversions is a company focused on emulating retro PlayStation games on modern consoles. Robin Lavallee is the CEO and Bill Litschauer is the COO at the company. They join the show to talk about the engineering that's needed to emulate and enhance retro games.
0:38Kevin Ball, or KBall, is the Vice President of Engineering at Mento and an independent coach for engineers and engineering leaders. He co-founded and served as CTO for two companies, founded the San Diego JavaScript Meetup, and organizes the AI in Action discussion group through Latent Space. Check out the show notes to follow KBall on Twitter or LinkedIn, or visit his website, kball.llc.
1:14Hey guys, welcome to the show. Oh, great to be here. Hey, nice to meet you. Yeah, excited to get to dig into the kind of cool stuff you're doing. But let's maybe start with the two of you. So can you take turns, introduce yourself? Who are you? How'd you get started in engineering and game development? And what is Implicit Conversions? I'm Robin Lavallee. I'm a French-Canadian. I live right now in North Philadelphia. I'm a software engineer, geek, video gamer, programmer at Earth. I started programming when I was, I guess, seven years old when my dad bought me a Coco 2 Radio Shack TRS-80. it wasn't French the manual was in French it was important I didn't speak any English I started calling basic and I guess I never stopped and then I got a job you know I work at Ubisoft I work at 2k games I work at Twitch I work at Meta where I work on the Oculus you know the Oculus Quest on the Project Horizon there and at some point I guess I got bored what I did was I was always late on my gaming so like when the PS3 came out I was like cool cool, now it's time to buy some PS2 games.
2:18And when the PS4 came out, I guess I never bought it. And so the company just came from there because I play old games and why not? I must not be alone doing this. So yeah, that's me. Awesome. Cool. And my background is also Canadian. I was born in Montreal and moved to Toronto after I graduated from Queen's University. I had a computer engineering degree there. Although I studied the hardware side of things, like IC design. I never, and I vowed I would never work in software because I didn't like it at the time. My first job was in software and I've never not been in software since then. I couldn't do anything with hardware now if you asked me to.
3:00So I worked at some digital signage company called Omnivex for a while. And then my first gaming experience was at Webkinz. So that's pretty retro for most of us. I was there from 2006 to 2009. And I was very fortunate to join there just as it exploded onto the scene. I think I was the 23 ,000th virtual pet that was adopted. And when I left three years later, we were at 100 million. So it was massive growth. And I got to be a part of that. And I was director of QA there. From there, I went to another organization called Earth Rangers, which helped kids protect animals. So there was a lot of casual games there as well, too.
3:44So all told, I've helped produce over 100 casual games throughout my career. And I was introduced to Robin through a friend of mine, and we hit it off really well. And of course, I'm big into the old games, anything classic. We have similar passions, and we hit it off really well. And this is pretty much the dream job for me. And I've been here since I think it was the fifth or sixth higher and i'm coo here so i manage operations okay yeah awesome and so the company implicit conversions y 'all are emulating legacy games is that fair what kind of game systems do you emulate yeah so we mostly playstation so playstation one playstation two playstation portable although we have started looking at others platform like behind the scene we did ness so we have a micromage that we actually help port and publish and we had a networking support so That's been pretty interesting.
4:39I used GGPO, which is the rollback networking library that's mostly used in the street fighting games. And so this is an S game that was made by Independent Morphcat. And then we added PS4, PS5 support to it in networking there so you can play four players online. So we did that. And then now we're doing, from those PS1 games, I just mentioned, now we're exporting them to Xbox, to the Switch, and Steam, GOG, and I'm missing something here. PlayStation obviously. Yeah, PS4, PS5. Yeah, the big thing we get requests for our PlayStation games, especially PS1, that is by far the number one request that we get from our clients and they want to not switch.
5:20That is the big thing. So that's, we have our own proprietary software and we call it Syrup. So it's called the Syrup Emulation Engine. And that allows us to integrate different emulators as sort of modules or plugins. Our PS1 emulator is called Pancake, and our future PS2 emulator might be called Waffle. And PS3, which I think we may talk about a little bit in the future, might be called Benedict because it's the fanciest of the three. But we just keep adding these emulators to it. And Syrup, what it allows us to do is add a whole bunch of special features to the game. So for example, on a 2D like Micromages, which is a 2D platformer that scrolls upwards as you're playing, we can add widescreen support.
6:04so that you don't get the two black bars on both sides. And we can also add an interactive manual over way, which is really slick. We added a shader so that you can turn the pages and you still relive that experience of when you bought a NES game in 1990-whatever, and then you, I suppose it would be a Super NES game at that point, but you would read the instruction manual on the way home in the car ride. At least that's what I did. And so you're able to do that with our games now. And of course, like Robin said, we integrated modified ggpo so that we could have netplay support which had its own challenges so whatever the request is we're able to add that as a module into syrup and branch that we support genesis for example as well too we just haven't had requests for that at the moment so let's maybe dive into what it means to port one of these games over so you mentioned the word emulation so does Does that mean that you're essentially starting with an existing binary and then sort of running a simulated machine underneath it?
7:03Or like, what does the stack look like as you're bringing one of these games from PS1 to Switch, for example? Yeah, it's simulation. So we don't use the source code. So, for example, let's say we have the ISO file, the ROM file from one of the game. Right now we're doing something called Fear Effect 1. So that's, I think, it's two disk game or maybe four disk. I got it wrong. Anyway, so we have those files, obviously, as part of the package. package. And the stack looks like we have a common library, like all the low-level file handling and stuff like that, you know, Vitex and so on. We have Pancake, which is our PS1 emulator.
7:36You can see it a bit like any PS1 emulator that exists in open source, except this one is proprietary. And then we put this on top of Syrup, which is basically like a front-end based on RetroArch, Libretto. And so, in that case, that front-end is pointed to console because there's a lot of emulators. You might say like, why are you doing all this? Immunatories already exist. If I go and get up, I can find hundreds of them, right? That's true, but they're all on PC mostly, and people are not buying them. And the reason they're not buying them is because, well, we won't talk about it, but you know why.
8:08And then the issue is, okay, fine. Can I get a Switch, a legal emulator that runs on a Switch? Well, that doesn't really exist because you need an NDA with Nintendo to do that. You need an NDA with Microsoft to do Xbox and so on. And so we have, with my gaming experience, that I had at Ubisoft and so on, I learned a lot about console development. And then from the Immunition side, if we join those two together, now we get Immunition for console, basically. And I'm using my, I'm a bit less geeky now, but my business connection to try to convince developer or publisher to say, hey, you know, you got this game.
8:46Any game. I don't know, Silent Hill. We didn't do it, but let's say Silent Hill, I want Silent Hill on the original one and do it again on the Switch. Well, we can do it. People are really surprised. I don't think the publisher and developer fully understand sometimes that we can do port. We call it port because in the business dev, it's what it is. It's a port without the source code. And so I think that gave us a big advantage. Okay. So as someone who's not a game developer, and some of the folks out there will be very familiar with what goes into game emulation and some will not. What does that end up looking like?
9:17So you have this file. It's making a set of essentially system calls down into the game level. and you are providing an interface for those and mapping them in some way. But what does that stack inside of the emulator look like? We have HLE emulation. So basically, like, you know, the original game, let's go back to the PS1 game. PS1 game was compiled by, you know, a team 30 years ago and it was put on a disk. And that code that lived on the disk is, you know, has a bunch of game code, which is fine because we get permission to use this game code from the publisher. It also has NDA code, like the SDK code from the PS1 SDK.
9:52You might say, well, who cares? But we do care because that code technically, SDK is copyrighted by Sony Interactive or Sony Computer Entertainment back then. If you want to run this on PlayStation device, that's fine because I guess you're doing Sony to Sony. But if you're running this on a Switch, you're not supposed to be running SDK proprietary code, putting that on the Switch. You don't own this thing. You're not allowed to do this. So we have to remove that code. Okay, all right, let's remove the code. Let's say the code is, I don't know, it's code to save on a memory card. All right, so there's something like, function that they added, like, you know, we call memsave or whatever slot.
10:25And then it does stuff. Well, okay, you remove that code. Now you can't save anymore. Not really. So you need to hook at this point in the function, like it was calling this C function to save. All right. We replace that code. It's gone. We have a mapping, you know, the interpreter, when it gets there, it says, okay, you're calling function X. All right. Let's call our code now, the code in pancake. That's the PS1 code. Now we do our own stuff. Well, I'm running on the switch. All right. I'm going to put this on the buffer somewhere blah blah blah and then when the ps1 is done saving now i can use the switch sdk function to actually save on what the switch expected from xbox xbox so now you got this little layer of like you know the the save for xbox the save for this for the switch the save for for pc for example that's for saving there was something else i wanted to say about this but yeah talk about the interpreter so you might say well all right we got an interpret an emulator like you're just interpreting like the cpu instruction on the mips computer on ps1 that can be slow because you know you're always interpreting code every time if you have a tight loop that's just like you know waiting for v-sync for example well your emulator is just doing useless work like it's just like spinning around waiting for no reason so some external event that doesn't really exist so we use we do what we call aot we cannot jet another big thing from different...
11:42So in PC emulator, you can use just-in-time compilation. That's not allowed on console for security reasons. So, I mean, the kernel does it. Like, you know, if you use a web browser, for example, on PS5, I believe it's based on the WebKit. I believe it may have used JIT on the PS4. I think they may have removed on PS5 for security. That's why many of the security issues are web-based on console. But nevertheless, so we had to use AOT ahead-of-time compilation, which was the... You know, if you go back in time, I believe when Flash was removed, from iPhone, I guess 10 years ago, people still were making Flash games.
12:16And we're like, well, how do I target iPhone anymore? And Adobe provided some kind of compiler. Adobe, I might be wrong, Adobe Hair. And that used AOT, basically, would pre-compile your Flash byte code into like C code or C++ code. And then you would actually build this thing and then run it on the iPhone. Well, it's the same thing we're doing. We take the MIPS code from the PS1. We generate a bunch of C++ code from this. And then we run the compiler on that. Bang. And then that's it. Oh, that's interesting. Yeah. Yeah. So there's nothing new there. I mean, it has been done before, but we have to do it.
12:48And we have to do it efficiently because you can't just like, you know, do it. Yeah. And I can add to that. One of the number one questions we get is, well, how can it be difficult to run a PS1 game, which was a very weak machine compared to the PS5, which is Gargantuan? Well, you're still limited by the hardware restraints that existed by the PS1 to a certain point, right? So when you're running your emulator or pancake as a PS1, the game's expected delays in certain parts. So if you're reading from the CD-ROM, it expects that, okay, when I read from this sector, it's going to take X amount of milliseconds or whatnot.
13:27Well, that doesn't exist anymore. We're reading from disk, which is almost instantaneous relative to the CD-ROM. So we have to account for those timing issues. and timing issues is one of the big things that we have to deal with when it comes to PS1, PSP, and PS2. So that's one of the things we have to take into consideration as well too. And like Robin said, performance is arguably the number one issue we have to worry about, especially on lower end devices like the Switch. So ahead of time compilation, what we do when we first get a game is our QA team will play through it and we profile it.
14:02So using our tooling system, And we're able to see what all the hotspots are. So by running through, say, the first level, we're probably hitting all the major functions within the game. Almost all the major functions within the game. And the profile, we'll then generate files, store them in a library, and then those files will be called the next time you run the game. It's running that pre-compiled code as opposed to running it on the fly. So that non-performant part of the game now runs really well. So AOT solves a lot of problems when it comes to performance. Got it. So are you ending up, actually, just to make sure that I understand, and once again, new to the game emulation space personally, and trying to echo this for everyone else who doesn't have that background.
14:48So you're basically taking this binary, running it through a real-time emulator that is then capturing what's functionality, and then using that to generate code so that you can actually, rather than real-time emulate, you're going to compile a new binary that will run against whatever machine you're targeting? Yes. I mean, the AOT will only be generated once because it's the same C++ code with portable. You have to compile it on each target. So you have to compile that C. We create a DLL, actually, like a DLL. Well, yeah, dynamic library, the.so file, or whatever the format is on the target, but using Clang, for example.
15:24So, you know, it just works. Some of the issues we may encounter is like sometimes when you do AOT, you might end up like, you know, you're trying to find a function, like, you know, you're trying to find the beginning of the function in the end. It might be like a very long function. If you just have the C function here and there's no interrupt when you're running this, like, you know, whatever the system call was happening or like the real hardware was doing other stuff, like was interrupting you to service some IO stuff. We're not doing that. Like, you're just running the whole thing. So maybe we need to insert like, you know, some delay there or like, you know, like, oh, I bought something.
15:56Now you need to have the code to be reentrant, kind of. So I'll be honest, I didn't write, I'm managing a company now. So I have a background in software engineering. I'm a programmer, but all the details, I don't know that. Okay. Yeah. So let's talk a little bit about those timing issues then, right? So if I'm understanding, let me summarize back a little bit, right? There are, because this older hardware had these dependencies on things like reading from the CD-ROM, it would build in a whole bunch of techniques for managing the fact that this is going to take three seconds. This is going to take however long it's going to take.
16:31And if suddenly that delay goes away, things may not work at all, or they may be really choppy or just feel very awkward. Are those delays predictable by device, by function call? How much is this a, oh, we can map directly to, based on the code that we have, the binary, and running our test file, we know where the delays need to be versus this is an interactive, oh, this feels funny, I need to insert a delay here, iterative process. There's a bit of both. For example, we know from the CPU manual how many cycles a certain instruction is supposed to take. So you can simulate cycle count. All right, you did a load instruction load memory, all right, 12 cycles.
17:12you did a had one cycle that's approximate because you know the load memory you know what if it's in the cache what if it's not in the cache well we're not really simulating the real I don't know what it was 64 ways association cache on the on the PS1 like we could but at some point maybe it doesn't really matter so maybe everything is in the cache most games will tolerate that but some some might not like give you an example maybe there's legacy bugs like maybe the game would actually like you know ask to read from the disc and then immediately after check if the read is ready. That would fail, right?
17:45Because it would do, you know, please read. Is it ready? No. And then it would do some code. Now, if we do it better and we say, you know what? You want to read this 100 gigabytes on the disk? Yeah, you got it. Well, now the code will enter a path that you never did in the Biggest game. And now maybe dragons will appear. Maybe it will be fine, actually. So depending on how the game was coded, it might crash or not. So you probably should be better really behaving like the old hardware. But if you do that, now you got long loading screen, for example. So there are times where, let's say, you're in the loading screen, the screen is black, and you can, how about we just reduce the cycle count?
18:17How about we just pretend the CPU is not running at 33 megahertz, we're not running at 1 gigahertz? And let's see what happens. And sometimes it works. And so now when people are happy, they say, oh, the loading screen from 10 seconds, and now like half a second, that's awesome. But you're right. It's hard to know. Sometimes we have to patch it. I haven't found, maybe AI will have in the future, but I don't think we have found a good way to do it at scale. But what does happen over time is the success of an emulator is generally measured by how well the games run, but by the broadness of its compatibility.
18:51So as you play more games or you work on more games, you find more and more of these timing issues or other bugs. And then some of them will fix many other games that use a similar system or similar architecture. And so over time, the more games you produce, the more robust your emulator becomes. And so you broaden the compatibility. And so you're looking for 90 % plus compatibility so that you pop a game in your emulator and it just runs. That's the ultimate goal. And there's less work to do. But for PS2, for example, because it was significantly more powerful, there are performance issues. So there are per game fixes that we have to do on a pretty regular basis.
19:37with respect to performance. And sometimes with the GPU as well, too, there's graphical glitches that happen. Like Robin said, you'll change the timing of one thing and it'll mess up something else indirectly. Going back to timing, sometimes there are legacy bugs. They said there was a game on PS2 that would crash, I don't know, 1 % of the time when you were doing this level. Well, it's possible that because the timing of the simulator just would change it, that now this legacy bug happens 100 % of the time. And so now you actually, I guess you have to have choice. Either you figure out you fix the legacy bug itself.
20:08You're like, all right, that's code was actually wrong. Let me fix it in our Lua patch. We use Lua as a scripting language for patching. Or, well, you figure out whether the timing is of animation and change it. And now we're back to that 1 % occurrence. And you're like, all right, now we're back to legacy state. So, yeah. I want to dig into that patching in a minute. But first, so we've talked a lot about timing as one of the sort of challenges when you move from a legacy system to a new system. Are there other classes of problems that tend to show up when you're moving systems like that? I mean, there's from a less technical perspective, there's all the texture replacement we have to do sometimes.
20:48So if you're going from PlayStation to PlayStation, that's easy, right? You know, X, square, triangle, circle. If you're going for PlayStation to Switch, now you have to use A, B, X, Y, or Xbox where A, B is reversed and whatever. and now those textures they might be in the game they might be in movies we gotta replace them so how do you replace them? do you replace them on the disk itself like the ROM file? do you replace them at runtime? like you know when what about if the game is modifying those textures dynamically? like it's loading at x squared then doing I don't know replacing the pixel there or seeing some effect there there's all kind of challenge there yeah and especially with some of the older games too there are things that are not necessarily appropriate for today's climate in certain games, or the license has run out on certain them, especially like sports games.
21:36There might be an advertisement in a tennis game. There might be an advertisement for Adidas that needs to be patched out. And then, of course, the famous example is the Red Cross. Healing packs in the old days were almost always health packs where Red Crosses. Well, that's copyright of the Red Cross, the organization right now. So we can't use that anymore. So we have to patch that out with a different image every time that appears. So let's maybe talk about then what that patching looks like, both from an implementation standpoint, like, is that something that you do at the syrup SDK level? How does that work?
22:12And then also like under the hood, what is actually happening? You're starting from this legacy binary, like where does the patched code end up? Yeah. So most of the patch are, we have a Lua runtime. Lua is very easy if you have never use it. I suggest you do. I know let's go on a tangent here. Python is very popular. JavaScript is very popular. But Lua is very easy to compile and embed in any program. It's like, I think, 5C file. It compiles very easily. So that's why it's so popular with game development. If you play with one of the Sims from EA, it has a Lua engine there. Many other games have Lua.
22:48Anyway, going back, so we have Lua script file. Each game will have its own data file. and then there will be like a directory with a bunch of Lua patches and implementation there. We also do our trophies and achievement in Lua. So I think it's similar to patching where the logic in Lua will run and we'll say, well, you know, let's take a, I don't know what game, Micromage again. You want to know how many boxes you have destroyed in the game. Well, maybe there's a counter in the RAM that tells you how many box you have survived somewhere. Well, the Lua script will just have this address there and just read it.
23:20Like, all right, what's the value? If it's higher than 50, all right, then call this function in our SDK. Unlock this achievement. Dang, you're done. So those Lua files are actually the programmer writing them. Like, you know, there's just like, you know, like usual script file. And then they're being hooked. They're found. Think Lua is so easy to use. They're found dynamically. So at runtime, you know, we just look to the folders, find all the Lua file, load everything. And then there's some entry points to each of them. And then you just call the function there. That's for trophies. For patches, I think it's very similar.
23:51I think we just replace, like I said, being a bit out of my... As far as I know, we either prevent memory from being written or replace code totally. Again, going back to that function I was telling you about, if the game called this function, then instead run this code. And then in Lua, we say, well, this is the new code, blah, blah, blah. And so this is where we have fixed some incorrect... There's some pal game in TSC to pal game. So a PAL game was running at 50 frames per second, at 60. Well, there's no more TV running at 50 FPS now. The TV's gone at 60, 120, and so on. So what do you do when you convert from 50 to 60?
24:31Well, it depends on the game. Maybe the game was, and some games were incorrectly converted. Like they actually run slower on the 50. So can you make them run faster? Sometimes you can, sometimes you can. If the game is frame-based, then the whole game, I think you can just run it faster. If the game is time-based, then depending on how it was done, it really depends. Maybe the physics would break, things like that. I think one of the cool things to add just to the Lula side of things, especially when it comes to trophy implementation, is the reverse engineering aspect of it. So when you're playing the game, you're trying to find out, like Robin said, where in memory a particular value is being stored.
25:12And it's interesting how that's done. Do you remember back in the Flash days, is when I worked on Flash games, we used a tool called Cheat Engine. And Cheat Engine allowed you to basically find those values in memory and then change them. So if you wanted 1 ,000 gold coins, you could find that value. But the way you would find that value is you'd scan memory. You'd play the game and you'd see, okay, right now I have 52 ,300 points. So then you'd scan through memory for 52 ,300. And there'd be like 1 ,000 registries with that or addresses with that amount. And then you would modify your score a little bit.
25:46So now it's 60 ,000. And then you would scan again. And then you would whittle it down until you eventually get down to the exact memory address. And you know exactly where it's being stored then. And then from that, that's when you can use Lua to find out what the score is or the number of deaths or the number of hits or whatever that happens to be counted, if it's counted. Sometimes things aren't counted. And it's very difficult to track those things. Incidentally, that is the most common thing that we get asked is trophy. support. I mean, that is a number one request from a business development standpoint is everybody wants trophies and it's huge.
Read the full transcript
26:22Super popular. Yeah. Yeah, I just look at the Lua script and that's exactly it. We have a hook that will check for an address and then, you know, the CPU will say, oh, our temperature will be like, oh, do we need to, we haven't made a table at first, you know, so we know exactly when to call this. And then the Lua hook will just like, you know, read this memory, write this memory and then add some logic there. Like, oh, are you trying to, I don't know, is it the wrong font or something, some texture was wrong. Maybe can we do the optimization here? Like the game was doing a tight loop here. You mentioned the Vsync at the beginning, like some game would just like loop until Vsync like a million times.
26:58Well, we're just wasting our time here because we actually, we want to run faster or something like that. Just remove that loop. So if you call this, just pretend the condition is true, put back the memory there, return from Lua, and then the game continues and it flies. That's fascinating. Yeah. Okay. So So you talked a little bit about trophy support. And so this is one of the really interesting things here is you're not just emulating the old game as it was. You're now augmenting it based on requests from clients of different sorts. So can we talk a little bit about what the different types of augmentations you get asked for are or what Syrup supports?
27:34And are there any that implementation-wise are more than, here's the spot, insert the Lua code? I'm going to go, Bill, just for the high level. And I can go to technical detail after. Sure. Yeah. I mean, trophy support and achievements is the number one. Load time improvements are definitely another thing. Being able to speed up when the characters are talking and it's just going so slow across the screen and people just want to speed through it. Being able to skip through that, skip through dialogue, that's a pretty popular request. The widescreen has been particularly popular. I think the most complicated one, which Robin will need to talk about, is netplay and adding that.
28:17We implemented that for micromages. That was something that the original game did not support, and we supported it on PlayStation. That comes with its own can of worms. You know, with one player, the game's fine. Two players, it's not that bad. But then when you get to three and four players, which is what we support, well, it gets very complicated. You have to think about all the TRCs or technical requirement checklists that Sony will check for when they're doing their certification check before it can be published. What happens if player three disconnects their controller? What happens if someone joins mid-game?
28:51What happens if you have two players who are local and two players who are network from different countries? What happens in those cases? Are the PS IDs showing, the PlayStation IDs displayed? How do you handle that? Is it a lobby? Is it a matchmaking system? Like there's all kinds of different things. And the complexity grows very quickly. Even going from two to four players, it grows very, very quickly. And GGPO, you know, we can talk about that a little bit. But I will say, you know, from a non-technical standpoint, you know, GGPO is great for fighting games. That's basically what it was designed for.
29:29So that you have this rollback system and it's for tight performance for fighting games. where performance is extremely important. We went with GGPO and in hindsight, it came with its own challenges because we weren't using a fighting game. We're using a 2D scroller. So we were working on something that's not perfectly well suited for that particular genre of game. So that made it more challenging than it maybe needed to be. But yeah, I think I hand off to Robin here to talk about GGPO because he was involved in the last push to get it fixed. I guess one of the issues with GGPO is it synchronizes everything.
30:10Like, you know, a fighting game is easy in the sense that you have two-player fighting. If you replicate each people's input, you do predictions. So I don't know if your agents know about GGPO, but basically you try to predict. Like if you're pressing the right button on your D-pad on frame X, it's likely that you're still going to be pressing it on frame X plus one, right? And so using that assumption, You can, if you're a client, doesn't know yet if the other person has pressed the D-pad right, but you know he has pressed a frame ago, you can probably simulate that he has pressed it again, and you just go run the game with that.
30:45At some point, you receive the packet of the network that will tell you, hey, here's the D-pad state of that player. If it matches your prediction, all good. So you were able to save time and do it. If you got it wrong, then now the state of the game is wrong because actually you simulated that you were pressing right. Actually, the guy pressed left. what do you have to do well you can't it's a deterministic game now you got to go back in time to the previous frame re-simulate as if it was pressing left now and then figure out the new frame that you just did so depending on how laggy you are in ggpo you might see like like little glitches things going weird the fighting game is i guess it's okay because you know like you know punch like oh yep i guess something happens obviously if the lag is is low and the latency is very low it's happened less often but it will happen every time you press a button for example So like you're about to get the GCPO doesn't know about the game.
31:35Like it's not game aware. So if you're about to jump, every time you're about to jump, the prediction will be wrong by a frame or two. And so you will see yourself like a little bit like, you know, glitching on the jump, things like that. So, but it works at the end of this disability, the system is deterministic. It will always stabilize itself. Just to make it, you may get some like weird issues there. So just to make sure I understand GCPO, which we're talking about here is kind of a, it's a networking stack of some sort that allows you to kind of synchronize game state across distributed systems.
32:09And it is sort of a predictive one. So it's, it's saying like in a lot of cases we can sort of optimistically assume that these sort of continuous things and that that'll get us most of the way there. Yeah, correct. Let's just say, it's just say it doesn't, it's not game aware. It's not even like, you know, it's not a rendering engine. It doesn't have networking stack. I mean, it has a little bit of like UDP stuff, but I mean, it's on, it's just a, here's the state, here's the state I think you have, here's the state I think I have, here's the combined state, you got it right, you got it wrong, here's how you fix it, and so on.
32:38And then the game is responsible for rewinding the state and going back. This works well for the NES game, but it forces you to run multiple frames in a single frame. You say you got it wrong by five frames, let's say actually you simulated things for five frames and figure out, oh jeez, I was wrong five frames ago. Now I need to go back in time five frames, first I need to save that state. and then I need to reapply those five inputs there. So I need to run those five frames within one frame of the game. If that's running those five frames takes longer than the time you're allowed, you're going to start lagging behind forever and never catch up and things will get really bad.
33:13So performance becomes important. Like you'll be able to run the original game five times the speed of the... So what about sound and vibration? Like I just talked about the game state, like, you know, RAM and things. What about, you know, controller was shaking. Like, look, the enemy hit me. And because of that, we started vibrating the controller that you're holding. That's cool. Turns out I was wrong. The enemy did not hit me. It go back in time. It did not hit me. All right, cool. Now we're not vibrating anymore. But the game doesn't know about that. It's not going to send a stop vibration because it never sends a start vibration.
33:47Now we need to have custom code to stop that. So anything that's like programming a pure function, anything that's not pure, that's basically leaking out, will break. could be like vibration could be sound effects if they're not if they're done that way so a little thing like that i mean it's not too bad worst case it just vibrate a little bit and it stops you'll be like and maybe you thought you you got hit but you did not okay but you know it's a silly thing like that happens i mean i think this this adding multiplayer support to me is fascinating because you're adding it to a game that was not multiplayer aware so there's like whole classes of problems like you're highlighting of like rewind restart and synchronization that it just like has no concept of what is the span of that like that just that feels like a massive endeavor i mean going back to the fighting game i mean like the title screen you won't synchronize it like the game that like where do you do the matchmaking well how do you start the game with the two players so we have a safe state actually so we did we like you know we put the game like we ran the game with two player locally or four players and we say okay this is the beginning of the level now we made a safe state there like the memory snapshot of that put that in in the file somewhere now we do the matchmaking on playstation 4 or 5 find the players blah blah okay cool start the game everybody agree and now all the players will load the same safe state together at the same time and now we start the gpu over there and then everybody synchronize So there's a bit of, again, people don't know about this.
35:20It's just being told, like, by the way, you're now synchronized. But we need to know because the original game did not have matchmaking. The original game did not have, like, you know, find the game and find the players and know what kind of game you want. So now we toy around, like, how do we add, can we add easily networking to any games in the past that were, like, co-op games? I mean, it depends on what the game was doing. Yeah, okay. And where do you put that? Right. So it is still just, it is games that were multiplayer, but multiplayer locally. Correct. Okay. So that does narrow the scope a little bit, because I was imagining you're taking a single player game and adding a multiplayer mode, and I'm like, whoa, what is even that?
36:01That would be harder. No, you need to have support for multiple controller there. But then there's another set of challenges. What about games that were multiplayer, but that you want to add multiplayer? We haven't done those yet. Yeah, because they may have their own protocols. But we do rely on, you know, we have to use PlayStation's SDK and Xboxes and switches. And we call into that, like Robin said, we call into that, their matchmaking system. And they have their own PlayStation IDs. And you have to subscribe to get all that stuff so you can have online play. And then it's sent to GGPO. Got it.
36:35That's still super cool. Okay, Bill, you were going to mention some other domains. Requests, yes. Yes. Okay. So Robin mentioned save states and that's what reminded me. How could I forget? So one of the big features that our emulator has is rewind system. And this is pretty common in a lot of emulators as well too. So as we have all these save states, we're able to, the player or the user is able to use a rewind system and go back to a save state that they want to. So if they're trying to get through a boss fight and they can't do it and they don't want to, they keep dying, they can just rewind 20 seconds or whatever far back they want to go and replay that over and over again, which really helps with QA when we're doing our trophy testing.
37:15So when we do trophy testing, what we'll do is we'll get to a particular spot and then create a save state. And then we can reload that and start from that area. So you don't have to play through the entire game to unlock a trophy. It's like beat the final boss. Well, no, you just have to get the save state from that particular point. So rewind is popular. Up rendering is another thing that is requested to improve the graphical quality of the game. Sometimes post-processing effects. So let's say you want to add a CRT filter or an arcade filter to make the game look even more retro, you know, adding scan lines, we can do that.
37:49Custom audio visual, contextual button remapping. So if you want to be able to remap and actually controls is a pretty big issue that Robin could talk about more especially when it comes to psp because psp had a different controller than a playstation 5 controller which is very different from switch controller so there's that as well too and of course adding rumble like you know games didn't have rumble in the past and now they do so we were able to i want to add something about aspect ratio so we're doing one game it's a ps1 game so if you're just one game if you remember right there were four by three all right tv now is 6.6 in my night all right so you're going to get the letterbox but that game was also widescreen 4x3.
38:27So the game itself was rendering as if it was a widescreen game in a 4x3. So now if you convert that without thinking about it, you're going to get a black box all around. Like a stem. That looks terrible. Now we can actually zoom it. So we made some chance to zoom the game. Now we're back to 16x9. Except one problem. The game will display sometimes its HUD under that black bar at the bottom. So that would be out of the screen. Well, Lua comes to the rescue. We can use the Lua hook to just move that back up. And it seems to work. It's like, we haven't finished the game yet, but now we got a PS1 4.3 game running 69 as if it was 69 originally because they were learning 69 in the 4.3 converted back to 69.
39:10Anyway, it's per game stuff again. Yeah, that's wild. So on that kind of note, are there particular types of games that tend to be more challenging to emulator port? Yes. I mean, it really depends on... Some games are more performance-heavy. Like, we have one game we're working on, and we're able to do enough optimization. It runs at 60 FPS now. And we're like, all right. And it's more tolerant on the code. It's using the M-Deck. M-Deck is the media decoder of the PS1. And then the way it's using it, we're able to cheat. It's asking for, I don't know, a buffer. And we return it immediately. And the game's happy about that.
39:51And it's in the movie, and everything is fine. Some other game we're trying, we did that, and bang, the game doesn't like it at all. Like the game expect probably that timing delay I was mentioning again. So now we actually need to emulate the ring buffer of the M deck properly, in which we did not do it yet. And so we're like, ah, geez. But we probably have to do this anyway, because I expect more games to require this anyway. But we're just looking at the first game. So I think it's a bit like you do one thing, you know a little bit about it. You do of them, if you do three, pretty prime number.
40:19You do three, five, seven, you know, 11. At some point, you probably get a bigger coverage of everything that the game requires. that makes sense can you talk at all we've talked about a bunch of systems switched and things and you sort of alluded oh ps3 might be one of the upcoming opportunities can you talk a bit about that and your plans there good question ps3 is a big platform i mean the way i see it we got you know ps2 ps2 is running right now truly on ps5 and ps4 so maybe ps3 would be on PS6. So who knows? One of the big challenges I saw with PS3 is the memory. I mean, there's some advantage to this advantage.
40:59You know, going back, PS1 and PS2, they were not modern rendering pipeline. They were like, kind of like, you know, Lego blocks. Like, I don't know, PS2 has its CPU as a VU0 unit, VU1, and then there's also their like E, and all those things are, like, there's no like graphic pipeline on the PS2. So it feels weird. On PS3, you're starting to get close to an actual normal graphical pipeline. But you get now SPUs. There's like eight CPUs on that machine, and that doesn't really translate well to a modern hardware either. The other big challenge I see is I think it has 512 megabytes of RAM. And so if you're just like, you know, we're just going to save the memory of that every frame, we're going to be saving like a few gigabytes of every second, and that won't scale.
41:48The thing is that most games don't change all the memory. They just change a few bytes here and there. I mean, not a few bytes, but... So maybe we can use paging technique. And so like, you know, oh, those pages changes. Let's swap them to memory. Now you have almost like ADBCM compression between the frames. So in order to... Like a video decoder. In order to see frame X, you need to have the previous frame, and then you apply the delta on that. You can't do lossy compression like a video. If you do lossy compression on bits and bytes, you might get some weird effect. the game. I think this is a big challenge there.
42:22I think it's going to be easier on the system software. The game where I am saving here. I am asking for networking. I am changing the resolution. On the old game, it was like, there's no HDMI. It's like, oh yeah, I think this game is running in this resolution because it sends some few packets and register here and the documentation is not clear. I think the system calls actually make it easier. The separation between the OS and the user runtime makes it easier to like inject yourself like okay the game is saving here let me save on my xbox we didn't talk about this media size it's there's a lot of data we use google drive we use get up but you know the ps3 games we're talking about the ps2 game they were like you know a dvd size sometimes and they're multiple regions sometimes so by multiple regions i mean like there's a european version a japanese version an american version you need to support all those version if you want to run the french version of a game then the data for the french language was only available in that french iso file so now you got you know if it's a ps1 game for example 600 megabytes times three four five all right a few gigabytes it's a ps2 game now you get the same thing but at the four gigabyte level times something a ps3 games i don't know blu-ray i haven't checked maybe a few 20 gigabytes sometimes it looks easy but you know we're developers you You need a hard drive, SSD, and so on.
43:44Like, oh, let me test this game. All right, I need 20 gigabytes here, 20 gigabytes there. It adds up. And then you're testing with QA. Let's make package. All right, I'm going to make a package of this. And now it's 100 gigabyte. Put this on Google Drive. Somebody has to download it. You need to have that gigabyte per second connection. And we do have that. But it puts a strain on the overall, like now we're going on build system and Jenkins and GitHub. And they need to swallow this data. You can just say, oh, yeah, just modify the system and copy it every time. People like to do this in the cloud.
44:13Like, you know, use Docker and just spawn the OS, spawn this thing. Like, well, it's going to take a few, like, 20 minutes every time. And it's going to cost you a lot. So don't do that. And so we don't do that. We went almost anti-cloud. We have, like, custom physical build machine in the basement, in people's room. And then they're connected to GitHub. And then those machines, I mean, they cost a lot. And then you have to maintain them. But guess what? You can put whatever hard drive in one of those things. and there's no like Docker and it's actually pretty fast. Yeah, it is interesting, the sort of scope of data that you end up talking about here when you're having to send this whole image over and every time you want to test a change, you need to update things and all of that.
44:52Yeah, that's fascinating. And it would push you towards how do I shrink the distance between my data and my processing machine? The data, the distance between the data, because we were talking about physically, we need development kits. Like you need a switch development kit. You need Xbox development kits to work on this thing. You might say, well, cool, I'm going to put it in a data center somewhere and that works and then connect remotely to it. That works too. But what if the data is on your PC and you're constantly changing it? Like a few bytes on that. Remember that patching we're telling you about the ROM?
45:19Like we replaced it with that X texture and okay, cool. You do it in the 20 gigabyte file. Now that data center that you connected to needs to read that file or maybe it needs to. So hopefully it only reads a few bytes of it. But if your tool is dumb, it's probably trying to open the whole file and read the whole thing and it's pushing 20 gigabytes every time. Now you need to optimize this thing, but it's just things you don't think about because when you're working locally, data is just there. But it's actually a challenge. I think solving that challenge efficiently put us ahead. One thing we could talk about is the auto testing system, because that's something really cool that we have to when I was mentioning earlier about the compatibility and the broadness of compatibility.
46:00So how do we check if there's been a regression in the games that we've done? And so we have an auto testing system that checks hundreds of games every night. It runs and it checks all the different games that we've produced against all the different consoles that we support. And it can detect images. It can detect code changes if it'll boot. So that type of thing. So Rob, maybe you've worked on this a lot. Yeah, so it's basically based on GitHub actions. It could be based on anything, but it's based on a lovely YAML file. No opinion here. And then it runs on the... So we have like runners connected to GitHub.
46:35and then we have like I mentioned like hardware like you know Switch hardware Xbox hardware precision hardware and they would just run test scenarios basically most of the test scenarios are pretty simple like run this game take a screenshot at frame 20 or take a screenshot after five seconds now we have reference screenshot like I mentioned like the NES game on deterministic so we have all those reference image and we have the image we just took we compare them and if they're the same well cool thumbs up and Slack is happy and if they're not then we actually create an HTML report and it's on the gist file you can click on it you can see like the expected image the new image and the difference we just do a delta and then you can see like oh something messed up sometimes so it works and it doesn't work so it works because it allows us to have like good reliability like you know if you run 100 games because you don't want the engineers to test 100 games when they make a change right that's going to waste their time and so but sometimes there's false positives right they'll be like oh this game is just like i know the miniatur is a bit wrong there or maybe the dev kit is down.
47:33It's actually a physical machine, like I mentioned. By the way, the cloud is also made of physical machines. You don't see them, but somebody's taking care of them for you. But it's just a physical machine at the end of the day. Other networking is also something to manage. First, we need networking to be easy, so we use Tailscale, which is based on WireGuard. So that's cool, except we're not network experts, and we also need to be careful about it. This is exposed to the public internet, so we don't want people to just join in and start hacking our kits and code and stuff. But yeah, the auto test runs.
48:04It runs on every commit we do. We try to make them fast. Obviously, there's a constraint on like, you know, if you're going to run a switch test every commit and you only have like three kits on switch and there's more kits. Other tests we're looking at is not just screenshot tests, but just like, you know, scenario tests, you know, like test the rewind system, make a snapshot and reload it, confirm that it's the same value. How about the logs? You know, the game starts and we expect a certain like, you know, certain logs or certs will never be sent, well, check for that. And so we have lots of heuristics.
48:34I wouldn't say people like to write pure code. I believe more than heuristics. So if you do enough heuristics, because at the end of the day, humans will be interpreting those results. I mean, and then reading them. Oh, it fails because, okay, that's why. So it's good to have it 100%, but I don't think it's ever achievable. So I'm more the case that heuristics are better. When you are writing these tests, are you able to essentially record play sequences as well, where it's like, oh, the controller is behaving in this way, run it through these different pieces, and then see what happens? I believe we have done that for a few there, yeah.
49:09So, for example, like going in that menu, going to make a snapshot, saving it, and reloading it. Those were recorded. We're trying to get QA to do a bit more of those recordings, either in Lua. Do we record high-level, or do we record input replication? Almost like GTPO, but a file. We even did some OCR thing. It might sound funny, but on the PlayStation DevKit reboot of PlayStation 5 you have, there's a screen that shows you that tells you like, hey, you shouldn't have turned up the power. Like if you had the hard power reset, it tells you like, this is what's wrong. Press X. There's a way to bypass the screen.
49:39But before we knew about it, we use AWS OCR recognition. Just recognize the screen there. Like, oh, it tells you to press X. And then we just send input to press X. We also had to, I just mentioned power cycle. So we have like, you know, outlets, a smart outlet. you know like the console try to reboot it try to connect to it if nothing works what about well turn off the power and turn on the power can you so now we do that remotely as well i'm gonna get scary that to know that github action is like playing with electricity but it works and going back to the ws when you go on on amazon and you reboot your instance or the instance goes into some kind of weird state it's probably doing that too it might be sending power and just like oh this machine is just dead you started you just don't see it but it's doing that so one last topic we haven't talked about that is kind of more on the business side of this which is like who pays for this type of emulation work who are you selling to is this end user sales versus you're pitching publishers like what does that business model look like for game emulation so it's mainly business to business but there's two ways we're looking at it right now so we have sort of the work for hire branch of the company.
50:51And so we work with a number of publishers. For example, we're working with XSEED Marvelous on a game that's going to be announced soon. We're working with limited run games on Pure Effect and a few others that we can talk about. So we're doing their PS1 ports for them. So they're paying us to do the emulation work and the trophy design work and trophy implementation and all the TRC checks or compliance testing that's required. But what we also found is that we would get requests from smaller studios, really small studios. They've sold 300 copies of their game, a NES game, for example. But they would love to have it on Switch.
51:30They only have it on PC right now on, say, itch.io. Well, it's not really cost-effective for us to be able to port that game for them. And we get a lot of these requests, but it's not economically viable, as they say. So what we've decided is to go the SDK route. So the Syrup SDK is something that we're working on right now. It's in the alpha stage. And we're going to give that power to the developers and to the smaller studios so that they can put their games through our SDK and then launch, do the port themselves using our tech. And so that's in Alpha. And we have a company working with us right now.
52:11And he's going to be launching nine games on the Switch really soon. They're all nice games. So within three months, we'll have our first games published through the SDK. But typically, we are working with publishers or studios to get the games done for them. Sometimes we will pitch the games ourselves. So if we think that a game has the potential to do really well, we'll pitch the publisher and say, look, we think this game is awesome. It did really well in the past. It was, for example, only released in Japan, and we think it should be released to a North American audience. It has a current demand from the community.
52:49It's not in licensing hell, because that is really the number one blocker for all these games, is licensing. Who owns the IP? And who owns all the licensing within the tech? So within the game itself. So who did the VO? Who did the music tracks? Who did all the different things? The artwork. work. Everybody owns little bits and pieces. And sometimes even the studios don't know if they own the IP or not. So we'll pitch it to them like, yeah, that's a great game to work on. Let's just verify the IP that we actually own it. And then it come back a few weeks later and it's like, we actually don't own that.
53:205 % of it is owned by the estate of a long lost person in Japan. And we're never going to get that permission. So we look at a number of factors. We obviously look at the financial opportunity. We want to make sure that the game stands the test of time, and that still works really well in today's market. So like pixelated, pixel art is obviously really popular right now and has been for a number of years. So that works really well from a lot of NES games and SNES games and any of the 16-bit era games that work really well. So those are some of the factors that we look into when we're working on things.
53:55And in that case, if we're pitching a game, usually it's going to be a revenue share agreement. So we're going to take a cut of the sales, the publisher is going to be taking the cut, and we're taking on the risk of the development of the game because we believe so firmly in it. But the vast majority are work for hire. So we're doing work. We reach out to a publisher, sometimes cold, and say, hey, we're good at this. Do you need it? And then they'll be happy to work with us. Other times, they'll come to us and say, hey, I heard you guys really know PS1 games or NES games. Can you help us with these ones and then we work out an agreement and deliver them yeah our goal is really to push all those games that are like you know people think call of duty okay we can't do call of duty but plus someone is doing that and there's all the there's a lot of low-hanging fruits game like they didn't sell i mean copies but they didn't sell 100 copies either they sold maybe 10 000 copies or 50 000 copies and nobody's doing those games and those games are just lost right now.
54:55The only way to play those games is through piracy. Or, you know, and then we're like, what if we could scale this to make it? So what Bill was mentioning, like, we can talk with the publisher. They would be like, cool, guys, we actually found, you know, the owner, we can do it, but only 50 ,000 copies? It's going to cost us more than, like, legal agreement and stuff, marketing. We're not doing it. What if there was a way, like, you know, YouTube, Spotify, Airbnb, SDK way to scale this in such a way that, you know, people, either the IP owner or developer, could, use this technology and then self-port the games and then everybody gets a cut you know people makes money out of it because people enjoy it i guess netflix may be the example so i'm not saying we're going publisher route and going there but it's just like the division is there where i believe there's you know there's a big loss of retro games and there's two markets for those games there's the market of people like bill and i we would play those games in in the past and want to play them again because nostalgia but there's also the new market there's newer kids that they're now 20 years old, 30 years old, they never play those games, actually.
55:58And some of those games are actually good. They're still good. Some are crap, by the way. But some are good. And they would pay for it if they were given the chance, like on the Switch, like, oh,$5.99, I'm going to pay this. But they can't right now. The only way they can play those games is find them randomly on the internet and download them. And nobody's making a buck out of this. And I think there's thousands of those games. Yeah, especially when you look into other regions. You know, we're working on a game that was released only in Japan. You asked about features. Localization, of course, is a feature that we provide as well, too.
56:31Both the audio and visual side of things. That's a very popular request as well, too. But anyways, we're working on a Japanese game that did really well in Japan, but was never released in Europe or North America. And so we want to bring that. And there are tons of those games that were local to the Asian market and never came across to our markets. And so there's a real opportunity there because there's gems. There's hidden gems out there, and we want to make them available to as many people as possible. Awesome. So we're right about at the end of our time. Is there anything that we haven't talked about that you think would be important to leave folks with?
57:11Well, I have one thing. I think one of our things we're really proud of is our community. Our community works. They're incredible what they do. Our head of community does an outstanding job managing that. So you can find us at implicitconversions.com and we're on all the social medias. But really on Discord, we have a really active and engaged community who really are passionate about retro games. And we get a lot of ideas from them. They submit bug reports for us. They ask for features. They rank games that they want, that they're interested in. And like Legend of Lugia, for example, is a game that has come up numerous times.
57:51And Simpsons Hit and Run, that keeps coming up. You know, they want us to do these games. So that gives us some valuable information that we can then use to pitch games. Or, you know, if we're in discussions with some of those third-party publishers, you know, we can share some of that information. But it's an outstanding community. So if people want to join that, please do. didn't we mention about other up rendering would work like so for example like ps1 game ability were 320 by 240 so if you just take this frame buffer and put in the gtv well cool you got hd graphics but it's still hd graphics of like you know the old game there you could if you remap like the render call like no draw this triangle draw this mesh to actually like a ps4 or a switch open gl so a switch with the open gl call then you can use a different frame buffer size different target and then render the thing higher resolution.
58:42Now you get those little hedges that would seem like big pixels. They're going to look very tiny, like thin, except the texture would be wrong. The texture that was used, it would still be the lower resolution texture. So now you get nice mesh with lower resolution texture, but it's a bit better there. You may also get some scenes issue. The game was rendering the floor and maybe the wall there, and then now it's high resolution. And maybe there was like, again, legacy bugs there. Now the legacy bug, it's a floating point error. And now you see through it. So, so these are the, some of the features, uh, up-and-and-and-and-features that, that we want to do more.
59:17You know, sometimes we have to remove stuff. Games were using blur back in the nineties, 2000, a lot of games used blur. Like, you know, it was cool. Like, you know, you're going fast in the car, use blur, blur, blur, blur everywhere. That looks kind of bad on modern hardware. Like you actually want to reduce the blur because it's actually just remove the resolution or just remove it altogether so going back to new apaches so so i think there's a lot of work a lot of interesting work actually so people interested in like you know gaming and solving problems and and we always like you know something else to add i'm always reading people sending us email or cv or resume the target audience like some people ask us like how do i get a job here well yeah video game experience console programming but a lot of passion a lot of like I work on the simulator.
1:00:03I like to toy around with the NS. I do hardware. I do FPGA. And I've been like, you know, I do like conversion of NTSC to whatever you do. If you're passionate about it, I feel like it's sort of like the skill set that actually works really well at this company. Awesome.
1:00:32Peace out.
From the publisher
Emulating retro games on modern consoles is a growing trend, and allows players to experience classic titles with improved performance, enhanced resolution, and added features like save states and rewinding. However, this process raises many challenging technical questions related to hardware compatibility, performance optimization, rendering, and state management. Implicit Conversions is a company focused on
The post Emulating Retro Games on Modern Consoles with Robin Lavallée and Bill Litshauer appeared first on Software Engineering Daily.
