Yesterday I published a minigame I made in JavaScript following the ideas of my 7yo son. He drew most of the graphics –I gave him a hand with the slimes’ sprites–, and I had never made a twin stick shooter type of game, so that was interesting. I haven’t played any games on the genre either, and I think I understand now why they can be very fun!
It is still more like a tech demo, but playable –and kind of fun for 10 minutes–, and it helped me to make some improvements on the “engine”. The development experience was OK, but the bits I don’t like about JavaScript are still there, including the hit and miss performance of canvas 2D on Linux.
I don’t see myself writing larger games in JavaScript, but for small prototypes or jam games –if I was still doing jams!–, it could be a good match.
This is a bit of a rant. You can skip it or, depending on you experience, you may come for the ride nodding along.
I have spent a couple of evenings improving my feed reading experience, and I’m not sure why it is so difficult in 2025 to read blogs like we did in the early 2000s. Was it bad back then? It is possible it was!
Let’s set the starting point:
I don’t want to use a cloud service to read my blogs. I only read blog in my main PC, never in my phone –I used to, but I realised I wasn’t really reading them–.
Although is not necessarily linked to the previous point, I don’t want to use a website either. Essentially because I don’t want to self-host a complex application I would have to maintain to just read blogs on my PC. I know I could just run some containers and whatnot on my PC, but that’s over-engineering it.
If I’m using a native application, I want it to be native. We used to have those applications, now we have Electron and Flutter, and probably others I don’t want to know about. Let websites be websites, and native applications, well… something else.
I thought it would be easy! There aren’t that many options currently open source, working on Linux, and still maintained: do you want to download and process content from the Internet with an application that has been untouched for years? Sounds fun!
I started using Liferea over 20 years ago, but a few months ago something happened –can’t remember what, it could have been me!–, and I decided to look around to see what was out there.
And I found NewsFlash. Although not exactly: what I found because the decadence of the search engines –topic for another day– is a lot of click-bait sites saying how amazing NewsFlash is. And it really looks good, I agree!
The easiest way of using the latest version is via its official flatpak, which I’m not the biggest fan of but you can’t have it all. And slowly but surely you realise that all those sites raving about NewsFlash haven’t used it for more than 10 minutes.
Don’t get me wrong. NewsFlash it is Open Source and it keeps improving with each release. I have reported bugs, the response times of the main developer are fantastic, and I believe it has a bright future ahead. It is just that currently it isn’t a good match for my needs, and I don’t have the time –or the skills, to be honest– to contribute and make it work for me.
Hopefully I’m not unfair or not too picky, but I hit bugs importing an OPML file –that I resolved editing the sqlite database by hand, fun!–, exporting to OPML doesn’t seem to overwrite an existing file correctly and can result on a corrupt file –seems to be fixed already!–, it doesn’t seem to be rendering the fonts I choose –probably Flatpak’s fault–, and other small paper cuts I can’t remember right now.
Oh, and the last straw was when it crashed my whole system. Can’t tell 100% what happened because the system didn’t respond and I had to power-cycle, but my I3 status was reporting 800MB free from the 32GB of RAM that I have on my PC. Not bad for an application written in rust!
At the end, I’m back with Liferea. I edited ~/.config/liferea/liferea.css to:
And with GTK on a dark theme, looks decent enough. I’m back to a happy place, and the tools I use work and I’m not frustrated any more.
Then perhaps we should take a look to the current state of the feeds out there:
RSS is still popular, although it has many limitations. And I know it because: I use RSS! At very least it needs some extensions from Atom, but it is common that the feed uses the post creation date in pubDate instead of when it was modified last time resulting on updates to the post never showing in the feed reader. I am conflicted on this one: is it the RSS’ fault or the reader’s limitation? I don’t know, but it is hard to detect this unfortunately. We should be using Atom instead because it makes distinction between published and updated.
It is not common, but some people –including me– like tinkering, and we end with bad implementations of RSS or Atom –e.g. the images won’t load on the feed readers–. You can contact the author, but let’s be real: people are busy and I didn’t get results, so no images on that blog.
Some feeds don’t include the full post. I don’t know why, but back in the day this was because the blog post had ads and those don’t show in the feed. NewsFeed deals with it beautifully and turns out Liferea can do it as well –although is not 100% consistent applying its theme, but it is close enough–. This “retrieve the post from the web” works also with the two previous problems, but then feels like we are failing a bit a syndicating content.
Finally, it is kind of difficult to find new interesting blogs.
Back in the early 2000s we had blogrolls and comments, and both were an excellent way to build your own community of blogs and find new content organically.
Unfortunately all that was ruined because Google’s dominance in the search space and ads, and their pagerank that lead to SEO and spam, and links had value beyond their original intent of linking content. Having comments on your blog wasn’t useful anymore, because it was mostly spam, and most of us removed the functionality.
Similarly people started to drop the blogrolls, because all that perceived value on the outgoing links. Which I don’t think it matters anymore because Google buried blogs deep in their search results, so you may as well have links. If I stopped having a blogroll is because the blogs I was reading disappeared, mostly. And I lost the community part around blogging.
Since about a year that my blogroll is back, and we’ll see about the community. Go and check it, you may find blogs that you like.
If you got to this point, I hope it wasn’t too bad. Despite all these arguably small things, I love it and I’m slowly building a list of blogs that I enjoy reading, and I’m even writing about it!
I’ve been thinking about this after Alex asked himself and blogged about the “Blog Question Challenge”:
Why did you start blogging in the first place?
What platform are you using to manage your blog, and why do you use it?
Have you blogged on other platforms before?
What’s your favourite post on your blog?
Any future plans for the blog?
I found interesting Alex’s answers because my first blog, that I closed in 2021 after 18 years, also didn’t start as a blog.
Back in 2003 I had a home server –my old Pentium 100Mhz initially– and I was part of a project to build a metropolitan area network using a wireless –I still have a presentation in PDF about the project; in Spanish–. My server was connected to a nearby elxwifi node (that’s how we called our network), and I offered some services. That included a website in which I shared news about my server and the project, in reverse chronological order –newer entries first–. I had no idea that it was a blog, but that was what started it all for me.
At some point the web was also available via the Internet, which meant a bit more attention than the handful of visits I would get via the wireless network, and because I was learning a lot of new things about open source and Linux, I started to write about that in my page. Then you read other blogs, start commenting on those, and the authors of those blogs comment on yours, and you build a small community. A social network if you will. We called it blogosphere.
I met a lot of interesting people thanks to my blog. Some of them even in person –there were meet ups called Beers and Blogs, for example–, with friendships that last more than 20 years now.
Because my initial approach was homebrew, I ended writing my own blogging software in PHP with MySQL as database to store the posts. I rewrote that a few years later in Python (with Redis to store the posts; during the NoSQL hype), because I was learning that language and that’s what you used to do back then. Today I don’t need any dynamic parts, so I’m using Hugo to manage this blog as a static site.
I don’t think I have a favourite post, but the last post in my old blog was emotive to write. Not every day you decide to end something that has been with you for so long.
I’m not sure what are my plans for this blog. I started trying to replace other social media –Twitter back then–, so I used it to write updates about game development and my projects, and I still do that; but in my experience, thematic blogs are very hard to keep in focus and they turn a bit personal blogs at the end. So I may write about anything I find interesting and I feel like sharing.
I guess I would like to go back to that version of the Internet, that includes writing a blog and participating in memes like this one! So I’m going to tag Oscar, that was one of those bloggers that started blogging by the time I started, and I’m interested in his answers to this challenge.
Well, I did it last year, sort of. Is not that I don’t like writing this type of post, because it is good to reflect on what happened in the year that ends, but I always have that feeling that I’m missing a lot of things. Anyway, let’s do some highlights at least.
Let’s start with gamedev: two games this year! Not bad for feeling a bit uninspired. Part of the success is perhaps because my 7 years old son want us –which is me– to make more games.
Alien Intruder (DOS 16-bit), that feels a bit too close to the end of the year, but to be fair it was almost finished for a while but I run out of steam in the last 10%.
Why I have been uninspired? I don’t know for sure. We have passed the 10 years mark of me releasing consistently at least one game every year (sometimes more!). I suspect I’m getting tired because it is a lot of effort. Not that much the actual work of programming, drawing the graphics, and writing the music; but the focus required to actually finish a more or less polished game, and release it –two different things, by the way–.
If found myself wondering if it was worth it, pushing forward for months to reach my own high standards, when it is a free game after all. Even if I do things for myself –and my sons, of course–, I believe it is human wanting to know that what you do kind of matters. There so much stuff out there, and could I be using my free time for other things? Absolutely.
I can hear you say: take a break! And you may be right, but I don’t want to go back to “not finishing things”. I suspect there is a risk of that if I stop.
As I mentioned recently, I would like to write more Haskell in 2025, and that would mean a bit less time for retro-gamedev. So that could be it: not that much a break as to do different things.
And that goes in hand with my old mini PC from 2015 (an Intel Core i3-5010U), dying on me. So I got a new one, this time a bit more powerful. Still not what you would consider a gaming rig, but is clearly not a potato like the old one, so… I can play modern-ish games now!
I suppose we can add that to the list of things I could be doing instead of spending all my nights working on games, isn’t it? Anyway, not a big factor, but I have enjoyed finishing Pyre –after I completed Transistor, I’m a big fan of Supergiant Games–. It is a beautiful game, with a great story, music and sound design. Very inspiring, even if in a way that I’m sure I can’t make games like that.
Because Lutris is awesome, we have been trying other games, but our big hit is Torchlight 2 “family co-op” in the local network. It is almost not age appropriate for the boys, but the kind of isometric perspective graphics with the fantasy theme makes it alright. We have completed it once, and we are having another go with different character classes. We are still playing some Minecraft, of course, but I prefer Torchlight 2!
The third big activity that has eaten a lot of my free time has been reading books. I’m still finishing about two books a month, although this year I’ve been reading authors that write very long books. Because I had a “not very good” book I wanted to read because it was the end of a series, and a “slow starter”; I didn’t manage to read 24 books this year. But 23 is still pretty good!
I have realised that finding what to read next is a big problem when reading two books a month. So when I discover a new author that I like, I tend to try other books by them, hoping that it would be as good. I did that last year, and it did work well, even if that meant reading a lot of Brandon Mull. This year I’ve been disappointed a few times, because it wasn’t as good –but it wasn’t bad either, so it is still a win–.
My highlights are the “Mistborn” series by Brandon Sanderson; probably the best fantasy I have read in many years to the point that I’m considering re-reading it in 2025. Another highlight, also by Sanderson, was “The Sunlit Man”. Only one book with almost no padding! Very recommended.
And that’s all. Would you believe that I’ve only been making games, playing some games, and reading books? Exactly, that is the feeling I was talking about!
So I finally released Alien Intruder yesterday, on Christmas day. Perhaps it should have happened a few weeks ago, but I was tired and couldn’t focus on writing the music. But that’s OK, it has been like a Christmas present –although I don’t think is the best date to release a game!–.
The blobs have a lot of personality
Although I sent a couple of emails to the usual people –what I call the press release–, the main “announcement” has been this post in Mastodon, and a few people said they liked the game, so it is being played. But you know, it is very unlikely that the news have reached to everybody that could be interested in an new DOS game in 2024. Any help spreading the word would be appreciated!
Checking some of the websites that cover DOS games beyond being a site to download “free” games, and at least check new titles, I was visiting DOS haven, and I liked they answer to why would someone make game for DOS nowadays?, which is essentially three reasons:
Because it’s fun, if you are into that sort of thing. Indeed.
Because it’s retro, and retro is cool! Perhaps I would say nostalgia plays a role here. Although I didn’t look at the DOS era like that, some people do.
Because thanks to DOSBox, you can run DOS programs almost anywhere: Windows, Linux, MacOS, smartphones, tablets, Raspberry Pi, you name it. Yes, this is a nice plus: games are as portable as DOSBox.
I’m not encouraging people to make DOS games as a for-profit adventure –there are plenty of limitations–, but playing the game on my RG35xx H is very nice and I didn’t have to port the game.
Anyway, I wanted to make a 16-bit DOS game, in the spirit of the shareware boom of early 90s. Although it isn’t shareware –and you don’t need to register the game!–, I was inspired by the feel of those titles –and I read Shareware heroes this year as well, an enjoyable book–. I know I have already released other DOS games, targeting both the age before and after, but I guess it doesn’t matter because it is 2024 anyway.
Making a game for the 286 with VGA graphics wasn’t perhaps the best idea, and I mentioned already how dificult was to write my own sound driver, but I enjoyed the process (it is fun, remember?). I may or may not make more DOS games, but after this experience I think that would be 32-bit –meaning 386 or better–. It is probably what makes more sense now that I have been there, done that.
As always, there’s a free download in the game’s website. I was approached by a publisher asking if I would like to make a big box release of the game. I’m not sure about this, but never say never. For now, just go an blast some cute aliens!
I streamed some sessions of game development with Haskell and I got to make a platform game with some reasonable functional code. I didn’t release a game because there wasn’t a game there, really; but despite that, I think I implemented enough pieces to be confident that I can finish a game in Haskell.
However, time flies when you are having fun, and my free time this year has gone mostly to The Heart of Salamanderland –released in May–, and my current project for DOS 16-bit “Alien Intruder” that should be ready in the next two weeks, if I manage to finish writing the music –seriously, it is hard to write decent enough tunes–.
And I haven’t written any more Haskell, despite revisiting the codebase a couple of times and missing writing Haskell. Why I miss it? I don’t know for sure, but besides being fun, I like how it makes me feel happy about writing code.
I don’t have much choice of languages when I’m making games for classic systems. If is a Z80 based machine, it is going to be assembler and C. If it is for DOS, it will be assembler and C. See the pattern?
For my tools I don’t think I’m going to stop using Python, because I am very productive with it. Being my tools, I don’t need to worry about packaging, distribution, or performance. So I started writing Python in 2010 and it still makes me happy in 2024, even if I’m not interested in using it everywhere like perhaps 10 years ago.
Then I write a lot of Scala professionally every day. Sometimes I even write it for fun, and I love it. But then, it runs on the JVM and I wanted something different, perhaps also functional like Scala, for my personal projects. Likely a compiled language that generates native binaries.
I put a significant amount of time in Go two years ago, and even dabbled a bit into Ebiten. I liked that after a while the language just disappeared, and what was left was the problem I was trying to solve. But I also found out that the language was very uninspiring, and some of Google’s practices put me off. So I moved on.
I refreshed my Javascript game a bit –but that wasn’t really what I was looking for–, I wrote some C with SDL2, and it was fun, but also too similar to what I’m doing when I’m making games for classic systems.
I even tried a Scheme, again, very inspired and motivated to like it. And it didn’t happen. Again. I’m just going to accept the fact that lisps aren’t for me and live a normal life.
But with Haskell was different. Writing the code made me happy. Evidently, it is a shame I didn’t have gameplay to support the code I wrote, but that is only my fault. “Alien Intruder” could be a PC game, and that would have been a nice project to write in Haskell. I know, like making a game is not challenge enough!
So that is one thing for next year: write more Haskell –hopefully with a PC game release!–.
More than a month since the last update? What happened!?
Well, “Alien Intruder” is progressing nicely: I have 25 stages ready –including playtesting–, and everything else is more or less in place.
The current TODO list is reasonable:
At least another tileset (two ideally), so we can get to 50 stages with some variability to the eye.
Likely another enemy, to make the stages 30 to 40 more interesting.
High score table, because this is an arcade game and chasing score is part of it.
The music, at least: the menu tune, in game, game over, and stage clear. I could also change the tune every 10 stages, but it depends on inspiration writing!
Some more testing!
So is not that much, is it? The engine has been finished for the last month and I have fixed a handful of bugs that necessarily would appear when designing and playtesting the stages, although the “problem” are usually those bugs that don’t present themselves as part of this process, and that’s why we need testing.
I still need to learn to use the Reality AdLib Tracker v2, although I went down a rabbit hole with the music player and I ended implementing a DRO player, so In theory I can use anything that generates AdLib audio and can be captured by DosBox.
There was also a lot of polishing, from improving the asset management –that looks like I almost reimplemented the WAD format–, better memory allocation and far pointer support –ah, isn’t DOS 16-bit fun?–, and small things like saving the joystick calibration to disk.
Anyway, I keep posting updates in my mastodon account –that, by the way, I have moved from SDF; but that is probably a story for a different day–.
My estimation on how long would it take me to complete my current project “Alien Intruder” was a bit off, and it is because I subestimated –or more like I forgot– that I had to write my own sound driver.
In Gold Mine Run! I used the excellent libmikmod, that gives you everything you need, supporting mixing of music and sound effects. Unfortunately for DOS it only supports DJGPP, which is 32-bit, and I’m targeting 16-bit with the IA-16 GCC port.
So I decided I would write my own driver, how hard could it be?
The plan was supporting:
FM for music, via AdLib compatibility.
1 channel 8-bit PCM sound via Sound Blaster.
And I have all that now, but it took me longer than expected because the docs I found were missing small details, and my own incompetence, of course.
Playing an IMF file, like the ones used in “Wolfenstein 3D” for example, is very easy. They are just an array of triplets (register, value and time) that you send to the sound card at an specific frequency, which was my first problem: I didn’t change the Programmable Interval Timer (PIT) chip from the default 18.2065Hz in Gold Mine Run!, and that was fine for MikMod, but not good enough for the FM playback.
So I had to do that, and it took me a bit to get it right because I had something else getting in the way and I though I was reprogramming the PIT wrong.
Which goes back to the default (1193182 / 18.2065 gives us a TIMER_SPEED of 65535).
With that out of the way, we use the interrupt handler to send data to the sound card (those “register and value” from the triplets I mentioned before). And that’s all, other that I need to learn to use a tracker that can export to this format. It will be OK, I’m sure of that.
Programming the Sound Blaster for PCM sound is not too complicated, but it has two parts: setup the DMA (the hard bits), and writing to the DSP (easy and well documented, for example Programming the Sound Blaster DSP).
To keep things simple I’m focusing on “plain” Sound Blaster, without using the new features of later revisions (e.g. the Sound Blaster 16 has other ways of setting up the DMA), and it should work fine with most configurations, but I kind of expect things to be a bit standard via the BLASTER environment variable. For most people playing the game with DosBox it will be fine, and I don’t need to support all the weird configurations out there.
There were two gotchas in this part:
the memory used by the DMA can’t cross a 64k page physical boundary.
for whatever reason, when I used a large buffer for the DMA(say 48K), I got pops and weird noise in some samples.
My first big mistake, that took me some time to fix, was that I’m using DOS’ int 21h service 48h to allocate memory, and that returns a segment. So if you ask for 64k, that won’t cross a page boundary, right? Well, that is not correct, the page you get is virtual.
The way to calculate and find the page boundary is using a 20-bit memory address. If the end of our buffer is on a different segment on that 20-bit address, we are crossing a boundary.
A simple way of dealing with this is allocating double the memory you need (for example 32K for a 16K buffer), and if the end of the first 16K are on a different segment, just use the second 16K that are guaranteed then to fit on a 64k page.
/* falloc is my own "far alloc" as I implemented far pointers */ dma_buffer = falloc(MAX_SAMPLE_LEN *2);
if (!dma_buffer)
return0;
dma_start = dma_buffer;
/* 20-bit address */ dma_linear = (dma_buffer >>16) <<4;
/* avoid crossing a page boundary */if ((dma_linear >>16) != ((dma_linear + MAX_SAMPLE_LEN) >>16))
{
dma_linear += MAX_SAMPLE_LEN;
dma_start += MAX_SAMPLE_LEN;
}
/* these won't change */ dma_page = (dma_linear >>16) &0xff;
dma_offs = dma_linear &0xffff;
I keep dma_buffer unaltered because I need it to free the memory with DOS later on, but my working buffer is really pointed by dma_start. Also the DMA works with the 20-bit address (also called linear), so I pre-calculate the values here.
After this is just matter of copying the sample I want to play (in my case MAX_SAMPLE_LEN is 16K), setup the DMA to use the buffer and the right size (depending on the sample), and ask the DSP so play it.
I implemented a simple priority based playback, like I do in my 8-bit games, so a sample plays only if there is nothing playing already, or the sample you want to play has higher priority than what is currently playing.
I track what I’m playing by setting a variable when I start playing a sample, and clearing it when the IRQ interrupt is triggered by the sound card when it has finished playing a sample.
With this priority table, the action sounds fine with only one channel and saving myself from doing mixing of multiple channels:
Initially I thought I could load all my samples in a 64K page –being careful with the size of the samples–, and play them from there; but for whatever reason, even if the memory is not crossing a page boundary, the playback isn’t right and there are unexpected pops or noises in real hardware (emultted) but not in DosBox (that is more permissive). I don’t know what is this, and I can only test with the excellent 86Box, so I decided to use a smaller buffer and just copy there the sample I want to play. After that, all plays and sounds as expected.
I’m assuming this has a performance hit, but so far the game plays nice on a 286 –as long as the VGA card is decent–, so I’m not concerned.
Anyway, I didn’t want to make this a tutorial, and is not; but I explained a bit what I have been doing. The game is progressing nicely, but I’m not going to suggest any release date this time!
I mentioned recently a couple of DOS game jams, and I’m working on a game that it was a good match for the first one because I’m targeting 8086 and VGA, but I couldn’t finish it on time. That’s OK, I thought, because I can submit it to the next jam.
Unfortunately, I don’t think I’m going to get to that one either –there are 4 days left until the deadline and the game is like 40% done–. I will finish the game anyway and release it, as I did with Gold Mine Run! last year. The game it even entered a DOS Game Jam compilation CD, although it was never submitted to the jam. Which is awesome, although there aren’t that many new DOS games released every year, so if your game is not a total disaster, you should get some attention –and players!–.
Anyway, let me introduce you to my current project: Alien Intruder.
The work in progress of the menu screen
Testing in-game screen
There are still some unknowns, but I can already say the following:
For MS/DOS or compatible
Requires IBM PC/AT 8086 or later (a 286 is recommended), with VGA
Controlled with keyboard or 2 button joystick (2nd button for jump)
AdLib and/or SoundBlaster (undecided yet)
I am exploring some ideas, but it will be a “jump and shoot” type of arcade. I know this will fuel those saying that I am making too many arcade games, but they are obviously wrong :P or haven’t played my latest game: The Heart of Salamanderland, that is not an arcade.
The code is using all I learned making “Gold Mine Run!”, but also The Return of Traxtor. This is because my library for DJGPP requires a 386 and protected mode, but in this game I’m using 16-bit and the IA-16 GCC port, so the code I wrote for “Traxtor” is very relevant.
It took a bit of work, but I managed to simplify and port the VGA code to run in 8086 using a “small” memory model: independent segments for code and data, which means 64K of memory for each, and allocating 64000 extra bytes via DOS so I can have a back-buffer.
And the result is better than I expected! It even runs OK on very underpowered machines if we limit the number of entities. I tried for fun emulating a Sinclair PC200 using 86Box because it was the first PC my cousin had, and it was easier to boot with VGAcompared to other IBM PCs of the time –part lack of skills on my part, and part because I couldn’t find the right MS/DOS version to boot–.
Obviously the VGA is kind of expensive because each pixel is a byte, so I knew I couldn’t target those early models and make the type of game I was planing to make, but it was a fun test even if at the end a 286 is a more reasonable requirement. For most people I assume this won’t matter because it will run just fine in any modern machine with DosBox.
I can’t say for sure when it will be finished, but I am guessing early September is perfectly possible.
Last year I released two new DOS games (Gold mine run! and The Return of Traxtor), both made in the context of a game jam, even if I don’t really do game jams anymore.
Anyway, it was a lot of fun and it pushed me to get up to speed with the DOS platform, remembering in a way what I knew back in the late 90s, and going beyond that. And there are more DOS jams in 2024!
There could be other jams this year, like the DOS Games Jam –that had its first edition in 2020–, but these two jams tick a couple of boxes for me:
The target platform must be DOS (in other game jams is more about the feel, but I prefer going a bit more retro and make a game that runs on the actual hardware).
There are some interesting limitations, being 8086code in one of them (meaning: Intel 16-bit), and a COM file the other one (all the game must fit in 64K).
Since I released The Heart of Salamanderland for the Amstrad CPC last month I’ve been going through some ideas for potential games, and I was suffering a bit of choice paralysis and not starting anything (neither continuing one of the on hold projects).
When I released Gold Mine Run I put together a DOS library to make games with DJGPP, which is 32-bit and not useful for any of these two jams. But because I made Traxtor targeting the IBM PC/TX, I have some interesting code that I can reuse.
I’m toying with the idea of making something for the first jam, although I’m not sure what I’m going to target yet. I don’t feel like doing CGA again –too soon, and it is hard to draw nice things I guess–, EGA is such a pain to program, and VGA may not be a great match for the jam’s limitations.