======================================================================== News (latest changes) archive for the Palm OS Emulator Copyright (c) 1998-2000 Palm, Inc. or its subsidiaries. All rights reserved. Please send bug reports, comments, suggestions, etc. to devsupp@palm.com ======================================================================== 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. * 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: * 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 : Synonyn for -silkscreen. -ram_size : Synonym for -ram. -load_apps : A comma-seperated list of files (.prc's, etc.) to load after startup. -run_app : 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 : Location for standard log file. Default = Poser's directory. -horde : Gremlin number to run after session is created or loaded. Equivalent to setting -horde_first and -horde_last to the same number. -horde_first : First Gremlin in a Gremlin Horde to run. -horde_last : Last Gremlin in a Gremlin Horde to run. -horde_apps : A comma-seperated list of applications Gremlins is allowed to switch to. Default == entire device (no restrictions). -horde_save_dir : Location for directory that keeps saved session files and logs. Default = Poser's directory. -horde_save_freq : Gremlin snapshot save frequency. Default = don't save snapshots. -horde_depth_max : Total number of Gremlin events to generate for each Gremlin. Default == no upper limit. -horde_depth_switch : 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 : emulator loads the specified .psf file on startup. -rom : specifies the ROM image file to use. -ram : specifies the amount of RAM to emulate (in K). Valid sizes are 128, 256, 512, 1024, 2048, 4096, and 8192. -device : specifies the device to emulate. Valid types are pilot, palmpilot, palmiii, palmiiix, palmv, palmvii, and palmiiic. -silkscreen : 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: 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 " ", where is one of the 68000 registers D0...D7 or A0...A7 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). 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: