========================================================================
News (latest changes) archive for the Palm OS Emulator
Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries.
All rights reserved.

Please send bug reports, comments, suggestions, etc. to devsupp@palm.com
========================================================================

Changes for 3.1 (03/16/01)
--------------------------
*	Changed Skin file searching rules. Now, when starting up, Poser
	looks for a directory called "Skins". On Mac and Windows, it looks
	for this directory in the same directory as Poser itself. On Unix,
	it looks in $POSER_DIR, $HOME, /usr/local/share/pose, and
	/usr/share/pose, stopping at the first one that has a directory
	named "Skins" or "skins". Once a Skins directory has been found,
	that directory is recursively searched for *.skin files.

	Because the rule change may confuse users, Poser displays a warning
	message on startup if it can't find a "Skins" directory.  This
	warning is displayed only once, so as to not disturb developers
	who don't care a whole lot about skins.

*	If the Skins directory could not be found, display an error message
	at startup. This will tell users that they either need to rename
	their skins directory to "Skins", or to download the skins archive
	from the Poser Web page.

*	Allow the setting of breakpoints in the prologue code of Palm OS
	Manager's that are sub-dispatched. That is, the managers that take a
	selector number and then use a secondary dispatch table to further
	dispatch to the final function. Poser would originally skip over
	this prologue code and jump directly to the final function
	destination. However, one could not set breakpoints on the prologue
	code and have them trigger in that case. Now if any breakpoint is
	installed, Poser jumps to the prologue code. Otherwise, it jumps to
	the final function address like it used to. This modification allows
	people to use the 's' command in PalmDebugger to Step into Palm OS
	functions that are sub-dispatched.

*	(Mac) Updated to CodeWarrior Pro 6.

*	(Mac) Updated to GUSI 2.13 (needed under CWP6).

*	(Mac) Worked around problem in PowerPlant 2.1 that caused the
	highlighting to not always work in text lists in dialogs like the
	New Gremlin dialog.

*	Recalibrated the Palm OS tick-counter to my 500MHz PC. The tick
	counter now runs 3 times slower than before, resulting in 97 ticks
	per second as opposed to the 297 ticks per second I was seeing
	before. The upshot of all this is that repeating tasks (like
	scrolling and holding down the hard buttons) don't zoom by as
	quickly as before.

*	Cleaned up the handling of Poser-detected errors and their
	messages. Before now, if you got an error message for a "soft" error
	(that is, one that is not a hardware exception), Poser would display
	a dialog box containing Continue, Debug, and Reset buttons. If you
	clicked on Debug and there were no debugger, it would be the same as
	clicking on Continue. Now, Poser will merely redisplay the same
	dialog until you click on a different button or a debugger can be
	found.

*	Switched to native "long long" operations in Profiling.cpp (this
	issue was finally forced because someone forgot S64Compare in CWP6).

*	Adjusted the calculated heights for cells in LTextColumnView in
	order to account for the 2 pixel inset LTextColumnView::DrawCell
	uses. Ken noticed that descenders were getting chopped off.

*	Fixed problem in Hordes where specifying a switch depth but not
	specifying a maximum depth (that is, not checking the third check
	box in the dialog) would cause the Hordes mechanism to not actually
	switch between different Gremlin numbers.

*	Implemented support for the timeout values passed to NetLibReceive
	and NetLibSend. Previously, these values were ignored, leading to
	hangs or overly-long timeouts on the desktop that wouldn't appear on
	the device. [Hiroyuki Okamoto]

*	Fixed problems where entering a debugger could cause Poser to
	complain that the PC is being set to an invalid value (mostly seen
	when executing "att" in PalmDebugger). Fixing this problem also had
	the benefit of speeding up emulation by 6%.

*	Would you believe that changing the following in the core emulation
	loop from:

		uint16	opcode;
		opcode = get_iword (0);
		fCycleCount += (cpufunctbl[opcode]) (opcode);

	to:

		uint32	opcode;
		opcode = get_iword (0);
		fCycleCount += (cpufunctbl[opcode]) (opcode);

	sped up emulation by 4%?

*	Poser was relying on a lot of UAE types and routines for basic
	facilities. For instance, Poser had standardized on uae_u8, uae_u16,
	etc., for basic integral types, and get_byte, get_word, put_byte,
	etc., for basic memory emulation. However, all of those are
	UAE-specific. When implementing ARM support, those facilities may
	not be available. Therefore, move those basic types and facilities
	into Poser, give them Poser-ish names, and recast UAE to use those
	genericized facilities.

*	When the SED1376 LCD is turned off, emulate the fact that the bus
	to it is disabled. While disabled, any access to the SED registers
	or VRAM will cause a bus error.

*	Add support for the interrupts caused by the additional sources on
	the DragonBall VZ (UART2, TMR2, PWM2, etc.), and support the
	configurable interrupt levels for those sources.

*	Keep the Palm OS clipbard in sync with the host platform's
	clipboard. After a Palm OS application calls ClipboardAddItem or
	ClipboardAppendItem, the Palm OS clipboard is copied to the host
	clipboard. Before calls to ClipboardGetItem, the host clipboard is
	copied to the Palm OS clipboard. Note that this synchronization is
	not performed if a Gremlin is running so that any data on the host
	clipboard doesn't alter the Gremlin outcome.

	With this change, it should be fairly painless to exchange data
	between the emulated Palm device and the host computer. To copy data
	into the emulated device:
	
		* Copy the text data with Ctrl-C (or as appropriate on Mac or Unix)
		* Switch to the emulated device
		* Make sure you have a field active that can accept text data
		* Press Ctrl-C, then P. Ctrl-C enters the "/" stroke to invoke
		  the "Command" mode, and "P" invokes the Paste command.

	To copy data from the emulated device to the host:

		* Select the text on the emulated device
		* Press Ctrl-C, then C to copy the data.
		* Switch to the host computer application to receive the text
		* Press Ctrl-V (or as appropriate on Mac or Unix).

	Note that data copied to the Palm's clipboard is silently truncated
	to cbdMaxTextLength characters if necessary.

*	Fixed problem where some stack overflows weren't being detected. On
	a LINK instruction, when the stack pointer is decremented to hold
	the old A6 value, we check the stack. However, when the stack is
	decremented again by the value specified by the LINK statement, that
	wasn't being checked.

*	Completely rewrote the error messages generated when an emulated
	application causes (either directly or indirectly) an error. This
	includes both hardware exceptions (bus error, address error, divide
	by zero, etc.) and emulator-detected errors (write to low-memory,
	write to screen buffer, stack overflow, etc.). The new messages are
	intended to be more useful (more detailed information) and clearer
	(more explanatory text).

*	Added new error message to explain cases where it looks like an
	invalid DrawWindow is being used. On Debug 3.5 ROMs, when there is
	no valid DrawWindow, the Palm OS sets the value of the stored
	DrawWindow to 0x80000000. This value causes a bus error. Poser
	detects this kind of bus error and puts up a message saying what it
	really thinks is going on.

*	Added new error message saying that the application is attempting
	to write to the storage heap. Previously, the user would just see a
	"bus error" message.

*	Previously when reporting a hardware exception, Poser would attempt
	to contact a debugger before displaying an error message. Now Poser
	displays an error message first. This mirrors the way other error
	messages are handled. The exceptions to this rule are with Trace,
	TRAP 0, and TRAP 8 exceptions. Those will still attempt to silently
	enter the debugger first. If no debugger is connected, *then* an
	error dialog is posted.

*	Poser used to report certain errors only once per application run.
	The intention was to not pelt users constantly when running an
	application that, say, draws directly to the screen. In an effort to
	get more applications to be more compliant, this one-time-only
	feature has been removed. If you need to turn off those error
	messages, you can still use the Debug Options dialog.

*	After the previously-mentioned changed, an "it's always been there"
	bug cropped up. After reporting a warning like "Application just
	read from low-memory", the developer could click on the Debug button
	and break into an external debugger. From the debugger, they could
	examine the error, and then optionally continue the application's
	execution. However, doing so would re-execute the instruction that
	caused the error. We never saw this before because of Poser's
	feature of reporting such errors only once per application run. But
	with that feature removed, the application keeps breaking at the
	same place. Even with the feature in place, there could be problems
	if the instruction were some sort of pre/post-increment/decrement
	instruction. The first time it was executed, the affected base
	register would get modified. And it would get modified again the
	second time it was executed, even if no error were reported. Anyway,
	that's all fixed now. Now Poser waits for the instruction to
	completely execute before reporting an error so that the PC is
	properly incremented and the instruction doesn't get executed twice.
	The only negative side effect of this change is that the PC will now
	always point to the instruction *after* the one causing the error.
	Most of the time, this will be confusing only if you're debugging at
	the assembly level instead of the source level. However, if the
	opcode executed was last opcode of a source-level statement, the
	source line indicated by the debugger could be the one *after*
	causing the error.

*	The last part of that last paragraph bears repeating: errors are
	now flagged *after* the instruction causing it has finished, rather
	than in the middle of the instruction. This means that the PC
	reported to the debugger will be pointing to the *next* opcode. You
	may need to mentally adjust for this difference in the debugger.
	That is, you may need to look at the previous instruction or source
	code line.

*	Poser keeps a list of Palm OS function names and error code names.
	Updated this list for Palm OS 4.0.

*	Fixed some problems resuming a Gremlin from a saved file when no
	upper event bound has been selected. [Catherine White,
	Llamagraphics, Inc.]

*	(Windows) Work around the fact that connect may return WSAEINVAL or
	WSAEWOULDBLOCK when it really means WSAEALREADY. [Mark Baysinger]

*	(Windows) Provide a default extension when asking to save a file.
	[Mike McCollister]

*	(Windows) Fixed color problems when saving the LCD to a disk file
	when it's in 16-bit mode. [Mike McCollister]

*	Added new command line option: -horde_quit_when_done. Specifying
	this option on the command line will cause the emulator to exit
	after completing a Horde.

*	Fixed problem with the Step Spy feature in PalmDebugger where
	attempting to set a Step Spy address would cause Poser to raise an
	invalid access error message.

*	Additional documentation: HostProfileInit takes two parameters:
	maxCalls and maxDepth. These parameters determine the sizes of
	arrays used to keep track of function calls and call depth. A
	typical value for maxCalls is 65536, and for maxDepth is 200. In
	future versions of Poser, the need for specifying these values may
	be removed.

*	(Mac) Fixed application list in the New Horde dialog. There used to
	be a feature whereby application names would be shown in Japanese if
	running a Japanese ROM on a JLK-enabled Mac. Somewhere along the
	way, this got broken. It should be fixed now.

*	(Mac) Messages strings used to be stored in a 'STRA' (string array)
	resource. However, if an error occurred while handling a packet from
	a debugger, Poser would be unable to access this resource when
	forming an error message. This is because Poser would be operating
	in the context of the debugger. Thus, the debugger's resources would
	be available, but not Poser's. The result of this would be error
	messages with the words "missing string #xxxx" in them. Now, the
	strings are embedded in the application as string constants, the
	same way as is done on Unix.

*	(Mac) Some messages would display missing character symbols (those
	hollow boxes) instead of performing a linefeed/carriage return.
	Fixed.

*	Corrected the spelling in some messages (ran the whole lot through
	a spell checker, I did...).

*	Poser makes calls into ROM functions from time to time in order to
	get information or perform some operation. Poser has known for a
	long time to skip breakpoints in those functions when they're
	executed in this fashion. Now Poser also skips DbgBreaks (TRAP 8s)
	and Trap Breaks (from PalmDebugger's ATB command) as well.

*	(Mac) Translate high-ASCII characters when exchanging the Mac
	clipboard with the Palm OS clipboard.

*	(Mac) Fixed problem where certain high-ASCII characters (CENT SIGN,
	POUND SIGN, COPYRIGHT SIGN, PLUS-MINUS-SIGN, and MICRO SIGN) weren't
	getting translated correctly into the PalmLatin code page.

*	Added checks for accesses to form, form object, and window data
	structures from applications. In general, all access is prohibited.
	The following exceptions are allowed:

		=======================	===========	==========================
		struct/field			access type	When direct access allowed
		=======================	===========	==========================

		WindowType
			displayWidthV20		read only	before Palm OS 2.0
			displayHeightV20	read only	before Palm OS 2.0
			displayAddrV20		read only	before Palm OS 3.5
			bitmapP				read only	before Palm OS 3.5
			frameType			read/write	always

		FormType
			handler				read only	always
			helpRscID			read/write	always
			defaultButton		read/write	always

		FieldType
			lines				read only	if AccessorDispatch not present
			attr				read/write	before Palm OS 3.3

		ControlType
			attr				read only	if AccessorDispatch not present
			style				read only	if AccessorDispatch not present

		ListType
			attr				read/write	always
			topItem				read only	before Palm OS 4.0

		TableType
			numRows				read only	before Palm OS 4.0
			numColumns			read only	before Palm OS 4.0
			topRow				read only	before Palm OS 4.0
			rowAttrs			read only	always
			columnAttrs			read only	always
			items				real only	always
			attr				read/write	always
			currentRow			read/write	before Palm OS 4.0
			currentColumn		read/write	before Palm OS 4.0

		FormBitmapType
			attr				read only	if AccessorDispatch not present

		FormLabelType
			attr				read only	if AccessorDispatch not present

		FormGadgetType
			attr				read only	if AccessorDispatch not present
			attr				read/write	before Palm OS 3.5

		ScrollBarType
			attr				read only	if AccessorDispatch not present
			attr				read/write	before Palm OS 3.5

	WARNING: use of this option may dramatically slow down your
	application's performance.  You may want to make use of this
	feature on a limited basis until the next relesae of Poser,
	which will speed things back up again.

*	Added check for accesses to the unused portion of the stack.

*	Removed unused checkboxes from Debug Options dialog, and added or
	enabled checkboxes for the new features.

*	Calling DbgMessage when no debugger was around to receive the
	message could crash Poser. Now, if no debugger is attached, the
	message is displayed in a dialog box.

*	When presented with an error dialog box, you can press Cmd-C (Mac),
	Alt-C (Unix), or Ctrl-C (Windows) to copy the error message to the
	clipboard. Note that on Unix, the cursor needs to be over the error
	dialog box in order for the keystroke to be sent to the dialog box.

*	Rewrote the Breakpoints dialog as a cross-platform dialog, thus
	making it available on Mac and Unix as well.

*	When a StepSpy condition (as established by PalmDebugger or any
	other debugger using the relevent fields of the Continue debugger
	packet) is triggered, or a Watchpoint condition (as established by
	the Breakpoints dialog) is triggered, display a dialog box
	describing what just happened, much like what happens on other
	memory access error dialogs.

*	In checking the stack pointer against the low end of the stack or
	when checking for memory accesses between the low end of the stack
	and the stack pointer, Poser needs to know where the low end of the
	stack is. Previously, it would just assume that the entire Memory
	Manager chunk containing the stack pointer was used for the stack
	and so the start of the chunk was the low end of the the stack. This
	assumption was incorrect for some applications (particularly
	background applications in the Palm OS) that would allocate a memory
	block for use as "instance data" that also included an embedded
	array for use as a private stack. In order to account for those
	applications, Poser now also monitors calls to SysTaskCreate, which
	is passed a stack starting address and size as parameters.

*	(Unix) Mapped ESCAPE to most dialog Cancel buttons.

*	(Unix) Made clicking on the dialog's Close box in the title bar the
	same as pressing ESCAPE. If a button with an ESCAPE shortcut could
	not be found, then pretend the user clicked on the Cancel button.

*	Re-implemented the Export Database dialog as a cross-platform
	dialog. Added code to check for .pqa databases and tack on ".pqa"
	instead of ".pdb" when forming the default filename.

*	(Mac) Poser implements the LEventDispatcher::UpdateMenus method to
	update the session and database MRU sub-menus. However, this method
	is called all the time, and since building those menus can be time
	consuming, UI responsiveness is impacted. Now Poser just rebuilds
	those menus when the MRU lists actually change. The drawback to this
	approach is that the sub-menus could be incorrect if the files they
	correspond to are deleted from the file system.

*	Extended -horde_apps command line parameter to take an "exclusion
	modifier". If the list of application names is preceded with a dash
	(e.g., "-Prefs,HotSync"), then all applications are available to
	Gremlins *except* those applications.

*	Loading a session file used to involved installing the HotSync User
	Name that's specified in the Properties/Preferences dialog. That
	direction is now reversed. When a session is loaded, the HotSync
	User Name is extracted from the session and installed as the
	emulator preference. This allows you to specify different users in
	saved sessions and have those restored when you reload those
	session, as opposed to all sessions -- new and reloaded -- having
	the same user name. [Scott Maxwell]

*	Fixed long-standing bug where reloading session files created on
	previous days did not get their system date updated. The time would
	be correct, but the date would the the date on which the session was
	created (or whatever was established by the last use of the Date
	preference panel). [Scott Johnson, Paul Nevai]

*	Better hard key emulation. On an actual device, pressing a key on a
	sleeping device would trigger an edge-sensitive INT[3:0] interrupt.
	Normally, this by itself won't wake up a device. However, a KB
	interrupt can also be generated, and this interrupt will wake up a
	device. Poser, on the other hand, ignored the fact that
	edge-sensitve INT[3:0] interrupts weren't supposed to wake the
	device, and it also failed to support the KB interrupt. Thus, on a
	device, pressing a key to wake up the device would succeed because
	of the KB interrupt, while on Poser it would succeed because of
	Poser's incorrectly waking the device on an edge-sensitive INT[3:0]
	interrupt. In Palm OS 4.0, INT[3:0] interrupts are actually maked
	off when the device is asleep, and so pressing keys to wake the
	device would utterly fail. Poser now supports the KB interrupt, and
	devices wake up again under Palm OS 4.0.

*	Added serial port -> TCP socket mapping. You can now redirect
	emulated serial communications to a socket connected to another
	application running on the same or different host computer. On Mac
	and Windows, in the Properties/Preferences dialog, select the TCP
	menu item. This will enable the Target edit text item, wherein you
	can enter an IP address:port (e.g. localhost:7777). On Unix, there
	is no menu item for selecting a serial port; there's just an edit
	text item. Normally, you'd have something like /dev/ttyS0 there. But
	you can replace this with an IP-looking address (e.g.,
	localhost:7777), and Poser will recognize the difference and act
	accordingly.

	When opening the emulated Palm serial port, Poser will open a
	corresponding socket. It will first try to connect to another socket
	at the given address. If that fails, it will revert to "server"
	mode, and listen for connections on the given port.

*	Re-implemented the Preferences/Properties and Tracer Options
	dialogs as cross-platform dialogs.

*	Added HostSessionSave.

		HostBoolType HostSessionSave(const char* saveFileName);

	The session will be saved to a file with the given name. Regardless
	of whether or not the save attempt succeeds, the function returns
	false. When the session file is reloaded, execution resumes at the
	point where HostSessionSave is returning. In this case, the function
	returns true. This can be handy if have debugging code that can
	detect an invalid condition, and you want your debugging harness to
	save a session file for a later post-mortem. When you reload that
	snapshot later, you can break into a debugger. For example:
	
		void MyFunc (void)
		{
			// Check to see if our application's data is internally
			// consistant. If not, save the state for later analysis.

			if (ASSERT_VALID () == false)
				if (HostSessionSave ("c:\\temp\foo.psf"))
					DbgBreak ();
		}

*	Changed the type of the second parameter to HostTraceOutputB from
	"const unsigned char*" to "const void*". [Ben Combee]

*	When a Gremlin is running and -- for whatever reason -- the device
	goes to sleep, wake it up by pretending the user pressed the Power
	button.

*	Give the Gremlin fake event generation mechanism a 1% chance of
	generating a vchrAutoOff event. This is the same chance given to it
	generating a vchrKeyboard event. [Mike McCollister]

*	Added facilities for resolving aliases (Mac), links (Unix), and
	shortcuts (Windows).

*	Added profiling support for BSR opcodes. [B. CAMERON LESIUK]

*	(Windows) Provided better error message when trying to create bound
	emulators on Windows 95, 98, and ME. [Gregory Allen Gaub]

*	Added support for system extensions that reside in RAM. Normally,
	Poser treats code executing in RAM as "application" code, and
	prohibits it from accessing areas of memory reserved for the
	operating system. However, this approach prevented user-installed OS
	components that reside in RAM (such as OS patches and updates).
	Poser now recognizes those components and allows them access to
	memory in the same way it allow the OS in ROM to access memory.
	Components that Poser recognizes are system patches, system
	extensions, and libraries with Palm creator IDs.

*	Updated copyright messages to include 2001.

*	Updated ROM Transfer to print slightly better messages on errors.
	For instance, instead of displaying #773, it will display "timeout".
	Similarly for all other serial manager error codes.

*	Updated ROM Transfer to use the Serial Manager instead of the
	Serial Driver Library when available. Will also use Palm OS 4.0
	SrmExtOpen call if available.

*	Fixed problem where Poser could read off the end of the ROM image
	when trying to determine what type of device it's for (when building
	the Device menu in the New Session dialog). [John Ludwig]

*	(Unix) Set the default device in the ROM Transfer dialog to
	"/dev/ttyS0" in order to impart to users what type of data should be
	entered here. Because different Unixes have different device names
	for their serial ports, the default may not be correct. But it
	should get the idea across, preventing users from entering just "0",
	for example. [Bob Marcum]

*	Added Prism and Platinum support. [James Phillips, Handspring]

*	Updated Profiling operation rules.

	When using the menu commands, the following rules are used:

	* System starts with only Start enabled.

	* Selecting Start starts profiling executed code,  initializing
	  the profiling system first if necessary. After selecting Start,
	  Stop and Dump are enabled.

	* Selecting Stop suspends the profiling of executed code. After
	  selecting Stop, the Start and Dump menu items are enabled.

	* The user can select Start and Stop as many times has he wants.
	  Always, the other menu item will end up being enabled, as well
	  as Dump.

	* Selecting Dump first Stops any profiling (if necessary) and then
	  writes data collected while profiling to files on disk. After
	  selecting Dump, only the Start menu item is enabled.

	When using the HostControl calls, an analogous set of calls can take
	place. The only difference is that HostProfileInit can be called
	before the first call to HostProfileStart or after HostProfileDump
	in order to specify any custom parameters. If any HostProfile* calls
	are made out of sequence, the error code hostErrProfilingNotReady is
	returned. [Michael Nordstrom]

*	Updated HostProfile* functions along the same lines. If a
	HostProfile* call is made out of sequence, it will return
	hostErrProfilingNotReady.

*	Enable/disable Gremlins menu items correctly.

*	(Windows) Added platform-specific support for HostSaveScreen. [Bill
	Kirby]

*	(Windows) Added multiple monitor support. Mostly this means that
	the device window won't always reposition itself on the primary
	monitor. [Thomas Hagen Johansen]

