Subscribe to Personal Log via RSS

Hyperdrive is out!

Yesterday I finally released Hyperdrive, with very good reception.

So far there are a few short YouTube videos with a bit of gameplay, which was expected: getting to understand the game and get further of the first boss requires some time. Hopefully later on we will see longer videos with people completing the game.

The YouTuber Xyphoe featured the game in his AMSTREAM last night, and it was very fun to watch and participate on the chat. Some takeaways:

  • People like the game, appreciating the technical part.
  • In general, they expect a regular shot’em up and the chain base power-up system is a bit confusing at first.
  • Once it clicked for Xyphoe, he got hooked.
  • When the weapon is not powerful enough –until level 3 or so–, is better to use “precision” by pressing fire when needed; later is OK to keep pressing fire and use a more “burst” approach.
  • When a life is lost, the weapon is downgraded; if the player doesn’t go back to “precision”, the game ends pretty quickly!
  • Xyphoe collected bombs, but he never remembered that he could use them to save tricky situations –probably because getting chains requires a lot of focus–.

In a way, this feels quite a lot like play-testing, although it is happening once the game is finished.

Other than that, I have fixed a small bug related to timing in the menu screen. I have three reports, including myself, of people playing the game on a real CPC not experiencing any issues –I’m assuming that CRTs can be quite permissive–, but the person reporting the issue explained it with a lot of detail and I agree that there was a problem (I was generating 304 lines instead of the expected 312 in a 50Hz output). Anyway, it is fixed now and version 1.0.1 is available to download.

My notes

I was commenting recently the idea of digital gardens, and a bit after that I realised how easy would be to have my own.

This site is already some markdown files on a directory, so I added a sub-directory and some templates to make Hugo render them pretty –with a table of contents, for example–, and that was it.

So you can go to the notes section, and see how it looks. Currently there are a couple of things over there:

So is not that different to what I had when I was using vim-wiki –although I ended not using that one–, with the main difference being that when I update this website, the notes are made public.

The core idea behind a digital garden is learning in public, but in my case I think it is going to be more like an easy and quick way of publishing some work in progress content –a bit like a personal wiki–, or for those things where a blog post is not really the best format.

Time will tell if I keep using it!

Digital gardens

From Digital Gardening Tools and Resources, what is “digital gardening”?

A garden is something inbetween [sic] a personal blog and a wiki. It’s a collection of evolving notes, essays, and ideas that aren’t strictly organised by their publication date. They’re inherently exploratory – posts are linked through contextual associations. They aren’t refined or complete - posts can be published as half-finished thoughts that will grow and evolve over time. They’re less rigid, less performative, and less perfect than the personal “blogs” we’re used to encountering on the web.

I have read about this a few times already, and every single time I find it interesting and makes a lot of sense.

I have always had a personal website. I started around 1998, so for me is pretty much always. Recently I celebrated 20 years of usebox.net, in a way my last personal website. And it kind of felt like that already.

If a wiki is a self-editable website where anybody can contribute, a digital garden could be just a wiki where the owner is the only one editing it, perhaps? I don’t feel like the focus should be in the lack of publication date but in the fact that the content is a work in progress that may be finished at some point, or abandoned in current state.

I like the blog to dump ideas or comment on things that I find interesting, because that helps me to solidify my thoughts –like I’m doing right now–, but it is true that the blog posts eventually disappear to never be seen again –down deep the archive–. There are tags that can help to find content that is related, but there is no further refinement: things get published and are final.

Let’s look for example to my post on bank switching. I think it is a blog post in which the date when it was published is not important and instead refinement of the content would be better –that’s why I transcribed the content to CPC Wiki, so it doesn’t get lost–.

I was looking at mkdocs last night, because I like it and this was the perfect excuse to put something together, but I woke up today undecided. I already have this website, and it could work as well to keep my notes –call it work in progress or digital garden–, I just need to find a way to make that information accessible.

Further info:

Fediverse, Adverse and Necroverse

From Alex Schroeder on Mastodon –not linking the toot because Alex deletes them after some time–:

The Fediverse is Mastodon, Pleroma, Diaspora, Friendica, Hubzilla, Osada, and all their friends, federating. 👍

But what do we call all the silos, the ad-based family of Facebook, Twitter, Reddit, and friends? It’s the Adverse! A universe founded on ad serving. And a reminder that they offer plenty of adversity. All the adverse silos stand alone, like rocks, like islands, like Alcatraz. 👎

And what about Orkut, Google Wave, Google+ and other networks that have come and gone. This is the Necroverse.

Sometimes networks that seem alive today slide into the necroverse. Let’s hope we keep our network alive. Here’s to many happy years in the fediverse! 😁🥳

