This weekend I managed to settle the Pilot's "Car Easter Egg" once and for all. (This was done via Copilot's disassembler and debugger.)
There are two ways to invoke the easter egg, which is known as a "Taxi". (In fact, three flags relating to the Taxi are actually documented in the SDK's header file system/SystemPrv.h.)
Some misconceptions:
It is not related to the auto poweroff at all (although it is related to the current time and the amount of time since last digitizer input). (However, it does use the same auto-off timer to measure how long since the last input occurred; thus, an app calling EvtWakeup() will prevent the Egg from running.)
It is not a memopad-specific egg. Any application which uses nilEvent can exhibit it (nilEvent is an event which an application get have sent to itself at intervals).
It is not related to using the Pilot late at night.
The first way to invoke the egg is as follows:
Set the date to before February 1st, 1996. (I use January 31st, 1996.) Go into the memo pad, entering a new memo (or any application which has a nilEvent; any application which updates things every second is a likely candidate). Now, hold down the PageDown key, and make a stroke from the middle of the graffiti area, going left to the far left of the display (right to the edge). The car will then zoom across. (This is a heretofore undocumented way of getting it; probably a "test mode" used by the developers.)
In the memopad, holding the page-down can cause the app to scroll to other memos; one way to avoid this is to push page-down after starting the graffiti stroke. That is, pen down, push and hold page-down, drag pen to far left.)
The more traditional way of getting the egg is as follows. Be sitting idle in an app (such as memopad's edit mode) which has a nilEvent (i.e. timed event), for at least ten seconds, when a special point in time passes. This point in time is kind of a mish-mash of the current time, and the window of opportunity passes every 17 minutes.
Part of the reason it is seen so seldom is that you have to be idle for at least 10 seconds, and it only happens only 17 minutes. If you used something like FPSutil to set the poweroff to "never", and sat there for up to a maximum of 17 minutes in memopad edit mode, you would see the car. There's yet another reason why it's hard to reproduce:
If the car has been triggered recently (roughly within the past month) via this second method, it will not be triggered (unless a soft-reset has been done, which resets this recently-triggered flag).
Also, there is also another hidden preferences flag which will disable the firing of the car at all (a soft reset seems to do this to me). I haven't narrowed down how this gets set or reset.
It's not surprising that people thought it was triggered by late night usage; that's most often when you're staring blankly at an editing screen, with lotsa ten second delays between entries.
I've written a small app (in Java, using Jump!) which shows how much time is remaining until the next window of opportunity for the Taxi, as well as showing (and allowing modification) of the flags for being temporarily disabled (i.e. recently triggered) and permanently disabled.
If you run the "Taxi" app, turn off both checkboxes, and wait until the timer gets to 0 you will see the Taxi drive across the screen. Be cafeful not to touch the digitizer or the buttons within the last ten seconds, or it won't happen. When the timer gets low (20 seconds or so, is a good point) you can switch to another app such as memopad to see the Taxi run there (again, as long as you've been idle for ten seconds when the counter would have reached 0).
More technical details:
The "approximately a month" for the recently-triggered flag is actually when bit 16 of the TimGetSeconds() count changes.
The magic time when the egg would run if the pilot has been idle for ten seconds, is when bits 17 through 25 exactly match bits 3 through 9 of the TimGetSeconds() count (seconds since Jan 1/1904).
About the only remaining mystery is the above mentioned disable flag (sysPrefFlagTaxiDisable); this flag disables the Taxi. I'm not sure where it gets set or cleared (but I haven't really looked yet).
Dale Gass
Compatibility
| Device: | All |
| OS: | 1.02.0 |
Download
| Version | File | Size |
|---|---|---|
| 1.0 | Taxi.prc | 12K |
| 1.0 | Taxi.txt | 8.0K |











comments