*	(Unix) Added $X_CFLAGS to espws build flags. [John Ludwig]

*	(Unix) Removed -L/usr/lib from link path (leaving just
	/usr/local/lib). Both of these were added on Jan. 8, 2000,
	apparently in response to Ralf Zimmerman's comments on
	emulator-forum ("Re: Problem while compiling POSE 3.0a3 on Linux",
	posted Dec 28, 1999). However, adding /usr/lib may have been
	overkill, since doing that hides any custom tools in /usr/local/lib.
	[John Ludwig]

*	When checking the validity of databases before installing them, now
	also check the database's creation and modification dates. Poser
	doesn't care about these and neither does the Palm OS, but some
	versions of HotSync complain if the creation date is more recent
	than the modification date or if the creation date is zero, so
	display a warning if either of those cases is true.

*	In 3.0a8, code was added to automatically change use of
	207.240.80.136 (the old proxy address) to 209.247.202.106 (the new
	proxy address). Well, those addresses are changing again. Instead of
	hardcoding the address this time, Poser now looks up the address,
	using the name "content-dev.palm.net" (or "content-dev2.palm.net" if
	that one's not available).

*	Made the ROM transfer process more robust. Modifying the ROM
	Transfer application and the Emulator to randomly corrupt data and
	drop characters at a higher-than-normal rate showed problems with
	the transfer process's ability to recover from transmission errors.
	Those should all be fixed now.

*	With NetLib Redirection on, recv() is called as the underlying
	implementation of NetLibReceive. If recv() returns EGAIN, map it to
	netErrWouldBlock.  [Chad House]

*	A bug in an internal ROM function in Palm OS 3.5 and 4.0 causes the
	message "Background must be at least half as wide as slider." to be
	displayed under the opposite conditions that it should be.

*	Plugged a hole that could cause Poser to hang.  Occassionally,
	Poser needs to suspend emulation so that it can make it's own
	calls to Palm OS functions (it does this, for example, when building
	the list of applications that appears in the New Gremlins window).
	Because suspending emulation between any two opcodes and inserting
	a call to a Palm OS function can be disruptive (for instance, the
	Palm OS function may change the state of the heap in a way that
	would never happen on a real device), Poser tries to first halt
	emulation at a safe stopping point.  This stopping point use to be
	at the next call to a Palm OS function.  However, even that's not
	safe enough.  If, for example, the Memory Manager semaphore were
	acquired when emulation was suspended, and the call Poser was making
	tried to acquire the semaphore, then Poser's call could block, waiting
	for the semaphore to be released.  Because emulation is suspended,
	that will never happen, and Poser hangs.  So now, in addition to
	suspending emulation on a system call, Poser also makes sure that
	the Memory Manager semaphore is available.  This change should fix
	a number of mysterious Poser hangs, including some that occur when
	downloading a file for debugging in CodeWarrior.


Changes for 3.0a8 (11/17/00)
----------------------------
*	Added Dragonball VZ support.

*	Added SED1376 support.

*	Fixed (again) the problem with the Palm IIIc screen not getting
	redrawn after turning the power off then on.

*	Palm devices since the Palm III have an A-to-D converter (ADC)
	called the Burr-Brown ADS7843.  Until now, Poser did no emulate this
	hardware, and so patched the OS routines that tried accessing it,
	causing them to return sensible values anyway.  Poser now emulates
	the ADC, and so no longer needs to patch certain traps.

*	Removed spaces from ROM Transfer file names.

*	In 3.0a7, added ability to pass-through keyboard modifiers to the
	Palm OS.  However, I forgot to implement this on non-Windows
	platforms.  Fixed that oversight.  [Dave Johnson]

*	(Unix) Fixed problem where you could save a screen shot only if the
	target file already existed.  [Michael Nordstom]

*	(Unix) Allow multiple .prc (et al) files to be loaded at the same
	time from the "Get File" dialog.  [Michael Nordstrom]

*	(Unix) Updated Gremlins menu items after a Gremlin has been
	started.  [Michael Nordstrom]

*	(Unix) Remember last-accessed directory when the File dialog is
	presented, and re-show that directory the next time the dialog is
	displayed.  [Michael Nordstrom]

*	Fixed inability to use serial port when emulating the EZ-based Palm
	VII or the Palm VIIx.  [Jason Simpkins]

*	Added support for RTS_CONT bit in the Dragonball UART register.
	This gives better support for applications doing hardware
	handshaking.

*	Before closing the host serial port in response to the emulated
	UART being shutdown, make sure that all locally buffered data is
	transmitted.

*	Worked around that d*** bug in Palm OS 3.3 that would cause it to
	overflow the kernel stack on a reset.  Now, if Poser detects a stack
	overflow and it's the kernel stack, Poser lets it overflow into the
	interrupt stack (which appears right below it in RAM); Poser just
	holds off interrupts for as long as the stack has overflowed.

*	Map Ctrl-P to vchrPrevField, to match Ctrl-N mapping to
	vchrNextField. [Ben Combee, David Slotter]

*	(Mac) Worked around problem with items in progress dialogs not
	showing up immediately (or, sometimes, at all).  For instance, in
	the dialog tracking the progress of the installation of databases,
	the Cancel button and "Files remaining" text didn't appear until
	after the first file was completely installed.  I now manually
	activate and update the dialog after making it visible.

*	Hide a Palm OS 1.0 bug that would access memory location 0xC2 in
	HwrSleep.

*	(Windows) Support double-clicking on a .rom file in order to launch
	Poser.  Before, doing this would crash Poser, as it thought the file
	was a session file.  Note that you need to run Poser once by itself
	first in order to update the appropriate Registry entries.

*	Fixed problems with Poser allowing access to certain system globals
	from certain RAM-based functions (such access is usually
	disallowed).  The affected globals were tsmFepLibStatusP and
	tsmFepLibRefNum, which can be accessed by the glue function
	TsmGlueGetFepGlobals.

*	Secure Web-based transactions would result in Poser displaying an
	error message about memory accesses to "unallocated memory",
	"unlocked memory", "memory manager data structures", etc.  These
	messages are now no longer displayed.

*	Fixed Palm Debugger fb, fw, fl and ft commands.  Poser's response
	to the Find debugger packet was incorrect.  [Bob Petersen]

*	Fixed removal of breakpoints.  Poser was disabling them instead of
	out-and-out removing them.  The effect that old breakpoints would
	re-appear, albeit disabled, in PalmDebugger.  [Bob Petersen]

*	Reimplemented HostFSetPos and HostFGetPos in terms of fseek and
	ftell.  Previously, they were implemented in terms of fsetpos and
	fgetpos, but those functions aren't portable, in that the definition
	of fpos_t changes from platform to platform.

*	Merged in TRGpro support from TRGnet.  [Dan Smith]

*	(Internal) Massive rewrite of the core emulation/session handler.

	Previously, a single sub-system was responsible for creating,
	loading, saving, resetting, and freeing sessions; emulating the
	Dragonball core instruction set; and taking care of "Palm OS
	smarts", where checking based knowledge of how the Palm OS and Palm
	OS applications was used to enforce correct behavior. Additionally,
	the interface to this massive, heterogeneous sub- system was
	different depending on whether Poser was being built for a platform
	that supported multi-threaded applications or not.

	Now that's all been changed.  There's an EmSession sub-system that
	takes care of processor- and platform-independent session creation,
	deletion, etc.  There's an abstract EmCPU class and a concrete
	EmCPU68K subclass responsible for emulating the 68xxx instruction
	set.  And there's an EmPalmOS sub-system responsible for knowing how
	the Palm OS works and enforcing correct behavior.

	With these changes, Poser should be in a better position to support
	different processors (like ARM) and operating systems (like Linux,
	or even future versions of Palm OS that operate significantly
	different from the current one).  And with a more unified interface
	to these new sub-systems, the higher levels of Poser can now also be
	rewritten to be more cross-platform.

*	(Unix) Fixed (finally?) problem with LCD not appearing to turn off
	when the power button is clicked to turn off the emulated device.

*	(Unix) Resize and relayout the generic error message dialog box,
	instead of putting the (could be long, could be short) error text in
	a scrollable field.

*	If INetLib tries creating its default preferences with a proxy
	server address of 207.240.80.136 (an old, obsolete address), replace
	it with 209.247.202.106 (the current address).

*	Fixed support for loading Palm VIIx ROM images downloaded from an
	actual device (as opposed to the ROM images on the www.palmos.com
	site).  The problem was that the code used to determine what device
	a ROM image is intended for was tripping up on that image's format,
	and so misidentified the ROM.

*	(Windows) Fixed crash that could occur when clicking on some
	Logging Options dialog buttons.

*	Let the Palm OS function dns_decode_name read off the end of a
	buffer.  I'm not sure yet why this happens, but until I do, let it
	happen.  Otherwise, developers will be presented with an error
	dialog they can't do anything about.  [Doitchinov Ivan]

*	Cleaned up, simplified, and robustified the mechanism used to
	implement the AutoRunAndQuit directory feature.  Poser used to have
	a complex and (apparently) fragile mechanism for tracking calls to
	SysUIAppSwitch, SysAppLaunch, SysAppStartup, and SysAppExit in order
	to make sure that when the desired application exitted that Poser
	quit.  That's all been thrown out.  Now, when an application quits,
	Poser merely checks (in SysAppExit) to see if its cardNo and dbID
	match that of the target application.

*	Fixed problem with logging posted/received events with Japanese
	ROMs on Little-Endian host computers.  Poser wasn't byteswapping the
	event data, and so was trying to fetch some data at the wrong memory
	location.

*	Address two of the three cases where calling a Palm OS function
	which causes an exception can crash the emulator:

		1. When handling an RPC call (e.g., try "hd 3" from
		   PalmDebugger).
		2. When calling a Palm OS function in a trap patch.

	We still don't handle the third case:

		3. When calling a Palm OS function in the UI thread (e.g., when
		   building the Gremlin application list).

*	When a hardware exception (such as a bus error) occurs, Poser first
	tries to contact any attached debugger.  If it can't find one, it
	displays an error message containing Debug and Reset buttons.
	Pressing Reset will reset the device.  Pressing Debug will try again
	to contact a debugger.  If it continues to fail, it continues to
	display the same dialog, until either the user presses Reset or a
	debugger is finally found.

*	(Mac) Added two new HostControl functions:

	HostProfileGetCycles()
		Returns the current running CPU cycle count.  As with all
		profiling-related HostControl functions, this one is available
		only in the profiling version of the emulator.

	HostSaveScreen(const char*)
		Saves the LCD frame buffer to the given file name.

*	For its own purposes, Poser tracks memory allocations and de-
	allocations in the Palm OS dynamic heap.  In general, except when
	the Palm OS dynamic heap is in flux (because an allocation or
	deallocation is in process), Poser's notion of the heap state should
	match Palm OS's.  However, Poser was failing to keep its notion in
	sync with Palm OS's in the case where a memory allocation was
	requested and failed.  It was possible for the heap to be compacted
	and for Poser to not notice and sync up with that compaction.  This
	error could lead to Poser reporting errors when it shouldn't or not
	reporting errors when it should.

*	Fixed problem where Poser could crash if the emulated application
	tried accessing memory location 0xFFFFFFFF.

*	Fixed problem with the appInfo block not getting installed if the
	.pdb file being installed didn't have any records in it.


Changes for 3.0a7 (8/7/00)
--------------------------
*	Added m100 support.

*	Added Palm VIIx support.

*	Implemented the following previously defined but unimplemenated
	HostControl functions: HostMalloc, HostRealloc, HostFree,
	HostRename, HostRemove, and HostTmpNam.

*	Added the following HostControl functions: HostStat, HostTruncate,
	HostMkDir, HostRmDir, HostOpenDir, HostReadDir, HostCloseDir,
	HostAscTime, HostClock, HostCTime, HostGMTime, HostLocalTime,
	HostStrFPrint, HostTime, and HostUTime.

*	Added the following HostControl functions: HostSlotMax,
	HostSlotRoot, and HostSlotHasCard.

*	Added Card Options dialog.

*	Renamed a bunch of HostControl types to follow Palm's naming
	convention of having types end in "Type".  Added typedefs for
	backward compatibility with applications using the old type names.

*	When a session is reset, all HostControl resources are reclaimed.
	That is, any blocks allocated with HostMalloc are freed, any files
	opened with HostFOpen are closed, any directories opened with
	HostOpenDir are closed, and any pointers to returned string buffers
	(as with HostGetEnv) are now invalid and the buffers are
	inaccessible.

*	After creating a handle with MemHandleNew, locking it, remembering
	the pointer, and then freeing the handle with MemHandleFree, the
	application could write to the freed block using the now-stale
	pointer.  Fixed.  [Neil Rhodes]

*	Support TsmGlueGetFepGlobals accessing system globals.

*	Updated URLs to point to www.palmos.com.

*	Fixed double-dispose bug when handing the getting or setting of a
	linger-related socket option.  The symptom of this bug is that Poser
	would crash when calling NetLibSocketOptionGet(...netSocketOptSock-
	Linger...).  [Peter Burka]

*	Fixed problem in NetLibSendPB when NetLib redirection is turned on;
	the various parameters weren't converted correctly into something
	the host TCP stack could use.  [Rob Leslie]

*	(Unix) Added dynamic check for socklen_t in configure.in.  [Radu
	Cornea]

*	Internal change: added new support classes: EmPoint, EmRect,
	EmRegion, EmRefCounted, EmRefCounter, and EmPixMap.

*	Used the preceding classes in rewriting the pipeline that converts
	the LCD framebuffer into something that can be displayed on the host
	screen.  These changes (a) better insulate much of Poser from the
	specifics of the LCD framebuffer format, (b) reduce the amount of
	platform-specific code needed to create a bitmap that can be blitted
	to the host screen, and (c) result in slightly faster emulation.

*	Poser makes use of the following as a compile-time assert:

		char _dummy[expr ? 1 : 0];

	If (expr) is true, then the compiler evaluates the stuff inside the
	brackets as 1.	Otherwise, the compiler evaluates it to zero,
	resulting in the invalid definition of a zero-sized array. However,
	unbeknownst to this poor programmer, gcc allows the definition of
	zero-sized arrays as an extension.  Therefore, all instances of the
	above technique have been changed to COMPILE_TIME_ASSERT(expr),
	where COMPILE_TIME_ASSERT is a macro that expands to something like:

		char _dummy[expr ? 1 : -1];

	Even gcc complains about that one.  [Frank Yellin]

*	Now that we have a working compile-time assert, a number of errors
	popped up.  Part of the NetLib redirection facility involves
	translating between NetLib data structures and host TCP (sockets)
	data structures.  The process of translating back and forth assumed
	that various structs and constants between the two systems were the
	same and could be copied back and forth without any interpretation.
	This assumption was backed up by compile-time asserts.  But those
	asserts were broken.  Now that they're working, it was found that
	many assumptions were bad and/or wrong.  Therefore, much of the
	translation code was rewritten to remove those assumptions.  [Frank
	Yellin]

*	(Unix) Turn on -fexceptions unconditionally.  While this is on by
	default for C++, we now turn it on for C, too.  Poser seems to need
	this on Solaris/Sparc systems.  [Frank Yellin]

*	(Unix) Implemented Save Screen... menu item.  Files are saved to
	.ppm format.

*	(Internal) Implemented EmDlg::DoGetFile, DoGetFileList, DoPutFile,
	and DoGetDirectory on all platforms, and use them universally.

*	Added HostGetFile, HostPutFile, and HostGetDirectory.

*	(Unix) Use new "FileChooser" widget from Easy Software.  This one
	will probably get incorporated into FLTK 2.0, and it just plain
	looks and works nicer anyway.  [Easy Software]

*	Patched TblHandleEvent to fix a Palm OS 3.5 bug where the drawing
	state would eventually become invalid, resulting in incorrect
	drawing and possible ErrDisplays from the OS.  [Tom Bulatewicz]

*	Inhibit error checking in NetLibBitMove.  This function sometimes
	accesses bytes past the end of an allocate block of memory,
	resulting in a Poser error message, usually while using PQAs.  As it
	turns out, it does this in a fairly safe fashion, so prevent the
	error message from appearing.

*	(Internal) Use new method to access low-memory Palm OS System
	globals -- one based on the EmPalmStructs mechanism.

*	The progress dialog that's displayed when installing files has
	changed.  The progress indicator is now modelled after the Macintosh
	file copy progress dialog; instead of having two indicators -- one
	for files and one for the current file -- the single progress
	indicator now indicates overall progress for all files being
	installed.  Also, the Stop button now works.  Finally, the progress
	dialog is now also implemented on Unix.

*	Enabled logging of Exchange Manager actions (just calls to ExgSend
	and ExgReceive).

*	(Internal) New Session dialog is now implemented using cross-
	platform techniques that Poser is slowly moving towards.  This
	change results in consistant behavior of the dialog across
	platforms.

*	(Unix) "configure" script now supports "--with-fltk=DIR" command
	line option. [Arturo Tena]

*	Poser contains facilities for extracting the "Macsbug" symbols that
	can be appended to compiled functions for debugging purposes. It
	finds these symbols using heuristic methods that don't always
	succeed.  If they fail, fail gracefully.  [Adam Dingle]

*	Fixed problem where turning off the "power" to a Palm IIIc would
	blank the LCD, but turning the "power" back on would not redraw the
	LCD.  [Bob Petersen]

*	Fixed implementation of Perl wrapper for HostImportFile and
	HostExportFile.  [Derek Johnson, Andy Ihlenfeldt, John Ludwig]

*	Poser would crash if you passed a full path to HostProfileDump
	instead of just the name of a file.

*	Ensure that the binary file produced by profiling an application
	ends with .mwp.

*	Include keyboard modifiers when posting key events from the host
	computer's keyboard.  [Ken Krugler]

*	Changed "New Session" dialog to use MRU list for ROM Files, and not
	present devices for selection that cannot possibly run the chosen
	ROM File.

*	Updated CodeWarrior projects to CodeWarrior 5.3 (IDE 4.0.4).

*	Fixed problem with lack of responsiveness in mouse-click handling.
	The problem was that there was only a 1-element queue, as it were,
	for handling mouse-clicks.  It was too easy for the user to click
	the mouse and let up on the button before the emulated Palm OS had a
	chance to even recognize that the mouse button was down.  Now there
	is an n-element queue to handle mouse ups/downs.  I had originally
	stayed away from that because I thought that it would be too easy
	for the user to overrun the event queue, zooming the mouse around
	faster than the Palm OS could keep up.  But we'll see how this works
	out.  Note that the hard buttons across the bottom of the the
	emulated device can still be unresponsive.  That's because there's
	no queuing involved; the mechanism for handling them is different
	from that used to handle events in the LCD area, and can't easily be
	converted to do so.

*	(Unix) Fixed problem with specifying desktop serial port to use for
	ROM Transfer.  [Rick Richardson]

*	Catch a whole class of problems where Poser didn't detect when the
	emulated program counter went bad.  [Eugene Chin]

*	Fixed byteswapping problems with creating the binary output file
	for profiling.  Such a file created on Windows couldn't be read into
	MW Profiler on a Mac.  [Greg Simon]

*	(Internal) Rewrote all of the emulation code that deals with
	hardware registers (such as the Dragonball registers).  There were
	many subsystems that had to deal with memory in this way (the
	Dragonball (328, EZ) register handlers, the SED register handlers,
	the Visor USB register handlers, the Palm VII EZ PLD register
	handlers, the Sybol ASIC register handlers, etc.).  All of these
	subsystems originally were just cloned from each other and tweaked.
	This lead to a lot of duplicated code.  All that's now been changed
	so that the common code is in EmBankRegs, and the hardware-specific
	code is in subclasses of EmRegs.

*	(Mac) Fixed crash that would happen when clicking on the mailto URL
	in the Palm section of the About box.

*	The Field Manager in Palm OS 1.0 - 3.2 has a bug that causes the
	message "Invalid insertion point location" to be erroneously
	displayed. Added a patch to ErrDisplayFileLineMsg to squelch this
	message if it looks incorrect.  [Stephen P. Hill, David Kendall]

*	(Mac) Updated to GUSI 2.1.1, fixing a bug in HostFOpen, where
	creating the file ":x:y" would create a file called "x" if the
	directory didn't exist.

*	(Unix) Re-arranged checks at bottom of EmulatorTypes.h to allow
	for definition of INADDR_LOOPBACK.  [Jon Fo]

*	(Unix) Specify -fpermissive to gcc to support broken X11 headers.
	[Jon Fo]


Changes for 3.0a6 (4/19/00)
----------------------------
*	(Unix) Support POSER_DIR environment variable. If this variable
	exists, Poser uses it as the root for all files it uses (including
	preferences, Gremlin States, log files, and skin files). Otherwise,
	it uses HOME.

*	External skin support. A "skin" is something that defines the
	appearance of an application. Palm OS Emulator uses skins for each
	device that it emulates. Until this release, skins were built into
	Poser and couldn't be changed without recompiling the application. 
	Now, skins are stored in external files that Poser locates and uses.

	When starting up, Poser looks for a directory starting with the text
	"Skins" (that is, it may be "Skins", "Skins.Palm", "Skins.Personal",
	etc.). Poser looks for all such directories in its own directory
	(that is, the directory in which it resides on Mac or Windows, or
	POSER_DIR on Unix), as well as that directory's parent and
	grandparent directories.

	For each such directory it finds, it scans the contents for files
	ending with ".skin". These files are text files that describe the
	skin. Associated with each .skin file are two graphics files that
	define the appearance of the skin (in single and double size mode).

	All of Poser's previously built-in images are now provided
	seperately in a Skin archive available on Poser's Web pages. This
	archive includes a ReadMe.txt file that describes how to create your
	own skins.

*	Internal change: as part of the skin implementation, a number of
	file handling and streaming classes were replaced with a new, more
	consistant set. The following classes:

		FileReference
		StreamHandle
			BufferHandle
			FileHandle
		PPStream
			ChunkStream

	Have been replaced with:

		EmDirRef
		EmFileRef
		EmStream
			EmStreamBlock
			EmStreamChunk
			EmStreamFile

	Testing note:

		All File I/O is affected by this change. The following places
		need to be tested to make sure they're not broken:

			Reading
				AutoLoad, AutoRun, AutoRunAndQuit directories
				Files specified to be loaded via cmd line.
				Loading PDB, PRC, and PQA files.
				Loading skin files (.skin and .jpg files).
				Loading Preference file
				Loading PSF files
				Loading ROM files

			Writing/Creating
				Exporting PRC, PDB, and PQA files (both via the menu
					item and via HostExportFile).
				Saving screen shots.
				Saving PSF files
				Saving preferences
				Saving downloaded ROM file.
				Saving Logging files
				Saving Profile files.

*	Our patch to SndDoCmd now initializes the return value. [David
	Slotter]

*	(Unix) AutoLoad, AutoRun, and AutoRunAndQuit directories now
	supported.

*	(Windows) Binder utility now merged into Poser directly (see the
	"Save Bound Emulator..." menu item).

	"Binding" Poser means to create a new version of Poser based on the
	settings in the currently running Poser. A new executable is
	created that includes a ROM image, configuration settings, skins,
	and optionally a RAM image (the stuff that goes into a .psf file). 
	All of this information is taken from the current settings in the
	running Poser. The result is a new Poser that is self-contained and
	runs stand-alone.

	When binding Poser, you'll be presented with two options:

		* Create a version that always creates a new session based on
		  the current emulator settings

		* Create a version that restores the current session

	Selecting the first option creates a version of Poser bound with a
	ROM image, configuration settings, and appropriate skins. When
	launched, this version of Poser will always create a new session
	based on those settings.

	Selecting the second option creates a version of Poser that is also
	bound with a RAM image. When launched, this version of Poser will
	always restore the state that is stored in that image. This is
	effectively the same as reloading a .psf file.

	In both cases, Poser functionality is abbreviated. Because much
	information is now specified by the bound items, menu items used to
	create, save, and load sessions and session files are removed. And
	since bound Posers are intended to be used in demo, kiosk, or other
	closely controlled environments, most developer-related menu items
	are also removed.

*	Fixed a problem where NetLibReceivePB could return netErrParamErr
	instead of a more informative error code. [Frank Yellin]

*	Fixed a problem where NetLibReceivePB where an in/out parameter
	passed to recvfrom was not initialized first. [Frank Yellin]

*	When emulating NetLib calls by turning them into host TCP calls,
	and an error occurs, add a log message (if NetLib logging is turned
	on) that describes how the host error code is translated into a
	NetLib error code.

*	Implement the documented -skin and -silkscreen command-line
	options.

*	Got rid of problem that prevented Poser from running on Macs with
	more than 256 Meg of RAM (and which could have lead to problems on
	other platforms as well).

	Details:

	(First, some terminology. In the discussion below, "host address
	space" refers to the memory that any Windows, Mac OS, or Unix
	application sees and manipulates. "Emulated address space" refers
	to the memory that the Palm OS or a Palm OS application sees. It is
	up to Poser to make the host address space look like emulated
	address space.)

	Poser emulates memory by allocating some buffers in the host's heap
	to "back" the various memory ranges utilized by the Palm OS. For
	instance, it creates buffers to represent RAM, ROM, and the
	Dragonball registers. Whenever a memory access is performed, Poser
	determines which of these buffers is required, calculates the
	correct offset into that buffer, and fetches or stores as
	appropriate. These buffers are used to create the illusion of the
	emulated address space.

	On occassion, it is necessary for Poser to magically make more
	memory "appear" to the emulated process. That is, the emulated
	process needs to be granted access to memory other than that
	normally needed to emulate a true Palm OS environment. A chief
	example of this is when loading a .prc file. Poser performs the
	install process by creating the database, creating the records in
	the database, and then copying the record contents from the .prc
	file to the records in the database it created. This copying is
	done by calling DmWrite. But the source of the DmWrite is a buffer
	that Poser allocated to hold the contents of the .prc file. This
	buffer is not one of the standard buffers Poser uses to emulate the
	any of the standard memory ranges that a Palm OS process can access.

	In order -- in this example -- for DmWrite to access the bytes in
	the file buffer Poser allocated, Poser temporarily "maps" arbitrary
	ranges into the emulated address space. Ranges that are mapped in
	can be accessed by Palm OS processes. However, this mapping did not
	undergo any address translation. That is, if the buffer holding the
	.prc file happened to have been allocated at memory location
	0x01234560 by Windows, the Mac OS, Unix, or whatever, then Poser
	would map that buffer into memory location 0x01234560 in the Palm
	address space.

	This was OK, except when memory ranges mapped into the emulated
	space overlapped with standard memory ranges in the emulated space.
	For instance, on Macs with lots of RAM (greater than 256 Meg, at
	least), Poser could easily make a memory allocation that return an
	address > 0x10000000. If the buffer that was allocated were actually
	in the range 0x10C00000 - 0x10E00000 (or whatever the ROM range
	was), then when Poser attempted to "map in" that buffer, it would
	fail because of the overlap.

	Now, finally, this problem is fixed. Poser now performs memory
	address translation. Segments of memory mapped into the emulated
	address space are now mapped in so that they appear at 0x60000000 -
	0x6FFFFFFF.

*	When checking for the validity of calls to shared library
	functions, don't allow a refnum of zero. Also, display a specific
	error message when an invalid library refnum is detected. [Frank
	Yellin]

*	(Unix) Fixed problem with crashing on Sparc systems when loading
	.prc files. [Frank Yellin]

*	Silently ignore a bug in an internal Palm OS 3.3 function
	(PrvConvertDepth1To2BW) that causes it to walk off the end of an
	allocated memory chunk by a single byte when reading from it.

*	Slightly more rigorous PC validation. Previously, I'd just check
	to see if the PC were in a valid address space (RAM, ROM, Dragonball
	register, etc.). Now only RAM or ROM addresses are allowed. [Frank
	Yellin]

*	HostFFlush (HostLogFile()) now writes the log file to disk.

*	Re-hooked up the "Logging Options..." button in the New Gremlin
	dialog box. In order to do this, utilized some cross-platform
	dialog handling routines that are slowly being phased in. As a
	result of these new routines, the dialog box has been changed from a
	multi-panel dialog on Mac and Windows to a non-panel dialog box (as
	was on Unix).

*	(Unix) No longer hide and reshow the main window when establishing
	a new skin (either as part of the Skins dialog, or as part of
	loading/creating a session). This process was an attemp to work-
	around an FLTK problem where the X frame window didn't properly
	resize itself. This workaround didn't work, and another one has
	been put in place, so the old one's taken out.

*	(Unix) Change the filter button to use only lower-case suffixes. 
	With both upper and lowercase, the text in the filter button would
	overflow its bounds. [Jon Aslund]

*	(Unix) When opening a saved session file while a current session is
	already running, Poser would attempt to close the first session's
	thread twice, and then attempt to start the second session's thread
	twice. This would often lead Poser to hang. Now each of those is
	done just once. [Jon Aslund]

*	(Unix) Instead of crashing, report errors that occur while creating
	a new session or loading an old one. [Jon Aslund]

*	(Unix) Added BSD/OS 4.1 support. [Bert Driehuis]

*	Allow TsmGlueGetFepMode and TsmGlueSetFepMode access to system
	globals.

*	(Windows) Fixed bug where creating a new session in Poser, quitting
	without saving, and then starting Poser using the -psf command line
	option would result in a new session being created again instead of
	loading the specified session file.

*	ROM Transfer project updated to use SDK 3.5.

*	Internal change: previously, when Poser had to manipulate data in
	Palm OS format, it used the structs in the Palm OS headers directly.
	However, that assumed that we could convince all the compilers used
	to build Poser to lay out those structs correctly (that is, with the
	same size and alignment as the 68K compiler used to build the Palm
	OS ROM and Palm OS applications). This assumption is almost true,
	but not quite. Therefore, with this release, a new mechanism for
	manipulating Palm OS structs is used. This mechanism (see the
	EmPalmStructs.xxx files) allows Poser to access structs in a
	platform-, compiler-, and endian-independent fashion.

	Currently, this new mechanism is used only in the area of sending
	and receiving packets from external clients (debuggers and scripts).
	Eventually, it will be used in all aspects of Poser operation. Once
	this switchover is complete, we'll be mostly independent of the Palm
	header files, and will probably be able to get rid of most of
	contents of the the Byteswapping.xxx files.

*	Fixed problem with our patch to NetLibReceive. The exact problem
	being solved was one where NetLibReceive was called, received some
	data, the application modified that data in the buffer that received
	the data, and then call NetLibReceive again. No bytes were
	available, but the contents of the buffer were updated with the
	contents of the previous receive, thus wiping out the modified
	buffer contents. The application was relying on the buffer not
	changing, and so failed when it actually did.

*	Fixed problems with ROM Transfer not running on Palm OS 1.0.
	[Vladimir Amarante]

*	Fixed problem with trying to boot a ROM from a Palm V device that
	had originally been installed with Palm OS 3.1 but was lateer
	upgraded to Palm OS 3.3. [Douglas R. Shefsky]

*	(Windows) Fixed a problem with not reading the entire preferences
	file.

*	(Unix) Fixed problem with clicking in a non-active area of the
	window (that is, outside of any button or LCD area).

*	(Unix) Added ROM Transfer project (with prc-tools 2.0 compatible
	Makefile) and pre-built ROM Transfer.prc application that can
	be installed with something like pilot-xfer.

*	(Unix) Fixed problem that could lead to unexpected results when
	running certain dialogs after other certain dialogs (FLTK wasn't
	clearing out a reference to a widget in the first dialog,
	causing the second to crash).

*	(Unix) Remapped EINPROGRESS (as returned by sockets functions)
	to netErrWouldBlock instead of netErrSocketBusy (as NetMgr.h
	would suggest). This change allows Network HotSync to work
	between a Unix box and a Windows box.


Changes for 3.0a5 (03/06/00)
----------------------------
*	Interim internal release dates:
		3.0a5e1		-	02/25/00
		3.0a5e2		-	02/25/00
		3.0a5e3		-	03/01/00
		3.0a5e4		-	03/03/00

*	Internal change: major change in the way the Dragonball and
	DragonballEZ registers are handled for different devices. 
	Previously, there were two sub-systems: one that handled Dragonball
	registers, and one that handled DragonballEZ registers. Any device
	differences withing those two categories were handled with a set of
	conditional statements. That mechanism started breaking down (the
	conditionals were getting too twisty), so now device support is
	broken down with a set of classes having the following hierarchy:

		EmRegs - fairly abstract base class
			EmRegs328 - mildly abstract base class implementing Dragonball emulation common to all 328 devices
				EmRegs328Pilot, EmRegs328PalmPilot, etc. - concrete base class filling in the missing, custom pieces for a specific device
			EmRegsEZ - mildly abstract base class implementing Dragonball emulation common to all EZ devices
				EmRegsEZPalmIIIx, EmRegsPalmV, etc. - concrete base class filling in the missing, custom pieces for a specific device

*	Added Symbol 1700 support. Note that Symbol-specific hardware is
	not yet emulated. Attempting to use scanner or Spectrum facilities
	will hang the device. [Ron Kupke, Darren Kropp, John Duhart, Harini
	Bharadvaj]

*	Changed the way serial emulation is performed a little bit. 
	Before, I'd look at the UART-enable bit to determine whether or not
	to open or close the host's serial port. However, that would lead
	to problems on Unix when using pseudo-devices. While opening the
	serial port, the Palm OS would enable and disable the UART several
	times as it was configuring the communications. This would lead to
	the host serial port being opened and closed several times. But
	Unix pseudo-devices don't react to that usage very well. So now,
	Poser looks at the serial line driver enable bit. This bit is
	toggled just once at the beginning and end of a serial port session,
	just like we want. [Eskil Heyn Olsen]

*	Fixed problem with serial emulation not working on Palm VII EZ.

*	Fixed problem where reloading a .psf file that had a Gremlin
	running would not correctly install the Gremlin-specific logging
	options.

*	Fixed problem affecting Gremlin reproducability. There was a patch
	on KeyCurrentState to randomly set key bits when a Gremlin was
	running. However, the RNG used to set the bits was in no way
	synchronized with the RNG used to generate Gremlin events, nor was
	it ever reset in any way when a Gremlin was started or restarted.
	The effect was that any application that was sensitive to the
	results of KeyCurrentState would react randomly. One example of
	this was the Address Book, which looked to see if the Address Book
	hard key was pressed in order to see if the user wanted to beam
	his/her business card.

*	Fixed problem affecting Gremlin reproducability. Some applications
	are sensitive to time and timing issues. Gremlins now tries to make
	sure that all forms of time (including the DragonBall cycle counter,
	the kernel's tick counter, the Palm OS tick counter, and the
	Dragonball real-time clock) are all set to consistant values when a
	Gremlin is started and restored when a Gremlin-active .psf file is
	reloaded (the cycle and tick counters are set to zero, and the RTC
	is set to 3:00pm). Also, when a Gremlin is running, the real-time
	clock is unhooked from the host's clock (normally, the values read
	from the Dragonball real-time clock are generated from the host's
	clock functions). Instead, the RTC is incremented assuming that the
	average instruction takes 12 cycles, and where the cycle time is
	based on the Dragonball's PLL registers.

*	Set the chip and mask IDs. This is set to the 1H58B part for the
	328, and 1J83G for the EZ.

*	(Unix) Fixed problem with Logging Options dialog hanging.

*	Check PC and stack pointer when doing a TRAP #$F dispatch.

*	More up-to-date instructions for Network HotSyncing with Poser.
	[Brian Mathis]

		These instructions are intended for developers or other POSE users
		who want to synchronize the Palm OS Emulator with the same PC they
		are running POSE on. Modifications to these directions may be
		needed if a user wishes to synchronize with a PC on an attached
		network. They were written on a Windows machine, and probably have
		Windows specific instructions in them. It should be pretty painless
		to adapt them to other platforms that support hotsyncing.

		These are current for version 30a3 and 30a4 of POSE emulating a Palm
		V, OS 3.1, and Hotsync version 3.0.1/3.0.4, Windows 98 & NT.

		----Configure Hotsync on your Desktop PC

		1. Right-Click the hotsync icon in the system tray

		2. Enable "Network". A check mark will appear next to it if it's
		already enabled.

		----Configure POSE:

		1. Right-Click on the POSE window to bring up the Menu. Choose
		"Settings/Properties".

		2. Check the box next to "Redirect NetLib Calls to TCP/IP".

		3. Click "OK"

		----Configure Hotsync on the Palm

		1. Open the "HotSync App".

		2. "Menu/Options/Modem Sync Preferences" - set to "Network"

		3. "Menu/Options/LANSync Preferences" - set to "LANSync"

		4. "Menu/Options/Primary PC Setup" - enter "127.0.0.1" under
		"Primary PC Address" (the middle one)

		5. Under the "Modem Sync" icon on the main Hotsync screen, tap
		"Select Service". Then tap "Done". You don't need to change any
		info, you just need to have something selected. You can create a
		new profile if you like.

		6. Tap the "Modem Sync" button. Your PC should now kick into
		action, and will probably ask you to choose an account, or create a
		new one. It is highly recommended that you create a new account
		just for POSE.

	See also the following KnowledgeBase article:

		<http://oasis.palm.com/devzone/knowledgebasearticle.cfm?article_id=1674>

*	Information from TRGnet on TRGpro support. [Mike Walter]

		TRGpro support for POSE

		Version 3.0a4 includes limited support for TRGpro emulation. This
		version emulates the FAT file system API provided on the TRGpro. It
		does not support the lower level CompactFlash API or the enhanced
		audio API on the TRGpro.

		In order to emulate the TRGpro Fat file system, do the following:

		1.	Obtain a PalmOS 3.3 image from any device. (PalmIIIx, PalmV,
			etc)

		2.	Modify file "Palm OS Emulator.ini" in your Windows
			subdirectory. Change to line FfsHome to point to a subdirectory on
			your drive.

				Example   "FfsHome=C:\POSE\

		3.	Put desired Palm programs and databases into subdirectory
			specified above.

		4.	Run Emulator.exe.

		5.	Install the programs ffs_pose.prc and CFPro.prc onto emulator.

		6.	Run CFPro to move files back and forth between Emulator and
			PC's subdirectory.

		Developers writing code for the FAT file system can now debug using
		POSE.

		More documentation will be provided later, specifying exactly what
		is and is not supported with the emulator. For example, card
		insert/remove messages are not supported with this version.

		For those of you interested, the files modified/added to the POSE
		software base were, Platform_FfsLibWin.cpp and
		TrapPatches_FfsLib.cpp.

		Keep in mind that this is a first beta release, if you have any
		questions or problems, email TRGnet directly.

		Zip file containing ffs_pose.prc and CFPro.prc can be downloaded
		from:

			http://www.trgnet.com/download/pose/fat.zip

		POSE version 3.0a4 or greater can be downloaded from:

			http://www.palmos.com/dev/tech/tools/emulator/>

*	"Pen" events are essentially created as needed and inserted into
	the Palm OS on demand from mouse events by way of a patch on the
	SysEventGet function. However, until now, there was no
	corresponding patch to EvtSysEventAvail to make that function return
	true if the host mouse was down. Now there is. [Michael Nordstrom]

*	Added back long paths for MRU menus. [Chris Antos]

*	(Windows) Made F11 minimize the window. [Chris Antos]

*	(Windows) Swapped positions of About and Exit menu items. [Carlton
	Craighead]

*	Simplified Skins dialog.

*	Simplified Gremlins dialog. Instead of entering magic numbers like
	zero and -1, use checkboxes to enable desired features.

*	Added Palm IIIc skins. Renamed "Color Device" to Palm IIIc.

*	Added UsingPOSE.pdf.

*	(Unix) Implemented "File/Save" menu item. [Dan Poirier]

*	(Unix) Fixed problem where UART::Initialize would get called twice
	when reloading a .psf file, triggering an assert. [Dan Poirier]

*	(Windows) Fixed problem with not setting the skin palette when
	using the generic skin on 8-bit monitors. [Andreas Linke]

*	Removed SndInit patch that would set the system volume level to
	zero, mirroring what happens in the simulator. However, this
	caused problems with people not hearing sounds when they expected
	to. So, removed the patch. If you don't want sound, turn it off
	in the Preferences/Properties dialog. [Frederic Paolucci]

*	(Unix) Building under Solaris 2.6 (with gcc installed) is now
	possible. It's probable that building under other SunOS environments
	won't work.

*	(Unix) The window resizes to match skin selections.

*	Export Database dialog now primarily lists the actual database name,
	with the application icon name in parentheses if it differs.


Changes for 3.0a4 (1/28/00)
---------------------------
*	Interim internal release dates:
		3.0a4e1		-	12/02/99
		3.0a4e2		-	12/30/99
		3.0a4e3		-	01/07/00
		3.0a4e4		-	01/23/00
		3.0a4e5		-	01/26/00
		3.0a4e6		-	01/27/00

*	Yow...time to start updating those copyright statements...again...
	and this time there's a lot more files!

*	When installing a .prc file, check for duplicate resources.

*	Provide better error messages when something goes awry while
	installing an application or database.

*	Added support for Palm IIIe and Palm Vx:

	- Added as items to Device menu.
	- Added code to save those devices as preferences.
	- Added as -device parameters on command line ("PalmIIIe" and "PalmVx").
	- Added and mapped in appropriate skins.
	- Added new internal type IDs.
	- Corresponding tweaks to Binder application.
	- Made Palm IIIe return same device ID as Palm IIIx.
	- Made Palm Vx return same device ID as Palm V.

*	(Mac) Updated to GUSI 2.0.1. This has the following benefits:

	- Adds support for socket options.
	- Based on Open Transport instead of Mac TCP.
	- Fixes problem with menus sometimes getting disabled (the
	  old GUSI would eat up "resume" events, so PowerPlant didn't
	  know to re-enable the UI).

*	Fixed problem where Poser's heap walking routines were vulnerable
	to odd master pointers. [Mike Chen]

*	Gremlins wasn't generating and posting hard button events properly.
	[Steve Lemke]

*	(Unix) Fixed problem with trying to delete a skin with a stale
	pointer. [Ben Darnell]

*	Updated ROM Transfer.mcp to CodeWarrior for Palm OS R6.

*	Support for the gdb debugger has been built-in for quite some time
	(since 2.1d22 or so). Here, finally, are some instructions for
	interacting with it. Note that you no longer need to use gdbpanel
	or gdbplug if you were using those with earlier versions of Poser,
	Copilot, or xcopilot. [Ben Thomas]

	-	Build your app. Be sure to _both_ compile and link with -g
		(e.g., "gcc -g ..."). On the compile pass, this generates the
		necessary symbol information; on the link pass it forces the
		inclusion of a debug runtime code that results in a breakpoint
		being installed in PilotMain when the app starts.

	-	Start Poser.

	-	Load your app into Poser.

	-	Start gdb, loading your application's symbol table (e.g., "gdb
		myApp"). Note that the file to be loaded is the "myApp" file
		created by the GCC link pass, not "myApp.prc" created by 
		buildprc.

	-	Type "target pilot localhost:2000" to gdb. It should respond
		with a message along the lines of "Remote debugging under PalmOS
		using localhost:2000. Waiting... (Press Ctrl-C to connect to
		halted machine)".

	-	Start your app on Poser.

	-	Wait for gdb to see the initial breakpoint and prompt you.

	-	Start debugging.

*	Tweaks to the scripting samples: [Flash Sheridan, Steve Haneman]

	- Wait() no long automatically resumes.
	- Added seperate Resume function
	- Since wait no longer resumes, added TapPenSync, and TapButtonSync
	  which automatically call Wait and Resume at the beginning and end.
	- Fixed some warnings that showed up when running Perl -w.
	- Added MemPtrSetOwner, WinDisplayToWindowPt, WinWindowToDisplayPt.
	- In TapButton, call WinWindowToDisplayPt.
	- In EmRPC, added support for Coord type.

*	Internal change: encapsulated all device-specific information in an
	EmDevice class. This should make it easier to add new devices,
	since all the information is now in one place.

*	Stack overflow checking is back (cf 2.1d27)!  Whenever it looks
	like something is assigning a value to the stack pointer register,
	Poser marks the memory block that pointer is in as a stack. Then,
	when the stack pointer is decremented for any reason, it is compared
	to the low end of the memory chunk. If it falls below, Poser
	displays a fatal error dialog. If the stack pointer is just getting
	close without actually going over, Poser will display a warning.

*	Fixed another case of Gremlins going to sleep on the job. Gremlins
	normally posts new random events when the system calls EvtGetEvent
	and there's nothing to return, resulting in SysDoze being called.
	Most of the times, Gremlins will post an event and return from
	EvtGetEvent. In the cases it doesn't, it forces EvtGetEvent to
	return a nil event. However, if Gremlins was posting a Shakespeare
	quote to a form field, and the form field was full, and there was a
	non-empty selection, there was a 33% chance that neither an event
	would be posted nor a nil event returned. This resulted in the
	application having nothing to do (and so SysDoze was called) and
	Gremlins thinking its job was done for the moment and putting itself
	into a "do nothing" state. [Scott Maxwell]

*	(Windows) When reloading a .psf file, fixed a bug that prevent the
	Gremlin Control Window from being reshown if the session file had
	been saved while a Gremlin was running. [Scott Maxwell]