I have been on Mastodon since May, and it has worked for me. I still have my Twitter account, because I have a good number of followers and that is useful to promote my games –and also some friends that are still there and they are not really into Open Source philosophy and couldn’t care less about the Fediverse–, but I haven’t been very active. Funnily enough, my number of followers keeps growing now that I don’t post.

Why does Mastodon work for me? I’m building a small network of friends –well, not everybody is my friend; not yet–, which is the same I did on Twitter. It doesn’t matter how many followers I have or how many people I follow, I always end interacting –and caring– about a dozen or so people, and you can have that on the Fediverse, federating and without ads.

What about you? Are you still in the Adverse?

Hyperdrive is almost ready

Hyperdrive is not completely finished, I still need to write some music, but the gameplay is complete and it is being tested by a couple of good friends. I tend to incrementally test my games, so there is not much work left for the testes, but they almost always find something. This game may not be the hardest to test, but it won’t be easy either.

There are also other things to do before the game is released. For example: preparing a dedicated website. I may try to make a teaser video –very difficult and not essential–, and write some blurb of text for the press.

I don’t plan to make a physical release, at least from the start, which should reduce the levels of stress associated to the whole process. The main change is that, in case a bug is found after release, is not that bad. Later on I may consider a Dandanator (or DES) release, not sure.

Despite all that, there is some pressure. This game is using cartridge as media, which is not very common in the Amstrad CPC world, so I may have some backslash because of that. Which is fine, because some people always complain –with good intentions–, not matter what you do. I guess at very least some Amstrad fans will ask for a disc version for the 128K models, and a cassette version for the 464, and basically any combination in between.

The music is not finished yet, but let’s look at some numbers:

  • 11 months of development –I rewrote the engine 3 times until I got it where I wanted–. It moves at 25 FPS (most of the time, at least).
  • 9 levels of weapon for the player, with different speed and sprite (some share sound effect).
  • The enemies have 2 different types of bullets, and one of the bosses have a custom one as well.
  • 5 stages, with different enemies and end boss; that is 8.5K per stage, a bit over 42K in total.
  • 17 different enemies (different sprites, and behaviour), which including the bosses is 30K of compiled, relocatable sprites.
  • Over 15K of background tiles and misc graphics.
  • 16K for the music player, sound effects and songs (planned, I don’t think I’ll need more than that).
  • Over 26K of code, split in two 16K banks –with no bank switching support in the compiler, it was interesting to implement–.
  • Over 15K of RAM used for buffers, variables, etc.
  • The type of gameplay I like, trying to not let the technical part limiting the fun part; which is not easy aiming to get smooth and constant 25 FPS on the CPC!

It is using 12 banks of 16K of the 32 available on a cartridge (up to 512K), so it could be bigger! And all without loading times, and working in all CPC models (and the GX4000), independently of the amount of RAM they have. Sure, it won’t be as easy to load on a real machine without add-ons, but we are in 2022 and most aficionados have those anyway.

So I think it pays off. I wrote in a blog that I think cartridges are a cool media for the Amstrad CPC, and I decided to use it in this game. Could I have done the same with multi-load? Probably, but it would have been 128K models only, and it would have been quite different –likely with some limitations and compromising on some things–. All in theory, of course, because clearly that ship has sailed.

My plan is to allow a month for testing –so I can write the music as well–, and then have a release early December.

The Hand of Fate

My younger son is pretty good with the mouse already, and he is getting better and better at reading, so I have been thinking that there are a lot of good old games that we could play together, and he could drive.

An obvious genre is point & click adventures –or as we called it back in the day graphical adventures–, as long as the interface is not too cumbersome (no SCUMM for now, the verbs are a bit too complicated for a 5 year old), and ideally it should have voices so I don’t have to read all the texts. So there are a few years of point & click games when they where still popular and the CD-ROM as media was perfect to add content like digitised voices (and some video, often looking awfully bad today).

My wife is playing Shadowrun Returns –the tactical RPG based on the table-top game–, and discussing how many games I have in my GoG library that I have never played, and that most of them were given for free at some point; we checked if there was any new free game.

Although we didn’t find any that I didn’t have already, we saw that the The Legend of Kyrandia games were less than £2 (each). I never played them back in the day, but I remember that they were big in the magazines of the time, with full walk-through of both. The graphics are good, of the time and style of Lands of Lore –in fact, the evil Scotia is mentioned in The Hand of Fate as a joke–, and after a quick search I found that the interface wasn’t too complicated and it had fully digitised voices. So we decided to give it a go.

In the game

The game looks fantastic in glorious VGA

We have been playing The Hand of Fate –which is the second on the series– for a few days, and we completed it yesterday. My son was thrilled, even if we needed a guide for a lot of the puzzles. This game is a showcase of most of the problems of the genre, and then some. But if you have some help when things get extra-obtuse, you can enjoy the cute graphics, the excellent synth-FM music and the nonsensical story.

