		Taxi - Pilot Easter Egg Countdown
			Written by Dale Gass
			dale@ra.isisnet.com

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
dale@ra.isisnet.com