*	(Windows) Fixed a problem with relocating the ROM file that a .psf
	file reference when that ROM file wasn't where it was supposed to
	be, but it *was* in the same directory as the .psf file.

*	(Unix) Rolled in modifications for FreeBSD. [John Ludwig]

*	(Unix) Properly recognise X options such as -display and -geometry.
	[Eric House, John Marshall]

*	Reset the Dragonball timer registers to a consistant state before
	starting a Gremlin. This gives more consistant results. HOWEVER,
	any application that is dependent on the time in any fashion may
	still have consistancy problems when running Gremlins (that is,
	starting Gremlin #0 at 3:00pm may give different results than when
	it is started at 5:00pm). This is an issue that we'll try to
	address in a future release.

*	Switch from obsolete xxxChr names to new vchrXXX names in logging
	output. Also, if a winExit/EnterEvent is associated with a form,
	print the name of that form in the logging output if event logging
	is turned on.

*	(Mac, Windows) Added Tracer support. This is a facility for
	sending logging information to an external logging application. Palm
	applications use the following API for doing this:
	
	(All HostTraceOutput functions take a module identifier as their
	first parameter. This parameter allows filtering out traces
	according to their origin. Recognized modules are listed as error
	classes in SystemMgr.h. Application should specify appErrorClass.)

		void HostTraceInit(void);
			Call once at the beginning of your application to
			initialize the logging facility. Initiates a connection
			to the "tracing port" (specified in Poser's Tracing
			Options dialog box).

		void HostTraceClose(void);
			Call once at the exit of your application to release
			any host logging resources.

		void HostTraceOutputT(unsigned short, const char*, ...);
			Log a string of text to the tracing port via a
			"printf-like" facility.
			
		void HostTraceOutputTL(unsigned short, const char*, ...);
			Same as HostTraceOutputT with an additional line break.

		void HostTraceOutputVT(unsigned short, const char*, char* /*va_list*/);
			vprintf-like variant of HostTraceOutputT.

		void HostTraceOutputVTL(unsigned short, const char*, char* /*va_list*/);
			vprintf-like variant of HostTraceOutputTL.

		void HostTraceOutputB(unsigned short, const unsigned char*, unsigned long/*size_t*/);
			Send binary data to the tracing port.
	
	The functionality for sending the logging information to the
	external application is provided by a shared library (e.g.,
	"PalmTrace.dll" on Windows). The external application can be any
	application that supports the open packet convention. The one we
	provide is "Reporter". At the time of this writing, the shared
	library and external reporting application will be provided in a
	seperate archive. [Patrick Porlan, Regis Nicolas]

*	Internal changes: massive movement to make more source code cross
	platform. New classes include:
	
	EmTransport: abstract base class representing a "pipe" between two
	entities.

	EmTransportSerial: a pipe based on serial communications. Serial
	port emulation (the facility that allows Palm OS Serial Manager
	calls to pass thru to and from the host serial port) rewritten to
	use EmTransportSerial.

	EmHostTransportSerial: class with different implementations on
	different platforms in order to provide platform specific
	functionality.

	EmDlg: class to manage dialogs in a cross-platform fashion.

	EmROMTransfer: class that implements a rewritten ROM download
	facility, based on the new EmTransport and EmDlg classes. Because
	the new ROM transfer code is based on EmTransport and not
	EmTransportSerial, this means that it may be possible to transfer a
	ROM using something other than the serial port in the future.

*	With the help of the previous changes, the ROM Download facility is
	now available on Unix.

*	Internal change: rewrote JPEG decompression routines to better
	modularize the source of compressed data and the destination of
	decompressed data. This was done to better support JPEG images on
	disk in addition to those in embedded resources.

*	Added back the old generic case graphics. These graphics are now
	used when the user selects "Default" in the Skins menu and dialog. 
	The nicer graphics are now identified with names like "Standard -
	English" and "Standard - Japanese". Eventually, those nicer
	graphics will be moved to external files, reducing the size of Poser
	drastically and reducing download times.

*	Internal change: synced up with the latest shared Palm OS files.
	This change also included switching over to the new standardized
	types (UInt32, Int16, etc.) from the old hodgepodge of types (DWord,
	Long, Int, Byte, etc.).

*	ROM Transfer now downloads the entire ROM instead of just the "Big
	ROM". It now is also a little more robust in light of some invalid
	fields in Visor ROMs.

*	(Windows) Added support for TRGpro devices. This support comes in
	the form of supporting TRGnet's FAT File System library. There is
	no TRGpro menu item in the device menu. Instead, you can
	effectively turn any Palm Computing device into the equivalent of a
	TRGnet device by installing their FFS library -- which is what
	manages access to the CompactFlash slot -- onto the device.
	(Actually, all it needs is a stub library that you can get from
	TRGnet.) Poser will redirect calls from that library to the host
	file system. The root of the emulated FFS directory hierarchy is
	specified by the FfsHome preference in Poser's preference file. It
	can be a path relative to Poser's directory (e.g., "foo") or an
	absolute path (e.g., "c:\temp\foo"). The directory will be created
	if needed. If no preference is specified, or the value is empty, or
	the specified directory could not be created, the root path defaults
	to Poser's directory. There is currently no UI for setting the root
	of the hierarchy; you have to edit the preference file by hand.
	[Mike Walter]

*	Added Visor support. Note that no USB support is provided in this
	release. This means that Poser will not download a ROM from a
	device in a USB-connected cradle, nor will USB operations on the
	emulated Visor be redirected to any host facility.

*	Fixed problem with a too-small name buffer in profiling routines.
	Removed absolute address from generated function names, as that
	annotation interferes with the CodeWarrior Profiler's ability to
	unmangle C++ names.	[Catherine White]

*	(Windows) Removed "Close" menu item from "bound" versions of Poser
	(functionality duplicates "Exit"), and added "Save Screen". [Scott
	Johnson]

*	(Unix) Added temporary hack to get Unix menus working (many would
	result in the message that the system was not responding). The
	solution implemented, however, is not optimal, and may lead to other
	problems. Expect this area to receive more attention in the near
	future. [Eric House]

*	Added sound emulation. Be sure to enable this in the preferences
	if you want it. [William F. Weiher III]

*	Fixed a couple of minor problems in the NetLib redirection code,
	one with accept() and another with the way select() timeouts were
	set up. [bill pitore]

*	Fixed a problem with determining the baud rate established by the
	UART, with the result that serial communications on 20MHz devices
	(like the Palm Vx) didn't work. [Alan Finke]


Changes for 3.0a3 (11/13/99)
----------------------------
*	Added Q&D PC checking. On JSR, BSR, RTS, and RTE, I check what
	we're attempting to set the PC to. Originally, I had a pretty beefy
	check that made sure the PC was in things like allocated, locked
	chunks. However, that's expensive for now, so I backed off to
	checking that the PC was (a) even, (b) in RAM or ROM, and (c) not in
	low-memory.

*	The new UAE 0.8.10 code includes a new way to emulate ROR and ROL
	instructions. Unfortunately, this new way runs afoul of a code
	generation bug in CWCPPC 2.3.1 (from CW 5.2) on the Mac. Reverted
	to the old way of emulating those instructions until Metrowerks
	comes out with a compiler patch. [Catherine White]

*	(Unix) Added tweaks for Debian systems. [Ben Darnell]

*	(Mac) Changed the way Poser determines whether or not to translate
	extended ASCII characters (those >= 0x80) into standard ASCII
	equivalents. The new method should be more consistant and robust,
	based on whether or not the user is running a Japanese Palm OS and a
	Mac OS with the Japanese Language Kit installed.

*	The device could actually go to sleep while running Gremlins!
	Sometimes, Gremlins will input a long series of key events. 
	However, key events don't reset the auto-off counter. Normally, the
	Palm doesn't care, since key events are a side-effect of pen events,
	which *do* reset the auto-off counter. But Poser doesn't enter key
	events that way -- it inserts them directly with EvtEnqueueKey. Now
	Poser calls EvtResetAutoOffTimer when it enters key events. [Steve
	Lemke]

*	(Windows) Sped up Gremlin Hordes a little. There were some long
	delays while switching from one Gremlin to another due to trying to
	access the Gremlin Control Window from the wrong thread. There's
	still a mysterious 2 second delay while switching Gremlins, but at
	least one cause of the slow-down is fixed.

*	Fixed problem with Gremlins and Palm OS 3.5 systems. Gremlins
	calls WinGetWindowBounds to get the bounds of a window in which to
	generate pen taps. WinGetWindowBounds returns the bounds of the
	window returned by WinGetDrawWindow. On older systems, if the draw
	window were NULL, WinGetDrawWindow would return the display window.
	On 3.5, this has been changed in debug ROMs; WinGetDrawWindow can
	return NULL so as to force applications to make sure there is an
	established draw window. Gremlins ran afoul of that change, and so
	now calls WinSetDrawWindow(WinGetActiveWindow()) before calling
	WinGetWindowBounds(). [Roger Flores, Steve Lemke]

*	In the event posting/receiving logging code, support the new Palm
	OS 3.5 events.

*	In HostFPrintF, support + and space as flags, and * as a minimum
	width field character. [Patrick Porlan]

*	Added Symbol 1700/1740 skin as an option for Palm III's. This is
	*not* to say that Poser emulates symbol devices. It only means that
	you can make a Palm III look like a Symbol device. [Ron Kupke]

*	Reformatted Gremlin Hordes log file to make it a little easier to
	find the error messages. [Flash Sheridan, Catherine White]

*	Make a stronger effort to get the pen calibrated perfectly. The
	original attempt (cf, 2.1d11) would occassionally only get us very
	close, which could lead to inconsistant Gremlin runs.

*	Fixed a bug in the UAE 0.8.10 code where a corrupt status register
	could get pushed onto the stack during an exception/interrupt and
	the previous instruction that had affected the Z CPU flag was a BCHG
	instruction that flipped the highmost bit from off to on (gee, how
	could we have missed *that*). [Catherine White, Stuart Malone]


Changes for 3.0a2 (11/05/99)
-----------------------------
*	Updated to UAE 0.8.10. We were previously based on 0.8.3. The new
	version fixes a few minor bugs (I never noticed them), perhaps
	speeds things up a little, but most importantly cleans up those 2000
	"unreferenced label" warnings you get when compiling with gcc!  OK,
	so now there are some "unused variable" warnings, but there are a
	lot fewer of them...

*	(Windows) The sequence of events involving saving a session when
	creating or opening a new one was completely broken.

*	(Windows) Added support from Palm Europe for their tracing tool.
	This tracing tool is a seperate application that receives tracing
	information sent via HostControl functions. The documentation for
	these functions is not yet available. Neither is the external
	application. But they soon will be. I just wanted to at least
	mention them so that people don't ask me about them if they see the
	new functions in HostControl.h.

*	(Unix) Modified Perl script that creates ResStrings.cpp. It used
	to add the strings to a map object (so that they can be looked up by
	an ID number) by calling a function with about 2000 calls that
	looked like "map[id] = str;". However, gcc would choke on this with
	optimizations turned on. Now, that map addition is performed in a
	seperate function, and that function is called 2000 times instead.
	[Ben Darnell, Jon Fo]


Changes for 3.0a1 (11/04/99)
-----------------------------
*	Interim internal release dates:
		2.1d29.1	-	08/26/99
		3.0a1e2		-	09/14/99
		3.0a1e3		-	09/15/99
		3.0a1e4		-	09/16/99
		3.0a1e5		-	09/21/99
		3.0a1e6		-	09/24/99
		3.0a1e7		-	09/30/99
		3.0a1e8		-	10/08/99
		3.0a1e9		-	10/14/99
		3.0a1e10	-	10/19/99
		3.0a1e11	-	10/27/99

*	Rolled in Llamagraphics's profiling changes [Catherine White]:

	The motivation for these changes was to fix the crashing problem we
	reported earlier. Here's what we changed:

	-	We rewrote RecursiveAddressToStrings without recursion, and
		named the new function LinearAddressToStrings. The old function
		was recursing over both kids and siblings, which was blowing the
		stack on the Macintosh. Since it doesn't matter what order the
		addresses are converted in, a linear loop is faster and simpler.

	-	Called ProfilerCleanup at the end of ProfilerDump. Since
		calls[i].address is modified during the dump, the calls array
		can't be reused after the dump since it no longer contains valid
		addresses. It seems safer to dispose of it so that it isn't used
		accidentally.

	-	Replaced the two Debugger() calls in ProfilerInit with calls to
		DisposeMemory(). We were encountering these Debugger calls
		while testing our own code, probably because ProfilerInit was
		being called twice somehow. Calling ProfilerInit twice should
		now be harmless, and should no longer leak memory.

	-	Changed the handling of function names so that they are no
		longer limited to 31 characters. The new limit is 255
		characters. This means that most mangled C++ names can now be
		parsed properly by the MW Profiler, which makes interpreting the
		profiles easier.

		In order to accomplish this, we needed to add extra arguments to
		two routines in Miscellaneous.cpp for the buffer capacity. This
		capacity defaults to 32, which means that callers who don't pass
		in the extra argument will get the same behavior as before.

		We also added code in the profiler so that the stringTable could
		grow dynamically. This means that it isn't so important to
		allocate enough memory for the stringTable initially. However,
		the initial size is currently the same as the old size was, so
		reallocation shouldn't occur very often.

*	(Mac) Updated to CodeWarrior Pro 5.

*	Overhauled handling of preferences/properties/settings/options...
	These settings were previously stored as resource-based binary data
	on the Mac, System Registry entries on Window, and an RC text file
	on Unix. Now the information is saved out as a text file on all
	platforms. And -- with a common source code base -- all information
	is saved out consistantly (some platforms previously skipped saving
	some information). Finally, with all information in an accessible
	text file format, it should be easier for users to tweak or fix
	settings (or even specify settings for which there is no UI).

	Note that NO attempt has been made to migrate forward settings from
	the previous formats.

*	In line with that, if the InterceptSysFatalAlert is true (default),
	Poser will intercept calls to SysFatalAlert and display the message
	in its own dialog box. If this setting is false, Poser will let the
	standard Palm OS function display the message. [Ken Krugler, Scott
	Johnson]

*	If a SysFatalAlert dialog is displayed while a Gremlin is running,
	the Gremlin will no longer be halted if the user clicks on Continue
	(it used to be that the Gremlin was *always* halted). [Roger Flores]

*	(Windows) Ask user if they'd like to have a shortcut to Poser added
	to the Start Menu. [Phil Shoemaker]

*	Better validation of .prc files. [Daniel McCarthy]

*	(Windows) Cancel button in file download progress dialog now works.

*	(Windows) Fixed byteswapping bug in PSF writing code. Poser should
	now have a better chance of reading Mac-created PSF files on Windows
	and vice-versa.

*	Fixed memory leak bug that would occur when closing a session. The
	buffers holding the ROM image and auxilliary information weren't
	being deleted. [bullshark (a real person with a real email
	address)].

*	(Windows) Added the Palm OS Emulator Binding tool, an NT-only
	wizard which can bind a Windows Poser executable with (1) a ROM file
	and a device configuration, or (2) a ROM file and a session file.
	This will create a self-contained executable suitable for "kiosk"
	run.

	Poser detects when it is bound, and modifies its behavior in the
	following manner:

	(1)	ROM + device configuration. Poser always starts by booting
		into a new session with the selected device configuration and
		ROM. If the user closes the session and creates a new one, he or
		she will not be prompted for a device configuration.

	(2)	ROM + PSF file. Poser always starts right into the state
		saved in the PSF file. The user interface is abbreviated to
		include only pertinent functionality (no debugging or logging,
		for example) that is appropriate to a "kiosk" run. IF the user
		closes the session, he or she only has the option to restart it
		in the state saved in the PSF file. Posers bound this way share
		a separate set of preferences then unbound Posers.

*	Made the socket port that an external debugger can connect to
	configurable. The old hard-coded port of 2000 is still support for
	backward compatibility, but clients should move away from that.
	Instead, they should use the port specified in the
	"DebuggerSocketPort" preference. (There is currently no UI for
	changing this preference. But it can be changed by hand by editting
	the Poser preferences file, which is in text format.)

*	Added the following functions to HostControl.h:

		HostErr		HostProfileDetailFn			(void* addr, HostBool logDetails)

			Profiles the function containing the given address. If
			logDetails is true, profiling is performed at a machine-
			language instruction level (each opcode is treated as
			its own function).

		HostErr		HostGremlinNew				(const HostGremlinInfo*);

			Start a new Gremlin using the given specifications.

		HostBool	HostGetPreference			(const char*, char*);
		void		HostSetPreference			(const char*, const char*);

			Get or set the specified preference. Preferences are
			identified by name, the set of which can be seen in the Palm
			OS Emulator Preferences file for your platform ("Palm OS
			Emulator Preferences" in the Preferences folder on the Mac,
			"Palm OS Emulator Preferences.ini" in the Windows System
			directory on Windows, and ".poserrc" in your home directory
			on Unix). The values are also specified as strings,
			examples of which can be seen in the preferences file.

		HostErr		HostSessionCreate			(const char* device, long ramSize, const char* romPath);

			Create a new session based on the given parameters.
			Fails if a session is already running.

			* NOTE: Not yet implemented.

		HostErr		HostSessionOpen				(const char* psfFileName);

			Open the given session. Fails if a session is already
			running.

			* NOTE: Not yet implemented.

		HostErr		HostSessionClose			(const char* saveFileName);

			Close the current session, saving it to the given file.
			The session is not saved if no file name is specified.
			This function fails if no session is running.

		HostErr		HostSessionQuit				(void);

			Ask Poser to quit. Fails if a session is already
			running.

		HostErr		HostSignalSend				(HostSignal signalNumber)
			
			Send a signal (identified by an integer) to any scripts
			with HostSignalWait calls pending. If there are such
			pending calls, Poser then halts waiting to be restarted
			with HostSignalResume. If no one was waiting for any
			signals, then Poser doesn't halt.

		HostErr		HostSignalWait				(long timeout, HostSignal* signalNumber)

			Wait for a signal from Poser. Signals can be predefined
			(hostSignalIdle, hostSignalQuit) or user-defined.
			HostSignalWait returns the signalled value.

			hostSignalIdle is issued by Poser when it detects that it's
			going into an idle state.

			hostSignalQuit is issued by Poser when it's about to quit.

		HostErr		HostSignalResume			(void)

			Restarts Poser after it has issued a signal. By waiting
			to be restarted, Poser allows external scripts to perform
			any other operations first.


	While the following functions are in the HostControl API,
	they exist for external RPC clients to call and will return
	errors if called by Palm OS applications:

		HostSessionCreate
		HostSessionOpen
		HostSessionClose
		HostSessionQuit
		HostSignalWait
		HostSignalResume

*	Opened a socket (on the port specified in "RPCSocketPort"
	preference) for external applications to make RPC calls. By sending
	RPC packets, external applications can invoke any function in the
	Palm OS dispatch table. This set of functions includes the
	HostControl functions, which can be called even when no session is
	running (which normally would mean that there isn't really a
	dispatch table containing functions that can be called).

	Packets sent to the RPC sub-system use the same format as packets
	sent to the debugger sub-system, that is, the Serial Link Protocol
	packet format (also used by HotSync). This format is described in
	Debugging.html.

	When sending command packets to the RPC sub-system, you need to set
	the "dest" field of the packet header to:

		#define slkSocketRPC			(slkSocketFirstDynamic + 10)

	as opposed to slkSocketDebugger or slkSocketConsole, as you would
	when talking with the debugger sub-system.

	The RPC sub-system can accept one of 4 kinds of command pacets:
	ReadMem, WriteMem, RPC, and RPC2. The first three packets are the
	same as those sent to the debugger sub-system and are defined in
	Debugging.html. RPC2 is an extension of the RPC packet in order to
	support a wider range of facilities.

	RPC2 packets are defined as follows:

		#define sysPktRPC2Cmd	0x20
		#define sysPktRPC2Rsp	0xA0

		struct SysPktRPCParamInfo
		{
			UInt8	byRef;		// true if param is by reference
			UInt8	size;		// # of Bytes of paramData	(must be even)			
			UInt16	data[1];	// variable length array of paramData
		};
	
		struct SysPktRPC2Type
		{
			_sysPktBodyCommon;			// Common Body header
			UInt16	trapWord;			// which trap to execute
			UInt32	resultD0;			// result from D0 placed here
			UInt32	resultA0;			// result from A0 placed here
			UInt16	resultException;	// If an exception occured, it's ID is here
			UInt8	DRegMask;			// Bitmasks indicating what registers need...
			UInt8	ARegMask;			// ...to be set on this call.
			UInt32	Regs[1];			// Variable-length array holding register...
										// ...values to be set on this call.
			UInt16	numParams;			// how many parameters follow

			// Following is a variable length array of SlkRPCParamInfo's
			SysPktRPCParamType	param[1];
		};

	Most of this is the same as the RPC packet. It differs with the
	addition of the following fields:

	resultException: if the function call failed because a hardware
	exception occured, the exception ID will be stored here. Otherwise,
	this field contains zero.

	DRegMask: a bitmask indicating what D registers need to be set in
	order to make this call. In particular, some functions require that
	a "selector" value be placed in register D2. In this case, bit 2 of
	DRegMask (the 3rd bit from the right) would be set.

	ARegMask: same comments.

	Regs[1]: a variable length array containing the values to be placed
	in the registers to be set. Only the registers that are being
	changed need to be supplied. Most of the time, DRegMask and ARegMask
	will be zero and Regs would not appear in the packet. In the example
	where D2 needs to be set, DRegMask would be 0x04, ARegMask would be
	0x00, and ARegMask would be followed by a single 32-bit value to be
	placed in D2. If more than one register needs to be set, then the
	register values should appear in the following order: D0, D1, ...,
	D6, D7, A0, A1, ..., A6, A7. Again, only values for the registers
	specified in DRegMask and ARegMask need to be provided.

*	Fixed crasher that could occur if "Received Events" logging was
	turned on and one of three KeyDown events was popped off the stack.
	[Ken Krugler, Jeff Yasuda]

*	(Unix) Added serial port emulation, as well as better support for
	other OS and compiler flavors. [Jerry Kirk, Michael Kedl]

*	(Unix) Added support for cursor, page up/down keys. [Michael Kedl]

*	(Unix) Fixed massive memory leak when sessions ended. [Michael Kedl]

*	More evolution of skin support. Skins are now set on a device-by-
	device basis from a new "Skins..." dialog box. Other aspects of the
	device's appearance are also set from this dialog box, such as the
	scaling factor and the LCD background color.

*	Look at the chip selects when determining what range of RAM should
	be protected or not instead of just assuming 128K. [Steve Lemke]

*	Fixed problems with reloading .psf files what were saved when a
	Gremlin was running.