The game has good humour –although one joke has aged so-so–, and the voice of Zanthia gives a great personality to the main character –even if sometimes, to show the urgency of the situation, it will interrupt the action to tell us that we should hurry up–.

The potions we need to make during the game are a good excuse for puzzles, and I liked the mechanic: find a page of your potions book, find some weird ingredients, make and use the potion to remove a blocker and advance on the story.

And then there is the story, which is not great. It doesn’t matter, because the important is the puzzles, but you spent two thirds of the game to get to a location to basically realise that it was all a waste of time. Then a character exposes the actual plot, and we do the last third of the game –and it didn’t surprise us who the baddie was–.

In the game

Zanthia changes clothes often, and that's part of the charm

You definitely need guide to complete the game, and I guess it makes a lot of sense now that the magazines published those in-depth walk-through back in the day. Even with the guide, at one point we got to an unwinnable state, because we flushed our cauldron too soon and then we were short of one skeptic potion to complete the game (fortunately we had a recent save and we only lost 30 minutes of progress). And there is a “Towers of Hanoi” puzzle that it doesn’t matter if you have a guide, to not mention the final scene where we died around 20 times until we got it right –because you can die in this game, even if is more a joke than an actual mechanic–.

So I would say it is a hard game, but we had fun, and I can think of worse introductions to the genre. Besides, it is the first game we complete!

usebox.net is 20!

20 years ago I decided that I wanted a stable identity on the Internet. I had used free email accounts and web hosting for a few years but, specially the web hosting, was fragile and could change any time. Besides I had seen in my main email account at RocketMail that free services could change in ways we don’t like –RocketMail was acquired by Yahoo!–.

So it was time. I wanted to have a website that didn’t change, without ads, that depended solely on myself. I asked a couple of friends if they wanted to be part of it, I guess a bit in the tilde spirit.

They didn’t really care, and I can’t remember if they ever contributed any money to help with the costs, but this is how the website looked on the first day (in perfect Spanish!).

welcome to usebox.net

The front page. It was a good day!

Later on some more friends had email on the server –for a while, at least–, and the services have been online since then. It all started with an hosted service in Arsys, then a small server in OVH –can’t remember if it was a VPS–, then a miniserver in Memset –just a VPS with Xen–, and today a droplet in Digital Ocean –just call it VPS already!–.

At some point there was even sub-domains, like the old blackshell.usebox.net, where I hosted my personal weblog in Spanish, but the main website had different uses over the years. At some point it was my business card for my freelance job, but at the end is just a redirection to my personal website; because that is what usebox.net is basically.

My infrastructure has grown a bit in 20 years, and the prices have gone down. Never has been this easy –and cheap– to have a personal server on the Internet, yet every time some business ask you for your email on the phone there is surprise because it isn’t an email address on one of the big providers.

Anyway, here we are and hopefully here we go for another 20!

CAS support in ubox MSX libs

I made a maintenance release of my ubox MSX libs back in April, which updated one dependency and the docs after I run some tests with the newest SDCC. It was the first release of 2022, because the project is mature and stable –although there’s interest to make changes–.

Since then, I made another round of dependency updates, with special interest in rasm, because this excellent assembler has changed the way it builds, and it required a bit of work to move to the latest version. So yesterday I thought I would make a release, to not keep those changes in the main branch without being “official”; and I found a small bug that needed fixing.

It was an interesting one. Some of the python tools that convert PNG images to different data formats used on the MSX was using a set, and looks like in the python version coming with my current Debian (3.9.2), the order of the elements have changed. Long story short, the sprite of the player character in Green –the demo game– was not green any more. It was easy to fix, and I decided to make some changes to the project website to look marginally better and give visibility to the fix.

And then I was checking some files randomly and I ended reading the TODO file, and without noticing I started implementing CAS support.

The CAS files are a representation of cassette data used by most emulators. You can load them on your emulator, or convert them to WAV –if not play them directly– and load them on the actual hardware. Most MSX aficionados will have more sophisticated ways of loading software, but if you don’t, the CAS files are the easiest –and cheapest– way of loading homebrew games.

The official take of the community is that “cartridges are best”, and I agree; but it is also true that by releasing my games in CAS format –as well as in ROM format–, more people had a chance to play them –including some extreme cases of models with 16K of RAM and two memory expansions so for example Uchūsen Gamma would load–.

Some time ago I released as OSS my mkcas tool, that I wrote to generate the CAS files of my games, and in the case of ubox MSX libs it was just matter of adding the tool to the build pipeline so the user could get the ROM file –just a cartridge image– and, optionally, a CAS version of the same code. Including a loading screen, of course.

