Small addendum to my previous post: To put their signature on the “3-Demon” release in 1988, The Bitstoppers didn’t only put a README, an intro, and some deeply nested directories onto the disk – they also included a custom, Bitstoppers-branded mouse pointer as well! Funny that I missed that, because I myself extracted and manually categorized that mouse pointer, among thousands of others, and wrote a little web app that lets me link to it, complete with a OpenGraph-compatible preview image:
But that’s what shower thoughts are for, I guess. To make up for the slip-up, here’s a recording of Bitstoppers’ fabulously oldschool cracktro. Year!
The other day on pouët, the question came up when people started naming Amiga executable files with an “.exe” suffix, which isn’t really necessary under AmigaOS. Interesting question! I started scanning the disk images I collected for the Amiga Pointer Archive. At least in the TOSEC disk images, .exe files occur as early as 1987, and maybe earlier overall.
While the file names scrolled by, I noticed something funny: Endless
directory structures that seemed to repeat themselves. Take “3-Demon” from 1988,
contained in 3-Demon v1.0 (1988)(Mimetics)[h TBS].adf –
an early 3D editor, apparently:
This specific disk was spread by The Bitstoppers — they put a README file in front of it, added a little intro…
…and also left their name on the disk as a directory name. When you list the disk contents with AmigaDOS, you get:
1> dir df1:
c (dir)
objects (dir)
devs (dir)
s (dir)
fonts (dir)
libs (dir)
** THE BITSTOPPERS ** (dir)
»> BST <« !ReadMe!
.info 3-Demon
3-Demon.info BST
Disk.info Example 1.3demon
However, when you try to list all files recursively with dir df1: all, the system crashes:
Neat! Keep those lamers from listing your directories, hehe!
But is this a clever file system trick, maybe with a directory containing itself, causing the dir command to
exhaust all memory or overflow internal buffers? Kind of like a ZIP bomb –
an Amiga directory bomb?
At least for this disk, it’s not. If we analyze the ADF image in a file system analyzer like vAmigaDOS, we can follow the directory tree. Amiga OFS file contents are split up in 512-byte blocks, with references to their neighbors, parents, and children. Starting from the root block at 880, we get:
[880] 3-Demon: /> block 880
Block : 880
Type : ROOT
Header Key : 0
Checksum : 0x19ca146d
Name : 3-Demon
Created : 18-Mar-88 11:53:49
Modified : 18-Mar-88 11:53:49
Bitmap blocks : 1012
Bitmap extension block : 0
Hash table : 7 -> 883 (.info)
8 -> 925 (c)
10 -> 887 (3-Demon)
13 -> 886 (Example 1.3demon)
17 -> 894 (objects)
22 -> 926 (devs)
24 -> 899 (s)
28 -> 960 (!ReadMe!)
39 -> 924 (fonts)
40 -> 952 ( »> BST <« )
44 -> 932 (BST)
46 -> 954 (libs)
47 -> 958 ( ** THE BITSTOPPERS ** )
54 -> 882 (Disk.info)
[880] 3-Demon: /> block 958
Block : 958
Type : USERDIR
Header Key : 958
Checksum : 0xe48554e4
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:36
Parent : 880
Next : 0
Hash table : 47 -> 961 ( ** THE BITSTOPPERS ** )
[880] 3-Demon: /> block 961
Block : 961
Type : USERDIR
Header Key : 961
Checksum : 0xe4855475
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:37
Parent : 958
Next : 0
Hash table : 47 -> 962 ( ** THE BITSTOPPERS ** )
[...many more blocks omitted...]
[880] 3-Demon: /> block 1009
Block : 1009
Type : USERDIR
Header Key : 1009
Checksum : 0xe48555e3
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:47
Parent : 1008
Next : 0
Hash table :
So it’s turtles directories all the way down – just more
than dir can handle. Listing all the directories in vAmigaDOS
doesn’t crash your browser or gives the “unresponsive JavaScript” warning, it just outputs a very long list:
Still, the question remains: Is it possible to create an evil directory structure? One that contains itself, or maybe a parent and a child that point to each other?
Surprisingly, yes! We can get dir to crash without wasting 512 bytes for each dummy directory, saving
precious disk space! It just
takes some adjustments in a hex editor…
- create a blank ADF disk image
- makedir evil
- makedir evil/evil
block 880 (0x370) = root block
block 881 (0x371) = disk bitmap
block 882 (0x372) = directory "evil" (path: "evil")
block 883 (0x373) = sub-directory "evil" (path: "evil/evil")
- find the top-level "evil" disk block
882 * 512 bytes = offset 451584 = 0x6e400
0006e400: 0000 0002 0000 0372 0000 0000 0000 0000 .......r........
0006e410: 0000 0000 8f9a 2d16 0000 0000 0000 0000 ......-.........
checksum: need to adjust that by 1
0006e420: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e430: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e440: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e450: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e460: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e470: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e480: 0000 0000 0000 0000 0000 0373 0000 0000 ...........r....
hashtable with child reference
to "evil" sub-directory; let it
point to ourselves = 0372
0006e490: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e500: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e510: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e520: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e530: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e540: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e550: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e560: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e570: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e580: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e590: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5a0: 0000 0000 0000 44b1 0000 0575 0000 0802 ......D....u....
0006e5b0: 0465 7669 6c00 0000 0000 0000 0000 0000 .evil...........
0006e5c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5f0: 0000 0000 0000 0370 0000 0000 0000 0002 .......p........
…and voilà!
Here’s the resulting disk. Let’s see what other utilities we can crash with it…
I had a hunch that vAmigaDOS would be cleverer than that, and I was right. It notices something is fishy right away. Boooring! :)
That’s Finnish for “Valentines’s Day cheese”. Also, it’s not really “Valentine’s Day” in Finland – ystävänpäivä is more like friends’ day.
Here’s a piece from Finland’s public broadcasting company, Yle, looking at Valentine’s Day rituals around the world. To the Finns, it’s all very romantic, and thus weird. :)
But why cheese? Because it was my inspiration for Yle’s Valentine’s Day Pixel Festival organized by Dan Farrimond a. k. a. illarterate. My thought process went like this:
- Valentine’s Day, what do I draw…
- Hearts, roses, smooching – it’s all a bit cheesy
- Hah!
Yle’s V-day-around-the-world article ends with a teaser for their own Teletext event, featuring these two lovely pieces:
Humppa! If that isn’t my cheese! :)
Take a bite of all the other entries as well. There’s even a raccoon not made by RaccoonViolet!
PS: Any resemblance with the I choo- choo- choose you intro I made a year ago is purely coincidental…
Yuck, what’ this? A ready-made rice-dish sauce with… peaches?
But there’s another “yuck”, something that caught my eye about the “Süß-Sauer” (sweet sour) jar.
Let’s just skip for a moment that by German orthography rules, there is no reason to capitalize the second adjective (Sauer)…
There’s no way this is a regular sharp S – with the straight line going out at the top, it looks more like a capital sharp S! It’s suspiciously wide, too.
If you’re unfamiliar with the aesthetic and historic cosmos surrounding ß and its relatively new uppercase counterpart, I warmly recommend studying Luc(as) de Groot’s excellent write-up. I also rambled a bit about the topic when I designed an 8×8-pixel specimen for Topaz-8.
Granted, the difference can be hard to make out – some fonts don’t care too much about the contrast between the lowercase and uppercase variants. With Georgia, for example, smuggling an uppercase ß between lowercase letters doesn’t look very suspicous. Times New Roman does a better job at that, making the odd capitalization stand out more:
Let’s find out what’s happening with the labels in question. Unleashing the power of modern image-based font recognition, the font in question seems to be Bastia by Jen Wagner. Does this font not have a sharp S? That would be very weird. Does it have an uppercase sharp S, and does it look like the one I spotted at the supermarket?
Of course it has an ß character, and a capital version as well. It actually has a very special sharp S design, alluding to the historic origins of the letter as a ligature of ſ and s, back when the printing press was new. After all, this typeface is marketed as a “retro serif”…
So this is not an overcompensation at all – “Our labels are like a headline, should we use that newfangled uppercase ß we see more and more often?” – but rather a case of typographic fumbling. I bet the conversation went like this:
- That typeface looks neat on our packaging, let’s use it!
- Wait a minute, that ß is too extraordinary for my taste… Now what?
- Let’s screw the typeface designer’s choices and just use the uppercase one!
- Perfect! It’s wrong and looks weird, but who gives a shit!
- Not me, that’s for sure! (packaging designers do a high-five)
So, um, congratulations, Sonnen Bassermann design agency, for this… capital crime in packaging typography! :)
Cool stuff to stumble upon, new and old.
What’s Cool? ·
II ·
III ·
IV ·
V ·
VI ·
VII ·
VIII
- Amiga memories - Shadow of the Beast
Martin Piper’s “mostly Commodore related memories” contain cool reverse-engineering videos about games and demos – using visual inspection tools like C64DebugGUI to take a deep look behind the scenes: what tricks are used to achieve the impossible, etc. Now he’s on to the Amiga, with a deep dive into Shadow of the Beast – and he’s using Coppenheimer for it! - Stories From 25 Years of Computing
Tech blogger Susam Pal shares a retrospective of his career so far. I love these posts, and this one is also entertaining and heartwarming. The “first lessons in HTML” chapter (learning by looking at the source code) gave me nostalgia goosebumps. - The Incredible Overcomplexity of the Shadcn Radio Button
I still like plain HTML, and I’m often skeptical about the complexity modern web frameworks bring along. Of course it’s not all black and white; the software world is full of tradeoffs. While that is certainly true, I think it’s worthwhile to stop and take a good look at the details. So, let’s look at a radio button and reflect! - Teletext Art Compo @ Flashparty 2025
Teletext artist, podcaster, and curator Dan Farrimond uploaded the Teletext compo of last year’s Flashparty in Argentina. A nice rewatch! And I don’t only say that because King Tut XL won me a pretty certificate! :) - Scala Multimedia on the Commodore Amiga
Christopher Drum a. k. a. Stone Tools is at it again: yanking out a classic piece of killer app and working with it like a power-user back in the day. Or like a user of today? His report sure goes deeper than most of the contemporary reviews! Anyway, Scala was (is) awesome, just watch the summary video about this series near the end of the post.
PS: You might also dig the interview with Scala’s founder Jon Bøhmer in Amiga Future.