*	Fixed problem with white border in 2x mode.

*	Fixed problem with setting some color table entries. [Bob Ebert]

*	Fixed problem with HwrDisplayWake hanging on power-up. [David Fedor]

*	Setting "DebuggerSocketPort" or "RPCSocketPort" preferences to zero
	will disable their respective facilities. This should be handy in
	cases where merely opening a TCP socket fires up any sort of
	unwanted Remote Access facilites. [Ken Krugler]

*	(Mac) Fixed bug in new preferences saving mechanism where the
	preferences would not get saved if the file didn't already exist.
	[Mike Puckett]

*	Allow LCD window to be placed in negative coordinates. [Mike Puckett]

*	Addition of Gremlin Hordes. A Horde is basically a range of
	Gremlins to run. You specify the range: the first Gremlin and the
	last Gremlin in the Horde. Poser will start with the first Gremlin,
	and generate that Gremlins event stream until one of four things
	happens:

	- An error occurs (hardware exception, illegal memory access, etc.),
	- The maximum number of events have been generated,
	- A "switch" event occurs. A switch event is when a specified number
	  of the maximum number of events have been generated.

	When any of these conditions occur, the current Gremlin is either
	halted or suspended and the next Gremlin in the Horde is selected. 
	When Poser has cycled through all the Gremlins in the range, it
	cycles back and restarts any suspended Gremlins one at a time. When
	all Gremlins have been halted (either because they've encountered an
	error or they've reached the maximum number of events), the Hordes
	session is completed.

*	(Windows) Added the following command-line options [Brian Estes]:

	-skin <name>:
			Synonyn for -silkscreen.

	-ram_size <size in K>:
			Synonym for -ram.

	-load_apps <file name list>:
			A comma-seperated list of files (.prc's, etc.) to load after
			startup.

	-run_app <app name>:
			Application to run after startup. Note that this is the
			name of the *application*, not the file.

	-quit_on_exit:
			If -run_app was specified, quit when that application exits.

	-log_save_dir <path>:
			Location for standard log file. Default = Poser's directory.

	-horde <num>:
			Gremlin number to run after session is created or loaded. 
			Equivalent to setting -horde_first and -horde_last to the
			same number.

	-horde_first <num>:
			First Gremlin in a Gremlin Horde to run.

	-horde_last <num>:
			Last Gremlin in a Gremlin Horde to run.

	-horde_apps <app name list>:
			A comma-seperated list of applications Gremlins is allowed
			to switch to. Default == entire device (no restrictions).

	-horde_save_dir <path>:
			Location for directory that keeps saved session files and
			logs. Default = Poser's directory.

	-horde_save_freq <num>:
			Gremlin snapshot save frequency. Default = don't save
			snapshots.

	-horde_depth_max <num>:
			Total number of Gremlin events to generate for each Gremlin.
			Default == no upper limit.

	-horde_depth_switch <num>:
			Number of Gremlin events to generate before switching to
			another Gremlin in a Horde. Default == the same number
			specified for -horde_depth_max.

*	(Windows) Added support for Alt-F4; made it act like the Exit menu
	item. [Ryan Robertson]

*	Fixed a problem with profiling calls to Palm OS function made via
	the SYSTRAP_FASTER macro. The function entry would be recorded once
	because it was a system call, and then again because it was made via
	a JSR. Because the subsequent RTS would pop only one of those off of
	the profiler's stack, the stack would get out of sync and overflow.
	[Jameson Quinn]

*	(Windows, Unix) Now stop the CPU thread on almost any UI action.
	Previously, the CPU thread would be stopped only in targeted
	situations. Now, it's stopped whenever the user executed a menu
	command. This change was made when I found out that the profiling
	menu items could mess up the CPU thread if it weren't stopped first.

*	Updated ROM Transfer project to CodeWarrior for Palm OS 5.2 (that
	is, CodeWarrior for Palm OS Release 5 with Metrowerks' two updates
	applied).

*	Fixed the way time spent in the trap dispatcher was recorded when
	profiling; entries for the same function weren't necessarily being
	collapsed into a single entry. [Bob Ebert]

*	(Unix) Added JPEG case graphics.

*	(Windows) Added taskbar menu with Minimize/Move/Close menu items.
	Note that there may still be problems with minimizing/maximizing
	Poser. For instance, Windows NT does not minimize windows without
	caption bars when you select "Minimize All Windows". Windows 98
	will hide Poser when selection "Show Desktop", but will restore
	Poser when restoring another application window. These problems
	appear to be shortcomings of Windows, but if anyone knows how to
	accomodate these foibles, please let me know. [Scott Johnson]

*	More accurate emulation of ROM space. Now the chip-selects are
	used in conjuction with the ROM image file size. [Steve Lemke,
	Jesse Donaldson]
	
	In general:

	The size of the ROM image is always rounded up to the next power of
	two.

	On Dragonball devices, I assume that the chip-selects are always set
	to specify a 2 Meg ROM (this appropriate for all ROMs so far). On
	DragonballEZ devices, I look at csASelect, bits 1-3 (BTW, the reset
	value for this register is 0x00E0, so there don't seem to be any
	boot-up issues).

	If the rounded ROM image size is larger than the size specified by
	the chip-selects, then it gets truncated; the CPU won't be able to
	access the far end of it.

	If the rounded ROM image size is the same as the size specified by
	the chip-selects, then everything is fine. No truncating, no
	mirroring.

	If the rounded ROM image size is smaller than the size specified by
	the chip-selects, then the ROM image is mirrored for as many times
	as is necessary to cover the range.

*	(Mac) Added Power Manager code to keep PowerBooks awake when Poser
	is doing something and when the PowerBook is plugged in. [Mike
	Puckett]

*	Ensure that windows (LCD, Gremlin Control) are onscreen when
	they're created. Right now, this means that they are brought
	onscreen if any part of them is offscreen. If this is too strict,
	we can revisit the algorithm later.

*	The code to validate the objects on a form has been moved from
	Gremlins-specific code into a patch on FrmDrawFrom. Now people will
	get bugged about invalid objects even when not running Gremlins. :-)

	By the way, some people have reported that they get told about
	invalid or offscreen form objects, and that they think these reports
	are in error, as the objects reported have ludicrous positions and
	sizes and have object IDs that don't exist in the resource
	description file. If you get such a message, *strongly* suspect
	that your object list has been trashed, possibly due to the changing
	of a label or title. Eventually, Poser will be able to detect when
	form object lists get trashed at the moment it occurs, and not later
	on down the stream (such as when the form gets drawn).

*	When dragging files onto the LCD screen, the rules are: you can
	drag any number and assortment of .prc, .pdb, and .pqa files; you
	can drag only one .rom file, you can drag only one .psf file; you
	can't mix files from any of the three just-mentioned categories
	together. If you broke any of these rules, you'd get an error
	message. However, this error message was broken in different way on
	Mac and Windows (the Unix version doesn't support D&D yet -- any
	takers?). This was fixed by making the majority of the relevent
	code cross-platform, and then fixing *that*. [Roger Flores, Mike
	Turcotte]

*	(Mac) Fixed problem with Japanese text showing up as "Jinglish" on
	systems with the Japanese Language Kit installed. This was always
	supposed to be a feature in the New Gremlin dialog (so that you
	could see the application names correctly), but appears to have been
	broken for some time. That should be fixed, and the same facility
	has now been extended to the dialog containing error messages
	generated by the Palm OS. [Ken Krugler]

*	Fixed bug in NetLibGetHostByAddr where the address was assumed to be
	a NetSocketAddrType instead of anything that could be "len" bytes
	long. [Bill Pittore]

*	Turned on checking of writes to ROM. This was off for a reason
	(there's a comment next to the relevent part saying "HACK: We really
	want it to be true!"), but I don't remember what it is. I was able
	to run Gremlins on some apps for quite a while without error, so
	hopefully we can get away with turning this back on. [Scott Johnson]

*	Take another stab at fixing the problem with FntDefineFont, as first
	described in the release notes for 2.1d20. FntDefineFont can read
	off the end of a source buffer, causing Poser to report an invalid
	read access to memory manager data structures. This bug -- fixed in
	Palm OS 3.2 -- doesn't need to be alerted by Poser. [Scott Johnson]

*	If an application executes DbgBreak and no debugger is attached,
	display a friendly message in a dialog box that includes Continue
	and Reset buttons. [Ken Krugler]

*	Added Red Dutta's "Export Database" menu item. This command takes
	the place of the "posedbexport" Palm OS application, allowing you
	to export databases and applications from the emulator to your
	desktop computer as a .pdb or .prc file. [Red Dutta]

*	Patch SysReset so that Poser no longer complains about normally
	proscribed actions (like mucking with low-memory) during a reboot.

*	Bring us in-sync with the Simulator with regards to entering
	control-chars that map to Palm OS command-chars. The list is:

		control-A	menuChr
		control-B	lowBatteryChr
		control-C	commandChr
		control-D	confirmChr
		control-E	launchChr
		control-F	keyboardChr
		control-M	linefeedChr
		control-N	nextFieldChr
		control-S	autoOffChr
		control-T	hardContrastChr
		control-U	backlightChr

	B, S, T, and U are new in this release.


Changes for 2.1d29 (7/8/99)
---------------------------
*	Interim internal release dates:
		2.1d28.1	-	6/4/99
		2.1d28.2	-	6/4/99
		2.1d28.3	-	6/11/99
		2.1d28.4	-	6/11/99
		2.1d28.5	-	6/11/99
		2.1d28.6	-	6/15/99
		2.1d28.7	-	6/16/99
		2.1d28.8	-	6/23/99
		2.1d28.9	-	6/25/99
		2.1d28.10	-	6/30/99

*	For temporary backward compatibility, "bare" file names on the
	command lineare treated as paths to .psf files. [Andreas Linke, Mike
	McCollister]

*	(Mac) Fixed problem with receiving Error #18 when trying to download
	ROMs from actual devices over the serial port. [Mark Ordal]

*	In debugger/sockets communications, allow for recv() returning
	zero, indicating a closed connection.

*	Fixed multi-threading bugs. [Andrew Ball, Daniel McCarty, Scott
	Johnson, Keith Wolcott, Art Dahm, Mark Lussier, Alex Robinson,
	Patrick Porlan]

*	(Unix) Fixed some makefile problems. [many]

*	(Mac, Windows): new case graphics. Note that the edges of the new
	graphics are a little rough; we'll be working on that for the next
	release. Also, the Mac version doesn't set up a custom palette in
	8-bit mode, yet, so for best results, you might want to put your
	monitor in 16- or 24-bit modes. Finally, the Unix version will get
	the new graphics in the next release.

*	Print some logging information using signed instead of unsigned
	value. [Oliver King-Smith]

*	Don't go into infinite recursion when the emulated PC is set to an
	odd memory address. [John Marshall]

*	Fixed problem in the "NetLib redirected" version of
	NetLibSocketAccept where the address and address length were not
	returned. [Bill Pitore]

*	(Windows) As outlined in the notes for 2.1d28, Poser will look for
	the last-saved .psf file when starting up. It used to save the
	reference to this file as a full pathname. Now, if the attempt
	to locate the file with the full pathname fails, Poser will look
	for a .psf file with the same name in the same directory as
	Poser itself. This approach is similar to the way in which
	Poser looks for .ROM files that are no longer at their last known
	location. [Michael Hado]

*	Worked around VC++ 6.0 bug where tabbed dialogs in applications
	built by it won't show up on systems without IE 4.x installed.
	[Michael S. Davis]

*	(Unix) Fixed a minor bug in skin loading code which causes Emulator
	to crash when it tries to load a skin file from current directory.
	[Vlad]

*	Set the command key bit when Gremlins posts an up or down arrow.


Changes for 2.1d28 (5/21/99)
----------------------------
*	Interim internal release dates:
		2.1d27.1	-	5/17/99

*	(Windows) Added command line options:

	-psf <filename>: emulator loads the specified .psf file on startup.

	-rom <filename>: specifies the ROM image file to use.
	-ram <size>: specifies the amount of RAM to emulate (in K). Valid sizes
			are 128, 256, 512, 1024, 2048, 4096, and 8192.
	-device <type>: specifies the device to emulate. Valid types are pilot,
			palmpilot, palmiii, palmiiix, palmv, palmvii, and palmiiic.
	-silkscreen <type>: specifies the silkscreen to use. Valid types are
			english and japanese.

	Case is NOT significant.

	Examples:

		Emulator -psf C:\Data\Session.psf

		Emulator -ROM C:\ROMs\3.0\debug.rom -RAM 1024 -Device PalmIII
			-Silkscreen English

	Startup rules are now as follows:

	1 If the Caps Lock key is toggled in the ON position, always bring
	  up the New/Open/... dialog.
	2 Scan the command line for startup parameters. If an error occurs
	  trying to scan the command line, the error is reported and the user
	  is presented with the New/Open/... dialog.
	3 Use the .psf file if one is specified. If an error occurs trying
	  to load the file, the error is reported and the user is presented
	  with the New/Open/... dialog.
	4 If any of -rom, -ram, -device, or -silkscreen are specified, try
	  to start a new session based on those values. If all are specified,
	  the new session is automatically created. If any of those four
	  values are missing, the "New Configuration" dialog is displayed.
	  If the user cancels the dialog, or if there is an error creating
	  the new session, any error is reported and the user is presented
	  with the New/Open/... dialog.
	5 If no command line options are specified, try re-opening the last
	  saved .psf file (this step is skipped if the user last created a
	  new session, but did NOT save that session to a file). If an error
	  occurs trying to load the file, the error is reported and the user
	  is presented with the New/Open/... dialog.
	6 Try creating a new session based on the settings the user last
	  specified when creating a session. If there is an error creating
	  the new session, the error is reported and the user is presented
	  with the New/Open/... dialog.
	7 Finally, if all else fails, present the user with the New/Open/...
	  dialog.

	Steps 1, 5, 6, and 7 describe the old startup rules. Steps 2, 3,
	and 4 are new. [Steve Haneman]

*	See that problem where I said that saving a session file could take
	up to 15 seconds or even longer?  And see where I said I didn't know
	why?  Well, it's because I'm an idiot. Under certain circumstances,
	Poser could get into a state where it would save the same session
	file several times in a row. Normally it would take a 1/2 second to
	save a file. But if it decided to save the same file 30 times in a
	row, that would take 15 seconds...

*	Fixed some more synchronization problems on SMP machines.

*	Force the Log####.txt files to be stored in the Poser directory
	instead of whatever directory happens to be the current one.


Changes for 2.1d27 (5/7/99)
---------------------------
*	Interim internal release dates:
		2.1d26.1	-	???
		2.1d26.2	-	???
		2.1d26.3	-	???
		2.1d26.4	-	3/25/99
		2.1d26.5	-	4/1/99
		2.1d26.6	-	???
		2.1d26.7	-	???
		2.1d26.8	-	4/27/99
		2.1d26.9	-	4/29/99
		2.1d26.10	-	5/5/99

*	Added special messages for accessing NULL and for trying to access
	the A5 register (in order to access global variables or make inter-
	segment jumps) when A5 is not set up for the application trying to
	use it. [Roger Flores, Ken Krugler]

*	Better tracking of the current application. Now, if errors occur
	during an "action code" sequence, the application executing is
	reported, not the "main", "real" application that has the stack, A5,
	etc. [Roger Flores]

*	Fixed problem with installed Palm OS files and .psf files not
	getting added to the MRU lists if the list was empty. [Scott
	Johnson]

*	Fixed problem with MRU lists getting too long. [John Kinast]

*	In our SysUIAppSwitch patch, release any leftover command parameter
	blocks (if any). [Catherine White]

*	Fixed problem with the Escape key used to wake up a sleeping device
	also showing up in the event queue. [Daniel McCarty]

*	(Mac) Added support for Escape, F1-F4, page up/down.

*	Added special checks and error messages for SANE Math calling
	sequences. [Steve Lemke]

*	Rolled in Adam's fixes to conditional breakpoints. [Adam Dingle]

*	Fixed problems with NetLibSocketAddr. [Adam Dingle]

*	Converted to VC++ 6.0.

*	Fixed problem with getting names of library routines in the
	profiling system. [Adam Dingle]

*	Made Profile/Initialize implicit. [Adam Dingle]

*	Added explicit parent node information to profiling output text
	file. [Adam Dingle]

*	Fixed problem with recursive routines recursing too deep in the
	profile output functions.

*	The workaround for the old FindSaveFindStr bug didn't always work;
	it would sometimes still let the bug emerge. Made a small tweak to
	keep it suppressed.

*	Turned off stack overflow checking facility. It would occasionally
	cause the emulator to walk the dynamic heap when the heap was in an
	inconsistant state, resulting in spurious "...regular checkup..."
	error messages. [The IBM guys: Paul Silagi, Chunk Bazil, Mike Nagy]

*	Added support for the contrast button on Palm Vs. The button is on
	the right-hand side of the display graphic, opposite from the power
	button. You can't see it, but clicking on it brings up the contrast
	dialog. The dialog itself has no visual effect yet. [Ron Flax]

*	Breakpoints are now preserved across reboots. [Steve Lemke]

*	Totally rewrote the way (a) tailpatches and (b) soft breakpoints
	are handled. Previously, Poser would get control by handling
	special opcodes written into emulated memory: TRAP $D for
	tailpatches and TRAP $0 for soft breakpoints. However, there were
	problems with this approach. For one thing, what would happen if we
	needed to write a TRAP $D and TRAP $0 to the same memory location.
	You couldn't do it. There was no way, for example, to use
	PalmDebugger to set a breakpoint just after a call to a system
	function that Poser tailpatched. Also, Adam Dingle pointed out a
	problem with the actual routines involved: on very rare occasions,
	if an interrupt occured just after one of those TRAP $Ds or TRAP $0s
	were executed, then the next opcode executed would be the one that
	originally resided at that location, an NOT the first opcode in the
	interrupt routine. Anyway, this whole mess has been replaced with a
	new mechanism that doesn't alter the emulated RAM or ROM. [Steve
	Lemke, Adam Dingle and the IBM guys: Paul Silagi, Chunk Bazil, Mike
	Nagy]

*	Sped up performance by 20%. But since the previous change slowed
	things down by 13%, that's not as great as it first sounds.

*	Poser now ignores soft breakpoints (those installed by
	PalmDebugger) it encounters when it calls into the ROM for it own,
	nefarious, "between the cycles" purposes. [Steve Lemke]

*	Fixed problems trying to re-establish a sockets connection after
	it's been broken when the external debugger quit. [Ron Marianetti]

*	When asked for a ROM, .psf, .prc, etc., file, set the initial
	directory to the last directory used for that file type.

*	(Windows) Allow multiple .prc file selection in the Open File dialog.

*	ROMs with invalid header checksums now generate a non-fatal warning
	instead of a fatal error. [Paul Dugas]

*	Allow for zero-length objects appearing at the end of .pdb files.
	[Christopher Hunt]

*	Massive spring cleaning of sources. Now all major sub-systems have
	a consistant interface for creating new sessions, resetting
	sessions, saving sessions, loading sessions, and disposing of
	sessions. Also, a lot of naming and scoping inconsistancies were
	taken care of. Also, namespaces were forsaken in favor of classes
	with static member functions; the CodeWarrior and VC++ browsers
	didn't handle namespaces too well.

*	In line with the above, .psf files are now compressed, taking as
	little as 15K for one that was normally 1 Meg. Note: the time it
	takes to compress an image can vary wildly, sometimes being nearly
	instantaneous, and sometimes taking upwards of 15 seconds. I'm not
	sure why the difference occurs...

*	Also in line with the source code spring cleaning, the entire
	emulator state is now saved to the session files. When loaded from
	the session files, the entire emulator state is restored. This means
	that you are returned right back to where you were when you created
	the session file; you do not have to go through the process of
	rebooting the "device".

*	Only heed the "Continue Past Warnings" option if a Gremlin is
	actually running. [Scott Johnson]

*	Added support for the "dead battery" pin on Port D on EZ devices.
	This should cut down the number of low-battery warnings on those
	devices. [Jesse Donaldson]

*	Don't insert keyboard or mouse events if stopped in the debugger or
	if the main emulator window is not active.

*	Added support for 4-bit LCD mode on EZ's. Found and fixed a long-
	standing bug where the emulated copy of the LCD display might not
	get updated if the lcdPageWidth register was updated.

*	If the emulated serial port was open and a reset occured, close the
	host serial port.

*	On the Mac, session files contain references to their associated
	ROM files via aliases. On Windows, the references are stored as
	full pathnames. This is old news. What's new is that if either of
	these mechanisms fails to find the ROM file, Poser now looks first
	in the same directory as the session file for a ROM file with the
	same name, and if that fails looks in Poser's own directory for a
	ROM file with the same name.

*	When reporting a corrupted heap, display also the address of the
	chunk header. [Adam Dingle]

*	Implemented Part I of Gremlin Hordes: You can now periodically have
	the complete emulator state saved while a Gremlin is running. This
	state can be reloaded, and the Gremlin restarted.

	This feature is controlled via a new setting in the New Gremlin
	dialog. There is now an editable item called Snapshot Frequency.
	The number entered here is the number of events that should occur
	between the time snapshots are taken. The default value is 10,000
	events. By setting this value to zero, you turn off the snapshot
	feature.

	Snapshots are saved in a single directory in the Poser directory.
	The name of the directory is "GremlinStates_####", where #### is a
	value ensuring the directory name's uniqueness.

	Snapshots are saved in this directory with the name Event##########,
	where ########## is the event number at which the snapshot was
	taken. Snapshots are merely session files, so they can be reloaded
	at any time, just like regular session files.

	Since snapshots are taken while a Gremlin is running, the Gremlin is
	automatically turned off when the snapshot is reloaded. However,
	Poser displays the Gremlin Control window when the snapshot is
	loaded, allowing you to resume the Gremlin if you want. [Roger
	Flores]

*	Fixed a bug in the Gremlins facility that validates forms and form
	objects before trying to manipulate any of them. A call to
	FrmGetObjectType would occassionally return garbage, leading the
	rest of the function astray. [Scott Maxwell]

*	Added Unix release. [Ben Williamson, David Creemer]

*	Fixed serial port not working on EZ devices (a pin moved from port
	F to port D during hardware development, and I missed it). [Florent
	Pillet]

*	Don't validate form objects and their sizes on Palm OS 1.0 devices.
	The built-in applications don't appear to follow the rules. [Andrew
	Ball]