The CAS file uses a multi-stage loader:

  • Firstly, a short BASIC program is loaded that will load and execute a binary loader.
  • Then the binary loader loads two blocks, using the BIOS functions and some fancy code to show multi-colour loading bars.
  • The first block is the compressed loading screen, that is decompressed and uploaded to the VDP, so there’s something nice to watch as we wait.
  • The second block is the ROM itself, compressed as well. It is uncompressed and setup like it was running from ROM, but in RAM.

The only tricky part is configuring the slots so we have ROM, RAM, RAM and RAM; and that’s why I made this optional, because it will not work in machines without enough memory.

To start with it requires more RAM than the cartridge, like 32K more –which is the size of the ROM–. There are also other limitations –like the compressed ROM being less than 24576 bytes–, but all in all I think having a CAS file as an extra is totally worth it (based, as I say, on my experience with my games).

I spent way too much time reviewing the code because I forgot that any MSX model with disk needs to boot pressing the shift key to disable the disk BIOS or the BIOS will use some memory that the loader needs, but it wasn’t too complicated at the end. I’m happy with the result!

Two compiler implementations

I think I was reading about Oberon –the programming language, not the operating system– because a post on Hacker News, and I ended in the page of Niklaus Wirth.

Wirth was the chief designer of the programming languages: Euler (1965), PL360 (1966), ALGOL W (1966), Pascal (1970), Modula (1975), Modula-2 (1978), Oberon (1987), Oberon-2 (1991), and Oberon-07 (2007) –from the Wikipedia–, among other things.

That is truly remarkable. So I was looking around and I found that his website has PDFs describing the implementation of two compilers:

The code is very readable, and is not because I had to write some Pascal back at University –and Oberon is a descendant of that language–. There are things missing, but is mostly refinement of error reporting and things like that. Everything that is important, is there.

For example, the code generation of the multiplication for Oberon-0:

PROCEDURE MulOp*(VAR x, y: Item);   (* x := x * y *)
BEGIN
  IF (x.mode = Const) & (y.mode = Const) THEN x.a := x.a * y.a
  ELSIF (y.mode = Const) & (y.a = 2) THEN load(x); Put1(Lsl, x.r, x.r, 1)
  ELSIF y.mode = Const THEN load(x); Put1(Mul, x.r, x.r, y.a)
  ELSIF x.mode = Const THEN load(y); Put1(Mul, y.r, y.r, x.a); x.mode := Reg; x.r := y.r
  ELSE load(x); load(y); Put0(Mul, RH-2, x.r, y.r); DEC(RH); x.r := RH-1
  END
END MulOp;

It even shows constant folding –both operands are constants–. The resulting code may not be super-optimized, but it is a full example in an easy to understand size.

I skimmed through the “Compiler Construction” book during my holidays and is not too long. I’m looking forward to read it properly when I have some time.

Reading off-line

Last night I was finally reading a Scheme Primer, after weeks open on a tab in my phone. Firefox for Android reloads the tab every time I select it, so I thought: why not having a local copy that I can read even if I’m offline or the page is not available?

Well, turns out that Firefox can’t save the page. Not as HTML, not as a full website, not as a PDF; it basically lacks the functionality. Which is a trend with Mozilla, to be honest. Chrome is terrible from the point of view of privacy and I don’t want to play into Google’s hands, but Firefox is great at keeping things working just about to ensure they are never successful, which is a real shame.

I looked around and I found a developer saying back in 2012 that the functionality would be added, but they hadn’t had time yet. I’m not holding my breath.

So I tried Chrome, that allows saving the page, but then when I try to open it using the “Files” app, it doesn’t know how to open the file and wants to search for an app to install. Brilliant.

You can print to a PDF –with Chrome, in Firefox I can’t find how to do it, so it may not be possible–, but the PDF reader is not ideal as the text doesn’t flow using the phone screen efficiently. There must be a better way, isn’t it?

It isn’t a solution out of the box, but this is what I ended doing:

  1. Download the page as HTML in my desktop (using Firefox).
  2. Convert the page to epub format using the always powerful pandoc:
 pandoc --from=html --to=epub 'A Scheme Primer.html' -o scheme-primer.epub
  1. Install ReadEra –that is free, but I’m considering buying the premium version because it is a great reader!–.
  2. Copy the epub, and now I have the Scheme tutorial to read off-line anytime I want.

I don’t know if it is that the website is striclty following standards without much CSS, or pandoc being amazing, or the ebook reader being great, but the result is much better that I was expecting. Feels like an actual ebook.

When I’m away from my desktop PC I already have two apps from the public library to read magazines, ebooks, listen to audio-books, and whatnot, and I don’t use them much because… I guess what I wanted is to read about Scheme instead. I’m not a heavy app user, other than Podcast Addict and email, I tend to use the browser for everything else.

I’m glad I still have some options, but in reality, the ideal would have been that Firefox on Android was a better browser.