Rogue emulation programmer & demon hunter. Formerly of #Microsoft, #MAME, #Connectix, and #LucasArts. Still active in the Seattle choral scene #SeattleSings via Summer Fling Singers, Harmonia, and Sine Nomine. Author of #DREAMM emulator and the #ymfm audio library. AI sucks.
Public Key
npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Profile Code
nprofile1qqstymwn7479dttvlklxlxl8v6elvfkkdmjjk7azzkcuszlktqws5vcpz3mhxue69uhhyetvv9ujuerpd46hxtnfduqs6amnwvaz7tmwdaejumr0dse6anxl
Show more details
Published at
2026-09-27T07:46:55Z Event JSON
{
"id": "12956b9334ee0ffd6c1087b68ef230002253a6f032bec4a1e07b0d458706efbc" ,
"pubkey": "b26dd3f57c56ad6cfdbe6f9be766b3f626d66ee52b7ba215b1c80bf6581d0a33" ,
"created_at": 1790495215 ,
"kind": 0 ,
"tags": [
[
"proxy",
"https://corteximplant.com/users/aaronsgiles",
"activitypub"
],
[
"client",
"Mostr",
"31990:6be38f8c63df7dbf84db7ec4a6e6fbbd8d19dca3b980efad18585c46f04b26f9:mostr",
"wss://relay.ditto.pub"
]
],
"content": "{\"name\":\"Aaron Giles\",\"about\":\"Rogue emulation programmer \u0026 demon hunter. Formerly of #Microsoft, #MAME, #Connectix, and #LucasArts. Still active in the Seattle choral scene #SeattleSings via Summer Fling Singers, Harmonia, and Sine Nomine.\\n\\nAuthor of #DREAMM emulator and the #ymfm audio library.\\n\\nAI sucks.\",\"picture\":\"https://corteximplant.com/system/accounts/avatars/109/329/972/599/632/086/original/e2786691f23089d8.jpg\",\"banner\":\"https://corteximplant.com/system/accounts/headers/109/329/972/599/632/086/original/9d65cb885299fa7c.jpg\",\"nip05\":\"[email protected] \",\"fields\":[[\"Homepage\",\"https://aarongiles.com\"],[\"GitHub\",\"https://github.com/aaronsgiles\"],[\"BlueSky\",\"https://bsky.app/profile/aarongiles.com\"],[\"Ko-fi\",\"https://ko-fi.com/aaronsgiles\"],[\"Location\",\"Issaquah, WA\"]]}" ,
"sig": "3537ccada9b2dc20da16f14ca1e19d32e48765cc7498921a5b6cedce2f88d67cb56b9c82c988d8da077fc09156998afbb8d639c9cbe27abf1dfd4175d65ff0b9"
}
Last Notes npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles TIL that NE (Win16) executables apparently had a little-used feature called "iterated" segments. Just found an installer whose data segment is set up this way. It's basically pseudo-RLE encoded, with a series of (repeat-count, data-size, data) records that get expanded into the final form. I only discovered it because shortly after init this installer was doing a far call through a function pointer in its data segment that was junk. Further, there were no relocation records that mapped to that address, which is unpossible, since the program would have no idea which selector had been assigned to the target segment until launch. I initially thought maybe me relocation table parsing was wrong, but I couldn't find anything there. Then I noticed that bit 3 of the segment flags was set, but none of the NE references I found had any info on that bit. It seems to be relatively unused in Windows programs. However, the NE format was also shared with OS/2, and in the pre-release "Microsoft Operating System/2 Programmer’s Guide" linked to from here (https://www.os2museum.com/wp/microsoft-os-2-programmers-guide/) it does describe bit 3 as "iterated" and later has a very succinct but useful description of the data format. (It's also pretty obvious once you see it.) Honestly surprised I haven't seen it before, though maybe I have and I just don't know it since I have a long list of random 16-bit programs that crash. 😜 npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles One of my goals with DREAMM is to run programs without requiring anything from Microsoft Windows itself. Basically, I've written a mini WINE. For things like kernel32, user32, gdi32, etc., this makes sense. The games think they're talking to Windows, but really they're talking to my stub DLLs which thunk into the emulator to simulate all the standard behaviors. And for games that ship with their own DLLs, I just load and emulate them along with the original game. The fuzzy areas are the Microsoft Visual Studio runtimes: msvcrt*.dll. These DLLs basically provide an interface between the standard C/C++ library and the system DLLs. Several of these DLLs were included with the OS in Windows 95/98/Me/2000, so they can kind of be considered system DLLs. But at the same time, they are redistributables that the games could ship/install themselves. Until recently, I've been emulating these like the real system DLLs by providing stubs that thunked into my emulator. But as I've encountered games that reference C++ interfaces, it's become clear to me that this was a huge mountain to figure out. If I emulate all of the exported APIs, I will have to precisely replicate all the internal data structures so that any inlined functions that poke the data will find what they're looking for. I've thought about maybe just including the Microsoft DLLs. After all, they are redistributable. But the licensing terms have a few bits that are questionable for emulators, so that's probably not going to fly. Another alternative I'm currently exploring is including the WINE versions of these DLLs. I even found this nifty github while builds them as standalones: https://github.com/encounter/winedll. These seem to be built for Vista-era Windows, while I'm only emulating Win2k-era, but fortunately the number of post-Win2k APIs is relatively small, so it looks like it might be a viable approach for solving these pseudo-system DLLs. If I can get these to work reliably, it would solve the C++ issue and also maybe allow for RTTI and exception handling to work. 🤞 npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles TIL that on VGA you can set the VBLANK to start before the end of the visible area, effectively blanking out the lower part of the screen. Found a game that was doing that so they could have 2 pages in 640x480x4-bit mode. There's not enough VRAM in 256k to hold two full pages, so they reduce the visible area down enough that the start of the second page overlaps the end of the first page, which is hidden by the VBLANK trick. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Was looking at the digital audio in Another World (aka Out of This World) and found it pretty fascinating. The game has an all-digital soundtrack and supports digital playback on SoundBlaster, AdLib(!), and PC Speaker(!) I was curious to see how it manages to do digital sound across all these devices and came away pretty impressed. For SoundBlaster it's straightforward, since the SB supports digital audio directly. However, the way the game runs the audio is unusual: it configures the PIT to generate 10,000 interrupts/second, and manually feeds a single 8-bit sample to the SB on each interrupt, rather than using PC's DMA controller to send data like almost every other game. For PC Speaker, it uses a similar technique. But since the PC speaker is essentially a 1-bit DAC, it can't just feed an 8-bit sample to it. Instead, it changes the timer connected to the speaker, which is normally in "square wave" mode, to run instead in "one shot" mode. This means whenever a new timer count is written, the timer drives the speaker low until the count is expired, then the timer goes high again and remains there. By programming different values, the game essentially does pulse-width modulation at 10kHz to produce surprisingly reasonable digital sound. For the AdLib, which is an FM-only chip, it uses a clever hack. It programs one channel for playback with instant attack and forever sustain, and starts a note playing. Then, almost immediately afterwards, it changes the note's frequency to 0, which causes the phase counter to stop counting and essentially locks the channel's output to whatever position within the sine wave it was when the frequency was nullified. With proper timing, it will be near its peak. At this point, the game can alter the channel's "total level" (aka volume) and change the magnitude of the locked output, basically making it into a DAC. The total level is only 6 bits, so it's lower fidelity than the SoundBlaster, but still sounds pretty decent. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Heh, so yeah it's finally been officially revealed that the Mac port of Day of the Tentacle I did also contained a stealth Mac port of the original Maniac Mansion to the Mac. In the PC version of DoTT you can just use Weird Ed's computer and it dumps you into Maniac, and I had thought (after all these years) I made it work the same way on the Mac. But it turns out my memory had some faulty bits and, while it did work, it only works after you try it five times. This was a concession to our Mac QA department, which was small, and a bit overwhelmed with the unanticipated ports of DoTT and Sam & Max. They didn't really have the bandwidth to stress test the Maniac Mansion port, so I made it a bit more of an Easter egg than it was on the PC. https://www.youtube.com/watch?v=N5AZY3tNFW4&t=1s npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Meh, car's check engine light came on, dealer says it needs a full engine replacement. Been thinking of a used EV for a while, now seems like it might be the moment. It's a 2nd car mostly used for commuting around the area, low mileage stuff. My 6'2" son needs to fit as a passenger. Hit me with recommendations! npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Happy to announce that DREAMM 4.0 is now available for Windows, macOS, and Linux! https://dreamm.aarongiles.com/ Now with support for all Lucas-family games released prior to 2000 on DOS, Windows, and FM-Towns, including all 8 Lucas Learning games. Network play is also now supported (experimentally). npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Dammit VSCode, this is ARM assembly not that weak-ass HTML shit. (Referring to the color blob it helpfully inserted next to the #139 if you're not familiar with VSCode's shenanigans.) https://corteximplant.com/system/media_attachments/files/115/617/964/132/868/577/original/110e4a9aa2fd97d2.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles It's been a while since I've widely advertised it, but DREAMM 4.0 is (finally) nearing the end of its beta cycle. If you're a LucasArts/Lucasfilm Games/Lucas Learning fan and want to see how easy it can be to run your old games on a modern PC/Mac, check it out: https://dreamm.aarongiles.com/beta npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles This was a great video about the history of the behind the scenes videos shot for the Lord of the Rings trilogy. I've had the Blu-Ray set for years and didn't realize I was overlooking a whole set of additional documentaries! https://www.youtube.com/watch?v=k68X9r14XAw npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Tank Girl was another solid soundtrack featuring a fascinating cross-section of mid-90s alternative bands. (Though I honestly can't stand the "Girl U Want" version on here because it's excruciatingly slow.) https://corteximplant.com/system/media_attachments/files/115/164/757/074/577/875/original/23fa941cf13654dd.gif npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles This was really well-done. https://www.youtube.com/watch?v=p8mxhfsVuIo The wife and I have both tried getting through The Silmarillion in the past, but failed. After video I said, huh, maybe now I'm inspired to give it another try. She had the exact opposite reaction: now I never have to try reading it again, LOL. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles I have a ton of postcards from Japan. As part of my postcard cataloging I've been OCRing the text on the back of the cards (which my postcardbot uses for alt text), but the Japanese cards pose special problems, not the least of which is my unfamiliarity with the language or symbols. Also sometimes the text is vertical and my OCR doesn't deal well with that (I'm using a Javascript version of Tesseract, which I've customized for my particular cataloging process). So I'm wondering if I can crowdsource validation of the OCRed text on some of these. Consider this an experiment. This is item 5714. Luckily it's blank, so I can post it without redaction. I've pasted the OCR result below. If you know Japanese and can clean it up, reply with the cleaned up result and I'll use that instead. Note that the first line is from the center. Also my OCR seems to collapse all space, and inserts a space between each character (should those be removed?) And finally, when I clean up OCRed text in Roman languages I typically delete any line breaks, but since I can't read the language, I don't know if the line breaks here should be removed or not. 早 稲 田 大 学 図 書 饂 国 宝 玉 篇 巻 九 残 巻 一 巻 ( 唐 時 代 ) 中 国 , 梁 , 顧 野 王 編 の 漢 字 字 書 , 玉 篇 残 巻 の 現 存 中 , 所 収 字 数 が 最 も 多 く , 筆 写 の 時 代 も 初 唐 と 認 め ら ち れ る も の 。 紙 背 に 治 安 元 年 (1021) 入 月 書 写 の 金 剛 界 私 記 一 巻 が あ る 。 縦 27.1 × 全長1306cm https://corteximplant.com/system/media_attachments/files/114/729/129/862/528/599/original/212c05d883e98c24.jpg npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles I have to say that the ECMA documentation for ISO9660 and UDF are some of the worst-written specs I've ever seen. There is literally no overview describing the data structures, so to understand how things are laid out you have to read the whole thing in detail, and even then it's far from clear. And that's not even considering the fact that all their data structures are described with 1-based offsets. Like, who does that??? https://corteximplant.com/system/media_attachments/files/114/405/403/288/714/439/original/b8df9c4af29bd723.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles A surprising amount of work I end up doing with DREAMM is sorting out and identifying all the official releases of the various games. Currently The Secret of Monkey Island wins with the most known variants (just under 50). https://corteximplant.com/system/media_attachments/files/114/367/031/322/868/621/original/156e802699bbbe02.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Was recently reminded of my first "feature" in BYTE magazine, from November 1992. Weird to remember back in the day that JPEG decoding/viewing was a novelty. The OG browser NCSA Mosaic didn't show JPEGs inline; rather, it relied on external programs to display them. This became my early claim to fame, since I offered a simple JPEG viewing program that was free. The other novelty of the time was that by default JPEGView scaled images to fit your screen, rather than displaying large images at 1:1 and requiring you to scroll around. It seems kind of silly now, but at the time, it was unheard of to do this. As a result, I put a lot of effort into high quality optimized scaling algorithms, written as 68020 assembly QuickDraw hooks. At the time, 8-bit color was also the most common configuration, so I also spent lots of time tweaking the algorithms to pick the best 256 colors for each image. I created a variant of Floyd-Steinberg dithering that limited the error factor to help eliminate weird green pixels in, erm, "flesh toned" images, heh. It was actually picked up by a few other image processing programs of the era. Let's just say I got a lot of errors reports for images that didn't display well. When I asked the users to send me said images, I would often be ghosted. Wonder why. 🤔😜 https://corteximplant.com/system/media_attachments/files/114/323/864/253/263/256/original/404cdc30fa629037.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Happy to announce that DREAMM 4.0b1 is now available for download: https://dreamm.aarongiles.com/beta/ If you do actually test out network play, let me know good/bad how it goes. I have only tested it locally, so I'm kind of nervous to see real-world results! https://corteximplant.com/system/media_attachments/files/114/282/762/003/573/646/original/f3e0642e0b62497a.jpg https://corteximplant.com/system/media_attachments/files/114/282/762/483/677/237/original/a0465b960eb17b26.jpg npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles DREAMM 4.0 will be heading to beta pretty soon, which means I've finalized the list of supported games. 15 new titles this time around, including all the Lucas Learning titles and the glut of Star Wars titles released around the launch of the prequels. https://corteximplant.com/system/media_attachments/files/114/258/280/644/207/396/original/95086909b826bfa8.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Super impressive port of Ultima III to the VIC-20. I cut my teeth on Ultima III for the PC back in the day. One of the few games I have ever really spent tons of time on. https://www.youtube.com/watch?v=3OMIqj-NEFc npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Ok, got alpha blending and coloring sorted in the UI, now on to the game screen rendering. Started off just drawing using the default pixel shader, which looks terrible because it's a straight bilinear filter. But at least that primed the pipeline for the game screen. Once that was working, it was time to start porting my shaders from GLSL to HLSL. Fortunately, the first one wasn't too bad. The trickiest bit was figuring out how to pass constants to the shader, but at this point I have the simplest one ported and it seems to work. This one just treats each pixel as a rectangle and only applies bilinear filtering on the edge pixels, thus giving a "sharp" look but without the obvious unevenness you'd get with straight point sampling. Next up will be the epx shader, and then the CRT shader. epx is complicated but not as math-y as the CRT shader, so that goes first. Also there's a lot of internal logic for the CRT shader to choose the scanline density and monitor mask pattern based on the ratio of output to input resolution and which video card we're emulating. Right now that logic is cooked into the OpenGL code but needs to be pulled out so it can be shared between OGL and D3D. I also need to add an option to force OpenGL so I can more easily do A/B comparisons to verify the shaders are producing equivalent results. https://corteximplant.com/system/media_attachments/files/114/141/141/432/061/486/original/aaa9c669367cd4d6.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles TIL of Uniloc, which was apparently a notorious patent troll, but who also created a "try before you buy" mechanism for distributing software back in the early 90s. One of the games they did this to was Star Wars: Rogue Squadron 3D. Tried running it under DREAMM and it just immediately exits. Comparing the EXE against the official release, there are only two diffs. The first diff appears to be patching out a check in the game, but the second is far more interesting... The code below has been blasted over top of the program's entry point. Assuming the IN instruction doesn't fault, it would just cause the program to immediately exit. So that IN is the key. It must be trapped by a driver. Not sure the significance of the value in EAX, but it's clear that it's some kind of key that the driver uses to determine what to do. It must also have the real first 13 bytes of the program stored somewhere so it can replace it and run the proper initialization code. Anyone ever heard of Uniloc or know of reverse engineering efforts? Mostly just curious. https://en.wikipedia.org/wiki/Uniloc https://corteximplant.com/system/media_attachments/files/113/997/813/717/846/739/original/260e1fb1a5198858.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Ha, might finally buy another Ministry album (gave up after Psalm 69). Was hoping he was going to do this after some recent interviews. Those early albums are actually some of my faves, so it will be amusing to see how much he reworks them. https://metalinjection.net/news/ministry-announces-new-album-reworking-their-super-early-long-hated-material-north-american-tour npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Ok, I'm absolutely loving experiencing Electric Callboy for the first time, especially their amazing videos. But TBH this one had me in stitches from the turn at ~1:10 until the end, I couldn't stop laughing. And that ending is just chef's kiss. https://www.youtube.com/watch?v=Vf3LqQluWag npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles AI and crypto just make me so embarrassed for tech anymore. And it's not that the fundamental technologies are problematic, but rather the craven abuse of trust and incessant grift of the companies/people pushing them. Not sure I could stomach working for any of the big tech companies at this point. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Bought a new hoodie the other day, only to notice upon first wear that it lacked the traditional draw strings. Which is good because I have a problem of unconsciously nibbling on them while I'm concentrating. 😁 Then it occurred to me: I could just remove them from my other hoodies as well, duh. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Ha, this is awesome! Doom in an art gallery. Play it in your browser. Careful not to spill your wine! https://bobatealee.itch.io/doom-the-gallery-experience npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Come on, Microsoft. This setting is awesome. It's the way things should be in this day and age. It works quite well! And it's been in beta for YEARS. It's still buried in the old region control panel you're trying so hard to deprecate. Be brave, make it happen! https://corteximplant.com/system/media_attachments/files/113/790/521/878/633/831/original/8ea90fa13b049fbf.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles After a bit of chatter on the Discord, I've decided that the next DREAMM version will be 4.0. This was based on the fact that since 3.0 came out I've added support for: networking (both winsock and DirectPlay) movie playback (both QuickTime and AVI) Direct3D Retained Mode far more complete scripting nearly a dozen new games (covering the full LEC catalog up to 2000, including Lucas Learning) Which seems like enough to warrant a full version bump. Hoping to get some early alpha testing in January, with betas in February-March depending on how things go. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles @nprofile…zsaa The obvious answer is that there was no intern, just some terrible AI. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Today I started fleshing out the variants of Star Wars: Rebellion. This meant figuring out what versions/languages were released. Turns out LEC did full translations for German, Italian, French, and Spanish. That was a lot of work for a game with tons of text (I mean it has a mini encyclopedia of all the star systems, ships, major players, etc) I have managed to source CD images of all but the Spanish version, so if you have access to a CD (or image) of Spanish Rebellion, definitely let me know. On GOG/Steam, they only offer English, German, and Spanish for some reason. That's how I know the Spanish version exists somewhere. To get the GOG/Steam versions to run without the CD they byte patched the EXE so that when it asks for the "drive type" of the disk containing the files, it wants "hard disk" (3) as a return value instead of "CD-ROM" (5) in the original. This is the only modification to the code. This turned out to be annoying because it means those files are NOT ALLOWED to exist on a CD with the GOG EXEs. So I have to reorganize the locations of the files so they are on the hard disk, rather than sharing a common configuration between the original CD releases and the GOG/Steam versions. 🙄🙄 npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Merry Christmas eve! https://corteximplant.com/system/media_attachments/files/113/712/184/142/592/432/original/6c092223d4d2b5ce.jpg npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Aww, it was going so well until I got to this point. (This is a report by the emulated game.) Now I get to figure out how my API responses led it to screw up an object's vtable. Fun.... https://corteximplant.com/system/media_attachments/files/113/603/309/137/926/055/original/bfd0951625ba2c5a.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Yeah, GOG creating this "preservation program" and then including games which are no longer actually being preserved in their original form (including these two and The Secret of Monkey Island) is not really a good look. https://arstechnica.com/gaming/2024/12/blizzards-pulling-of-warcraft-i-ii-tests-gogs-new-preservation-program/ npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles One of the few songs in my vast collection that immediately makes me hit "skip" is the awful Mick Jagger/David Bowie cover of "Dancing in the Streets". Apart from my general dislike of MJ, the song itself is just the absolute laziest tripe songwriting, and makes the collaboration itself feel like the most cynical cash grab. (It's in my collection due to being on Bowie's best of album, though it belongs there just as much as "Batdance" belongs on Prince's best of, which is to say, not in the slightest.) npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Been struggling to get FreeType in DREAMM to produce the same font metrics as native Windows. Given a face and a height, I should in theory get the same results, but it's not lining up. This is due to either: (1) FreeType computing/rounding things differently than Windows, or (2) Windows tweaking the raw computed values for backwards compatibility reasons. I suspect a combination of the two. One hint that it might be 2 is that Arial, Courier, MS Sans Serif, and Times New Roman are the most different from expectations, while Tahoma (newly introduced in win2k) just needs a few tweaks. On top of this Windows lets you specify the font height as a negative value to map to the "character height" or a positive value to map to the "cell height". These seem to map roughly to some FreeType sizing constants, and while I can get the negative values to generate the correct glyphs (with slightly off metrics), the positive values don't map as expected. In the end, since there are really only a handful of key fonts, I've written code to generate metrics on a real system and in DREAMM, and then created a lookup table so that you'll get exactly the expected results, even if DREAMM has to fake it a bit by generating slightly differently sized glyphs or fudging the metrics. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles While I will not claim to have "conquered" DirectPlay emulation yet, I will say that I am pleased to report successful host/join of games in Outlaws, Jedi Knight, Mysteries of the Sith, Episode I Racer, X-Wing vs.TIE Fighter, X-Wing Alliance, and Monopoly Star Wars, so that's pretty solid. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles https://corteximplant.com/system/media_attachments/files/112/936/012/382/380/605/original/88c67f21c1e863d0.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Sweet! Thought for sure it was done after the brilliant S3. https://corteximplant.com/system/media_attachments/files/112/906/932/340/505/351/original/3dd541d1b9bbd3ee.jpg npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles BREAKING NEWS: New Weird Al polka has dropped. https://www.youtube.com/watch?v=y0ZoX4dBvwk And yes, he figured out how to include WAP. 🚿🫏🐈 npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles My hot take on the yuzu situation: many obvious dumb mistakes were made. When we developed Connectix VGS back in the day, we went in knowing the risks of emulating a still-active console. We went out of our way to try and make it as legit as possible, adding logic to try and detect copied disks, attempting to get a proper license from Sony, etc. But when we did release, the thing that become most apparent was that despite all our efforts, the #1 reason people wanted it was for piracy. In fact, VGS itself was pirated waaaay more than it was sold. The people who really wanted it were by and large pirates, and they were happy to pirate both us and the games. At that point it become crystal clear to me that there was really no way to write an emulator for a current-generation console without inviting mass piracy. In fact ever since then it's been my firm belief that emulating current-gen anything is a fool's errand and should be avoided unless you're looking for trouble. The fact that yuzu was pulling in $30k+/month from donations and creating an Android version was just fuel for the fire. Add to that Nintendo's well-known litigious nature regarding emulation and the whole TOTK foolishness, and I honestly can't believe it took this long for them to be shut down. I'm just glad they didn't go to court and lose badly. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Seems like every time I start to get into a band that's been around a while, I find out that their fanbase thinks all the newer material sucks. 😜 Which means that either (a) their previous material is godlike, or (b) they've evolved into something different and I like where they went. More often than not, it's (b). Upshot: most fanbases are full of shit. (Actually the same tends to be true of bands I've liked for a long time that are still putting out quality material. Universally the hard-core fans hat it. Seems like it's the trajectory of every band to slough off diehard fans with each release who just can't deal with the new stuff.) npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles DREAMM 3.0b2 is now available to fix a few key issues from the first beta. First item is particularly important due to shuffling of game IDs: you will want to let DREAMM re-verify your games if you're coming from a 2.x version! https://aarongiles.com/dreamm/beta New in 3.0b2: Fixed version check so you are once again prompted after upgrading to scan folders Fixed standalone mode Fixed black levels in basic and epx OpenGL shaders Improved preset matching for sound fonts You can now track new versions via RSS at https://aarongiles.com/dreamm/version.xml npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Was investigating a bug in the version of Maniac Mansion that shipped with Day of the Tentacle. You can access Maniac Mansion from within DOTT by playing with Weird Ed's computer, in which case it launches the original Maniac Mansion EXE as a subprocess. For the English release, they used the original 160x200 graphics version. The data files are identical to the original release, so DREAMM supports running this version as a standalone. However, this reveals an interesting bug when running in EGA/VGA mode. Looking into why this happens, it became clear that LucasArts recompiled the original code for the Day of the Tentacle release with an option that set the minimum CPU version to something higher than base 8086. This is evident because PUSHing immediate values is done directly rather than by loading the immediate into a register first. However, it appears that when they recompiled the code, it optimized a bit too well, and removed some required EGA/VGA frame buffer reads, leading to the effect below. They likely missed a volatile modifier which didn't matter in the original release. This would not have hit in the real world because when launching from DOTT (a VGA game) it defaults to MCGA mode which doesn't have this issue. It only happens if you run it directly with either v or e command line options. https://corteximplant.com/system/media_attachments/files/111/634/403/798/524/955/original/c5af815a88f33140.png npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles In case you're into torture, there's an AI upscaled 4k 60fps version of the Star Wars Holiday Special up here: https://www.youtube.com/watch?v=iJBN0p4Dlqs Pretty sure I watched it as a young'un, but I don't remember it being movie-length. 😲 npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Wow, CRT simulation really brings out those Mark Ferrari dither patterns nicely! (Yes, I just reworked my rendering core to support fancy CRT effects via GLSL shaders.) https://corteximplant.com/system/media_attachments/files/111/549/678/922/534/976/original/0bb29758623e282c.webp npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles @npub1y4h…t26u It was always the height of laziness in arcade ports to just use the built-in PC BIOS font instead of the original arcade font. It's a small thing, sure, but it always bugged me even as a kid, and made it feel less "arcade-y" for no good reason. https://corteximplant.com/system/media_attachments/files/111/399/903/054/132/324/original/c10ce87762ddcf27.jpg npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Funny bug in Day of the Tentacle. They install a keyboard filter off of INT 15h that I wasn't previously calling. Now I am. The semantics are that the scancode is in AL and the carry flag is set. When the filter returns, it's supposed to clear the carry to ignore the keypress, or set it to allow it to process. It can also modify the scancode in AL. The path where they want to ignore the keypress, however, has a critical bug: MOV AL, 0 CLC IRET Seems logical except that the IRET restores the flags from when the INT 15h was called, so the CLC doesn't actually do anything, and the carry is always set before calling the filter. It's the fact that they clear the scancode to 0 that saves them. For some reason my keyboard logic is generating keypresses in response to the 0 scancode, which it shouldn't be doing, but once I fix that hopefully things will work as intended. npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles @npub1u3f…nne2 That looks almost exactly like my yellowed container of zip ties. Fry's special, right? npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Been playing with my OPL synth a bit today, running some of the other games with it. Found and squashed a few bugs, so it's relatively decent now. Also determined that 2 OPLs is plenty. One thing that's unclear is what pitch the drum instruments should be played at. Since MIDI channel 10 maps different drums to individual keys, there is one "instrument" per key for the drums. But that means the pitch specified doesn't really apply, so there must be some implicit default pitch for the drums. I also wonder if anyone ever made a set of OPL instruments for the MT-32 defaults. Right now if you play an MT-32 game through OPLMIDI, it translates the MT-32 to GMIDI and then the GMIDI instruments get selected. The MT-32 -> GMIDI mapping is imperfect, so better results could potentially be obtained by making an MT-32-specific set of instruments, but I haven't found any. Let me know if you know of anything like that! npub1kfka8atu26kkeld7d7d7we4n7cndvmh99da6y9d3eq9lvkqapges3rrt7k Aaron Giles Thought cross-compiling for ARM on Linux would be easier than the other two platforms, but it seems to be harder, actually. On Windows I just needed to change the path to the compiler and linker to the ARM64 ones and things work out. On the Mac, fat binary support is kind of baked in, so cross compiling x64 on an ARM64 host worked pretty easily. But on Linux I'm a bit confused how to build for arm64 on an x64 host. I am able to run WSL on my Windows ARM machine and build an ARM64 version that way, but it sure would be convenient to just build both targets on x64. But things like sdl2-config (which provides paths to includes/libs) seem rather host-dependent, so figuring out how to do it properly appears fairly complicated.