*	Rolled in Adam's conditional breakpoint enhancements. [Adam Dingle]

	"A register reference in a conditional breakpoint expression can
	 use either a direct (i.e. "d5") or indirect (e.g. "12(a6)")
	 addressing mode. Furthermore, a register expression can be
	 suffixed with either ".b", ".w" or ".l" to indicate that the
	 expression to be compared is either a byte, a word or a long. An
	 an example, "12(a6).w == 1000" compares the two bytes at memory
	 location (a6 + 12) to the value 1000. "d4.b == 100" compares the
	 low byte of the d4 register to the value 100.

	"I have found this enhancement to be extremely useful for breaking
	 into the debugger when a local variable (typically referenced off
	 the a6 register in code built by CodeWarrior) has a certain value."

*	(Windows) Fixed problem with running on dual-processor boxes. [TBD]

*	There is now a "white paper" on Poser usage at the following URL:

		<http://www.palm.com/devzone/docs/pose.htm>


Changes for 2.1d26 (2/26/99)
----------------------------
*	On the Mac, we were saving the device type to the .psf file twice.
	On Windows, we weren't saving the country type at all. [Waddah
	Kudaimi]

*	System call logging now also gets the names of library functions,
	and attempts to make a better stab at "dispatch" system functions
	(where a single dispatch code sub-dispatches to a suite of other
	functions, as with the Floating Point Manager). [Ken Krugler]

*	Sped up debugger communications via sockets by 20x. [Ron Marianetti,
	Mark Corry]

*	(Windows) Added conditional breakpoints. This is bolted on for now,
	but should eventually be merged more seamlessly. Changes provided
	by Adam Dingle of AvantGo. From Adam's release notes:

	New debugging features

	I've posted several messages recently to the palm-dev-forum mailing
	list in which I've pointed out several limitations of the debugger
	in CodeWarrior for PalmOS: it doesn't support data breakpoints
	("watchpoints") and its conditional breakpoint implementation is
	very slow. To work around these limitations, I've added both data
	breakpoints and fast conditional breakpoints to the 2.0b3 emulator.

	A data breakpoint allows you to monitor a range of memory addresses
	for writes. When any code tries to write to the addresses you've
	monitored, execution will immediately break into the debugger. This
	can be extremely useful when you know that a certain data structure
	is being corrupted somewhere in your program, but you don't know
	where it is happening.

	To set a data breakpoint in the modified emulator, first launch the
	emulator, then start the debugger in CodeWarrior. In the emulator,
	choose the "Breakpoints" menu item. A dialog window will pop up;
	select the "Enabled" check box, then enter a start address and a
	number of bytes to monitor. The address and number of bytes may be
	either hex ("0x89abc") or decimal ("12345"). As an example, if the
	start address is 0x10000 and the number of bytes is 8, then any
	write to addresses 0x10000 through 0x10007 will break into the
	CodeWarrior debugger.

	Conditional breakpoints allow you to break when execution reaches a
	given address, but only when a certain condition is true.
	CodeWarrior for PalmOS supports conditional breakpoints, but its
	implementation is so slow as to be practically useless. As I
	pointed out in an earlier post to the palm-dev-forum list, in the
	CodeWarrior debugger, each iteration past a conditional breakpoint
	takes about 0.3 second, so you have to wait for an eternity if you
	have to iterate hundreds or thousands of times until the break
	condition is true (as is often the case in debugging).

	The modified emulator allows you to set conditional breakpoints with
	virtually zero overhead. To set conditional breakpoints, first
	launch the emulator, then start the CodeWarrior debugger. When you
	are stopped in the debugger, choose the "Breakpoints" menu item in
	the emulator. A dialog window will pop up which will allow you to
	set up to 6 conditional breakpoints. To set a breakpoint, choose a
	breakpoint slot and press the "Edit" button. A window will pop up
	where you can enter an address and a condition. The address can be
	either hex ("0x2468ace2") or decimal. Typically, you will determine
	the address where you want to break by selecting the "mixed" view in
	CodeWarrior to see a mix of source and assembly code. The condition
	you specify must be of the form "<register> <condition> <constant>",
	where

		<register> is one of the 68000 registers D0...D7 or A0...A7
		<condition> is ==, !=, <, >, <=, or >=. (Important: for now,
			all comparisons are UNSIGNED. This means that you can't use
			a condition such as "D0 < 0", which will always be false).
		<constant> is a hex or decimal constant

	By choosing the "mixed" view in CodeWarrior, you can see which 68000
	registers represent which local variables in your program, and so
	you can construct an appropriate break condition involving a
	register.

*	Exposed Palm IIIx and Palm V support.

*	Fixed problem with ROM Transfer on EZ devices. [Yoshiyuki Kubo]

*	Relaxed form-object-validation rules to allow for zero-sized
	gadgets and tables. [Roger Flores]

*	Fixed bug in AutoRunAndQuit mechanism where Poser would quit when
	a sub-launched application would quit, not when the application-of-
	interest would quit. [Steve Haneman]

*	NetLibDmReceive should really work this time. [Doug Morrison]


Changes for 2.1d25 (2/16/99)
----------------------------
*	Different method for checking whether or not a library function is
	implemented. Poser still only checks known (i.e., Palm Computing)
	libraries, but now instead of using a hardcoded table, it takes
	advantage of the fact that the "open library" function appears right
	after the dispatch table. [Tim Wiegman, Adam Hampson]

*	(Mac) Added WDEF project to Poser project. Changed the way the
	outline region is calculated (should be more accurate now).

*	Added support for internal faster trap dispatching mechanism. The
	major effect of this is that Poser can now support non-debug Palm
	VII ROMs again. [Bob Ebert]

*	Added support for Autorun and AutorunAndQuit directories. These
	directories are like the Autoload directory. Applications in
	Autorun are loaded, and then one is chosen to be executed (by
	convention chosen to be the last file in the directory).
	Applications in AutorunAndQuit are loaded, and then one is chosen to
	be executed in the same way. When that application quits, Poser
	quits. If there are files in both Autorun and AutorunAndQuit, the
	last file in AutorunAndQuit is chosen for execution. The files in
	those directories can also contain launchable documents such as
	.PQAs. [Steve Haneman]

*	(Windows) Centered the LCD. [Scott Johnson]

*	Better logging facilities. Here's what we've got so far:

	- Error Messages: undefined and unimplemented.

	- Warning Messages: If a dialog comes up that can be dismissed by
		clicking on the Continue button, this option causes the message
		to be logged. - Misc Gremlin Info: undefined.

	- Assembly Opcodes: unimplemented. Will eventually log assembly-
		level trace information (registers, PC, opcodes, etc.)

	- Posted events: events entered into the system by calls to
		EvtAddEventToQueue, EvtAddUniqueEventToQueue,
		EvtEnqueuePenPoint, and EvtEnqueueKey.

	- Received events: events returned by EvtGetEvent, EvtGetPen, and
		EvtGetSysEvent,

	- System calls: calls to Palm OS functions.

	- Application calls: unimplemented. Calls to functions in your own
		application. In order for this to work, the name of the function
		needs to be stored in memory following the function itself.
		CodeWarrior supports this convention, gcc currently does not.

	- Serial Activity: serial port being opened and closed, changes in
		serial port settings.

	- Serial Data: data being transmitted and sent.

	- NetLib Activity: calls to NetLib functions, parameter values and
		return values.

	- NetLib Data: data being transmitted and sent.

	- ExgMgr Activity: unimplemented. You get the idea...

	- ExgMgr Data: You get the idea...

	- High-level Debugger Activity: messages received from an
		external debugger and the replies sent back.

	- High-level Debugger data: details of the messages sent back and
		forth. Not all packets currently display all their data when
		this mode is turned on.

	- Low-Level Debugger Activity: trace of the low-level mechanisms
		that receive raw data from external debuggers and the raw data
		being sent back.

	- Low-Level Debugger Data: dumps of the raw data being sent back and
		forth.

	These options are presented in a dialog box with two tabs: Normal
	and Gremlins. The first tab contains options which are active
	during normal emulator use. The second tab contains options which
	are active when using Gremlins.

	Along with this new dialog, the Debug Options and New Gremlins
	dialogs have also been changed. The logging checkboxes have been
	removed from Debug Options (along with some currently unused
	checkboxes). The logging checkboxes in the New Gremlins dialog have
	been replaced with a "Logging Options..." button that brings up the
	Logging Options dialog. A new checkbox ("Continue Past Warnings")
	has been added to the New Gremlins dialog that controls what happens
	when a non-fatal error dialog is displayed; if possible, these error
	dialogs will automatically be dismissed if this option is checked.

	For performance reasons, all logged information is stored in an
	internal memory buffer. Additionally, only the most recent
	information is kept. After a certain threshhold, old information is
	discarded. The amount of information kept is initially 1Meg, but
	that can be changed by calling HostSetLogFileSize.

	The in-memory buffer is flushed on the following occassions:

		- The application quits.
		- An error is displayed.
		- A new Gremlin is started.
		- An exception occurs.

	Logged data is written to a file named "Log####.txt", where #### is
	a number ensuring the file name's uniqueness.

	Contents of the log file are of the form:

		<Time>	<Gremlin Event>		<Text>

	<Time> is the zero-based time in seconds, where the base is the time
	of the first event logged.

	<Gremlin Event> is the event sequence number if Gremlins is running.
	This field is omitted if Gremlins is not running.

	<Text> is the log text. Output is generally one line long, with the
	major exception being hex dump information.

*	Allow more concurrent tailpatches. Previously, there was a fixed
	number of traps that could be tailpatched at once. Exceeding this
	limit would cause Poser to abort().

*	Allow one particular SecurityLib function to access low-memory.
	[Gavin Peacock]

*	Implemented HostSetLogFileSize. Increased default log size from
	128K to 1Meg. [Dan Rowley]

*	Support netSocketOptSockNonBlocking in NetLib redirection. Also
	support the UDP calls (NetLib[Send|Receive](PB) with non-NULL
	address specifications). With these changes, Windows users can now
	Network HotSync. [Tilo Christ]

	Here's now (this is for Palm III):

	- Get the Network HotSync files from:

		<http://www.palm.com/custsupp/downloads/netsync.html>

	- Run "nhssetup.exe" to extract "setupex.exe".

	- Run "setupex.exe" to install Network HotSync.

	- Fire up Poser.

	- Install "netsync.prc". There will be one in your ...\Palm
		Desktop\ <UserName>\Install\ directory or your ...\Palm
		Desktop\add-on\ directory.

	- Go to the HotSync application.

	- Select the "LANSync Prefs..." menu item.

	- Select the "LANSync" option. Click on "OK".

	- Select the "Primary PC Setup..." menu item.

	- Enter your Primay PC's IP address. You can get this from the
		HotSync Manager (click on the HotSync icon in the TaskBar,
		select the "Setup..." menu item, click on the "Network" tab, and
		click on the "TCP/IP Settings..." button). Click on "OK".

	- Click on the "Select Service" button under the "Modem Sync" icon.

	- Create a new service or modify an existing one. Either way, the
		result should be a service with the phone number set to "00".
		Exit that screen.

	- Click on the "Modem Sync" icon and sync as usual.

*	(Mac) Additional note on NetLib redirection: currently, support
	is implemented with the help of the GUSI library. This library is
	built on top of MacTCP, which doesn't support the settting or
	getting of socket options. Any call to NetLibSocketOptionGet or Set
	will result in an error on the Mac. Eventually, emulation will be
	performed with direct Open Transport calls, and this limitation will
	go away.

	In the meantime, this limitation affects the ability to Network
	HotSync from Poser runningon the Mac to HotSync running on a PC.

*	Fixed a long-standing 2.1dx bug where the screen would not always
	reflect the state of the LCD buffer. One way this could happen is
	if the screen were modified in a strictly high-memory to low-memory
	order (as happens when a document is scrolled down).

*	(Windows) Fixed byteswapping problem in the addresses returned by
	NetLibGetHostByName. [Pedro Alves]

*	The text file dumped by the profiler always used to be named
	"Profile Results.txt" and would be written to the current default
	directory. Now the file name is based on the file name used for the
	binary output and is stored in the same directory as it. This is
	mostly useful if the output file name is specified by
	HostProfileDump (). [Steve Haneman]

*	While running Gremlins, validate the sizes of various form objects.
	[Chris Antos] The rules are:

	*	frmBitmapObj, frmLineObj, frmFrameObj, frmRectangleObj,
		frmLabelObj, frmTitleObj, frmPopupObj: Don't care. We don't
		touch them or look at them.
	*	frmControlObj: if the style is popupTriggerCtl, allow a
		zero-width object.
	*	frmListObj: if the number of items is zero, allow a zero-height
		object.
	*	In all other cases, disallow zero-height or zero-width objects,
		as well as objects completely offscreen.

*	(Windows) Added mnemonic keys to the menus and dialogs. [Scott
	Johnson]

*	Adjusted the internal rectangle indicating the bounds of the hard
	buttons on the case graphics, now that the case graphics have
	changed. [Horace Ho]

*	Enable storage heap write access in our NetLib-redirected version
	of NetLibDmReceive. [Neil Rhodes]

*	Turned back on the checks to see if someone accesses the area from
	0x00018000 to 0x00020000. [Adam Dingle]

*	Added Japanese color silkscreens (no B&W yet).


Changes for 2.1d24 (1/25/99)
----------------------------
*	Yow...time to start updating those copyright statements...

*	Fixed performance problems with logging (this really affected
	Gremlins performance). [Andrew Ball]

*	Made small change to heap tracking routines; this change really
	speeds up overall performance. A lot of performance tuning still
	needs to be done here. [Scott Johnson]

*	NetLib redirection. [Phil Shoemaker, Ron Marianetti]

	Here's the current list of what doesn't yet work:

		Raw sockets (not on the Mac at all, works on Windows only if
			your version of WinSock supports it).

		PalmOS-specified options:
			netSocketOptSockNonBlocking
			netSocketOptSockRequireErrClear
			netSocketOptSockMultiPktAddr

		BSD sockets options that are not supported by "NetLib redirection"
		because the underlying WinSock library doesn't support them:
			netSocketOptTCPMaxSeg
			netSocketOptIPOptions
			netSocketOptSockSndLowWater
			netSocketOptSockRcvLowWater
			netSocketOptSockSndTimeout
			netSocketOptSockRcvTimeout

		Timeouts

		NetLibGetMailExchangeByName

		UDP stuff

		Turning NetLib redirection on and off on the fly. It might be
		safer to change the setting, then quit and restart Poser (or at
		least reset the ROM).

		MacTCP doesn't appear to timeout if it can't make a connection
		to a socket on a remote machine that isn't listening on that
		socket. There may be other cases where MacTCP doesn't timeout
		or return some other error. In those cases, the PalmOS application
		will hang. You should be able to press Cmd-. to get out of those
		situations, causing the patched NetLib to return a user-cancelled
		error number.

	Comments on how NetLib redirection works:  Poser has the ability
	to intercept process execution at the points where an OS function
	is called and where the OS function returns. Poser can then
	execute additional code at these points, and can even skip
	calling the ROM version at all if it wants. That's what happens
	with NetLib redirection. The following calls are intercepted
	and replaced with versions that make the corresponding host-
	specific Ethernet calls:

		NetLibClose						NetLibConnectionRefresh
		NetLibDmReceive					NetLibFinishCloseWait
		NetLibGetHostByAddr				NetLibGetHostByName
		NetLibGetMailExchangeByName		NetLibGetServByName
		NetLibHandlePowerOff			NetLibOpen
		NetLibOpenConfig				NetLibOpenCount
		NetLibOpenIfCloseWait			NetLibReceive
		NetLibReceivePB					NetLibSelect
		NetLibSend						NetLibSendPB
		NetLibSleep						NetLibSocketAccept
		NetLibSocketAddr				NetLibSocketBind
		NetLibSocketClose				NetLibSocketConnect
		NetLibSocketListen				NetLibSocketOpen
		NetLibSocketOptionGet			NetLibSocketOptionSet
		NetLibSocketShutdown			NetLibWake

	Because NetLibOpen (and its cousins) is entirely patched out, the
	Palm OS version of NetLib never actually gets opened. This means
	that the remaining, unpatched NetLib calls are made in the context
	of a closed NetLib. I don't know if this differenc will affect
	anyone, but it might be good for you to know.

	Comments on Palm VII supprt:  Palm VII files are not yet externally
	available. But Poser is preparing for that day, so when they *are*
	available:

		Download the prerelease Palm VII rom and the required Debug
		wireless panel which will configure the emulated OS so that
		it knows you're not on a wireless device.

		To configure: open the ROM with the Palm OS Emulator, wait
		until it has completed the boot process, and install the debug
		wireless panel by dragging the prc onto the running emulator
		window. Now open the Prefs application and go to the "Wireless"
		panel.	You'll see a box there entitled "wireline ip".	Tap on
		it, clear the existing selection, and enter "207.240.80.136".
		Finally, open the preferences for the Palm OS Emulator itself
		(right-mouse click under Windows), and turn on the "Redirect
		Netlib calls to host TCP/IP" option.

		Now when you use a PQA, it will connect to the web site with
		your PC's internet connectivity instead of a wireless radio.
		(Warning: it is much faster that way!  Pages will load much
		more slowly when transmitted over the air.)	 Also, there may
		be warnings where the Emulator notices possible bugs in the ROM.
		Usually these are benign (but indicate the prerelease status of
		the ROM) - pressing "continue" will usually get you by them.

		You can install PQAs by dragging them onto the Emulator window,
		or using the Emulator's menu commands.	Just make sure you're
		neither in the Launcher when installing an application, nor
		running the app you're upgrading. (Installing software while
		the device is booting is also a bad idea.)	The Calculator is
		a convenient, safe app to be in when installing software.

		Note that if your PC is behind a firewall, you might not be able
		to connect to our proxy server. Ask your system administrator to
		enable port 5002 for you.

		If you get an error message along the lines of "no interfaces
		found: net - 12", that's an indication that you didn't select
		"Redirect NetLib" in the preferences panel. Getting the error
		message "wrong socket type" is an indication that you didn't
		install the DgbWirelessPnl application.


*	More fixing of semaphore warnings: duh, changing the text of the
	warning message doesn't change the test itself! [many...]

*	Made .prc/.pdb file loading more robust: the contents are now
	validated before accessing them. This helps against problems
	like 0x0A's turning into 0x0D's because of network downloading.

*	(Windows) Fixed byteswapping problem that would occur when gdb
	tried to set a breakpoint [Ben Thomas].

*	(Mac) Fixed problem with getting 'Could not save the file ""
	because the file wasn't found' when trying to save a session.
	[???]

*	Palm OS 1.0 support: Gremlins and pen events weren't being
	inserted into the system because EvtGetSysEvent blocked on
	SysSemaphoreWait instead of SysEvGroupWait in that version
	of the OS (we were only patching the later to detect when
	to insert events into the system).	Now I patch both functions.
	[Andrew Ball, Ken Hancock]

*	Set HotSync user name at boot-up. Name specified in preferences.
	[Richard Ziegelmaier, et al]

*	Check for and report for out-of-range access to library functions.

*	The workaround for SysAppExit in d22 was hiding the workaround for
	FindSaveFindStr from d20. Adjusted the tests so that one no
	longer hides the other. [Matt Disher]

*	Exposed Palm VII and Web Clipping support in external release.

*	(Windows) Fixed a problem in the mechanism for exchanging debugger
	information with the Metrowerks debugger. This problem could
	potentially cause debugger packets to be ignored. However, there's
	no evidence that this is the cause of the "Failed to connect to
	remote" problem that some people are still reporting with R5.
	[Ben Sessoms]

*	When handling SysPktRtnNameCmdType packets, force the given address
	to be even. Otherwise, we'll generate an internal error as we try
	to walk the function starting at an odd address. [Ben Sessoms]

*	Fixed long-standing bug that would crash the New Gremlin dialog if
	the last item in the list had a ROM-based version and a RAM-based
	version.

*	Sort the items in the New Gremlin dialog case-insensitively.

*	Added support for launching applications with documents. [Gavin
	Peacock]

*	Updated bitmaps. [Ken Krugler, Stephen Best]

*	Fixed problem with getting a "yadda accessed memory manager data
	structure" while dumping the results of profiling. [Adam Dingle]

*	Removed most (hopefully all) influences of Poser's memory
	accessing and ROM function calling from the profiling output.

*	Fixed the profiler to handle TRAP $F / <dispatch number> sequences
	where <dispatch number> is not in the range 0xA000-0xAFFF (some
	development systems leave off the leading "A"). [Adam Dingle]

*	Bumped the default number of profiled functions from 20000 to 48K.
	[Steve Haneman]


Changes for 2.1d23 (12/16/98)
-----------------------------
*	(Windows) fixed some byteswapping problems with debugger packets.
	(Actually, put *back* some bugs that I fixed...)

*	Re-organized sources.

*	Added ability to patch libraries. Started patching out NetLib.
	Note that there is no actual NetLib redirection in this release.

*	Fixed some serial port emulation problems: mirrored UART settings
	into the host serial port just after the port has been opened, not
	after the first call to SerSetSettings (there may *not* be a call
	to SerSetSettings!).

*	Generating a profiling report now also produces a text file for
	use on platforms that can't read the Metrowerks Profile tool
	file format.

*	(Windows) Added profiling configuration.


Changes for 2.1d22 (12/7/98)
----------------------------
*	Only warn about MemSemaphore usage on ROMs that themselves hold the
	memory semaphore correctly. This time for sure!  Also only warn
	when the semaphore has been held for 1 minute (previously, the
	timeout was 10 milliseconds).

*	Completely overhauled serial port emulation. More of the UART is
	emulated more faithfully.

*	If no serial port is selected for emulation pass through and we're
	not in loopback mode, drop transmitted bytes on the floor.

*	If IrDA is using the serial port, drop transmitted bytes on the
	floor (for now).

*	Re: SysAppExit accessing a deleted stack: SysTaskDelete and a whole
	host of other functions also access the deleted stack until the
	kernel has a chance to switch to another stack. Much gnashing of
	teeth was performed until an appropriate alternate heuristic could
	be found.

*	Let PrvCompressedInnerBitBlt access bits outside the allocated
	buffer.

*	(Windows) Fixed problems with Cancelling a ROM download.

*	Another attempt at fixing -192 errors at startup.

*	(Mac) Fixed problem with opening two windows when starting a session
	by double-clicking on a ROM file.

*	(Mac) Goosed debugger messaging. Previously, an asynchronous
	callback function would get called when Poser received a packet from
	the debugger. The callback function would set a boolean and then
	call a Toolbox function to wake up the application. The next time
	the application's main-event-loop was entered, the packet would be
	handled. However, the overhead of waking up the app and waiting for
	the main-event-loop to be entered was way too high. I now handle
	the debugger packet immediately in the asynchronous callback
	function. This means that the debugger packet is handled in the
	context of the calling application (the external debugger). If
	Poser were to crash at this point, it would crash the debugger, not
	Poser.	Additionally, we have to be very careful not to allocate any
	memory from within the callback, as such memory would be allocated
	from the debugger's heap, not Poser's.

