RISC OS had hidden cookies in it from early on. I heard (although never saw myself) that the early versions of BASIC had a MANDEL command that would generate a Mandelbrot pattern for certain parameters. RISC OS 3.0 had an embedded image of the development team squashed in part of the 'dead' ROM space. RISC OS 3.1 just had a list of contributors when the letters 'TEAM' were clicked on in the TaskManager information box.
The text message in the error template for the WindowManager contained a message "Help! We're being held prisoner in a software factory!". I think there was a further message in one of the other templates as well.
For RISC OS 4, the 'TEAM' list was updated and the error template slightly modified to "We've been released from the software factory and don't know what to do".
Later versions of Select had other cookies hidden in the windows that TaskManager used. As far as I can tell the following are the ones I know about - some of which probably never made it to anywhere else.
- Help! We've been released from the software factory, and don't know what to do!
- I don't love you since you ate my dog.
A track name on the 'Unprogged' compilation album.
- Help! Help! I'm Darren Salt!
- Now we love you since you ate Darren Salt.
- We love you since you ate Darren Salt.
No idea what those were related to - I think Darren did some testing and made some funny remarks, but I couldn't say for definite!
- Can you hear me calling out your name ?
Lyric from 'Everywhere' by Fleetwood Mac.
- Help! Help! The Stealth Monkey is after me!
From during Kinetic development - 'Stealth' was the codename.
- They're funny things, accidents. You never have them until you're having them.
Eeyore quote from my little book of Pooh quotes.
- Yesterday found him today, caught him at his last breath; these walls built
to stand come-what-may, lie shattered in the ashes.
Lyric from 'The Perfect Element' by Pain Of Salvation.
- You claim I don't know you, but I know you well; I read in those ash eyes we've
been through hell.
Lyric from 'Ashes' by Pain Of Salvation.
- If you happen to meet a crocodile, don't stick your head in its mouth. Every
now and then, and who knows the reason, people ignore this advice. Which is
sad because they die, but very stupid because they were warned.
Opening remarks by Lynda Day in the last episode of Press Gang.
- What do you want from me ? It's not how it used to be...
Lyric from 'What Do You Want From Me' by Monaco.
- I've been living for so long; many seasons have passed me by. I've seen
kingdoms through the ages; rise and fall, I've seen it all. Seen the horror,
seen the wonders, happening just in front of my eyes.
Lyric from 'Jillian' by Within Temptation.
- Those days of warm rain come rushing back to me; miles of windless summer nights.
Sacred moments, shared within the heat of the afternoon. Out of the stillness,
soft spoken words...
Lyric from 'I Love You (Always Forever)' by Donna Lewis.
There might be others that I've forgotten, or never made any record of, but those are what I've got listed here. Not all the cookies were particularly great but they were a little something for people to be amused by if they went looking. Admittedly, by the time many were released there weren't that many people who would go looking, but I always found it fun to discover little hidden things.
A quick sampling of the template styles...
There was a final - rather sad - little hidden cookie in the RISC OS 4 release.
Inside the Wimp sprite pool, the '
file_unf' icon had a mask which
bottom half of the sprite. If you turn off the mask there's a little '
hidden there. I'd completely forgotten that I left that there, and it was only
when I was thinking of ways I might hide things that I remembered that there
was one in a sprite.
That particular cookie remained, forgotten and never updated, at least until Select 4.
RISC OS Invaders
The RISC OS Invaders idea came out of wanting something different to make a little mark on things, and give people a little surprise. Matthew and I wanted something very simple that we could embed in a pretty small footprint, and hide in an innocuous location. We worked together in the evenings, using Wimp sprites, although we took advantage of the fact that plotting sprites without translation tables made their colours a little strange.to share the files that we were working on as a master - ah the fun of working without dedicated source control. Using Invaders as a fun thing, we wanted to keep everything simple. That's the main reason it uses just the standard
Within the game itself there were a few extra cookies - I think if you typed a special sequence you got infinite lives, and another gave you a special message. I'm pretty sure that those were both related to Helen, but don't remember any details!
To hide the cookie itself, I placed it inside the IRQUtils module such that it was necessary to start the module manually (with a SWI OS_Module call) in order to start the game. The game itself wasn't particularly hard and most people should have been able to get through the 3 levels (which weren't much more difficult than one another, I believe), to the scrolling message thanking people.
Aside from the changes in the messages in the templates, there were no other cookies - at least none that I remember - in the OS. Although some people were amused by Invaders, there were some who viewed it as trivial, and that we should have spent our time doing other more useful things. Despite the fact that this was evening stuff, which didn't impact on the work-day development, that sort of comment stuck a little.
Also, it's a whole lot less fun coming up with such things when you're working mostly on your own and don't have anyone to bounce ideas off.
Things Not To Do
During the Select 3 developments, I started making notes in file named
ThingsNotToDo/txt'. This was my record of the bizarre,
obscure and downright dangerous things that had been found. There were
more things like that than made it to the list, but these were ones
of note which could cause serious system instability and/or immediately
The entire contents of the file was is enumerated below, and I'll try and give a quick note about the things that I remember about them. My notes, in italic, were not listed in the original file. The faults were fixed in the specified versions of the Operating System.
Things to not do on versions of RISC OS prior to Select 3 (encompassing some changes made for Select 1 and 2) :
- Use 1bit per mask pixel sprites for shallow modes.
The handling in some routines would assume the use of the full masks, resulting in poor rendering in the best of cases, and crashes in the worst cases.
- Use Alt-Break.
Multiple factors conspire to make this very dangerous on a loaded system, causing the wrong task to be paged in, fatally.
- Use Code variables.
Code variables don't use SWI OS_SynchroniseCodeAreas properly, so might fail badly.
- Use sprite redirection (particularly within TaskWindows).
Sprite redirection in some circumstances invoked undefined behaviour for certain operations, and when used within TaskWindows was likely to be fatal as the system switched out the task.
- Use callback handlers.
Just... don't. The order in which callback handlers are dispatched is broken and can result in the wrong handlers being called or handlers never being called.
- Use ColourTrans to render deep sprites.
The blocks returned by ColourTrans could be freed if ResourceFS changed whilst they were in use, as might happen with .
- Change dynamic areas on a transient callback.
A race condition in TaskManager which could cause the system to hang in user mode.
- Use Obey.
Failure to use SWI OS_SynchroniseCodeAreas could cause crashes.
- Set the focus to a transient dialogue.
Register corruption meant that a task which quit with the focus in a transient dialogue would leave windows of the dead task open, with bad consequences.
- Set the focus to a faded icon.
A faded icon can take the focus, but if you try to move out of the icon, the Wimp will hang trying to find a suitable icon to move the caret into.
- Use windows with the 'back window' bit set.
The 'back window' is actually used as a marker for where windows can be moved to when manipulating the stack and if it isn't at the back of the stack you can 'lose' windows from the stack.
- Use MessageTrans on compressed tokens.
Compressed token handling overruns the buffer that it is passed, which could be fatal - and because you cannot identify the keyword uses compressed tokens you cannot save yourself from this issue.
Things not to do prior to Adjust/Select 3i4:
- Create a Toolbox menu with a non-Toolbox object as part of its tree.
Toolbox doesn't expect it and will crash.
- Use High Priority Pollwords.
The wrong poll block was used when high priority pollwords were used, resulting in corruption to tasks (which might not be the task that raised the high priority pollword).
- Set DDEUtils prefixes (still unreliable for Adjust).
The prefixes could affect calls that should never have used them, and missed some cases that they should have been affecting.
- Exit a toolbox application on receipt of certain '
The Toolbox would enter a state where it wanted to return messages to a task that no longer exists, with fatal results.
- Use Fonts in Window objects.
Fonts aren't tracked properly, and using any fonts can result in the Toolbox leaking handles, or accidentally freeing handles which did not belong to it.
- Invoke a TaskWindow and execute code which reads the command line but
does not use FileSwitch.
Obscure, but TaskWindow relies on the behaviour of FileSwitch which was still living in an Arthur world, and could cause the machine to crash fatally in some circumstances.
- Load FileSwitch from within a TaskWindow.
TaskWindow relied on certain other features from FileSwitch which meant that if you reloaded FileSwitch within a TaskWindow you would be guaranteed to be accessing undefined data.
- Hang on to Resolver
hostents (still unreliable).
Resolver could free a
hostentwhich it had just returned if there were other clients using them. This was still unreliable, but improved deferred free of the blocks made crashes significantly less likely.
- Change CSD on ResourceFS (still broken).
The CSD handling in ResourceFS was quite broken; it was improved to just be vaguely broken.
- Execute commands with
Race conditions within the underlying memory shift and execution of system command meant that either the child might fail to start, the parent might crash, or the parent may be corrupted.
free()a block from a C program within an IRQ handler veneer which is already freed or was not allocated with
The handler inside
freefails to understand that it can be in IRQ mode.
- Load the Castle
The module does not handle the transition from 32bit to 26bit for module clients correctly, which can have fatal consequences.
on a 26bit system.
The list gave me some comfort, over and above other records of the bugs fixed, because it reminded me that there were some very dangerous cases that had been addressed and which made the system significantly safer.
We had a survey to find what features people wanted. I had some of the resulting information until a few years ago when I filled a bin bag or two with RISC OS things. I believe that Select releases addressed about a third of them, over time. About half were either application-level things, like Flash players or Browsers, or hardware things, like support for Firewire and Bluetooth.
The application areas were not something we wanted to get into - the Operating System ends about where the basic application suite is. To start producing applications would be outside the remit of the RISCOS Ltd, and certainly outside my goals for the OS. Whilst certain applications are a necessity, the OS could not move into areas that other developers might fill - that would defeat the point of supporting the community.
The hardware areas, where they were specific to particular hardware types weren't an area that I was too hot on, and I didn't think it was a sensible place to start with the uninformed defining standards and implementations. We encouraged the hardware people to work together, or to bring us some common APIs that could be standardised on. Really that didn't happen, though. Pace had an implementation of a USB stack (where the 'stack' was quite limited, but flexible), however it relied on some system-level things like replacing DeviceFS and other things. These were ironed out a little later, but because Castle took it on, there were counter groups who didn't want to deal with it. MicroDigital had promised a lot of things to people, but generally hadn't delivered, or what had been delivered was less than was expected.
In any case, the hardware developments were going nowhere and the likelihood of any parties working together, even (possibly 'especially') with RISCOS Ltd as mediator, was unlikely. The mistrust and animosity between parties seemed to blow over now and then, only to come back with a vengeance a little later behind closed doors. The number of little things that you heard about people, about what people said about other people, and how people were going to make life hard for others, really got frustrating. That applied whether you liked any of the parties involved. And this was the case from very early on.
Anyhow, that digression aside, the feature requests were always going to be a hard thing to match, and whatever I did, I'd never be able to meet them to everyone's satisfaction. There was a separate wishlist on the Acorn Users Wishlist Site, which was quite hilarious to read. I remember David Thomas and I using the site for random things. Suggestions that there be more limes in the OS, and the like were us. My own particular problem with putting a space before a question mark make many of my comments stand out - not that all are me, but it's a good indicator.
Castle, too, did their own surveys of the features that people wanted for the OS, as part of their desktop developments - which I seem to remember being called 'Merlin'. The survey produced some unsurprisingly similar results to those that the RISCOS Ltd one had produced previously, albeit I only ever saw a heavily edited and corrupted summary of the results.