Sierra’s Macintosh Timebomb (2021)
benshoof.org
benshoof.org
https://www.os2museum.com/wp/those-win9x-crashes-on-fast-mac...
''The bug apparently results from the high 32 bits of the clock data type being declared as a 31 bit value instead of 32 bit in the pascal include files. The reason for this is lost to history, but early pascal compilers may have had problems with 32 bit unsigned numbers, possibly because the early Motorola 68000 processor chips didn't have 32 bit unsigned multiply operations.''
There's nothing particularly magical about the Unix epoch.
It's the beginning of time, everything before is Omphalos; even the Omphalos conjecture itself; Unix is meta like that.
When you have to debug the same event reported in five different timezones, and then see some ugly 13-digit numbers and immediately know that's milliseconds since a certain globally-coherent moment… That moment definitely starts to feel magic.
Hmmm, about 2 weeks before the Wall Street Crash of 1929, so I doubt it refers specifically to that.
This doesn't really make sense as an explanation. For both signed and unsigned multiply, the 68000 has a 16x16 -> 32 multiply. This is indeed kind of inconvenient if you need to multiply 32-bit numbers, but 31-bit numbers are not any easier. If anything, the unsigned cases is easier to reason about than the signed one
As our customers for the Turbo Pascal product upgraded their machines, the application started to freeze on launch...
The x86 version, coded in assembly language, works at the right speed regardless of CPU speed. MobyGames has this to say [1]:
> "Alley Cat was one of the few games of the 1980s that was programmed with full attention to different PC speeds. It's an early, old game--yet it runs perfectly on any machine. The reason it runs on any computer today is, upon loading, the first thing it performs is a mathematical routine to determine the speed of your processor, and as of 2003 we've yet to build an Intel PC too fast to play it."
I had a lot of fun with this game back in the day, when I got my first PC, an XT clone (with Hercules graphics card and "amber" monochrome CRT!).
----
The British truly ruled the low-end computer market in Europe back then.
Thank you for bringing this back into my main memory. Spent so many hours playing this and completely forgot about it.
Quick search turned up a couple of sites where you can play this emulated online!
That meant almost every case had that button and people got used to it. That didn’t mean it was always connected - we’re talking a simple cable connecting to a couple of pins on the motherboard so this was trivial - and I knew a couple of people who disconnected it to keep kids or certain hopeless adults from clicking it, forgetting, and then complaining that the computer was slow.
By the late 386/486 era that’d become pretty common and you stopped seeing it as much.
For clarity, because the article takes too long to get there: DIVU has a 32 bit dividend, but a 16 bit divisor and a 16 bit result. So if you try to divide e.g. 0x20000 by 2, the result should be 0x10000, which doesn't fit in the output register. So... the CPU sets the overflow flag but otherwise does nothing!
I'm not quite old enough to have been writing assembly for the 68k, but I've heard this issue before. This was surely not the only footgun situation with DIVU in the market.
Cortex-M and -R have support for div-by-0 faults but it's disabled by default.
The developer should check for overflow before using the value. If this assembly is compiler generated then it's probably classifiable as a compiler bug.
It certainly is a bit of a footgun, because one normally doesn’t expect overflow on integer division. On the other hand, the other basic arithmetic operations all require overflow checks as well, or equivalent operand value analysis. And this is assembly we’re talking about, where you’re supposed to know what you’re doing.
That said, I think this instruction would be safer and more useful if it still set at least the remainder result bits (which should always be valid). Then this case would not require checking, as would some other common cases like 'execute every odd iteration' kind of code.
It was preceded by ADL (Adventure Development Language, which did simple text adventures with graphics) and AGI (Adventure Game Interpreter, which did the same sort of thing as SCI, but lower resolution.)
https://wiki.scummvm.org/index.php?title=Sierra if you want more details.
That's the real punchline here, but well, game development has always been a mess. Automated testing of any kind is still rare, as far as I know.
The bug fix probably should have fixed this ‘for good’, but that shouldn’t require a test, either.
Coffee time.
Gotta love a subtle Mitchell and Webb reference.