*	Changed some of the rules for interacting with an external
	debugger.

	In order for an external debugger (PalmDebugger, MWDebug, or gdb) to
	talk with a hardware device, the hardware device has to be
	listening. There are two things a debugger can talk to: the Debugger
	socket and the Console socket.	These two sockets correspond to the
	two windows in the PalmDebugger.

	To get the ROM to listen on the Console socket, the developer has to
	execute shortcut-.2. To get the ROM to listen on the Debugger
	socket, the device has to cause an exception somehow. Doing
	something wrong (e.g., access invalid memory, divide by zero, etc.)
	does this. Executing a DbgBreak also does this, which is what
	happens when the user executes shortcut-.1. After the exception
	occurs, the ROM goes into a loop where it listens for and responds
	to debugger commands.

	Because external debuggers talk directly with Poser and not the ROM
	when debugging with Poser, there's no need to execute shortcuts or
	cause exceptions in order to start debugging. Poser is perfectly
	capable of handling debugger requests, letting the emulated process
	continue on its merry way.

	However, when dealing with commands sent to the debugger socket,
	it's very important that the state of the emulated CPU not change.
	Often several commands are issued, ultimately ending with some
	command that restarts the emulated CPU. During these exchanges, the
	debuggers assume that the state of the CPU has not changed since
	"debug mode" was entered. For this reason, when commands are sent
	to the Debugger socket:

		- Poser needs to be in "debug mode". That means that it has
		  halted any emulation and is just idling.	If commands for
		  the Debugger socket come in and Poser is not in debug mode,
		  the commands are ignored.
		- The exception to this rule is the "get state" Debugger
		  command.	This command is issued when the user types "att"
		  in the Debug window.	It indicates that the user wants to
		  enter debug mode for the purpose of setting breakpoints,
		  examine memory, etc.	As a courtesey, Poser will enter
		  debug mode when it sees this command.

*	Install a 'pose' feature so that applications can tell if they are
	running under Poser or not.

*	Install a 'gdbS' feature when connected via a socket to an external
	debugger. The existance of this feature causes programs written
	with prc tools to enter the debugger when they are launched.

*	(Windows) Removed a minimum version check that was preventing us
	from using sockets on Windows '95.


Changes for 2.1d21 (11/12/98)
-----------------------------
*	Allow for NULL access bug in FldDelete.

*	(Windows) Allow for launching of Emulator by double clicking on
	.psf or .rom files.

*	Added back a whole slew of strings accidentally deleted in d20.


Changes for 2.1d20 (11/10/98)
-----------------------------
*	Support full debugger protocol for latest PalmDebugger (with
	integrated Poser support).

*	Fixed button mapping problems with EZ hardware.

*	Added Greg's Ymodem code for downloading ROMs.	This includes his
	fix for high-baud rate downloads.

*	Support for higher baud rates.

*	Re-establish serial port after Preferences/Properties dialog.

*	Allow for access to deleted stack in SysAppExit.

*	Allow for bug in NetPrvTaskMain that accesses low-memory.

*	Allow for bug in NetPrvSettingSet that reads from a random memory
	location.

*	Tighten up on some inappropriate memory checks (only let some
	functions get away with murder in older ROMs).

*	Removed check for bug in PrvGetBatteryPercent (it's been fixed).

*	Changed formatting of time displayed in Gremlins window. Was in
	seconds, now in hh:mm:ss.

*	Revoked Memory Manager privileges for MemCmp, MemMove, and MemSet;
	they no longer have free run of RAM like other MemMgr functions.

*	Allow for bug in FindSaveFindStr which reads off the end of the
	handle passed to it.

*	Similar comments for FntDefineFont. When copying the contents of
	an old, smaller buffer into a new, larger buffer, it copies the
	size of the new buffer, causing MemMove to walk off the end of the
	old buffer.

*	Let ScrInit access unallocate memory for when it copies the splash
	screen from its temporary location to the real LCD buffer.

*	Re-enabled code that reports a bug in BackspaceChar, but only for
	newer ROMs.

*	Internal change: Better encapsulation of what Palm OS bugs are
	fixed in what version.

*	Only warn about MemSemaphore usage on ROMs that themselves hold
	the memory semaphore correctly.


Changes for 2.1d19 (10/30/98)
-----------------------------
*	(Windows) Fixed problem with trying to auto-reload the previously
	used .psf file on startup.

*	(Windows) Allow the user to click on the close box of the Startup
	dialog (the one saying New/Open/Download/Exit).

*	Fixed two problems with heap management on 2.0 ROMs. First, I was
	failing to recognize the fact that zero in the size field of a heap
	header means that the heap is 64K bytes long. Second, I was
	attempting to access *all* fields of the terminating sentry chunk.
	This chunk only has a size field; attempts to access subsequent
	fields may fail if the sentry is at the end of RAM.


Changes for 2.1d18 (10/29/98)
-----------------------------
*	Disabled Profiling menu items and Transfer ROM menu item until
	the functionality behind those items can be implemented.

*	Added "Dragonball EZ" menu item to device list.

*	(Windows) Fixed problem with stale reference to the LCD window after
	its been closed.

*	Fixed problem in MC68EZ328Bank::GetLCDDepth where it would return 4
	for grayscale mode instead of 2.

*	(Mac) Fixed problem getting -192 error on startup with a fresh
	set of preferences.


Changes for 2.1d17 (10/28/98)
-----------------------------
*	Fixed bug in Gremlins when logging information; an internal counter
	would wrap to be negative after a large number of events have been
	posted.

*	Re-laid out Debug Options dialog and hooked up the checkboxes.
	Disabled the ones that aren't supported yet.

*	(Windows) Fixed another "Unhandled exception caught in main" bug:
	this one would occur when the Poser would try to open a .psf file
	that no longer existed (the previous cause of this bug occured
	when Poser would try loading a .rom file that no longer existed).

*	(Windows) Remove old registry entries when found.

*	When an error occurs accessing a file, consistantly set the
	%filename parameter for error messages.

*	Added "Log error messages" checkbox to New Gremlin dialog.

*	Save Gremlins settings to preferences.

*	Fixed bug in meta-memory tracking stuff that would trash the
	emulator's heap if it was emulating a device with 256K of RAM
	or less.

*	Clear the serial FIFO queues on reset.	Fixes a problem with their
	overflowing and serial port emulation is not turned on (that is,
	"None" is selected in the Preferences/Properties dialog).

*	Fixed problems with trying to use "&string_object[0]" on empty
	strings. Apparently, there is not necessarily any memory
	allocated for empty string objects, so attempting to take the
	address of the string fails.


Changes for 2.1d16 (10/22/98)
-----------------------------
*	Allow the opening of locked .rom, .psf, .prc, .pdb, and .pqa files.

*	Updated TextMgr calls to reflect new (long) parameters.

*	Added Autoload facility.

*	Fixed problem with trying to wakeup the device (by calling
	EvtWakeup) when the interrupt level mask was too high.

	(Backed this modification out temporarily.	Seems that the ROM can
	 spend a large percentage of its time at this interrupt level if
	 it's not doing anything else useful, preventing the user from
	 clicking on the LCD screen.)

*	Conditionalized the code so that Palm VII, Palm V, and Palm IIIx
	could be included or excluded separately.

*	Conditionalized *this* file so that secret stuff can be stripped for
	external releases.

*	Fixed the "Save Screen" functions (I'd commented them out while
	adding support for lcdPageWidth and lcdPanningOffset registers and
	forgot to go back and clean up).


Changes for 2.1d15 (10/15/98)
----------------------------
*	Bug fix: my wrapper function for TxtGetCharBounds was accidentally
	calling TxtGetNextChar (copy & paste error).

*	Bug fix: the routine that maps a range of "host" memory into
	"emulated" memory would round the base address down to the nearest
	multiple of four, but the routine that would reverse the process
	didn't do the same rounding. This meant that the routine that
	unmapped would be unable to find the address recorded by the routine
	that did the mapping, and entries would never get unmapped.

*	Bug fix: if Poser reads in a preference setting for a Japanese
	silkscreen and that version of Poser doesn't support Japanese
	silkscreens, change the setting. Otherwise we'd get a -192
	(resource not found) error.

*	Relaxed MemSemaphoreReserve/Release testing. Now only track time
	when "write" parameter is true.

*	Bug fix: allow debuggers access to reserved parts of Dragonball
	memory.

*	(Mac) Show errors in a movable modal dialog, allowing the user
	to switch to the Finder, possibly for the purpose of launching a
	debugger.

*	Allow selection of multiple items in New Gremlins dialog. These
	items are also reselected when the dialog is re-opened.

*	Added HostGremlinNumber, HostGremlinCounter, HostGremlinLimit.

	"The reason I'm asking is that I'd like to log info to figure out
	 what's going wrong with a specific gremlin test case, but since
	 it's pretty far along (e.g. 100000 steps) I only want to start
	 logging when I'm getting close to where I think the problem will
	 occur. The problem occurs after a different number of steps
	 depending on the gremlin seed value, thus I'd like to set my
	 'start recording' value based on which gremlin is running."

*	Added HostLogFile.	This function returns a special HostFILE* that
	can be used by Palm OS applications that want to write to the same
	file that any Poser facility is writing to. This HostFILE* is
	special in that it is only open when Poser wants it to be, and is
	write-only; any HostFxxx functions that attempt to read from
	HostFILE's will fail when fed this HostFILE*.

	Output occurs only when Poser has turned on logging. If the
	Palm OS application calls something like HostFPrintF(hostLogFile,
	"...", ...) and logging is not turned on, the output is discarded.

*	Added HostSetLogFileSize. This function sets the maximum amount of
	text written to the file created by Poser's logging facilities.

*	If Gremlins is running and a message needs to be displayed that can
	be handled by clicking on a Continue button, write that message to
	a log file instead and implicitly click on the Continue button.

*	If Gremlins is running, turn off the facility that causes the user
	to be warned only once of certain kinds of errors (that is, the
	error will be logged to the file every time).

*	In the logging output file, add a comment that only the last xxxK
	of information is recorded.


Changes for 2.1d14 (10/1/98)
----------------------------
*	Added Japanese silkscreens, and support for selecting them.

*	(Mac) Added "None" menu item to serial port menu.

*	Added support for lcdPageWidth and lcdPanningOffset registers.

*	Fixed bug with power-off (I wasn't allowing HwrSleep to change some
	low-memory vectors, resulting in a warning dialog).

*	Check for and report heap corruptions.	Poser walks the heap
	regularly, usually to sync up its notion of where things are with
	the Palm OS Memory Manager's. These walks used to be vulnerable to
	corrupted heaps. Now they should be more robust.

*	(Mac) Updated to CodeWarrior Pro 4.

*	Instead of patching ErrDisplayFileLineMsg and showing its text in
	our own dialog, let the ROM version execute. It will eventually
	call SysFatalAlert, which we patch for the same reason (to show the
	text in our own dialog with our own buttons).

*	Added stack overflow checking.	On all opcodes changing the stack
	pointer (PEA, MOVE, MOVEM, JSR, and any opcode operating on a
	register with pre-decrement mode), I check the stack pointer to see
	if it's (a) close to the end of the stack or (b) past the end of the
	stack. The former gets a warning, the latter gets an error.

*	Initialize new RAM to 0xFF (make it look like new flash RAM).

*	(Windows) Fixed "Unhandled exception caught in main()" error message.
	This would show up when the previously-used ROM file could not be
	found. Now, the (slightly) less enigmatic message "Could not start
	a new session because the file could not be found" is displayed.
	More importantly, Poser no longer quits after displaying the message.

*	Added check for how long the Memory Manager semaphore was held.
	Show a warning if held for more than 10 milliseconds.

*	Fixed problem with multiple Gremlin Control windows appearing in
	the windows version. Doh!

*	Made the "Release" target an "External Release" target, and added
	an "Internal Release" target.

*	Added support for loading clippings.

*	Made a change that should take care of accesses to invalid memory
	from an external debugger.


Changes for 2.1d13 (9/15/98)
---------------------------
*	Fixed bug in heap validation functions; when I extract the *signed*
	hOffset value, I have to sign extend it from 24-bits to 32-bits.

*	Mark more parts of memory as memory manager data structures.

*	Support hardware sub-ID for EZ devices.

*	Support HwrIdentifyFeatures for 68328 devices.

*	Enable flash for Palm V and Palm IIIx.

*	Fixed long-standing Gremlins bug that would cause event pushing to
	stop after a while (the Gremlin mechanism would enqueue and event
	and then wait for it to be handled; however, in some cases, the
	event would fail to be enqueued, and the Gremlin mechanism would
	wait forever for that event to be handled).

*	Allow for a bug in SysBinarySearch in pre-3.0 systems that would
	cause it to pass an invalid pointer to the search callback.

*	Added Gremlins Control window (displays gremlin number, current
	event number, and elapsed time; also contains Stop, Resume, and Step
	buttons).

*	Tweaked Gremlins engine so that doing a Step doesn't reset the
	"until" value.

*	Performance enhancements:

	- Changing some functions to return "int" instead of "bool"
	  resulted in better code generation, leading to a 7% performance
	  boost in my canonical Gremlins test (Gremlin #0, 10000 events
	  on the Memo Pad). (Actually, this was only a win in VC++;
	  CodeWarrior worked better with "bool". Therefore, all of the
	  sources were changed to use "Bool", which is typedeffed to
	  "bool" or "int" depending on the compiler being used.)

	- Putting back an enhancement from Craig's Mac Copilot lead to a
	  27% performance boost. The idea is to update only the scanlines
	  that are changed since the last screen refresh. Craig did it by
	  carefully comparing the current LCD buffer with a saved version
	  of it. I now do it instead by noting when the LCD buffer is
	  being written to (this is done fairly efficiently via the
	  MetaMemory tracking routines) and remembering the first and last
	  bytes in the LCD buffer that were written to.

*	Fixed trap number used in HostControl.h.

*	Updated to latest CharEncodingType values from TextMgr.h.


Changes for 2.1d12 (9/2/98)
---------------------------
*	EmuTraps -> HostControl.

*	Let PrvFindMemoryLeaks walk the heap.

*	Added HostGetEnv.


Changes for 2.1d11 (8/31/98)
----------------------------
*	Added support for AMD flash RAM.

*	(Windows) Fixed support for external debugging.

*	(Windows) Display dialog if an exception is caught in WinMain.

*	(Windows) Fixed the way the Dragonball(EZ) registers were
	initialized. After things got going, the registers were OK, but the
	initial values on little-endian machines was completely bogus.

*	(Mac) Updated creator resource text.

*	Totally revamped the way memory access checking is performed. In
	addition to detecting access to low-memory, system globals, the
	screen buffer and Dragonball(EZ) registers, I validate access to the
	dynamic heap. Now, only the Memory Manager can fiddle with chunk
	headers and trailers, free chunks, and unlocked chunks. For the time
	being, low-stack access is no longer detected, though this feature
	will return. Eventually, we should also be able to detect access to
	uninitialized memory.

*	Updated to latest sysFtrNumXXX values.

*	Fixed test for Intl Mgr in gremlins.

*	Test for NULL in stub Intl Mgr functions.

*	I now calibrate the pen before running a gremlin. This is
	necessary for consistant results between different runs across
	boots.

*	Fixed error reporting problem where previous messages reported in
	dialogs would inhibit other messages from appearing (that is, the
	attempt to display a second message would end up showing the first
	error message again).

*	Handle errant accesses to Dragonball space past the end of the last
	defined register.

*	Check for and report unimplemented traps. This check detects
	attempts to call functions that are off the end of the trap table as
	well as calls to SysUnimplemented.

*	Internal change: consolidated more error handling in the Errors
	class.	Cleaned up the Errors interface a little bit.

*	Added temp hack to let PrvGetBatteryPercent read off the end of an
	allocated chunk of memory.


Changes for 2.1d10 (8/18/98)
----------------------------
*	Display correct error message if a low-stack access is performed (I
	was previously re-using the "screen buffer access" message).

*	Low-memory access by the ROM was previously allowed up until
	UIInitialize was called. That's been changed to TimInit.

*	Consolidated some "device" menu items in the New Session dialog,
	and added a new device.

*	Per Steve and Roger, changed some function names in EmuTraps.h.

*	Added Control Panels to the list of applications in the New Gremlin
	dialog box.

*	Added support for DbgMessage.

*	Internal change: Roger Flores Memorial Constant Eradication. Got
	rid of a lot of constants in EmuTraps.cpp and TrapPatches.cpp. These
	constants were used to fetch parameters from the emulated stack
	pushed on there by emulated code. I now define structs that
	describe the stack contents and use those (with the offsetof macro)
	to get the values.	In addition to the obvious one, another
	advantage is that the macros can now determine the _size_ of the
	parameters and call get_long, get_word, or get_byte accordingly.

*	Rolled in more IK/Gremlin changes for Ken.

*	Double-clicking on an app in the New Gremlin dialog will implicitly
	click on the OK button.

*	(Mac) Support Cmd-D in the "Save this file?" dialog (you guys owe
	me!)

*	Mapped some internal error numbers to error strings.

*	Re-establish the interrupt state of any pressed buttons after a
	reset.	This allows you to press the Power key and Cmd/Ctrl-R,
	resulting in a Hard Reset.

*	Asking for the 'irda' ROM token will now always fail (at least,
	until we can get some IrDA support implemented). NOTE: the ROM
	calls HwrGetROMToken directly, which means that it will not see the
	effect of this patch.

*	Internal change: Platform::DisposeMemory now takes a reference to a
	pointer so that it can set that pointer to NULL.

*	Use Platform::AllocateMemory and Platform::DisposeMemory in the
	profiling code, so that it can use temp memory on the Mac.

*	EmuProfileDump now uses the name passed in to it. If NULL is
	passed in, a default name ("Profile Results") is used.

*	Started on checking memory accesses to the dynamic heap that are
	outside of allocated memory chunks. Not activated yet because (a)
	it's too slow and (b) the hueristics aren't quite right.

*	(Windows) Fixed bug with not reporting errors that occurred
	while initializing the emulator. Now you're notified if the serial
	port you've specified in the Properties dialog is busy.

*	(Windows) Made the example in the previous bullet a warning,
	not a fatal error.


Changes for 2.1d9 (8/4/98)
--------------------------
*	(Mac) Fixed problem where the emulator would attempt to save the RAM
	file with no name if "Save Always" were selected, the user chose
	Quit from the File menu, and the RAM file was new (i.e., had never
	been saved before).

*	Prevent the system from _reading_ low-memory if it's (a) not
	sleeping or dozing, (b) fully booted, and (c) not handling an
	interrupt.

*	Hooked up "Fill New Blocks" and "Fill Disposed Blocks".

*	Minor optimizations to DRAM_Bank accessors.

*	Rolled in Ron's changes for finding a function's name.

*	Detect and report accesses to the space below the stack pointer and
	above the low-end of the stack. Note that there is no checkbox in
	"Debug Options" for this, but performance timing shows that there is
	very low overhead for this check (less than .1%).

	IMPLEMENTATION NOTE: detecting accesses to the unused parts of the
	stack obviously entail knowing where the stack is.	This information
	is gleaned from the SysAppInfoType block when the application is
	launched. However, there's no really good way to hook into the
	launch process. There are advantages and disadvantages to every
	approach, but the one used here is to hook into SysAppStartup and
	SysAppExit. This works for applications that use the standard
	runtime startup code, but applications are not guaranteed to use
	that standard code. Hopefully, the percentage of such applications
	is low.

	Additionally, SysAppStartup and SysAppExit are called under
	circumstances other than starting up the application. For instance,
	they are called when action codes are sent to each application. To
	differentiate the two, we ignore all calls to SysAppStartup that
	don't contain sysAppLaunchCmdNormalLaunch in the cmd field of the
	SysAppInfoType block.

*	Hooked up "Clean Stack" check box.	This option was originally
	defined to overwrite the parts of the stack that were freed up by an
	UNLK or RTS opcode in an attempt to detect accesses to those ranges
	of memory. Since that's now handled by the previous "*", "Clean
	Stack" now means that we initialize the part of the stack reserved
	by LINK opcodes, thus initializing local variables to well-defined
	bad values.

*	Fixed bug that occured when setting a breakpoint on an opcode just
	after a call to a system function that was tailpatched by the
	emulator.


Changes for 2.1d8 (7/29/98)
---------------------------
*	EmuGrmIsRunning (and SysGremlins) FINALLY returns a correct value
	instead of just returning "true" all the time.

*	Implemented EmuDmLoadFile and EmuDmSaveFile.

*	EmuDmSaveFile now takes a card number as the second parameter.

*	Added parameter checking to all EmuXXX functions. Functions that
	return EmuErrs will return emuErrInvalidParameter.	StdIO functions
	return error values according to the ANSI/ISO standard, and will set
	errno to emuErrInvalidParameter (note that functions that alter the
	return values of ferror and/or feof will NOT affect those value,
	which is DIFFERENT from the standard).

*	Fixed bug when setting the current time on startup. This bug would
	cause a crash on new Palm V ROMs.

*	Fixed bug with new Palm V ROMs when they tried to identify how much
	memory was on the "device".

*	(Windows) Fixed problem where clicking OK in the Properties dialog
	would crash the emulator under Windows 95 (and could possibly crash
	Windows 95, too!).

*	(Mac) Fixed problem where the serial port name would get lost,
	prohibiting the emulator from being able to open the serial port.


Changes for 2.1d7 (7/27/98)
---------------------------
*	(Mac) Don't feed the ROM mouse/pen events if we've turned off
	emulator execution at idle time. This prevents problems if a dialog
	comes up while tracking the mouse/pen.

*	Fixed long-standing bug from Mac Copilot 1.3 days.	The functions
	GetRegisters and SetRegisters can be used to save and restore the
	CPU registers.	The emulator used those functions for just that
	purpose when it would call ROM functions as subroutines. However,
	the status register was not faithfully saved, which meant that it
	was not always put back the way it was found. Since status bits
	would then occassionally change spontaneously out from under the
	emulated process, things would occassionally go "haywire" (that's a
	technical term).

*	Value returned by EmuHostGetVersion is now based on the
	application's version resource instead of being hard-coded.

*	(Mac) Save window position.

*	Implemented EmuHostIsSelectorImplemented.

*	Holding down the Ctrl key while booting/resetting will stop the ROM
	at the start of the Big ROM by using a temporary breakpoint.


Changes for 2.1d6 (7/23/98)
---------------------------
*	Changed way emulated apps called host functions. Those functions
	used to be called by invoking TRAP $E. Now we latch onto the
	SysGremlins trap number.

*	Extended set of host functions.

*	Zap some card header fields to say that we don't emulate flash RAM.

*	Fixed problem with profiling.

*	(Mac) Fixed an execution path where an untyped ROM file wasn't
	getting its type set.

*	Fixed problem with stopping on A-Trap breaks.


Changes for 2.1d5 (7/21/98)
---------------------------
*	(Mac) added version that does profiling.

*	Fixed loading of "whole" ROMs (those with Big ROMs and Small ROMs).

*	Fixed loading of .pdb files that have an AppInfo block but no
	records.


Changes for 2.1d4 (7/20/98)
---------------------------
*	(Mac) turned Open and Install menu items into hierarchical menus.

*	Fixed bugs with saving and loading session files.

*	(Mac) turned Appearance Manager classes back on when running on a
	sufficient machine (I'd accidentally left the application using the
	GA classes even when AM was available).

*	(Mac) create the Debug Options window invisibly; reduces flickering
	when opened.

*	Converted over to using the cross-platform classes FileReference
	(reference to and unopened file) and FileHandle (reference to an
	opened file). These classes allow more platform-independent code
	(such as the preferences code, which used to deal with Aliases on
	the Mac and file paths on Windows).

*	Overhauled error/exception handling/reporting.	I now use a
	consistant approach to detecting, handling, and reporting errors.

*	Rewrote the ROM image loading function. ROM images consist of two
	parts: a Big ROM and a Small ROM. The ROM image file always
	contains a Big ROM part, but not always a Small ROM part. However,
	the Small ROM part is optional and can be dummied up if necessary.
	The original version of the ROM image loader needed to load in the
	ROM image file once, determine if the Small ROM was included, and
	start over if it wasn't. The new ROM image loader is smarter,
	reading in just the parts it needs to determine if the Small ROM is
	there or not. Only after that does read in the full ROM file.

*	Put more strings in resources.	Most, but not all, are now done.

*	Added StdIO wrappers (see EmuTraps.h).


Changes for 2.1d3 (7/7/98)
--------------------------
*	Added progress bars when loading .prc and .pdb files.

*	Added support for drag and drop.

*	Now close previous session before opening the next.

*	(Mac) Added StandardGetFile file filter to allow files that start
	with "rom." or end with ".rom" or " rom", but that don't have the
	right file type.

*	Updated to latest EZ ROM header files (as of 7/6/98).

*	Update the low-memory checksum if low-memory is altered by an
	external debugger.

*	Fixed long-standing bug that would corrupt ROMs when switching from
	one to another. Since you couldn't do this on Windows in 2.0, you'd
	only see it in the Mac 2.0 version.

*	When creating the preferences for the first time, set the amount of
	RAM displayed in the New Configuration dialog to 1Meg.

*	(Mac) Allocate large chunks of memory from temp mem.


Changes for 2.1d2 (7/2/98)
--------------------------
*	Revamped startup sequence. From the ERS:

	If the application is started by double-clicking on its icon, it
	will attempt to perform some appropriate startup action.

	* If the user had saved a session document the previous time the
	  emulator had been run, the emulator will attempt to reload that
	  document.

	* If the user created a new session document during the previous
	  session but didn't save that document, the emulator will create
	  a document with the same settings.

	* If either of those attempts fails (for instance, the previously
	  used session document or ROM file cannot be found), or this is the
	  first time the user has used the emulator, or the user holds down
	  the Caps Lock key while starting the emulator, the user is
	  presented with a "New Configuration" dialog box. The user uses
	  this dialog box to specify a new hardware/RAM/ROM configuration
	  from which a new document is created.

	If the user double-clicks on an emulator document icon, the emulator
	attempts to restore the session recorded in that file. This attempt
	may fail if the ROM image for the session can no longer be found. In
	that case, the session document can no longer be used; session
	documents can only be used in conjunction with the exact same ROM
	image that created them.

	If the user double-clicks on a ROM image icon, the emulator
	presents the user with the "New Configuration" dialog box with the
	selected ROM file entered into the ROM File text slot.

*	Brought Mac and Windows versions in sync with each other.

*	IMPORTANT NOTE: "RAM" files created by previous versions of the
	emulator are no longer supported. There are two reasons for this.
	First, they didn't contain enough information that today's session
	files need (such as the associated ROM file name, or the device type
	to emulate). Second, ".ram" is the extension for Real Audio Media
	files. Therefore, the emulator now reads and writes ".psf" (Palm
	Session File) files.

*	Added Registry information so that Emulator files have the right
	description next to their names.


Changes for 2.1d1 (6/22/98)
---------------------------
*	Updated to latest UAE.

*	(Mac) Updated to CodeWarrior Pro 3. (Requires "MW C/C++ PPC"
	from May 19th or later.)

*	Removed 68K and FAT versions.

*	New menu organization.

*	More emphasis on documents, rather than ROM image files.

*	Lots of internal changes:

	- RAM_ROM broken out into many smaller files.

	- Lots of small performance tweaks.

	- More strings moved to resources.

	- Names of system functions are fetched directly from the ROM
	  instead of being hardcoded in StringData.cpp.

*	Added DragonballEZ support.

*	(Mac) Added white screen.

*	New Preferences/Properties... and Debug Options... dialogs.

*	New startup dialog for Windows (for when it needs help starting
	up).

*	Fixed the bug where you couldn't enter typed characters if there
	wasn't a blinking insertion point.


Changes for 2.0b3 (6/2/98)
--------------------------
*	Windows only: Added Greg's nifty Hyperlink controls to the About box.

*	Added Keith's Palm OS Emulator article from HHSJ.

*	Windows only: Added Greg's fixes to the serial emulation routines.

*	Fixed Headpatch::SysGremlins bug where it would read garbage from
	the stack when trying to get the selector parameter.

*	Got A-Trap breaks working ("atb" from the PalmDebugger).

*	Windows only: bumped number of recently loaded application from
	five to nine.

*	Fixed 1.0 ROM compatibility problem: the emulator was trying to call
	a function introduced in Palm OS 2.0 (PrefSetPreference).


Changes for 2.0b2 (5/25/98)
---------------------------
*	Windows only: Fixed bug that would zap the version number in the
	system preferences when attempting to set the timeout value to be
	infinite.

*	Fixed bug that would cause the emulator try to access invalid memory
	if the emulated app tries to access invalid memory.

*	If an exception occurs that an external debugger should handle and
	there is no external debugger, instead show a dialog that reports
	the problem and forces the user to reset.

*	When getting application version string, look for ID's 1 and 1000.

*	Windows only: Fixed bug that would leave a debugger-related messaging
	event object signalled if there were no external debugger.


Changes for 2.0b1 (5/??/98)
---------------------------
*	Prevent the device from ever going to sleep. Letting it go to sleep
	is only annoying, and doesn't accomplish anything. You can make the
	device go to sleep by setting the timeout value in the General
	Preference panel, but that setting will get reset back to "never" on
	any reset.

*	Mac only: Fixed problem that would cause the emulator to hang if
	you tried to open a console window from within MWDebug.

*	Got alarms working.

*	Mac only: Wasn't doing a "weak import" of AppearanceLib in non-debug
	version.

*	With regards to a change in 2.0d8, it's OK to load an application that
	already exists in ROM. The RAM-based version will override the one
	that's in ROM.


Changes for 2.0d9 (5/13/98)
---------------------------
*	The handling of DbgBreak was broken.

*	Allow application to resume after ErrDisplayFileLineMessage. This
	is handy in cases where you're using ErrNonFatalDisplayIf to display
	warning messages and it's OK for the application to continue
	execution.

*	Accidentally turned off checksumming of post-2.0 ROMs; turned it
	back on.

*	Windows only: there was supposed to be a feature whereby holding
	down the caps-lock key when starting the emulator would cause it to
	bring up a Download/Browse/Quit dialog box. However, the dialog box
	would actually come up if the caps-lock key had ever been toggled
	since the last time the emulator had been executed. Fixed.

*	Selecting "Gremlin/New..." while a gremlin is currently running
	will now switch to the new gremlin.

*	Fixed error message to say RAM instead of ROM when saving a RAM
	image file, and added an exception handler to deal with the ensuing
	thrown exception.


Changes for 2.0d8 (5/27/98)
--------------------------
*	Added Greg's Copilot article from HHSJ.

*	Added updates to Guide.html from Roger.

*	Removed support for the 2.0 Debug ROM that offset the low-memory
	globals byte four bytes. There were problems with that ROM that
	would cause it to crash.

*	Gremlins now latches into KeyCurrentState in order to randomly set
	the bits so that applications can respond to them.

*	The patched versions of SysFatalAlert and ErrDisplayFileLineMsg now
	display dialogs containing "Debug" and "Reset" buttons. Clicking on
	"Debug" will simulate a bus error, which an external debugger will
	catch. Clicking on "Reset" is the same as selecting the Reset menu
	item.

	NOTE: currently, clicking on the "Debug" button when there's no external
	debugger running will result in the ROM attempting to handle the
	simulated bus error. If the ROM is a Debug ROM, it will attempt to
	contact a debugger over the seial port. Since there is probably no
	such debugger listening on the serial port, the emulator will appear
	to hang with a blank screen. Selecting the Reset menu item will
	restart the ROM.

*	Failures reported via SysFatalAlert and ErrDisplayFileLineMsg
	during application execution have more info for users to report. 
	The dialog has text along the lines of:

		SubHunt 2.0 has failed while running Gremlin 2 at 20,000 events.
		SubHunt complains "SubHunt.c: Line 100: Score too good." If
		this is the latest version of SubHunt, please report this to the
		application author.

	or:

		SubHunt 2.0 has failed. PalmOS complains "Window.c: Line 100:
		Invalid Window."  If this is the latest version of SubHunt,
		please report this to the application author.

	NOTE: currently no effort is made to determine if the application or
	the PalmOS is generating the message. This shortcoming will be
	addressed in a future version.

*	Use application name from 'tAIN' resource when generating the list
	of applications for the New Gremlin dialog box.

*	Reduced the 10% random pen tap chance in Gremlins to 2% (per
	Roger's recommendation).

*	Internal change: added "TrapIndex" inline function for converting a
	trap number (0xA000) to an index that can be used with the trap
	table. Standardized on its use all over. This function converts by
	merely masking off the upper byte (which mirrors what the ROM does)
	instead of subtracting "sysTrapBase" from trap numbers (which fails
	because some applications appear to use trap numbers that don't have
	"A" in their upper nybble).

*	Internal change: we patch ROM system functions. We also call ROM
	system functions. Now, whenever we call a ROM system function, any
	trap patches made to that function are called (they didn't used to
	be).

*	Fixed emulator/debugger communications bug that occured when one
	would quit and then restart (needed to refresh -- not just flush --
	the handle to the other guy's window). (Windows only)

*	After the UI has been initialized, prevent even the ROM from
	writing to low-memory (except from HwrSleep, which patches out the
	exception vectors).

*	When trying to load an application that's already in ROM, warn with
	a specific error message instead of a generic one.


Changes for 2.0d7 (4/27/98)
---------------------------
*	Gremlins now works better with "ill-formed" forms (forms with no
	"live" objects in them). Gremlins will also now generate random
	taps 10% of the time instead of always trying to target form
	objects.

*	Turn off Gremlins on a reset or fatal system error.

*	Only the last 128K of Gremlins logging text will now be written to
	the logging file.

*	Added "Debug" button to the "Application so-and-so just made an
	invalid memory access" dialog. Clicking on this button emulates a
	bus error. If an external debugger is running, it will be notified
	of this bus error. If not, the emulated ROM will take over,
	displaying a Fatal Error dialog.

*	Fixed a bug where the emulator itself would cause a "The current
	application just accessed Palm OS Globals ..." to appear after
	downloading an application via MWDebug.


Changes for 2.0d6 (4/22/98)
---------------------------
*	Added ROM Transfer project (for Mac).

*	Added Docs folder.

*	Added Plugins folder containing MWDebug plugins.

*	Tweaks to PCH file generation for CW Pro 3.

*	Added HotSync to Mac side.

	IMPORTANT: For both versions of the Emulator, HotSyncing has only
	been tested between two machines (in both cases, between a Mac and a
	PC). I don't know what performance is like when both the emulator
	and HotSync are running on the same machine.

*	Now enable and disable Gremlins menu items in WinEmulator.

*	Fixed bug in ROM Transfer.prc which would cause it to crash on Palm
	III's.

*	Fixed some bugs in RAM file management in Mac version.


Changes for 2.0d5 (4/??/98)
--------------------------
*	Checksum the ROMs when they're loaded. This checksum is used to (a)
	validate the ROM contents (for pre-3.0 ROMs, the checksum is checked
	against a hard-coded list of ROM checksums, for 3.0 ROMs and later,
	the checksum is checked against the checksum in the ROM header) and
	(b) determine if we're running the 2.0 debug ROM, which needs
	special hacks activated in order to run.

*	Allow *.* patterns when loading ROM and application files.

*	Support serial port emulation in WinEmulator (not in Mac, yet).

*	Added method for applications to call the emulator (see
	EmuTraps.h). Note that there currently is no method to see at
	runtime if an application is running under the emulator or not.

*	Tweaks to get Mac version to build under CWP R2 with CW4POS R4
	installed in it.

*	Backed out checksumming of pre-3.0 ROMs until I get get an accurate
	set of checksum numbers.


Changes for 2.0d4 (4/9/98)
--------------------------
*	Reset auto-off timer when processing debugger packets.

*	Changed way tailpatches are implemented. I used to set the return
	address of a system function I was tailpatching to point to a TRAP
	$E opcode (saving the original return address in an array in the
	emulator). This approach has the advantage of not modifying any
	opcodes in memory, and handles recursive system functions very well.
	Sadly, the critical flaw in this approach is that some operations
	need the real return address to be on the stack. For instance, the
	TRAP $F handler (TrapDispatcher) in the ROM looks at the return
	address so that it can look up the $Axxx function selector.
	Therefore, the approach I now take is to write a TRAP $E into memory
	after the TRAP $F / $Axxx sequence, saving the overwritten opcode in
	a table. Recursive functions are handled by incrementing and
	decrementing a counter associated with that memory location. When
	the counter gets back down to zero, the opcode is restored.

*	Added preliminary profiling stuff. Still disabled at this point.

*	Don't let the user enter pen and keyboard events if the CPU is
	stopped (for example, when it's in the debugger).

*	Don't run RPC commands from the debugger in TRACE mode (that is,
	run the commands, but turn trace mode off, first).

*	Respond better to a SysReset message from the debugger.

*	Remove tailpatch opcode when the CPU is reset.

*	In WinEmulator, restart the CPU after a screenshot only if it was
	running before we took the screenshot.

*	Fixed problems with synchronization between the UI thread and the
	CPU thread. One way to trip up over the bug was to run Gremlins and
	at the same time click like crazy on the screen or hardware buttons.
	After a while, you'd get the dreaded "ATrap::DoCall returned and
	exception" dialog box.

*	Fixed Gremlins bug that would put it into an infinite loop if the
	top form had only frmBitmapObj, frmLineObj, frmFrameObj,
	frmRectangleObj, frmLabelObj, frmTitleObj, and/or frmPopupObj
	objects in it. Games like SubHunt, HardBall, and Reptoids are
	examples of programs with such forms.

*	Changed the low-level mechanism for handling exceptions and
	entering the debugger. With the old way, an exception would cause
	the main CPU loop to exit before the debugger was notified about the
	exception. But if there were no external debugger to notify, there
	was no way to cleanly restart the CPU loop in order to have the
	emulated ROM handle the exception (either by trying to connect to a
	serial debugger, or by showing a fatal error dialog). Now, the
	attempt to contact an external debugger is made before exiting the
	CPU loop. If the attempt succeeds, the CPU loop is exited. If the
	attempt fails, the normal exception handling process takes over
	(i.e., the appropriate vector from the low- memory exception table
	is loaded into the PC and execution continues).

*	Added support for 2.0.2 Debug ROMs (added minimal support for 68681
	serial access and account for different low-memory variable
	locations).

*	Removed support for ROM files with the pattern "ROM *". This
	pattern also matches the "ROM Transfer.prc" application, causing the
	emulator to try loading it if there are no other candicates.

*	For MacEmulator, save RAM files with the type '(Pi)RAM' and ROM
	files with the type '(Pi)ROM'. Also, if untyped files are accessed
	as RAM or ROM files, they are changed to have the appropriate type.

*	Restarting and stepping of Gremlins in WinEmulator more reliable.

*	Better warning messages for applications that:

	-	Access low-memory directly
	-	Access system global variables directly
	-	Access the screen directly
	-	Access Dragonball registers directly


Changes for 2.0d3 (3/30/98)
---------------------------
*	Lots of internal changes:

	-	Names changed from Foo_Bar format to Foo::Bar format (where Bar
		is a static member function of the Foo class). This change
		makes it easier to look things up in a class browser.

	-	Handling of memory access errors codified. All accesses are
		checked; any errors are reported through bottleneck functions;
		all accesses can be turned on/off with compile-time and/or
		runtime switches; added CEnableFullAccess class that allows
		internal functions full access to memory (i.e., turns off memory
		access checking) so that we can do things like set breakpoints
		in ROM.

	-	Added Palm copyrights to all files.

	-	Standardized on PowerPlant-style function header comments.

	-	Removed all mention of Pilot and Pilot-derivatives.

	-	Untemplatized some functions in UAE_Utils that didn't need to
		be templates.

	-	Sped up uae_memset by using long-word access.

	-	Changed way tail patches are implemented. Previously, I'd write
		a TRAP $E opcode into memory after the TRAP $F/Axxx instruction
		sequence that would invoke the trap. The problems with this
		approach is that (a) this wouldn't break on all returns from the
		function if it called itself recursively, and (b) it modified
		memory in a way that would need to be reversed on selected
		occassions (e.g., when we entered the debugger, or when RAM was
		saved to disk). Instead, when a trap function is called that I
		wish to tail patch, I modify the return address from the
		function in such a way that I get control when the function
		exits (I save the old return address and replace it with a
		pointer to a TRAP $E opcode, which leads to a CPU exception
		which I catch in Software::ProcessException).

	-	Patched calls to SysDoze and SysSleep so we better know the
		state of the ROM/CPU. We don't actually use this information,
		yet.

	-	Centralized all compile-time pre-processor symbols into
		Switches.h.

	-	Centralized all byteswapping into Byteswapping.h/.cpp. Used a
		templatized Canonical() function on the Mac so that Canonical is
		zero-overhead no matter what type it's called with.

	-	Added internal diagnostic logging functions.

	-	Lots of timing tests to optimize memory access and core CPU
		emulation loop.

	-	Committed to "word-swapped" memory layout in x86-compatible
		systems. Removed experimental alternative memory layout code.
		Look for WORDSWAP_MEMORY symbol for areas that are byte-order
		sensitive.

*	Fixed some bugs with external debugger hooks.

	-	Now support the same notion of "sockets" as the SerialLinkMgr.

	-	On some entries into the debugger, the PC would incorrectly be
		adjusted to point 2 bytes before the instruction causing the
		debugger entry instead of pointing right at the instruction.

	-	Finally added debugger hooks to WinEmulator (missing
		functionality's considered a "bug", right?).

*	Fixed bug where UAE would allocate a significant chunk of memory and
	then try using it without first checking that the allocation attempt
	succeeded. This would result in the Mac emulator freezing on startup
	when emulator a 4Meg device.

*	Fixed ROM Transfer.prc to download Palm III ROMs. Updated Mac
	"Download ROM" command to work with larger ROMs. Added "Download
	ROM" to Windows emulator.

*	On startup, if WinEmulator can't find a ROM, it will ask you to
	find one or download one.

*	On startup, if the capslock key is down, WinEmulator will _always_
	bring up the dialog asking you to find a ROM file or download one.

*	Removed "Backlight" and "Enter debugger on startup" properties from
	WinEmulator.

*	When looking for a ROM file, Emulator use the following search
	order:

	- The file you've explicitly specified in Properties (WinEmulator only).
	- The first file in the Emulator directory ending with ".ROM"
	- The first file in the Emulator directory ending with " ROM"
	- The first file in the Emulator directory starting with "ROM."
	- The first file in the Emulator directory starting with "ROM "

*	Fixed problem where mouse clicking wasn't working with 1.0 ROMs. I'm
	still not sure what the root of the problem is, but I've added a
	check for 1.0 ROMs and implemented a workaround.

*	In WinEmulator, RAM image is automatically saved to and read from a
	file based on the name of the ROM being used and the RAM size
	requested. The name of the RAM file is "<ROM file>.<RAM size>.RAM".
	In other words, the old Windows Copilot functionality is back (it
	was temporarily removed during the Grand Code Unification).

	The format of this RAM image file is a little different, however.
	There are chunks of data in this file, each tagged with an ID and a
	chunk size. For now, the only defined chunk is 'ram '. In the
	future, there will be chunks for register state, associated ROM
	version, etc.
	
	In MacEmulator, the file saving operation remains the same as in Mac
	Copilot, but the file format is the same as in WinEmulator.

*	Switched to new case graphics.


Changes for 2.0d2 (3/4/98)
--------------------------
*	Fixed MacEmulator bug when switching between 1x and 2x screen
	sizes.

*	Fixed bug where loading an application would smash 4 random bytes
	of memory.

*	Sped up emulation on the Mac by 20% by streamlining some
	Mac-specific operations.

*	Sped up core emulation loop on both platforms by moving some
	not-oft-used functionality into some subroutines, thus simplifying
	the core loop.

*	Added hooks for external debugger.

*	Made Gremlins deterministic.

*	Ensured Gremlins did the same thing on both Mac and Windows.


Changes for 2.0d1
-----------------
*	Support for Palm OS 3.0:

	-	memChunk headers changed, so reliance on their format when
		loading applications has been removed.

	-	More complete support for Dragonball registers.

	-	Allow for 96K and 128K dynamic heaps.

*	Common source code base.

*	Refitted with latest UAE sources.

*	Can load .prc files larger than 64K.

*	Windows version is much smaller.

*	Mac version is much bigger (it's a FAT binary).

*	Removed built-in debugger.

*	Support grayscale mode.

*	Now emulates hardware method for turning on backlighting (holding
	down the power key). Properties option is no longer needed.

*	Added screen shot command.

*	Added Gremlins. (Note that user input (typing, mousing) is disabled
	while Gremlins is running due to the incompatible ways in which they
	enter their events.)

*	Set the Palm OS date on startup.

*	Trap dispatcher is now run as native code instead of being
	emulated. This results in about a 10 - 12% speedup.

*	Auto-calibrate the pen on startup; no more digitizer screen.

*	InternetConfig-savvy About box on the Mac. Panel-savvy About box on
	Windows.

*	Gremlins can now confine itself to a single application.

*	Emulate MemSet, MemMove, and RctPtInRectangle with native code for
	15% performance increase.

*	While Gremlins is running, can optionally log to a text file:

	-	posted events
	-	received events
	-	system functions called
	-	time of execution.
