kernel/eka/release_old.txt
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/release_old.txt	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,17108 @@
+
+Version 1.02.371
+================
+(Made by Dennis 04/04/2002)
+
+1)	TimBa
+	1)	Fix for BAD-58CDM4: Locale change has no effect on contact filtering.
+2)	ChrisM
+	1)	Fix for MOS-58EJ8V (Integrator calibration doesn't work properly)
+		Removed the "patches" from the Y coordinate digitizertoscreen calculation and
+		changed the Y calibration constants to work with this.
+	2)	Fix for CAR-57RETM (WINSCW UDEB Emulator crashes when launched in console mode)
+	3)	Fix for TAR-58LEUV (Emulator title - variant indication) CR ref MTAR-58LDG2
+	4)	Fix for SHY-58GGR5 (Test case that leads to unhandled exception
+ 		in DThread::GetDesMaxLength)
+
+3)	Nicolas
+	1)	Fixed defect THY-588MLT (Integrator board with ARM926
+		core module does not boot).  The ARM920 clock setting
+		code can not be reused as-is for ARM926.  Modified
+		bootstrap to figure out which core is being used and
+		branch to the appropriate code.	 A software reset is
+		necessary halfway through the ARM926 clock
+		configuration.	See comments in HwInitialise for more
+		details.  For ARM926, the clocks are set to:
+			  CPU:			125mhz
+			  system bus:	25mhz
+			  local bus:	31.25mhz (CPU clock / 4)
+4) 	AndrewJ
+	1) 	Fixed defect JON-58DHHP where Assabet lffs media driver has an error in 
+		suspend resume operation.
+5)	MarkCa
+	1)	Fixed CAN-58GG5E (MEDMMC is not leave-safe.)  Used non-leaving new in
+		D_MEDMMC.CPP.
+
+6)	PeteS
+	1)	Added Lubbock Base port.
+
+Version 1.02.370
+================
+(Made by CarlosF, 12/03/2002)
+
+1)	JonathanM
+	1)	Fix for defect MET-57ZHTH - "TDblQueBase has incorrect copy constructor
+		and operator ="
+
+2)	Nicolas
+	1)	Fixed defect MET-57YN7A (Power Sequence at EmergencyStandby).
+		Migrated 6.1 fix: In DPowerModel::PowerEmergencyStandbyDfc(),
+		PowerEmergencyStandby() is now called for all power handlers
+		*before* switching off the machine.
+	2)	Fixed defect MET-57YMU7 (Template Port requires 'EARLY
+		DEBUG' examples in the template code).
+	3)	Modified template port to use the same UART API as
+		recent ports, e.g. Uart1Data() and Uart2Data()
+		replaced with UartData(TUint32 aUartBase).
+	4)	Fixed defect THY-585N22 (OOM during process creation
+		can crash the kernel).	Now uses HBufC::New() instead
+		of NewL() in svProcessCreate() to allocate the
+		command-line buffer.
+
+3)	Markdo
+	1) 	Fixed defect DON-585LNV "Media door open does not work on WINS with
+		Mmc card controller". Removed call from PcCard Controller to set up a
+		media change callback in WINS. Only MmcCard Controller sets this callback
+		now.
+
+4)	ChrisM
+	1)	Fixed defect MOS-586BWV (integrator had digitizer and mouse driver loaded
+		in e32 text shell roms).  Removed mouse driver from rom.
+	2)	Fixed defect MOS-55DJN4 (New integrator video driver should use constants
+		rather than magic numbers)
+	3)	Tidied up integrator digitizer calibration.
+	4)	Fixed defect OMC-586LJF assabet rom size
+	5)	Fixed defect OMC-586K5Z mainline warnings
+
+5)	Pete
+	1) 	Change to the WINS local drive mappings.
+		The entire local drive mapping for WINS is now as follows:-
+		Local drive 0:	Internal RAM drive (EFixedMedia0) - Y:
+		Local drive 1:	MMC Card on MMC socket 0 (ERemovableMedia0) - X: 
+		Local drive 2:	MMC Card on MMC socket 1 - Partition1 (ERemovableMedia1)
+		Local drive 3:	MMC Card on MMC socket 1 - Partition2 (ERemovableMedia1)
+		Local drive 4:	PC Card on PC Card socket 0 (ERemovableMedia2)
+		Local drive 5:	PC Card on PC Card socket 1 (ERemovableMedia3)
+		Local drive 6:	Not currently assigned
+		Local drive 7:	Not currently assigned
+		Local drive 8:	Internal LFFS drive (EFixedMedia1) - W: 
+	2) 	Implemented CR PHAR-54RJMT 'We should be able to simulate password
+		protected disks on the emulator'.
+		1) The method of mapping drive letter to local drive number on the WINS
+		emulator has been changed from being a fixed mapping, to one that uses
+		enviroment variables to specify the mapping. When the system starts up
+		it sets environment variables to reconstuct the same mapping as before:
+		Y:-LocDrv 0, X:-LocDrv 1, W:-LocDrv8. (This is done in SetupEmulatorPaths()
+		in \e32\euser\emul\win32\up_path.cpp). However, these default mappings can
+		overidden or new mappings created in EPOC.INI using the following syntax:
+		
+			_EPOC_LocDrv_<locDrvNum> <drvLetter>: <FileSystemID string> 
+			
+		The FileSystem ID indicates which file system should be mounted on the
+		local drive in question. The following file system IDs are defined:
+			'Fat' and 'Lffs'.
+		For example, to map X: to local drive 1 specifying the FAT file system:  
+			'_EPOC_LocDrv_1 X: Fat'
+		The file system ID is read by the text shell as it starts up and mounts the
+		appropriate file system on any local drive that it finds a mapping for.	
+		2) A start-up media password can now be assigned to any MMC card - again
+		using environment variables to store the password. Passwords are set in
+		EPOC.INI using the syntax:
+		
+			EPOC_LocDrv_<locDrvNum>_PWord_<cardNum> <password>
+			
+		'locDrvNum' is the number of the local drive and 'cardNum' is the number of
+		the MMC card on that drive. The latter is only relevant on local drive 1 where
+		two virtual MMC cards are emulated (with the user hot swapping between cards
+		by hitting F4 while F5 is down). For example, to set Card0 on local drive 1:
+			'EPOC_LocDrv_1_PWord_0 aaa1'
+			
+		3) The start-up state of the MMC card in local drive 1 can be configured to be
+		any one of the following: No MMC card, MMC Card0 or MMC Card1. The user
+		subsequently toggles between each of these states each time they hit the F4 key
+		while F5 is down. The start-up state is set in EPOC.INI using the syntax:
+		
+			_EPOC_Active_LocDrv_1 <StartUpState>
+			
+		'StartUpState' can be one of the following values:  -1 - card present,
+		0 - MMC Card0, 1 - MMC Card1. For example, to set the start up state to MMC Card1:
+			'EPOC_Active_LocDrv_1 1' 		
+
+6)	MarkCa
+	1)	Removed SD specific parts of MMC controller.  EPBUSM no longer built for MEIG.
+
+7)	TimBa
+	1)	Fix for COY-56DEYY: "MatchesPartial function uses undocumented
+		feature of CompareC". TDesC16::HasPrefix function added.
+
+
+Version 1.02.369
+================
+(Made by ChrisM, 06/03/2002)
+
+0) 	ArunsakhS
+	1) 	Fix for defect  BAD-57HF3Y - "Locale persistence broken" 
+		A new HAL atrribute was added to TAttribute in Hal_data.h for the
+		defect fix above. The new attribute is "ELocaleLoaded". 
+		Made the required changes to "config.hcf" and "values.hda" in HAL 
+		and all the reference platform components. Added the test for
+		ELocaleLoaded in the test "T_newhal" in HAL. 
+
+1)	RobertJ
+	1)	Silenced some warnings in:
+		\e32\drivers\medmmc\epoc\d_medmmc.cpp
+		\e32\drivers\medmmc\epoc\d_medsdp.cpp
+	2) 	Correction of comms header file to correct KCapsBpsxxxx constants
+		\e32\include\d32comm.h
+		JAN-57WL3N  "Comm port capability constants same, missing"
+		(was SAS-554K4P in GT6.1)
+	3)	Fixed JAN-57WL8G "Possible access violations in e32 drivers under OOM?"
+		was HAR-56DPLW in GT6.1
+		\e32\drivers\dfir\d_fir.cpp
+		\e32\drivers\ecomm\d_comm.cpp
+		\e32\drivers\ecommdce\epoc\d_commdce.cpp
+
+2)	CarlosF
+	1)	Fixed defect MOS-579LUN powering down digitiser causes machine to hang
+ 		when screen is tapped.
+	2)	Changes to Serial Port: the existing power-down timeout after finishing 
+		transmitting has been made configurable through the introduction of a new
+		member to the comms config structure (this is now TCommConfigV02).
+		Changes to d_comm.cpp (ARM and WIN32 emulator) to support this. Also when
+		it powers down as a consequence of having timed out it now completes the
+		requests with KErrTimedOut instead of KErrAbort.
+	3)	Further changes to the digitiser extension on Assabet and Brutus in order to
+		fix problems with Silent Running.
+	4)	Fixed defect THE-57LHGD Unable to use the Profiler tool on Assabet.
+
+3) 	MichaelP
+	1)	Added data member access function TInt BytesToBeTransfered() to class
+		THwaDataTfReq (k32hwa.[h|inl]).
+	2) 	In T_HWA (\f32test\DEVICE\t_hwa.cpp) changed test of "HWA device specific
+		function (2)": the address that is now used lies within the DSP bridge
+		shared memory area.
+	3)	Fixed address and size of reserved RAM area in \Helen\Bootstrap\Helen.s.
+
+4)	MarkCa
+	1)	Fixed CAN-579MLN MultiMediaCard controller does not pre-check current
+		password.
+
+5)	Nicolas
+	1)	Fixed defect THY-57QNYA (incorrect default debug port
+		on assabet).  The default port is now UART3
+		everywhere.
+		
+7)	ChrisM
+	1)	Fix for DON-57RNLR (Screen is not switched on when coming back from digitiser
+		power-down)
+	2)	Fix for defect PEN-57XBRV ("EPOC Emulator" should be replaced)
+		Changed the emulator name from EPOC Emulator to Symbian OS Emulator by default.
+		Name can be specified in epoc.ini with the keyword EmulatorName.
+
+
+Version 1.02.368
+================
+(Made by RobertJ, 11/02/2002)
+
+1)	ChrisM
+	1)	Fix for defect ROS-55CGCR - "EPOC.EXE logo fails to conform to Corporate ID guidelines"
+
+3)	JonathanM
+	1)	Fix for defect MET-572N7U - "Destroying FixedContiguous TransferBuffers causes
+		memory to be 'lost' to the free pool"
+
+4) 	Pete
+	1) 	Further extended the local drive caps class (TLocalDriveCapsV3)
+		by adding the following member:-
+			TUint iExtraInfo;		
+	2)	Modified the MMC Media driver to supply the above information as part of
+		the Media Driver Caps() function.
+	3)	Fixed a defect where the 'iHiddenSectors' field in
+		the disk caps. info was not being initialised if a default boot
+		partition wasn't detected in the MBR.
+
+Version 1.02.367
+================
+(Made by PeterS, 02/02/2002)
+
+1)	RobertJ
+	1) CR CLCT-55JENG. Modified \e32\include\d32usbc.h & \e32\include\d32usbc.inl
+	argument TInt& aLen for RDevUsbcClient::Write and
+	RDevUsbcClient::WriteEndpointZero changed to TInt aLen
+
+2)	JonathanM
+	1)	Fix for defect FID-563G8A - "TPckgBuf cannot return a const reference"
+	2)  Fix for defect PAR-56MGEB - "Generic EDISP driver lives in the wrong place."
+	3)	Removed last vestiges of Cogent from E32
+	4)	Fix for defect THY-4XPH4C - "T_CURRENCYFORMAT fails from time to time"
+	5)	Fix for defect MET-56UJ35 - "Unhandled Leave in Kernel Server"
+	6)	Fix for defect MET-56VJY6 - "Session creation can crash machine under OOM conditions"
+
+3)	MarkCa
+	1)	Added caps buffer zeroing to MEDMMC and MEDLFS on MINT and MINK.
+
+4) Nicolas
+	1)	CR JPAR-54XMZD: ROM building and run time configuration of debug port
+		- On selected targets the current debug port can be
+		  viewed and changed at run-time thanks to a new eshell
+		  command (debugport).	See rombuild release notes for details
+		  about ROM building time configuration.
+		- Debug port setting applies everywhere (i.e. bootstrap
+		  traces, early debug mode, non early debug mode (variant)
+		  and debug monitor) *but* run-time port switching is not
+		  supported in early debug mode as in this case the port
+		  initialisation is done by the bootstrap.
+		- The bootstrap fetches the debug port from the ROM
+		  header and copy it to a new field in the the super page.
+		- A new HAL attribute (EDebugPort) has been added and
+		  a default implementation based on userhal has been provided.
+		- Assabet port modified.  The accepted debug port
+		  values are 1 (UART1) and 3 (UART3).  The default is 3.
+		- Brutus port always uses UART3.
+		- Integrator (MINT) port modified.  The accepted debug
+		  port values are 0 (UART0), 1 (UART1) and 42 (JTAG DCC).  The
+		  default is 0.
+		- KHARDWAREASSIST flag removed.	 Ports supporting JTAG
+		  DCC output should use the new scheme.
+		- Modified accordingly the template port
+	2)	Modified bootvariant.mke in MINT port so that a symbol
+		file for bootromv1.bin is generated.
+	3)	Fixed long standing bug in MISA variants: BOOTMISA.LIB was
+	  	not suffixed by a variant-specific identifier.  This was
+	  	not discovered before as the libraries were identical on
+	  	assabet and brutus.  The libraries are now called
+	  	BOOTMISAAB.LIB and BOOTMISABA.LIB.
+	4)	"abld clean bootmisa" now removes symbol files for both
+		assabet and brutus.
+
+5)	ChrisM
+	1)	Euser source reorg for ipr categorisation CR GBON-567RCZ
+		- created new directory  base\e32\euser\utils
+		- moved us_array.cpp, us_func.cpp, us_lex8.cpp, us_lex16.cpp, us_heap.cpp 
+		  and us_que.cpp into the new dir which has a cat D ipr file.
+		- created new file us_desx.cpp which contains all the exported constructors
+		  from us_des8.cpp and us_des16.cpp
+		- created a new header file in utils which contains some inline funcs which 
+		  are needed in us_desx.cpp and the old us_des8.cpp and us_des16.cpp files
+		- + some panic numbers and a few other shared bits.
+		- removed the exported constructors from us_des8.cpp and us_des16.cpp
+
+
+
+
+Version 1.02.366
+================
+(Made by MarkCa, 15/01/2002)
+
+1)	MarkCa
+	1)	Modified MEDMMC to support partial reads, write-through caching and
+		multi-block writes.  Multi-block writes are a compile-time option
+		that is not compiled in by default.
+	2)	Removed packed struct optimization from PS_MMC.CPP.
+	3)	Changed debug print statements in D_MEDSDP.CPP so can distinguish
+		from D_MEDMMC.CPP.
+	4)	Fixed FID-54YK2B (MEDMMC buffer not DMA-safe.)  Pages of physically
+		contiguous RAM are allocated by the EPBUS controller at bootup and
+		the media driver uses a virtual function to find out where they are.
+		Note this is a convenience for the principal EPBUS client, i.e.,
+		MEDMMC / MEDSDU.  If other drivers want to be clients of EPBUS, they
+		should still allocate their own internal buffers.
+	5)	Fixed MBR.H header file to use include guards and #include <e32std.h>.
+	6)	Fixed FID-54VENJ (MMC: Same debug trace used for different functions.)
+		Changed debug text for DMMCStack::SchedGroundDown().
+
+2) 	Peter
+	1) 	Added support on MMC Card Controller for mechanical write protect switch.
+	2) 	Extended the local drive caps class (now extended to TLocalDriveCapsV3)
+		by adding two extra members:-
+			TUint iMediaSubType;
+			TInt64 iTotalDiskCapacity;
+	3) 	Added support for multiple Peripheral Bus Controllers.
+		For all platforms other than WINS, these are now loaded as kernel
+		extensions which then register themselves with the kernel from
+		the extension DLL entry-point. Each Controllers register once for
+		each socket that it controls and the kernel supports up to
+		KMaxPBusSockets(4) sockets (i.e. the system could support four different
+		Controllers each managing a single socket, two different Controllers
+		each managing a pair of sockets etc). The Peripheral Bus Controller
+		DLLs have been renamed. All used to be build as EPBUS.DLL. Now PC Card
+		Controllers are built as EPBUSP.DLL and MMC Controllers are built as
+		EPBUSM.DLL. For non-WINS platforms, the kernel no longer links with the
+		Peripheral Bus object and a platform can be configured with multiple
+		Controllers, a single Controller or no Controllers simply by the inclusion
+		(or non-inclusion) of the Controller extension DLL in the rom OBY file. The
+		WINS and MEIG platforms now support dual Controllers, both a PC Card
+		Controller and an MMC Controller. (Note, to achieve this in WINS, the kernel
+		now links to EPBUSP.DLL and EPBUSM.DLL). Changes to support this include:-
+		a) Added the function:-
+		   	void Kern::RegisterPBusController(TPBusNum aMachineBusNum,
+				DPeriphBusController* aController,TPBusNum aControllerBusNum)
+		which should be called from the Controller extension DLL entry-point for
+		each bus that the Controller manages in order to register that Controller
+		for that bus. 'aControllerBus' is the number of the bus relative to that
+		particular Controller as opposed to 'aMachineBus' which is the bus number
+		relative to the entire machine (e.g. on a machine configured with two
+		Controllers each managing two buses, then when the 2nd controller registers
+		for it's 2nd bus, the machine bus number of this is 3, but the number relative
+		to the 2nd Controller is 1).  
+		b) With there now being potentially multiple Controllers,
+		the function to retrieve the pointer to the Controller now takes a  bus
+		number as a parameter and becomes:-
+			DPeriphBusController* Kern::PBusController(TPBusNum aMachineBusNum)
+		c) Added the function 
+			TPBusNum Kern::PBusControllerBusNum(TPBusNum aMachineBusNum)
+		which returns the bus number relative to its owning Controller for a given 
+		machine bus number.
+		d) The kernel now keeps a count of Controller registered. This means the
+		platform specific HAL function ImpHal::TotalSupportedBuses() is now
+		redundant and has been removed.
+		e) Modified the extension DLL entry-point function for the generic
+		Peripheral Bus Controller to allocate the Controller object and perform
+		secondary initialisation before registering the Controller with the kernel.
+		This makes the function P::InitialiseLocalDrives() redundant and it has
+		therefore been removed. Also, the function DPeriphBusController::NewL() is
+		no longer exported. (Still exported from WINS Controllers which aren't
+		extensions and therefore still need to to initialised directly by the kernel).
+		f) Removed the function DPeriphBusController::TotalSupportedDrives() and
+		replaced this with a straight call to the variant of the same name:
+			Custom::TotalSupportedDrives().
+		Following on from this, removed the data member iTotalSupportedDrives
+		from the classes TPcCardMachineInfo and TMmcCardMachineInfo.
+		g) Added the pure virtual function:
+			TPBusNum DPeriphBusController::BaseBusNumber()
+		to the generic Peripheral Bus Controller class which returns the
+		machine bus number of the first bus under the control of this Peripheral
+		bus Controller. Provided implementations of this in the DPcCardController
+		and DMMCController classes. These read the required information from the
+		corresponding TPcCardMachineInfo and TMmcCardMachineInfo classes. Added the 
+		corresponding data member iBaseBusNumber to each of these classes which
+		is supplied from the variant.  
+		h) Constructors for TPBusCallBack made inline rather than being exported
+		from the Peripheral Bus Controller so that the kernel no longer needs to
+		link with EPBUS.LIB.
+		i) Moved the function:
+			DPBusMediaDriver::SetCurrentConsumptionInMilliAmps()
+		to the Media Driver base class - DMediaDriver and removed the function
+		DMediaDriver::DeltaCurrentConsumptionInMilliAmps() which was now redundant.
+		Also added a destructor to the DMediaDriver class to reset the current
+		consumption when the object is destroyed. This again required in order that
+		the kernel need no longer link with EPBUS.LIB (as this needs to reset
+		the media driver current consumption on a media change - with object
+		destruction not occuring until the next mount).
+		j) Change to the WINS local drive mappings to include emulation of PC Card
+		drives as well as MMC drives.
+		The entire local drive mapping for WINS is now as follows:-
+		Local drive 0:	Internal RAM drive (EFixedMedia0) - Y:
+		Local drive 1:	1st special MMC Card on MMC socket 0 (ERemovableMedia0) - X: 
+		Local drive 2:	2nd special MMC Card on MMC socket 0 (ERemovableMedia0) - V:
+		Local drive 3:	MMC Card on MMC socket 1 (ERemovableMedia1)
+		Local drive 4:	PC Card on PC Card socket 0 (ERemovableMedia2)
+		Local drive 5:	PC Card on PC Card socket 1 (ERemovableMedia3)
+		Local drive 6:	Not currently assigned
+		Local drive 7:	Not currently assigned
+		Local drive 8:	Internal LFFS drive (EFixedMedia1) - W: 
+		k) For MEIG, MISA and MTEMPLATE platforms, the Peripheral Bus variant interface has
+		been removed from the variant DLL and is instead built as a separate kernel extension - either
+		as EPBUSPV.DLL for PC Card Controller variants or EPBUSMV.DLL for MMC Controller variants.
+		For these platforms, registration of the Controller with the kernel takes place via a call
+		from the Controller variant extension DLL entry point rather than from the Controller extension
+		DLL entry point. For all other platforms, the Controller variant remains as part of the main
+		variant DLL. These platforms therefore have no separate Controller variant DLL.
+		As a result of this change, the Controller DLL entry
+		point has been moved out of the generic layer of the Peripheral Bus
+		Controller (PS_PBUS.CPP) into the ASSP layer. 
+		Splitting the Controller variant out of the main
+		variant DLL is necesssary where there are multiple
+		Peripheral Bus Controllers on a platform - otherwise the variant DLL has to contain
+		multiple Controller variants.
+		l) Deleted V32PCCD.H, and V32PCCDI which were being used as a general definition of the
+		PC Card Controller variant interface for all platforms. Each peripheral bus ASSP layer
+		should define its own variant interface as required for that impelementation. This
+		should be defined in the header file \e32\epbus\epoc\<assp>\v32pccdv.h (or v32mmcv.h
+		for MMC Controllers). Implemented this for all supported platforms.
+
+		NOTE: The power model extension - EPOWER.DLL must be loaded before any Peripheral
+		Bus Controller extensions - EPBUS?.DLL or EPBUS?V.DLL (i.e. in the OBY file, the
+		lines that specify the inclusion of EPBUS??.DLL must occur after the line which
+		specifies the inclusion of EPOWER.DLL).
+
+3)	RobertJ
+	1)	Changed string descriptor text in pa_usbc.cpp to remove reference
+		to EPOC and ER6.2
+
+	2)	Removed function CopyMaxToClient in d_usbc.cpp, this was in effect a
+		duplicate of CopyToClient. Code now uses CopyToClient in all cases.
+
+	3)	In usbdma.cpp & k32usbc.h changed interface to
+		TDmaBuf::RxCopyPacketToClient & TDmaBuf::RxCopyDataToClient to take
+		an explicit length argument. This removes the need to modify the
+		TEndpointTransferInfo
+		Modified d_usbc.cpp to reflect change in the calling interface to 
+		TDmaBuf::RxCopyPacketToClient & TDmaBuf::RxCopyDataToClient
+
+4)	MichaelP
+	1)	Fixed compile time error in /e32/drivers/ehwa/d_hwa.cpp which only occurred
+		when GETPUTDATA_ARE_KERNELSERVERCALLS had been #defined.
+	2)	Added parameter 'TInt aNumWindows' to functions DHwaTask::Init() and
+		THwaTaskHwInterface::Init(), which are declared in k32hwa.h.
+	3)	Introduction of boolean flag iInUse to class THwaDataTfReq: used to identify
+		transfer requests which are currently being processed by the PDD.
+	4)	HWA bogus PDDs: changed order of calls to DHwaTask::GetNextRequest to account
+		for change no. 3).
+	5)	Moved HWA device state member iStatus from class DHwaDevice to class
+		DHwaDevicePdd; maintaining its correct value is now up to the PDD.
+
+
+Version 1.02.365
+================
+(Made by AndrewJ, 12/12/2001)
+
+1)	Morgan
+	1)	Integrated DPassiveDebugger enhancements from \tools\debugger_stub\...
+		into Helen variant: \helen\debugger\...
+
+2)	ChrisM
+	1)	Fixed MET-54HLQA (T_NEWHAL tests fail)
+	2)	Fixed MET-555GLS (On WINS HAL function EDisplayMemoryAddress should return the Window Handle)
+
+3)	Dennis
+	1)	Fixed HEY-54JJ9Y (DPlatLibrary not filled in for some loads)
+
+4)	JonathanM
+	1)	Fix for 6.1 defect MOS-54NLHX - "__PROFILE_DISPLAY macro in e32def.h has error"
+
+5)	WilliamRo
+	1)	Fixed ROS-54MGXX "WINSCW builds enable C++ exceptions and RTTI" by adding 
+		appropriate #pragmas to the __CW32__ section of e32def.h
+
+6)	Nicolas
+	1)	Fixed MOS-54QM2W (Building bootstrap MMU layer &
+		special bit patterns in permissions): The MMU
+		permissions are now global variables defined in the
+		variant part of the bootstrap and used by the generic
+		ones.
+	2)	Removed the write-through version of the generic
+		bootstrap MMU library.	This was used only by the
+		Helen port which now uses the same code as everything
+		else and selects write-through behaviour by changing
+		the MMU permissions in the variant (see previous
+		entry).	 See commented out code at the top of helen.s
+		and helenc.cpp to switch between write-back and
+		write-through.
+	3)	Fixed THY-54XJFZ (When fast RAM used, cache should be
+		disabled for kernel stacks, data and heap).  When
+		those entities are in DRAM, they are always cacheable.
+		When they are in FRAM, they are mapped using the map
+		flags specified in the FRAM bank.  This allows to
+		enable/disable the cache on a per-bank basis.
+
+7)	RobertJ
+	1)	Fixed HEY-54JME9. Removed mini-loader
+		"Drive specifier missing on libraries loaded with the mini-loader"
+
+8)	MichaelP
+	1)	Removed /e32/drivers/ subdirectories ecommdma and emcbsp. These two drivers were
+		introduced by the Helen port and are actually TI-specific. Since they are not even
+		used by the current Helen port, we can safely get rid of them.
+
+9)	PeterH
+	1)	Integrated changes to DEF files from the mainline.
+		Frozen exports are now marked with the R3UNUSED flag where appropriate.
+		This is to support the thumb stub optimisation where the R3 register is
+		use to generate a smaller import stub for a function if it isn't used to
+		receive parameters.
+
+10)	MarkCa
+	1)	Updated MLNK EPBUS port to detect all events in ISR.
+	2)	Reduced EPBUS by c1.2k by using packed TMMCCommandSpec structure.
+
+Version 1.02.364
+================
+(Made by MichaelP, 20/11/2001)
+
+1)	MarkCa
+	1)	Changed DFlashDevice::SetupWrite() in \integratorap\lffs\flashfile.cpp
+		to use wrapper class for testing if write buffer available instead of
+		testing bits in 32bit value.
+	2)	Fixed CAN-547HD3 (Controller panics when no events to handle.)
+
+2)	RobertJ
+	1)	Corrected coding comments in d_usbc.cpp & minor clarification in pa_usbc.cpp
+	2)	Implemented new USB VID.
+	3)	Further cleanup work following deconfiguration on USB client SIN-535KPU
+	4)	Propagated fix for PBN-4TKJ7J "Bluetooth panics with HCI error 23".
+		In \brutusa\vi_com2.cpp, reordered ISR rx now done first
+		then tx, removed uart tx busy spin.
+
+3)	Nicolas
+	1)	Fixed FID-53YD58 (Bootstrap doesn't dump all MMU
+		pages): off-by-one error.
+	2)	Enabled cache for exception vector page when it is in
+		DRAM (cache still disabled if the page is in fast RAM
+		as TC RAM and cache are not compatible).
+
+4)	ChrisM
+	1)	Fixed ALM-53LHP4 (Fixed Calibration settings are not saved).  Assabet only defect, 
+		problem was in the variant vi_xyin.cpp in DDigitiserSA1100::DigitiserToScreen.
+	2)	Fixed FOD-54MET2 (Display bytesPerLine calculated as bits not bytes).  Fixed the problem 								in template port + integrator.
+
+5) 	AndrewJ
+	
+	1)	Fixed DOM-4XWC5P (Medlfs driver  is not reliable) This problem was concerned with 
+		flash devices not erasing properly when suspended, on assabet boards. This was 
+		fixed by not suspending an erase unless both chips have gone into suspend mode 
+		properly.
+	2)	Fixed FID-53YDJC (Error LFFS driver SetupWrite() function) Semi implemented 
+		suggestion in defect report though still need to issue dummy command after 
+		correct register has been read, otherwise command issued does not work.
+
+6)	JonM
+	1)	Implemented change request JMET-544FUM - "Change RTransferWindow::MapInBuffer() to
+		return error code and not panic"
+
+7)	CarlosF
+	1)	Fixed MOU-543FVR HAL attribute ECaseSwitch returns wrong value for Assabet.
+		The following files were modified:
+		\assabetb\hal\config.hcf
+		\assabetb\hal\values.hda
+		\assabetb\lffs\loadlffs.cpp
+		\assabetb\vi_hal.cpp
+		\hal\inc\hal_data.cpp
+		\hal\tsrc\t_new_hal.cpp.
+		Fixed FRS-534EWW T_SERIAL fails on Assabet. The following files were
+		modified:
+		\assabetb\bmisa\visaabu.def
+		\assabetb\v32scpld1111.h
+		\assabetb\vi_com1.cpp
+		\assabetb\vi_com3.cpp
+		\assabetb\vi_cpld1111.h
+		\assabetb\vi_hw.cpp
+		\assabetb\vi_power.cpp.
+
+8)	MichaelP
+	1)	HWA API implementation now corresponds to API document version 0.15:
+		a) Removed enum TTaskPriority from d32hwa.h (was not used).
+		b) Two new functions in class RHwaTask:
+		   TInt PutData(RTransferBuffer& aBuf, TInt aBytesToBeTransfered,
+		                TInt* aBytesTransfered=NULL, TInt TransferId=KTfBufIdNull);
+		   and
+		   TInt PutData(RTransferBuffer& aBuf, TRequestStatus& aStat,
+		                TInt aBytesToBeTransfered, TInt* aBytesTransfered=NULL,
+		                TInt aTransferId=KTfBufIdNull);
+		   which allow the user to specify the number of bytes to be transferred to the
+		   DSP (rather than the whole buffer).
+		c) New member in class TTaskDataTfInfo (d32hwa.h): TInt iBytesToBeTransfered;
+		d) Renamed THwaPanic enums from EHwaXxx to EHwaPanicXxx (k32hwa.h).
+		e) Added virtual destructor for class THwaTaskHwInterface to prevent resource
+		   leaking in derived classes.
+		f) Removed function TInt DHwaTask::Priority() (was not used).
+		g) New member in class THwaDataTfReq (k32hwa.h): TInt iBytesToBeTransfered;
+		h) Removed data member iPriority from class DHwaTask: moved to class
+		   THwaTaskHwInterface; thus the task priority is now managed entirely by the PDD.
+		i) Added three additional arguments to TInt THwaTaskHwInterface::DoInputFrom(const
+		   DHwaTask& /*aTask*/, TInt /*aOutputIndex*/, TInt /*aInputIndex*/,
+		   TInt /*aConnectionId*/) to pass the task index and connection ID information to
+		   the PDD.
+		j) Made function void DHwaDevice::SetStatus(THwaDeviceStatus aStatus) public
+		   (was: protected).
+		k) Merged two functions of class DHwaDevice
+		   TInt TaskCallPutData(DHwaTask* aTask, const TAny* aArg);
+		   TInt TaskCallGetData(DHwaTask* aTask, const TAny* aArg);
+		   into one function
+		   TInt TaskCallTransferData(DHwaTask* aTask, const TAny* aArg, THwaDataTfDir aDir);
+		l) Fixed kernel heap memory leak caused by incorrect call to S::TransferWindowClose()
+		   in destructor DHwaTask::~DHwaTask().
+
+	2)	USB client implementation:
+		a) Added "#define SET_DESCRIPTOR_REQUEST_SUPPORTED" to k32usbc.h (in commented-out
+		   form).
+		b) Added "const TUint16 KUsbVendorId_Symbian = 0x0E22;" to usb.h (USB-IF assigned
+		   Vendor ID).
+
+
+Version 1.02.363
+================
+(Made by Dennis 26/10/2001)
+
+1)	MarkCa
+	1)	Updated Linkup MMC port with event checking asserts.
+	2)	Modified P32MMC.H to allow per-platform configuration.  The file
+		can only be included into ASSP-specific builds.  It reads a header
+		file MMC_CFG.H from \epoc32\include\kernel\ASSP.
+	3)	Fixed FID-4ZKEKQ (Inefficient memfill in MMC driver.)  Use Mem::Fill()
+		instead of loops to fill buffers with 0xff in DoFormat() for
+		DMmcMediaDriverFlash.
+
+2)	Nicolas
+	1)	Fixed THY-52WJTE (DLL static data support doesn't
+		allow for DLLs which only have BSS): The "$DAT" chunk
+		which holds the initial content of the DATA section is
+		not created when there is no DATA section.
+		Additionally it is not created for ROM-based DLLs as
+		the initial content is fetched from ROM in that case.
+	2)	Fixed generic bootstrap defect FID-53BKSD (920T
+		MMU_Invalidate is wrong): The ARM920T version of that
+		function now only invalidates TLB and I-cache.
+	3)	Fixed kernel defect THY-53FE32 (Confusion between
+		TheKernelPage and TKernelPage ctor)
+	4)	Fixed generic bootstrap defect THY-53LC9Y (crash when
+		only exception handlers and supervisor stack/heap in
+		IRAM).  Reversed exception code and supervisor
+		heap/stack allocation order in fast RAM to ensure that
+		stack/heap always at top of bank where the bootstrap
+		stack is.  Otherwise the adjusted stack value after
+		enabling MMU is wrong.
+	5)	Fixed generic bootstrap defect FID-53LKTG (Bootstrap
+		test code: heap test is useless, author should be
+		shot).  Kernel data is now really checked.
+	6)	Modified bootstrap tests to take into account possible
+		exception vectors relocation to highmem.
+	7)	Removed deprecated "screensize" keyword from bootstrap
+		test obey files.
+
+3)	ChrisM
+	1)	Fixed WIR-53FANN (RArrayBase::HeapSort makes assumption about max iEntrySize value)
+		Changed temp buffer in HeapSort functions to use the const KSimpleArrayMaxEntrySize
+	2)	Fixed MOS-53FLUF (HAL attribute ordering incorrect).  Moved EPenState from
+ 		before EKeyboardState to after ESystemDrive.
+	3)	Fixed MOS-53RHP3v(Screen width and height returned by HAL are constant).  Added func
+		to hal\src\emul.cpp to return the current sizes defined in epoc.ini.
+
+4)	Carlosf
+	1)	Changes to Assabet Variant to fix a problem with the External Interrupts
+		dispatching. Modified \assabetb\vi_hw.cpp.
+	2)	Fixed BAN-52BKKC Physical device driver for serial port have a defect and
+		can cause loss of data.
+
+5)	Pete
+	Migrated the fixes for the following 6.1 defects:
+	1) Fixed PAS-4WRMQS: "Requeing a read() after PowerOn Panics the Driver/Kernel".
+	Problem caused by driver registering for PC Card IREQ events twice without
+	de-registering in between. This causes a panic in the PC Card Controller.
+		- Modified the Brutus and Assabet PC Card serial PDDs
+		(DITXBA4.PDD/DITXAB4.PDD) so that rather than registering and de-registering
+		for notification of PC Card IREQ events whenever they need to disable serial
+		interrupts, the drivers keep the notification request registered - and simply
+		enable and disable IREQ events on that socket.
+		- Changed the PC Card Controller so that registering a TPBusCallBack object
+		for event notification (with DPcCardController::RegisterEvent()) which is
+		already registered returns an error rather than causing a kernel panic.
+		- Modified the PC Card Controller by adding support for a new configuration
+		request flag: KPccdConfigOverrideNormalPwrEvents. If a configuration is
+		requested (via DPcCardController::RequestConfig()) which contains this flag
+		setting then normal machine power handling by the Controller for the socket
+		in question will be disabled - leaving the PC Card Controller client to
+		implement its own power handling policy. This only applies to machine power
+		on/ power off events. The Controller will continue to handle emergency power
+		down and media change events. The power handling override will remain in
+		force as long as the configuration is applied (i.e. this condition is removed
+		following a call of DPcCardController::ReleaseConfig(),
+		DPcCardController::DeregisterClient(), a media change event etc). This
+		feature is required to support PC Card serial cards in order to support the
+		'idle off' power policy which serial ports now implement.  Without this, even
+		though the PC Card serial driver will ignore a machine power down call when
+		it still has a write request in progress, the PC Card Controller will still 
+		turn off the VCC supply to the card and thus power it down.		
+	2) Fixed SCE-534GAE: "Problems with Serial Comms LDD power handling"
+		- Modification to the serial port LDDs, ECOMM.LDD (including the WINS version)
+		and ECOMMDCE.LDD to fix a problem with the way it implements the 'idle off'
+		power policy. Although it currently ignores Power-Off notifications, it does
+		not ignore Power-On notifications and instead completes any outstanding request
+		with KErrAbort. Hence, if the machine happens to be powered off and then back
+		on again before the serial port has had an inactivity timeout, any outstanding
+		requests will wrongly be completed with KErrAbort as the machine turns back on.
+		- Another problem fixed is associated with the fact that the
+		current comms driver power handler doesn't actually power the
+		device down on a normal power down event. However, the driver
+		itself uses the power model at other times to control power
+		to the device (e.g. when closing the driver). Hence,
+		DChannelComm::DoPowerDown() is never called and the driver
+		closes leaving the comms h/w powered up. This is now fixed,
+		with the driver calling DoPowerDown directly when required.
+	3) Fixed SCE-52YHQE: "Serial change notifier problems".
+
+6)	WilliamR
+	1)	Fix defect ROS-53TDGG "Access Violation in CreateFirstDllRefTable" by allowing for
+		GetModuleHandleA to return 0. This is essentially the same code as used in 
+		CreateDllRefTable() which handles dynamically loaded DLLs.
+
+
+Version 1.02.362
+================
+(Made by ChrisM, 05/10/2001)
+
+1)	CarlosF
+	1)	Port defect fix for defect ALM-4VQB5V Ditizer freezes (was: The Brutus
+		board freezes after entering 50-60 characters with HWR) from 6.1.
+		Modified \assabetb\vi_xyin.cpp and \brutusa\vi_xyin.cpp.
+
+2)	MarkCa
+	1)	Fixed FID-4ZWDMZ (MMC program poll is too slow to be useful.)
+		Use TMilliSecondCallBack instead of TTickLink.  Pure virtual DMMCStack
+		function ProgramPollPeriod() replaced with pure virtual DMMCController
+		function ProgramPeriodInMilliSeconds().
+	2)	Moved Integrator LFFS drive to k:.  ImpHal::TotalSupportedDrives() now
+		returns 9 instead of 2, as does unused Variant::PeriphBusMachineInfo().
+		MEDLFS changed to use 22MB of flash across three pairs of chips.
+		The memory range is a contiguous block, which can be specified at
+		compile time in \integratorap\lffs\ffs_config.h.
+
+3)	JonM
+	1)	Fixed defect FER-4XDK9G - "Assabet timers go off at strange intervals."
+	2)	Fixed defect MET-52AF29 - "Power off/on may freeze Assabet/Brutus"
+	3)	Fixed defect in TSa1100::SetRtcData. This needed to wait longer for the new value to take effect.
+	4)	Moved HELEN's exported headers from E32 to the HELEN variant.
+		This helps fix defect MAY-4XWM9Q - "e32 does not build in an IPR-E OCK".
+		It also moves what should probably be IPR category B stuff from a cat E directory.
+
+4)	MichaelP
+	1)	HWA API implementation now corresponds to API doc version 0.14
+		a) THwaTaskHwInterface::DoCloseTask() now has a parameter TBool
+		   aCallbackRequest which indicates whether or not the PDD should
+		   finally call DHwaTask::CloseComplete()
+		b) RHwaTask::Logon() now has a second parameter TUint aFlagsWord which
+		   can be used to make a logon request more specific
+		c) RHwaTask functions Start(), Suspend(), Resume(), and SetPriority()
+		   are now asynchronous; however this is transparent to the user as the
+		   asynchronousness is wrapped up in the d32hwa.inl inline header file
+		d) Renamed DHwaTask::DoLogonComplete() to LogonComplete()
+	2)	USB PIL: Endpoint Data Toggles are now correctly reset after Set_Interface and
+		Set_Configuration requests.
+
+5)	AndrewT
+	1)	Fixed BAN-52BKTN (CAsyncCallBack ctor TCallBack& could be const). Made
+		the TCallBack parameters to the constructor and Set() const.
+	2)	Fixed BAN-52BKV2 (Should inline TInt RSubSessionBase::SubSessionHandle() be
+		const?). Added const to this member.
+	3)	Fixed THE-52WJR6 (Equality operators for TThreadId and TProcessId should be
+		const). Made the accessor and comparison operators const on these classes.
+6)	RobertJ
+	1) 	Incorrect behaviour in usb client after getting deconfigured then
+		configured, without an intervening reset.
+		Data toggles were not getting reset,
+		ldd wasn't cancelling user requests,
+		PIL layer wasn't cancelling ldd requests and
+		psl layer was trying to drain fifo because RPE bit was set.
+		RPE will get reset on next read when RPC gets cleared and fifo is
+		automatically emptied.
+	2)	Fixed FID-52HBTA: USB driver not leave safe
+	3)	Fixed ROS-534EAV: usbdma.cpp mixes new[] and delete
+
+7)	ChrisM
+	1)	Fixed  PAR-52CLSB (920T bootstrap code is Cat D it should be Cat E).  Changed
+		categorisation to E after source code recategorisation CR - CMOS-52WJ5V
+	
+
+8)	Pete
+	1)	Removed Cogent source
+	2)	Removed Windermere source
+	3)	Removed MEDCRM and MEDCRR media driver source.
+
+Version 1.02.361
+================
+(Made by AndrewT, 31/08/2001)
+
+1)	AndrewT
+	1)	Fixed EDNATHE-4QQKZM (RThread().Suspend() deadlocks the emulator) again.
+		The original fix was incomplete.
+	2)	Fixed HEY-4XHGD5 (Remove \e32\include\K32DBGDD.H)
+	3)	Fixed MET-4YSM3M (Text shell DIR command problems)
+
+2)	Nicolas
+	1)	Fixed FID-4VHGDK (Debug should show current thread
+	  	after exception).  When a thread or process panics or
+	  	takes an unhandled exception, the name and ID of the
+	  	thread/process is displayed in the kernel traces (only
+	  	if KPANIC is set).
+	2)	Replaced void GetExceptionVectorsInfo(addr, size) with
+	  	TUint32 ExcVectorsAddr() in generic bootstrap because
+	  	vector table size not used anymore.  Documented that
+	  	in bootstrap doc version 1.2.
+	3)	Small changes following RHR 113.2 (exception code in
+	  	fast RAM) review.
+	4)	Exception vectors are now moved to highmem on assabet.
+	5)	Updated makefiles used to build bootstrap tests for
+	  	MLNK, MINT and VTEMPLATE now that the generic test
+	  	code is contained in libraries.
+
+3)	Chris
+	1)	Fixed problem with cirrus not turning display on introduced with LCD changes for GT111
+	2)	finished implementation of mapping video chunk from more than one physical region
+	3)	Updates to video driver code from code review.  Split video driver up into bit which needs porting and the interface.
+	4)	Changes to video driver for CR LROS-4Z7E7Z to allow scdv get all display modes
+	5)	updated video test code to include tests for palette when not in palettized video mode and updated assabet and brutus
+		to report if backlight is supported via HAL and fixed inconsistency between assabet,brutus and the template reporting
+		different error value if palette functions called on a none palettized video mode.
+	6)	Fixed  FID-4ZGJ2L WINS/WINC doesn't handle command line args correctly.  If executable command path 
+		has spaces it will be quoted.  If a quote is found it skips until the next one.
+	7)	Fixed MOS-4Y4D9K Two taps on screen required to turn on display.
+
+4)	AndrewJ
+	1)	Fixed THY-4YCP96 stopped Null pointer from being derefrenced in LFFS media driver
+
+5)	JonM
+	1)	Fixed defect FID-4WUGL4 - "MMU secondary config is annoying"
+		The MMU secondary config is now obtained from a constant (KMmuSecondaryConfig) contained
+		in the bootstrap's variant library.
+	2)	Fixed defect FID-4XTC27 - "Bank width corrupted in BDB"
+	3)	Fixed defect FID-4Y3CP3 - "Should fill unused Rom config blocks"
+	4)	TransferBuffer performance greatly improved.
+	5)	API CHANGE: DTransferWindow::MapInBufferL is now non-leaving and has been
+		renamed to MapInBuffer.
+	6)	Fixed bug in DPlatProcess::RemoveChunk, this no longer flushed the data chache
+		when removing EFixedAddress chunks.
+	7)	Extended T_HWA test to include a benchmark test for PutData. Also made this
+		work on Integrator.
+	8)	Fix for defect PAR-4VMKV7 - "WD_VT100 has lost its basic nature and now depends on the Comms drivers!!"
+		WD_VT100.CPP Has now reverted being output only, via the debug port.
+		The implementation using the ECOMM driver has been added as WD_VT100_ECOMM.CPP
+	9)	Fix for defect FID-4YTET9 - "Manufacturer in HAL should be a UID"
+		(Made TManufacturer definition obviousely extendable by using UIDs.)
+	10)	Fixed defect SAS-4ZTD5D - "Missing l7200a t_trace.cpp file for bootstrap tests"
+		Also fixed build failure with Integrator bootstrap test code.
+	11)	Fixed defect SAS-4ZSGBU - "Exports inconsistent. v32isaab.h includes not exported"
+	12)	Fixed defect FER-4XGDVT - "Integrator can't cope with time being set randomly"
+	13)	Removed #include <e32transbuf.h> from e32std.h
+
+6)	MarkCa
+	1)	Implemented MEDLFS driver for Integrator.  Mounts on local drive 1
+		and provides access to 2 * 4Mb flash chips.  ELFFS is not mounted
+		by default.
+
+7)	CarlosF
+	1)	Changes to Assabet bootstrap and Variant to make Assabet's CPU and Memory
+		bus clock speed configurable. Also includes an option to always format the
+		C:\ drive on start-up if LFFS filesystem is mounted on this media.
+	2)	Changes to SA1100 ASSP to enable WAIT signal detection on Assabet PCCard 
+		IO accesses. This is required as the Assabet controller needs to be
+		configured to detect the assertion of this signal on accesses to IO space
+		contrary to Brutus which has this detection enabled by default.
+
+8)	TimBa
+	1)	Folding now folds 0xA0 (non-breaking space) to normal space (0x20)
+
+9)	Andy Curran (Uikon)
+	1)	Fix for (PER-4Z5DW6) Switch On/Off Control Panel Dialog case closed option does not work.
+		Really just correcting a few typos.  Fix tested with success.  Fix accepetd by Nicolas T.
+
+10)	MichaelP
+	1)	Updated Helen port (mhelen target) to 6.1 port sources from 30 July
+		2001 (Perforce revision 10426). Many changes, among them items 2) - 6).
+	2)	Added directory stdarmWT (containing some files) under /bootstrap/mmu/:
+		"Bootstrap MMU Write-Through Mode." 
+	3)	Added directory ecommdma (also containing some files) under
+		/e32/drivers/: "Implements the Logical device driver for a serial port
+		using DMA transfers." This driver is used by the mhelen target.
+	4)	New kernel exports for mhelen: 
+		THelen::ReadIntMask(unsigned int);
+		THelen::SetMcBspReg(unsigned int, unsigned int, unsigned int);
+		THelen::SetComBSPStatus(int);
+	5)	Re-activated #define __EARLY_DEBUG__ in
+		\e32\ekern\epoc\arm\Helen\KA_UTL.CPP.
+	6)	Added file \e32\rombuild\HelenTests.oby.
+	7)	HWA API: RHwaTask functions GetData / PutData are now kernel exec calls
+		(as opposed to kernel server calls) --> significant performance
+		increase.
+		The previous behaviour (i.e. server calls) can be had by uncommenting 
+		//#define GETPUTDATA_ARE_KERNELSERVERCALLS in d32hwa.h.
+	8)	HWA API: Constant value changed: KTfBufIdNull = 0x0 (was: 0xf0000000).
+	9)	Added overloaded function
+		DTransferWindow* Kern::TransferWindowFromHandle(TInt aHandle, DThread* aThread);
+		to \e32\include\k32std.h, exported and frozen for all targets. Function
+		is implemented in \e32\ekern\ks_transbuf.cpp. This function is used
+		where the current thread is not the same as the one that created the
+		window handle.
+	10)	T_HWA has now integrated profiling support, activated by calling "t_hwa
+		profile". 
+
+11)	RobertJ
+	1)	Added a new constructor each for RArray and RArrayPointer. This enables
+		the sort/find to be used with an existing array with memory allocated
+		outside of these classes.
+
+
+Version 1.02.360
+================
+(Made by Peter, 06/08/2001)
+
+1)	MarkCa
+	1)	Fixed FID-4X8JKB (TMMCCommandDesc::Direction() should be const.)
+	2)	Fixed MMC controller defect in ExecCommandSM() / EStDeselectEndCheck
+		where cmd was not reset after the stack was popped.
+	3)	Optimized DMMCcontroller::PowerUpBus() to initialize stack once for
+		all drives.  Check if initialized successfully and still powered up.
+		If so, complete immediately.  Retain ability to power down and power
+		up again if failed because of unknown password (CMD3 RTO.)
+
+2)	Chris
+	1)	Changed brutusa\video.mmp to use visaba.lib not visaab.lib and cixyba.lib not cixyab.lib
+	2)	Updated headers and removed dead code from files changed for LCD driver improvements.
+	3)	Removed "screensize" keyword from header.iby files
+
+3)	AndrewT
+	1)	Fixed NEO-4X8CFY (TTime::WeekNoInYear() function returns wrong 
+		week number if  week start day is not monday). Rewrote the
+		second half of the offending function to do the right calculations.
+
+4)	Michael
+	1)	Commented out #define __EARLY_DEBUG__ in
+		\e32\ekern\epoc\arm\Helen\KA_UTL.CPP.
+	2)	Deleted line "screensize=320x240x12" from
+		\e32\rombuild\mhelen\header.iby.
+	3)	Added to \hal\inc\hal_data.h enum TManufacturer
+		"EManufacturer_TexasInstruments" and enum TMachineUid
+		"EMachineUid_Helen=0x101F3EE3".
+	4)	HWA API:
+		a) Introduction of concept of input and output index for tasks with
+		   multiple I/Os. These indices are additional (& optional) arguments for
+		   RHwaTask functions InputFrom(), DisConnectInput(), InputConnection(),
+		   and OutputConnection(), and are also part of class TTaskConnectInfo.
+		b) New RHwaTask querying functions: GetTaskProperties() and
+		   GetTaskStatus().
+		c) With these come two new classes: TTaskPropertyInfo (this not new but
+		   updated), and TTaskStatusInfo.
+		d) RHwaDevice::Tasks() now returns a find-handle -- the handle is no
+		   longer a component of the filled TTaskPropertyInfo structure.
+		e) RHwaDevice::CreateTask() has an additional parameter aNumWindows (#
+		   of transfer windows for DHwaTask object).
+		f) RHwaTask functions Logon() and LogonCancel() are now void.
+		g) RHwaTask::SetOwningDevice() is now a protected class member and no
+		   longer documented in the API doc.
+		h) Class RHwaDevice is now a friend of class RHwaTask.
+		i) Removed RHwaTask functions GetStatus() and GetTaskID().
+		j) Removed RHwaTask default constructor (was empty).
+		k) Removed enum THwaTaskLogon (was not used).
+
+5)	Nicolas
+	1)	Modified MCOY bootstrap to take into account the super
+	  	and CPU pages layout changes introduced in E32 359.
+	2)	MCOY ASSP layer now contains static arrays for the
+	  	various stacks and initialises the PP::* and Arm::*
+	  	stack "top" pointers.  Note that it would be possible
+	  	to perform the stack allocation in the bootstrap
+	  	instead.
+	3)	Fixed MAY-4V4E5V (Breakpoints don't work on ARM
+	  	architecture 5 processors). Now two opcodes in the
+	  	undefined space are used: a 16 bit one for THUMB and a
+	  	32 bit one for ARM (previously a unique 16 bit pattern
+	  	was used).  RDebug::SetBreakPoint() has now a new
+	  	overload which allows to specify what kind of
+	  	breakpoint is excepted.  The old overload is
+	  	deprecated (it returns KErrGeneral systematically).
+	4)	Cosmetic changes to bootstrap and kernel following
+	  	code review.
+	5)	Removed dubious assert from bootstrap which crashed
+	  	Brutus when warm-booting: MarkRamImageInBank() can
+	  	actually be called with a BDB containing
+	  	KBdbBankTypeRamAsRom in that case because the BDB
+	  	initialised during cold boot is reused.  This allows
+	  	to skip bank size/width detection.
+6)	William
+	1)	Add CleanupArrayDelete template to E32BASE.H, and remove the __EPOC_CLEANUP_SUPPORT__
+		include guards to complete Epoc32 Proposal SW1-87 (See STORE 0049 notes from 1998) 
+	2)	Export EKDATA.DEF so that ASSPs can get it from a published place, rather than
+		referring to ..\e32\bmarm\ekdata.def. Modified various MMP files to get this file
+		from \epoc32\release\marm\ekdata.def instead.
+
+7)	Pete	
+	1)	Fixed FID-4XEE3C "Remount of fixed media broken". Change to the function
+		DPrimaryMediaBase::NotifyMediaStatusChange() which is called on media
+		change, but more significantly when forcing a remount on a drive. The change
+		involves only attempting to reset media driver current consumption if the
+		media is removable (since only drivers for removable media track current
+		consumption). This fixes a problem where the kernel heap became corrupt when
+		forcing a remount on a fixed drive.
+	2) 	Added the following functions to the TBusLocalDrive class:-
+
+		a) TInt SetMountInfo(const TDesC8* aMountInfo,TInt aMountInfoThreadHandle);
+			The SetMountInfo() function allows a descriptor to be associated with
+		a local drive - which is passed down to the corresponding media driver for the
+		drive as that driver is opened. This therefore provides a means of supplying
+		additional information to the driver at creation time. In the case of 'secure'
+		drives, a driver may not open successfully unless the correct mount information
+		is supplied at creation time. Mount information, once passed into the drive, is
+		stored in the correspnding DPrimaryMedia object for the drive and is therefore
+		available for subsequent remounts of the drive following media change or machine
+		power down events. Mount information can be cleared by passing in a NULL mount
+		info descriptor.
+
+		b) TInt ForceRemount(TUint aFlags);
+			This forces a local drive to be remounted. This is a replacement for the
+		function UserSvr::ForceRemountMedia(TMediaDevice aDevice) since the latter
+		requires knowlege of the h/w platform in quesion in order to select the 
+		appropraite TMediaDevice value for a particular drive.
+	3)	Added SetMountInfo() function to TLocDrv class and modified TLocDrv::Open()
+		so this no longer takes a 'const TDesC* aMountInfo' parameter. Corresponding
+		change to DMedia::Open() function which also no longer has a 
+		'const TDesC* aMountInfo' a parameter. The mount info is intead stored in the
+		DPrimaryMedia class which has two new functions:-
+			TInt SetMountInfo(TLocalDriveMessageData &aMountInfo,TInt aMediaNum);
+			TMediaDrvDescData* MountInfo(TInt aMediaNum);
+	4)	Change to DMediaDriver class which now supplies the DoCreate() function and instead
+		requires a derived driver class to supply the pure virtual function:-
+			Int Open(TMediaDevice aMediaDevice).
+		In most cases, convertion of existing non-removable drivers will require the existing
+		DoCreate() function to be renamed Open().
+
+
+Version 1.02.359
+================
+(Made by JonathanM, 18/07/2001)
+
+1)	Morgan
+	1)	Implemented CR MHEY-4XHN9D "Move DPassiveDebugger implementation out
+		of the core kernel"
+		Exported the following functions and K32DBG.H
+			ImpMmu::AllocatePageTable(unsigned long, unsigned long, int)
+			DPlatProcess::DataSectionBase(DPlatChunk *) const
+			ImpMmu::FreePageTable(int, int)
+		Moved ka_edbg.cpp from all ASSPs and
+		\e32\ekern\epoc\arm\kc_edbg.cpp into a device-driver/extention in
+		\tools\debugger_stub\passivestub\...
+	2)	Removed DDebugger initialisation calls from boot.
+		A DDebugger implementation should load itself as an extension or a
+		device driver, and install using Plat::SetDebugger(debugger);
+	3)	Added __ENABLE_NOTIFY_DEBUGGER__ macro to enable/disable debug support
+		in the kernel.  Currently on in UREL and UDEB builds by default.
+	4)	Cogent passive debugger now lives in \tools\debugger_stub\passivestub
+		and is built as EDEBUG.LDD.  Include this as an extension to get
+		Lauterbach OS aware debug.  Or load it as an LDD with DEBUGGER.EXE
+			"DEBUGGER load" from the command line
+	5)	Helen debugger now lives in \helen\debugger and built as EDEBUG.LDD
+		See 4) for usage.
+
+2)    Nicolas
+	1)	The kernel data/bss section can be relocated to any fast
+		RAM bank by setting KBdbFlagKernelData in the
+		appropriate BDB bank descriptor (generic bootstrap
+		only).
+	2)	The supervisor stack/heap can be relocated to any fast
+		RAM bank by setting KBdbFlagSvStackHeap in the
+		appropriate BDB bank descriptor (generic bootstrap
+		only).
+	3)	The kernel stacks (reentrant, null, irq, fiq, exception)
+		can be relocated to any fast RAM bank by setting the
+		relevant bit (KBdbFlagStack*) in the appropriate BDB
+		bank descriptor (generic bootstrap only).
+	4)	The kernel stacks are now allocated by the generic
+		bootstrap (either in DRAM or fast RAM).	 Super and CPU
+		pages layout modified to pass stack info to the kernel.
+		Each variant using the generic bootstrap calls
+		Arm::Init1Stacks() from ImpHal::Init1() to initialise
+		the stacks.
+	5)	For the windermere port which does not use the generic
+		bootstrap, the stacks are statically allocated in the
+		ASSP layer and ImpHal::Init1() initialises the
+		Arm::*StackTop and PP::*StackTop pointers.
+	6)	The exception vectors, handler and dispatch table can
+	  	be relocated to any fast RAM bank by setting
+	  	KBdbExcCode4k in the appropriate bank descriptor
+	  	(generic bootstrap only).  There also exist
+	  	KBdbExcCode8k and KBdbExcCode12k in case the exception
+	  	handlers get bigger in the future.
+	7)	The exception vectors are now located at 0xFFFF0000 on
+	  	platforms which support this.  Grep for
+	  	__CPU_EXC_VECTORS_MOVABLE in u32std.h for a
+	  	comprehensive list.  As a consequence dereferencing
+	  	NULL pointers in privileged mode now enters the debug
+	  	monitor.
+	8)	Fix defect CLE-4Y4EMG (Bootstrap doesn't fill in Rom
+		config section completely): ROM type fields now
+		correctly initialised in the super page.
+	9)	Bootstrap test code added for assabet.
+	10)	Bootstrap documentation updated.
+	11)	Template port updated.
+
+
+3)	Michael
+	1)	Fixed Helen crashing (exc id 26) at boot-up time: ImpHal::Idle() in 
+		\e32\ekern\epoc\arm\Helen\KA_UTL.CPP
+	2)	Modified macro test() in e32test.h such that it now also displays the
+		respective source filename when an RTest test fails. Added the necessary
+		overloaded operator() and constructor to class RTest in us_test.cpp.
+		An occasional stack overflow problem has been fixed: we now pass the filename
+		string as a const TText* rather than a const TDesc& (_S() vs. _L()).
+	3)	Fixed DPlatChunk::SetContiguousRamL() and DPlatChunk::SetHardwareL() in
+		\e32\ekern\epoc\kp_chk.cpp: too much memory was	reserved upon creation of a
+		transfer buffer, too little freed after closing it.
+	4)	Fixed CBitMapAllocator::ExtractRamPages() in \e32\euser\cbase\ub_bma.cpp:
+		eliminated a condition when the do/while loop would never be left.
+	5)	added two exported static kernel functions: DThread* Kern::SvThread() and
+		DProcess* Kern::SvProcess(), frozen for mawd, mcga, mcoy, meig, mhelen, mint,
+		misa, mlnk, mtemplate, wins
+	6)	HWA API:
+		- changed task parameter TaskID from type TInt to TUid
+		- RHwaTask::Close() and RHwaDevice::CloseTask() now return an TInt error code
+		  from the kernel (actually from the PDD), rather than being void
+		- T_HWA: creating a contiguous transfer buffer from the user side now works,
+		  added test of task messaging functions, misc. fixes.
+
+4)	Tim Band and Arun Sachamuneewongse
+	1)	Added three 'next favourite' language specifiers to TLocale and
+		SLocaleData, and setters and getters for them in TLocale.
+
+5)	JonathanM
+	
+	LCD Driver Portability Enhancements
+
+	Moved all display related code into new kernel extension (VIDEODRIVEREX)
+	New LDD stub (VIDEODRIVERLDD) provides access to this implementation.
+
+	Added HAL attributes
+
+		EDisplayIsMono,                // Display is monochrome
+		EDisplayIsPalettized,          // True if display is in a paletized mode
+		EDisplayBitsPerPixel,          // Number of bits per pixel for current display mode
+		EDisplayMaxBitsPerPixel,       // Max color resolution display mode
+		EDisplayMemoryAddress,         // Start of video memory
+		EDisplayOffsetToFirstPixel,    // Offset of first displayed pixel from EDisplayMemoryAddress
+		EDisplayOffsetBetweenLines,    // Number of bytes between the first pixel in successive lines
+		EDisplayPaletteEntry,          // To get, pass entry number (Color returned as 0x00bbggrr)
+									   // To set, pass entry in bits 31-24, color in bits 23-0
+		EDisplayIsPixelOrderRGB,       // True if physical pixel layout is RGB, false for BGR
+		EDisplayIsPixelOrderLandscape, // True if physical pixel layout is landcape, false for portrait
+
+	Added new exports to EKERN
+
+		DPlatChunkHw::DoCreateL(class TPhysAddrs* aAddr,TInt aCount,TChunkType aChunkType)
+		TBool Plat::CheckInWservThread()                     // Returns true if current thread is the registerd WSERV thread
+		void Hal::SetDisplaySizeInPixels(const TSize& aSize) // Inform kernel of display size in pixels
+		void Hal::SetPhysicalScreenSize(const TSize& aSize)  // Inform kernel of display size in twips
+		void Hal::SetMaximumDisplayColors(TInt aMaxColors)   // Inform kernel of number of phsysical colors
+
+	Removed the following methods
+
+		ImpHal::DisplaySizeInPixels()
+		ImpHal::PhysicalScreenSize()
+		ImpHal::MaximumDisplayColors()
+
+		Hal::DisplaySizeInPixels()
+		Hal::PhysicalScreenSize()
+
+		ImpPsu::DisplayOn()
+
+		Custom::DisplaySize();
+		Custom::PhysicalScreenSize();
+		Custom::DisplayOn();
+		Custom::DisplayOff();
+		Custom::MaximumDisplayColors()=0;
+
+		P::ClearScreen()
+
+6)	JonathanM
+
+	Fixes for base release.
+
+	1) Updated E32 and F32 version numbers.
+	2) Added IPR Policy files to base\assabetb\bootstrap\test (Category E)
+	   and base\helen\debugger (Category B).
+	3) Fixed WINS EDISP build warning.
+	4) Changed T_VIDEO so that it doesn't build for WINS.
+	5) Modified OBY files for varients which now use the new VideoDriverExtension.
+	   These now have "#define USE_VIDEODRIVEREXTENSION"
+	6) Removed spuriours Kern::Printfs.
+	7) Renamed Integrator VideoDriverExtension to match romkit name pattern.
+	8) Fixed bug in MISA videodriver GetPaletteEntry function.
+	9) Removed always on tracing from brutus screen driver code.
+	10) Fixed Integrator ROM building (needed to include video driver by correct name
+	    and exclude the old Neon250 kernel extension.
+
+
+Version 1.02.358
+================
+(Made by Michael, 19/06/2001)
+
+1)	MichaelP
+	1)	Added (many) and modified (some) files for the MHELEN ASSP base port.
+	2)	Modified macro test() in e32test.h such that it now also displays the
+		respective source filename when an RTest test fails. Added the necessary
+		overloaded operator() and constructor to class RTest in us_test.cpp.
+	3)	Reverted the change of the test() macro mentioned under 2) because of stack
+		overflow problems with some programs which were detected during the link
+		stage. This needs to be further investigated. For the time being we use the
+		old version of test().
+	4)	Updated HWA driver (LDD + WINS PDD) and API code. Added (bogus) PDD for Helen.
+
+2)	Nicolas
+	1)	rom.cfg: suppressed no-header option for integrator.
+	2)	Fixed defect FER-4XDH9P (Switch On messages not
+	  	received) on WINS by calling Power::SwitchOn() when
+	  	waking up following normal or emergency standby.
+	3)	Deleted Eiger custom bootstrap because the port
+	  	actually uses the generic one.
+
+3)	MarkCa
+	1)	Fixed EDNHLJT-4WZGTD (Secure mmc - "Invalid" after cancelling pw change
+		& FM panic) and related EDNHAAO-4WZFYR (Secure MMC: Note "Invalid" shown
+		after updating the file system.)  New media attribute KMediaAttHasPassword
+		shadows PWD_LEN != 0 in card, and controller backs up store before
+		password operation, recovering on failure.
+	2)	Fixed CAN-4WJHJN (6.0) and EDNMCAN-4VYKTY (6.1) ("File server must accept
+		new MultiMediaCard password encoding scheme".)  Password notifier
+		changed to encode passwords as Unicode.
+	3)	Enabled debug password notifier for F32 fix EDNPCHY-4VWP5B
+		(problems with secure mmc implementation.)  This completes after
+		a user specified period and is used to debug using F32 when a
+		notifier is raised.
+	4)	Implemented CR PSCE-4VMP3K to set hard limit for RAM drive.  New HAL
+		attribute EMaxRAMDriveSize must be set to size in bytes, where value
+		includes FAT.
+
+4)	TimBa	Fixed bug in MatchF: if argument was an empty descriptor, it always
+		returned null. Now if the candidate is nonempty it returns KErrNotFound.
+
+Version 1.02.357
+================
+(Made by Carlos, 31/05/2001)
+
+1)	William
+	1)	Change DebugThreadPanic to use a struct for the debugger-friendly values, so that
+		a simple autoexp.dat change will display the panic details properly.
+
+2)	Dennis
+	1)	Fixed defect HAR-4WSGJ5 (RArray::FindInUnsignedKeyOrder not returning KErrNotFound).
+		This was due to problems with the special case handling of 4 byte entries in the ARM
+		assembler version.
+	2)	Fixed problem with MCOY failing to boot when image was loaded using RedBoot
+		instead of RT bootloader.
+		There were two problems - a spurious CIU interrupt and the fact that the RTC correction
+		and LastSetTime were uninitialised.
+
+3)	Nicolas (RHR 113.1 completly implemented)
+	1)	5mx: Set LCD contrast to its default level every time
+	  	the screen is switched on.  This works around the
+	  	regression introduced while cleaning up the Hal class (p4 changelist 
+	  	(the screen was completely black and unusable).  
+	2)	Fixed typo in ImpMmu::UnmapPage(): confusion between pde and pte.
+	3)	Added support for TC RAM banks in generic bootstrap.
+	  	Hardware-specific initialisation is left as an
+	  	exercise to the system integrator.  It should be done
+	  	in HWInitialise().
+	4)	Added new consistency checks in generic bootstrap
+	  	(ROM/RAM bank ordering, bank overlap in
+	  	physical/linear space).  Enabled for UDEB only.
+	5)	Partially implemented scheme allowing to fake IRAM on
+	  	assabet (disabled).
+	6)	Reorganised bootstrap test code: generic code moved
+	  	from brutusa to bootstrap.
+	7)	Ported bootstrap test code on assabet.
+
+4)	JonathanM
+	1)	Added a new export to the BLD.INF files for BRUTUSA and ASSABETB.
+		VI_POWER.H is now exported to KERNEL\SA1100\ to enable the sound drivers to
+		set their power requirements.
+
+5)	AndrewCu
+	1)	Small changes to the RNotifier class in e32 (for Uikon 6.2 Dialog Server work).
+
+6)	Tim Band
+	1)	Changed TChar functions that query the type of the character so that
+		they do not make an Exec call
+	2)	Made Private Use Area characters graphical and printable according
+		to their meaning
+	3)	New folding code that respects Unicode
+	4)	Removed Uzbek, Tajik and Azerbaijani from language list, added
+		Tagalog in place of Azerbaijani
+
+7)	CarlosF
+	1)	Several changes to Assabet Variant to get LFFS to mount on C:\ drive. This ended up
+		being made configurable, Switch 4 of the switch-pack on the Companion Chip Card
+		is used to decide wheter to Mount FAT or LFFS on drive C:\.
+
+1)	Nicolas (RHR 113.1 completly implemented)
+	1)	5mx: Set LCD contrast to its default level every time
+	  	the screen is switched on.  This works around the
+	  	regression introduced while cleaning up the Hal class (p4 changelist 
+	  	(the screen was completely black and unusable).  
+	2)	Fixed typo in ImpMmu::UnmapPage(): confusion between pde and pte.
+	3)	Added support for TC RAM banks in generic bootstrap.
+	  	Hardware-specific initialisation is left as an
+	  	exercise to the system integrator.  It should be done
+	  	in HWInitialise().
+	4)	Added new consistency checks in generic bootstrap
+	  	(ROM/RAM bank ordering, bank overlap in
+	  	physical/linear space).  Enabled for UDEB only.
+	5)	Partially implemented scheme allowing to fake IRAM on
+	  	assabet (disabled).
+	6)	Reorganised bootstrap test code: generic code moved
+	  	from brutusa to bootstrap.
+	7)	Ported bootstrap test code on assabet.
+
+
+Version 1.02.356
+================
+(Made by Pete, 10/05/2001)
+
+1)	MarkCa
+	1)	Added base support for store LFFS optimization.  KDriveAttTransaction
+		bit added to \e32\include\e32std.h.
+
+2)	Dennis
+	1)	Added mouse driver and VGA video driver for Integrator.
+	2)	Renamed the text window server DServer object to "TextWindowServer".
+
+3)	Morgan
+	1)	Implemented Silent Running on Assabet
+
+4)	Pete
+	Further changes to MMC Controller:-
+	1) 	Renamed the function 
+		DMMCSession::FillCommandDesc(TMMCArgumentTUint32,TUint8*,TUint32) to
+		FillCommandArgs() since it doesn't actually result in the command descriptor
+		array being updated.	
+	3) 	Removed check from DMMCStack::IssueCommandCheckResponseSM() whether
+		a multiblock read/write command has been selected with a total length less than 
+		a block. This is redundant.
+	4) 	Modified DMMCStack::CIMReadWriteBlocksSM(). This
+		function no longer sets up the command descriptor array for special block transfer 
+		commands (but expects this to have been already done before the function is called).		
+	8) 	Further change to the WINS local drive mappings. The entire local drive mapping for
+		WINS is now as follows:-
+		Local drive 0:	Internal RAM drive (EFixedMedia0) - Y:
+		Local drive 1:	1st special MMC Card on MMC socket 0 (ERemovableMedia0) - X: 
+		Local drive 2:	2nd special MMC Card on MMC socket 0 (ERemovableMedia0)
+		Local drive 3:	MMC Card on MMC socket 1 (ERemovableMedia1)
+		Local drive 4:	Not currently assigned
+		Local drive 5:	Not currently assigned
+		Local drive 6:	Not currently assigned
+		Local drive 7:	Not currently assigned
+		Local drive 8:	Internal LFFS drive (EFixedMedia1) - W:
+
+5)	Pete
+	1)  	Modified bootstrap for Cirrus7211a so that this now runs at 36MHz.
+
+6)	Nicolas 
+	1)	Added fixed size internal RAM banks in generic
+	  	bootstrap.
+	2)	Introduced support for area relocation in generic
+		bootstrap.  Every kind of file (including the primary)
+		can be relocated to an internal RAM bank.
+	3)	Updated generic bootstrap version number to 2.1.
+	4)	Submitted Richard's bootstrap test files.
+	5)	Removed MCORE stuff from generic bootstrap.
+	6)	Inversed order of "static" and "const" in _LIT()
+	  	definition to avoid lint warning.
+	7)	Added assabet.mbc (metabuild script).	 
+	8)	Implemented RProcess::GetMemoryInfo().  This allows to
+	  	extend GDB so it can attach itself to running threads.
+
+7)	Michael
+	1) 	Added overloaded function:
+		DTransferBuffer* TransferBufferFromHandle(TInt aHandle, DThread *aThread)
+		to \e32\include\k32std.h, exported and frozen for all BUILDS. Function
+		implemented in \e32\ekern\ks_transbuf.cpp. This function is used where the
+		current thread is not the same as the one that created the handle.
+	2)	Changed behaviour of DPlatTransferBuffer::~DPlatTransferBuffer() and
+		DPlatTransferBuffer::DoClose() in \e32\ekern\emul\win32\kp_transbuf.cpp and 
+		\e32\ekern\epoc\kp_transbuf.cpp: iChunk gets only deleted if it actually exists,
+		i.e. is non-NULL
+	3)	Numerous changes to HWA implementation (User API, LDD and WINS PDD), work
+		still ongoing.
+
+Version 1.02.355
+================
+(Made by Nicolas, 04/05/2001)
+
+1)	William
+	1)	Changed the WINC-only KernelStarted semaphore to be anonymous, to prevent
+		problems with concurrent WINC execution on a multiple processor build machine.
+		This will not re-open defect EDNGBON-4JYNU6 "Inaccessibility of request
+		semaphores breaks EPOC connect" because this isn't a request semaphore.
+	2)	Fixed TGlobalAlloc to use User::AllocL rather than new[], and User::Free instead of
+		the mismatched delete. This will now work even if new[] plays funny tricks (which
+		is the case with CodeWarrior) and makes the User::ReAllocL call legitimate.
+
+2)	Nicolas
+	1)	Merged 6.1 release branch back into the mainline.
+
+Version 1.02.354
+================
+(Made by Dennis, 20/04/2001)
+
+1)	AndrewJ
+	1) 	Changed the misa kernel.iby file to detect whether the build is for 
+	   	Assabet varient. If it is for assabet an alternative estart is 
+		included in the rom which automatically loads the LFFS on to K: drive 
+		as well as other tasks performed by estart. This should not take place
+		on any other platform.
+	2)	The generic estart is only loaded (in f32) for non Assabet platform as
+		added a definition call CUSTOM_ROM that is only defined for assabet. 
+	3) 	Added estart.cpp /assabetb/ and loadlffs.cpp to /assabetb/lffs/ for
+		new estart.exe component loaded only fopr Assabet.
+	4)	removed /test/ subdirectory in /assabetb/lffs/ as nothing it it is or 
+		should be used.
+	5)	removed obsolete definition of BASE_ROM from F32tests.oby,
+		E32tests.Oby and Alltests.oby
+
+2)	Morgan
+	1)	Deleted \e32\bmarm\EXYIN.DEF
+	2)	Added EPenState attribute to HAL to get/set state of the digitiser.
+	3)	Added EKeyboardState.
+	4)	Added pen/display get/set functionality to BRUTUS HAL DLL and driver.
+	5)	Added Enable() and Disable() functions to digitiser driver on Brutus.
+	6)	Tweeked Brutus digitiser driver to send switch on events when coming
+		out of standby or hibernation (disabled) mode.
+	7)	Removed LCD switch on from LCD power handler.
+	8)	Generic kernel now doesn't call DisplayOn().
+	9)	Added Power::SwitchOn() that can be called from device drivers to
+		send a ESwitchOn event if the KPowerUserCpu bit is not set.  Does the
+		same thing as a call to SetRequirement(KPowerUserCpu | ...) but is
+		easier to understand.
+		Added variant that takes a TRawEvent to specify which event is sent
+		for switch on.
+		Call Power::SwitchOn() from your device driver to cause full UI switch
+		on.
+	10)	Tidied Brutus HAL DLL startup code.
+	11)	Made text window server take responsibility for turning on the screen
+		at switch on.
+	12)	Tidied Assabet HAL DLL startup code and removed spurious panicking
+		code.
+	13)	Updated HAL\DOC\HAL.DOC boilerplate startup code.
+	14)	Made display on imply switch on, and send events as appropriate
+	15)	assabetb, cirrus7211a, series5mx1 variant updates to maintain current
+		behaviour.
+	16)	Changed the prototype of DPowerModel::PowerStandby() to return an error
+		value.
+
+3)	Dennis
+	1)	Fixed a problem with creation of fixed address chunks with initial
+		size zero.
+
+4)	Jonathan
+	1)	Removed redundant Hal and UserHal functions from kernel and ASSPs.
+	2)	Refroze kernel exports for all platforms other than WINS/WINC.
+	3)	Removed associated variant functions and, where necessary to implement
+		the HAL API, re-implemented them via a HAL driver on the mainstream
+		platforms Brutus, Assabet and VTemplate. Other variant DLLs still
+		contain some redundant functions and may not have implementations for
+		all appropriate HAL attributes.
+
+5)	Carlos
+	1)	Several changes to Assabet Variant to get PC Card working
+	2)	Assabet builds its own ATA driver (vi_medata.cpp). The generic ATA
+		driver is not used. Changed the MISA kernel.iby to allow Brutus to use
+		the generic ATA driver and Assabet to use its Variant-specific one.
+
+6)	Dennis
+	1)	Added integrator port. No screen or serial drivers yet.
+
+7)	Pete 	
+	4)	Fixed SCE-4V7S6C "MMC Controller card init. function is in-efficient
+		and unnecessarily complex". This entailed:-
+
+		- Add new TMmcCardArray class to replace the DMMCStack::iCxNewAcqArray[]
+		and DMMCStack::iCards[] arrays and their associated functionality.
+		- Removal of ASSP layer function DMMCStack::PhysicalCardSlots()
+		  function as this was duplicating information already returned in the
+		  ASSP layer function DMMCController::SetMachineInfo() function.
+		- Addition of generic layer DMMCStack::Init() function to determine
+		  the max. number of cards for the platform once - at Controller
+		  init. time rather than every time a card stack is initialized.
+		- Modification to DMMCStack::PowerDownStack() function to add an extra
+		  argument to this function (TBool aMediaChange) indicating whether
+		  the power down is required due to media change or not.
+		- Removal of the 'update stack' implementation in the generic layer of
+		  the Controller. This was intended to re-scan for new cards after a
+		  media change. This is now redundant since all cards are always
+		  powered down on media change.
+		- Various comments added throughout PS_MMC.CPP to aid clarity.
+	5)	Fixed FID-4UZLFG "Increase number of supported local drives"
+
+8)	Nicolas
+	1)	Added \brutusa\brutusa.mbc
+	2)	Cogent: Moved call to ImpHal::EnableIrqs() from ImpPic::Init3() to
+	  	beginning of ImpHal::Init3() to avoid the board hanging forever while
+	  	initialising the PCI base module.
+
+9)	William
+	1)	Removed temporary WINSCW workaround in up_i64.cpp, now that the CodeWarrior
+		compiler supports the BT instruction.
+	2)	Added WINSCW-specific variation of the path constants in up_path.cpp
+	3)	Rearranged win32/up_trp.cpp version of TTrap::Trap() so that the register
+		saving happens before the C++ code to manipulate iResult and aResult. This
+		avoids a problem where the CodeWarrior compiler was saving EBX on the stack and
+		and using it as a temporary during the iResult/aResult mangling, causing the
+		wrong EBX value to be restored during Leave.
+
+Version 1.02.353
+================
+(Made by RobertJ, 26/03/2001)
+
+1)	Carlos
+	1)	Several Changes in Assabet Bootstrap and vi_power.cpp in order to get
+		the Power Management/Sleep Mode working properly.
+	2)	Changes to Assabet Keyboard driver/controller
+	3)	Removed #define __USE_LEDS_FOR_SYSTEM_DEBUG. User software can now use
+		those LEDs if they wish.
+	4)	Had to implement a function in the Assabet Variant to allow enabling
+		RTC Interrupts. Surprisingly the SA1100 ASSP does not have these
+		functions!
+	5)	Some changes to the SA1100 Interrupt controller (only affect Assabet
+		as they were changes in the way External Interrupts are handled).
+	6)	Needed to export the Kernel function ImpMmu::LinearToPhysical as this
+		will be called from the Assabet Variant (vi_power.cpp).
+	7)	Got rid of the debug message printed every time the Variant is called:
+		after waking up, a call to re-enable the Debug Port would attempt to
+		print this out and crash!
+
+2)	Alastair
+	1)	Added initial transfer buffer functionality.  Chief classes are
+		RTransferBuffer and RTransferWindow user-side, described in
+		E32TransBuf.h, and DTransferBuffer and DTransferWindow
+		kernel-side, described in K32Std.h.  Test program is built from
+		e32test\mmu\t_transbuf.cpp, though the test isn't fully
+		complete yet.  Also, the scheme doesn't yet cater for transfer
+		buffer access via transfer windows for "fixed" processes, though
+		it will shortly.
+		
+3)	Nicolas
+	1)	Introduced example metabuild script for MCGA (see
+		\cogent1\cogent1.mbc).
+
+4)	MarkCa
+	1)	Fixed CAN-4TXKZQ (Using a PC Card can wrongly produce password
+	  	notifier)
+	2)	Fixed CAN-4TWM6E (L7200 MMC Controller takes control of second UART)
+		Fix affects t_atadrv, so changed \l7200a\va_hw.cpp to use non-zero
+		machine uid.
+	3)	Fixed CAN-4TYFHS (Reading to the end of a MultiMediaCard can produce
+		an out-of-range error)
+	4)	Fixed EDNTDAS-4L4JZ8 (Thread leakage using emulators)
+	5)	Fixed TOD-4RXJSS (Race condition causing accessing of already delete
+		pointer when deleting DChannelComm)
+	6)	Fixed CAN-4UBJU2 (Controller does not process all error conditions)
+	7)	Changed l7200\pa_mmc.cpp to return KMMCErrNotSupported because pre 2.1
+		controller.
+	8)	Added __MLNK__ case to cpu defines in u32std.h.
+	9)	Fixed CAN-4UNE8D (MMC Controller access violation after emergency power
+		down)
+	10)	Removed KPBUS1 | KPBUS2 | KPBUSDRV tracing from mlnk\header.iby.
+	
+5)	AndrewJ
+	1)	Enabled LFFS on assabet.
+	2)	Edited vi_hw.cpp and vi_pbus.cpp to enable LFFS on K: with PC Card
+	  	disabled.
+	3)		put in fixes from 6.1 Numbers: 	SCE-4TVQ78	
+						TOD-4RWEHL
+
+6)	Dennis
+	1)	Fixed XScale RTC rounding problem
+	2)	Added check for imprecise aborts on XScale - fault the kernel if they
+	  	occur.
+	3)	iExtraData=FSR for both data and prefetch aborts.
+
+	*** Release note for XScale delivery ***
+
+	This release supports the Intel IQ80310 evaluation board based on the
+	XScale 80200 processor (Coyanosa). Code for this board can be built by
+	specifying platform MCOY on the build command line.
+
+	The following property definitions are used to specify the CPU type (in
+	\e32\include\u32std.h):
+
+	__CPU_XSCALE__
+		Means that the CPU is based on the XScale microarchitecture
+	__CPU_ARMV5TE
+		Means that the CPU supports the ARMv5TE instruction set
+	__CPU_ARM_ABORT_MODEL_RESTORED
+		Means that the base register is unaltered if a load/store with base
+		register writeback is aborted.
+	__CPU_SPLIT_CACHE
+		Means that the CPU uses separate instruction and data caches
+	__CPU_SPLIT_TLB
+		Means that the CPU uses separate instruction and data TLBs
+	__CPU_WRITE_BUFFER
+		Means that the CPU uses a write buffer
+	__CPU_WRITE_BACK_CACHE
+		Means that the CPU (data) cache supports write-back operation and that
+		the OS uses this mode for normal RAM allocations.
+	__CPU_CACHE_WRITE_ALLOCATE
+		Means that the CPU (data) cache supports line allocation on writes and
+		that the OS uses this mode for normal RAM allocations.
+	__CPU_CACHE_FLUSH_BY_LINE_ALLOC
+		Means that the (data) cache is cleaned/flushed by using an explicit
+		line allocate instruction.
+	__CPU_CACHE_POLICY_IN_PTE
+		Means that the (data) cache policy can be changed between writethrough
+		and writeback on a page-by-page basis using flags in the page table
+		entries.
+	__CPU_HAS_CACHE_TYPE_REGISTER
+		Means that the CPU possesses the cache type register as specified in
+		the ARM architecture reference manual (CP15 CRn=CRm=0, opc2=1)
+	__CPU_HAS_SINGLE_ENTRY_ITLB_FLUSH
+		Means that the CPU supports the 'Flush single ITLB entry by MVA'
+		instruction (MCR P15, 0, Rn, C8, C5, 1)
+	__CPU_HAS_SINGLE_ENTRY_ICACHE_FLUSH
+		Means that the CPU supports the 'Flush single ICache line by MVA'
+		instruction (MCR P15, 0, Rn, C7, C5, 1)
+	__CPU_HAS_BTB
+		Means that the CPU has a branch target buffer which needs to be
+		flushed explicitly in conjunction with partial ICache flushes.
+	__CPU_USE_MMU_TEX_FIELD
+		Means that the CPU supports the extended page table permissions (TEX)
+		field.
+	__CPU_EXC_VECTORS_MOVABLE
+		Means that the CPU allows the exception vectors to be relocated to
+		FFFF0000.
+
+	All E32 and F32 automatic tests pass on this release, with the exception
+	of:
+		T_PCCD1, T_PCCD2 - because the board does not support PCMCIA
+		T_DEBUGGER - because the debugger uses a bit pattern for breakpoints
+			which is defined in ARM Arch 5 (was undefined on ARM Arch 4). This
+			is being handled as a defect (defect number MAY-4V4E5V).
+
+	The branch target buffer is not enabled by this release. This is due to a
+	known problem when executing THUMB code with the BTB enabled.
+
+7)	Pete
+	1) 	First release of Hardware Accelerator (HWA) LDD and a crude emulation
+		of a HWA PDD on WINS.
+	2) 	Changes to MMC Controller to support SD Memory card initialisation.
+	3) 	Added TMMCCardArray class and various other minor changes to the MMC
+		Controller such (e.g. more comments).
+	4)	Improved the WINS MMC emulation. Two cards are now emulated rather
+		than one as before. Also, better account of the current card status is
+		taken when deciding how to respond to an MMC command.
+	5) 	Change to the WINS local drive mapping. Local drive 2 
+		is now the primary partition on the second emulated MMC card rather
+		than a secondry partition on the first emulated MMC card.
+	6)	Temporarily disabled PC Card Peripheral bus (EPBUS.DLL) on Cirrus Logic
+		board and replaced this with MMC Peripheral bus to facilitate development
+		of SD Memory card development. (PC Card support will be restored once
+		the multiple peripheral bus Controllers are supported).
+	
+8)	William
+	1)	Added exported destructor to CAsyncCallBack, to solve a problem with
+		the CodeWarrior compiler.
+
+Version 1.02.352
+================
+(Made by Morgan, 08/03/2001)
+
+0)	Requires E32TOOLS(173), E32TOOLP(226), F32(260)
+	from \\epoc\development\base\ongoing\...
+
+1)	Morgan
+	1)	Split functions in UP_DLL.CPP into separate source files.  This
+		allows the linker to discard unused functions.
+		Functions are grouped by functional area. up_dll_file.cpp,
+		up_dll_global.cpp, up_dll_static, up_dll_tls.cpp.
+	2)	Split EDLL.LIB into EDLL.LIB containing the entrypoint and
+		EDLLSTUB.LIB containing the class Dll stub functions.
+	3)	Removed strange .idata$3 padding from UP_DLL.CPP since (we think) it
+		is a hack for a defunct version of GCC
+	4)	Moved thumb gcc helper functions into up_gcc.cpp in EGCC.LIB
+	5)	Removed thumb gcc helper functions from uc_exe.cpp.  These are now in
+		EGCC.LIB that should be included in the link of a GCC EXE or GCC DLL.
+	6)	Moved float gcc helper functions into up_gcc_float.cpp in EGCC.LIB
+	7)	Removed null definition of atexit() from up_dll.cpp
+	8)	Deleted \e32\euser\epoc\arm\uc_dll.cpp since it is not used anywhere
+	9)	Integrated MAWD DDebugger bug fix (again)
+	10)	Added default cpu definition for __MTEMPLATE__ in U32STD.H to make it
+		compile
+
+2)	Carlos
+	1)	Disabled the Pc Card on Assabet as it is not fully working and causes
+		problems when using the CF loader to download an image.
+
+3)	Dennis
+	1)	Added basic port to Intel XScale 80200 CPU on IQ80310 board.
+	2)	Fixed defect HAS-4U7N92 (T_WWINS hangs on Brutus). This is due to the
+		smaller screen size compared with the Series 5.
+		Modified notifier stuff to take account of the screen size.
+
+4)	RobertJ
+	1) 	Added notification of clear stall to USB Client
+	2) 	Fixed dma handling code for USB Client.
+
+5)	Alastair
+	1)	Added initial transfer buffer functionality.  Chief classes are
+		RTransferBuffer and RTransferWindow user-side, described in
+		E32TransBuf.h, and DTransferBuffer and DTransferWindow
+		kernel-side, described in K32Std.h.  Test program is built from
+		e32test\mmu\t_transbuf.cpp, though the test isn't fully
+		complete yet.  Also, the scheme doesn't yet cater for transfer
+		buffer access via transfer windows for "fixed" processes, though
+		it will shortly.
+		
+6)	Nicolas
+	1)	Introduced example metabuild script for MCGA (see
+		\cogent1\cogent1.mbc).
+
+7)	MarkCa
+	1)	Fixed CAN-4TXKZQ (Using a PC Card can wrongly produce password notifier)
+	2)	Fixed CAN-4TWM6E (L7200 MMC Controller takes control of second UART)
+		Fix affects t_atadrv, so changed \l7200a\va_hw.cpp to use non-zero
+		machine uid.
+	3)	Fixed CAN-4TYFHS (Reading to the end of a MultiMediaCard can produce an
+		out-of-range error)
+	4)	Fixed EDNTDAS-4L4JZ8 (Thread leakage using emulators)
+	5)	Fixed TOD-4RXJSS (Race condition causing accessing of already delete
+		pointer when deleting DChannelComm)
+	6)	Fixed CAN-4UBJU2 (Controller does not process all error conditions)
+	7)	Changed l7200\pa_mmc.cpp to return KMMCErrNotSupported because pre 2.1
+		controller.
+	8)	Added __MLNK__ case to cpu defines in u32std.h.
+	9)	Fixed CAN-4UNE8D (MMC Controller access vilation after emergency power
+		down)
+	10)	Removed KPBUS1 | KPBUS2 | KPBUSDRV tracing from mlnk\header.iby.
+
+Version 1.02.351
+================
+(Made by Carlos, 20/02/2001)
+
+1)	Carlos
+	1)	Added Assabet Variant (\Assabetb). This is an interim release 
+		(see Release_Notes.txt)
+	2)	Debug Monitor on SA1100 ASSP: now gets the serial port number to 
+		be used as debug port from the variant TInt Variant::DebugInit().
+	3)	Interrupt Controller on SA1100 ASSP: expanded the Interrupt controller
+		to work with Conceptual Interrupts (IRQ11-27) and external interrupts.
+		Also disabled the watchdog to free-up the OST Timer3 as an auxillary
+		timed interrupt source for LFFS.
+	4)	Several changes to Brutus' Variant according to what's decribed above.
+	5)	FIR Driver: Assabet allows setting the IR range. Therefore a new
+		Synchronous Request was introduced to deal with this.
+	6)	ecomm driver - as above, passes the setting for the range on
+		iSIRSettings member of the Config structure.
+	7)	Implemented EARLY DEBUG on SA1100 ASSP.
+	8)	A few changes on the SA1100 ASSP implementation of PC Card Controller.
+	9)	SA1100 Text shell: changed Background/foreground colours to improve
+		visibility on Assabet.
+	10)	Text Shell (generic): now traps EKeyIncBrightness and
+	   	EKeyDecBrightness.
+	11)	HAL: added Machine ID for Assabet on hal_data.h.
+	12)	HAL: changed hal.iby file to include an HAL##VARIANT##.DLL to get
+	   	round the problem of having two Variants coming off the same ASSP but
+	   	not sharing the same HAL. Changed the hal.mmp on \assabetb, \brutus,
+		\cirrus721, \cogent1, \l7200, \series5mx1 and \vtemplate.
+		NOTE: Had to change \romkit\base.iby to allow overnight builds to
+		build correctly.
+	13)	MISA EKERN def file (e32\bmisa\ekernu.def) - includes a new export
+		Plat::BindExtInterrupt(..) to allow binding to external interrupts
+		on Assabet.
+	14)	Some changes on MISA .IBY files. LFFS is excluded for the time being,
+		even on Brutus. It will be put back when Assabet's LFFS is ready. The
+		bootstrap is now passed with the Variant extension to its name. Now
+		includes a Hal LDD in kernel.iby.
+	15)	MISA Variants allowed (\e32\rombuild\rom.cfg): now allows 3 variants, 
+		Brutus (BA), Assabet-only (A0) and Assabet+Companion Card (AB).
+
+2)	MarkCa
+	1)	UART media change must now be explicitly compiled in for linkup
+		MMC port.
+	2)	t_atadrv will now not run media change tests on linkup.  Machine
+		UID modified in va_hw.cpp to avoid clash with Cogent.
+
+3)	William
+	1)	Introduce __CW32__ defines for CodeWarrior, and adjust various
+		compiler-related definitions accordingly.
+	2)	Workaround bugs in the CW inline assembler
+	3)	Remove spurious WINBASEAPI decorations in euniw.h, which upset
+	  	CodeWarrior.
+
+4)	RobertJ
+	1)	Fixed problem with FIR reads in D_FIR.CPP, the LDD. When read
+		completes to LDD from the PDD it was possible for another read to
+		complete the same user request.
+	2)	Added first release of USB client for SA-1100. Components are
+		EUSBC.LDD, which is a generic LDD, and EUSBCC.DLL. \EUSBCC is the USB
+		Client Controller and loads as a KERNEL extension.
+
+Version 1.02.350
+================
+(Made by Dennis, 05/02/2001)
+
+1)	William
+	1)	Adjust the x86 inline assember in euser\emul\win32 so that it is
+		acceptable to the CodeWarrior compiler: change the 8000h style
+		constants to 0x8000, and change "_asm SomeLabel:" into "SomeLabel:".
+
+2)	Dennis
+	1)	Added APIs to support execution of data as code, for use by just in
+		time compilers for Java and also for the ARM JBit extension. New APIs
+		are:
+
+		TInt RChunk::CreateLocalCode(TInt aSize, TInt aMaxSize, TOwnerType);
+
+		This creates a data chunk with a globally unique virtual address which
+		is allocated from the top of virtual address space (as for EXE and DLL
+		code chunks). The chunk is accessible only by the current process
+		(unlike DLL code chunks) and is marked by the kernel as containing
+		code. This means that on a split-TLB machine the ITLB will be flushed
+		when a reschedule occurs to or from a process with a chunk of this
+		type mapped into it and also when pages are decommitted from such a
+		chunk. The globally unique virtual address means that the ICache need
+		not be flushed on a reschedule.
+
+		RHeap* UserHeap::ChunkHeap(RChunk& aChunk, TInt aMinLength, TInt aGrowBy=KMinHeapGrowBy);
+
+		This creates a heap in an already existing chunk. It is intended to
+		allow a heap to be created in a local code chunk; this heap can then
+		be used to hold code fragments from a JIT compiler.
+
+		void User::IMB_Range(TAny* aStart, TAny* aEnd);
+
+		This performs whatever cache cleaning/flushing operations are
+		necessary in order to guarantee correct execution of code in the
+		specified address range (from aStart inclusive to aEnd exclusive),
+		under the assumption that this code has been loaded/modified by user
+		code. Typically this will involve cleaning the data cache for the area
+		concerned, draining the write buffer and flushing the instruction
+		cache and branch target buffer for the area concerned.
+
+	2)	Added a new chunk type EUserSelfModCode to TChunkType to represent the
+		new chunks. Added a new attribute DPlatChunk::ECode to the DPlatChunk
+		iAttributes field to signify any chunk containing code.
+
+	3)	Added code to notify the ARM ETM of reschedules if the PROCID register
+		exists (conditioned on __CPU_HAS_ETM_PROCID_REG).
+
+	4)	Added support for kernel trace via the JTAG port on ARM720 and ARM920.
+		The KHARDWAREASSIST bit in the debug mask controls whether tracing is
+		directed to the JTAG port or to a UART.
+
+	5)	Modified perl script halcfg.pl so that the output file is not opened
+		until the inputs have been parsed - this prevents strange error
+		messages due to a zero length file being generated.
+
+
+Version 1.02.310
+================
+(Made by Morgan, 09/04/2001)
+
+1)	Jonathan
+	1)	Move notes for releases prior to creation of 6.1 release branch to
+	  	releases_old.txt.
+
+2)	Pete
+	1)	Fixed SCE-4V7S6C "MMC Controller card init. function is in-efficient and
+		unnecessarily complex". This entailed:-
+
+		- Add new TMmcCardArray class to replace the DMMCStack::iCxNewAcqArray[]
+		and DMMCStack::iCards[] arrays and their associated functionality.
+		- Removal of ASSP layer function DMMCStack::PhysicalCardSlots() function as
+		this was duplicating information already returned in the ASSP layer function
+		DMMCController::SetMachineInfo() function.
+		- Addition of generic layer DMMCStack::Init() function to determine the max.
+		number of cards for the platform once - at Controller init. time rather than
+		every time a card stack is initialized.
+		- Modification to DMMCStack::PowerDownStack() function to add an extra
+		argument to this function (TBool aMediaChange) indicating whether the power
+		down is required due to media change or not.
+		- Removal of the 'update stack' implementation in the generic layer of the
+		Controller. This was intended to re-scan for new cards after a media change.
+		This is now redundant since all cards are always powered down on media
+		change.
+		- Various comments added throughout PS_MMC.CPP to aid clarity.
+	2)	Fixed FID-4UZLFG "Increase number of supported local drives"
+
+
+Version 1.02.309
+================
+(Made by Will Ramsay, 03/04/2001)
+
+1)	Requires  E32TOOLP(226), F32(237)
+	from \\epoc\development\base\ongoing\...
+
+2)	Backported Morgan's 6.2 changes to remove import stubs:
+	1)	Split functions in UP_DLL.CPP into separate source files.  This
+		allows the linker to discard unused functions.
+		Functions are grouped by functional area. up_dll_file.cpp,
+		up_dll_global.cpp, up_dll_static, up_dll_tls.cpp.
+	2)	Split EDLL.LIB into EDLL.LIB containing the entrypoint and
+		EDLLSTUB.LIB containing the class Dll stub functions.
+	3)	Removed strange .idata$3 padding from UP_DLL.CPP since (we think) it
+		is a hack for a defunct version of GCC
+	4)	Moved thumb gcc helper functions into up_gcc.cpp in EGCC.LIB
+	5)	Removed thumb gcc helper functions from uc_exe.cpp.  These are now in
+		EGCC.LIB that should be included in the link of a GCC EXE or GCC DLL.
+	6)	Moved float gcc helper functions into up_gcc_float.cpp in EGCC.LIB
+	7)	Removed null definition of atexit() from up_dll.cpp
+	
+
+Version 1.02.308
+================
+(Made by MarkCa, 20/03/2001)
+
+1)	Morgan/AndrewF
+	1)	Fixed FOD-4TAH7A "DMA double buffering will not work on Halla".
+		This is an interface change and it is not source compatable.
+		Added extra buffer fill during transfer initialisation for double
+		buffered HW.  Added explicitly named enums and new imp functions
+		in ASSP to make writing ImpDMA easier.
+	2)	Changed all ASSPs, and added implementation details to template
+		port.
+		Detail of changes required to \e32\ekern\epoc\arm\<assp>\KA_DMA.CPP:
+		a) Remove ImpDma::NextBlock()
+		b) Add the following functions:
+
+		/**
+		 * No more DMA blocks for this transfer
+		 *
+		 * TO DO: (mandatory)
+		 *
+		 * Modify to suit your hardware. The code below is just an example
+		 *
+		 * If your DMA hardware has multiple buffers this function should be
+		 * used to disable the empty buffer
+		 */
+		void ImpDma::FinalBlock(TInt aChannel);
+		
+		/**
+		 * Get the reason for the DMA interrupt.
+		 * Called from TDmaInterrupt::Service()
+		 *
+		 * TO DO: (mandatory)
+		 *
+		 * Modify to suit your hardware. The code below is just an example
+		 *
+		 * EBufferEmpty indicates that one buffer is empty
+		 * EStall indicates the entire transfer is complete, ie both buffers
+		 * empty, FinalBlock() has been called.
+		 * EError indicates a transfer error
+		 * (ELastBuffer indicates that one buffer is empty and FinalBlock()
+		 * has been called. On most hardware it is sufficient to return
+		 * EBufferEmpty in this case)
+		 *
+		 */
+		Dma::TDmaState ImpDma::GetState(TInt aChannel);
+
+		//
+		// Return ESingleBuffer or EDoubleBuffer
+		//
+		Dma::TDmaBufferMode ImpDma::BufferMode();
+
+
+2)	Nicolas
+	1)	Fixed STE-4UEQC2 "The case off event and possibly some other events
+		do not get through WSERV correctly".  EPOC doesn't any more send
+		two ESwitchOn notifications instead of one when starting up.  The
+		emulator now sends only one ESwitchOn notification when being
+		switched back on after an emergency power off.  The emulator sends
+		ECaseOpen or ECaseClose notifications when F11 is pressed while not
+		in standby mode.  And finally the emulator doesn't any more switch
+		off automatically when the case is closed (this is up to the
+		user-side event consumer).
+	2)	Fixed STE-4UJPEC "Some of the HAL attributes are not supported".
+		The following attributes are now supported on WINS: EPenDisplayOn,
+		ECaseSwitch, ECaseSwitchDisplayOn, ECaseSwitchDisplayOff.
+	3)	T_NEWHAL TestGetAll() output modified to make it readable on a
+		small screen (key press expected when screen is full).
+3)	MarkCa
+	1)	Fixed CAN-4UNE8D (MMC Controller access vilation after emergency power
+		down)
+	2)	Removed KPBUS1 | KPBUS2 | KPBUSDRV tracing from mlnk\header.iby.
+
+
+Version 1.02.307
+================
+(Made by Nicolas, 27/02/2001)
+
+1)	Jonathan
+	Manual e32test cleanup:
+	1)	Moved T_COLOUR from a manual to a support test since no-one bothers
+		implementing text video modes other than mono. Made those screen
+		drivers that didn't already return KErrNone from SetMode(EMono).
+	2)	Moved T_PS and T_WWINS from manual to support tests since they're not
+	  	useful.
+	3)	Nuked T_PTNOS test and D_PTNOS test driver.
+	4)	Nuked T_REGRAM registry test (which was lurking unused since v6.0).
+	5)	Made T_INF prompt for confirmation that displayed values are OK, so
+		if not OK an error appears in the test log.
+	6)	Fixed FID-4TXFVX "Wrong defaults for MainBatteryGood()".
+	7)	Fixed FID-4TYF78 "FIQ link with battery state is broken".
+	8)	Fixed BAR-4SMG99 "Efficiently implement the "MergeModifiers" function
+	  	in e32\include\K32KEYS.INL".
+	9)	Fixed FID-4RRMTH "bootstrap: Bug searching for sleep info block".
+
+2)	MarkCa
+	1)	Fixed CAN-4TXKZQ (Using a PC Card can wrongly produce password
+	  	notifier)
+	2)	Fixed CAN-4TWM6E (L7200 MMC Controller takes control of second UART)
+		Fix affects t_atadrv, so changed \l7200a\va_hw.cpp to use non-zero
+		machine uid.
+	3)	Fixed CAN-4TYFHS (Reading to the end of a MultiMediaCard can produce
+	  	an out-of-range error)
+	4)	Fixed EDNTDAS-4L4JZ8 (Thread leakage using emulators)
+	5)	Fixed TOD-4RXJSS (Race condition causing accessing of already delete
+		pointer when deleting DChannelComm)
+	6)	Fixed CAN-4UBJU2 (Controller does not process all error conditions)
+
+3)	Dennis
+	1)	Fixed defect HAS-4U7N92 (T_WWINS hangs on Brutus). This is due to the
+		smaller screen size compared with the Series 5.
+		Modified notifier stuff to take account of the screen size.
+	2)	Fixed defect HAD-4T2EJ5 (P::TimerLockSpecToTicks returns incorrect
+	  	value).
+	3)	Fixed defect MAT-4TYKLE (Profiler doesn't work on Quartz/Brutus).
+
+
+Version 1.02.306
+================
+(Made by Markdo, 07/02/2001)
+
+1)	Tim Band
+	1)	Fixed BAD-4SVJY8 "Unavoidable initialisation cost for TRect, TPoint
+		and TSize"
+
+2)	Alastair
+	1)	Fixed EDNTBAD-4Q8M2F "CBufSeg can leak memory"
+	2)	Fixed EDNATHE-4QQJSU
+		"Inconsistent error handling in use of S::MakeHandleAndOpen",
+		though there's still some work to be done in this area.
+	3)	Fixed FID-4RKDJT
+		"Use Cogent key translation tables on template port"
+	4)	Fixed HAD-4RLFVN
+		"Template header.iby has exyin.dll as file instead of extension"
+	5)	Fixed HAD-4RLFSY
+		"Template header.iby missing kerneltrace entry"
+	6)	Fixed FID-4SNDAD
+		"TemplatePort: Tick counter not invalidated when time changed"
+
+3)	Morgan
+	1)	Integrated fix for DPassiveDebugger allocation bug for
+		WINDERMERE
+
+4)	Jonathan
+	1)	Created new \e32\ekern\emul\win32\d_entry.cpp as a copy of
+		\e32\euser\emul\win32\up_dll.cpp. This allows edev.lib to be built
+		for WINS in an IPR Category E only build. To preserve layering WINS
+		device driver initialisation no longer wires the kernel.
+	2)	Documented the deprecated nature of UserHAL enums in e32hal.h.
+		Added minimal documentation to \hal\inc\hal.h and hal_data.h.
+
+5)	MarkCa
+	1)	Update linked build by removing warnings from linkup ekern and
+		implemented polling after MMC data transfers.
+
+Version 1.02.304
+================
+(Made by Pete, 19/01/2001)
+
+1) Morgan
+	1)	Fixed EDNSCHM-4M7PAJ. Added RMessagePtr::IsNull()
+	2)	Fixed EDNJPAR-4KLLCA "Brutus bootstrap contains large delay..."
+	3)	Fixed EDNRFID-4NVFWF "Bootstrap test-code has Brutus-specific code"
+	4)	Fixed EDNRFID-4MVEQV "Bootstrap: bug in RAM width checking"
+	5)	Fixed EDNRFID-4MVKBL "Bootstrap attempts to write to ROM"
+	6)	Fixed EDNRFID-4NXETX "Bootstrap: bugs mapping IO as sections"
+	7)	Fixed EDNWROS-4LQEPN "bootstrap component -WHAT output incorrect"
+	8)	Fixed EDNRFID-4LGBVH "Bootstrap should keep PE file"
+	9)	Fixed EDNRFID-4PXFYK "Add buffered, not cached flag to bootstrap"
+	10)	Fixed EDNRFID-4PTHXH "Flush D TLBs & Cache in bootstrap after enabling
+	   	MMU"
+	11) Fixed EDNRFID-4MVJZQ "Bootstrap bugs finding initial scratch RAM"
+		Tested on COGENT, BRUTUS, [UDEB,UREL]
+	12)	Fixed HEY-4STFK7 "Template port: Definition of interrupt names
+	   	should..."
+	13)	Fixed TOD-4RJJ75 "Corruption of K::TickQ". This fix creates a change
+	   	in the behaviour of the emulator - comms power handler active requests
+	   	keep the power requirement up. In practice this means that the
+	   	emulator will never power off. A proper fix will have to wait for v7.
+
+2)  Pete
+	1) 	Fixed a problem introduced in release 303 with the
+		Cirrus bootstrap which was mapping in 16K rather than 12K for the h/w
+		registers.
+	2)	Changes to the MMC Controller - to the way that the
+		ASSP layer reports the operating PSU voltage. Removed TOCR class.
+
+3)	Dennis
+	1)	Modified low-memory notification system. There are now two TChanges
+		flags: EChangesFreeMemory and EChangesOutOfMemory. The first is raised
+		if the free memory level crosses the relevant threshold, and the
+		second is raised if an allocation fails due to insufficient free
+		memory.
+
+4)	Jonathan
+	1)	Brutus HAL: Fixed defect EDNABOT-4MCGNL "HALData::EKeyboardClickVolume
+	  	doesn't accept valid value". Key click and digitiser click are not
+	  	supported on Brutus for 6.1. Changed the values reported by HAL to
+	  	reflect this. Cogent was similarly incorrect.
+	2)	Added memory traces for kernel stack and data.
+	3)	Brutus keyboard: Fixed defect JAN-4RLLH3 "Brutus board doesn't map
+	  	EKeyDevice key codes". Made Fn modifier generate EKeyDevice0-9. Fixed
+	  	some Fn and Shift translation errors.
+
+5)	Markdo	
+	1)	Implemented Pc Card Controller for Cogent. Controller is disabled (by
+		setting total supported drives to 1) until timer problem sorted out.
+	2)	Fixed problem in Brutus Pc Card Controller where reset signal not
+		asserted for long enough when powering up. Reduced length of time spent
+		in Sa1100::BootWaitMilliSeconds when called in \brutus1\vi_pbus.cpp.
+	3)	Ensured that uart1 in linkup initialised in release builds.
+	4)	Implemented dma on linkup.
+		
+6)	MarkCa
+	1)	Merged in MMC security code.  _LOCKABLE_MEDIA in e32svr.h is not
+		commented out any more.
+	2)	Updates to linkup example mmc port.
+
+
+Version 1.02.303
+================
+(Made by RobertJ, 13/12/2000)
+
+1)	Nicolas
+	1)	ECOMMDCE: Cancel power handler timer and reset power requirements in
+		DChannelComm dtor (pasted from ECOMM).  This avoid a kernel panics
+		in DPowerHandler::RemovePowerModel() when a DCE comm port is
+		closed.
+	2)	Added DISTRIBUTION.POLICY file (cat. E) to \e32\rombuild\mlnk and
+		removed superfluous ones from E32 and BOOTSTRAP.
+	3)	Modified rom.bat to avoid spurious error msg when some files
+		included in the ROM image contain "warning" or "error".
+
+2)	Dennis
+	1)	Removed all MCORE code.
+	2)	Minor consolidation of MMU-related #ifdefs in order to support ARM920.
+		__CPU_SOFTWARE_CACHE_FLUSH, __CPU_CACHE_CONFIGURABLE have gone.
+		__CPU_ARMV3 is no longer supported.
+
+		Remaining #ifdefs with meanings are:
+
+		__CPU_CACHE_POLICY_IN_PTE
+			This means that you can select write through or write-back caching
+			on a page-by-page basis.
+		__CPU_WRITE_BACK_CACHE
+			This means that write-back caching is being used. This may be
+			either because the cache only supports write-back mode (eg SA1100)
+			or the cache supports both modes and write-back mode is being used
+			(eg ARM920). If this is not defined and the cache can support both
+			modes, write-through caching will be used.
+		__CPU_CACHE_FLUSH_BY_DATA_READ
+			This option is only applicable if write-back caching is in use.
+			It means that the cache must be flushed by reading spurious data
+			(i.e. SA1100 mode). Currently the data used for flushing is always
+			mapped at 0x430fe000 and a cache size of 8K is assumed.  If this
+			option is not selected and write-back caching is in use, the
+			ARM920 method is used (ie flush each line by way/set index) and
+			the CP15 cache config register is read to determine the size and
+			layout of the cache.
+		__CPU_SPLIT_CACHE
+			This means that the processor has separate instruction and data
+			caches.
+		__CPU_SPLIT_TLB
+			This means that the processor has separate instruction and data
+			TLBs.
+
+	3)	Added low memory notification. This uses two thresholds (low and
+		good).  If a low-level chunk adjust or allocation of page tables fails
+		due to out-of-memory or causes the amount of free memory to drop below
+		the low threshold, all change notifiers are signalled. If a low-level
+		chunk adjust or freeing of page tables causes the amount of free
+		memory to rise above the good threshold change notifiers are also
+		signalled. A new change notifier flag (EChangesFreeMemory) has been
+		added to signify the occurrence of one of these conditions. A new
+		function
+
+			TInt UserSvr::SetMemoryThresholds(TInt low, TInt good)
+
+		has been added to set the thresholds at which notification occurs.
+
+		Test program T_CHUNK has been extended to test this system.
+
+	4)	Fixed defect EDNATHE-4LCEWZ (Sessions using global message pool can
+		lose available slots).
+	5)	Fixed defect PAR-4R6DGK (WS_MAIN.CPP should have an extra line of debug
+		to warn you that you have booted in test mode).
+	6)	Fixed defect EDNJPAR-4L2LMM (WS_MAIN.CPP has a leave without a trap).
+	7)	Fixed defect EDNJPAR-4N9GU2 (TEiger:: missing from added 7211 functions
+		in ka_eiger.cpp)
+	8)	Fixed defect HAS-4R5NPC (JTAG trace example in template variant).
+
+3)	Alastair
+	1)	Fixed EDNJHAS-4QLRPC "All 3rd UIDs wrong" (in the template port).
+		Uids are now the UNICODE rather than narrow values.
+	2)	Split this file up on the assumption that its large size is the
+		reason P4 sometimes has difficulty accepting changes to it.
+		Old release notes are now in release_old.txt.
+	3)	Fixed EDNJHAS-4QNRUB "Template variant include file in E32" by moving
+	   	it into the vtemplate directory and exporting it from there.
+	4)	Fixed EDNJHAS-4QNR4M "Template ASSP is in the wrong place"
+	5)	Changed include paths in VTemplate .mmp files so that they no longer
+	  	refer to \e32\include.
+	6)	Added DISTRIBUTION.POLICY files (cat. E) to the \VTemplate
+	  	directories.
+	7)	Fixed  EDNABRY-4L8NR2 "Text console appears stripy on Windows 95"
+	8)	Fixed problem with emulator parent window appearing jazzed if no
+		bitmap is specified on Windows9x platforms.
+	9)	Fixed EDNJBRN-4MEP5F
+		"Threads that use a shared heap don't get their stack 0x29 filled".
+	10)	Fixed EDNATHE-4QQKZM
+		"RThread().Suspend() deadlocks the emulator".
+		Under WINS/WINC, if a thread is about to suspends itself then it
+		relinquishes the kernel critical first.
+	11)	Fixed EDNTEEA-4L4BHV
+		"WINS emulator does not remember its previous position".
+		Emulator only remembers its position if it's shutdown with Alt+F4 or
+		via the Windows menus, not with typing "exit" in eshell or exiting
+		from a test.  It is clever about not "reappearing" off-screen.
+	12)	Extended Dennis' low memory notification changes to work under WINS.
+	13)	Fixed defect FID-4RDJTJ
+		"Template port keyboard driver generates streams of keyup"
+	14)	Fixed defect FID-4RHKC9
+		"Template Idle function should not be naked"
+  	15)	Fixed defect EDNNGRE-4LGJU7
+  		 "UserHal::SwitchOff() hangs emulator if mouse is pressed".
+  		Problem: Emulator would power off but not minimise since mouse button
+  		was down, and power on requires impossible window restoration.
+  		Solution: No longer minimise and maximise Emulator window to emulate 
+  		Power Off and Power On.  Instead, blank screen for Power Off.  Power
+  		back on when EStdKeyOff (F9 by default) is pressed.  Power on also if
+  		screen is tapped, or case is opened (toggle F11 by default), depending
+  		upon EPointerSwitchesOn and ECaseOpenSwitchesOn
+		HAL/machine_configuration settings: these values now default to TRUE
+		for WINS.
+
+4)	MarkCa
+	1)	Fixed defect EDNJHET-4PTLUD (Emulator crashes on startup if com
+		ports used by another program under win98.)
+
+5)	Pete
+	1)  Modified the FIR LDD so it conforms with latest power handling scheme
+		(i.e. it requests it's power requirement on all tx requests while at
+		the same time setting a timer to releases these requirements if it is
+		allowed to expire). This in turn required an extra function to be
+		added to each FIR PDD - PowerRequirement() which returns the FIR power
+		requirements for that particular platform.
+	2)	Fixed warnings when building WINS version of MMC Controller.
+	3)	Modified TBusLocalDrive class and the associated local media
+		sub-system so that an info. descriptor can be passed down to the media
+		driver which is available to the driver at the point at which it is
+		opened.
+	4)	Fixed warnings when building WINS version of MMC Media Driver.
+	5)	Applied various bug fixes supplied by Pete Sanders for Cirrus Logic
+	  	build:-
+		 - Increased BDB IO block size from 8K to 16K in bootstrap.
+		 - Moved addition of power handler from Variant::Init3() to
+		   Variant::Init4().
+		 - Set mem. config registers for both banks of 8Mb flash in
+		   Variant::Init1().
+		 - Fixed problem with digitizer resistive plate enable signals.
+
+6)	Morgan
+	1)	Fixed EDNGTIN-4KUH3E "Dll::FileName inconsistent in ARMI",
+		Mini-loader now forms the filename correctly.
+	2)	Fixed memory allocation bug in DPassiveDebugger
+	2.1)	Fixed empty members of DProcess for bootstrapped processes,
+		(kernel and file server) for the benefit of the debugger
+	3)	Enabled DPassiveDebugger on Cogent UDEB builds
+	4)	EDNMHEY-4N3FV8 "TDma::iChannel should be set back to ENotBound ..."
+	5)	PAR-4R5EGK "Definition of interrupt name should be in ASSP header ..."
+		Moved interrupt name definitions from ka_pic.cpp to a32*.h
+		MCGA, MISA, MAWD, MLNK, MEIG
+	6)	Updated Cogent1, Brutusa, Series5mx1, l7200a, cirrus7211x, variants to
+		use symbolic interrupt names
+	7)	Updated \e32\rombuild\rom.cfg to match stricter options in ROMBUILD
+
+7)	Jonathan
+	1)	Changed meaning of KMEMTRACE kernel trace option. Now only traces
+	  	changes in chunk committed size and does not trace RHeap allocation.
+
+8)	Markdo
+	1)	Changed WINS simulated mmc drive to 1MB size (from 2MB).
+
+9)	William
+	1)	Added iRomRootDirectoryList to TSuperPage in K32STD.H
+	2)	Added TExtensionRomHeader in E32ROM.H
+	3)	Modified epoc\kp_ini.cpp to get the iRomRootDirectoryList from the
+	  	superpage
+	4)	Changed bootstrap to pass the iRomRootDirectoryList address vai the
+		superpage, and added code to support extension ROMs. If a valid
+		extension ROM is found, the Root Directory List comes from the
+		extension rather than the main ROM.
+
+
+Version 1.02.302
+================
+(Made by Nicolas, 19/10/2000)
+
+1)	Alastair	
+	1)	Applied fix which will be made on the release branch to EDNJBON-4PBJFD
+		"Crystal emulator won't run under Windows 98"
+	2)	Replaced calls to Win32 "W" suffixed functions, which won't work on 
+	      	Windows9x platforms, with new versions supplied in EUNIW.DLL.
+	3)	Merged in Template Port from //epoc/release/bpk/....  This builds as
+		platform MTemplate and the variant is described by the \VTemplate
+		directory.  Function comments have been changed to JavaDoc format.
+		Changes have also been made in accordance with Jonathan's changes to
+		E32 version 301, detailed below ...
+		\e32\include\v32arm.h --> \e32\ekern\epoc\katemplate\v32template.h
+		\e32\include\v32templateassp.h --> \e32\ekern\epoc\katemplate\a32templateassp.h
+		\e32\include\v32templatev1.h --> \e32\ekern\epoc\katemplate\v32template1.h
+		
+2)	Nicolas
+	1)	Fixed defect EDNNTHY-4PMKJW "RDebug Breakpoints Are Sometimes
+		Ignored Under Brutus".  The B bit is now set in
+		KRomSectionPermissions and KRomPtePermissions.  As a side-effect,
+		on CPUs with write-through caches the write buffer is now used for
+		shadowed pages.  On SA-1100, setting B ensures the main data cache
+		is used instead of the mini one, and so fixes the defect.
+
+3)	Pete
+	1)	Added WINS platform layer for MMC Controller.
+	2)	Changed the WINS EPBUS.DLL from being a PC Card Controller
+		to being an MMC Controller (i.e emulation of the PC
+		Card Controller has now been disabled in WINS and replaced
+		with an MMC Controller emulator). Similarly, the Media Driver
+		for WINS drive X: is now a MMC Media driver rather than a CF card
+		Media Driver. 
+	3) 	Fixed defect EDNMCAN-4P5C37 "File Mgr:Memory card menu is
+		not dynamic'. Fixed by powering down any MMC cards while
+		the media door is open and not allowing any operations on
+		the cards during this time.
+	4)	Implemented inactivity timer on MMC Controller. While the
+		MMC bus is powered up, if a given period elapses (set at the
+		ASSP/Variant layer) where no MMC bus activity has taken place,
+		then the MMC clock is turned off and power removed from the
+		bus.
+
+4)	Dennis
+	1)	Fixed defect EDNDFER-4N2K8R (Wrong error code returned by fix to
+		another bug). DThread::Read/Write now return KErrDied if the target
+		thread has exited.
+
+5)	Jonathan
+	1)	Removed old distrib IPR files and script.
+
+
+Version 1.02.301
+================
+(Made by MarkCa, 29/09/2000)
+
+0)	Must add the following line (BEFORE LINE 44) to
+	\\epoc\main\romkit\include\base.iby when releasing to mainline:
+		extension[VARID]=ASSP_DIR\BUILD_DIR\epower.dll     System\Libs\EPower.dll
+
+1)	Pete
+	1) 	Merged in changes to MMC Controller from Cambridge base porting
+		branch.
+	2)	Improved scheme in MMC Controller on how information on
+		number of MMC sockets and media drives is returned.
+		This is now set in the variant layer as you would expect.
+	3)	Removed workaround for broken MCR instruction on ARM915T from
+		\E32\EKERN\EPOC\ARM\KC_MMU.CPP.
+	4)	Changes to Cogent DTE serial port drivers. Also to
+		Cogent IREQ1 interrupt control code. These changes,
+		together your Cogent board re-configured with config 'p120_05_v12'
+		and also a PCB cut/strap modification to each DTE serial port to
+		reverse the TX and RX signals will allow the Cogent DTE serial ports
+		to work fully.
+		Cogent EUART3.PDD which had been temporarily modified
+		to drive 'SERIAL 1' rather than 'SERIAL 2' (PCB designations) has now
+		been changed to drive 'SERIAL 2'.
+
+2)	MarkCa
+	2)	Added linkup port from BPC.  Build with assp MLNK, variant LA.
+
+3)	Nicolas
+	1)	Fixed defect EDNNTHY-4P3GT6 (RDebug::SingleStep() does not stop
+		after one instruction sometimes).  Fix applied to arm generic and
+		windermere.
+
+4)	Jonathan
+	1)	Include file re-org for IPR reasons - ASSP-specific include files live
+	  	in the ASSP directory under ekern:
+		- Include files describing ASSPs (TEiger etc) are named a32*.h:
+			v32eiger.h -> ekern\epoc\arm\721x\a32eiger.h
+			v32s1100.h -> ekern\epoc\arm\sa1100\a32sa1100.h
+			v32wind.h  -> ekern\epoc\arm\windermere\a32windermere.h
+			v32cog.h   -> ekern\epoc\generic\cogent\a32cogent.h
+		- Custom interface files are named v32*.h:
+			v32arm.h   -> ekern\epoc\arm\721x\v32eiger.h
+			v32arm.h   -> ekern\epoc\arm\sa1100\v32sa1100.h
+			v32awd.h   -> ekern\epoc\arm\windermere\v32windermere.h
+			v32arm.h   -> ekern\epoc\generic\cogent\a32cogent.h
+			v32mcore.h -> ekern\epoc\generic\cogent\a32cogent.h
+		- All variant-specific include files moved to the variants.
+		- kc_std.h -> kc_arm.h.
+	2)	New exported file for the text notifier interface
+	  	\e32\include\twintnotifier.h split out from ws_std.h, which is no
+	  	longer exported.
+
+5)	Morgan
+	1)	Integrated fix from 6.0 branch: Fixed EDNTRIN-4BPCTM2 "Detection of
+		pointer events stops - multiple platforms" for MAWD. Keyboard now
+		detects switch on keys while sleeping.
+	2)	Removed \brutus\v32isa.h and references
+	3)	Called through to the variant for the following functions on MISA
+			TBool ImpPsu::ExternalPowerPresent();
+			TSupplyStatus ImpPsu::MainBatteryStatus();
+			TInt ImpPsu::MainBatteryMilliVolts();
+			TSupplyStatus ImpPsu::BackupBatteryStatus();
+			TInt ImpPsu::BackupBatteryMilliVolts();
+	4)	Moved MISA, MCGA, MCGM, MEIG default power models to variant layer so
+		they can be replaced as necessary
+	5)	Removed P::SwitchOffBacklight().  Calls to this can be replaced with
+		Hal::SetBacklightOn(EFalse)
+	6)	Promoted P::OsSwitchOnScreen() to Plat:: so it can be called from the
+		power model.
+	7)	Added Plat::DebugInit() to force re-initialisation of the trace port
+		after switch off.
+	8)	Fixes to the interface and implementation of DDebugger/DPassiveDebugger
+
+6)	Alastair
+	1)	Applied fixes already made on release branch for EDNABRY-4PHFJJ:
+		"Emulator support for international keyboards is broken on Windows9x
+		platforms" and EDNSRES-4P4EFD: "CopyAnyWhere page fault on Win 98".
+
+
+Version 1.02.300
+================
+(Made by Dennis, 13/09/2000)
+
+1)	Alastair
+	1)	Renamed K32ADDR.H to M32ADDR.H and removed references to it from
+		WINS/WINC builds, since it isn't required.
+	2)	Fixed Base v6.1 defect EDNWROS-4MJKWH
+			 "Request for a change to emulator window size calculation".
+		The Emulator window no longer defaults to the Series5 Fascia bitmap
+		size, and expands to accommodate the specified digitizer size if
+		necessary.
+
+2)	William
+	1)	Modified COGENT1 MMP files to use \e32\bmarm DEF files in all cases
+	2)	Fixed a few places in RArrayBase where delete was being used on a
+		TAny* pointer. This should be User::Free() as there is no destructor
+		to be called.
+	3)	Fixed EDNMMIR-4JQDYY "E32DEF.H doesn't correctly use all the features
+		of GCC" by changing the definitions of CONST_CAST etc.
+	4)	Fixed EDNWROS-4MEJRS "_LIT generates compiler warnings when string
+		contains large Unicode constants" as suggested in the defect report.
+	5)	Replaced lots of M*Core PP:Fault(PP:ESystemException) calls with
+		distinct Mcore::Panic(Esomething) calls so that we can tell which is
+		which.
+	6)	Export \e32\bmarm\eloclu.def 
+	7)	Remove excess ".." in bootstrap makefile variables BUILDDIR and
+	  	TARGETDIR
+
+3)	Jonathan
+	1)	Changes to distrib mechanism:
+		- "mnt distrib generic" no longer includes source under \e32\euser
+		  since this is "IPR Category D: Additional" source. Split out MMP
+		  files under \e32\euser into new \e32\additional.inf file.
+		- New "mnt distrib Additional" is similar to "generic" but does
+		  include the \e32\euser source.
+
+4)	Dennis
+	1)	Merged in MCore source from Motorola.
+	2)	Added GCC helpers for 64-bit integers (long long) to EUSER so that the
+		same .DEF file can be used for ARM and MCore.
+	3)	Added test program SAVEHAL to HAL component to store the modifiable HAL
+		values in \System\Data\HAL.DAT
+
+6)	Markdo
+	1)	Added support for pci interrupts on Cogent.
+
+
+Version 1.02.276
+================
+(Made by Morgan, 31/08/2000)
+
+1)	Alastair
+	1)	Fixed defect EDNABRY-4NFNPX
+			"HAL component should create HAL.LIB from a dummy HAL.DLL project".
+		Now a dummy HAL.LIB can be created for ARMI, ARM4 or THUMB builds by
+		executing "abld build armi", or some similar command(s), for dependent
+		components to link to.  The HAL.DLL created in the ARMI, ARM4 or THUMB
+		release directories is an empty implementation and should be ignored.
+
+2)	Morgan
+	1)	Fixed defect EDNJBED-4NAFQ2 "Switch makes the digitiser freeze"
+		1) Gave the LCD a power handler so it can respond to on/off calls
+		from the power model.  (Effects MISA, MAWD)
+		2) PowerStandby can now be aborted.  Power handlers are given a
+		power-on call if they were sent power-off and standby is later
+		aborted.  (Effects generic kernel)
+		3) Changed the MISA digitiser wrt 2
+		4) Improved the PM heuristics in the WINS and EPOC comms drivers to
+		guess when it is busy.  (Effects WINS/EPOC comms)
+
+
+Version 1.02.275
+================
+(Made by Alastair, 24/08/2000)
+
+1)	Alastair
+	1)	Fixed defect EDNPHAR-4N3HRA "Access Violation when closing RLibrary
+`		handle".
+		Note that entrypoints of DLLs which are statically-linked
+		to, having already been dynamically-loaded, will not have their
+		entrypoints called in the statically-linked context.
+
+
+Version 1.02.274
+================
+(Made by MarkCa, 17/08/2000)
+
+1)	Morgan
+	1)	Fixed EDNMHEY-4N3FAY.  Removed references to V32ETNA.H from MEIG and
+		MAWD platforms.
+
+2)	MarkCa
+	1)	Fixed EDNTBLT-4MFKKY (peripherals need to be started after extensions
+		loaded). The pbus code has been moved to P::InitialiseLocalDrives(),
+		which is called from InitialiseLocalDrivesL().
+
+
+Version 1.02.273
+================
+(Made by Alastair, 2/8/2000)
+
+1)	Alastair
+	1)	Removed enum EKeyEuro from E32Keys.h - fixes EDNGASR-4MKLHW
+			"EKeyEuro should not be 0x80 but 0x20AC in e32keys.h"
+
+2)	MarkCa
+	1)	Fixed defect EDNPSCE-4MFPQC Media Change doesn't work properly
+		on MMC Controller
+		\e32\drivers\medmmc\epoc\d_medmmc.cpp
+			Added return value checking for Engage() calls, particularly in
+			DMmcMediaDriverFlash::SessionEndDfc() where value is used to
+			determine behaviour on media door opening / closing.
+		\e32\epbus\epoc\linda\pa_mmc.cpp
+			Added KPBUS1 conditional door interrupt debug trace.
+		\e32\epbus\epoc\linda\pa_std.h
+			Made MediaState() definition in TLindaMMCMediaChange virtual.  It
+			is implicitly virtual because it is derived from TMediaChangeBase.
+		\e32\include\p32mmc.h
+			Made TMediaState MediaState() pure virtual function in
+			TMMCMediaChange.  The function is pure virtual from
+			TMediaChangeBase anyway.  Added AccessMediaChange(TPBusNum aBus)
+			function to DMMCController.  MediaChange(TPBusNum aBus) is
+			declared as a pure virtual protected function in
+			DPeriphBusController, and so is not accessible from
+			DMMCSession::Engage().
+		\e32\include\p32mmc.inl
+			Added definition for DMMCController::AccessMediaChange(TPBusNum
+			aBus).  This is an accessor function that simply returns
+			MediaChange(aBus).
+		\e32\epbus\ps_mmc.cpp
+			Added checking to DMMCSession::Engage() to return KErrNotReady if
+			media driver tries to launch a write while the door for the
+			associated bus is opened.
+		\e32test\pccd\t_mmcdrv.cpp
+			Added test code to check above modifications.  Source file must be
+			explicitly recompiled with TEST_DOOR_CLOSE #define set to non-zero
+			for test to work.
+
+3)	Jonathan
+		1)	Disallow reads/writes to/from dead threads. Fixes EDNDFER-4MFNER.
+		2)	Also removed some old code from ks_thrd, commented out since ER1.
+
+4)	Nicolas
+	1)	Fixed EDNNTHY-4MNJXK (Kernel crash after calling ARM4 code from
+		THUMB code).
+		In the exception reporting code in __ArmVectorUndef(), the address of
+		the invalid ARM opcode is now forced to a four-byte boundary before
+		fetching the opcode. Fixed both in kc_int.cpp (arm generic) and
+		ke_int.cpp (windermere).
+
+
+Version 1.02.272
+================
+(Made by RobertJ, 20/07/2000)
+
+1) Morgan
+	1)	Added a TVersion member to the Debugger API
+	2)	Added a iDebugger member to TKernelPage so it is available
+		to externel debugger software over JTAG/BDM, at a constant
+		address.  Removed K::Debugger.
+	3)	Fixed EDNMMAT-4M6KHZ "TLex::Val returns the wrong number"
+
+2) 	Alastair
+	1)	Fixed EDNJBON-4MBMC8 '"set _epoc_drive_j=...." causing emulator
+		problems' by removing trailing spaces from _EPOC_DRIVE_? environment
+		variables as they are read.
+
+3)	Dennis
+	1)	Fixed EDNKLIG-4LVJST (Device turns off when time changed).
+		The problem was due to K::TickCounter being updated when the system
+		time changed. This no longer happens - K::TickCounter now increments
+		every tick when the machine is on and does not change when the machine
+		is off. The offset between K::TickCounter and the real time clock is
+		remembered in order to make locked timers work.
+
+
+Version 1.02.271
+================
+(Made by Morgan, 5/07/2000)
+
+1) Morgan
+	1)	Fixed EDNBBOY-4LWGW2
+	2)	Fixed MCGA Monitor warnings
+	3)	Fixed Cirrus7211a MMP warnings
+
+
+Version 1.02.270
+================
+(Made by RobertJ, 29/06/2000)
+
+1) RobertJ
+	1)	Fixed EDNMHEY-4L3KX7 "References to Licensee hardware in generic code"
+	2)	Changed \e32\drivers\dfir\epoc\d_fir.cpp to return an error code for a
+		read failure
+	3)	Changed \e32\drivers\dfir\epoc\d_fir.cpp test for buffer full from
+		>= to > as limit excluded valid transfer address.
+	4)	Changed \e32\drivers\dfir\epoc\dmabuff.cpp error code was not always
+		correctly returned. It could return zero when in error
+	5)	Changed \brutusa\vi_fir.cpp to remove 1ms wait after write to
+		spin until TUR flag set (fifo is empty) then TBY flag transmitter busy.
+		This is to remove as much latency as possible in tx->rx turnaround
+
+2) Jonathan
+	1)	Fixed EDNJHAS-4LQPA5: changed MMAD to use ARM Base Restored Data
+		Abort Model.
+
+3) Pete
+	1)	Fixed EDNPSCE-4L3CHV "Device driver slow open
+		mechanism doesn't work properly on machines with more than one PCMCIA
+		slot."
+		In fact, the slow open mechanism is OK as long as a
+		separate unit number can be used to open a serial channel on each
+		slot. Hence, the change really just involves enabling the PC Card
+		Serial driver on Brutus to open on either PC Card slot.
+			Bottom slot - Unit number 3 (Com4).
+			Top slot - Unit number 4 (Com5).
+		Also a change to the function DPhysicalDevice::CheckForSlowOpening()
+		just to make this more logical.
+
+4) MarkCa
+	1)	Removed Kern::Printf() debug from DLindaMMCStack::DoPowerUpSM() in
+		\e32\epbus\epoc\linda\pa_mmc.cpp.
+
+Version 1.02.269
+================
+(Made by Dennis, 22/06/2000)
+
+1) Alastair
+	1)	Using CP_ACP rather that CP_UTF8 for EPOC.INI file text conversion
+		since CP_UTF8 is not supported on Windows 95
+	2)	Fixed EDNWROS-4L5NLW "Text window server has hardcoded width of 80
+		characters in some places" and EDNNGRE-4H2MKK "ConsoleBase does not
+		work on small screens" by replacing the hardcoded widths of 80
+		characters by iTextScreenSize.iWidth in
+		\e32\drivers\edisp\emul\win32\wd_wins.cpp.
+	3)	Fixed EDNNSIH-4LCLNE "Access violation when loading SMUM.DLL..."  by
+		using the base name of a dll rather than it's full name to get a Win32
+		handle to it, in case it's already been loaded from a different
+		directory.
+	4)	Fixed EDNRCLF-4L4FB2 "User::LeaveIfError crash while trying to connect
+		to File Server Session in WINC" Now the dll reference table for the
+		starting process includes efile.dll and dependent dlls if efile.dll
+		has already been loaded by the process.  This ensures that the
+		efile.dll's entry point is called on startup where necessary and that
+		the file server is started.
+	5)	Fixed EDNRCLF-4LALXK "E32Initialize Crash".
+		UpWins::__DllAttachProcess() now changes "TRUE" return value from
+		Win32 DLLs to KErrNone.
+
+
+2) Morgan
+	1)	EDNRFID-4FQKKQ Zero-filled the 'Visibility Map' in the text window
+		server, during initialisation.
+	2)	EDNMHEY-4L9NKJ Added TRawEvent::ECaseOpen and TRawEvent::ECaseClose
+		events
+	3)	Added idle off behaviour to the comms LDD D_COMM.  This stops the
+		machine turning off while
+			a) there is a write request outstanding,
+			b) 20 seconds elapse after the last character has been sent,
+			c) there is a read request outstanding
+	4)	Altered comms PDD for all variants wrt above.
+
+3) Dennis
+	1)	Yet another 'fix' for defect EDNGBON-4JYNU6 (Inaccessibility of request
+		semaphores breaks EPOC connect). For WINC the semaphore name has been
+		reverted to be the same as ER5U.
+
+4) Pete
+	1)	Changes required to move Cirris Logic bootstrap over
+		to the new bootstrap scheme.
+
+
+Version 1.02.268
+================
+(Made by Markdo, 07/06/2000)
+
+1) Alastair
+	1)	Fixed EDNTJOS-4JGME4 "Dialog title EPOC32 fault needs to be changed"
+	2)	If dll entrypoints return TRUE, the return value is changed to
+		KErrNone.
+		This change means that Win32 DLLs linked to by EPOC DLLs can return
+		TRUE without resulting in a KErrBadLibraryEntryPoint error.
+
+2) Nicolas
+	1)	Fixed bugs preventing from building __EARLY_DEBUG__-enabled MCGA
+		kernels.
+
+3) Dennis
+	1)	Fixed EDNPPAN-4KEELX (HAL attribute for keyboard backlight needed).
+	2)	Fixed EDNPPAN-4KPEEL (HAL attribute EAccessoryPower needed).
+	3)	Fixed EDNJPAR-4KLLGL (HAL TManufacturer not generic).
+	4)	Fixed EDNRFID-4KTFD3 (Bootstrap doesn't clear first new page table).
+	5)	Removed ARM architecture 3 maths code from UC_I64.CPP and UC_REALX.CPP.
+		The architecture 4 code is always used now.
+
+Version 1.02.267
+================
+(Made by Alastair, 23.5.2000)
+
+1) Dennis
+	1)	Fixed problem with all ARM bootstraps caused by switching mode from
+		svc26 to svc32 in a subroutine - LR will contain flags since the BL
+		was executed in 26-bit mode, giving an incorrect return address for
+		32-bit mode. Fixed by masking top 6 bits of LR if the routine was
+		actually entered in 26-bit mode.
+	2)	Fixed defect EDNGBON-4JYNU6 (Inaccessibility of request semaphores
+		breaks EPOC connect). Thread request semaphores are no longer added
+		to the K::Semaphores container so that other EPOC code cannot access
+		them directly. On EPOC they are also unnamed, on Win32 they are named
+		PROCESSNAME::THREADNAME{EPOCTHREADID} so that the Win32 semaphore
+		inherits this name and can be found by EPOC connect.
+	3)	Fixed defect EDNSCHM-4K7MTC (CActiveScheduler::Error() broken on ARM).
+	4)	Fixed defect EDNDBAR-4K5EU3 (Close functions in RArray...)
+	5)	Fixed defect EDNMBOX-4JZEAP (TDblQueLink should allow multiple deques).
+	6)	Fixed defect EDNACLN-4JQK2F (HAL::Get panics on low memory).
+	7)	Fixed defect EDNSCHM-4JHRRS (RTimer::Inactivity only useful for switch
+		off)
+
+2) Nicolas
+	1)	Debug::EnableBreakPoint() now flushes instruction cache after writing
+		breakpoints into memory.  This fixes the transient test failures
+		observed on brutus.
+
+3)	Alastair
+	1)	Introduced new scheme into WINS/WINC so that Dll entry-points are
+		called by EPOC in much the same way that they are called on a target
+		device.
+		When a process is started or when a library is loaded, the Kernel
+		creates a Dll reference table for the executable to mimic the Dll
+		information available on the target device.  EPOC under WINS/WINC can
+		thus call Dll entry-points at the appropriate times.  This change
+		means that the Win32 Dll entrypoint mechanism is no longer used for
+		calling Dll entry-points, and therefore avoids deadlock occurring due
+		to the "hidden" critical section used by Windows operating systems
+		while making entry-point calls.  This change fixes Symbian defect
+		EDNATHE-4GAL54 -
+			"Emulator hangs during startup"
+		Whether this change will also fix similar deadlocks occuring with the
+		Emulator running  with NT SP5 on Compaq PCs remains to be seen.
+	2)	Added WINS/WINC base address for HAL.DLL - 0x6b000000
+
+4) Morgan
+	1)	Undid a change to TMillisecondTimer::CounterExpired that was causing
+		the digitiser to crash on Series5mx.
+
+
+Version 1.02.266
+================
+(Made by MarkCa, 16/05/00)
+
+1) Pete
+	1)	Fixed EDNPHAR-4JCNSC (Can't access removable drives
+		on latetst Brutus Roms).
+	2) 	Fixed a couple of problems to allow UserSvr::ForceRemountMedia()
+		to work when a non-removable drive is specified. This now
+		allows the media driver for a non-removable drive to be swapped
+		successfully.
+	3) 	Modified the ISR for the Brutus PCMCIA/CF Card Serial driver (COM4)
+		so that it now handles all pending UART interrupts in
+		a single call rather than just the highest priority interrupt. This
+		fixes problems with the driver where it could 'lose track' of
+		interrupts when multiple interrupts were pending.
+		This fixes EDNACLE-4JZL3V (Brutus PCMCIA Serial I/O Adapter hangs...)
+		and EDNPREF-4JCKV (Protocol hanging on Brutus board).
+	4) 	Modified the Brutus PCMCIA/CF Card Serial driver (COM4)
+		to support change notification.
+	5)	Fixed a problem with Brutus built-in serial ports
+		(COM1 and COM2) which were not correctly configuring the port when
+		either Odd or Even parity was selected.
+
+2) RobertJ
+	1)	Fixed \brutusa\vi_com2.cpp, \brutusa\vi_fir.cpp, \brutusa\v32isaba.h
+		to cope with transceiver SIR/FIR mode change
+
+3) Morgan
+	Fixed some anomalies in the power handling code:
+	1)	Removed ImpHal::Standby() and ImpHal::Standby(aWakeup) (from
+		MAWD, MISA, MCGA, MEIG, MMAD)
+		and replaced it with appropriate code in the power model.
+		The correct way to turn off the machine from kernel-side is to call
+			a) DPowerModel::PowerStandby() for immediate kernel-side switchoff
+			b) Kern::AddEvent(ESwitchOff) for ordered user shutdown
+		To turn off from user side, we call UserHal::SwitchOff().
+	1.2)Renamed K::SwitchOff() to Power::SwitchOff()
+		Renamed K::PowerOn() to Power::PowerOn()
+		Removed DPowerModel::PowerStandby(aWakeup) because it is useless.
+	2)	UserHal::SwitchOff calls Power::SwitchOff which calls PowerStandby on
+		all power handlers.  This will cause
+		DPowerModel::PowerTransition(EPowerNone) to be called (when each power
+		hander has called SetRequirement(0)).  The power model should then
+		call DPowerModel::PowerStandby() to turn the machine off. (see a)
+		above).
+	3)	DPowerModel::PowerStandby() works out when the next alarm is due, and
+		turns off the machine by calling the appropriate
+		DPowerModel::DoPowerStandby(/*aWakeup*/) function.
+	4)	Added a User-Cpu-In-Use flag to the power model's power-requirement.
+		This stops the machine turning off while there is user-side processing
+		but no device drivers (power handlers) active.  This flag does NOT
+		prevent idle.  This flag is unset when UserHal::SwitchOff is called,
+		and set for PowerOn.
+
+Version 1.02.265
+================
+(Made by Morgan, 18/4/2000)
+
+0)	Must change \\epoc\main\generic\romkit\include\base.iby line
+		file[VARID]=ASSP_DIR\BUILD_DIR\cVARLETTERxyVARIANT.dll System\Libs\Exyin.dll
+	to
+		extension[VARID]=ASSP_DIR\BUILD_DIR\cVARLETTERxyVARIANT.dll System\Libs\Exyin.dll
+	when integrating to mainline.
+
+1) Morgan
+	1)	Made all XYInputs into kernel-extensions
+	2)	Removed TXYInput from M32HAL.H
+
+2) Dennis
+	1)	Fixed EDNJPAR-4G5FA8 (missing chunk types)
+	2)	Fixed EDNMBOX-4DSJXH (missing #include guards on e32des8.h
+		and e32des16.h)
+	3)	Fixed EDNJBON-4DCEHD (Kern::Printf doesn't support %c)
+	4)	Fixed EDNPBAA-4HXEST (TDes::Format doesn't support %i)
+	5)	Fixed EFNATHE-4GYFQ8 (Thread semaphores named after thread)
+	6)	Fixed EDNJHAS-4HCQAF (SA1100 standby)
+	7)	Fixed EDNDBAR-4C5E7V (RArray<> should have a TArray interface).
+	8)	Fixed EDNJHAS-4HXEGT (Literal length as compiler constant).
+	9)	Fixed EDNJHAS-4HXELS (Compile-time TFixedArray).
+	10)	Fixed EDNJHAS-4HXEPN (Support for profiling).
+	11)	Added CleanupStack checking functions:
+			CleanupStack::Pop(TAny* aExpectedItem)	check top item and pop
+			CleanupStack::PopAndDestroy(TAny* aExpectedItem)	check top
+			item, pop and destroy
+			CleanupStack::Pop(TInt aCount, TAny* aExpectedItem)	Pop aCount
+			items, checking last one
+			CleanupStack::PopAndDestroy(TInt aCount, TAny* aExpectedItem)
+			Pop/destroy aCount items, checking last one
+	12)	Removed compiler warnings from E32 and variants.
+	13)	Added EMemoryRAMFree option to HAL to get amount of free RAM.
+	14) Fixed EDNCDUG-4J3QA8 (collate.h includes files not in \epoc32\include).
+
+3)	Alastair
+	1)	Fixed EDNABRY-4JGJG4 "Test T_Float fails under WINS/WINC"
+
+
+Version 1.02.264
+================
+(Made by Morgan, 7/4/2000)
+
+1) Morgan
+	1)	Added DPowerHandler::DoPowerTransition(aPowerState) virtual
+		function to the power handlers.  Power handlers should
+		implement this if they need notification when the power state
+		of the machine changes.
+	2)	Added DPowerModel::PowerTransition to call the power handlers.
+		Added pure virtual function DPowerModel::DoPowerTransition()
+		to replace the DPowerModel::SetPowerState function, (which has
+		now been killed).
+	3)	Added Power Model locking - Power::[Un]LockPowerModel().  This
+		prevents the power model from shifting power states during
+		power critical periods.
+	4)	Added ECaseState to the HAL.
+	5)	Removed ImpHal::EmergencyStandby() from all platforms.  This fn
+		is not used or needed any more.
+
+2) Nicolas
+	1)	Improvements and bug fixes in RDebug API implementation
+		so in-target-debugging will be usable on ER6 devices.
+		USER-LEVEL VISIBLE CHANGES:
+		* Debugging resources owned by the debugger and the
+		  debuggee are automatically released when the
+		  debugger/debuggee ends (this includes automatically
+		  closing the debugging session).
+		* SDebugInfo has a new field containing the start
+		  address of the debuggee's data/bss chunk: this is
+		  mandatory to support the current toolchain in
+		  gdbstub.
+		* THUMB breakpoints supported.  Let A be the address
+		   of a breakpoint to be set/cleared.  In THUMB mode, A
+		   should be passed as-is to RDebug.     In ARM mode, A+2
+		   should be passed.  See below for a rationale.
+		* New class TArmBreakPoint added in kc_std.h.  It
+		  contains breakpoint characteristics and an inline
+		  function that can be used to insert a hardcoded ARM
+		  or THUMB breakpoint in user code.
+		INTERNAL CHANGES:
+		* Breakpoint notification in __ArmVectorUndef() was
+		  disabled.  It is now re-enabled.  Code updated to
+		  take into account both THUMB and ARM.
+		* Support for ARM BX instruction has been added to
+		  single-stepping code.  THUMB single-stepping still
+		  not supported.
+		* In Debug::Continue(), removed code which stepped
+		  over breakpoints located at the start address
+		  because GDB already does the same thing.  Removed
+		  too, code which stepped over hardcoded breakpoints
+		  because it was buggy and hardcoded breakpoints are
+		  uncommon.
+		* New scheme used for breakpoints: a single 16-bit
+		  opcode is used for both ARM and THUMB breakpoint.
+		  For ARM, this pattern must replace the upper 16-bits
+		  of the instruction to break at.  As little-endian is
+		  used, the breakpoint bit pattern is actually at
+		  address+2, hence the API change described above.
+		* CPU-dependent modifications done in both generic ARM
+		  and in windermere.
+	2)    Fixed defect EDNNTHY-4H6PXT (PC address computed at
+		  start of __ArmVectorUndef() is wrong in THUMB mode).
+
+3) AndrewB
+	1)	Removed K32SND.H, K32SND.INL, D32SND.H and D32SND.INL
+		from the export section of bld.inf. These files should
+		no longer be public since all sound functionality is now
+		managed by the Media Server.
+
+4)	MarkCa
+	1)	\E32\EPBUS\EMUL\WIN32\PP_PCCD.CPP
+		Added ReadPasswordFromStore() and EncodePassword().
+		Added logic to RPlatPccdChunk::(Read|Write) to automatically unlock
+		card if pw in store  Replaced assertion w. return code in
+		DPlatPcCardController::WritePasswordData().  Added comments to describe
+		how emulated mechanism corresponds with real MMC mechanism.
+		Modified password store to use 128-bit card ids to simulate mmc better.
+		DPlatPcCardController::PasswordControl(),
+		DPlatPcCardController::PasswordStoreLengthInBytes(),
+		DPlatPcCardController::(Read|Write)PasswordStore()
+		All modified to give same behaviour as default DPeriphBusController
+		virtual functions if _LOCKABLE_MEDIA is not #defined.
+	2)	\E32\EPBUS\EMUL\WIN32\PP_STD.H
+		DPlatPcCardController prototypes for above.
+		Removed panics EWinsPcCard(MappingNotInStore|PswdStoreBadWriteDesc).
+	3)	\E32\INCLUDE\E32SVR.H
+		Added "//#define _LOCKABLE_MEDIA" so WINS PC Card controller can be
+		built without locking mechanism.
+
+5)	Morgan
+	1)	Changed declaration of Custom::DriveSettings to pure virtual on
+		MAWD and MMAD and MIEG platforms.
+	2)	k32snd.h and d32snd.h are no longer exported, so:
+		Changed \series5mx\va_sdrv.h to get k32snd.* and d32snd.*
+		from \e32\include. Changed \cirrus72x1\va_sdrv.h to get k32snd.*
+		and d32snd.* from \e32\include.  Modified k32snd.h and d32snd.h
+		to get header files from \e32\include
+
+6)	Alastair
+	1)	Removed unused __USE_CRITICAL_SECTION__ #defines from the WINS/WINC
+		kernel.
+	2)	Removed badly-spelt LedArrangeVerticaly keyword from the EPOC.INI file
+		processing code - use LedArrangeVertically instead.
+	3)	Named the WINS/WINC kernel critical section mutex so that it can be
+		shared between processes.
+	4)	Fixed Symbian ER5u defect EDNHLOO-4HGKKJ
+		"EXPORT_C used instead of IMPORT_C in header file".
+
+7) 	Pete
+	1)	Added extra member to TDriveInfoV1 class:-
+			TInt iRuggedFileSystem
+		With this set (to KRuggedFileSystem), it indicates to the
+		file server that it should implement a rugged file system.
+		This required the addition of a new variant function - DriveSettings()
+		so the ruggedization option can be selected at the variant level.
+	2) 	Added latest versions of LFFS Media drivers for WINS and Brutus - 4th
+		candidate version (R1.2) of LFFS.
+	3) 	Modification to E32 local media subsystem so that the reading
+		of partition information from the media driver on mounting
+		a drive is done asynchronously. This affects the media driver API as
+		follows:-
+
+		TInt DMediaDriver::PartitionInfo(TPartitionInfo &anInfo);
+		becomes
+		void DMediaDriver::ReadPartitionInfo(TInt &aResult,const TCallBack& aCallBack);
+
+		The ReadPartitionInfo() call just initiates the reading of partitiion
+		information with this typically being concluded on an interrupt. From
+		the interrupt, the driver signals the conclusion of the requests by
+		call 'aCallback', having first written the result of the request to
+		'aResult'. The partition info is now written by the driver directly
+		into its member data - DMediadriver::iPartitionInfo rather than being
+		passed back to the local media subsystem.
+
+8)	Dennis
+	1)	Renamed iCount member of CObjectIx to iHighWaterMark. Added new member
+		iNumEntries which counts the number of actual entries in the index.
+		The Count() member function now returns iHighWaterMark so its meaning
+		is unchanged. Added new ActiveCount() member function to return the
+		new iNumEntries member.
+		Changed Exec::HandleCount() to return the number of actual handles open
+		rather than the high water mark of the handles array as before.
+
+Version 1.02.263
+================
+(Made by MarkDo, 30.03.2000)
+
+1)	Morgan
+	1)	Reorganised the super-page into TSuperPage, TKernelPage,
+		and TMachineConfiguration.  TMachineConfiguration has
+		been promoted from WINS.
+		TSuperPage holds values discovered by the bootstrap that
+		are required by the generic kernel.  TKernelPage
+		contains generic kernel data that needs to be preserved
+		over a warm reset.  TMachineConfiguration contains
+		system wide settings that should be persisted over a
+		warm reset and machine state saves (backup).
+	2)	Changed P::SetMachineConfiguration() and
+		P::MachineConfiguration() to use the new
+		TMachineConfiguration on all platforms.
+	3)	Removed iDebugger from the super page
+	4)	Fixed some warnings
+	5)	Changed the bootstraps for MEIG and MAWD to match new
+		superpage layout.
+		Changed bootstrap\include\superpage.h to match new
+		bootstrap.
+	6)	Removed PowerRestart functions since the power model
+		never calls them.
+
+
+Version 1.02.262
+================
+(Made by Dennis, 23.03.2000)
+
+1)	Alastair
+	1)	Added calls to Sleep(0) before all occurrences of SetEvent(),
+		ReleaseSemaphore() and ReleaseMutex() in accordance with advice given
+		in MSDN Knowledge Base article Q173260.  This change should make one
+		variant of the Emulator Hanging bug less likely to occur.
+
+2)	MarkCa
+	1)	\E32\EPBUS\EMUL\WIN32\PP_PCCD
+		Added ReadPasswordFromStore() and EncodePassword().
+		Added logic to RPlatPccdChunk::(Read|Write) to automatically unlock
+		card if pw in store.
+		\E32\EPBUS\EMUL\WIN32\PP_STD.H
+		DPlatPcCardController prototypes for above.
+
+3)	MarkDo
+	1)	Added additional media attributes KMediaAttLockable and
+		KMediaAttLocked.
+
+4)	Pete
+	1) 	Removed the EUSER class UserPcCardCntrl.
+	2)	Modified the function MBusDev::DoAsyncLateOpen() to
+		now take an additional second parameter 'TInt anOpenInfo'.
+
+5)	Dennis
+	1)	Removed the EPOC registry - files US_REG.CPP, UB_REG.CPP and KP_REG.CPP
+		along with TRegistryCategory, TRegistryItemName, TRegistryItemValue,
+		CRegistry, CPersistentRegistry and Environment classes.
+	2)	Removed most UserHal:: functions - these have been superseded by HAL::
+		functions.
+	3)	Removed RThread::Create() overload taking a RProcess& parameter and
+		removed RProcess* parameter from the overload taking an RLibrary*
+		parameter. Threads may now only be created in the current process.
+	4)	Reassigned ARM domains following demise of registry. 2 is still used
+		for page tables, 3 is now used for the RAM drive and 4 for F32.
+	5)	Change to Brutus bootstrap to link at 0xc8000000 for compatibility
+		with 12Mb bootloader.
+
+
+Version 1.02.261
+================
+(Made by Robert, 17.3.2000)
+
+1)	Morgan
+	1)	Added User::ResetInactivityTime() to reset all
+		RTimer::Inactivity timers
+	2)	Added TRawEvent::EKeyRepeat for adding auto repeated key events
+		to the event queue
+
+2)	Pete
+	1)	Added kernel functions to read, write and return the
+		size of the Peripheral Bus Controller password store.
+
+3)	MarkCa
+		1)	Added WINS PC Card locking features to test mmc (Crystal) functions
+
+			\E32\EKERN\KW_EXEC.CPP
+			Modified ExecHandler::Drive(ReadPasswordData|PasswordStoreLengthInBytes)()
+		to call P functions.
+
+			\E32\EKERN\KS_SVR.CPP
+			Modified svDriveWritePasswordData to call P::WritePeriphBusPasswordData().
+
+			\E32\EPBUS\EMUL\WIN32\PP_PCCD.CPP
+			Modified DPlatPcCardController::PasswordControl().
+			Implemented DPlatPcCardController::(Read|Write)PasswordStore(),
+			DPlatPcCardController::PasswordStoreLengthInBytes().
+			Read and write routines return KErrLocked if locked and accessing
+			EPccdAttribMem memory.  This still allows chunks to be created for
+			locked cards.
+
+		\E32\EPBUS\EMUL\WIN32\PP_STD.H
+			Prototypes for above and store panic codes.
+
+4)	RobertJ
+	1)	Entered suppilied mods to Linda SIR in vm_com2.cpp for all variants
+
+
+Version 1.02.260
+================
+(Made by Alastair, 10.3.2000)
+
+
+1)	Alastair
+	1)	Updated e32 rombuild scripts to pick up the test .IBY files
+		generated by Bldmake from the new directory structure implied
+		by recent changes to E32TOOLP.
+
+	2)	Added temporary hack to bootstrap component extension makefile
+		so that mainline rombuilds for MEIG, MAWD and MMAD will still work,
+		now that the rombuild system has been changed to work with output
+		produced by the generic bootstrap build system.
+
+2)	Pete
+	1)	Modified PC Card Controller emulator (EPBUS) in WINS
+		to implement Peripheral bus password functions (Lock/Unlock/Clear).
+		This is only possible on the simulated CF cards in Socket 0 (not the
+		simulated Compact rom card in socket 1).
+
+3)	MarkCa
+	1)	\E32\EUSER\US_KSVR: converted
+		TBusLocalDrive::((Lock|Unlock)Drive)|ClearPassword) from async to sync.
+		\E32\E32SVR.H: changed TBusLocalDrive prototypes.
+
+Version 1.02.259
+=================
+(Made by MarkCa 03-03-00)
+
+1)	Morgan
+	1)	Guarded POS hooks with #define __SUPPORT_PARTNER_OS__ and updated
+		U32STD.H appropriately.  This removes partner OS support from most
+		platforms.
+	2)	'Enhanced' the POS hooks.  Kernel lock is now done after the POS
+		reschedule hook, instead of before.  This makes it necessary to
+		check for the POS rescheduler being interrupted.  If it has been
+		interrupted then we now make an early exit from the int-vector to
+		prevent running DFCs from the nested interrupt.
+
+2)	William
+	1)	Fixed the borders for text-window server windows on EPOC devices.
+		WINS uses true Unicode fonts, but EPOC devices have a cp1252 font
+		built in, and so need to continue using the cp1252 encoding for the
+		box drawing characters.
+
+3)	MarkCa
+	1)	Added TBusLocalDrive -> Exec -> ExecHandler functions for MMC
+		password support.
+
+4)	Pete
+	1)	Added PasswordControl() function to TLocDrv,DMediaDriver and
+		DPeriphBusController classes.
+
+Version 1.02.258
+================
+(Made by Pete 24/02/00)
+
+1)	Alastair
+	1)	Updated a few .mmp files to hardcode .def file locations.
+
+2)	Dennis
+	1)	Made TDesC8::Left(), TDesC8::Right(), TDesC16::Left() and
+		TDesC16::Right() truncate the requested length to Length() instead
+		of panicing.
+	2)	Export COLLATE.H to \Epoc32\Include instead of \Epoc32\Include\Kernel
+		since it contains public interfaces.
+	3)	Added DEBUG mode checking to ensure that heaps are not referenced by
+		DFCs. Before calling a DFC the current heap pointer is changed to
+		0xC90FDAA2 and is restored when the DFC returns.
+
+3)	Morgan
+	1)	Removed \hal\group.  BLD.INF is now in \hal.  Removed annoying
+		"Nothing to do" declarations.  Updated all variant hals to match.
+
+4)	Robert
+	1)	Added new export ClearIrError for Linda in ka_linda.cpp and v32linda.h
+
+5)	Pete
+	1)	Signal change notification added to Cogent DTE serial drivers (COM3 &
+	  	COM4).
+	2)	Fixed problem with signal change notification on DTE
+		and DCE serial drivers where it was possible for a transition on a
+		modem status line to occasionally fail to trigger notification.
+	3) 	Added CF Card Serial driver for Brutus (COM4) - not yet tested.
+
+
+Version 1.02.257
+================
+(Made by Dennis, 14-02-2000)
+
+1)	Dennis
+	1)	Added HAL component.
+	2)	Removed calls to most UserHal functions except for those which are
+		always available from the kernel.
+	3)	Inlined ::operator new(TUint, TLeave) and
+		CBase::operator new(TUint, TLeave) to remove the need for the
+		TLeave parameter to be generated by the compiler.
+	4)	Kernel now always disables auto switch off by default.
+	5)	Added RTimer::Inactivity() and CTimer::Inactivity() functions to
+		support generic user inactivity timers.
+	6)	Added K::InactivityQ and TInactivityLink to the kernel to implement
+		generic user inactivity timers.
+	7)	Added User::InactivityTime() to return the time elapsed since the last
+		user event.
+
+2)	Morgan
+	1)	Exported hal_int.h into the system\kernel include dir
+	2)	Made \hal\group\config.mke generic so it works for HALs in
+		\hal component and also works for HALs in \<variant>\hal.
+		Renamed <variant>.hda and <variant>.hcf to values.hda and
+		config.hcf.
+	3)	Added HALs to linda b,c,1 variants
+	4)	Updated Variant::DisplayOn for all linda variants.
+		Code from Sampsa - not tested locally.
+	5)	Fixed EPBUS build error in pa_std.h on MMAD platform
+	6)	Added kernel-extension loading to kernel init.
+		Kernel extensions are loaded just before the file-server.
+		Extensions can have writable static data but global constructors
+		are not called.
+	8)	Made keyboard drivers on all platforms into kernel-extensions.
+	9)	Removed TKeyboard.
+	10)	Fixed bug in TIdler::Idle().  There are now 64 ticks in a second.
+
+3)	Jonathan
+	1)	Fixes to "mnt distrib" mechanism and dsitrib.txt files.
+		Made distrib.pl checking stricter: Checks for mising distrib.txt files
+		and for non-existent files listed in distrib.txt.
+
+4)	Pete
+	1) 	Re-enabled the ACD on MEIG.
+	2)	Enabled main battery voltage measurement on Cirrus 7211
+		board (which is simulated using a pot. on the board). Also reference
+		voltage measurement. Disabled backup battery measurement.
+	3)	Added digitizer driver for Cirrus 7211 board - using
+		ADC channels to measure screen position.
+	4)	Generally tidied up variant for Cirrus 7211 board.
+	5)	Modified MEIG bootsrap so it resets DRAM width to
+		32bit. (Cirrus 7211 repro program sets it to 16bit).
+	6) 	Temporarily re-assigned Cogent UART3.PDD to use
+		UARTB rather than UARTC since UARTC/UARTD still have h/w problems
+		with setting thier interrupt mask registers. This means Cogent now
+		has a single DCE and DTE serial port. The ports are now assigned:-
+
+		Driver	Port Number	Uart	Port Type
+		------	-----------	----	---------
+		EUART1	Serial 0	UART-A	DCE
+		EUART2	Serial 2	UART-C	Not working
+		EUART3	Serial 1	UART-B	DTE
+		EUART4	Serial 3	UART-D	Not working
+
+Version 1.02.256
+================
+(Made by Simon, 01-02-2000)
+
+1)	Dennis
+	1)	Added aLength parameter to Dll::GlobalRead() to specify how much data
+		to read.
+	2)	Added UserSvr::HalGet() and UserSvr::HalSet().
+
+2)	Pete
+	1)	Modified Linda MMC Controller to include calls on the
+		power model to reduce the clock frequency during MMC operation (and
+		restore to normal clock frequency afterwards).
+	2) 	Corresponding changes to the Linda power model to support MMC clock
+		switching.
+	3)	Added various additional functions to TLinda class to
+		support power model clock switching.
+	4)	Added CF card modem serial PDD to MAWD - DATXB13
+
+3)	Morgan
+	1)	Integrated Matt's changes for the LCD on the HPs
+
+4)	Simon
+	1)	Restructured e32 source directory, and moved varients to new components
+
+
+Version 1.02.255
+================
+(Made by Dennis, 19th January 2000)
+
+1)	Morgan
+	1)	Bug fix for WINS emulator-configuration on the command-line
+		(EDNATHE-4ETJPC)
+	2)	MMAD LC/LB/L1 clock moved to 52Mhz and changed LCD settings
+	3)	EXPORT_Ced some more functions (in ImpAsic) for use by ENOS
+	4)	Integrated changes from Nile to MMAD keyboard drivers
+	5)	Added TRUST changes to MMAD bootstrap
+	6)	Modification to the POS fiq vector to defer POS reschedule
+		when interrupted from irq or svc mode
+
+2)	Dennis
+	1)	Removed X86 build
+	2)	Removed NoLongerSupported... functions from EUSER and EKERN
+	3)	Removed TReal96. Removed the implementations of Math:: functions which
+		use TReal96; only the TRealX implementations now remain. Rewrote some
+		code in UM_RTOD.CPP (real to text conversion) to use TRealX instead of
+		TReal96.
+	4)	Removed SObjectIxArray, SObjectConArray and SObjectConIxArray. These
+		data members are now part of CObjectIx, CObjectCon and CObjectConIx
+		respectively.
+	5)	Inlined CObjectCon::UniqueID() and CObjectCon::Count()
+	6)	Changes to descriptor code from Andrew Thoelke. Copy constructors are
+		no longer explicitly defined (compiler generated instead). A protected
+		empty destructor has been added to TDesC8 and TDesC16 to prevent the
+		passing of TDesC and TDes parameters by value, which would result in
+		object slicing. To cope with static descriptors, an empty atexit()
+		function has been added to UP_DLL, UP_EXE and KC_EXE for all platforms.
+	7)	Added machine coded 16-bit descriptor code for ARM (UC_DES16.CPP). This
+		is enabled by __DES16_MACHINE_CODED in U32STD.H.
+	8)	Inlined TCallBack functions.
+	9)	Removed TChar copy constructor. This means that TChar parameters passed
+		by value are now passed in registers by GCC. Modified machine coded
+		functions which take a TChar parameter to account for this.
+	10)	Removed TLex8 and TLex16 copy constructors.
+	11)	UserSvr::StaticCallList(), UserSvr::DynamicCallList() and
+		RLibrary::LibraryCallList() are no longer exported.
+	12) RChunk::CreateDllStatic(), RChunk::ReserveAt() and all overloads of
+		RChunk::Read() and RChunk::Write() have been removed.
+	13)	Added inline functions for converting TProcessId and TThreadId to and
+		from TUint.
+	14)	Removed RThread::Mark(), RThread::SetMark(), RThread::NotifyIfDie(),
+		RThread::SetNotifyIfDie(), RThread::Busy() and RThread::SetBusy().
+	15)	Removed RProcess::Mark(), RProcess::SetMark() and RProcess::Busy().
+	16)	Removed User::Abort() and User::Dying().
+	17)	Inlined TRawEvent default constructor, TRawEvent::Type() and
+		TRawEvent::Ticks().
+	18)	Removed RLoader::LoadProcess and RLoader::LoadLibrary functions which
+		don't take a TUidType. RLoader::Version() and RLoader::LoadProcess()
+		are no longer exported.
+	19)	Changed CCaptureKeys to use RArray instead of CArrayFixFlat.
+	20)	Removed class RMmu.
+	21)	Removed CArrayFixA etc.
+	22)	Options %E, %F, %G in TDes::AppendFormatList() now convert a TRealX
+		instead of a TReal96.
+	23)	Fixed bug in chunk creation - between setting the domain and the
+		iOwningProcess, the SetNameL could leave. The chunk destructor would
+		then erroneously free the domain.
+
+3)	Alastair
+	1)	Removed SROS, ARM3 and MARM targets from BLD.INF and GENERIC.INF.
+	2)	Fixed minor problem with DIFILB.MMP.
+	3)	Added support for specifying color depths Gray256 and Color64K in the
+		EPOC.INI file with the ColorDepth keyword.  Changed the Emulator color
+		depths default to all supported color depths rather than just Gray2,
+		Gray4 and Gray16.
+	4)	Made processing of all EPOC.INI file keywords case-insensitive, and
+		extended maximum line length from 80 to 256 characters.  EPOC.INI
+		syntax errors are now captured and displayed in a Message box before
+		causing the Emulator to exit.  Text from the EPOC.INI file is
+		converted to UNICODE before processing.
+
+4)	Mark
+	1)	Added KLindaUidValue and used to set iMachineUniqueId in superpage
+		for MMAD L1/LB/LC.
+
+5)	Pete
+	1)	Merged in latest changes to MMC Controller and MMC Media driver.
+		The Controller now supports multiple block read/writes requests
+		and the Media driver makes use of the multiple block reads.
+	2)	Added support in TCogent for the 2nd Dual UART device (ST16C2552) and
+		also suppport for its associated interrupts (in KA_PIC.CPP).
+	3)	Added DCE serial drivers to Cogent - not yet fully functional. Also
+		re-organized cogent serial PDDs. These are now assigned as follows:-
+			Serial 0 - DCE using ST16C552 device (CTS/RTS).
+			Serial 1 - DCE using ST16C552 device (CTS/RTS).
+			Serial 2 - DTE using ST16C2552 device (RTS,DTR/CTS,DSR,RI).
+			Serial 3 - DTE using ST16C2552 device (RTS,DTR/CTS,DSR,RI).
+	4) 	Removed TLocalDrive class from EUSER (use TBusLocalDrive instead).
+	5)	Changed TBusLocalDrive Read(), Write() Format() functions to use a
+		TInt64 rather than a TInt to specify position within the drive.
+	6) 	Removed RLogicalChannel class from EUSER (use RBusLogicalChannel
+	   	instead).
+	7)	Removed RDevComm class from EUSER (use RBusDevComm instead).
+
+Version 1.02.254
+================
+(Made by Pete, 21st December 1999)
+
+1)	Petteri
+	1)	Added extended serial port functionality as required by Linda. A new
+		pair of device drivers has been added to enable Linda to act as a DCE
+		device in addition to DTE. New notifications and capabilities have
+		been added.
+
+		Files changed:
+		Inc\D32comm.h		Inc\D32comm.inl
+		Inc\K32comm.h		Inc\K32comm.inl
+		Inc\K32std.h		Inc\V32linda.h
+		Dcomm\D_comm.cpp	Vmadlc\Vm_com1.cpp
+		Vmadlc\Vm_com2.cpp	Vmadlb\Vm_com1.cpp
+		Vmadlb\Vm_com2.cpp	Varmca\Va_com1.cpp
+		Varmca\Va_com2.cpp	Varmcl\Va_com1.cpp
+		Varmcl\Va_com2.cpp	Varmp2\Va_com1.cpp
+		Varmpb\Va_com1.cpp	Varmpc\Va_com1.cpp
+		Varmpc\Va_com2.cpp	Varmpd\Va_com1.cpp
+		Varmpd\Va_com2.cpp	Varmpd\Va_com3.cpp
+		Vawdb1\Va_com1.cpp	Vawdb1\Va_com2.cpp
+		Vcgac1\Va_com1.cpp	Vcgac1\Va_com2.cpp
+		Visaba\Vi_com1.cpp	Visaba\Vi_com2.cpp
+		Visaba\Vi_com3.cpp	Vrosr1\Va_coms.cpp
+		Vx86pc\Vx_comm.cpp	Dpwins\D_cdrv.cpp
+		Kamad\Ka_linda.cpp	Bmmad\Ekernu.def
+		Group\Bld.inf		Ksrc\Ks_chn.cpp
+
+		Files added:
+		Dcomm\D_commdce.cpp	Vmadlc\Vm_com1dce.cpp
+		Group\Ecommdce.mmp	Group\Dmtxlc1dce.mmp
+		Group\Dmtxlb1dce.mmp	Vmadlb\Vm_com1dce.cpp
+
+2) 	Pete
+	Changes to the above DCE serial drivers and the new notification aspects
+	of the DTE serial drivers:-
+	1)	Added DCE serial driver for Linda L1 together with the corresponding
+		changes to the existing DTE serial drivers for Linda L1.
+	2)	Postponed various notification completion calls to a DFC. Also, now
+		uses DThread::Write() were appropriate to return completion
+		information to the client thread.
+	3)	Changed implementation of NotifyFlowControlChange() so this only
+		completes when a change to a h/w signal has actually changed the Tx
+		flow control status. Also, now XON/XOFF changes trigger this notifier
+		too.
+	4) 	Slight change to the way NotifySignalChange() is implemented.
+	5)	Implemented notification changes to WINS serial driver.
+
+3) 	Pete
+	Converted MEIG build to the Cirrus Logic 7211 - a ARM Architecture V4
+	device. MEIG can now be built for ARM4, ARMI and THUMB and can no longer
+	be used on ARM 7110 (Eiger) platforms.
+	1)	Modifications to Varmca variant (i.e. Cirrus Logic 7211 evaluation
+	  	board:
+		- Alterations to reflect changed GPIO allocation for the Rev.B
+		  evaluation board.
+		- Fixed problem with diagnostic LED.
+	2) 	Fixed a problem with enabling additional CL-PS7111 interrupts.
+	3) 	Fixed a problem with TEiger::SetUart2Config() so that the 2nd 7211
+		serial port now works OK.
+	4)	Altered MEIG bootstrap to use ARMv4 rather than ARMv3 coprocessor
+		instructions to flush the cache and TLB. Also, now maps an extra page
+		for the additional 7211 Eiger specific registers.
+	5)	Changed the definitions for MEIG in U32STD.H to use ARM4 rather than
+		ARM3 settings.
+	6)	Added added support for additional 7211 registers in the TEiger class.
+	7)	Modifed BLD.INF so that only the CA variant is built for MEIG
+		builds. The PB,PC,PD,P2,CL variants are no longer built.
+
+4) 	Pete
+		1) 	Changes to e32\dcomm\d_comm.cpp to fix a s/w flow control
+		problem. If SetConfig() is called on the serial port with
+		KConfigSendXon set in config.iHandshake and the port h/w has not yet
+		been initialised then the driver attempts to send an XON char with the
+		h/w off. No XON char is transmitted and no subsequent data can be
+		transmitted.
+
+5) 	Morgan
+	1)	Bug fix for MMAD LB and LC variants
+
+Version 1.02.253
+================
+(Made by Morgan, 3/12/99)
+
+0)	Use with F32(201)
+
+1)	Dennis
+	1)	Use section mapped garbage area for SA1100 cache flushing. Main cache
+		flush area is at 0x43000000, mini cache at 0x43100000.
+	2)	Added new function Mmu::FlushUnmap() which is called when RAM is
+		unmapped. This function flushes a writeback DCache to ensure that no
+		modified lines remain which relate to the unmapped memory.
+	3)	Added new function Mmu::FlushCode() which is called after new code
+		is loaded into RAM - in DPlatProcess::Loaded and DPlatLibrary::Loaded.
+		This flushes the ICache on a split-cache machine.
+	4)	Reinstated machine coded CActiveScheduler::Start() and CServer::RunL()
+		after applying the RunError() modifications from last release.
+	5)	Added new define __CPU_EXC_VECTORS_MOVABLE in U32STD.H for
+		SA1100. This signifies that the processor offers a choice about the
+		virtual address used for the exception vector table. Changed SA1100
+		bootstrap to place the vectors at 0xFFFF0000 and changed Mmu::Init1()
+		to set the end of the home section to 0xFFF00000 on SA1100.
+	6)	Fixed scheduler bug which caused a null pointer dereference in the case
+		where TheCurrentVMProcess=NULL, i.e. during boot.
+	7)	Modified SA1100 bootstrap to output boot tracing to the same port as
+		kernel tracing. Added more boot tracing. Tracing can now be done after
+		the MMU is enabled, since the output char function checks the MMU
+		control register.
+	8)	Modified SA1100 bootstrap to set the correct RAM wait states when
+		running from RAM, since the bootloader sets pessimistic values.
+	9)	Modified SA1100 bootstrap to mark the exception vectors as cacheable
+		and as readable by all code and writeable by none.
+	10)	Removed __MCGA__ hacks from KCARM. We now use __CPU_ARMV3 define to
+		determine whether to use architecture 3 or 4 MMU instructions.
+	11)	EXE code chunks are now allocated at the top of virtual address space
+		in the same region as DLL code chunks. Also they don't move during a
+		reschedule. This means that split-cache machines need never flush the
+		ICache except following loading of new code to RAM.
+	12)	When sharing a DLL code chunk, copy entry point from the library whose
+		code chunk is being shared.
+	13)	Added "kerneltrace 0x80000000" to every HEADER.IBY file, so panics are
+		always traced in debug builds.
+
+2) Morgan
+	1)	Fixed a couple of warnings
+	2)	Removed the 256 character limit from process command lines
+		Added Exec::ProcessCommandLineLength
+		Added RProcess::CommandLineLength()
+		Added RProcess::CommandLine(TDes&)
+		Changed UserSvr::ProcessCreate to take an additional cl HBufC parameter
+		Changed svProcessCreate and S::ProcessCreate[L] accordingly, and added
+		cleanup code.
+		Changed RLoader::LoadProcess RMessage to take additional cl parameter
+		Changed WINS getFileNameAndCommandLine initialisation function
+		DProcess::Create now takes and additional command line HBufC
+	3)	Fixed PWM interface in TLinda
+	4)	Added EStdKeyApplication<n> enumerations
+	5)	Added KHARDWAREASSIST to the KTRACE #defines for switching on
+		hardware that can assist with kernel tracing
+	6)	Mapped in CBA on EStdKeyDevice0..EStdKeyDevice3 on MMAD LB and LC
+		variants
+	7)	Added hardware assist tracing to Variant::DebugOutput() on
+		MMAD platforms
+	8)	Changed the XYInputType on MMAD platforms to EXYInputDeltaMouse,
+		and MCGA to EXYInputMouse by implementing ImpHal::XYInputType()
+	9)	Integrated Matthew's new MMAD L1 variant
+	10)	Integrated Matthew's WINS changes for mapping application keys
+
+3)	Simon
+	1)	Use Cogent extended PCI space if available
+
+Version 1.02.252
+================
+(Made by Simon 25-11-1999)
+
+1) Morgan
+	1)	Process create now correctly notifies the debugger of the new main
+		thread.
+	2)	VMADLB and VMADLC report correct physical screen dimensions.
+	3)	Updated the MMAD bootstrap to take new flash initialisation values
+	4)	Pushed DPassiveDebugger Rom-library-hunting into 3rd stage kernel
+		initialisation.  This is to allow the kernel heap to grow as required.
+		Also, reorganised strings in the DPassiveDebugger tables to take up
+		less room.
+	5)	Added EVT100.MMP to build the vt100 display driver.
+
+2)	Alastair
+	1)	Changed exception-handling for system threads under WINS/WINC so that
+		exceptions are passed on to the system debugger for handling rather
+		than producing the Plat 46 dialog.
+
+3)	Andrew T
+	1)	Fixed regression defect EDNMDON-4DJK8E (from Defect tracking V3.0) as
+		suggested.
+	2)	Added a further check on the message slot handle in
+		Kern::MessageComplete to verify that it lies within the kernel heap,
+		prior to the validity check. This prevents bogus message handles from
+		causing a kernel exception and crashing the kernel.
+	2a)	Modified E32 t_svr test to test the new check.
+
+4)	Andrew B
+	1)	Added virtual "RunError" function to CActive definition in E32BASE.H,
+		and modified CActive::Scheduler::Start() to use new CActive::RunError
+		function when RunL leaves. It is a source compatible but not binary
+		compatible change.
+	2)	Modified U32STD.H to prevent machine-coded versions of CServer::RunL()
+		and CActiveScheduler::Start() being used until the implementations are
+		updated to reflect the changes to the C++ versions.
+	3)	Fixed long-standing defect in CActive::Deque() which stopped active
+		objects being re-added to scheduler. Updated T_ACT.CPP to test
+		CActive::Deque() defect and new RunError function.
+
+Version 1.02.251
+================
+(Made by Morgan, 25/10/99)
+
+1)	Alastair
+	1)	Removed local function loadEnvironmentVariablesL() from
+		KPWINS\KP_INI.CPP.  This change addresses ER5u software problem
+		EDNKDEY-4AAKEW "Long environment variables stop the emulator working".
+		The full emulator (from Mainline build 00019) still appears to work OK
+		without this function.  Note that this change means that F32 will no
+		longer search the system path for DLLs to be loaded dynamically.
+
+	2)	Added code to make it possible to set the User::JustInTime() value
+		from the EPOC.INI file for WINS debug builds, using the syntax
+
+			JustInTime	1	# turn on just-in-time debugging
+			JustInTime	0	# turn off just-in-time debugging
+
+		Presumably only the latter will ever be used since JustInTime
+		debugging is enabled in WINS debug builds by default.  The keyword is
+		case-insensitive.  This change addresses ER5 defect EDN414664 "Should
+		be possible to set User::JustInTime from the EPOC.INI file".
+
+	3)	Refrozen EKERN.DLL for WINS/WINC so that the four functions referenced
+		by ordinal in source code appear at the start of the frozen .DEF file.
+		This means WINS/WINC executables linking to EKERN.LIB will need to be
+		rebuilt with the latest EKERN.LIB before they will run against the
+		latest EKERN.DLL.
+
+2)	Morgan
+	1)	TMachineInfo::iXYInputPresent has become iXYInputType.  Added
+		enum TXYInputType in e32hal.h.  This can take one of the values
+		EXYInputNone, EXYInputPointer, EXYInputMouse (delivers absolute
+		values in mouse events), EXYInputDeltaMouse (delivers relative
+		values in mouse events).
+	2)	Removed MouseButtonDown and SetMouseButtonDown from UserHal and
+		Hal classes.  Binary incompatable change.  Incompatability limited
+		to the functions added last release.
+	3)	Removed unused events from TRawEvent:  EFlipChange, ESimButton*
+		and EPointerMoveBy.  Removed unused TFlipPos from TRawEvent.
+	4)	Updated MMAD emulated-mouse driver to use new API
+
+3)	Alex
+	1)	Added a preliminary version of MMC stack controller and MMC media
+		driver (currently disabled) to the "peripheral bus" drivers family.
+	2)	Added Linda implementation of MMC stack ASSP layer.
+
+4)  Bob
+	1)	Applied suggested fix to TLinda::ArtError and TLinda::IrError in
+		kamad\ka_linda.cpp
+		Reset the fifo only when error condition, not after every byte
+
+5) 	Pete
+		Change to bootloader to support CL-PS7211.
+		Temporarily disabled ADC on Cirrus Logic board due to problems with it.
+
+
+Version 1.02.250
+================
+(Made by Morgan, 27/9/99)
+
+1)	Morgan
+	1)	Added the very random number generator Math::Random and Kern::Random.
+		Any device drivers that can derive random bits from their devices
+		should call Kern::RandomSalt(TUint aBitOfSalt) to mix up the kernel's
+		random pool.  Only the LSB is used.
+	2)	MAWD Arm::IrqDispatch adds random salt from TWind::RtcTickCount()
+		MEIG Arm::IrqDispatch adds random salt from TEiger::RtcTickCount()
+		MISA Arm::IrqDispatch adds random salt from TSa1100::OstData()
+		MCGA Arm::IrqDispatch adds random salt from TCogent::TimerCounter()
+	3)	Added DPowerModel::NotifyEvent called from Kern::AddEvent.  Override
+		this function in your power model to implement auto timeout behaviour.
+			eg
+			DMachinePowerModel::NotifyEvent()
+				{ iLcdPowerHandler->ResetAutoSwitchOffTimer(); }
+	4)	Fixed HW IO mapping problem in the MMAD bootstrap
+	5)	Fixed \e32\rmmad\header.iby.  Now includes screen size.
+
+2)	Chris
+	1)	Fixed bug in TDMA (generic dma) affecting receive transfers large
+		enough to require breaking down into multiple dma operations.
+	2)	Changes to TLinda fns DmaSrcSize() and DmaDestSize().
+	3)	Changed ImpDma::GetInterrupt() and added code to set up the correct
+		device widths of peripherals for dma on Linda.
+	4)	Changed fast ir LDD to store ir frames on 4 byte boundaries.
+	5)	Changed PDD/LDD fast ir interface to be more generic and added
+		Caps/Config.
+	6)	Added incomplete Linda fast ir pdd(difilb). Supports 1M and 4M.
+
+3)	Jonathan
+	1)	Fixed ER5u defect EDNGASR-46SD7V "Special keycodes conflict with
+		Unicode values" by making non-character keys start at 0xff80 and
+		special keys start at 0xff70, within the UNICODE private area.
+			inc\e32keys.h
+
+4)	Petteri
+	1)	Added base mouse support.
+		[Note, this API has not been finalised.  If you use these
+		APIs expect source and binary incompatable changes next
+		release]
+		Files changed:
+		Vmadlc\Vm_hw.cpp	Usrc\Us_exec.cpp
+		Vmadlc\Vm_keyb.cpp	Kpehal\Kph_inf.cpp
+		Vmadlb\Vm_hw.cpp	Kamad\ka_inf.cpp
+		Vmadlb\Vm_keyb.cpp	Kpepoc\Kp_dat.cpp
+		Inc\E32svr.h		Bmarm\Euseru.def
+		Inc\E32hal.h		Bmmad\Ekernu.def
+		Inc\U32std.h		Bmawd\Ekernu.def
+		Inc\M32hal.h		Bmcga\Ekernu.def
+		Inc\M32std.h		Bmeig\Ekernu.def
+		Kaisa\Ka_inf.cpp	Bmisa\Ekernu.def
+		Kacga\Ka_inf.cpp	Bmros\Ekernu.def
+		Kaeig\Ka_inf.cpp	Bwins\Euseru.def
+		Karos\Ka_inf.cpp
+		Keawd\Ka_inf.cpp
+	2)	Added virtual cursor support for Linda
+
+5)	Simon
+	1)	MCGA will now 'dual boot' on CMA120 and CMA102
+
+6)	Alastair
+	1)	Changed GROUP\GENERIC.INF so that ELOCL.DLL is not built for
+		THUMB.
+
+7)  Malcolm
+	1)  Added new feature to rom.bat find template files by scanning
+		the e32/r*/ directories for .oby files.  The config file now
+		simply specifies which one is the default - if this is not
+		present then another template is picked.  The new
+		--list-templates option lists the known templates, along with
+		a description.  The description is picked up from a line in
+		the .oby file starting //#NAME:
+
+	2)	Added ability to reuse rom.oby file in rom.bat (--reuse).
+		This is not recommended but is useful for quick .oby file
+		hacks.  There is a heuristic employed to determine the ASSP of
+		the rom.oby file from its name, or it can be specified
+		directly.
+
+	3)  Changed MAWD, MEIG, MISA, MAD, SROS and SARM bootstraps to
+		pick up the kernel trace mask from the rom header (requires
+		rombuild > 125 to write the info there).
+
+8)	Alex
+	1)	Fixed multiplier for TMillisecondTimer on MMAD, and adjusted
+		delay in keyboard driver.
+
+
+Version 1.02.197
+================
+(Made by Morgan, 26/8/99)
+
+SOURCE-ONLY RELEASE
+Built with MSVC6
+
+1)	Jason
+	1)	Removed Casius MISA variant and all references to FPGA14 from MISA
+	  	code.
+	2)	Uncached screen chunk in \KAISA\KA_INI.CPP to fix stripy cursors.
+	3)	Update the MISA OST timer and match registers (KA_INI.CPP) over switch
+	  	off/on.
+	4)	MISA Seting of RTC clock now wait for one 32KHz tick.
+	5)  MISA Codec sample rate divider functions fixed.
+	6)  MISA Tick code fixed.
+	7)  InitSystemTime() implemented for MISA.
+	8)	MISA Bootstrap now uses correct MMU permissions for page tables.
+		Pagetables unlocked and locked (KA_ISA.CPP) in MISA sleep code.
+	9)	MISA Mini-Cache is now mappable and flushable, using new mappings of
+		EUserRwNotBuff, ESupRwNotBuff.
+	10) \VISABA\VI_HW.CPP variant tidied up with Eikon friendly constants.
+	11) \VISABA\VI_XYIN.CPP	restructured.
+	12) Added OS Timer Watchdog Enable to MISA sleep code and cleared all
+		the OST status bits after wakeup.
+	13) Fixed possible MISA millisecond timer code bug.
+
+2)	Alastair
+	1)	Removed ESOUND.LDD and ESDRV.PDD - these projects are now part of
+		E32TEST.
+	2)	Used #defines in GROUP\GENERIC.INF to ensure that KC_EXE.LIB is not
+		built for THUMB.
+	3)	Moved EUSER from BLD.INF to GENERIC.INF so that it's built only for
+		generic platforms rather than ASSP-specific platforms.  Used #defines
+		so that it's not built for THUMB.
+	4)	Added empty target "FINAL" to GROUP\BOOTROM.MKE.
+	5)	Disabled VC6 warning C4414 - short jump to function converted to near,
+		in UPWINS\UP_I64.CPP and UPWINS\UP_REALX.CPP.
+	6)	Fixed BOOTROM.MKE so that SROS builds correctly report their
+	  	releasable.
+	7)	Added extension makefile KCARM\ABORTH.MKE to copy the correct abort
+		handler object file to \Epoc32\Build\...., and corresponding Perl file
+		KCARM\ABORTH.PL.
+	8)	Changed IBY files in ROMBUILD directory to #include the E32TEST and
+		F32TEST IBY files generated by ABLD TEST ROMFILE.
+	9)	Removed narrow frozen .DEF files.
+	10)	Re-frozen all .DEF files in new format so that the C++ name
+		appears with the mangled name for all exports and windiff can be
+		used to compare frozen .DEF files with generated .DEF files.
+
+3)	Petteri
+	1)	Added a new variant (Vmadlc) for Linda Macro m1.3BB rack.
+
+		Files changed:
+		Group\Bld.inf		Kbmad\E32var.iby
+		Kbmad\Rom.cmd		Kbmad\Rom.oby
+
+		Files added:
+		Vmadlc\Distrib.txt	Vmadlc\Vm_com1.cpp
+		Vmadlc\Vm_com2.cpp	Vmadlc\Vm_hw.cpp
+		Vmadlc\Vm_kdata.cpp	Vmadlc\Vm_keyb.cpp
+		Vmadlc\Vm_pbus.cpp	Vmadlc\Vm_xyin.cpp
+		Inc\V32madlc.h		Group\Cmkdlc.mmp
+		Group\Cmkylc.mmp	Group\Cmxylc.mmp
+		Group\Dmtxlc1.mmp	Group\Dmtxlc2.mmp
+		Group\Vmadlc.mmp	Bmmad\Vmadlc.def
+		Bmmad\Vmadlcu.def
+
+4)	Morgan
+	1)	Improved the MMAD TIdler to perform tickQ correction and to take notice
+		of active millisecond timers
+	2)	Wired in the TRtc class to the SetSystemTime function
+	3)	Corrected ImpMmu::FlushShadow for MMAD
+	4)	Added a flag to MilliSecondTimer so we can tell if the Millisecond
+		timers are being used while in Idle
+	5)	Bug fix to TDma::GetLargestXfer which was delivering odd count values
+	6)	Added initialisation function optimisation for pipe and copy commands
+		in ImpDma
+	7)	Incorporated TLinda::SetStateDiscriminator into the ImpDma
+		initialisation functions
+
+5)	Pete
+	1)	E32 provides the following function to facilitate notification
+		of media change events:-
+		TInt UserSvr::MediaChangeNotify(TMediaDevice aDevice,TRequesStatus *aStat);
+		This currently only supports a single request to be outstanding on any
+		socket at any given time. Hence, for platforms which have more than one
+		socket, it is only possible to be notified of a media change on one of
+		these sockets. This has been changesd to allow a request to be
+		outstanding on each socket.
+	2) 	Removed support for 2nd PC Card socket from VARMPD - no longer have a
+		rack with this h/w functional.
+	3) 	Modified function UserSvr::ForceRemountMedia(TMediaDevice aDevice) to
+		allow a fixed drive as well as a removable drive to be specified. It
+		can now be called after having installed a new media driver to force
+		a remount on the appropriate drives. This fixes a problem where a new
+		driver for a fixed device is loaded but there is no way to force F32
+		to remount the local drives associated with the media driver.
+	4)	Modifications to Varmca variant:
+		- Alterations to reflect changed GPIO allocation for the LCD interface
+		on Rev.B evaluation board.
+		- Enabled diagnostic LED.
+		- Enabled SPI-ADC device.
+
+6)	Chris
+	1)	Added mouse driver to Cogent + hardware cursor.
+	2)	Changed name of serial driver on Cogent to that expected by Romkit.
+	3)	Tidied up fast ir.
+	4)	Changed unit masks for Com2 and Com3 on Brutus.
+	5)	Modified Cogent serial drivers. Passes T_Serial.
+
+
+7)	Jonathan
+	1)	Removed kc_exc.cpp and ke_exc.cpp from all distributions until IPR
+		issues are clarified.
+
+8)	Dennis
+	1)	Added __SWITCH_TO_ARM and __END_ARM macros for use in test programs to
+		enable them to build in THUMB without rewriting assembler code.
+	2)	Modified test ROM build script to work with new GCC.
+	3)	Initialise .data and .bss for ROM-resident device drivers when driver
+		is loaded.
+	4)	Corrected TLocDrv::Caps(TDes8& aCapsBuf) so it doesn't assume that the
+		descriptor parameter is a TBuf8.
+	5)	Removed Kern::Printf() from Kern::PowerGood() - this causes the serial
+		driver to lock up since it gets called in the serial driver's ISR.
+	6)	Modifications to ROM.BAT:
+		Added --inst option to specify instruction set. If not specified,
+		defaults to first instruction set listed for the ASSP in ROM.CFG.
+		Build (--build) can now be UDEB or UREL only. If not specified,
+		defaults to the first build listed in ROM.CFG (ie UDEB).
+		Changed format of ROM.CFG - [VARIANTS] section has been scrapped.
+		[ASSPS] section now lists for each ASSP the ROMBUILD flags to use, the
+		variants supported and the instruction sets supported.
+
+9)	Simon
+	1)	Mouse is now optional, ie doesn't hang if no mouse connected
+
+
+Version 1.02.196
+================
+(Made by William, 13.8.99)
+
+SOURCE-ONLY RELEASE
+Built with MSVC6 and ARMv4 (GCC 518).
+
+CHANGES TO RELEASABLE
+1)	William
+	1)	CAKD*.MMP files no longer specify ASSP_LIBRARY EKERN.LIB, so that they
+		can be built correctly for THUMB.
+
+	2)	U32STD.H now defines __SUPPORT_THUMB_INTERWORKING for ARMv4T, using
+		#ifdef __ARM_ARCH_4T__ to distinguish between MAWD compiled with the
+		new GCC and MAWD compiled with the old toolchain.
+
+	3)	The GCC "_call_via_rX" helper functions required by THUMB code are
+		hacked into up_dll.cpp and uc_exe.cpp. This should be removed and
+		replaced by the proper GCC.LIB mechanism.
+
+	4)	RequestComplete tracing is now conditional on KTHREAD+KSEMAPHORE
+
+	5)	BOOTROM.MKE CLEAN target now removes intermediate .o files
+
+
+Version 1.02.195
+================
+(Made by Alastair, 2.8.99)
+
+SOURCE-ONLY RELEASE
+Built with MSVC6
+
+CHANGES TO RELEASABLE
+1)	Alastair
+	1)	E32 now releases zip files for ARMI, ARM4 and THUMB in the same style
+	  	as it's other releasables.  Note that generic EUSER.LIB and EDISP.LIB
+	  	are still released with the ASSP-specific releasables, though all
+	  	other generic stuff is now contained in the 3 new zip files.  To use
+	  	these releasables it's necessary to use E32TOOLP version 120 and the
+	  	new GCC compiler.
+
+		This change is academic for this release since it's source-only, also
+		it has, in fact, been built with the old gcc compiler.
+
+1)	Alastair
+	1)	Hopefully fixed ER5u defect EDNDMAI-49UE4V
+		'"KERN RE-ENTRANT" Panic' in KPWINS\KP_UTL.CPP by converting the
+		UNICODE RDebug::Print text to NARROW 256 characters at a time using
+		a stack variable rather than allocating space on the heap.
+
+	2)	Fixed ER5 defect EDNKDEY-45NHVH
+		"Unhandled exception checking for priority key (emulator only)" in
+		WSRC\KY_TRAN.CPP by making sure that capture key data is not left
+		uninitialised when Windows produces a character code that the EPOC
+		translation tables didn't.
+
+	3)	Fixed ER5u defect EDNWROS-46YC3V "Plat fault or Plat panic?" in
+		KPWINS\KP_UTL.CPP so that the Fault/Panic distinction is part of the
+		text inside the alert box rather than just in the title where nobody
+		ever thinks to look.
+
+	4)	Split BLD.INF into BLD.INF and GENERIC.INF with GENERIC.INF containing
+		details of those projects which are not ASSP-specific.  This change
+		corresponds to changes in E32TOOLP version 120 and is designed to
+		support building E32 with the new GCC compiler for the new targets.
+		To build E32 it is now necessary to build the generic libraries, then
+		the ASSP-specific libraries, then the generic releasables, then the
+		ASSP-specific releasables.
+		Updated .OBY files so that, if E32 is built with the old GCC compiler,
+		they will look for the generic releasables in the right places.  They
+		will need more updating to work with the new compiler though.
+
+	5)	Changed EKERN.MMP and KC_EXE.MMP so that EKERN links to KC_EXE.LIB
+		rather than KE_EXE.LIB under MAWD.
+
+	6)	Now building E(EXE|DLL).LIB rather than E(EXE|DLL).o under MARM and
+		E(EXE|DLL).obj under WINS.  This means that using this version of
+		E32 requires E32TOOLP version 120.
+
+	7)	Changed E32DEF.H so that WINS/WINC warning C4710, about functions not
+		being inlined, is disabled for MSVC versions 5 or later, rather than
+		just MSVC5.
+
+	8)	Commented out user-side tracing macros under WINS/WINC builds in
+		INC\U32STD.H because they cause the kernel to go re-entrant.  This
+		should be investigated further.
+
+	9)	Integrated changes for compiling with VC6 from Ann Windsor and William
+		Roberts.  Changes to EKERNU.DEF and EUSERU.DEF mean that this release
+		of E32 will not build with MSVC5 and the import libraries from this
+		release will not be compatible with MSVC5.
+
+2) Malcolm
+	1)  Enabled debug monitor for SROS, and protected some MMU
+		instructions for single builds.
+	2)	Added new trace level, KMEMTRACE that dumps alloc/free/realloc and
+		chunk adjustments (chunks in SINGLE only) to the debug log
+
+3) Morgan
+	1)	Made Mmu::AllocPageTable public so it can be accessed by the debugger
+	2)	Added MMAD-specific debugger implementation, and null debuggers for
+		those platforms without support
+	3)	Moved useful ARM Mmu definitions into kcarm\kc_mmu.h
+	4)	MMAD debugger now updates the thread id register, remaps the Rom
+		as small pages, and allocates some free pages for SW breakpointing.
+	5)	Removed explicit references to variants from KC_UTL.CPP and removed
+		reference to the Eiger variant (V32ARM.H) from the global header
+		KC_STD.H.  Pushed P::StartupBeep into the ASSP layer.  Re-organised
+		P::OutputToCom1 functionality so the variant is only referenced in
+		ASSP layer. Changed P::ScreenInfo() to use the Hal function instead
+		of calling the variant directly.
+	6)	Defined TExtInterrupt in KC_STD.H, but it should really be moved into
+		the Eiger platform which seems to be its only client.
+	7)	Modified the Asic::Debug* functions for all ASSPs
+	8)	Added MMAD interfaces for the Psu and Rtc to V32MAD.H and wired them
+		into the kernel
+	9)	Implemented EDNWROS-49ZKUX "Unhelpful trace message"
+
+4) Dennis
+	1)	Added alignment checking on 16-bit descriptor functions in DEBUG mode.
+	2)	Modified User::HandleException() to trap leaves by the exception
+		handler and pass them on after clearing the last chance flag and doing
+		User::WaitForAnyRequest();
+
+5) Chris
+	1)	Added slow ir pdd for Linda (dmtxlb2).
+	2)	Added serial pdd for Cogent (datxcg1 and datxcg2).
+	3)	Made small change to Brutus slow ir pdd (ditxba2).
+
+
+Version 1.02.189
+================
+(Made by Kal Patel, 22nd July 1999)
+
+1)	Jonathan
+	1)	TStringToDateTime::NextToken():
+		Fixed defect EDN830354: Allow am/pm designators to be non-alpha and >3
+		characters.
+		Reapplied and reworked an ER5 ICF (defect EDNANOE-49BFV2): Match
+		against abbreviated month names instead of leading substrings of
+		months.
+		usrc\us_parse.cpp
+
+2)	Morgan
+	1)	Added an implementation of TMillisecondTimer for MMAD
+		kamad\ka_pic.cpp
+	2)	Implemented workaround for ARM915T MMU MCR instruction bug
+		Interrupts are disabled over writes to the domain access control
+		register
+		kcarm\kc_int.cpp
+		kcarm\kc_sched.cpp
+		inc\kc_std.h
+	3)	Fixed the definition of delta and tick TTimerModes
+		inc\v32linda.h
+	4)	Added a new class TIdler, that switches off rescheduling and the tick
+		during idle, and reenables it shortly before a timer is due.
+		kamad\ka_idle.cpp
+		kamad\ka_std.h
+	5)	Exported functions from DPowerModel for those power models that
+		are implemented outside of the platform kernel
+		inc\k32power.h
+		ksrc\ks_power.h
+	6)	Moved the MMAD variant to VMADLB, and invented a custom layer suitable
+		for MMAD.  VARMLB.DLL is now VMADLB.DLL. CA*LB.DLL is now CM*LB.DLL.
+		DATXLB1.DLL is now DMTXLB1.DLL.
+		varmlb\*
+		inc\v32mad.h
+		inc\v32madlb.h
+		group\ca*lb.mmp
+		group\varmlb.mmp
+
+3)	Alastair
+	1)	Added RESOURCE target to GROUP\BOOTROM.MKE.
+	2)	Removed defunct .DEF files from BSARM, BSCGA and BSROS.
+	3)	Removed defunct UPEPOC\UP_CON.CPP.
+	4)	Removed defunct BLD.CMD files from various directories.
+	5)	Updated GROUP\E32.FTC to include the MCGA releasables.
+	6)	Changed GROUP\BOOTROM.MKE to copy KBMCGA\COGENT.BIN to
+		\EPOC32\Release\MCGA\BOOTROM.BIN.  Updated KBMCGA .OBY files
+		accordingly.
+	7)  Changes to support building with new compiler (*.oby files,
+		/group/mnt.bat files, /group/bld.inf files etc)
+
+4)	Simon
+	1)	Fixed problem with cogent timer interrupt going off for no good reason
+		kacga\ka_pic.cpp
+	2)	Fixed problem in vcgac1\va_keyb.cpp that caused intermittent exceptions
+
+5)	Malcolm
+	1) Added new RAM Loaded code functionality
+	2) Modifications for Unicode SROS
+	3) Incorporated Kista-Patch-Baseport-3.00-990717A
+		kbros/rose.inc
+		vrosr1/va_xyin.cpp
+		karos/ka_rose.cpp
+		INC/D32COMM.H, INC/V32Rose.h
+		vrosr1/va_coms.cpp
+		group/DATXR11.MMP
+		group/bld.inf
+
+6)	Kal
+	1) Added the Aort handler functionality for flash filing system use
+		karos/ka_ini.cpp
+		karos/ka_excep.cpp
+		karos/ka_std.h
+		karos/ka_rose.cpp
+		WSRC/wd_rose4.cpp
+		group/EKERN.MMP
+		INC/V32Rose.h
+	2) Added Fast Timers on A1C
+		karos/ka_rose.cpp
+		karos/ka_pic.cpp
+		karos/ka_std.h
+		INC/distrib.txt
+		INC/V32FTick.h
+		group/bld.inf
+
+
+Version 1.02.188
+================
+(Made by Dennis, 13th July 1999)
+
+1) Morgan
+	1)	Removed the SPI controller from MMAD platform
+		kamad\ka_spi.cpp
+		kamad\ekern.mmp
+		kamad\ka_psu.cpp
+	2)	Used a more efficient method for draining the write buffer on MMAD
+		kcarm\kc_mmu.cpp
+		kamad\ka_ini.cpp
+	3)	Included a missing call to POS in the slow swi dispatcher
+		kcarm\kc_int.cpp
+	4)	Frozen BMMAD
+		bmmad\*.def
+	5)	Added a gcc-helper static library (EGCC.LIB) which currently
+		only contains the __fixuns* helper functions
+		upepoc\up_gcc.cpp
+		group\egcc.mmp
+	6)	Implemented RTC emulation
+		kamad\ka_utl.cpp
+		kamad\ka_std.h
+		kamad\ka_pic.cpp
+	7)	Added state discriminator functions to TLinda and updated Linda Dma
+		kamad\ka_dma.cpp
+		kamad\ka_linda.cpp
+		inc\v32linda.h
+
+2) Petteri
+	1)	Added an improved version of
+		varmlb\va_keyb.cpp
+
+3) Alastair
+	1)	Added Graham Asher's updates to his change to UMATH\UM_DTOR.CPP so that
+		it builds in narrow variants.
+	2)	Added GROUP\BOOTROM.MKE - a bldmake-compatible custom-build makefile
+	  	for building bootstraps.
+	3)	Removed some hacks from MNT.BAT now that MAKMAKE from E32TOOLP version
+		109 builds static libraries to \EPOC32\Release\MARM rather than
+		\EPOC32\Release\MEIG.
+	4)	Moved \e32\inc\conswins.def to \e32\inc\econs.def and listed it for
+		export to \epoc32\release\wins\econs.def.  Made a corresponding change
+		to \e32\inc\consmarm.def and removed \e32\inc\consmisa.def.
+	5)	Moved the implementation of the RConsole and TConsoleKey classes into
+		EWSRV.DLL from ECONS.DLL. Stopped exporting all functions from the
+		CConsoleTextWin Class under WINS/MARM except the function to create a
+		new console.  Removed the dummy export from the text window server.
+		This means there is no longer a mutual link-time dependency between
+		ECONS.DLL and EWSRV.DLL - ECONS.DLL merely depends upon EWSRV.DLL, and
+		the WINS ECONS.DLL has the same API as the WINC one. and not vice
+		versa.
+	6)	Added fetcher definition file, E32.FTC, to the group directory.
+	7)	Fixed ER5U defect EDNABRY-48YFUC "Compiling E32 with MSVC6 reveals
+	  	problems with TPtr8 and TPtr16 copy constructors."
+		Fixed in USRC\US_DES8.CPP by taking the contents of the function
+		TPtr8::Set(TPtr8 &aPtr) function and adding it to function
+		TPtr8::TPtr8(const TPtr8& aTPtr).  This change is not binary compatible
+		backwards with code which calls the TPtr8 copy constructor either
+		explicitly or implicitly and relies upon the previous behaviour of the
+		copy constructor.  The previous behaviour merely made sure that the
+		copied TPtr pointed to the same descriptor as the original TPtr, while
+		the new behaviour also makes sure that the TPtr's iType is set
+		correctly.
+		These changes were necessary for TPtr8s to work correctly when compiled
+		with MSVC6.  I have made corresponding changes to the TPtr16 copy
+		constructor.
+	8)	Changed KPWINS\KP_GUI.CPP so that the Windows character code
+		translation is suppressed if the Ctrl, Alt and Shift keys are all
+		depressed.  This means that the heap-checking code for APPs which used
+		the Ctrl-Alt-Shift-A combination will now work again, as the EPOC key
+		translation will not be overridden by the Windows translation.
+
+4) Chris
+	1) 	Added export to mmu to enable creation of DHardware chunk from Ram.
+	2) 	Slight change to TDma to allow it to break up non-contigous transfer
+	   	buffers.
+	3) 	Added fast infra-red LDD(Efir) to misa and mmad and a fast infra-red
+	   	PDD(Difiba) to misa.
+	4) 	Changes to TSa1100 variant class to implement infra red and dma on
+	   	misa.
+		ImpDma class impemented also for misa.
+	5) 	Added 572000,1152000 and 4000000 baud defs to d32comm.h.
+
+5) Dennis
+	1)	Added routine ImpExc::AdjustRegisters() to restore registers on ARM
+		processors to allow an aborted instruction to be retried.
+	2)	Added TException::Bind(), TException::UnBind() exported functions to
+		allow device drivers to bind to exceptions.
+	3)	Various Snowdrop-specific fixes which didn't make it for ER5.
+	   (Euro, Digitiser factory settings, Windermere DRAM refresh, ROM size,
+	   digitiser EEPROM calibration)
+	4)	Prefetch aborts now have exception ID EExcCodeAbort instead of
+	  	EExcGeneral.
+	5)	Added ExecHandler::RomHeaderAddress() to windermere kernel.
+	6)	Rearranged VAWDB1U.DEF so that VariantInitialise__Fv is at ordinal 1
+		(this is necessary or else nothing works).
+	7)	Fixed bug in new RTest where RDebug::Printf(_L("<string>")) would panic
+		if <string> contained a % character. This was due to <string> being
+		passed into AppendFormatList which was then interpreting the % as a
+		format specification.
+	8)	Modified assembler code in EUSER to allow thumb interworking by making
+		all subroutine returns and indirect function calls use the BX
+		instruction.  Macros have been used so that the ARM-only version with
+		no BX instructions can still be built - this is necessary for
+		StrongARM builds.
+
+		Macros employed are:
+
+		__JUMP(cc,r) = BXcc r or MOVcc PC, r
+		__POPRET(rlist) = LDMFD SP!, {rlist,lr} \ BX lr or LDMFD SP!,{rlist,pc}
+		__CPOPRET(cc,rlist) = LDMccFD SP!, {rlist,lr} \ BXcc lr or LDMccFD SP!, {rlist,pc}
+
+		NOTE: Thumb interworking is still disabled by default, since the new GCC
+		is not yet fully deployed.
+
+	9)	Made minimal modification to EKERN to permit thumb user code to execute
+		correctly. This involves changing two instances of "mov pc, lr" in the
+		SWI handler to __JUMP(,lr) and also involves changing
+		DArmPlatThread::CallFunction to use separate routines depending on
+		whether an ARM or THUMB context is being modified. Also, when saving
+		context following a SWI call, the saved PC points to a BX instruction
+		instead of to the return address from the Exec:: function.
+
+		NOTE: All supervisor mode code is expected to be ARM. Much more
+		extensive modification of the kernel would be required to permit THUMB
+		device drivers.
+
+	10)	Compiled and tested E32 with the new version of GCC. This produces
+		several warnings, mostly "comparison of signed and unsigned", "ANSI
+		C++ does not permit declaration without type", "Taking address of
+		temporary" and "XXX declared but not used" (for variables or functions
+		only used from within assembler code). Modified the source to remove
+		these warnings.
+
+	11)	Compiled and tested E32 using THUMB test executables. These all work
+		apart from those which contain ARM assembler code.  Disabled
+		breakpoint exception since this can crash the kernel with an alignment
+		fault if an undefined instruction is encountered in THUMB code.
+		Fixing this properly would require a lot of work on the debugger to
+		fully support THUMB.
+
+		NOTE: To build THUMB executables, the _call_via_r0() helper functions
+		are required. These were added to EEXE.O for testing purposes, but will
+		eventually be in the GCC helper library.
+
+	12)	Modified TDes::AppendFormatList() so that variable precision
+		specifications are now allowed, and so that the precision
+		specification is also applied to strings.
+
+6) Simon
+	1)	Improved ps/2 keyboard initialisation within kacga
+
+7) Mark
+	1)	Enabled unicode WINS/WINC to run on Windows 9x. Introduced euniw.dll
+		to convert between unicode and relevant narrow Win32 functions.
+		Added exported set of functions to euser.dll that return a pointer
+		to either the relevant 'W' Win32 function or a wrapper function in
+		euniw.dll. These functions and the initialisiation of the function
+		pointers is implemented in upwins\up_uansi.cpp.
+	2)	Changed unicode to narrow WINS/WINC conversion from UTF-8 to
+		CP_ACP in WinCOutput::Write and Debug::DebugFunction.
+
+Version 1.02.187
+================
+(Made by Alastair, 9.6.99)
+
+
+1)	Jason
+	1)	Added sleep and wakeup code for MISA
+	2)	Enabled LCD and Keyboard for Brutus wakeup.
+	3)	Added MCP controller accessor functions for MISA
+	4)	Modified power model to share MCP clock
+	5)  Added definitions for the Brutus UCB1200 codec chip.
+	6)	Added touch screen controller for Brutus, including touch to wakeup.
+	7)  Fixed Brutus keyboard controller to not enable interrupt edges that it
+		does not use.
+	8)  Added the missing function TSa1100::UartTxBusy() to MISA
+		\inc\v32s1100.h
+			\v32ucb12.h
+		\kaisa\ka_isa.cpp
+			  \ka_ini.cpp
+			  \ka_power.cpp
+			  \ka_power.h
+		\kbisa\sa1100.inc
+			  \sa1100.s
+		\visaba\vi_hw.cpp
+			   \vi_keycn.cpp
+			   \vi_xyin.cpp
+
+2)	Morgan
+	1)	Made Mmu::UnlockPageTables and Mmu::LockPageTables public so
+		code that calls Mmu::LogicalToPhysical() can unlock and
+		access the page tables.
+		\inc\m32hal.h
+	2)	Unlocked the page tables in TDma::NextBlock() function
+		\kpepoc\kp_dma.cpp
+
+3)	Petteri
+	1)	Added Linda serial driver.
+	2)	Added 230.4K speed to d32comm.h and modified old serial drivers
+		to dislike it.
+		\group\datxlb1.mmp
+		\inc\d32comm.h
+			\v32linda.h
+		\kamad\ka_linda.cpp
+		\varmca\va_com1.cpp
+			   \va_com2.cpp
+		\varmcl\va_com1.cpp
+			   \va_com2.cpp
+		\varmlb\va_com1.cpp
+		\varmp2\va_com1.cpp
+		\varmpb\va_com1.cpp
+		\varmpc\va_com1.cpp
+			   \va_com2.cpp
+		\varmpd\va_com1.cpp
+			   \va_com2.cpp
+		\vawdb1\va_com1.cpp
+			   \va_com2.cpp
+
+4)	Graham Asher (merged by Jonathan)
+	1)	Implement standard Unicode collation and add new collation functions
+		to allow loose matching.
+	2)	Fill up all the available TLanguage slots (00 to 99); codes added
+		include those requested for Roxette; this is a provisional solution
+		pending the introduction of a saner language and locale number API.
+	3)	Fix problems in TLex16::Val(TRealX&,TChar) &
+		TLex16::Val(TReal64&,TChar) in Unicode-to-8-bit conversion (defect
+		EDN769607).
+	4)	Obsolete functions yet to be removed:
+		TInt TDesC16::CompareC(const TDesC16& aDes,const TInt16*
+							   aCollationRules) const;
+		TInt TDesC16::CompareC(const TDesC16& aDes,TUint32
+							   aDesiredCollationRulesId,TUint32&
+							   aActualCollationRulesId) const;
+		static TInt Mem::CompareC(const TUint16* aLeft,TInt aLeftL,const
+								  TUint16* aRight,TInt aRightL,const TInt16*
+								  aCollationRules);
+		static TInt Mem::CompareC(const TUint16* aLeft,TInt aLeftL,const
+								  TUint16* aRight,TInt aRightL,TUint32
+								  aDesiredCollationRulesId,TUint32&
+								  aActualCollationRulesId);
+		static TInt Mem::CollationRuleSets();
+		static TInt Mem::CollationRuleSetId(TInt aIndex);
+		static const TInt16* Mem::CollationRuleSetByIndex(TInt aIndex);
+		static const TInt16* Mem::CollationRuleSetById(TUint32
+													   aDesiredId,TUint32&
+													   aActualId);
+
+5)	Jonathan
+	1)	Fixed "ambiguous overload for `bool ? TChar : char'" errors from new
+		gcc compiler.
+			umath\um_rtod.cpp
+
+6)	Alastair
+	1)	To build this release of e32tools you'll need the latest version - 108
+		- of E32toolp.  If you're going to use this release at all, you'll
+		need to be building your component with the latest version of
+		e32toolp, since import libraries are only released in the MARM release
+		and WINS debug directories and also because EDLL.O and EEXE.O won't
+		link properly with older versions of e32toolp.
+	2)	Renamed MARM platform to MEIG and SARM platform to SEIG just as far as
+		E32 is concerned.  Other components will still build for the MARM (and
+		SARM) platforms.  This change means that rombuild obey files will need
+		to change to reflect the new location of e32 releasables in
+		\EPOC32\Release\Meig instead of \EPOC32\Release\Marm.
+	3)	Changed zips of releasables put onto the network. There is now one zip
+		file for each platform.  There is also a zip file for exported header
+		files.  Hence, the contents of S:\e32\zip includes
+			export.<ver>, wins.<ver>, meig.<ver>, misa.<ver> ,mawd.<ver> winc.<ver>.
+		Each of the meig, misa and mawd zip files should contain everything
+		necessary for building components which depend on E32 for marm.
+		The files within these zip files now also have full pathnames so ensure
+		you unzip them into the root of your EPOC drive with any flags required
+		to recreate the directory structure.
+	4)	Added new MAKMAKE keyword ASSPEXPORTS to various .MMP files so that
+		they search ASSP-specific deffile directories rather than CPU-specific
+		deffile directories by default.  E.G. EKERN.DLL built for narrow MISA
+		REL will refer to \E32\BMISA\EKERN.DEF rather than
+		\E32\BMARM\EKERN.DEF.  These .MMP files are for EKERN, EPBUS, VARMCL,
+		VARMLA, VARMLB, VARMP2, VARMPB, VARMPC, VARMPD, VAWDB1, VISABA,
+		VISACA, VROSR1, VCGAC1, VARMCA.  This keyword means that the import
+		library for a project build for MEIG will go into
+		\EPOC32\Release\MEIG\<rel|urel>\ rather than
+		\EPOC32\Release\MARM\<rel|urel>\.
+
+		Where .MMP files have links to the import libraries for these
+		components I have listed the libraries with new keyword ASSPLIBRARY
+		and taken them out of any existing LIBRARY statements.  This ensures
+		that the generated- makefile will search in the correct place for the
+		import library.  Any other components linking to these libraries will
+		have to do the same thing.
+	5)	Kernel include headers are now exported to \EPOC32\Include\Kernel
+		rather than \EPOC32\Include, so if your component includes these
+		headers you'll need to add \EPOC32\Include\Kernel as a SYSTEMINCLUDE
+		file in your .MMP file.
+	6)	Added new command, MNT CHECKREL, to check that all releasables are
+		present before doing an MNT PUTREL.
+		Before doing MNT CHECKREL or MNT PUTREL call BLDMAKE -v RELFILES to
+		create the lists of releasables.
+	7)	Changed edll, exdll, eexe and kc_exe so that they all build as static
+		libraries rather than object files in accordance with ER5u makmake
+		changes.
+	8)	Changed second uids in device driver .MMP files to zero so that makmake
+		will apply the correct ones automatically.
+	9)	Changed .MMP files to take advantage of changes in makmake .MMP
+		#defines.
+	10)	Replaced all B[plat].PRJ files for use with BLDMAKE with BLD.INF in
+		accordance with latest BLDMAKE changes.
+	11)	Moved ETIMR and T_DEVC to project E32TEST.
+	12)	Removed all E*.REL files from GROUP directory and changed MNT.BAT so
+		that MNT PUTREL looks for .REL files generated by BLDMAKE instead.
+		Updated BLD.INF accordingly.
+	13)	Changed #defines in the following files now that __MEIG__ is being used
+		to mean __MARM__ and __MARM__ is being used to mean ARM CPU:
+			INC\U32STD.H, INC\M32STD.H, PSRC\PS_PCCD.CPP,
+			KCARM\KC_INT.CPP, DPEPOC\D_MEDINT.CPP, DPEPOC\D_MEDCRR.CPP,
+			DPEPOC\D_MEDCRM.CPP, DPEPOC\D_MEDATA.CPP.
+	14)	Removed EVALID.PL and EVALID.BAT from GROUP dir now that this version
+		of EVALID is being released as part of E32TOOLP.
+	15) Created directory \E32\BMEIG.  Moved .DEF files for the following
+		projects from \E32\BMARM\ to \E32\BMEIG:
+			EKERN, EPBUS, VARMCL, VARMP2, VARMPB, VARMPC, VARMPD.
+	16)	Removed unnessary __XCON__ #defines and swapped them with __WINC__
+		instead where necessary.
+	17)	Removed XWSRV.MMP, XPBUS.MMP, XCONS.MMP, EXYIN.MMP and EKEYB.MMP - they
+		were no longer required now that libraries can be built separately.
+		Note that this means the import libraries must be built before building
+		the other releasables because of the mutual imports between some E32
+		Dlls.
+	18)	Changed variant .MMP files to link to the respective variant versions
+		of exyin.lib and ekeyb.lib now that exyin.lib and ekeyb.lib are no
+		longer built as import libraries.
+	19)	Removed WINS #defines from around the dummy export for the text window
+		server so that it has a dummy export for other builds.  Frozen the dummy
+		export in \E32\BMARM\EWSRV.DEF.
+	20)	Removed export command from MNT.BAT and EXPORT.PL from group directory
+		now that and equivalent command is provided by BLDMAKE.
+	20)	CONSWINS.DEF, CONSMARM.DEF and CONSMISA.DEF are now exported to
+		directory \EPOC32\Release\<Platform>\ rather than \EPOC32\Include.
+	21)	Changed #defines in K32ADDR.H, U32STD.H, V32COG.H in accordance with
+		makmake #define changes for __SROS__ and __SCGA__.
+	22)	Adjusted BLD.INF so that kernel headers are exported to
+		\EPOC32\Include\Kernel\ rather than \EPOC32\Include.  This means that
+		any projects requiring the kernel headers will have to have
+		\EPOC32\Include\Kernel added to the list of SYSTEMINCLUDE paths within
+		their .MMP files.
+	23)	Removed all .DEF files from the B<plat> directories which are now
+		referenced in the BMARM directory.  Renamed BSROS BMROS and removed
+		BSARM and BSCGA.
+	24)	Added extra commands to MNT.BAT to copy edll.o and eexe.o from the MEIG
+		release directories to the MARM ones pro tem, and to zip them up for
+		MEIG, MAWD and MISA.
+	25)	Changed rom.oby files in KBARM and KBSARM directories to incorporate
+		changes resulting from the new way E32 is built.  A few changes in
+		other rom.oby files may also be required.
+	26)	Excluded Graham Asher's change to UMATH\UM_DTOR.CPP since they won't
+		build in narrow variants.
+	27)	Fixed up MEIG EKERN.DEF following Pete's DMedia changes.
+	28)	Changed P::Print so that in release builds it uses Win32's
+		OutputDebugString() rather than putting up a message box.  This has
+		always been the behaviour in debug builds.  As a result of this change,
+		test output will no longer appear in an annoying sequence of message
+		boxes.
+
+7)	Pete
+	1) 	Modification to DMediaDriver class so a media driver
+		can be configured to allow read/write/format requests simultaneously
+		with each other. By default, a driver only allows one
+		request to be outstanding at any time but by setting the
+		DMediaDriver member iFlags to KMediaDrvMultipleReqs,
+		a read/write and format command may each be outstanding at a given
+		time.
+		\ksrc\ks_locd.cpp
+		\inc\k32std.h
+		\inc\k32std.inl
+
+Version 1.02.186
+================
+(Made by Malcolm, 21st May 1999)
+
+Petteri
+	1)	Added a new variant (Varmca) for the Rev.A of the new Cirrus
+		Logic 711X evaluation board. This port is not complete: digitiser
+		driver, most of ADC code, second serial port and some other
+		small things are missing. Also, the board is still evolving.
+
+		New files added:
+		Varmca\Va_c6700.cpp	Group\Cakdca.mmp
+		Varmca\Va_com1.cpp	Group\Cakyca.mmp
+		Varmca\Va_com2.cpp	Group\Caxyca.mmp
+		Varmca\Va_hw.cpp	Group\Dasnca.mmp
+		Varmca\Va_kdata.cpp	Group\Datxca1.mmp
+		Varmca\Va_keyb.cpp	Group\Datxca2.mmp
+		Varmca\Va_pbus.cpp	Group\Varmca.mmp
+		Varmca\Va_sdrv.cpp	Inc\V32armca.h
+		Varmca\Va_spi.cpp
+		Varmca\Va_xyin.cpp
+		Varmca\Va_std.h
+
+		Old files modified:
+		Group\Bmarm.prj
+		Group\Emarm.rel
+		Kbarm\E32var.iby
+		Kbarm\Rom.oby
+		Kbarm\Setvars.cmd
+		( and also:
+		Kamad\Ka_linda.cpp
+		Inc\V32linda.h )
+
+Jason
+	1)	MISA Idle code fix.
+		\kaisa\ka_utl.cpp
+		\kcarm\kc_int.cpp
+		\kbisa\sa1100.s
+
+Jonathan
+	1)	Added Protea, Cassius and inc{c|k} files to distrib.txt files
+		bmarm\distrib.txt
+		bmisa\distrib.txt
+		inc\distrib.txt
+		group\distrib.txt
+
+Version 1.02.185
+================
+(Made by Malcolm, 14th May 1999)
+
+Malcolm et al.
+	1)  Prepared E32 for automatic building and testing.  Each kbXXX
+		directory should now have the following files:
+
+		rom.cmd that takes an .oby file as the first parameter (and
+		then the standard build/variant as before).
+		test.oby that builds a rom with all the test code for that
+		platform.  Test.oby should also include batch files called
+		z:\test\e32auto.bat, z:\test\f32auto.bat and
+		z:\test\allauto.bat that run respectively the e32, f32 and all
+		tests for this platform.  For now, these are taken from
+		\e32test\group./
+		bld.cmd that creates udeb and urel roms, given that all of
+		e32, f32 and the test suites have been built.  Typically this
+		makes the bootstrap code then calls rom.cmd.
+
+		This change has been implemented for misa, marm, mcga & sros.
+
+
+Alastair
+	1)	Changed RDebug::Print for WINS/WINC so that output is appended to file
+		EPOCWIND.OUT in the PC's temporary directory, as well as being sent
+		where it is currently.  In UNICODE builds, the output is converted to
+		UTF-8 before being appended to the file.
+	2)	Changed WINC Console output under UNICODE builds so that it can be
+		redirected to a file.  The output is converted to UTF-8 before being
+		sent to the console.
+
+Simon
+	1)	Merged in Cogent
+		\kacga\*
+		\bmcga\*
+		\vcgac1\*
+		\wsrc\wd_vgacga.cpp
+		\wsrc\wd_vtcgakb.cpp
+
+	2)	Modified coproc related bits for ARM4 on Cogent
+		\kcarm\kc_sched
+		\kcarm\kc_mmu
+
+Petteri
+	1)  Minor Linda screen and keyboard related changes.
+		\kamad\ka_ini.cpp
+		\kamad\ka_linda.cpp
+		\inc\v32linda.h
+		\varmlb\va_hw.cpp
+		\varmlb\va_keyb.cpp
+		\wsrc\wd_mad.cpp
+
+
+Malcolm
+	1)  Changes to mnt.bat.  Directories are now enummerated in
+		dir.prj rather than being hard-coded into mnt.bat all over the
+		place.  Two perl helper scripts have been created to interface
+		to PVCS.
+		\group\mnt.bat
+		\group\dopvcs.pl
+		\group\lock.pl
+		\group\dir.prj
+
+
+Petteri
+	1)  Minor changes in order to tidy up DisplayOn()
+		\kamad\ka_ini.cpp
+		\inc\v32linda.h
+		\varmlb\va_hw.cpp
+		\wsrc\wd_mad.cpp
+
+
+Petteri
+	1)  Speed improvements to Linda screen driver.
+		\wsrc\wd_mad.cpp
+
+	2)  Modified keyboard related files so that Linda keyboard
+		driver works properly.
+		\varmlb\va_keyb.cpp
+		\varmlb\va_kdata.cpp
+		\group\cakylb.mmp
+
+
+Malcolm
+	1)  Upgraded the MNT DISTRIB command to cope with per-file
+		inclusion/exclusion.  Now uses perl to parse distrib.txt
+		files.  These files have changed in format.  The format is
+		now lines of the format:
+		<filename>   <licensee>
+		If the filename is Default, then all the files in this
+		directory will be included.  If the licensee text contains
+		"Epoc" then this is part of the generic release.
+		To always exclude a file I suggest using a licensee of "Never".
+		Comments can be started with the # character and last to the
+		end of the line. \inc\distrib.txt and \group\distrib.txt files
+		are good examples.
+		The distrib.txt files themselves are never included.
+		At the moment, this script requires pkzip version 2.5, called
+		pkzip25 to be in the path.  This is due to limitations with
+		the previous versions of pkzip.
+		\group\distrib.pl
+		\group\mnt.bat
+		\*\distrib.txt
+
+	2)  Fixed single process scheduler bug
+		\kcarm\kc_sched.cpp
+
+	3)	Merged in Simon's automatic test changes.
+		\usrc\us_test.cpp
+		\inc\e32test.h
+
+	4)  Added export.pl that will export E32 headers appropriately.
+		\group\export.pl
+
+
+Petteri
+	1)  Added text screen driver for Linda
+		\wsrc\wd_mad.cpp
+		\group\edisp.mmp
+
+
+Malcolm
+	1)  Removed all the li.prj files & moved the distribution comments
+		to distrib.txt files. Updated mnt.bat to deal with this.
+		\group\mnt.bat
+		*\li.prj
+		*\distrib.txt
+
+	2)  Boilerplated Roxette sources
+		\vrosr1\*
+		\karos\*
+		\kbros\*
+
+
+Malcolm
+	1) 	Major reorganisation of the E32 tree.  Tags: Pre-ER5u-Reorg is
+		before this, Post-ER5u-Reorg is after it.
+
+		What was upmarm and upmx86 has had the common parts extracted
+		into upepoc and the architecture dependant bits moved to
+		ucmarm and ucmx86 respectively.
+		\upmarm\*
+		\upmx86\*
+		\ucmarm\*
+		\ucmx86\*
+		\upepoc\*
+		group\ekern.mmp
+		group\eexe.mmp
+		group\xcons.mmp
+
+	2)	Ucdt has been moved over to Usrc
+		\ucdt\*
+		\usrc\*
+		group\euser.mmp
+
+	3) 	Roxette (SROS) has been merged in
+		\karos\*
+		\kbros\*
+		\vrosr1\*
+		\bsros\*
+		group\ekern.mmp
+		group\bsros.prj
+		group\esros.rel
+		group\euser.mmp
+		group\ekern.mmp
+		group\edisp.mmp
+		group\eexe.mmp
+		group\ekdata.mmp
+		group\inck.rel
+		group\vrosr1.mmp
+		wsrc\wd_rose*
+
+	4)	Removed EPBUS reference in epbus
+		group\epbus.mmp
+
+	5)	Added support for screen dimension keys (flip keys)
+		inc\e32keys.h
+		inc\e32panic.h
+		usrc\us_evnt.cpp
+
+	6) 	Changes to timers to disambiguate periodic and locked timers for the
+		lower layers by encoding a value in the repeat field
+		ksrc\ks_tim.cpp
+		inc\k32std.h
+
+	7) 	New function UserSvr::RomHeaderAddress(), replacing the use of
+		KRomLinAddr	constant.  This is so the F32 is single-process agnostic.
+		All address constants have been moved to k32addr.h
+		inc\k32addr.h
+		kpepoc\kp_ini.cpp
+		inc\u32std.h
+		inc\e32rom.h
+		inc\e32svr.h
+		inc\m32hal.h
+
+
+Jason
+	1)	Added debug monitor for MISA
+		\KAISA\KA_MON.CPP
+		\INC\M32STD.H
+		\GROUP\EKERN.MMP
+
+Morgan
+	1)	Upgraded Dma abstraction to cope with transfers across page boundaries
+		\INC\M32STD.H
+		\KAMAD\KA_DMA.CPP
+		\KPEPOC\KP_DMA.CPP
+	2)	Fixed function prototype for DPowerHandler::SetRequirement(TUint &aState)
+		\inc\k32power.h
+		\ksrc\ks_power.cpp
+		\b*\ekern*.def
+	3)	Implemented Hal::ModifyLedMask()
+		\kpehal\kph_inf.cpp
+	4)	Fixed key translator to use User::LowerCase instead of User::Fold
+		for EMatchKeyCaseInsens
+		\wsrc\ky_tran.cpp
+	5)	Merged in changes for MMAD
+		\inc\u32std.h
+		\inc\v32linda.h
+		\kbmad\*
+		\kamad\*
+		\varmlb\*
+	6)	Corrected remote serial screen cursor positioning
+		\wsrc\wd_vt100.cpp
+	7)	Fixed mismatched #defines of
+			__CPU_SPLIT_TLBS and __CPU_SPLIT_TLB
+			__CPU_CACHE_CONFIGURABLE and __CPU_CACHE_SELECTABLE
+		\kcarm\kc_mmu.cpp
+	8)	Removed NotBuffered attribute from the read-only EKernelCode and
+		EUserCode chunks
+		\kcarm\kc_mmu.cpp
+	9)	Added Platform dependent constants for page table attributes
+		\kcarm\kc_mmu.cpp
+	10) Integrated the debug monitor into MMAD
+		\kamad\ka_mon.cpp
+		\inc\m32std.h
+	11) Uncommented the two lines of code that flush the D-Cache on
+		split cache processors
+		\kcarm\kc_sched.cpp
+		\kcarm\kc_mmu.cpp
+	12) More bug fixes for MMAD
+		\kamad\ka_linda.cpp
+	13) Implemented Rom groping in the bootstrap
+
+
+Jonathan
+	1)	Fixed fix for EDN430762 in 170; trap handler was not being correctly
+		zeroed.
+		kpwins\kp_utl.cpp
+	2)	Reinstated unused functions SetLine and GetLine cos they're pure
+		virtual in the base class and so need to exist.
+		wsrc\wd_wins.cpp
+	3)	Made RTest::Getch() pause for input even in non-manual mode.
+		usrc\us_test.cpp
+
+Version 1.02.181
+================
+(Made by Pete, 5th May 1999)
+
+1)	Pete
+	1)	Added the (exported) function:-
+			TBusLocalDrive::Format(TInt aPos,TInt aLength)
+		so that it is possible to format just a part of a
+		drive.
+	2) 	Changed the local drive allocation for Brutus/WINS as follows:-
+
+		Local-Drive-Num	Assignment
+		(Let-EPOC/WINS)
+		0 (C:/Y:)	EFixedMedia0 (Internal Ram)
+		1 (D:/X:)	ERemovableMedia0 (1st partition on PC Card Socket0)
+		2 (E:)		ERemovableMedia1 (1st partition on PC Card Socket1)
+		3 (F:)		ERemovableMedia0 (2nd partition on PC Card Socket0)
+		4 (G:)		ERemovableMedia1 (2nd partition on PC Card Socket1)
+		5 (H:)		ERemovableMedia0 (3rd partition on PC Card Socket0)
+		6 (I:)		ERemovableMedia1 (3rd partition on PC Card Socket1)
+		7 (J:)		Not used
+		8 (K:/W:)	EFixedMedia1 (Flash File System)
+
+	3) 	Backed out the change made in V180 to TTrapK::Trap() in kpwins\kp_utl.cpp as
+		this is suspected to be causing problems in WINS Unicode builds.
+	4) 	Fixed a problem with the function ImpHal::Idle() on ISA builds
+		(KAISA\KA_UTL.CPP).
+	5)	Fixed a problem with EPBUS.DLL which resulted in an exception
+		if an attempt was made to open a media driver for a peripheral
+		bus device (ie derived from DPBusMediaDriver) on an
+		internal drive. This typically only causes a problem on machines
+		which have a local drive designated as an internal drive in addition
+		to the standard Internal Ram drive (ie EFixedMedia1). This isn't a
+		problem on Snowdrop/Protea. There generally isn't a problem on the
+		internal Ram drive (ie EFixedMedia0) since the IRAM media driver
+		(MEDINT.PDD) opens successfully on this device before any drivers for
+		removable devices. (It would have caused a problem if ATA media driver was
+		loaded before the IRAM media driver).
+	6)	Modified E32VAR.IBY and ROM.OBY in \KBISA to allow ISA UNICODE rom's
+		to be built successfully.
+	7)	Added a LFFS media driver (MEDLFS.PDD) to the WINS and Brutus platforms.
+		The WINS version emulates a media device by performing reads/writes to the
+		file <temp>LFSLDRV.BIN (e.g. C:\TEMP\LFSLDRV.BIN). The Brutus version uses
+		2Mb of flash in Static Memory bank 1 and thus requires a pair of 1M x 16 flash
+		chips to be fitted to this bank. These devices aren't fitted on a standard Brutus
+		rack as shiped from Intel. The Brutus media driver is a read-only implementation
+		in this release.
+
+Version 1.02.180
+================
+(Made by Pete, 29th April 1999)
+
+	This is an ER5U release
+
+1)	Jonathan
+	1)	Fixed EDN430762 (E32TEST T_REG.EXE fails in WINS REL).
+		TTrapK::Trap() in kpwins\kp_utl.cpp mixed assembler and C++ and was
+		being broken by MSVC5's aggressive optimisations when built for
+		WINS/WINC REL/UREL. The fixed code is still vulnerable to compiler
+		changes because it still contains one C++ statement and could
+		therefore be confused by the compiler setting up a stack frame or
+		trashing the cx register.
+		TTrap::Trap() in upwins\up_trp.cpp and upmx86\up_trp.cpp would contain
+		the same problem but we can't build the user library under MSVC5 with
+		optimisations enabled for other reasons so the problem does not
+		appear.
+
+2)	Pete
+	1)	Modifications to Brutus variant (VISABA) to fix a problem with the PC Card
+		interface CD signals on GPIO7 (socket1) and GPIO4 (socket0). These were being
+		reconfigured to their alternate function (upper port of LCD interface) within
+		the function Variant::DisplayOn().
+	2) 	Change to the way the ISA PC Card Controller handles a media change interrupt so
+		that it now queues a 20ms millisecond callback to handle switch debounce rather
+		than doing this directly from the interrupt service routine.
+	3) 	In the ISA PC Card Controller abstraction, removed some redundant functions calls
+		called during media change and socket interrupt handling. These functions had been
+		carried over from the MARM platform.
+	4) 	Disabled idle mode for now in the ISA platform (ImpHal::Idle()). There appears to be a
+		problem with PC Card IREQ interrupts (implemnted using GPIO edge triggered interrupt)
+		bringing the machine out of idle such that the machine eventually hangs.
+	5) 	Implemented a new Pc Card Controller to Variant interface for ISA platforms (TPcCardControllerIsaInterface
+		in V32PCCDI.H). This includes the following new functions:-
+			- const TDesC8& SocketIntSource(TSocket aSocket,TPccdEvent anEvent);
+			- void InitSocketInt(TSocket aSocket,TPccdEvent anEvent);
+			- void ClearSocketInt(TSocket aSocket,TPccdEvent anEvent);
+		This is allows the socket interrupt implementation on ISA platforms to performed
+		at the variant layer
+
+3)	Alex
+	1)	Modifications to ISA bootstrap (which is really tailored for the reference Brutus
+		platform) to support running code from RAM rather than FLASH. This means that images larger
+		than 4Mb (the previous limit on this platform due to the size of the flash bank) can be
+		handled. Use with E32UTILS REPROB V027.
+
+4)	Pete
+	(inc\E32SVR.H)
+		Modification to TLocalDriveCapsV2 to add the data member
+		iEraseBlockSize. This is to support an F32 Flash File System.
+
+
+Version 1.02.166
+================
+(Made by Jonathan, 23rd February 1999)
+
+1)	Jason
+	1)	Implemented Millisecond timer for MISA.
+	2)  Made the ATA Media driver as part of the ROM for MISA.
+
+2)	Dennis
+	1)	Replaced Snowdrop digitiser default calibration values with values
+		supplied by Amazon.
+	2)	Modified Windermere LCD controller Timing2 register setting as
+		requested by Amazon.
+	3)	Changed Snowdrop current consumption and battery threshold values
+		to those supplied by Amazon.
+
+3)	Morgan
+	1)	Replaced the code that stops the machine turning off if an absolute
+		timer is due soon.
+
+4)	Jonathan & Co
+	1)	Boilerplated source.
+	2)	Removed historical epocfns.txt, sizes.txt, sizes.xls from .\group.
+
+5)	Alastair
+	1)	Replaced hard-coded R: with %s% in MNT.BAT.
+	2)	Changed MNT PUTSRC to use T:\Tools\Zip.exe rather than
+		T:\Tools\PKZip.exe.
+	3)	Changed MNT GETREL to get the WINC debugging releaseables for DEB and
+		UDEB builds.
+	4)	Removed non-existent V32ARMS1.H, V32SASIC.H and duplicate listing of
+		K32POWER.H from \E32\INC\INCK.PRJ.
+	5)	Removed non-existent D32FTIM.H, D32FTIM.INL and *.FRZ from
+		\E32\INC\INCC.PRJ.
+	6)	Added CONSWINS.DEF, CONSMARM.DEF and CONSMISA.DEF to \E32\INC\INCK.PRJ.
+	7)	Removed CAKDP2 Series5 keyboard variants from EMARM.REL.
+	8)	Removed ELOCL variants from EMARM.REL, EWINS.REL and EWINC.REL.
+	9)	Moved \E32\INC\INCC.PRJ to \E32\GROUP\INCC.REL and \E32\INC\INCK.PRJ to
+		\E32\GROUP\INCK.REL and changed MNT.BAT so that these .REL files are
+		treated in the same way as all the other .REL files.
+	10)	Updated validation process to use William's new EVALID.BAT (added to
+		E32\Group pro tem.).
+	11)	Removed empty file \E32\Inc\M32hal.inl.
+
+
+Version 1.02.165
+================
+(Made by Pete, 16th February 1999)
+
+1)	Jason
+	1)	Removed fixed Rom address from MMU initialisation bootstrap code.
+
+2)	Morgan
+	1)	Fix for defect EDN964446 to prevent WINS standby going re-entrant.
+
+3)	Mark
+	1)	Implemented PC card driver for MISA.
+
+4)	Dennis
+	1)	Applied Jason Robinson's patch for defect EDN061952 (cannot force a
+		cold reset by holding down both shift keys).
+	2)	Fixed problem EDN106813 (snowdrop pathological failure mode).
+
+5)	Pete
+	1)	Added range checking to the Pc Card h/w chunk allocation functions
+		(derived versions of RPccdChunkBase::CreateL()) in MARM, MISA and MAWD
+		builds to prevent this allocating memory chunks beyond the physical
+		region assigned to the Pc Card memory.
+
+
+Version 1.02.164
+================
+(Made by Jonathan, 10th February 1999)
+
+1)	Jonathan
+	1)	Disabled the crash debug monitor.
+	2)	Fixed problem EDN941329 "RThread::GetRamSizes() Crashes the Kernel" by
+		making RThread::GetRamSizes() return 0 for the heap size in combined
+		stack+heap chunks.
+	3)	Applied Dennis' fix for EDN157244 "Process creation can leak memory"
+		by promoting DPlatProcess::FirstThread() to DProcess::FirstThread()
+		and checking for case where OOM occurs after thread creation.
+
+2)	Dennis
+	1)	Fixed problem EDN256123 (adding a thread to a dead process crashes the
+		kernel). Create empty process handles array after deleting the
+		original one, and when creating a new thread check that the owning
+		process is not dead.
+	2)	COM061952: Put in Jason Robinson's bootstrap fix for Windermere so
+		that cold resets (both shift keys down) should now work on Snowdrop.
+
+3)	Morgan
+	1)	User::LoadLogicalDevice and User::LoadPhysicalDevice now supply
+		match-Uid's KLogicalDeviceDriverUid and KPhysicalDeviceDriverUid on
+		their calls to RLoader::LoadLibrary
+
+4)	Pete
+	1)	Added the function TPBusCallBack::Clear() (exported from EPBUS.DLL) to
+		clear the source of a Peripheral Bus event (e.g. IREQ interrupt from
+		PC card). This is a 'generic' version of the temporary fix applied in
+		E32-162 for defect 'CF Card interrupts being missed on Snowdrop
+		machines'. Also, removed the functions
+		DPcCardController::EnableEvent() and DPcCardController::DisableEvent()
+		and replaced them with TPBusCallBack::Enable() and
+		TPBusCallBack::Disable() respectively.
+	2)	Added the functions DPcCardController::PwrUpProfile() and
+		DPcCardController::SetPwrUpProfile() to read/modify the power up
+		profile of the PC Card Controller (ie time reset applied, pause after
+		card becomes ready, timeout period when waiting for card to become
+		ready).  Removed the parameter 'aResetProfile' from
+		DPeriphBusController::PowerUpBus(), DPcCardController::PowerUpCard(),
+		and DPcCardController::RestoreCardPower() as this information is now
+		superfluous.
+	3) 	Increased synchronous busy timeout period on ARM ATA driver from 15mS
+		to 20mS to support large Lexar CF cards.
+	4) 	Enabled CF card rail (Vpc) monitoring in Snowdrop variant. Also
+		modified this so that checking is performed periodically as long as
+		the rail is on (in addition to once when first turned).
+	5) 	Change to ARM ATA driver so it checks for 'card not busy' if it times
+		out on a command. If the card isn't busy then it processes this as if
+		it had received a normal card interrupt.
+
+
+Version 1.02.163
+================
+(Made by Pete, 3rd February 1999)
+
+1) Morgan
+	1)	Fixed a problem that was causing Dll entrypoints to be called
+		with EDllProcessAttach twice.
+
+2) Jason
+	1)	Restored the RAM drive to MISA.
+
+3) Dennis
+	1)	Fixed problem EDN591058 (remote thread write to end of chunk can
+		fail). Use sizeof(TDes8) instead of sizeof(TBuf8<1>)-1 for checking
+		to avoid alignment problems.
+	2)	Fixed problem EDN468376 (RHeap::Compress can leave heap
+		corrupted). In the situations where a free cell header would have
+		been chopped in half, an extra page of RAM is now left allocated to
+		the heap.
+	3)	Fixed problem EDN102617 (undefined instruction exception kills the
+		kernel). Modified undefined instruction handler to run Exc::Dispatch
+		in mode_und rather than mode_abt.
+	4)	Modified super page signature so that it includes the E32 version
+		number. This means that when a machine is reprogrammed to a
+		different version of E32, a cold reset will be forced when the
+		machine is first booted even if the user attempts to do a warm
+		reset.
+
+4)	Jonathan
+	1)	Fixed problem EDN671244 (RDebug::ReadMemory can reset the machine)
+		by trapping calls from Debug::DebugFunction to Debug::ReadMemory and
+		Debug::WriteMemory.
+	2)	Fixed problem EDN471656 (underlying cause of which was RAM disk
+		size not being a multiple of page size) by applying Andrew/Pete's
+		modified fix.
+
+5)	Pete
+	1)		Renamed current implementation of the class TLocalDrive as
+		TBusLocalDrive. Also, changed TBusLocalDrive::Caps() from the form:-
+			TInt Caps(TLocalDriveCaps &anInfo);
+		to
+			TInt Caps(TDes8& anInfo);
+		with the later taking a TLocalDriveCapsBuf.
+			Re-introduced a TLocalDrive class which is BC with the E32-114
+		version. The TLocalDrive class will be maintained to support disk
+		utilities which need a level of direct disk access. However,
+		TLocalDrive functions: Enlarge(), ReduceSize() and Format() now
+		return KErrNotSupported. TBusLocalDrive is intended to be used only
+		by F32 and there is no BC commitment with this. (Fixes EDN545357).
+	2)	Added EPBUS.MAP to MARM,MISA,MAWD release files.
+	3)	Modification to prevent CF card from being powered down during a
+		write operation when the machine is turned off. This involves a
+		change to DPcCardController::PowerStandby() so that it waits a short
+		period for any critical operation to complete. If still critical
+		after that period then it goes ahead and powers down the sockets,
+		but generates an emergency reset event so that clients can attempt to
+		recover. (Fixes EDN201114).
+	4)	Modification to IRAM media driver (EPOC Platform) so that when it is
+		first mounted, it takes its initial size directly from the super
+		page rather than the IRAM chunk size (which is in multiples of a
+		page size).
+
+
+Version 1.02.162
+================
+(Made by Morgan, 27th January 1999)
+
+1) Dennis
+	1)	Fixed problem EDN153887 (using infra-red lowers RS232 RTS line) -
+		modified VAWDB1\VA_COM1.CPP to ensure that UART1 SIR enable bit is
+		always cleared.
+	2)	Store garbage values in K::SvThread and K::SvProcess on completion of
+		a kernel server function to guard against inadvertent use of these in
+		executive calls or DFCs.
+	3)	Fixed problem EDN741588. Modified S::ChunkCompressAll() in KS_CHK.CPP
+		so that it only attempts to compress the kernel heap if its critical
+		section is not blocked.
+	4)	Added extra command 'R' to crash debugger to print the values of all
+		processor registers across all processor modes at the point where the
+		debugger was entered.
+
+2) Jason
+	1)	Restored link to MISA Idle code with-in the bootstrap.
+	2)	MISA DRAM initialisation made to match the documentation.
+
+3) Jonathan
+	1)	Added missing "Distribution:" comments to PSRC\LI.PRJ and
+		KBAWD\LI.PRJ. Modified "mnt check" to check that all LI.PRJs contain
+		"Distribution:" comments.
+	2)	Added new "mnt distrib" verb for zipping up a copy of E32 source for
+		distribution to a named licensee. This verb is intended to be used
+		on a clean freshly-got copy of the source.
+		"mnt distrib acme" will produce \E32-acme.zip for acme.
+		"mnt distrib generic" will produce an unencumbered \E32-generic.zip.
+
+4) Pete
+	1)	Fixed EDN590829 (CF Card interrupts being missed on snowdrop
+		machines).  Fixed by clearing the interrupt directly from the media
+		driver interrupt callback rather than relying on it to be cleared by
+		the PC Card controller before the callback.  This affects CF cards
+		which 'claim' to support pulse mode interrupts but actually seem to
+		implement level mode interrupts.
+
+
+Version 1.02.161
+================
+(Made by MarkD, 19 January 1999)
+
+1) Dennis
+	1)	New Snowdrop digitiser and SPI code from Mark Ball.
+	2)	Battery low interrupt now disables UART and Codec interrupts on
+		EIGER to prevent watchdog death due to permanently asserted
+		interrupt from UART when power is removed abruptly.
+	3)	Reinstated __COMMS_MACHINE_CODED__ in VA_COM1.CPP for P2 and PD
+		variants, after fixing problem caused by hard-coded vtable offset.
+
+2) Pete
+	1)	Fixed two problems with the ATA command timeout
+		implementation on the ARM ATA driver. (The timeout catches
+		situations where a request is made on the card which ought to be
+		signalled by an interrupt from the card when complete, but where the
+		card fails to generate an interrupt):-
+			a) Changed to use a ticklink rather than a
+		TMilliSecondCallBack to implement the timeout.
+			b) Fixed a problem where the timeout could be requeued
+		before the previous timeout had completed.
+	2) 	Increased synchronous busy timeout period on ARM ATA driver from
+		8mS to 15mS to support KingMax CF cards.
+	3) 	Modification to function DMediaDriver::RequestSetup()
+		so it now returns KErrInUse if the data member iReqStat isn't NULL.
+		This prevents the possibility of more than one request at a time on a
+		single media driver.
+	4) 	Stopped releasing WINS .BMP files (ie killed SWINS.REL).
+
+3) Morgan
+	1)	Turned off emulation of the WINS backlight
+
+
+Version 1.02.160
+================
+(Made by Jason, 12th January 1999)
+
+1) Mark
+	1) 	Fixed a problem with MISA such that the screen wasn't being turned
+		on.
+
+2) Dennis
+	1)	Added kernel crash debugger to MARM and MAWD builds. When a kernel
+		fault occurs, the debugger will start instead of the machine just
+		restarting.  The crash debugger is enabled by compiling with
+		__ENABLE_DEBUG_MONITOR__ defined in M32STD.H.
+	2)	Got the C++ build going again. Compiling with
+		__MINIMUM_MACHINE_CODE__ defined in U32STD.H will result in a build
+		with all non-essential machine code removed. All tests pass on EIGER
+		in debug and release builds.
+	3)	Assembler-coded most TWind functions (KE_WIND.CPP).
+	4)	Made RPointerArray<T>::Count() and RPointerArray<T>::Find*() const.
+	5)	Added check in svProcessTerminate in KS_SVR.CPP so that calling
+		RProcess().Terminate() does not crash the kernel.
+
+3) Jason
+	1 )	MISA five layer split done created \e32\kaisa\ removed \e32\keisa\.
+
+4)	Morgan
+	1)	Added Dll::FileName() which will return the drive, path, and filename
+		of the library it is called from.  (Added UserSvr::DllFileName and
+		associated EXEC functions to support this).  Dll's that exist on the
+		ROM drive and have not been RLibrary::Load()ed will return only the
+		drive, (ie. "Z:").
+	2)	Fixed bugs in LoadLogicalDevice and LoadPhysicalDevice that was causing
+		unbalanced calls to the entrypoint of drivers (with EProcessDetatch and
+		EThreadAttach).
+	3)	Removed cleanup code from user side code RLoader::LoadLibrary.  Cleanup
+		of half loaded dll's is now performed loader side as it should be.
+	4)	Fixed a problem with switch-off-on-case-close.
+	5)	S::LoadLibraryExact now creates a handle into the Loader thread rather
+		than into the loading client.  DLibrary::LoadedL transfers handles and
+		created dependencies as required.  See Note F32 126.2.2
+
+
+Version 1.02.159
+================
+(Made by Pete, 21st December 1998)
+
+THIS RELEASE OF E32 REQUIRES F32 125
+
+1) Jonathan
+   1)	Added TLanguage enums { ELangTaiwanChinese, ELangHongKongChinese,
+		ELangPrcChinese, ELangJapanese, ELangThai }.
+
+2) Morgan
+	1)	Removed old static power functions that are no longer used from
+		classes P, K, and ImpPsu.
+	2)	Removed TKeyboard::SwitchOn() and TXYInput::SwitchOn().  And for those
+		variants that required it, upgraded the keyboards and digitisers to be
+		first class power handlers.
+	3)	Changed KLogicalDeviceDriverUid for Unicode and Narrow builds because
+		the Ldd interface has changed.  This change stops old device drivers
+		loading on the new kernel.
+	4)	Uniquely identified each architecture of the kernel with a Uid.  This
+		change stops libraries that link to the kernel from loading on the
+		wrong architecture.
+
+3) MarkD
+	1)	Performed the PC Card reorganisation for MISA.
+	2) 	Fixed a problem in KEISA\KE_INI where the requested video chunk size wasn't
+		rounded to page size.
+	3)	Added a serial driver for Brutus using serial ports 1 (VISABA\VI_COM1.CPP)
+		and 3 (VISABA\VI_COM2.CPP).
+
+4) Alastair
+	1)	Fixed ER5 defect EDN381842 "WINS 'large' fascia problem under Win95/98".
+		If not running under Windows_NT SetupEmulatorPaths() function in upwins\up_path.cpp
+		takes account of the fact that Win32 GetModuleFileName() will report a full path
+		rather than a virtual path if the Emulator is running on a subst'ed drive from a
+		DOS prompt.
+
+5) Petteri
+	1)	Changes to VARMCL variant to fully enable the PC Card Controller. All PC Card tests
+			now pass on this variant.
+
+6) Dennis
+	1)	Merged in more Amazon changes to Windermere port.
+	2)	Modified Plat::ScreenInfo for Windermere to return the address of the screen RAM
+		bitmap rather than the palette.
+	3)	Fixed a bug in the text window server introduced in 158 which stops pointer drag
+		from working.
+
+7) Pete
+	1)		Various changes to facilitates a better partitiioning of
+		functions between EKERN and EPBUS and to allow ROMS to be built without an EPBUS
+		component. Functions which previously called either TPBusCallBack or
+		Kern::PBusController() in the indepedant layer have now been moved to the Asic
+		layer:-
+			Modification of class DPrimaryMedia into an Indepedent layer class
+		DPrimaryMediaBase and a Asic layer class DPrimaryMedia.
+			Modification of class DMediaChangeNotifier into an Indepedent layer class
+		DMediaChangeNotifierBase and a Asic layer class DPrimaryMedia.
+			Functions K::PowerUpPeriphBus(), K::BusDevPowerStatus() are now platform
+		dependent (hence moved to class P). Also creation of the functions P::ForceMediaRemount(),
+		ImpHal::TotalSupportedBuses() and ImpHal::TotalSupportedDrives().
+
+Version 1.02.158
+================
+(Made by Pete, 7th December 1998)
+
+1) Morgan
+	1)	Bug fix for MARM and MAWD Emergency power down. (Screen not powered up
+		after emergency power down).  Effects KEAWD\KE_POWER.CPP and
+		KAEIG\KA_POWER.CPP
+	2)	Pointer-switch-on now behaves as it did in E32(156).
+	3)	Added MISA power model.
+
+2) Pete
+	1) 		Split out the PC Card Controller from the kernel into a new
+		component - EPBUS.DLL. The independant layer code, previously in \KSRC,
+		files KS_PCCD.CPP and KS_PSOCK.CPP has been moved into \PSRC.
+		The architecture layer code files have been renamed from K?_PCCD.CPP
+		to P?_PCCD.CPP (e.g. \KAEIG\KA_PCCD.CPP renamed PA_PCCD.CPP).
+			As far as the interface with the kernel is conserned, EPBUS.DLL
+		is now a 'generic' Peripheral Bus Controller rather than specifically a
+		PC Card Controller. Machines which have a MultiMedia card interface or
+		a USB interface rather than a PC Card interface will have a Peripheral
+		Bus Controller supplying services for these interfaces instead. This has
+		involved quite extensive modifications to the classes which previously
+		implemented the PC Card media change (DMediaChange) and supply voltage
+		(TPcCardVcc) since large parts of these implementations are common for
+		any Peripheral Bus Controller.
+			The classes associated with the 'generic' Peripheral Bus Controller
+		are defined in P32STD.H. Of these functions, the code for those asociated with
+		media change and supply voltage classes is in PS_PSU.CPP and the code for the
+		Controller interface itself is in PS_PBUS.CPP. The independant layer code for
+		the PC Card Controller implementation in now in PS_PCCD.CPP and PS_PSOCK.CPP
+		(defined in P32PCCD.H).
+			The variant layer code for the Peripheral Bus Controller is still supplied
+		by the variant DLL. However, the bulk of the PC Card Controller functions have
+		been removed from the main Custom class and moved to a TPcCardControllerInterface
+		class (defined in V32PCCD.H). The custom now has a single function:-
+			TAny* Custom::CreatePeriphBusControllerInterface()
+		which returns a pointer to this class. This will allow variant layer code for other
+		types of Peripheral Bus Controller to be supplied by the variant DLL without bloating
+		the basic Custom class with these functions.
+			Removed the majority of the exported functions of the class UserPcCardController
+		(all apart from PwrDown() and NotifyChange()) from EUSER.DLL. Also, constructors for the
+		classes TPccdChnk, TPccdConfigInfo, TPccdRegionInfo and TPccdType. The DEF file entries for
+		these functions have been replaced with NotSupported entries.
+			Similarly, fixed up the MARM/WINS EKERN DEF files to replace all the entries for
+		exported PC Card Controller functions with NotSupported entries.
+		[Note: No Pc Card reorganisation for MISA.]
+	2)		The class TPccdCallback has become TPBusCallBack. A single callback can now be
+		registed for mutiple events, with the event now specified by a mask rather than an enum.
+		This has simplified the implemenation of the classes DPrimaryMedia and DMediaChangeNotifier.
+	3) 		Modified the variant function PcCardMemPhysicalAddress() to take an extra
+		parameter - 'TPccdMemType'. Prior to this, the variant just returned
+		the physical address per socket, with the kernel adding an offset
+		dependant on the memory type. Unfortunatley, the PS7111 has a
+		different PC Card memory offset scheme to that used in the PS7110.
+		Hence the need for it to be calculated in the variant (since 7111 and
+		7110 share the same kernel).
+
+
+Version 1.02.157
+================
+(Made by Dennis, 1st December 1998)
+
+NOTE:	Must be used with F32 version.
+		No ISA or Windermere binaries.
+		Outstanding problem with machine-code serial PDDs (non-machine code
+		version has been released) and with Windermere power-off.
+		Bldmake-generated batch files are no longer released as source so
+		bldmake <all> must be run to create the batch files before any building
+		can be done.
+
+1) Morgan
+	1)	Added uid-type-safety overloads to RLibrary::Load() and
+		RProcess::Create() to only load Dlls and Exes that match
+		the supplied Uids.
+			eg
+		lib.Load(_L("\\system\\plugins\\PLUGIN.DLL");
+			should change to
+		lib.Load(_L("\\system\plugins\\PLUGIN.DLL"),
+				 TUidType(KNullUid, KPluginUid, KNullUid);
+			where KPluginUid is either KPluginUid8 or KPluginUid16.
+	2)	SARMBE-RIP
+	3)	Added a new power management framework in INC\K32POWER.H.  Here is a
+		quick overview:
+		A DPowerHandler performs power related functions previously resident
+		in DLogicalChannel, and also provides mechanisms for communicating
+		with the machine's power model.  A DPowerModel, (DEigerPowerModel on
+		the Series5, DWinsPowerModel on WINS), logs all DPowerHandlers in
+		the system and their power requirements.  The power model controls
+		power up and power down behaviour of all shared power units.  This
+		allows it to dictate the machine's power management policy.  (See
+		document POWER001 in the Base database for more grusome details).
+		These changes break binary compatability for DLogicalChannels, and
+		existing device drivers that require power management.
+
+		* Here is some guidance on how to update existing
+		  DLogicalChannels to use E32(157):
+			// 1. given an old Ldd "Tomfoolery":
+			class DTomfooleryLdd : public DLogicalChannel
+				{
+			public:
+				~DTomfooleryLdd();
+				[...]
+				// override DLogicalChannel pure virtual functions
+				virtual void DoPowerUp();
+				virtual void DPowerDown();
+				virtual void DoEmergencyPowerDown();
+				}
+
+			// 2. modify the class declaration to insert a power handler
+			class DTomfooleryPowerHandler;
+			class DTomfooleryLdd : public DLogicalChannel
+				{
+			public:
+				~DTomfooleryLdd();
+				[...]
+				// these power functions no longer need to be virtual
+				// but you may wish to keep them virtual to maintain
+				// Ldd-Pdd compatability.
+				virtual void DoPowerUp();
+				virtual void DoPowerDown();
+				virtual void DoEmergencyPowerDown();
+			public:
+				// add power handling to this channel
+				DTomfooleryPowerHandler *iPowerHandler;
+				}
+
+			// 3. add a new power handler to the TOMFOOL.CPP file
+			class DTomfooleryPowerHandler : public DPowerHandler
+				{
+			public:
+				DTomfooleryPowerHandler(DTomfooleryLdd *aLdd) : iLdd(aLdd) {}
+				virtual TInt DoPowerOn() { return iLdd->DoPowerUp; }
+				virtual void DoPowerStandby() { iLdd->DoPowerDown(); }
+				virtual void DoPowerRestart() { iLdd->DoPowerDown(); }
+				virtual void DoPowerEmergencyStandby() { iLdd->DoEmergencyStandby(); }
+			public:
+				DTomfooleryLdd *aLdd;
+				}
+
+			// 4. change DTomfooleryLdd::DoCreateL and destructor
+			void DTomfooleryLdd::DoCreateL(...)
+				{
+				[...]
+				iPowerHandler=new (ELeave) DTomfooleryPowerHandler(this);
+				// register the power handler so we get power events
+				User::LeaveIfError(Power::AddPowerHandler(iPowerHandler));
+				[...]
+				// ask the PowerManager to power us up
+				iPowerHandler->PowerOn();
+				}
+			DTomfooleryLdd::~DTomfooleryLdd()
+				{
+				[...]
+				// ask the PowerManager to power us down
+				iPowerHandler->PowerStandby();
+				// remove the power handler from the system
+				Power::RemovePowerHandler(iPowerHandler);
+				delete iPowerHandler;
+				}
+
+			// 5. Finally, redirect calls to DLogicalChannel::PowerGood()
+			// and SetPowerConsumption() through the new iPowerHandler and
+			// remove all references of RegisterEmergencyPowerDownHandlerL()
+
+		It should also be noted that DLogicalChannel::PowerOn() and
+		DLogicalChannel::PowerDown() are no longer called called during
+		S::CreateLogicalChannel() and DLogicalChannel::Close().
+	4)	Moved WINS, MAWD and MARM over to the new power models.  Changed
+		DPcCardCntrl, and DLddSound to use the new facilities.
+		Also Altered DComm, DChannelComm, and DEigerComm.
+		[Note: Models not added for MMAD, MISA.]
+	5)	Removed duplicate implementations of P::PowerOff, P::PowerOn,
+		P::Standby(), and P::CheckSupplies in WINS.
+
+2) Jo
+	1)	Fixed EPOC software problem SW1-266 "TLocale isn't updated in
+		WINC/WINS when the time zone is changed"
+		Added a line to KPWINS\KP_INI to update locale data on EStartupCold
+		when the time zone on the PC is changed.
+
+3) Jane
+	1)  Split kearm directory into kcarm for cpu only code and kaeig for
+		asic code.
+		Made the kcarm code generic for any arm processor, so that all arm
+		based ports can eventually share it.
+		Added a set of __CPU_ #defines for "cpu properties" such as whether
+		cache is write-back or write-through, whether there is a write
+		buffer, and so forth. Used these to make the kcarm directory
+		generic.
+		These properties are set up in u32std.h from the build #define.
+		Moved the MAD port to the new scheme - it shares the kcarm directory
+		and has its own asic dependent directory, kamad.
+		The MARM and MAD ports have new .MMP files for ekern (ekernx),
+		ekdata (ekdatx) and ke_exe (kc_exe).
+		I am particularly pleased with the new TMadPanic - it made it all
+		worthwhile...
+
+4)	Alastair
+	1)	Changed PP::TheMachineName to "Epoc".  Take note SDK people, this
+		means the default .INI file loaded from the emulator's data
+		directory will be EPOC.INI rather than SYSTEM.INI.  I've also
+		removed the facility to specify the fascia bitmap within the
+		<machine>.ini file - instead the emulator will expect the fascia
+		bitmap to have the same base name as it's corresponding ini file -
+		so if the emulator is invoked with the -Mgeofox1 switch it will try
+		to load geofox1.bmp.  By default the emulator will try to load
+		epoc.bmp.  I've updated E32's SWINS release component accordingly.
+	2)	Updated EKERN.MMP and EUSER.MMP to take advantage of MAKMAKE's new
+		FIRSTOBJECT keyword (E32TOOLP 097).  Merged Jane's new EKERNX.MMP
+		into EKERN.MMP, and old KE_EXE.MMP into Jane's new KC_EXE.MMP
+		following these changes.
+	3)	Exporting the following functions from ekern under WINS/WINC by
+		ordinal rather than name
+			EXPORTS E32KernelDispatchAddress @279 NONAME
+			EXPORTS _E32Initialise @280 NONAME
+			EXPORTS _E32DeInitialise @281 NONAME
+			EXPORTS _E32ExitProcess @282 NONAME
+
+		Euser.dll has been changed to look up these functions by ordinal.
+		The latter 3 functions were previously only exported under WINC, and
+		do nothing and are not called under WINS.  The hack in MAKMAKE to
+		handle the linking of these functions by ordinal has been removed
+		(E32TOOLP O97).
+	4)	Removed Plat::EnterCS() and Plat::LeaveCS() from ESDRV.CPP and
+		ECDRV.CPP
+		- these fixes should no longer be required to avoid deadlock since a
+		generic fix has been applied to E32 version 155.
+	5)	Added 2 new exports to EUSER.DLL in E32WINS.H
+			IMPORT_C void SetEmulatorColorDepth(TUint& aDepths);
+			IMPORT_C void EmulatorColorDepth(TUint& aDepths);
+		SetEmulatorColorDepth() is called by EKERN.DLL which will set colour
+		depths supported by the emulator according to the specification of
+		the ColorDepth keyword in the System.ini file.  Syntax is
+			ColorDepth {Gray2} {Gray4} {Gray16} {Color16} {Color256}
+					   {Color4K} {Color16M}
+		If the ColorDepth keyword is not specified supported colour depths
+		will default to Gray2,Gray4 and Gray16 for backward compatibility.
+		Users of EmulatorColorDepth() will need to pass a bitmap reference
+		to the function which will be set based on the following constants
+		defined in E32WINS.H
+			const TUint KEmulGray2=		0x00000001;
+			const TUint KEmulGray4=		0x00000002;
+			const TUint KEmulGray16=	0x00000004;
+			const TUint KEmulGray256=	0x00000008;
+			const TUint KEmulColor16=	0x00000010;
+			const TUint KEmulColor256=	0x00000020;
+			const TUint KEmulColor4K=	0x00000040;
+			const TUint KEmulColor64K=	0x00000080;
+			const TUint KEmulColor16M=	0x00000100;
+	6)	Changed RThread::Panic() so that in WINS DEBUG builds it calls a new
+		function, ThreadPanicBreakpoint2, in upwins\up_debug.cpp, with
+		information about the thread being panicked and also the name of the
+		killing thread.  This fixes Epoc S/W problem 356 "The __DEBUGGER
+		macro that catches panics should be un-commented out."  To get the
+		Windows ID of the panicking thread in RThread::Panic() I changed the
+		code which keeps a list of Epoc threads in EUSER.DLL so that it
+		contains the Epoc thread ID as well as the Windows one and added a
+		function to upwins\up_thrd.cpp, TUint32 WinsEpocThreadWinID(TUint
+		aEpocID), which returns the Windows ID corresponding to the Epoc ID
+		passed in as a parameter.
+	7)	Split header inc\e32wins.h into 2 headers, e32wins.h and u32wins.h.
+		U32wins.h contains euser functions that should not need to be used
+		by any component except E32.
+	8)	Removed all the logical and physical device driver deffiles from
+		\E32\INC, since makmake always ensures the right function is
+		exported at ordinal one for LDD and PDD targettypes.
+	9)	Changed the Emulator's path scheme.  Now, if a directory called
+		'Data\' is found in the same directory as the executable which
+		started the Emulator, the Emulator's data directory will be
+		considered to be this directory and expected to contain .INI files
+		and any corresponding bitmaps.  Also, directories 'C\' and 'Z\' in
+		the executable's directory will be mapped to the emulated C: and Z:
+		drives.  If a 'Data\' directory is not found in the executable's
+		directory, the old scheme will be assumed where the Emulator's data
+		directory is '\Epoc32\Data\' and the emulated C: drive is mapped to
+		'Epoc32\WINS\C\'.
+	10)	Fixed Epoc S/W problem 466
+			"Plat: 46 fault when running EXEs from a different directory".
+		The emulator now looks in the directory containing the emulated Z
+		directory for filenames specified without a drive, rather than in
+		the directory containing the executable that started up the
+		emulator; so if Z is mapped to \Epoc32\Release\WINS\DEB\Z\, the
+		emulator will look in \Epoc32\Release\WINS\DEB\ for these files.
+		Note that mappings for emulated C and Z drives will be overwritten
+		if specified in the environment, but can safely be set in the
+		EPOC.INI file using the _EPOC_DRIVE_? keyword.  Any attempted
+		mapping for the Z drive which does not specify a directory ending in
+		\Z or \Z\ will fail.
+	11)	Removed references to all bldmake-generated batch files from LI.PRJ
+		files containing them, and updated MNT.BAT so that directories \BWINC,
+		\BVC4 and \BVC4WINC are not archived (they contain nothing but
+		bldmake-generated files anyway).  This means that to build E32 from
+		source bldmake must always be called first to generate the batch files,
+		and ensures these batch files are more likely to be up-to-date.
+
+5)	Jonathan
+	1)	Retired KEARM directory following Jane's changes. The MAWD and MISA
+		builds depended on some files in KEARM, so these files were copied:
+			KEISA:	ke_edbg.cpp, ke_edbg.h, ke_dma.cpp
+			KEAWD:	ke_edbg.cpp, ke_edbg.h, ke_dma.cpp,
+					ke_exc.cpp, ke_thrd.cpp,
+					ke_exe.cpp, ke_kdata.cpp
+	2)	Updated MNT.BAT to reflect all of the above directory changes.
+	3)	Hacked a workaround to MSVC++ 5.0 (sp3) assembler bug, where MSVC
+		incorrectly fixes up conditional jumps when the destination is a C++
+		function. Files affected: upwins\up_realx.cpp, upwins\up_i64.cpp.
+
+6)	Dennis
+	1)	Fixed bug in serial comms driver relating to zero-length reads. If
+		the receive buffer was empty when a zero-length read was requested,
+		the driver would enter an inconsistent state and the request would
+		not be completed unless a terminating character was specified.
+
+7) 	Pete
+	1)		Added the class RBusDevCom which is intended as a replacement
+		for RDevCom (although the latter is still supported). This new class
+		allows the support of serial devices such as PC Card modems which
+		require the asynchronous power up of the card. The changes included
+		in E32-120 allowed these types of cards to be initially powered up
+		just before a channel was opened on the device. They didn't however
+		support the repowering of an open channel (which again needs to be
+		asynchronous) after the machine has been turned off. The RBusDevCom
+		now provides the means to support for this scenario. If a channel is
+		opened on a serial device which requires asynchronous powering then
+		all DoControl() and DoRequest() calls are preceded by a fast exec
+		call to check whether the device needs repowering. (Channels open on
+		standard serial devices don't suffer the penatly of this
+		exec. call).
+			Added the class RBusLogicalChannel (RBusDevCom is derived from
+		this class) which is intended as a replacement for RLogicalChannel -
+		to be used for devices which may need to be asynchronously powered
+		either before opening or while the channel is use. RLogicalChannel
+		would continue to be the choice for classes of devices which don't
+		require this behaviour.
+			Modifications to the TLocalDrive class. This now makes use of the
+		MBusDev class - created as part of the implementation of the
+		RBusLogicalChannel class.
+			Fixed a problem with the TLocalDrive class CheckMount() function
+		so that it can't lock the file system doing continuous re-mounts
+		when a CF card is inserted that never asserts its RDY signal.
+	2)		Added a member 'iHiddenSectors' to TLocalDriveCaps
+		to report the number of sectors on a media device reserved before
+		the start of the first partition.
+	3)		Added a new version of the
+		DPcCardCntrl::RegisterEvent() function taking an extra parameter
+		'TUint aFlag'. This allows the better support of PC cards which use
+		level mode interrupt requests rather than pulse mode. The flag is
+		set when level mode is required meaning the PC Card Controller can
+		avoid failing to clear the interrupt in the PC Card Controller
+		hardware.
+	4)		Merged various changes to the MAWD architecture layer, the MAWD
+		B1 variant layer and the MARM P2 variant layer including a new SPI
+		implementation for MAWD, support for ETNA Rev3 etc.
+			Added a function Plat::WaitAtLeastAMicroSecond() for use by the
+		ATA media driver.
+
+
+Version 1.02.156
+================
+(Made by Jonathan, 27th October 1998)
+
+N.B. WINS DEB/UDEB will only work with F32 122 OR LATER.
+
+1) Dennis
+	1)	Reintroduced debug/release interoperability for WINS. Removed
+		CBase::iName and SObjectIxArray::iPadding. Deleted all debug DEF
+		files.
+	2)	Merged in Andrew Thoelke's E32 proposals:
+		i)	SW1-77 Compiler-generated constant descriptors.
+		ii)	SW1-14 C++ range-checking template wrapper for fixed arrays.
+		iii) SW1-87 CleanupClosePushL and related cleanup-stack things.
+	3)	Globally disabled warning about not inlining functions in MSVC++ 5.0.
+
+2) Jonathan
+	1)	Fixed version bug in mnt getbld.
+	2)	Fixed pvcs paramater error for bsarm and bsarmbe dirs in mnt *lock.
+
+3)	Alastair
+		1) Added the following Unicode Uid values
+			KLogicalDeviceDriverUidValue	0x100039cf
+			KPhysicalDeviceDriverUidValue	0x100039d0
+			KKernelUidValue					0x100039e2
+			KUserDllUidValue				0x100039e5
+			KLocaleDllUidValue				0x100039e6
+			KConsoleDllUidValue				0x100039e7
+			KDisplayDllUidValue				0x100039eb
+			KCustomDllUidValue				0x100039e8
+			KKeyboardDllUidValue			0x100039e9
+			KKeyboardDataUidValue			0x100039e0
+			KKeyboardTranUidValue			0x100039e1
+			KXYInputDllUidValue				0x100039ea
+
+		N.B. some of these values are defined in the file E32UID.IBY (from
+		\e32\kbarm\,\e32\kbisa\, etc).  If this file is to be used in creating
+		UNICODE roms then the preprocessing stage prior to rombuilding should
+		define the _UNICODE macro.
+		2)	Updated .MMP files in accordance with the UNICODE plan.
+		3)	Changed MNT.BAT to get E32TOOLP version 096.
+
+
+Version 1.02.155
+================
+(Made by Morgan, 20th October 1998)
+
+NB: REQUIRES F32 VERSION 121 OR ABOVE, WSERV VERSION 100 OR ABOVE
+
+0)	Jonathan
+	1)	Added Distribution lines to the LI.PRJ files in all subdirectories to
+		identify licensee-specific source.
+
+1)	Graham Asher, 13/10/98
+	These changes affect the Unicode builds only. They make it possible to use
+	several different sets of collation rules in the same locale, which is
+	needed for East Asian locales; and they make it easier to write collation
+	rules for these and other locales.
+
+	\inc\collate.h
+	introduced TCollationRepertoire - stores a series of rule sets so that one
+	can choose, say, between sorting on stroke count and radical, or JIS code,
+	without changing locale.  added new collation operators to make it easier
+	to write complex collation rules reorganised TCollate constructors to make
+	them easier for Mem functions to call
+
+	\inc\e32des16.h
+	added new TDesC16::CompareC overloads to allow selection of rule set
+
+	\inc\e32panic.h
+	added EBadCollationRulesIndex panic number
+
+	\inc\e32std,h
+	added Mem functions to enumerate collation rule sets and select them when
+	comparing; these are new CompareC overloads
+
+	\inc\u32std.h
+	changed LCharSet to include a collation repertoire (instead of just a ptr
+	to the rules) and a collation attribute repertoire
+	(TUnicodeAttributeRepertoire) for storing locale-specific character
+	attribute tables like radical and stroke count
+
+	\inc\unicode.h
+	added the new structures used by TCollationRepertoire, and added
+	TUnicodeAttributeRepertoire and its constituents; added
+	TUnicode::GetAttribute, so that collation can use locale-specific
+	attributes, and abolished TUnicode::TranslateFromUnicode and
+	TUnicode::TranslateToUnicode
+
+	\lsrc\ls_unic.cpp
+	now contains collation repertoire ptr, not rules ptr, and an attribute
+	repertoire ptr for any attributes supported by the locale
+
+	\ucdt\uc_des16.cpp
+	implementation of new TDesC16::CompareC overloads
+
+	\ucdt\uc_exec.cpp
+	TChar::TranslateFromUnicode and TChar::TranslateToUnicode now do nothing;
+	have not abolished them like the TUnicode functions of the same names
+	because of binary compatibility
+
+	\ucdt\uc_func.cpp
+	added new Mem functions to enumerate and retrieve collation rules; and
+	implemented new Mem::CompareC overloads
+
+	\unicode\collate.cpp
+	reorganised constructor arguments; implemented new operators including
+	those that retrieve locale-specific attributes; increased subkey size to
+	16 bits
+
+	\unicode\unicode.cpp
+	abolished TUnicode::TranslateFromUnicode and TUnicode::TranslateToUnicode
+
+2)	Dennis
+	1)	Machine coded most of the TEiger functions because things like keyboard
+		scanning were taking a ridiculously long time (nearly 500us).
+	2)	Fixed bug SW1-256 - TInt64::TInt64(TReal) won't compile under VC5.
+	3)	Fixed bug SW1-738 - Scheduler bug may leave processes unprotected.
+	4)	Added extra function calls to serial comms PDD VA_COM1.CPP to cope
+		with new chained interrupts.
+
+3)	Alastair
+	1)	Changed Emulator title bar to read "EPOC Emulator".
+	2)	Changed \e32\dpwins\d_medint.cpp and \e32\kpwins\kp_pccd.cpp
+		to use Win32 function GetTempPath() to get the system
+		temporary path rather than manually checking the "temp" environmental
+		variable.  Fixes Epoc Software problem SW1-112.
+	3)	Changed WINS F11 key case closed behaviour so that "case
+		closed" is added to the WINS title bar rather than the case
+		bitmap being displayed.
+	4)	Removed possibility of specifying the case bitmap within
+		WINS's system.ini file, and all references to the case bitmap.
+	5)	Disabled Emulator Window maximise button since the button
+		served no purpose.
+	6)	Added new header \E32\INC\E32WINS.H containing the following
+		WINS-specific functions to be exported from EUSER.DLL
+
+		IMPORT_C TInt SetupEmulatorPaths();
+		IMPORT_C TPtrC EmulatorPath();
+		IMPORT_C TPtrC EmulatorDataPath();
+		IMPORT_C TInt SetupEmulatedDrive(const TChar aDrive,const TDesC& aPath);
+		IMPORT_C TInt MapEmulatedFileName(TDes& aBuffer,const TDesC& aFileName);
+
+		These functions are defined in new file
+		\E32\UPWINS\UP_PATH.CPP, and replace various drive-mapping
+		activities in different places in E32 and F32.  They also
+		incorporate changes to make the Emulator runnable from
+		anywhere.  If the Emulator is running from a traditional
+		\Epoc32\Release\WINS\<build>\ directory, then emulated C: and Z:
+		drives and the Emulator data directory will be as before;
+		otherwise, emulated C: and Z: will be subdirectories 'C' and 'Z'
+		of the Emulator directory, and the Emulator data directory
+		will be the 'data' subdirectory of the Emulator directory.
+	7)	Fixed Epoc Software problem SW1-153 "Allow applications to simulate
+		running from C: or D: on WINS".  F32 has been changed so that
+		an Epoc path, rather than a full Win32 path, is passed to
+		the kernel's DPlatLibrary::DoLoad() function.  The path is mapped
+		to a Win32 path using MapEmulatedFileName() for the Win32 call to
+		LoadLibrary(), but DPlatLibrary.iFileName is set to the Epoc
+		path rather than the full Win32 path.  It is iFileName that function
+		RLibrary.FileName() returns.  Previously F32 would
+		pass in the full Win32 path and DPlatLibrary::DoLoad() would
+		convert it to an Epoc path to set the iFileName value, but for
+		libraries on the emulated Z drive only.
+	8)	In \E32\KPWINS\KP_GUI.CPP, replaced some old dos function
+		calls with newer, more UNICODE-friendly, Win32 ones.
+	9)	Added 2 new, case-sensitive, command-line flags.
+		Use EPOC.EXE -C<emulated C drive> -- (that's 2 dashes) to
+		specify the emulated C drive.
+		Use EPOC.EXE -T -- to specify that the system temporary path
+		should be used as the emulated C drive.
+		These flags will override the default settings and any _EPOC_DRIVE_C
+		setting in the environment or in the System.ini file.
+	10)	Removed obselete code defaulting maximum free RAM under WINS from
+		\E32\KPWINS\KP_HAL.CPP.  The default is now applied by
+		\E32\KPWINS\KP_GUI.CPP.
+	11)	Changes to support international keyboard variants - these changes
+		will mean that WSERV version 100 (or above) and it's corresponding
+		changes are required to provide sensible keyboard behaviour.
+		a) Changed WINS EKERN.DLL so that character codes are passed onto the
+		Window Server in the 2 high bytes of the TRawEvent iScanCode
+		member variable.
+		b) Changed WINS EKTRAN.DLL to translate Epoc scan codes to the
+		character code provided in the 2 high bytes of the aScanCode
+		parameter if this code is available.
+		c) Changed EWSRV.DLL so that the 2 high bytes of the TRawEvent
+		iScanCode are ignored where appropriate.
+		d) Changed WINC ECONS.DLL to support international keyboard
+		input.
+		e) Removed \E32\KPWINS\KP_KYBD.CPP - this file used to provide
+		limited international keyboard support - UK/US variants only.
+	12)	Added KConsoleDllUid, 0x100000C5, to \E32\INC\E32UID.H.
+	13) Made changes to \E32\WSRC\CO_TWIN.CPP to resolve the ECONS.DLL
+		problem in line with the version of Epoc S/W Proposal SW1-84
+		revised 27/8/98.  Some changes to the Eikon console will be
+		required for the solution to be fully effective.  The changes
+		don't go quite as far as the proposal - the text console only
+		attempts to load ECONSEIK.DLL, not ECONS?*.DLL, since the
+		dll-loading code does not handle wildcards.
+	14) Changed \E32\KPWINS\KP_GUI.CPP so that under WINS the pointer
+		name (TMachineInfoV1.iXYInputName) is always either _L("PEN"),
+		_L("MOUSE") or _L("NONE").  This value can be set via
+		\Epoc32\Data\System.ini using keyword "PointerType", and
+		defaults to _L("PEN").  E.G. "PointerType mouse".
+	15) Changed \E32\KPWINS\KP_GUI.CPP to allow Emulator windows to be
+		created which are larger than the PC screen.
+	16)	Changed \E32\GROUP\SWINS.REL to include the new symbian fascia.bmp and
+		friends from R:\SDK\ZIP\SDKMODELS.007.
+	17)	Added new function and an enum to E32WINS.H
+
+			IMPORT_C TInt EmulatorFlip(TEmulatorFlip aEmulatorFlip);
+			enum TEmulatorFlip
+				{EEmulatorFlipRestore,EEmulatorFlipInvert,EEmulatorFlipLeft,EEmulatorFlipRight};
+
+		Calling this function, defined in \E32\UPWINS\UP_GUI.CPP, will change
+		the size and orientation of the emulator's parent and child windows
+		and bitmap.
+	18)	Implemented Epoc Proposal SW1-93 "Help for debugging Panics on WINS".
+		In WINS DEBUG mode, when a thread is panicked, a function in
+		\E32\UPWINS\UP_DEBUG.CPP will be called which will break into the
+		debugger and provide comprehensive information about the panic.  Source
+		file UP_DEBUG.CPP will be needed for this to work properly.  I've
+		removed the __DEBUGGER() macro from RThread::Panic() since it should no
+		longer be required.
+	20)	Added 2 new functions to E32WINS.H - AddToWinsEpocThreadList() and
+		RemoveFromWinsEpocThreadList().  These enable the kernel to create and
+		maintain a list of "real" Epoc threads (as opposed to fake WINS
+		hardware threads) within EUSER.DLL.  New function
+		UpWins::__EpocThread() in UP_STD.H is called by EDLL.OBJ (linked into
+		every WINS Epoc dll) to check whether the current thread is in this
+		list, so that EUSER's E32Dll() routine is only called when real Epoc
+		threads attach to and detach from loaded Epoc dlls.  As a result of
+		this change dlls linked to the new version of EDLL.OBJ will not run
+		against older versions of EUSER.DLL.  All these new functions are
+		defined in new file \E32\UPWINS\UP_THRD.CPP.  This change addresses
+		Epoc Proposal SW1-19, though I haven't removed the calls to E32Dll()
+		with parameters EDllProcessAttach and EDllProcessDetach yet since the
+		window server, and perhaps other components, make use of these.
+
+4) Morgan
+	1)	Added interrupt chaining to TInterrupt.  This breaks binary
+		compatability for this class, but maintains source compatability.
+		Attempts to Bind the old TInterrupt class with the new kernel will
+		fail with KErrNotSupported.
+
+
+Version 1.02.151
+================
+(Made by Pete, 12 October 1998)
+
+1) Morgan
+	1)	Updated TLinda and KEMAD\KE_PIC.CPP to take the new interrupts
+	2)	Added some kernel access functions so device drivers can
+		find DPhysicalDevices, DLogicalDevices, DChunks, and DLibraries
+	3)	Added TDma::Fill()
+	4)	Fixed a bug in the ImpDma interface
+	5)	Added hooks for automatic chaining of Dma buffers
+
+2) Pete
+	1) 		Re-organisation of the SPI bus / ADC channel
+		measurement code in MARM and MAWD builds:-
+			TSpiController is now an abstract class. A
+		TSpiController derived class is defined and instanciated in each
+		variant. During initialisation, the kernel calls
+		TSpiController* Custom::CreateSpiController() to create the
+		appropriate SPI controller device.
+			TSpiController now includes the following
+		pure virtual functions which (hopefully) encompass the variant
+		specific aspects of this device:-
+			- void TSpiController::InitialiseSpiDevice();
+			- void TSpiController::StartAveragedReading();
+			- void TSpiController::StartOneShotReading();
+			Created the file VA_SPI.CPP in each MARM/MAWD
+		variant to implement the above functions (the code for which
+		has been essentially extracted from the appropriate KE_SPI.CPP
+		file). Also moved the following SPI related functions out of
+		VA_HW.CPP into VA_SPI.CPP:-
+		- TBool Custom::TestBootSequence()
+		- TInt Custom::BindSpiChannel(const TDesC8& aName)
+		- TBool Custom::EightChannelAdcFitted().
+			The TSpiController device no longer relies on
+		the digitizer driver to drive it to pull off and process
+		entries from its queue of ADC channels waiting for an ADC reading.
+		The Controller now has its own 8mS tick to perform
+		this. The later can be suspended/resumed by the variant using:-
+			- void TSpiController::Suspend();
+			- void TSpiController::Resume();
+		(For PB-PD/P2 MARM and B1 MAWD variants, the
+		digitizer driver does indeed suspend this operation and
+		drives processing of pending channels itself so as not to
+		change the operation of this driver).
+	2) 		Re-organisation of the way the PC Card Controller
+		hardware (e.g. Etna) is implemented for MARM builds to make
+		use of the fact that the variant DLL can now contain static
+		data. The h/w chunks are no longer allocated in the
+		architecture layer (KE_INI.CPP), but are
+		allocated within the variant as part of the Custom::Init3()
+		function. As such, the function
+		Custom::PcCardCntrlPhysicalAddress() has become redundant.
+	3) 		The function Hal::ColdStart() is now properly
+		exported.
+
+3) Petteri
+	1) Changes to MARM display driver (WD_EIGER.CPP) so to handle
+	different screen sizes. Previous one assumed 640x240.
+	2) Changes to bootstrap and MARM variant layer to allocate an
+	additional h/w chunk for the extra registers in the CL-PS7111 device.
+	3) Various changes to the Cirrus Logic evaluation board
+	variant - to bring back as a supported variant.
+
+4)	Dennis
+	1) Put SCREENVARIANT code back into MARM bootstrap.
+
+Version 1.02.150
+================
+(Made by Alastair, 23rd September 1998)
+
+This release is not intended for ER4, though it could be used as part
+of an ER4 SDK.
+
+1)	Alastair
+	1)	Changed ECDRV.PDD, ESDRV.PDD and ESOUND.LDD as suggested by replies
+		to topic "WINS sound and comms cause deadlocks with STDLIB" under
+		category "Known Epoc Problems" in Notes database
+		"Symbian Tech Support General", except that the change to
+		ECDRV.PDD has been modified slightly so that it doesn't break test
+		T_SERIAL.EXE.  The ECDRV.PDD change has been tested with a version of
+		T_SERIAL.EXE modified to simulate the conditions which
+		could previously cause deadlock.
+		These changes address the following bugs/proposals, but do not
+		represent a permanent solution:
+			Epoc Software problem SW1 - 176 "WINS sound driver
+				deadlock in ESTLIB E32Dll() function."
+			Series5 Software problem SW1 - 503 "ECDRV.PDD can cause
+				deadlocks in simple test programs".
+			Epoc proposal SW1 - 19 "Implement true EPOC32 handling of
+				E32Dll() under WINS".
+		The change to ESOUND.LDD fixes Epoc Software problem SW1 - 179
+		"ESOUND.LDD plays silence indefinitely for short sound samples".
+
+
+Version 1.02.144
+================
+(Made by Dennis, 7th August 1998)
+
+1) Matthew
+	1)	Added code to MISA platform so that the cpu goes into idle mode when
+		in the idle thread.
+	2)	Added \e32\keisa\todo.txt - a to-do list for the MISA platform.
+
+2) Dennis
+	1)	Fixed bug in comms device driver D_COMM.CPP which left unwanted DFCs
+		queued after a power-down. These then attempted to complete requests
+		twice. Power down now cancels any pending DFCs.
+
+3) Jonathan
+	1)	Removed tests for redundant files from valid command in mnt.bat.
+	2)	Updated build.txt to add dire warnings about checking e32ver.h and
+		advice about MNT VALIDating releases.
+
+
+Version 1.02.143
+================
+(Made by Pete, 20th July 1998)
+
+1) Dennis
+	1) Fixed SW1-586 incorrect handling of signed zeros.
+
+2) Morgan
+	1) Updated V32Linda.h to reflect the latest hw
+	2) Added TDma class and supporting classes Dma, ImpDma
+	3) Changed MMAD bootstrap to use the same modular scheme as MARM
+
+3)	Alastair
+	1)	Fixed Epoc Software problem SW1-107 'WINS RThread::Resume problem on
+		Win95' by not faulting the platform unless Win32 API function
+		GetLastError() reports an error as well as ResumeThread().
+
+4) Pete
+	1) 	Fixed a problem with ATA media driver such that it sometimes failed
+		to reduce machine current consumption - having raised it due to a
+		read or write to the CF card.
+	2) 	Fixed a problem with ATA media driver. As part of the exec. call to
+		read/write/format the card, the driver sends a command to the card,
+		to read/write the appropriate number of sectors. Each time a sector
+		is complete, the card generates an interrupt so the driver can
+		either read the data from the sector or supply the data for the next
+		sector to be written. There was a problem with the driver such that,
+		if the first interrupt from the card occurred while still in the
+		initial exec. call, the interrupt could be prematurely cleared. The
+		driver then only detects that the sector has been processed when a 2
+		second time-out occurs on the operation - making the operation
+		appear very slow. This only seems to have been a problem for Viking
+		and Panasonic CF cards.
+	3) 	Alteration to the ATA media driver to improve speed of transfer,
+		particularly on reads from the card. Before, the driver queued a DFC
+		for the completion of each sector read from the card (to write it
+		back the thread making the request). The media driver's buffer has
+		now been increased so that this can be filled under interrupt. A DFC
+		in now only queued when the buffer is full.
+
+
+Version 1.02.142
+================
+(Made by Pete, 1st July 1998)
+
+1) Matthew
+	1)	Changed MISA bootstraps to use the same modular scheme as MARM.
+	2)	Added functions to TSa1100 for new hardware registers in revision D.
+1) Dennis
+	1)	Added thread write function DThread::WriteNoCheck() which doesn't
+		perform the strict checking that DThread::Write() does.
+	2)	Changed TLex::Val(TReal*) to use TRealX in its intermediate
+		calculations in order to increase the precision of the final
+		result. Added a new function Math::MultPow10X which multiplies a
+		TRealX argument by an integer power of 10. This is basically a
+		higher precision version of Math::Pow10.
+1) Pete
+	1)	Changed MARM ATA and CROM media driver to use
+		DThread::WriteNoCheck(). Fixes SW1-482.
+
+
+Version 1.02.141
+================
+(Made by Pete, 10th June 1998)
+
+1) Jonathan
+	1)	Removed private assignment operators from TSglQueIterBase and
+		TDblQueIterBase as per EPOC32 Proposal SW1-53.
+	2)	Made inline RSubSessionBase::SubSessionHandle() public as per EPOC32
+		Proposal SW1-45.
+	3)	Bumped up the E32 KMediaDriverInterface*VersionNumber.
+	4)	Changed the default WINS memory emulation from 4MB to 64MB as per
+		EPOC32 Proposal SW1-88.
+	5)	New code page 1252 and Unicode character information tables derived
+		from release 2.1 of the character database from Unicode Inc.
+		Fixes EPOC32 Software Problems SW1-42 and also adds:
+			80 & U+20AC	  New euro currency symbol
+			8E			  LATIN CAPITAL LETTER Z WITH CARON (= U+017D)
+			9E			  LATIN SMALL LETTER Z WITH CARON (= U+017E)
+			U+FFFC		  OBJECT REPLACEMENT CHARACTER
+	6)	From Graham Asher:
+		The enumerated type TChar::TCategory in e32std.h, used only in the
+		Unicode build, has been changed to accommodate the new character
+		categories in unidata2.txt.
+
+2) Matthew
+	1)	Changed the TSa1100 class - removed SetHalt(), which had been
+		copied over from TEiger, and renamed IntLevels() to	IntsPending()
+		and IntTypes() to IntLevels() to conform with the terminology in
+		the SA1100 documentation. Breaks misa kernel-side compatability.
+	2)	Removed lccr followers from MISA, which were working around a bug
+		in the SA1100.
+	3)	Changed MISA ScreenInfo function to return the address of the
+		beginning of the palette (rather than the pixel data for 8bpp).
+		The screen driver will have to change to take account of this.
+	4)	Removed TSa1100 palette functions - the screen driver should write
+		to memory instead.
+	5)	Removed Cassius-A releasables from the releasables, because we had
+		the hardware taken from us.
+	6)	Changed Windamere(AWD) and SARMBE architectures to set year to
+		rombuild year on a cold boot, which I forgot in the last release
+		(see 3.13 in release 140).
+	7)	Fixed Epoc32 defect SW1-33 ("Problem in Plat::Fault in Unicode
+		builds") by changing Length() calls to Size() calls.
+	8)	Changed sound ldd to use DThread::Read() and Write() rather than
+		doing its own thing this fixes S5 defect SW1-231 ("Machine warm
+		reset when playing sound while spy running").
+	9)	Changed svChangeLocale() function so that it triggers
+		RChangeNotifiers.
+	10)	Changed keyboard translator dll so that the default library is
+		closed when not in use.
+	11)	Incremented EPOC comms-driver minor version number (but not WINS
+		one) and put a check into the pdds so that they will not be used
+		with early versions of the ldd. Partially fixes Bluebell defect
+		SW1-5 ("Triple beep reset when turning on the link").
+	12)	Added an explicit call to compress the kernel heap to
+		S::ChunkCompressAll(). This fixes the E32 bit of Series-5 defect
+		SW1-356 ("Large uncompressible heaps in system components").
+	13)	Fixed bug in sound ldd which caused sine waves to not be
+		cancelled in WINS on PCs which did not support aLaw.
+
+3) Dennis
+	1)	Fixed bug in ARM710.S in EIGER bootstrap code. In function
+		EigerSetCSnWidth register R1 is accidentally overwritten, causing
+		the ROM to be set up incorrectly if its bus width is not 32 bits.
+	2)	Implemented EPOC32 proposal SW1-69. User::StartThread modified to do
+		the DLL attach and detach in separate functions, so that the 1K of
+		stack used in these functions can be reused during actual running of
+		the thread.
+	3)	Fixed problem SW1-51 - renamed TPointerArray<T> to RPointerArray<T>
+		and TSimpleArray<T> to RArray<T>. Replaced TArray(U)Int with
+		RArray<T(U)Int>.  Replaced the destructor with a Close() function to
+		do memory deallocation.  Frozen DEF files modified so that renamed
+		functions are at same ordinal as before, with Close() functions at
+		the same ordinals as the destructors were.
+	4)	Fixed problem SW1-47 - modified code in DebugFunction ProfileResult
+		to get the tick period from Hal::TickPeriod instead of hardcoding it
+		to 15625us.
+	5)	Fixed problem SW1-622 - modified heap code so that all free cells
+		are at least 16 bytes in debug mode, since this is the minimum
+		allocated cell size.
+	6)	Modified RHeap::ReAlloc() so that the nestingLevel field in debug
+		mode is preserved.  This prevents test programs failing a kernel
+		heap check due to one of the kernel's arrays being reallocated
+		during the test.
+	7)	Modified handlers for vectors 0x00 and 0x14 (reset and reserved) to
+		fault with a simulated exception EExcInvalidVector rather than
+		looping forever.  iCodeAddress=0x00 or 0x14, iDataAddress=value of
+		lr on jumping to 0x00 or 0x14.
+	8)	Added functions RChunk::IsReadable() and RChunk::IsWritable() so
+		that user code can determine whether or not a chunk is mapped into
+		its process address space.
+	9)	Fixed problem SW1-370 (Math::Mod is not sufficiently
+		accurate). Changed the algorithm from x%y=x-y*INT(x/y) to a
+		bit-by-bit shift and subtract algorithm.  Added operator%,
+		operator%=, Mod() and ModEq() functions to TRealX class to implement
+		the new algorithm.
+
+4) Petteri
+	1)	Fixed a bug in Math::Round(). (SW1-402)
+	2)	Fixed a couple of bugs in the text window server.
+	3)	Changed Ekern.mmp as required by changes in Makmake.
+
+5) Alastair
+	1)	Changed mnt.bat so that mnt getsrc no longer attempts to make
+		the Epoc work directories.
+	2)	Changed WinCOutput::Write(const TDesC &aDes) so that WINC
+		programs can write output to STDOUT for redirection.  This change
+		applies to ascii builds only.
+	3)	Changed the kernel so that the Windows Alt-F4 keyboard
+		shortcut for closing applications works for WINS.
+	4)	Changed #define in kpwins\kp_chunk.cpp so that the code which
+		checks that requests for more memory won't cause the emulated
+		memory allocation limit to be exceeded applies for WINS only, not
+		WINC.  This won't change WINC behaviour because the emulated
+		memory limit under WINC was always zero, which meant that the
+		check wasn't applied anyway.
+	5)	Changed kpwins\kp_gui.cpp in line with Epoc Proposal SW1-21,
+		so that emulated drive assignment is possible from
+		\Epoc32\Data\System.ini.
+		Syntax is
+		_EPOC_DRIVE_<letter> <path>
+
+6) Jo
+	1)	Fixed Series 5 software problem SW1-440 ("PDD returns different errors
+		in WINS and ARM").  Both WINS and ARM now return KErrNotSupported.
+	2)	Fixed Series 5 software problem SW1-943 ("XXX_CAST macros in E32DEF.H
+		are written incorrectly")
+
+7) Pete
+	1)	Implemented asynchronous rather than synchronous system
+		for read,write and format operations on local media devices.
+		This affects the TLocDrv and DMediaDriver classes.
+	2)	Changed API on for local media devices so that for any given
+		operation (eg read,write,format,reduce size) the position on the
+		device is specified as a TInt64 rather than TInt. This will allow
+		very large media devcies to be supported. This affects the TLocDrv,
+		DMedia and DMediaDriver classes.
+
+		Taking changes 1 & 2 for DMediaDriver, the functions
+			TInt DMediaDriver::ReduceSize(TInt aPos,TInt aLength);
+			TInt DMediaDriver::Read(TInt aPos,TInt &aLength,const TAny* aTrg,TInt aHandle,TInt anOffset);
+			TInt DMediaDriver::Write(TInt aPos,TInt &aLength,const TAny* aSrc,TInt aHandle,TInt anOffset);
+			TInt DMediaDriver::Format(TInt aPos,TInt &aLen);
+
+		become:-
+			TInt DMediaDriver::ReduceSize(TInt64 &aPos,TInt aLength);
+			void DMediaDriver::Read(TInt64 &aPos,TInt *aLength,TLocalDriveMessageData &aTrg,DThread *aThread,TRequestStatus *aStatus);
+			void DMediaDriver::Write(TInt64 &aPos,TInt *aLength,TLocalDriveMessageData &aSrc,DThread *aThread,TRequestStatus *aStatus);
+			void DMediaDriver::Format(TInt64 &aPos,TInt *aLength,DThread *aThread,TRequestStatus *aStatus);
+	3)	Withered the UserPcCardCntrl class. Now all functions are 'not supported'
+		apart from:-
+			void UserPcCardCntrl::PwrDown(TSocket aSocket);
+			TInt UserPcCardCntrl::NotifyChange(TSocket aSocket,TRequestStatus *aReqStat);
+		which are implemented using the corresponding UserSvr functions
+		described below.
+		The media device functions previously provided by UserPcCardCntrl
+		are now provided by D_DRVIF.LDD in E32UTILS.
+		The PC Card controller functions previously provided by UserPcCardCntrl
+		are now provided by D_PCCDIF.LDD in E32UTILS.
+	4)	Added the following UserSvr local media functions:
+			void UserSvr::ForceRemountMedia(TMediaDevice aDevice);
+		Causes remount on next access to specifed device (ie
+		media change simulation).
+			TInt UserSvr::MediaChangeNotify(TMediaDevice aDevice,TRequestStatus *aReqStat);
+		Request notification of power of powerup and media change
+		events on the specified media device.
+	5)	In MARM build the function:-
+			TInt DArmPlatPcCardSocket::EventCallBackEnable(TPccdEvent anEvent)
+		no longer performs a clear of any pending events before enabling an
+		event callback type. Also, it now performs an additional check that
+		a power down of a PC Card hasn't occured (ie Kern::PowerGood()) before
+		enabling PC Card IREQ events.
+
+
+Version 1.02.140
+================
+(Made by Morgan, 14th May 1998)
+
+1) Graham
+		1) Added P3 variant to the rom building capabilities in KBARM
+
+2) Dennis
+		1)	Added support for multiple kernels/variants in the same ROM.
+			This requires F32 096 and ROMBUILD version 093.
+		2)	Added TSimpleArray<>, TPointerArray<>, TArrayInt simple array classes.
+		3)	Changed occurrences of CArray* in the kernel to TSimpleArray<>.
+		4)	Rearranged ARM boot code into a form which is easier to adapt to other
+			hardware and which facilitates multiple-boot ROMs.
+		5)	EKERN.EXE no longer links to the variant DLL. Instead, the variant DLL
+			is found by searching a list of possible variants.
+		6)	Added executive call UserSvr::RomRootDirectoryAddress() to enable F32 to
+			obtain the address of the ROM file system root directory. This address is
+			now determined at boot time from a list of possible root directories, one
+			for each variant which the ROM supports.
+		7)	Added code to enable profiling of threads (measures CPU time used by each
+			thread in the system). To use this, rebuild the MARM REL version with the
+			symbol __PROFILE__ defined at the top of M32STD.H. You will also need test
+			program T_PROF.EXE and device driver D_PROF.LDD from E32TEST.
+		8)	Added two new format options %O and %o to Kern::Printf. %o prints the short
+			name of a CObject and %O prints the full name. Also modified Kern::Printf
+			to print (null) if a NULL pointer is passed into %S, %O or %o.
+		9)	Modified statements of the form Kern::Printf(_L("%S"),&obj->FullName())
+			to Kern::Printf(_L("%O"),obj).
+		10)	Added a generic algorithm for determining the size and configuration of
+			DRAM devices to the ARM bootstrap code.
+		11)	Modified ARM/ISA/X86 bootstrap to map in the PageTableInfo array at
+			0x41080000. The fixed offset from the page directory simplifies remapping
+			during a reschedule.
+		12)	Added fields iHomePdes, iPdes and iNumPdes to the definition of DPlatChunk.
+			These indicate directly which PDEs are used by the chunk and simplify
+			moving a chunk around. Modified the scheduler to use these fields when
+			switching processes. Added a function DPlatChunk::SetPdeInfo to set up
+			these fields.
+		13)	Removed the current consumption setting code from the scheduler. Added
+			a function K::TotalCurrentConsumptionInMilliAmps() which calculates the
+			machine current by adding K::TotalCurrentMilliAmps to the machine current,
+			determined by simply looking to see if the null thread is running.
+		14)	Modified DPlatProcess::LookupChunk to do a binary search on the chunk list
+			instead of a straight entry-by-entry search.
+		15)	Fixed a bug in DPlatChunk::ReallocateHomeAddress which would result in a
+			chunk being left without a home address if all linear addresses in the
+			home section were exhausted.
+		16)	Modified text window server so that it loads EDISP.DLL from Z:\SYSTEM\LIBS
+			and invokes ordinal 1 in order to create the screen device driver, rather
+			than being statically linked to EDISP.DLL. This is necessary for multi-boot
+			ROMs since EDISP.DLL is hardware dependent.
+		17)	Added WINDERMERE architecture (\E32\KEAWD), Bluebell V1 variant (\E32\VAWDB1),
+			and dual-boot EIGER/WINDERMERE test ROM (\E32\KBAWD).
+			This builds and runs on Rack D but is obviously completely untested on
+			Windermere. There are some outstanding issues with the Windermere port:
+			i)		Standby code may be faulty - problem with restoring state when machine
+					powers back up.
+			ii)		PC card/CF card code requires modification to use LDRH/STRH 16 bit
+					instructions rather than relying on EIGER 'mad-mad mode'.
+			iii)	Bootstrap needs modifying to detect Windermere.
+			iv)		SPI controller and LCD controller setup may be incorrect.
+
+3) Matthew
+		1) Got rid of MARM P1 (banana) variant.
+
+		2) Bug fixes to MISA so it can be run in 4bpp and 16bpp modes.
+
+		3) Changed misa to use the hardware rtc to keep track of the time, instead of
+		   counting ticks.
+		   Unfortunately the 32MHz crystal is very slow to warm up, so a cold boot is now
+		   much slower than it was because it has to wait for the crystal to stabilise.
+
+		4) Changed misa bootstraps to be fractionally more like the marm one.
+
+		5) Moved the WINS-specific setting of the daylight-saving mode out of the
+		   independent layer and into KPWINS. Removed the resetting of the
+		   daylight-saving from the change-locale function. These mean that S5
+		   defect SW1-558 ("Remove windows dependency") has been fixed.
+
+		6) Fixed bug in DLogicalChannel::Request(), which previously, in WINS,
+		   could have sent a request from a thread which had no right to do a request
+		   on that channel.
+
+		7) Integrated Andrew Baldwin's wonderful new WINS sound pdd, which will not
+		   offend your ears. Many thanks to Andrew for this.
+
+		8) Modified sound ldd so that it can pass multiple samples to the pdd. Modified
+		   pdds to use this new functionality. This reduces the amount of time spent in
+		   the service routine.
+
+		9) Fixed S5 defect SW1-228 ("Dial setup errors") in sound LDD.
+
+		10)Incrememented sound driver minor version number, to stop people mixing old
+		   and new pdds/ldds.
+
+		11)Put an __DEBUGGER() macro into K::PanicCurrentThread() - previously these
+		   panics were just stopping WINS without giving you a chance to jump in with
+		   a debugger.
+
+		12)Added int3's to WINS DEBUG versions Plat::Panic() and Plat::Fault() so they
+		   break into the debugger whatever the state of the JustInTime flag.
+
+		13)Changed MISA and MARM cold-boot to read the year from the rom header and set
+		   the time to 10:10 January 1st of that year. Fixes Bluebell defect SW1-134.
+
+		14)Made the private function KernelCompressAll() into the public
+		   User::CompressAllHeaps(). This is to allow Shell to trigger heap compression
+		   more easilly (see Bluebell defect SW1-299).
+
+4) Morgan
+		1) Integrated the MADLinda architecture and build system
+		2) Bug fix to KESARMBE\KE_PIC.CPP
+		3) Changed occurences of DisableIrqs and EnableIrqs to DisableIrqsToLevel2 and
+		   RestoreIrqs in SARMBE architecture
+		4) Added callback hook for the idle loop
+		5) Added Kern::PhysicalDeviceFromHandle
+		6) Added an external debugger interface (K32DBG.H).  Used it to bolt on an
+		   InfoOutput debugger for MSDEV.  On the MARM platforms bolted on a logging
+		   debugger for use by an external JTAG debugger, (like TI's).  No debugger
+		   for X86.
+
+5) Jonathan
+		1) Made Eiger and Windemere text drivers return correct screen size
+		   from CScreenDriverMarm::Init() instead of assuming 80x24.
+		   Removed old #ifdefed-out SetMode() code from Eiger driver.
+
+
+================
+Big version number increment to skip over Liffey release.
+================
+
+Version 1.02.128
+================
+(Made by Jonathan Harris, 8th May 1998)
+
+1) Jonathan
+	1)	P::SetMachineConfiguration(): Don't update the bits of the SuperPage that
+		belong to the boot code (including the exception info), apart from the
+		display contrast.
+
+
+Version 1.02.127
+================
+(Made by Graham Darnell, 26th March 1998)
+
+1) Dennis
+	1) Added a new variant function Variant::SetSoundDriverEnabled(TBool) for use
+	   with Snowball in order to allow user code to enable/disable the speaker
+	   using UserHal::SetSoundDriverEnabled().
+
+	2) Added some code to Variant::Init3 for P2 variant to enable correct operation
+	   with either a single ROM device, 4Mb on CS0 and 2Mb on CS1, or 4Mb on both.
+
+2) Matthew, Pete and Rob Pym
+	1) Converted the MISA build from being for a Digital IT board to being for
+	   SA-1100 based hardware. This has an identical user-side API to MARM, so
+	   MARM releasables will run unchanged. To build a rom use the MARM F32.
+
+	2) Added variants VISABA for a Digital's "Brutus" board and VISACA for a
+	   Cassius rack.
+
+	   Note: TO BUILD A TEXT-SHELL ROM FOR BRUTUS YOU WILL NEED THE ESHELL.EXE
+			 FROM F32 096 OR HIGHER. PRIOR TO THIS, THE SHELL TRIES TO CREATE
+			 A CONSOLE WINDOW LARGER THAN THE BRUTUS SCREEN AND CRASHES.
+
+3) Matthew
+	1) Changed all interrupt-binding and startup-beep internals to use Narrow
+	   descriptors in the Unicode build.
+
+	2) Added code to read extra digitiser information in E2 on P1, P2 and PD
+	   variants. Changed the digitiser drivers on P2 and PD machines to use this
+	   extra information, so different digitisers can be used on these machines.
+
+	   If the new  E2 information is invalid due to a new rom has been put into
+	   an old machine, then this is detected due to the x rise-time being zero,
+	   and the driver defaults to the previous good values.
+
+	   If you wish to program your E2 with values suitable for the standard
+	   digitiser use XYSpread/16=6; X-Rise=1; Y-Rise=1; Pen-down discard=0.
+
+	3) Moved TVideoMode enum from d32video.h to e32twin.h, and stopped e32twin.h
+	   including d32video.h, thus fixing SW1-921.
+
+	4) Changed sound LDD to make sure that the internal state is implies no
+	   request is pending when a play request is completed. Thanks to Andrew
+	   Baldwin for finding this.
+
+	5) Changed some RChangeNotifier internals so that the internal state implies
+	   no request is pending when a request is completed.
+
+4) Graham/Matthew
+	1) Changed the WINC memory information function so that it doesn't emulate a
+	   machine with 4 megs of ram.
+
+	2) Removed some critical-section switching in the WINS thread-startup code.
+	   This fixes a bug which occasionally caused WINC to hang on fast machines
+	   if a thread did an exec call very soon after being resumed for the first
+	   time.
+
+		3) Removed another 'dance of the semaphores' during WINS thread
+		   startup. This seemed to prevent a resumer proceeding
+		   until all resumee dll entry points have been called. Since
+		   there seems to be no reason for this and since this was
+		   causing a problem when threads were resumed inside
+		   dll entry code, there seemed no point in keeping it.
+		   However, this might be something to watch out for.
+
+	3) On WINS/WINC, the call to tick the tick-queue is now sandwiched between a
+	   Plat::EnterCS() and a Plat::LeaveCS(). This will make these platforms far
+		   more robust, but might break work-arounds that may or may not exist in
+		   user code.
+
+5) Morgan
+	1) Fixed Bluebell defect SW1-43.
+
+	2) Added Dll::FreeData().  This should be called in the EProcessDetatch
+	   of those Dlls sporting static data.
+
+6) Graham
+		1) Added comms and sound device drivers to the WINC
+		   releasables.
+
+
+Version 1.02.126
+================
+(Made by Jonathan, 26th February 1998)
+
+1) Matthew
+	1) Tweaked MMP files in preparation for misa platform.
+
+	2) Added lots of useful constants to k32std.h - these will be used in the
+	   misa platform.
+
+	3) Removed the obsolete DriveName and PccdSlotHame() functions from the
+	   variant layers.
+
+2) Graham
+	1) Added K32KEYS, K32COMM, and K32SND header files to INCK release
+
+	2) Split off the S1 variant into its own project
+
+	3) Removed S1 variant from E32 project
+
+	4) Fixed a bug in the MARM architecture that assumed that an eight channel
+	   ADC was fitted when powering up.
+
+3) Dennis
+	1) Modified RHeap definition so that it is now derived from RHeapBase,
+	   which contains all the non-debug data members. This is to force GCC
+	   to put the vptr in the same place that it always was in release builds.
+	   This is to enable test code to run on a real machine with EUSER.DLL
+	   replaced from RAM.
+
+	2) Changed UP_CON.CPP in UPMARM, UPMX86 and UPWINS to only include <e32def.h>
+	   instead of up_std.h. Previously, modifying k32std.h would cause up_con.cpp
+	   to be rebuilt but not the real econs.dll.
+
+4) Alastair
+	1) Added edll.pdb and eexe.pdb to ewinsdb.rel because following the move
+	   to using makmake edll.obj and eexe.obj no longer contain their own
+	   debugging information.
+	2) Updated .MMP files previously using the START MARM .. END block keyword
+	   DLLNAME so that they use the new LINKAS keyword instead.  Updated MNT.BAT
+	   to get e32tools 091 and e32toolp 091.
+
+5) Jonathan
+	1)	Added new SwitchOn() digitizer driver call. Needed by the Snowball
+		variant to reinit the digitizer after power-off.
+
+
+Version 1.02.125
+================
+(Made by Graham, 16th February 1998)
+
+1)	Morgan
+	1)	Allowed static data for Rom Ldds/Pdds.  These require the 'fixed'
+		keyword in the obey file.
+
+2)  Graham
+		1)      Removed debug/release interoperability from WINS/WINC.
+
+
+Version 1.02.124
+================
+(Made by Jonathan, 10th February 1998)
+
+1) Jonathan
+	1)	Incremented KMediaDriverInterfaceMinorVersionNumber because the
+		media interface has changed (actually, it changed back in 120).
+	2)	Added new TPasswordToken member to TMachineConfiguration on WINS,
+		updated on setting the password or machine configuration.
+	3)	For internal consistency, WINS now actually limits the amount of
+		available memory on the 'machine' to the parameter set in
+		system.ini, and defaults to 3M if no value is set. Previously WINS
+		merely _reported_ 3M if no default was set, but allowed you to
+		allocate past 3M. This broke test code.
+	4)	Fixed generation of event on Off keypress on Snowball 1.
+	5)	Incorporated Pete's change: Snowball 1 variant no longer waits for
+		400ms for SanDisk to come out of reset. Instead, the media driver
+		polls the SanDisk on first use.
+
+2) Alastair
+	1)	Updated e32base.h and ub_sec.cpp with Andrew Thoelke's changes to
+		implement EPOC32 proposal PR-0077, that a new function be provided
+		to return the maximum possible length that an encrypted piece of
+		data could become under the encryption scheme in use given the
+		initial length of the data.
+	2)	Changed mnt getrel so that it doesn't attempt to get the non-existent
+		.PDB files for release builds.
+
+3) Basher
+	1)	Changed K::EmergencyPowerDown() and K::EmergencyPowerDownDfcFn()
+		functions (ks_power.cpp).
+
+	2)	Changed Variant::EmergencyStandby() - on the folowing varients
+		varmcl, varmpd, varmsa and varmsb.
+
+	3)	\varms1\va_mati.cpp changed - implementing safe EmergencyPowerDwn
+		control. EmergencyCallBack function added and the SectorWrite function
+		changed to control emergency system shutdown to prevent Liffy's
+		internal CF card from corruption.
+
+4) Morgan
+	1)	Added VARMLA variant and bigendian support
+
+5) Graham
+		1)      Changed variant structure for VARMCL, VARMPB, VARMPC,
+				VARMPD, VARMP1, VARMP2, VARMS1, VARMLA.
+
+				The variant object is now created on the kernel heap.
+				This allows the variant code to have state and will
+				result in many simplifications of code that interacts
+				between variant and architecture layers. It will also
+				allow for improved customisation possibilities for
+				our licensees.
+
+				Questions concerning historical and cross-platform
+				binary compatibility are yet to be resolved.
+
+		2)      Cleaned up E32STD.H. This now follows the new standard:
+
+						CBase *Function(TDes &aParameter);
+						becomes
+						CBase* Function(TDes& aParameter);
+
+		3)      Snowball PTR2 varmsb and Delaware varmpg removed.
+
+6) Petteri
+		Changes to the text window server:
+		1)      Four different window classes have been reduced into just one.
+
+		2)      The notifier server now has a thread of its own and uses text window
+				server API for its output.
+
+		3)      ASCII font has been changed to get the window borders back.
+
+		4)      There is now a constant KCONSFULLSCREEN, which can be used to create
+				a full-size window whatever the size of the screen.
+
+		5)      Windows can be moved, resized and scrolled using the mouse or a pen.
+
+		6)      OnTop flag has been added. If the flag is set, the window stays on top
+				of other windows.
+
+		7)      The size of notifier windows now depends on the length of the text
+				which is being displayed. Buttons can have more than just one character
+				and they are centred. One button option now works properly. Pressing
+				ESCAPE returns value 0, ENTER returns 1. The notifier window stays on
+				top of other windows.
+
+		8)      Info prints are also variable-sized and they stay on top of other windows.
+
+		9)      System.ini files are now read correctly in Unicode build. (Files written
+				in Unicode cannot be read.)
+
+		10)     Colour support has been added. WINS supports a mode EColor256, where a
+				palette of 256 colours is available. SetTextAttribute() provides an easy
+				way to display text in colour. The following attributes are available:
+				ETextAttributeNormal, ETextAttributeBold, ETextAttributeInverse and
+				ETextAttributeHighlight. Palettes (if supported) can be manipulated and
+				read with SetPaletteEntry() and GetPaletteEntry(). SetTextColors() changes
+				colours for text foreground and background. Colours for window background,
+				window borders and screen background are set with SetUIColors().
+
+		11)     The text window server API has 8 new functions:
+					 TInt SetWindowPosAbs(const TPoint &aPosition) (Sets window position.)
+					 TInt ScreenSize(TSize &aSize) (Returns screensize in characters.)
+					 TInt SetMode(TVideoMode aMode)
+					 void SetPaletteEntry(TUint anIndex,TUint8 aRed,TUint8 aGreen,TUint8 aBlue)
+					 void GetPaletteEntry(TUint anIndex,TUint8 &aRed,TUint8 &aGreen,TUint8 &aBlue)
+					 void SetTextColors(TUint anFgColor,TUint aBgColor)
+					 void SetUIColors(TUint aWindowBgColor,TUint aBorderColor,TUint aScreenColor)
+					 void SetTextAttribute(TTextAttribute anAttribute)
+
+Version 1.02.123
+================
+(Made by Jonathan, 27th January 1998)
+
+1) Alastair
+	1)  Changed MNT.BAT so that no attempt is made to release PDB files for
+		WINS and WINC release builds, because MAKMAKE generated makefiles do
+		not create them by default.
+
+	2)	Removed references to defunct directory \e32\dmedia from MNT.BAT.
+
+2) Jonathan
+	1)	Drain the Snowball 1 digitizer FIFO before enabling its interrupt to
+		prevent it from generating spurious and unwelcome penup/downs on
+		startup.
+	2)	P::SetMachineConfiguration() : delete the current password and update
+		the password from the new configuration.
+	3)	Dropping DTR on Snowball 1's 2nd serial port (the phone port)
+		asserts the ONKEY signal to the phone, allowing users of that serial
+		port to turn the phone on/off.
+	4)	Corrected size returned by Custom::XYInputSize() on Snowball().
+	5)	Hugely simplified the Snowball 1 key data tables.
+	6)	Added special support for the Snowball 1's Off key in the keyboard
+		driver. But this doesn't work.
+	7)	Belatedly updated kbarm files with support for Snowball 1.
+
+Version 1.02.122
+================
+(Made by Graham, 23rd January 1998)
+
+1) Jonathan
+	1)  Snowball 1. Don't reset the ASIC on startup.
+
+2) Dennis
+	1)	New serial comms LDD and modified PDDs for all variants.
+
+	2)	WINS comms LDD is now separate from the real comms LDDs. WINS LDD lives in
+		DPWINS directory with the WINS PDD, and is currently the same as the old comms LDD.
+
+	3)	Added hooks to KEARM\KE_INT.CPP to allow another operating system to be bolted on to EPOC32.
+
+	4)	Added test program T_PTNOS.CPP with LDD D_PTNOS.CPP to test the partner OS hooks.
+
+	5)	Added a check to KPEPOC\KP_PROC.CPP to prevent two copies of a fixed-address
+		process from being created. DPlatProcess::DoCreate will leave with
+		KErrAlreadyExists if it finds a matching EXE code chunk belonging to a fixed
+		address process.
+
+	6)	Added some more facilities to T_TERM.CPP, including file upload and download
+		and loopback.
+
+	7)	Fixed typo in ARM boot code which caused problems by failing to map in the
+		CS1 ROM if ROM address 0x10000ec6 (physical) contained zero.
+
+	8)	Fixed bug which could cause processes to be run with incorrect domain access
+		if an interrupt occurs during a reschedule. This caused machine to reset
+		during heavy keyboard use.
+
+	9)	Added missing __NAKED__ declaration to ARM assembler versions of
+		TDes8::AppendNumUC() and TDes8::AppendNumFixedWidthUC().
+
+	10)	Fixed problem in DThread::Write() (all 3 variants) - it was returning an error
+		code if the source descriptor had zero length and a null pointer.
+
+3) Graham
+		1)      Created a new public header file - E32PANIC.H - which
+				contains the base panic numbers.
+
+		2)      Split the test programs off into a new E32TEST
+				project.
+
+	3)	Removed full exception handling from WINS and WINC if running under Windows '95.
+		E32's exception handling system relies on being able to asynchronously
+		meddle with another threads context and stack in order to inject a call
+		to an exception handler into that thread's normal train of execution. This
+		technique works with NT but Windows 95 is not up to it. It is clear that
+		not every operating system would be able to handle this. Consider, for example,
+		the possibility that the thread is inside an OS call when the call is injected.
+
+4) Alastair
+	1)	Moved build system over to MAKMAKE.  The batch files for building E32 are
+		created by e32tools's BLDMAKE.  From the GROUP directory, type BLD or CLEAN
+		or PREPARE without any arguments for help on how to use the new batch
+		commands.  MAKMAKE has not yet been applied to the build system for MISA,
+		MX86.  CLEAN.BAT uses NMAKE to do its cleaning, so a PREPARE.BAT
+		needs to have been done first.  PREPARE.BAT will make the makefiles and
+		build the working directories.
+
+	2)	Renamed freeze files from .FRZ to .DEF, including CONSMARM.FRZ, CONSMISA.FRZ
+		and CONSWINS.FRZ.
+
+	3)	Removed WINS_UID statements from all source files.
+
+	4)	Changed EDLL.O, EXDLL.O, EEXE.O so they are built by separate makefiles
+		rather than that of EUSER for MARM.
+
+	5)	Changed KE_EXE.O so that it is built by a separate makefile rather than
+		that of EKERN for MARM.
+
+	6)	Added SARMBE platform to the build process so big-endian single-process ARM
+		platform can be built.
+
+
+Version 1.02.121
+================
+(Made by Graham, 10th Dec 1997)
+
+1) Dennis
+	1)	Fixed bug whereby CObjectIx::~CObjectIx could crash if Close()ing an object
+		in the index caused other objects to be removed from the index and thereby
+		caused the array to be ReAlloc()ed.
+
+	2)	Speeded up TInt64 multiply a bit more on the ARM.
+
+	3)	Added a mechanism whereby every DFC knows whether or not it is pending. Kern::Add
+		will now only queue the DFC if it is not already queued. DFCs are flagged unqueued
+		just before being run. A Queued() function is provided to discover whether a DFC
+		is currently queued or not, and a Cancel() function is provided to cancel a DFC
+		which is currently pending.
+
+	4)	Added missing break statements to case EConsoleSetTitle and case EConsoleSetSize
+		in ws_main.cpp
+
+	5)	Fixed bug in KBARM\BOOTROM1.S and KBSARM\BOOTROM1.S where a register was being
+		corrupted (subroutine WordMove corrupts r3) leading to the kernel BSS section not
+		being correctly zeroed on reset.
+
+	6)	Fixed bug in TInt64::GetTReal() ARM machine code version - wrong shift count in one
+		instruction.
+
+	7)	Added new function KFormat() to KS_UTL.CPP to do limited printf-style formatting
+		without using any EXEC calls. Modified Kern::Printf to use this function instead
+		of TDes::AppendFormatList(). This enables Kern::Printf to be used in fast exec
+		calls, interrupts etc. Use a static buffer to receive the formatted string instead
+		of an automatic one to avoid gobbling a large amount of stack.
+
+	8)	Added a new flag ExecMutateFlag which is set by the IRQ and FIQ dispatchers if
+		an interrupt occurs in SVC mode. The fast executive dispatcher tests this flag on
+		return from the exec function and if it is set, DFCs and/or a reschedule will be
+		executed in the same way as for a slow exec call. This fills a hole in the interrupt
+		scheme whereby if an FIQ occurred during a fast executive call and queued a DFC,
+		the DFC would not be run before user code was resumed. This flag can also be set
+		by a fast executive call in order to allow rescheduling to occur.
+
+	9)	Changed some executive calls from slow to fast to reduce overhead in the case where
+		a reschedule is not needed. These are ChunkBase, ChunkSize, ChunkBottom, ChunkTop,
+		ChunkMaxSize, MutexCount, MutexWait, MutexSignal, ProcessId, ProcessExitReason,
+		ProcessExitType, ProcessExitCategory, ProcessPriority, ProcessFlags, SemaphoreCount,
+		SemaphoreWait, SemaphoreSignal1, ServerReceive, SessionSend, ThreadId,
+		ThreadPriority, ThreadProcessPriority, ThreadFlags, ThreadExitType, ThreadExitReason,
+		ThreadExitCategory, ThreadRequestCount, ThreadRequestComplete, WaitForAnyRequest
+		and SvSendReceive.
+
+	10) Use a different stack for IRQs (IrqStack) rather than the reentrant stack. This
+		allows IRQs to be enabled during a fast executive call. ThreadRequestComplete,
+		SessionSend, SvSendReceive, ServerReceive enable IRQs during their execution.
+
+	11)	Modified the exception handling mechanism. All exceptions are now placed into
+		one of three categories:
+
+		Fatal		(exceptions in IRQ, FIQ or ABT mode) - these always cause a kernel fault
+		Critical	(SVC mode or UND mode with the kernel locked) - these cause a kernel
+					fault unless exception trapping is enabled (DThread::iExceptionErrorCode)
+		Noncritical	(user mode or UND mode with the kernel unlocked) - these are handled by
+					exception trapping, thread exception handler, global exception handler
+					in that order. If none of these is active, the current thread is paniced,
+					and if that thread has the system flag set a kernel fault results.
+
+	12)	If an exception occurs while the kernel is locked, DFCs will not be run at the end
+		of the exception handler.
+
+	13)	PD Variant::Init3() now sets CS1 ROM size to 4Mb and total ROM size to 8Mb.
+
+
+2) Morgan
+	1)	Renamed Dll::Data to Dll::InitialiseData()
+	2)	Fixed zeroing bss for Dll data in ROM
+
+
+Version 1.02.120
+================
+(Made by Jonathan, 24th Nov 1997)
+
+1) Pete
+	A) Various changes to PC Card Controller to fully support I/O cards as well as memory cards:-
+
+	1)	Added a new (exported) PC card controller function -
+		TInt DPcCardCntrl::RestoreCardPower(TSocket aSocket, TInt aResetProfile).
+		This re-applies power to a PC Card which has previously been successfully powered by the system.
+		If a media change has occurred on the socket since it was last powered then function will
+		immediately return KErrGeneral. The power up process is the same as carried out by the controller
+		function PowerUpCard() - wait up to 2.5Secs for card to become ready using specified reset
+		profile. However, this function doesn't implement a TRequestStatus mechanism when complete.
+		It is left to the caller to poll the card status. If the card had previously been configured when
+		powered and the configuration options allow the configuration to be restored (see 3) then the
+		card will be reconfigured automatically when it is re-powered.
+	2) 	Modified the PC card controller function DPcCardCntrl::PowerUpCard() so that, like RestoreCardPower()
+		it re-configures PC cards which were previously configured when the card was powered down if a media
+		change hasn't happened since. Also, the optional last parameter (was TInt aResetLen, now TInt
+		aResetProfile) now specifies both the reset length and a pause after the card becomes ready. The upper
+		16bit word specifies a pause period (in 20mS units) after the card signals it is ready before the
+		controller updates the socket status (and TRequestStatus is signalled). The lower 16bit word specified
+		the length of the reset pulse (also in 20mS units) applied to the card.
+	3) 	Added a new version of the PC card controller function DPcCardCntrl::RequestConfig(). The new
+		version has an additional parameter 'TUint aFlag' (the old version is now obsolete). The only
+		flag currently defined is 'KPccdConfigRestorable' which is set if the config may be restored
+		automatically by the controller if the card is re-powered (see 1 and 2).
+	4) 	Added new values to TPccdSocketStatus (to support 1,2 and 14). This can now have the following
+		values:-
+		- ESocketFullyOff: 	Card not present or present but not yet powered.
+		- ESocketPoweredDown: 	Card present, not currently powered but has been powered
+						and could be restored to previous configuration (ie no media change
+						since it was last powered).
+		- ESocketBatTooLow:	Card present, but not currently powered. A previous attempt to
+						power the card failed because the main battery voltage was too low.
+		- ESocketNotReset:	Card present and powered, waiting for it to become ready.
+		- ESocketReady:		Card present, powered and ready.
+		- ESocketCorruptCard:	Card present but not powered since it cannot be recognised by
+						controller (not used yet).
+	5) 	Changed the PC card controller event type that causes the mount status of TLocalDrive objects
+		(associated with PC card media) to be updated. Before, the status was updated on a power-up
+		event (EPccdEvPwrUp) meaning that any subsequent access to the TLocalDrive object would
+		be preceded by a remount.  Having it on power-up rather than power-down meant the media drive
+		system only had to bind to one event rather than EPccdEvPwrDown and EPccdEvEmergencyPwrDown.
+		This however meant it was not possible to power-down cards during periods of inactivity. The
+		media drive system now binds to power-down events.
+	6) 	Change to ATA media driver (MEDATA) on ARM architectures brought about by the emergency power
+		down changes in E32-V115. The driver was bound to the PC card controller emergency power down
+		event. Since the driver's event callback is now called on a DFC, changes have been necessary
+		to handle card writes aborted by emergency power down.
+	7) 	Added a new (exported) PC card controller function -
+			TInt DPcCardCntrl::SetEvent(TSocket aSocket, TPccdEvent anEvent, TInt anInfo);
+		This allows drivers etc to generate PC card events. It also allows extra info to be passed to
+		callback functions via 'anInfo' (see 8 below).
+	8)	TPccdCallBack has an extra member 'TInt iCallBackInfo' which can be used to provide extra info.
+		on a PC card controller event. Extra info on the reason for card power down is now provided in
+		iCallBackInfo for EPccdEvPwrDown events.
+	9) 	The following functions have been added to the custom DLL:-
+			TPtrC PcCardMediaChangeIntSource(TInt aMediaChange)
+			void ClearPcCardMediaChangeInt(TInt aMediaChange)
+			TMediaState PcCardMediaState(TInt aMediaChange);
+		Prior to these changes the PC card controller media change implementation was completely
+		implemented in the architecture level and above, meaning that variations to the media change
+		system couldn't be handled without a new architecture.
+		Also added an additional member 'TInt iMediaDoorCloseDelay' to 'TPccdCntrlMachineInfo' (returned by the
+		custom function PcCardMachineInfo()) which allows the media door switch de-bounce parameter to be specified
+		in the custom.
+	10) 	Support for dual voltage PC Card sockets added. These are sockets where the VCC voltage can be
+		altered depending on the type of card detected (typically 3.3V or 5V). The system implemented,
+		initially sets the socket VCC depending on the voltage setting indicated by the cards VS (voltage sense)
+		signals. Dynamically changing the socket VCC once the card is powered (in response to information in
+		a card's CIS etc) is not supported.
+	11) 	Added a new (exported) PC card controller function -
+			TPccdSocketVcc DPcCardCntrl::SocketVcc(TSocket aSocket);
+		This returns the current VCC setting for the specified socket. Note that this function
+		returns info on its current VCC setting even when the supply is turned off.
+	12) 	Generally tidy up of the ARM PC card controller VCC implementation. Additions of the following
+		function to custom DLL:-
+			PcCardVccInfo(TInt aPsu,TPccdCntrlVccInfo &aninfo).
+		TPccdCntrlVccInfo is defined:-
+			class TPccdCntrlVccInfo
+				{
+			public:
+				TUint iVoltageSupported;
+				TInt iMaxCurrentInMicroAmps;
+				TUint iVoltCheckInterval;
+				TPccdPsuVoltChkMthd iVoltCheckMethod;
+				};
+		This specifies the voltage(s) that the supply supports (5V,3.3V etc), the maximum current
+		it can supply, when the o/p of the supply should be checked (once when first turned on,
+		or continuously while on) and how the voltage should be check (via the ADC channel reserved
+		for the PC card controller or via a variant layer function).
+	13) 	TPcCardPsu renamed to TPcCardVcc since it now has functionality which could
+		only be attributed to a VCC supply (eg 10&12 above) rather than a generic PC Card supply.
+	14)	Added an additional member 'TInt iDisableOnLowBattery' to 'TPccdCntrlMachineInfo' (returned by the
+		custom function PcCardMachineInfo()). This can be used to set a battery level (see TSupplyStatus) such that
+		if the main battery level is below this level, the PC card controller will no longer power up
+		any PC cards. Set to EZero to disable this feature.
+	15) 	Fixed problem clearing PC Card IREQ interrupts on ARM. On ARM platforms the PC card controller
+		IREQ interrupt service routine was clearing the interrupt in the controller hardware (ETNA)
+		before calling any ISRs bound by drivers. Since it is generally the driver ISR which clears
+		the source of the interrupt on the card you end up with a second bogus IREQ interrupt. This
+		only occurs when 'level mode' interrupts are enabled, not 'pulse mode'. Pulse mode interrupts
+		are selected if supported which is why the problem was only discovered so late in the day.
+	16)	Changed the reset timing when powering up a PC card. Now:- Apply reset for 100mS, wait up to 2.5Seconds
+		for card to become ready, delay any access to the card for a further 100mS after ready. (Was:- apply reset
+		for 60mS, wait 2.5Seconds for ready and no delay on subsequent access).
+	17) 	Fixed problem in PC card serial port PDD where the destructor could be called before the member
+		'iSocket' was initiated. The destructor calls PcCardCntrl::PowerDownCard(iSocket). This was
+		a particular problem on rack D where the PC card socket is socket 1 (CF card socket is socket 0)
+		and the rack hw doesn't fully isolate the two sockets. Certain comms programs attempt to open a channel
+		on the PC card serial port while a channel is already open on this device. These subsequent attempts fail
+		calling the PDD destructor which then was incorrectly powering off the wrong socket. Due to the h/w
+		implementation, this was actually resulting in the serial PC card being reset.
+	18) 	Fixed a problem affecting EXTFIQ. Once you bound a TInterrupt to EXTFIQ it was not possible to unbind
+		again.
+	19) 	Added the following test programs to TPCCD:-
+		i)T_MEDCH (and associated LDD MEDCH.LDD): Soak test of Compact Flash (ATA) - h/w media changes.
+		ii)T_EXTFIQ (and associated LDD EXTFIQ.LDD): Continuously generates EXTFIQ on rack D using EXTFIQ.LDD.
+		iii)T_BEXFIQ (and associated LDD BEXFIQ.LDD): Generates EXTFIQ on rack D, associated LDD binds and clears
+		FIQ.
+		Also modified DRVSOAK to better support emergency power down testing.
+
+	B) 	Modification to serial comms in order to support PC card serial devices:-
+
+	20) 	Added mechanism for opening a channel on a PC Card I/O device. These devices requires an asynchronous
+		power-up of the card before the standard channel open mechanism can take place. In the case of some PC
+		Cards (e.g. Serial port cards) there needs to be a further asynchronous phase after creating the PDD
+		before the channel is fully open.
+		Added a kernel slow exec function:-
+			TInt RLogicalChannel::CheckOpenMode(const TDesC &aLogicalDevice,const TVersion &aVer,TInt aUnit);
+		This is called once each time a channel is opened. If the return value is <0 then the open proceeds as
+		normal. Otherwise, it indicates that a 1 or 2 phase asynchronous open is required. (This function would
+		normally ripple down to the custom DLL).
+		Added a kernel supervisor function:-
+			TInt RLogicalChannel::DoSlowOpen(TInt aMode,TInt anInfo,TRequestStatus &aStatus);
+		This initiates the asynchronous parts of the operation. 'aMode' is either KChanSlowOpenPhase1 or
+		KChanSlowOpenPhase1 to indicate whether its the aynchronous phase before or after the normal open. 'anInfo'
+		is derived from the value returned from CheckOpenMode() and normally indicates the PC Card socket in
+		question. TInt RLogicalChannel::DoCreate() has been modified to include these extra operations.
+		An extra pure virtual function:-
+			TInt DComm::CompleteSlowOpen(DThread *aThread,TRequestStatus *aReqStat);
+		had to be added to DComm in order to implement the 2nd asynchronous open phase.
+	21) 	Modified PC card serial port PDD to take advantage of the above PDD open scheme (20) so that the PDD now
+		fully controls the PC card. (Before it relied on the media system having already powered up the PC Card and
+		didn't properly perform the 2nd part of the initialisation). Also modified the PDD so that it re-applies
+		power and re-configures the Serial PC Card each time the system comes out of standby (eg machine switched
+		off, emergency power down etc).
+	22) 	Changes to LDD to handle PC Card media change events (ie media door open or card removal - dependant on
+		platform).
+			As far as I can gather, in the serial LDD, iStatus==EClosed never occurs. I now force the LDD into
+		this state from a PC Card PDD when a media change is detected. The serial port now needs to be disabled
+		(for good) because it has been powered down (and in all likelyhood removed). Once in this state
+		you never should to change to any other state. Any write requests return with KErrNotReady which hopefully
+		will give any client a clue that they shouldn't have removed the PC card serial port while using it. This
+		is an intermediate solution. The eventual plan (involving a the invention of a new RDevCom type class) will
+		handle the media change and re-power the serial PC card (if still there) before any requests get down to
+		the LDD. However, you need an asychronous supervisor kernel call to restore a PC card after media change
+		which can't be acheived with the present scheme. It is possible to re-power the PC card when coming out of
+		standby (machine turned off etc) because you know the same PC card is still present and hence you don't
+		need to alter any memory allocation associated with the card.
+	23)	Modified PC card serial port PDD to enable serial interrupts for modem signal status changes (CTS,DCD,DSR,
+		RI). Prior to this, h/w flow control wasn't supported on this serial device.
+	24) 	Modified PC card serial port PDD to update system current consumption info. This info is derived from the
+		PC card CIS where possible.
+	25) 	Modified PC card serial port PDD to determine its baudrate capabilities from 'max baudrate supported' field
+		(if present) in the CIS. Also, limit baudrate (capabilities) to 19200 if serial card doesn't contain a FIFO.
+	26) 	Added the following test programs to TCOMM:-
+		i)T_MODEM1: Test code for PC Card Modem Serial Ports (analogue loopback).
+		ii)T_COMSOAK1: Serial port soak test program (requires loopback connector).
+		iii)T_AMPV: Approval test code for PC Card Adapter.
+		iv) T_MODEM2: T_SERIAL for PC card serial port. Instead of looping COM1 to COM2(Etna) it loops
+			COM1 to COM3 expecting a PC Card Socket I/O Serial card.
+		Also modified T_TERM so it can be used to open a channel on COM3. (Also added extra error reporting).
+
+2) Jonathan
+	1)	Old Snowball variant SA retired.
+	2)	New Snowball variant S1 for Prototype 3 units. Major changes from SB:
+		- Combined PDD for Eiger and ASIC serial ports using shared modem
+		  status interrupt.
+		- Variant-specific LDD for use on ASIC serial port only - implements
+		  Spark phone's weird CTS handshaking.
+		- QuickEmergencyStandby handler.
+	3)	New PhysicalScreenWidth and PhysicalScreenHeight values for
+		\epoc32\data\system.ini, see kpwins\kp_gui.cpp .
+	4)  Prevented *\va_sdrv.cpp from trying to Disable or UnBind when unbound
+		from its interrupt.
+
+
+Version 1.02.119
+================
+(Made by Morgan, 7th Nov 1997)
+
+1) Alastair
+	1) SARM
+		Integrated Single-process code into e32 source allowing SARM roms to be
+		created.  Build commands are mnt sarm, sarmall, sarmrel etc.  There are no
+		releaseables and no facilities for building test programs.  SARM builds
+		use the "__SINGLE__" macro for distinguishing Single-process-specific
+		code.  Work directories are \epoc32\build\e32\sarm\[build] and
+		\epoc32\release\sarm\[build].  SARM makefiles are generated into
+		\e32\bsarm using perl to process makefiles from \e32\bmarm as a
+		temporary measure prior to the use of makmake for creating e32
+		makefiles.  SARM roms are built from directory \e32\kbsarm, and require
+		a special version of rombuild - the makefile for this special version
+		will be released with e32tools version 082.
+
+	Major changes
+	a)	\e32\kbsarm - contains special versions of bootrom1.s and rom.oby.
+
+	b)	\e32\inc - changes to e32rom.h, k32std.h, m32mmu.h, m32std.h and
+		v32eiger.h so that different linear address constants are defined
+		for __SINGLE__ builds.
+
+								__SINGLE__						(MULTI)
+		KRomHeaderLinAddr		0x00000000						0x50000000
+		KSuperPageLinAddr		0xC0000000						0x40000000
+		KHomeBase				0xC0000000						0x80000000
+		KHomeEnd				KHomebase+0x3fffff				0xffffffff
+		KHwLinBase				0xa0000000						0x60000000
+		KHwLinEnd				0xbfffffff						0x7fffffff
+		KEigerBaseAddress		0x80000000						0x58000000
+
+	c)	\e32\kpepoc\kp_chk.cpp - __SINGLE__ chunks are allocated in the kernel's
+		heap - they cannot change in size and don't move.  Since SARM roms do not
+		utilise the MMU.  The actual size of a chunk is a compromise between the
+		initial and maximum sizes requested when a chunk is created.
+
+	File changes
+	d)	bsarm\*
+		dpepoc\d_medint
+		group\mnt.cmd
+		inc\ - e32rom.h, k32std.h, m32mmu.h, m32std.h, v32eiger.h
+		kbsarm\*
+		kearm\ - ke_ini, ke_int, ke_mmu, ke_utl
+		kpehal\ - kph_inf, kph_pic
+		kpemmu\ - kpm_mmu.cpp
+		kpepoc\ - kp_chk, kp_ini, kp_proc, kp_reg, kp_std.h, kp_thrd, kp_utl
+		ksrc\ - ks_svr, ks_utl
+		varmpd\va_hw
+		wsrc\wd_eiger
+
+	2)	Added UNICODE.H to e32\inc\incc.prj so that the file is released.
+
+	3)	Changed WINS command line processing such that only switches specified
+		before "--" is encountered are processed.  Switches after the "--" switch,
+		or all switches if the "--" switch is not specified, are ignored.
+
+	4)	Added -L<language Index> switch to WINS command line so that
+		different Epoc locales can be specified.  Eg "WSEXE -L5 --" will
+		mean that elocl5.dll rather than elocl.dll is loaded.
+
+2) Dennis
+	1)	Rewrote MMU code. Major changes are:
+		i)		Linear address map has changed - see file KEARM\KE_MMU.CPP
+		ii)		RAM drive is at fixed linear address but no longer composed of consecutive
+				physical RAM pages.
+		iii)	The free page pool has been removed.
+		iv)		The ROM is mapped with section descriptors on the ARM instead of 4K pages.
+		v)		Chunks can be adjusted in place rather than only in the home section.
+		vi)		On the ARM extra protection has been added for page tables, registry
+				and RAM drive.
+		vii)	ROM layout is different - the kernel data is at 80000000, followed by
+				static data for fixed-address ROM processes (see below). The kernel
+				stack follows the last fixed-address data chunk, and the home section
+				starts with the kernel stack chunk.
+
+	2)	Modified process handling and scheduling:
+		i)		Now have two classes of process. One class has its chunks mapped down
+				into the data section while running, the other class has its chunks
+				at the same linear address all the time. The latter class is used for
+				system servers. It reduces the need for cache flushing - this is only
+				required if any chunks have moved - and thus gives a considerable speed
+				increase.
+		ii)		ROM fixed address processes specified in .OBY file
+				RAM fixed address processes specified by setting KImageFixedAddressExe flag
+		iii)	On the ARM, a domain will be allocated to every fixed-address process.
+				All the process' local chunks will be located in this domain. In addition,
+				every global chunk created by a fixed-address process will be allocated
+				a domain. The use of domains removes the need for page directory
+				manipulation when switching between these processes.
+		iv)		The scheduler has been machine coded for ARM and ISA. Actions performed
+				on switching between processes now depend on the attributes of these
+				processes.
+
+	3)	Added ARM machine coded message passing and semaphore code.
+
+	4)	Modified inter-process reading and writing code. Two functions have been added:
+		i)		TAny* DPlatThread::CurrentAddress(TAny *anAddress);
+				This function returns the current linear address corresponding to an
+				address in the thread's address space. No translation is done for addresses
+				above 0x40000000 or if the thread's process is currently running.
+				This function is used to convert addresses for reading.
+		ii)		TAny* DPlatThread::CurrentAddress(TAny *anAddress, TInt& aMaxSize);
+				This function returns the current linear address corresponding to an
+				address in the thread's address space and also the maximum size of a write
+				to the thread's address space (end of chunk - specified address).
+				Chunk lookup is always performed.
+				This function is used to convert addresses for writing.
+
+	5)	Kernel faults now restart the system from the reset vector. The MMU backup
+		page has been removed.
+
+	6)	Added double-ended chunks. These are regions of memory where the committed
+		region can start at any address in the reserved range, rather than always starting
+		at the base of the reserved range. Added functions
+		i)		RChunk::CreateDoubleEndedLocal()
+				Create a local double-ended chunk with a specified maximum size and
+				a specified initial committed region.
+		ii)		RChunk::CreateDoubleEndedGlobal()
+				Create a global named double-ended chunk with a specified maximum size and
+				a specified initial committed region.
+		iii)	RChunk::AdjustDoubleEnded()
+				Adjust the position and/or size of the committed region. If the initial
+				and final regions intersect, the contents of the intersection are
+				unchanged. Other parts of the committed region have undefined contents.
+		iv)		RChunk::Bottom()
+				Returns the offset of the base of the committed region from the base of
+				the reserved region (RChunk::Base()).
+		v)		RChunk::Top()
+				Returns the offset of the top of the committed region from the base of
+				the reserved region. ( Top() = Bottom()+Size() )
+		RChunk::Size() always returns the size of the committed region.
+
+	7)	Extended the CBitMapAllocator class. Functions added are:
+		i)		TInt Alloc(TInt aCount, TInt& aConsecutive)
+				Allocates from the first free position as many consecutive positions as
+				possible, up to aCount. Returns the first free position, and aConsecutive
+				equal to the number of positions allocated.
+		ii)		TInt AllocAligned(TInt anAlignment)
+				Allocates a position whose number is an exact multiple of 2^anAlignment.
+		iii)	TInt AllocAlignedBlock(TInt anAlignment)
+				Allocates a block of 2^anAlignment consecutive positions such that the
+				first position is an exact multiple of 2^anAlignment. Returns the
+				first position.
+		iv)		AllocAt(TInt aPos, TInt aCount)
+				Allocates aCount positions starting at aPos.
+		v)		Free(TInt aPos, TInt aCount)
+				Frees aCount positions starting at aPos.
+		iv)		TBool IsFree(TInt aPos, TInt aCount)
+				Returns TRUE if and only if positions [aPos,aPos+aCount) are all free.
+
+	8)	Modified Math::Sin, Math::Cos and Math::Tan functions to return exact answers
+		when input values are exact multiples of pi/2. This is done by adding tests of
+		the form
+		IF ( ABS(x MOD pi) < 2^-52 * ABS(x) )
+			return exact answer
+		ELSE
+			do calculation as before
+		ENDIF
+
+	9)	Modified TTime::Convert(const TDateTime&) and TTime::DateTime() in order
+		to minimise the number of divisions involved and to use 32 bit arithmetic
+		rather than 64 bit wherever possible. The latter of these functions gets
+		called frequently by the window server on a periodic timer.
+
+	10)	Added functions TDes8/TDes16 :: (Append)NumFixedWidth(UC)
+		These convert 32-bit integers to descriptors in a specified radix, adding leading
+		zeros up to the specified field width. These are intended to replace calls of
+		the form
+			des.Format(_L("%08x"),value)
+		which are very inefficient. All Format() calls in E32 have been replaced, apart
+		from the ones which use an overflow handler.
+
+	11)	Fixed problem with comms driver causing reset if an interrupt occurs while the
+		kernel server is closing a comms channel. This was caused by the interrupt queuing
+		a DFC which refers to the comms channel being closed. The DFC runs after the
+		kernel server has deleted the channel, and resets the machine when it tries to
+		access the nonexistent channel.
+
+	12)	Files changed:
+		dcomm\	d_comm.cpp
+		dpepoc\	d_medint.cpp
+		dvideo\	ws_disp.cpp
+		inc\	e32base.h, e32des8.h, e32des16.h, e32rom.h, e32std.h, e32svr.h,
+				k32std.h, k32std.inl, m32std.h, m32std.inl, m32hal.h, u32std.h, v32eiger.h
+				m32mmu.h and m32mmu.inl have been removed
+		kbarm\	bootrom1.s, rom.oby
+		kbx86\	boot486.asm, bootrom.asm, build.cmd, e32d.oby, e32r.oby, m486.bat,
+				romdefs.inc, romhead.inc
+		kbsarm\	bootrom1.s
+		kearm\	ke_dat.cpp, ke_dbg.cpp, ke_ini.cpp, ke_int.cpp, ke_mmu.cpp, ke_pccd.cpp,
+				ke_pic.cpp, ke_psu.cpp, ke_std.h, ke_thrd.cpp, ke_utl.cpp
+				ke_all.cpp deleted, ke_sched.cpp added
+		keisa\	ke_dat.cpp, ke_dbg.cpp, ke_ini.cpp, ke_int.cpp, ke_mmu.cpp, ke_pccd.cpp,
+				ke_std.h, ke_thrd.cpp, ke_utl.cpp
+				ke_all.cpp deleted, ke_sched.cpp added
+		kex86\	ke_exc.cpp, ke_ini.cpp, ke_int.cpp, ke_mmu.cpp, ke_std.h, ke_thrd.cpp,
+				ke_utl.cpp
+				ke_all.cpp deleted
+		kpehal\	kph_dbg.cpp, kph_inf.cpp, kph_pic.cpp
+		kpemmu\	kpm_mmu.cpp
+				kpm_all.cpp, kpm_regn.cpp, kpm_sect.cpp deleted
+		kpepoc\	kp_chk.cpp, kp_dat.cpp, kp_dev.cpp, kp_ini.cpp, kp_proc.cpp, kp_reg.cpp,
+				kp_sched.cpp, kp_sem.cpp, kp_thrd.cpp, kp_utl.cpp
+		kpwins\	kp_chk.cpp, kp_ini.cpp, kp_proc.cpp, kp_std.h, kp_thrd.cpp, kp_utl.cpp
+		ksrc\	ks_chk.cpp, ks_exec.cpp, ks_ldd.cpp, ks_lib.cpp, ks_mes.cpp, ks_pdd.cpp,
+				ks_proc.cpp, ks_svr.cpp, ks_thrd.cpp, ks_utl.cpp
+		ubas\	ub_bma.cpp, ub_obj.cpp, ub_std.h
+		ucdt\	uc_des8.cpp, uc_des16.cpp, uc_exec.cpp, uc_func.cpp, uc_ksvr.cpp,
+				uc_reg.cpp, uc_std.h, uc_time.cpp
+		umath\	um_rtod.cpp, um_sin.cpp, um_tan.cpp
+		upmarm\	up_des8.cpp, up_exec.cpp, up_utl.cpp
+		upmx86\	up_exec.cpp
+		upwins\	up_exec.cpp
+		vx86pc\	vx_vga.cpp
+
+
+3) Morgan
+	1)	Added dll process attach and detach for ARM and X86 builds
+	2)	Added RThread::Context(TDes8 &aDes) to retrieve the register contents of
+		a sleeping thread.
+	3)	Added RChunk::ReserveAt(TUint8 *) to force allocation of a chunk at the
+		specified linear address.
+	4)	Ldd/Pdds with static data was broken.  Now fixed.
+	5)	Loading Dlls with writable static data now allocates a Data/Bss chunk
+		and offers it to F32 to be fixed up.
+	6)	Added TInt Dll::Data() to initialise Dll writable static data
+
+
+Version 1.02.118
+================
+(Made by Jonathan, 15th October 1997)
+
+1) Dennis
+	1)	Rewrote CObjectIx, CObjectCon and CObjectConIx classes to do their own
+		array handling instead of using CArrayFixFlat.
+
+	2)	Added ARM machine-coded versions of CObjectIx::At, CObjectIx::operator[],
+		CObjectCon::At and CObjectCon::operator[].
+
+	3)	Added ARM machine-coded versions of CActiveScheduler::Start() and
+		CServer::RunL().
+
+	4)	Removed CArrayFixFlat from DPlatProcess. Custom array handling code is now
+		used to store the chunks being used by a process.
+
+	5)	Added ARM machine-coded versions of some commonly used fast Exec:: calls and
+		of DPlatProcess::LookupChunk().
+
+2) Morgan
+	1)	Added -M<machineName> switch to WINS command line to pick up
+		alternate System ini files from \epoc32\Data.  eg WSEXE -Mfungus
+		will use \epoc32\data\fungus.ini
+	2)	Froze the Custom Dll against V1.01 E32(114)
+	3)	Froze the Variant Dlls (P1,P2,PB,PC,PD,PG,SA,SB,CL) against V1.01 E32(114)
+
+3) Jonathan
+	1)	Changed Snowball A & B physical screen size to 4.4"x1.375".
+	2)	New TSAsic::SetCrystalSpeed function in varmsb\va_sasic.cpp.
+	3)	Added cakysbd keyboard driver for Snowball B which has a, b, z and :
+		instead of arrow keys.
+	4)	Snowball B variant autodetects 4MB or 8MB ROM, 1MB or 4MB RAM
+	5)	New Hal::StartupReason() type EStartupSafeReset. Currently this is only
+		returned by Snowballs when "Home" and "Back" are pressed at boot.
+	6)	Replaced Variant::ColdReset with more general Variant::StartupReason.
+		This breaks Morgan's variant & custom freezes against 114 for this one
+		function, but that's OK because the kernel really is the only component
+		that should be calling this.
+	7)	New UserSvr::ResetMachine(TMachineStartupType) function. Currently only
+		allows a reset type of EStartupWarmReset. Implemented by generating a
+		TPlatFault::ESoftwareWarmReset. After the reset the kernel may
+		actually report a reason other than EStartupWarmReset if either:
+		-	EStartupWarmReset isn't supported (mx86/misa/wins)
+		-	The variant supports munging of reset types, ie by holding down
+			keys at boot, and those keys are held down (various marm variants).
+	8)	New custom and parent functions AutoSwitchOffType, which returns
+		ESwitchOffEvent on Snowballs A & B, ESwitchOffHard on other variants.
+	9)	New TRawEvent::ESwitchOff. The kernel generates this at auto-switchoff
+		time instead of just switching off if the above function returns
+		ESwitchOffEvent. The window server (or one of its clients) must call
+		UserHal::SwitchOff fairly soon after receiving this event. Made the
+		text window server do this. Auto-switchoff is still disabled by default
+		on Snowballs A & B becuase wakeup is still broken.
+
+
+4) Matthew
+	1)	Enabled hardware filtering on SA and SB digitisers.	Also boosted
+		sampling rate to 112 pps.
+
+	2)	Changed SB variant so that the san-disk is mapped to InternalMedia0
+		(ie C:). Make sure you get rid of MEDINT.PDD from your .oby file when
+		building roms, or F32 will pick this up and you will still have the
+		ram disk as C:.
+
+
+Version 1.02.117
+================
+(Made by Jonathan, 5th September 1997)
+
+1) Dennis
+	1)	Rewrote Math:: transcendental functions to use simpler algorithms
+		and to run faster. All functions now use polynomial approximations
+		instead of rational functions.
+
+	2)	Added Math::PolyX function to do fast polynomial evaluation using
+		TRealX for argument, coefficients and result.
+
+	3)	Updated T_R64BM to benchmark more functions and to use a range of
+		different argument values.
+
+	4)	Added new test program T_MATH2.EXE to test the accuracy of the
+		transcendental functions.
+
+	5)	Fixed SW-21.
+		Changed way in which DLLs statically linked to an EXE are handled.
+		Instead of opening a process-relative handle on the DLL, the process'
+		code chunk now holds a list of DLLs on which it depends. This list
+		is only deleted when the chunk itself is deleted, thus solving the
+		problem of two instances of the same EXE running concurrently.
+		Added function UserSvr::ExeAddDependency to add a DLL to the process
+		code chunk's dependency list.
+
+2) Matthew
+	1)	Added software filtering to Snowball digitiser drivers.
+
+	2)	Moved initial calibration of digitiser into the TDigitiserXxx::Init3().
+		This has also meant that some of the E2Prom functions needed to be
+		exported - I exported all the public functions.
+		This change has allowed Hal::Init3 to be rearranged to how it was in 114.
+
+	3)	Fixed small bug in Snowball B Comm2 driver, which was acting as though
+		it supported 57600bps.
+
+3) Rob Pym
+	1)	Added support for ARM 7115 - this chip has a few more peripherals
+		than the ARM 7110. New functions in ke_eiger.cpp and ke_pic.cpp.
+
+	2)	Added CL variant for the Cirrus Logic ARM 7115 evaluation board.
+		[Jonathan:] Releasables not released because it doesn't build.
+
+
+Version 1.02.116
+================
+(Made by Jonathan, 26th August 1997)
+
+1) Dennis
+	1)	Added new extended-precision real class TRealX, defined in
+		e32math.h. This class provides 64 bit precision and a dynamic
+		range of approx. 1E-9863 to 1E+9863. All member functions are
+		assembler coded for speed.
+
+	2)	Changed GCC compiler helper functions to use TRealX instead
+		of TReal96 to speed things up. Also modified all UM_xxx files
+		to use TRealX instead of TReal96, apart from UM_DTOR and
+		UM_RTOD.
+
+	3)	Added new test programs T_TREALX, T_R64BM, T_RXBM. T_TREALX
+		tests the TRealX member functions. T_R64BM does a benchmark
+		test for TReal64 field operations and transcendental functions.
+		T_RXBM does a benchmark test for TRealX field operations.
+
+	4)	Added machine coded versions of Math::Sqrt() and some other
+		Math:: functions for ARM.
+
+2) Jonathan
+	1)	Fixed data TX on varmsa/va_com2.cpp and varmpd/va_com3.cpp when
+		Fifos are disabled; no longer trys to output >1 byte on TX interrupt.
+
+	2)  Variant::Init3() on Snowball A & B sets AutoSwitchOffBehavior to
+		ESwitchOffDisabled because power management isn't yet implemented.
+
+	3)	Changed table in Snowball B Variant::SetLcdContrast to correct for
+		strange hardware.
+
+	4)	To reduce noise in the output logs, all .cmd files to build E32 now
+		invoke NMAKE with the -nologo flag.
+
+3) Pete
+	1) 	Added Internal ATA media driver (MATISB.PDD) for Lavender prototype B
+		build.
+
+	2)	Change to internal ram media driver on WINS/ARM so that it only
+		opens on media device type EFixedMedia0 rather than any fixed media
+		type.
+
+4) Matthew
+	1)	Fixed bug in Snowball digitiser drivers which caused execeptions when
+		the pen was down. Fixed by moving the queueing of the pen-up timer from
+		the interrupt service routine into the Dfc.
+
+	2)	Added code to read the CTS signal in the Snowball prototype B com2 PDD.
+
+	3)	Temporarilly made the Snowball prototype B com2 PDD ignore framing
+		errors at 38400 bps. This is to allow people downstream to use the port.
+
+	4)	Further modifications to T_SERIAL for Snowball compatibility.
+
+Version 1.02.115
+================
+(Made by Jonathan, 16th August 1997)
+
+1) Graham
+		1)      Changed in RAM standby code to have a delay loop
+				rather than the previous faulty inmplementation
+				which attempted to validate the ROM by
+				continually reading it until it returned a known
+				good value - this was erroneous because the ROM
+				reads were coming from the cache anyway.
+
+				Then I commented out this code and replaced it with
+				the traditional code that runs from ROM (this was
+				only introduced as a result of some hardware paranoia
+				when we were getting 'unable to switch on' bugs in
+				the run up to V1.00
+
+		2)      Updated minor version number to 02.
+
+2) Dennis
+	1)	Modified emergency power-down FIQ handler so that it
+		only performs the bare minimum of tasks when the machine
+		is powered up again. Other more time-consuming tasks have
+		been moved into a DFC.
+
+	2)	Added new machine code versions of TInt64 functions for MARM,
+		WINS and MX86 which don't use the TInt64A class.
+
+	3)	Added machine coded versions of some 8-bit descriptor functions
+		for MARM in new file UPMARM\UP_DES8.CPP.
+
+	4)	Added machine coded versions of RHeap::Alloc(), RHeap::Free()
+		for MARM REL.
+
+	5)	Modified Mem::Copy() to run faster when source and destination
+		addresses are unaligned, or when a small copy is required.
+
+3) Ann
+		1)		Fixed rounding bug where the number of intervening zeros
+				after the decimal point in a descriptor was being ignored
+				when next non-zero digit is out of range of precision when
+				converting to real.
+
+4) Matthew/Jonathan
+		1)		Added Snowball B variant for use with the Snowball prototype.
+
+		2)		With a TSAsic class to access the ASIC on the Snowball prototype.
+
+5) Matthew
+		1)		Added digitiser drivers for snowballs A and B.
+
+		2)		Added a virtual SetCalibration() function to the TXYInput
+				class, so that future digitiser drivers can use hardware
+				calibration, if this is available.
+				Currently none of the drivers use this (including the Snowball
+				ones) and they return KErrNotSupported.
+
+		3)		Added a comm pdd for the Snowball prototype asic. There are
+				several known bugs in this driver.
+				Made some modifications to T_SERIAL so that it does not test
+				things beyond the capabilities of the comm port when running
+				on a Snowball.
+
+6) Jonathan
+		1)		Fixed problem caused by reading IID register too often in
+				Snowball A 2nd comm pdd.
+		2)		Added IR support to Snowball B 1st comm pdd (untested).
+
+		Failing on Snowball B prototype:
+		-	tests t_power, t_timer, t_chunk, t_serial, t_idrv, t_pccd1, t_pccd2
+		-	Power up after switch-off
+
+
+Version 1.01.114
+================
+(Made by Graham, 29th July 1997)
+
+1) Matthew
+		1)      SW1-244 Fixed sound driver so that it no longer returns
+				KErrAlreadyExists if a prepare function is called
+				twice. Changed test code accordingly.
+
+2) Morgan
+		1)      SW3-1556 Removed dependency in M32HAL.H on M32DBG.H and
+				re-inserted dependency on M32DBG.H in appropriate .CPP
+				files.
+
+
+Version 1.01.113
+================
+(Made by Graham, 25th July 1997)
+
+1) Dennis
+	1)	Fixed CSW3-1559, CSW3-1560, CSW3-1530, SW1-91, SW1-155, SW1-158
+		Added doubly-linked tree structure to DLibrary objects to record which
+		DLLs depend on which. The access count of a DLibrary object is now equal to
+		the number of thread/process handles open on it, plus the number of other
+		DLibrary objects which have a dependency on it. Added code to DLibrary::Close()
+		to check that a DLL is really in use (directly or indirectly) by traversing
+		the tree structure and to delete it if it is not. Added a new supervisor function
+		UserSvr::DllAddDependency() used by the loader to record DLL dependencies.
+
+2) Matthew
+	1)	Fixed bug in sound ldd which caused buffers to be orphaned on the kernel heap if
+		a prepare function was called twice. This now returns KErrAlreadyExists.
+		Added test code to t_sound.
+
+3) Graham
+		1)      Made further changes to the backup battery levels:
+
+				Good -> Low     2850
+				Low -> Replace  2800
+
+				Replace -> Low  2850
+				Low -> Good     2900
+
+				Not present     2000
+
+		2)      SW1-201. Reduced the maximum voltage of the main battery
+				from 3100mV to 3000mV.
+
+		3)      SW1-179. Removed redundant IMPORT_C declarations from
+				E32BASE.H on:
+
+				CServer::NewSessionL
+				CSession::ServiceL
+
+		4)      Added Charles Wier's ASSERT macro.
+
+		5)      Changed the battery voltage reading algorithm. I used
+				to do one one dummy read on the adc channel then wait
+				10mS then take the real reading. I now do 10 dummy
+				reads at the rate of one every millisecond and then
+				take the real reading.
+
+		6)      Fixed the .REL files to release Dutch and French
+				localisation dlls and a french keyboard table for MARM P2.
+
+		7)      Added Scandinavian localisation dll in WINS and MARM
+				builds.
+
+		8)      Added DANISH/NORWEGIAN keyboard table (CAKDP2.DN) and
+				SWEDISH/FINNISH keyboard table (CAKDP2.SF) for P2
+				MARM builds.
+
+Version 1.01.112
+================
+(Made by Graham, 17th July 1997)
+
+1) Dennis
+	1)	Fixed CSW-2710, SW1-114
+		Changed four kernel faults to K::PanicCurrentThread with new KERN-EXEC
+		panic numbers; these are KK::EMesAlreadyPending, KK::EEvntRequestPending
+		and two instances of PP::EIllegalWsProcess.
+
+	2)	Fixed CSW3-880
+		Corrected checking of filename length in RLoader::LoadProcess() and added
+		a check for the command line length.
+
+	3)	Fixed CSW3-1340
+		Changed the code to allow both heap min size and heap max size to be zero.
+		However if heap max size < 256, then a value of 256 will actually be used.
+
+	4)	Fixed CSW3-1601
+		Set up the value of K::TickCounter in the RTC tick ISR rather than in code
+		which runs asynchronously to the RTC tick. Reinitialise K::TickCounter when
+		the system time is changed.
+
+	5)	Fixed CSW3-1670
+		Added function TBool TTickQ::CheckMidnightCrossover(TInt aSecs) to check if
+		a midnight crossover has occurred and set iTomorrowStarts accordingly. Added
+		overloaded function void TSecondQ::SystemTimeChanged(TUint& aChanges)
+		to abort all absolute and locked timers and set the EChangesMidnightCrossover
+		bit in aChanges if a system time change results in a midnight crossover.
+		TSecondQ::SystemTimeChanged() now calls this function, as does
+		ExecHandler::LocaleSet(). Updated T_CHNOT.CPP to test the new RChangeNotifier
+		behaviour.
+
+	6)	Modified prefetch abort handler to set iDataAddress to the value of lr when
+		the exception occurred.
+
+	7)	Corrected User::StartThread to call DLL entrypoints with EDllThreadDetach
+		rather than EDllThreadAttach when the thread exits.
+
+	8)	Set the RTC correction to zero on a cold start. (Forgot this last time!)
+
+2) Graham
+		1)      Added code to fetch the language index and the keyboard
+				index from E2. Added these values to the machine info
+				structure (UserHal::MachineInfo()) by adding class
+				TMachineInfoV2 which derives from TMachineInfoV1.
+
+		2)      Modified the text window server to load a different
+				localisation module and keyboard module according to
+				the language and keyboard indexes read from E2.
+
+		3)      Increased the adjustment for current consumption
+				that is made prior to establishing whether the main
+				battery status should fall.
+
+		4)      Reduced the voltage levels at which the main battery
+				status changes. Low is now at 2150mV, Replace is now
+				at 1900mV (P2 and PD variants only).
+
+		5)      Reduced the max backup battery voltage to 3100mV in
+				line with the max main battery voltage  (P2 and PD
+				variants only).
+
+		6)      Reduced the voltage levels at which the backup up
+				battery status changes:
+
+								Old (mV)        New (mV)
+				Good -> Low     2900            2800
+				Low -> Replace  2800            2750
+
+				Replace -> Low  2850            2780
+				Low -> Good     3000            3000
+
+				Not present     2000            2000
+
+		7)      Added kernel side EXPORTS for:
+						S::ChunkCreate
+						S::LibraryLoadExact
+						S::MutexCreate
+						S::PhysicalDeviceLoad
+						S::PhysicalDeviceFree
+						S::SemaphoreCreate
+
+
+3) Basher
+		1)      Added new function in the keyboard translation dll
+				(ChangeKeyData) which loads a different keyboard data
+				module.
+
+4) Pete
+		1)      When interrogating the CIS of a PC Card to determine the cards type,
+				the PC Card controller verifies the integrity of the CIS by
+				attempting to follow each CIS chain to the end. While performing this
+				operation the controller is currently reading each tuple entirely
+				rather than just checking its type and link. This is un-necesary and
+				in fact not recomemded. Unknown tuples may contain active registers.
+				This change fixes the problem.
+
+
+Version 1.01.111
+================
+(Made by Graham, 11th July 1997)
+
+1) Jonathan
+	1) Small fix to DPccdCntrlInterface::DoNotifyChange and DoChangeFlag to return
+	   KErrGeneral instead of panicing on being passed an invalid socket number.
+	2) Kernel now exports all of DPlatChunkHw so that device drivers can map
+	   in their own memory-mapped registers etc.
+	3) Added 2nd serial port (16550-based) to Snowball MARM variant. Currently
+	   just a dummy because of a suspected bug triggered by ~DPlatChunkHW().
+	4) Variant::TestBootSequence on Snowball is always True. This enables an
+	   (alternative) etest.exe to be run on boot, which starts elink before booting
+	   normally.
+	5) Added etestl.exe which does the above.
+
+2) Pete
+	1)	Fixed SW3-1226
+		Makes it possible to force accesses to as particular type of PC Card
+		memory (ie Common,Attribute,I/O) to be 8-bit accesses only (ie 32bit
+		word accesses disabled). This mode can be enabled in the function
+		Variant::PcCardCntrlMemConfig() by returning KMemConfigByteAccess.
+		This is to support h/w implementations which can't support 32-bit accesses
+		to PC Card memory.
+
+3) Dennis
+	1)	Fixed SW3-1321
+		Moved the RTC correction value and last set time into the super page so
+		that they will be preserved over warm resets. This stops strange offsets
+		from being added to the system time when the machine is switched off and on.
+
+	2)	Moved the definition of the super page from M32STD.H to K32STD.H. Added a
+		super page to the WINS build. Moved the battery statistics (insertion time,
+		time on main battery, time on external power, battery power used) from K::
+		into the super page so that they will be preserved over warm resets.
+
+	3)	Fixed SW3-1419
+		Removed all user access from user data chunks in the home section. Changed
+		the way the stack/heap chunk is created on thread creation - the pages are
+		now allocated using DPlatChunk::AdjustL() instead of AdjustUserL(). This means
+		that the pages are immediately mapped with the correct page permissions
+		rather than with full user access. Removed the line in DPlatProcess::Loaded()
+		which applies the final page permissions to the main thread's stack/heap chunk.
+
+	4)	Fixed SW3-1317
+		Modified function RUserHeap::SvClose() so that if it finds the access count of
+		the heap negative, it panics the owning process rather than causing a kernel fault.
+
+	5)	Fixed SW3-1311
+		Fixed operator precedence error in CObjectIx::Remove().
+
+	6)	Fixed SW3-770, SW3-1539
+		Modified DPlatProcess::DoSetPriority() to recursively descend the tree of threads
+		owned by the process and adjust their priorities (previously, thread-relative threads
+		were not adjusted).
+		Introduced a new set of absolute thread priorities which enable the priority of a
+		thread to be made independent of the priority of its owning process.
+		Note that this upgrade requires a modification to the SHELL to set the priority of
+		the EIKON server thread to EPriorityAbsoluteForeground instead of EPriorityMore.
+
+	7)	Fixed SW3-319
+		Added a new exported function Kern::PanicCurrentThread(const TDesC&, int) which panics
+		a thread by sending a message to the kernel server (like K::PanicCurrentThread).
+		Modified D_COMM.CPP to call this function instead of DPlatThread::Panic().
+
+	8)	Fixed SW3-1604
+		Modified RThread::RaiseException() so that if the exception is unhandled, it panics
+		with ECausedException rather than calling User::Exit(KErrDied);
+
+	9)	Fixed SW3-4688
+		Modified UPWINS\UP_TRP.CPP to do a ret 4 at the end of User::Leave() instead
+		of a compiler-generated ret 0. Applied the same modification to the X86 build.
+
+	10) Fixed SW3-1408, SW3-1671
+		Modified UCDT\UC_REGN.CPP TRegion::SubRect() to return without doing anything if
+		the rectangle to be subtracted is empty. Applied the same modification to the
+		ARM version in UPMARM\UP_UTL.CPP.
+
+	11)	Fixed SW-4688
+		Modified UPWINS\UP_TRP.CPP User::Leave() to end with a ret 4 instead of a ret 0.
+		Applied the same modification to the MX86 version.
+
+	12)	Fixed SW3-1149
+		Added an inline accessor function for the iThread member of CAsyncOneShot to
+		allow the handle to be changed.
+
+	13)	Fixed SW3-1604
+		Modified RThread::RaiseException() so that if the exception is unhandled, it
+		panics with ECausedException rather than calling User::Exit(KErrDied);
+
+	14)	Fixed SW-5529
+		Modified RLibrary::LoadRomLibrary in UPMARM\UP_LIB.CPP and UPMX86\UP_LIB.CPP
+		to close a handle in all possible cases.
+
+	15) Fixed SW-5530
+		Modified KS_SEM.CPP, KS_MUTX.CPP and KS_CHK.CPP so that if a global object is
+		created with a thread-relative handle, it has no owner.
+
+	16)	Modified DPlatThread::Die() so that if a system thread panics, the machine resets.
+
+	17)	Fixed SW1-22
+		Modified CObjectIx destructor to invalidate each array entry after closing it.
+		Modified CObjectIx::Remove() to panic if an attempt is made to remove an entry with
+		a null object pointer.
+		Modified S::Close() to check if the handle is valid before attempting to close it.
+
+	18)	Fixed CSW3-1426
+		Made 0x10 (DLE, non-breaking space character in OPL) a whitespace character.
+
+	19)	Fixed CSW-5500
+		Check for nDig<0 in doGeneral() function, return KErrGeneral in this case.
+
+4) Matthew
+	1) Fixed SW3-883
+	   Moved the undertaker notification call Kern::NotifyThreadDeath() from
+	   DThread::Cleanup() to DThread::DoDie(), so it is called before any child threads
+	   are killed.
+	   Added test to T_THREAD.
+
+	2) Fixed SW3-1173
+	   Made "%X" give upper-case, instead of lower-case hex.
+	   Added test to T_BUF.
+
+	3) Changed T_SOUND test code so that it actually tests that keyclicks are disabled
+	   during recording.
+
+	4) Renamed Variant::TVarmpdPanic to TVarmp2Panic in P2 variant.
+
+	5) Made varmp2\va_prom.cpp #include v32armp2.h instead of v32armpd.h.
+
+5) Graham
+		1) Anns fix for incompatibility between random number
+		   generation on WINS and MARM.
+
+		2) Martin Tasker's updated header files E32BASE.H and
+		   E32DEF.H for MSVC 5.0 compliance.
+
+		3) Increased RAM refresh rate to the maximum in the
+		   bootstrap. This can then be slowed down in the
+		   variant layer if applicable.
+
+		4) Changed the reschedule code to run with interrupts on.
+
+		5) Added Charles Wier's __DECLARE_TEST_DEBUG that compiles
+		   out in release mode.
+
+		6) Added Charles Wier's RTest::SetConsole(CConsoleBase*).
+
+		7) SW3-716 sanitise E32KEYS.H for the resource compiler.
+
+		8) SW3-1556 released M32MMU.H and .INL in INCK and removed
+		   dependency in M32HAL.H on M32DBG.H.
+
+		9) SW3-1557. Fixed an ASSERT in Mmu::AllocShadowPage().
+
+		10) Added new Central European language enums to TLanguage.
+
+		11) Changed RNotifier::Connect to use its own version number
+			instead of the operating system version number - the
+			notifier interface is updated independently of E32.
+
+		12) Merged in new in localisation files since 110.
+
+		13) Fixed bug in ARM architecture which caused ADC code
+			to be called when the variant specified that no
+			ADC was fitted - caused problems for Delaware.
+
+		14) Changed the main battery monitoring code to compensate
+			for voltage drops with high current consumption when
+			calculating changes in battery status.
+
+		15) Changed the main battery monitoring code to increase
+			the frequency that it samples the main battery voltage
+			when other components are interested in obtaining
+			accurate readings of that voltage.
+
+		16) Changed the P2 and PD sound driver to divorce its ability
+			to play digital sound from the main battery status. It
+			now has two threshhold voltages - one at 2200mV below
+			which no sound driver operation will begin and another
+			at 2000mV below which any sound driver operation that
+			is in progress will be aborted.
+
+		17) Fixed the backup battery code which caused its status to
+			oscillate between Good and Low every time you switched
+			off and on.
+
+			These fixes, in combination should fix CSW-5376, CSW3-682,
+			CSW3-1672
+
+6) Basher
+		1) Added new user server function "ChangeLocale" to change
+		   localisation dll.
+
+Version 1.00.110
+================
+(Made by Graham , 5th June 1997)
+
+1) Graham / Jonathan / Morgan / Colly
+		1) Fixed a bug in the Comms LDD emergency power down code.
+		   This was causing interrupts to be enabled which then
+		   caused the kernel irq handling routine to reenable
+		   fiqs thus causing the fiq handler to be reentered with
+		   subsequent death of a random nature to any user code
+		   that might happen to be lying around within reach.
+		   Multiple SW's hopefully.
+
+		2) Introduced interrupt protection around
+		   TEiger::ModifyRegister8. This had been introduced into
+		   TEiger::ModifyRegister32 a long time ago but somehow got
+		   missed out of the 8 bit variant.
+
+		3) Added protection against rogue irqlevels passed into
+		   Hal::RestoreIrqs();
+
+		4) Added NOPs into the following type of ARM assembler
+		   construct:
+
+				asm("stmia lr, {r13-r14}^");
+				asm("add lr, lr, #8");
+
+		   This now becomes:
+
+				asm("stmia lr, {r13-r14}^");
+				asm("mov r0, r0");
+				asm("add lr, lr, #8");
+
+		   The ARM manual advises against using a banked register
+		   directly after any user-bank load or store multiple
+		   instruction.
+
+		5) Added T_IRQS test code developed by Alastair.
+
+
+Version 0.01.109
+================
+(Made by Graham , 3rd June 1997)
+
+1) Dennis
+	1) 2/6/97
+	Fixed SW-3795, SW-3798
+	Set main battery insertion time after initialising RTC
+	When system time is set, main battery insertion time is changed
+	by (new system time-old system time)
+	Moved initialisation of Locale data from S::Initialise() to P::Initialise()
+	just after Hal::Init1(). This is necessary to make sure that the home time
+	offset is initialised before the system time on a cold start.
+
+		2) Fixed alloc heaven problem in KS_CHN.CPP whereby a
+		physical channel is created and not deleted if the
+		corresponding logical channel creation failed.
+
+2) Matthew
+	1) Changed sound and comms emergency power-down code to do their completions
+	with DFCs. This seems to fix the exception-type resets associated with
+	emergency power-downs.
+
+	2) Fixed a bug in the sound driver's write-to-thread code where the home
+	address of the user buffer was not being used. Spotted by Colly.
+
+	3) Fixed bug in sound driver where if an Open() failed with OOM then any
+	subsequent attempts to open would fail with KErrInUse. Spotted by Colly.
+
+3) Pete
+		1) Fixed SW3-998: Prevents emergency power downs occuring
+		   while servicing PC Card interrupts from generating an exception.
+
+
+		2) Fixed SW3-974: Machine reset inserting CF card with OOM.
+		   Fix is low risk (FLW). One part affects code only called in OOM
+		   situation, and the other is minor change to a destructor.
+
+4) Graham
+		1) Fixed a bug in the comms logical device driver. This bug
+		   prevented the machine from switching on sometimes in the
+		   presence of an oscillating DSR input (like Nautilus).
+
+		2) Fixed a bug in the backup battery handling when switching
+		   on. This again was preventing machine from turning on
+		   occasionally. Thanks to Colly, Bill and Morgan for help
+		   finding this one. SW3-666 (the number of the beast).
+
+		3) SW3-877. Slowed down the turning off of the display
+		   when switching off normally - the previous behaviour
+		   may have been damaging to the lcd panel. (UNAPPROVED)
+
+		4) SW3-997 fixed a keyboard table bug when pressing FN+B
+		   followed by the space bar - previously gave a little
+		   circle; now gives a circumflex. (UNAPPROVED)
+
+		5) Upped the LCD pump value to 11 from 8. SW3-354.
+		   (UNAPPROVED)
+
+		6) Changed MachineInfo for P2 to describe the microprocessor
+		   as an ARM 7100 rather than an ARM 7110. SW3-1028.
+		   (UNAPPROVED).
+
+5) Morgan
+		1) Fixed RTC error. Conversion between parts per 4000000
+		   and parts per 2^24 was wrong.
+
+Version 0.01.108
+================
+(Made by ---, --- May 1997)
+
+1) Matthew
+	1) 22/5/97
+	Fixed SW-5406: Made the fall-back alarm sound slightly less offensive.
+	Forward and backward compatible.
+
+	2) 22/5/97
+	Fixed SW-4899: WINS comms pdd no longer calls the ldd's transmit ISR the
+	extra time.
+	Backward compatible, not forward if you were assume the transmit ISR
+	can only be called once.
+
+	3) 22/5/97
+	Fixed SW3-293: Moved EWSRV.DLL to base 0x42800000 so it no longer clashes
+	with dsound.ldd.
+	Forward and backward compatible.
+
+	4) 22/5/97
+	Fixed SW3-372: Added the '%.' label to TTime::FormatL. This gives the
+	locale decimal separator. Test code in T_TIME.
+	Backward compatible, not forward compatible - previous versions of
+	E32 reduced '%.' to '.' whatever the locale information was.
+
+2) Morgan
+	1) 23/5/97
+	Fixed SW-4604:  When a growing Ram Drive hits a page containing
+	page tables the page allocator attempts to move them.  This code was
+	assuming all four page tables in the page were in use which is not
+	always the case, causing the allocator to Leave.  To fix this, trapped
+	the Leave when an unused page table is not found in the PageDir.
+	Forward and Backward compatible.
+
+	2) 27/5/97
+	Applied the correct Uids and capitalised the names of EKern and EFile
+	by hand during startup.   Required because neither of these processes
+	are loaded by the file server (which is normally responsible for doing
+	that).
+
+	3) 27/5/97
+	Added RProcess::SetType(const TUidType &aType) and test code.
+	Backward compatible
+
+3) Ann
+	1) 27/5/97
+	Changed KRealFormatNoExponent to use a maximum of aMaxSigFigs digits.
+	Updated test code accordingly.
+
+4) Graham
+	1) 28/5/97
+	SW3-495. Reduced the risk of E32 getting out of step with case
+		opening/closing
+
+		2) 28/5/97
+		Introduced BLDARMREL as a synonym for ARMREL in MNT.CMD and
+		removed the need to do MAKEWORK before building.
+
+
+Version 0.01.107
+================
+(Made by ---, --- May 1997)
+
+1) Graham
+		1) Removed MEDCRR.MAP and DATXPD3.MAP from MARM releaseables
+
+		   Forward and backward compatible.
+
+		2) Removed EKERN.LIB from WINC releaseables
+
+		   Forward and backward compatible.
+
+		3) Upgrade 003
+
+		   Fixed SW3-282. If the 'switch off when case is closed' option was
+		   enabled and one switched off, closed the case, then attempted to wake
+		   the machine up using the external buttons or by asserting dsr, then
+		   the machine would remain dead until the next warm reset.
+
+		   This was fixed by reading the state of the case when coming out of
+		   standby as well as every second while switched on.
+
+		   Forward and backward compatible.
+
+		4) Upgrade 007
+
+		   Removed the ability to turn on using the digitiser after an emergency
+		   power down. This makes the behaviour consistent with 'Switch on when
+		   case is opened'. SW-5282
+
+		   Forward and backward compatible.
+
+		5) Upgrade 008
+
+		   Upgraded P2 and PD digitiser drivers to include debouncing logic
+		   (SW-874 and duplicates).
+
+		   Forward and backward compatible.
+
+		6) Upgrade 009
+
+		   Upgraded P2 and PD comms pdd's. These now implement the following
+		   current consumption scheme.
+
+				RS232 drivers enabled           2mA
+				Cable connected                 + 22 mA
+				Ir enabled                      0 mA
+				Ir receiving                    0 mA
+				Ir transmitting                 + 35 mA
+
+		   The cable is detected by either:
+
+				1) DSR high
+				2) Character received
+
+		   Forward and backward compatible.
+
+2) Pete
+		1) Upgrade 001
+
+		   Fixed SW3-331. Formatting of Local Drives was being done cardSize/32
+		   bytes at a time. This was OK on smaller CF cards but on larger ones
+		   (eg 16M Hitachi CF) it was locking up the machine for long periods
+		   (because F32 which is running during each sub-format is at a high
+		   priority). Changed so that a Local Drive is formatted
+		   Min(16K,size/32) bytes at a time.
+
+		   Forward and backward compatible.
+
+		2) Upgrade 004
+
+		   In addition to having the option to disable compatibility checking between a cards
+		   Vcc level requrements and those supported by a machine, it is now possible
+		   to disable Vcc current and Vpp level compatibility checking in
+		   TPcCardConfig::IsMachineCompatible().
+
+		   Backward compatible, not forward.
+
+		3) Upgrade 005
+
+		   Fixed a problem parsing device info. tuples which fail to provide the
+		   end of field character. TCisReader::FindReadRegion() now checks the
+		   length of such a tuple and doesn't rely on the terminating character
+		   being present.
+
+		   Forward and backward compatible.
+
+		4) Upgrade 006
+
+		   Various changes to Pc Card Serial Port PDDs:
+		   - Added Cellular Card Phone Serial Driver (VA_NCCP.CPP) for Rack D.
+		   - Fixed a problem with the standard Modem Card Serial Driver (EUART3.PDD)
+			 when writing to the card at 115Kbps. The driver wasn't making full
+			 use of the Tx FIFO and was spending too long servicing interrupts
+			 resulting in a triple beep reset due to the watchdog timing out.
+			 Also disabled Vpp compatibility checking in order to support the
+			 WorldPort modem.
+			 The full list of supported modems is now:-
+			- Socket I/O serial port
+			- Dacom Goldcard V34 + Fax
+			- Dacom GoldCard Global (V34+Fax)
+			- Hayes Optima 288
+			- US Robotics WorldPort
+			- MegaHertz XJ2288
+			- Trellis Datacom PC288V2
+			- Com1 Modem Card MC218
+			- Paldio Data card
+		   - Changes to Delaware standard Modem Card Serial Driver (EUART2.PDD)
+			 to bring it up to same standard as the Rack D driver.
+			 None of this affects Protea P2.
+
+		   Forward and backward compatible.
+
+3) Ann
+		1) Upgrade 002
+
+		   Fixed SW-4304, SW3-415.  TRealFormat changes.  Changed
+		   Calculator mode to discard trailing zeros first and then to decide on
+		   exponential or non-exponential format based on the number of digits
+		   available.  If the number of digits (including significant leading/trailing
+		   zeros) when using non-exponential format would exceed aMaxSigFigs, then
+		   exponential format would be used, so reducing to no more than aMaxSigFigs.
+		   Fixed SW3-416.  The above changes should been this situation won't
+		   occur, but leaves space for sign now, just in case!
+		   Also T_FLOAT test code improved and updated.
+
+
+Version 0.01.106
+================
+(Made by Graham, 19th May 1997)
+
+1) Graham
+		1) Implemented MNT VALID verb.
+
+		   Forward and backward compatible.
+
+		2) Updated all version numbers to 1.0(106)
+
+		   The compatibilty issues for this are quite complicated.
+		   However, I believe these changes to be both forward and
+		   and backward compatible.
+
+		3) Added .MAP files to MARM releasables.
+
+		   Forward and backward compatible
+
+		4) Changed idle current to 38mA, backlight current to 98mA.
+
+		   Forward and backward compatible
+
+		5) Upgrade 004
+
+		   Changed the WINS fascia to reflect the changed order on the
+		   application bar.
+
+		   Forward and backward compatible
+
+		6) Upgrade 009
+
+		   Fix which defends against the possibility that the Flash ROM will not
+		   wake up quickly enough when coming out of standby. We jump into RAM
+		   to execute the standby instruction. When we come out of standby we
+		   check the ROM is reading correctly before jumping back.
+
+		   Forward and backward compatible
+
+		7) Upgrade 010
+
+		   SW-5179 Return an error if an attempt is made to turn the backlight
+		   on when the main batteries are set to 'replace' and no external power
+		   is being applied.
+
+		   Forward and backward compatible
+
+		8) Upgrade 011
+
+		   Reduce default on time of backlight to one minute and make it
+		   sensitive to user activity.
+
+		   Forward and backward compatible
+
+		9) Upgrade 012
+
+		   SW-5319 Changed default screen contrast of PD and P2 variants
+
+		   Forward and backward compatible
+
+	   10) Upgrade 013
+
+		   SW-3264 Changed default auto power down behaviour to
+		   'Enabled always' and reduced the default timeout to
+		   3 minutes.
+
+		   Forward and backward compatible
+
+	   11) Upgrade 014
+
+		   SW-3232 Swop round FN-Q,D and FN-Q,T
+
+		   Forward and backward compatible
+
+2) Dennis
+		1) Changed wait states on CS1 ROM from 4 to 2 on P2 variant.
+
+		   Forward and backward compatible
+
+		2) Modified ImpHal::PrepareForRepro() to leave the cache and
+		   write buffer enabled. It is only necessary that the page
+		   directory entries for the FLASH are marked as not
+		   cacheable or bufferable and that the TLB and cache are
+		   flushed, which was already the case.
+
+		   Forward and backward compatible
+
+		3) Upgrade 001
+
+		   Rewrote some of the TRegion member functions in ARM assembly language in an attempt to
+		   speed up the operation of the window server, which uses these functions extensively, and
+		   which was found to be responsible for slow operation of the machine when a large number
+		   of applications are open. See defect reports SW-3500 and SW-4478 and the replies to them.
+
+		   Forward and backward compatible
+
+3) Ann
+		1) Upgrade 002
+
+		   Fixed a bug in Math::Pow() (defect report SW-4624) so that
+		   KErrOverflow errors are not incorrectly returned as KErrArgument
+		   errors.  This occured because of differencing of infinity - which is
+		   now checked for.  Updated maths test code (t_math) to test this
+		   change fully.
+
+		   Forward and backward compatible
+
+		2) Upgrade 025
+
+		   Fixed SW3-317 KRealFormatNoExponent mode was not checking for
+		   KExtraSpaceForSign flag.  Now checks and changed to act accordingly.
+		   Also added this to test code.
+
+
+4) Morgan
+		1) Upgrade 003
+
+		   Set a constant string in the SuperPage when platform initialisation
+		   has completed.  This string is checked on warm resets to validate
+		   cold start initialisation has completed successfully at some point
+		   in the past.
+
+		   Forward and Backward compatible except for machine configuration
+		   compatiblity. So, machine configurations may not be passed
+		   between old and new versions of E32. You must perform a cold
+		   reset having upgraded to the version of E32 because of this
+		   change.
+
+
+		2) Upgrade 019
+
+		   Fix for SW3-91 and SW3-66:  Shared code chunks are Open()ed properly
+		   in DProcess::Create().  New code chunks are named "$EXE[<Checksum>]"
+		   and no longer have an owner.
+
+		3) Upgrade 026
+
+		   Initialised TheSuperPage.iXtalError to 0 in Hal::Init1() on a cold boot
+		   for those platforms that don't do it themselves in their variant
+		   initialisation.
+
+5) Matthew
+		1) Upgrade 005
+
+		   Changed "Rings" alarm sound to be the same as those on the 3a. Thanks to Jezar
+		   for his help with this.
+
+		   Also adjusted the trailing silence in algorithmic alarms as suggested.
+		   Fixes SW3-22.
+
+		   Forward and backward compatible
+
+		2) Upgrade 006
+
+		   Fixed SW3-256: Arm sound ldd no longer links to localisation dll.
+
+		   Forward and backward compatible
+
+		3) Upgrade 007
+
+		   Fixed bug SW3-25: Requests on logical channels by threads which did not open
+		   that channel will now panic the rogue thread, rather than potentially crashing
+		   the whole machine.
+
+		   Added test code to T_SOUND.
+
+		   Forward and backward compatible
+
+		4) Upgrade 008
+
+		   Fixed bug SW3-9. Wins fixed (again) to take account of NT daylight saving settings.
+
+		   Forward and backward compatible
+
+		5) Upgrade 023
+
+		   Fixed SW3_315. In the sound LDDs play and record dfc functions the value of
+		   iThread.iExit is now tested, and if it is not EExitPending then the function
+		   returns straight away.
+
+		   Forward and backward compatible
+
+6) Pete
+		1) Upgrade 015
+
+		   SW3-138 Change to CF card interrupt enable scheme. Currently the MTD keeps
+		   card IREQ interrupts enabled in Etna while its open. These are normally
+		   disabled at the card level but enabled in the card during a write operations.
+		   When the media switch is broken or when a dodgy CF card is present, this can
+		   resulting in a watchdog timeout due to the card permanently asserting IREQ and
+	   not responding to the interrupt clear. This change leaves IREQ disabled
+		   in Etna until required for the write operation.
+
+		   Forward and backward compatible
+
+		2) Upgrade 016
+
+		   Change only for variants with 2 sockets (ie RackD). Currently on these systems,
+		   when a media change occurs, the PC Card controller does the following
+		   to each socket in turn before turning off Vpc:
+		   - Disable IREQ
+		   - Disable Etna interface
+		   However, because the two sockets have an individual IREQ, but share
+		   the same Data/Address buffers, when the Etna interface is disabled on
+		   the 1st socket, it causes the RESET signal to the 2nd to become
+		   active. This in turn causes the 2nd socket to permanently assert IREQ
+		   (which is now Rdy/Bsy) while its IREQ interrupt could potentially be
+		   enabled. Result is continuous interrupts followed by watchdog
+		   timeout.
+		   The fix is to disable IREQs on both sockets before disabling the Etna
+		   interface. This is done in the variant code for Rack D - ie no impact
+		   on Protea P2.
+
+		   Forward and backward compatible
+
+		3) Upgrade 017
+
+		   Change to test program DRVSOAK so that it monitors the amount of
+		   spare RAM while soak test is running.
+
+		   Forward and backward compatible
+
+		4) Upgrade 027
+
+		   Fixed SW3-440. Older SanDisk CF cards still sometimes timeout when
+		   running on batteries. Increased timeout in CF card media driver from 60ms
+		   to 70ms.
+
+		   Forward and backward compatible
+
+		5) Upgrade 028
+		   Fixed SW3-434. Allow CIS parsing functions not to reject a CIS which
+		   has incorrect link tuples.
+		   If a CIS chain contains no link tuples then a check is made for a link target
+		   tuple at address 0 in common memory (as before). However, if a link
+		   target isn't found here then we assume a normal end of the CIS chain
+		   (rather than marking the entire CIS chain as invalid as before).
+		   If a CIS chain contains a 'Long Link to attribute memory' tuple but no link
+		   target tuple is found at address: (specified offset x2) then we also check for a
+		   link target tuple at address: (specified offset x1).
+
+		   Forward and backward compatible
+
+7) William
+		1) Upgrade 020
+
+		   Changes to test programs so that they run from CF card on top of the full
+		   Protea ROM. T_CTRAP, T_POWR, T_UID from TBAS, the rest from TCDT. Still more changes
+		   required to fix "Z:\Test" assumptions and the strange bug with the EIKON console.
+		   T_CTRAP will now fail on WINS debug because it checks the stack depth.
+
+		   Forward and backward compatible
+
+		2) Upgrade 021
+
+		   Extend RChangeNotifier to do EChangesSystemTime: effects E32STD.H and KSRC\KS_TIM.CPP, KS_NOFTY.CPP
+		   There is a Defect for this, but it's really an E32 Proposal trying to be noticed...
+
+		   Backward compatible, not forward compatible if you take
+		   advantage of this new feature.
+
+		3) Upgrade 022
+
+		   Check in DThread::Cleanup to see if the dying thread is the one which currently owns the event hook.
+		   If so, cause a 'graceful' kernel fault instead of an
+		   'ungraceful' one further down the line (SW3-205).
+
+		   Forward and backward compatible
+
+		4) Upgrade 024
+
+		   Fixed SW3-73. Puts the first 8 characters of the Panic/Fault category into the codeAddress
+		   and dataAddress of the last exception information (except, of course, if we are faulting
+		   because of an exception...)
+
+		   Forward and backward compatible
+
+8) Geert
+		1) Upgrade 029
+
+		   Fully source and binary compatible. Not link compatible, however. See below for details.
+
+		   Fixed SW3-11, replacing the following EUSER.DLL exported functions with binary equivalents:
+
+			CArrayFix<TAny>::CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity);
+			CArrayFix<TAny>::~CArrayFix();
+			CArrayFixFlat<TAny>::CArrayFixFlat(TInt aRecordLength,TInt aGranularity);
+			CArrayFixFlat<TAny>::~CArrayFixFlat();
+			CArrayFixSeg<TAny>::CArrayFixSeg(TInt aRecordLength,TInt aGranularity);
+			CArrayFixSeg<TAny>::~CArrayFixSeg();
+			CArrayVar<TAny>::CArrayVar(TBufRep aRep,TInt aGranularity);
+			CArrayVar<TAny>::~CArrayVar();
+			CArrayPak<TAny>::CArrayPak(TBufRep aRep,TInt aGranularity);
+			CArrayPak<TAny>::~CArrayPak();
+
+		   All CArrayXxx<TAny> stock instances acquire inline ctors just like the template ones.
+		   If you use any of these classes then to be able to link against the new EUSER.LIB
+		   will require re-compilation.
+
+		   A clean build should be sufficient.
+
+		2) Upgrade 030
+
+		   Entirely backward compatible. Forward compatible for all software that doesn't use the new service.
+		   And additional forward incompatible change now allows the element just past the array to be addressed
+		   using CArrayXxx::End().
+
+		   Fixed SW3-374, adding new exported function
+
+				TAny* CArrayFixBase::Back(TInt anIndex) const;
+
+		   as well as inline wrappers to CArrayFix<T> and CArrayFix<TAny>.
+
+		   These functions provide functionality equivalent to CBufBase::BackPtr(), being CArrayFixXxx::End()
+		   counterparts for fast _backward_ iteration.
+
+		   Also introduced modifiable overloads of End() inline wrappers and relaxed index range checks for
+		   CArrayFixXxx::End() as well as Back().
+
+9) Jonathan
+		1) Upgrade 031
+
+		   Fixes SW3-334
+
+		   Debug::SetBreakpoint only allowed breakpoints to be set at 0x2xxxxxxx (and at
+		   0x5xxxxxxx in debug releases). Eikon apps get loaded into memory between
+		   0x9000~ and 0xFFFF~.
+
+		   Debug::SetBreakpoint allows breakpoints between 0x9000~ and 0xFFFF~.
+
+		   No API change. Doesn't depend or tread on any previous upgrade.
+
+		   Forward and backward compatible
+
+
+Version 0.01.105
+================
+(Made by Pete, 8th May 1997)
+
+1) Dennis
+		1) Modified the scheduler to set machine current consumption to either
+		   running or idle current depending on whether the null thread is
+		   being scheduled.
+		2) Added functions Custom::BacklightCurrentInMilliAmps() and
+		   ImpHal::BacklightCurrentInMilliAmps and code to include the
+		   backlight current in K::TotalCurrentMilliAmps when it is on.
+		3) Fixed a problem with average battery current calculation - the function
+		   was using a hard-coded tick rate of 10 ticks per second.
+		4) Changed function DLogicalChannel::SetCurrentConsumptionInMilliAmps from
+		   protected to public since in practice it is always the PDD which calls it.
+		5) Modified the sound and COM1 PDDs to set the current consumption according
+		   to the device state.
+
+2) Morgan
+		1) Digitiser calibrated from values in E-squared Prom on a Cold Start.
+		2) Calibration preserved over a warm reset.
+		3) Plugged in crystal error and machine unique Id values from the E-squared.
+		4) DPlatProcess destructor closes the process code chunk, and Create() adds
+		   newly created code chunks to the list of Kernel chunks.
+		5) RLoader::LoadProcess() Kill()s the new process on a failed load.
+
+
+3) William
+		1) Reorganise CDeltaTimer creation to fix SW-4030
+		2) Remove TDblQueLInkBase::EnQue() assertion, to fix SW-4991
+		3) Reset auto switchoff timeout when an absolute timer completes, to fix SW-4870
+
+4) Ann
+		1) Fixed bug SW-4351 in Math::Mod().  Now returns KErrTotalLossOfPrecision
+		if an accurate answer cannot be given.
+		2) Reorganised maths test code so it now builds for ARM.
+
+
+5) Andrew       1) Fixed bug SW-4180. SetReserveL(TInt) is now available only
+				for CArrayFixFlat<T>, CArrayFixFlat<TAny> and CArrayPtrFlat<T>.
+				The parameter is new the reserved size of the array, not the
+				reserved expansion space.
+
+6) Pete		1) TPcCardSocket::SetSocketStatus() made virtual function.
+		2) Added the inline function
+		TPcCardSocket::EventCallBacksRequested(TPccdEvent anEvent).
+		Used to determine if there are any clients expecting notification of
+		a particular PC Card event.
+		3) CROM Media Driver Caps() no longer sets the drive attributes as
+		KDriveAttRom.
+		4) Fixed problem parsing Configuration table entry tuples where the
+		last two entries both have the same configuration entry value. Prior to
+		this, only the first of the two was reported.
+		5) ATA Media Driver now leaves card interrupts enabled in the PC Card
+		Controller h/w, and enables/disables these as required on the card. This
+		is quicker than the previous scheme where it was continuously enabling
+		and disabling interrupts in controller h/w on each Write() request.
+		6) Media Driver Open() failures due to media change now only return
+		KErrNotReady rather than any other error value.
+		7) ATA Media Driver now verifies that a partition is a DOS partition
+		(extended DOS partitions not supported).
+		8) ATA Media Driver now uses Pulse mode interrupts where possible.
+		Previously it always used Level mode interrupts.
+		9) Change to ATA Media Driver - for write requests
+		which straddle a sector boundary and require prior reading of two
+		consecutive sectors, the read is now performed with a single read
+		command (of two sectors) rather than two reads of one sector.
+		10) Default attribute memory access speed for 3.3V
+		socket is 600ns rather than 300ns (as per PC Card Spec.).
+		11) Withered Custom::DriveName() and Custom::PcCardSocketName() in
+		custom dll.
+		12) Prevented DPrimaryMedia queueing same DFC twice.
+		13) Introduce Media Driver Interface version number.
+		14) Made media driver current consumption values more realistic.
+
+7) Jonathan
+
+		1) The Debug class won't let the user insert breakpoints or
+		   single-step into ROM code before the aDebugLimit argument to
+		   Debug::Open.  Gdbstub sets aDebugLimit to its own location in
+		   ROM, thus preventing breakpoints/stepping into code before it in
+		   ROM (including EUser, EKern etc) which might otherwise break.
+
+		2) The Debug class ignores the user-supplied aDebugLimit in Release
+		   builds and prevents setting of breakpoints/single-stepping
+		   anywhere in the ROM.
+
+		3) Binary incompatibility (affects gdbstub & test code, doesn't
+		   affect RDebug::Printf):
+		   Debugger functions in the RDebug & Debug classes changed to use
+		   thread Ids instead of opaque DThread pointers. Components that
+		   call RDebug::ReadMemory() or RDebug::WriteMemory() should pass in
+		   RThread().Id() as the first argument to these functions to retain
+		   their current functionality.
+
+		4) New DThread* Kern::ThreadFromId(TThreadId) for use by Debug
+		   class. Also changed S::ThreadOpen(... TThreadId, ...) to use it.
+
+8) Matthew
+		1) Fixed SW-3783 - by default, the comms driver now uses descriptor
+		   MaxLength() rather than Length() for reads.
+		   Note: This fix has meant a change to the inline function RDevComm::Read(),
+		   so anyone using this function should recompile with the new E32. You
+		   know who you are.
+		2) Fixed bug in comms driver so that it no longer crashes if you
+		   request that it writes beyond the end of a descriptor.
+		3) Stopped WINS sound pdd from gurgling when you do a PlaySineWave().
+		4) Moved DTMF volume information from sound LDD into the PDDs, since
+		   it depends on the frequency response of the hardware.
+		5) Tiny amount of fiddling with algorithmic alarm sounds.
+		6) Made the __WINS_UID() macro expand in WINC builds, implementing the E32
+		   proposal.
+		7) Removed the EChangesAll enum from E32STD.H since if it used it may break
+		   forwards compatability. This should only effect BAFL.
+		8) Added a User::SetCurrencySymbol() function for setting the system-wide
+		   currency symbol.
+
+9) Graham
+				1) Added German keyboard table which now gets
+				   released as CAKDP2.GE
+				2) Released IMPORT_C from TInt64A functions. These
+				   were not being exported anyway.
+				3) Exported RLibrary::LoadRomLibrary on EPOC
+				   platforms
+				4) Fixed update of battery statistics when the
+				   main batteries are changed (SW-5096, SW-4228).
+				5) Fixed update of main and backup battery statuses
+				   when switching on (SW-3401, SW-4479).
+				6) Changed UK, US, and German keyboard tables to give
+				   the multiplication and division signs when the
+				   appropriate keystrokes are made.
+				7) Shortened the beeps for Cold Start, Warm Start,
+				   and Kernel Fault.
+
+
+10) Jal
+				1) Added build infrastructure for ELOCL.GE
+				   (the german localisation dll).
+
+Version 0.01.104
+================
+(Made by William, 2nd May 1997)
+
+1) William
+
+		1) Removed the TRAPD() from DThread::RequestComplete, which still seems
+		   to cause lots of E32USER-CBase 71 and 63 panics when used in the
+		   harsh environment of real test roms
+		2) Remove reference to GateFunction in EGATE.DEF to fix the T_DUID.DLL test
+		3) Add extra test cases to TCDT\T_THREAD.CPP
+		4) Add missing XCUST*.DEF files to BMARM\LI.PRJ
+
+Version 0.01.103
+================
+(Made by Morgan, 1st May 1997)
+
+1) Graham
+
+		1) Fixed a problem with the code which looks for both shift
+		   keys when switching on after a warm reset in order to
+		   change it into a cold reset.
+
+		2) Fixed a problem with constructing the encrypted password
+		   in the super page.
+
+Version 0.01.102
+================
+(Made by Morgan, 30th April 1997)
+
+1) Pete
+		1) Change to PC Card Serial Driver (EUART3.PDD) for Rack D. Added
+		followers for 16550 registers IER,LCR,MCR rather than relying on
+		them being read/write registers. Tested this driver using
+		COMMS(033) app. Sent/received files at various baud rates up to
+		57600 (didn't test at 115K) using XMODEM without any problems. The
+		above driver works with the following PC Card Serial Ports/Modems:
+			- Socket I/O serial port
+			- Dacom Goldcard V34 + Fax
+			- Hayes Optima 288
+		2) Now possible for ATA media driver to return the following errors
+		on read or write command fails:
+			KErrCorrupt  - Bad block detected / sector ID error.
+			KErrWrite    - Write fault.
+			KErrTimedOut - Timeout waiting for ATA controller to negate
+					   BSY bit.
+			KErrLocked   - Timeout waiting for ATA controller to assert
+					   RDY bit).
+			KErrGeneral  - Protocol error (wrong state of DRQ bit
+					   detected).
+			KErrUnknown  - General ATA controller error.
+			KErrCancel   - Command aborted
+			KErrDied     - Uncorrectable error encountered.
+		Prior to this, all the above conditions resulted in KErrTimedOut.
+		(All of these get translated as before by F32 but the extra
+		information from the driver is useful).
+		3) Format command now implemented using ATA WriteSectors command rather
+		than FormatTrack. This is because there seem to be a variety of
+		implementations of the FormatTrack command and also it can take a significant
+		time to complete (>200ms) on some cards which require CHS addressing.
+		4) Changes to various trace o/ps to prevent system watchdog timeouts on media
+		changes with tracing on.
+
+2) William
+		 1) Use Win32 IsBadReadPtr/IsBadWritePtr functions to provide better emulation of
+			EPOC32 kernel exception handling (should allow us to handle the access violations
+			that the kernel has contingency plans for, even under the MSDEV debugger).
+		 2) Fix SW-1799 by preventing the Win32 thread priority from being raised too high
+		 3) Fix SW-???? by ignoring the KNotifyIfDie flag when WINS threads die (as per EPOC32).
+		 4) Trace the Win32 Thread ID and the WINS thread name in the debug window (WINS debug builds)
+		 5) Fix SW-4346 by making CalcChunkHeapCompression wary of corrupt heaps and wrapping the
+			invocation from ChunkCompressAll in a suitable exception trap.
+		 6) Arrange to keep iHandles valid (but empty) after thread cleanup
+		 7) Fix SW-3718 by making ChangeNotifier handles thread-relative.
+		 8) Prevent WINS RProcess::SetPriority from changing the Win32 process priority (SW-1799)
+		 9) Limit the size of a heap cell to 1 Gigabyte (SW-4528)
+		10) Fix SW-4389 by ignoring UserSvr::InitRegisterCallback calls after initial bootstrap.
+		11) Fix SW-3527 by ensuring that the SYSTEM.INI screenwidth is rounded up to a multiple of 16.
+		12) Fix T_QUE, T_DLL1, T_DLL2 and T_SVR2 test failures.
+
+3) Graham
+				1) Fixed WINS problem with expanded MachineInfo
+				   structure.
+
+4) Bruce
+				1) Two field dates are now accepted for all locales. Fixed year 2000 bug.
+				   Removed hard-coded 'am'/'pm' and replaced these with data
+				   retrieved from the localisation dll.
+
+5) Ann
+			1) Fixed bug in TLex8::ScndigAfterPoint() (SW-4304) - now reads in first 18 significant
+			   digits rather than just first 18 digits.
+			2) Fixed bug in TLex8::Val() (SW-4355) - overflow in some cases was being returned as
+				   positive regardless of actual sign.
+
+Version 0.01.101
+================
+(Made by Graham, 29rd April 1997)
+
+1) Graham
+				1) SW-1921 Fixed the occasional load click by disabling interrupts while creating the click.
+				2) Added localised keyboard tables to the P2 build
+				   system and created CAKDP2.UK and CAKDP2.US. CAKDP2.DLL
+				   remains and gives a layout consistent with the keyboards
+				   currently on our Limes.
+				3) Change the rombuilding system to accept a localisation
+				   parameter. So you may use "rom rel p2 uk". If you specify
+				   just "rom rel p2", you get what you always used to.
+				4) SW-3330 Fixed repeating keys when entering 'Raw'
+				   mode in the text window server while a key is depressed.
+				5) SW-3837 introduced ELangInternationalFrench
+				6) SW-4181 allocated WINS DLL address for MEDCRM.PDD
+				7) Solved problem with watchdog timer going off sometimes
+				   when coming out of standby.
+				8) Changed Hal information names in preparation for the
+				   final ROM.
+				9) Changed supply voltage information so that it
+				   never returns a voltage above the stated maximum
+				   for that battery and returns zero millivolts if
+				   the battery status is EZero. Changed the maximum
+				   voltage for the main battery to 3100mV and for the
+				   backup battery to 3200mV. SW-4194 SW-4237.
+			   10) Implemented the reading of ADC channel 7 on a cold
+				   boot in order to detect when test department boot
+				   to final test is required.
+			   11) SW-3563 Displaying years >2000 as 2 digits in
+				   abbreviated form.
+			   12) SW-4339 Set CurrencyNegativeInBrackets to EFalse
+				   in both the US and UK localisation dlls.
+			   13) Added structure for UserHal::CpuInfo(TDes8& aInfo)
+			   14) Added UserSvr::WsRegisterSwitchOnScreenHandling().
+				   If a window server wants to take control of
+				   turning on the screen, then it should call this
+				   function with ETrue and may then call
+				   UserSvr::WsSwitchOnScreen(). It may relinquish
+				   control back to the Os by calling the register
+				   function again with EFalse.
+			   15) Added the functions:
+						UserHal::SaveXYInputCalibration();
+						UserHal::RestoreXYInputCalibration(aType);
+				   Restore takes an argument that may be EFactory (to
+				   restore the factory set calibration) or ESaved to
+				   restore the previously saved calibration.
+			   16) Added the following to the Machine Information
+				   structure:
+						TInfoName iProcessorName
+						TInt iProcessorClockInKHz
+						TInt iSpeedFactor
+						TInt iMaximumDisplayColors
+
+2) William
+		1) Added WINS SYSTEM.INI support for "MegabytesOfFreeMemory" which also turns on the
+		   mechanism for limiting the total amount of memory which WINS can allocate.
+		2) Number some more enumerated types associated with panics and faults. Note that this
+		   includes removing #ifdef __XCON in KPWINS\KP_STD.H so that the KPWINS platform fault
+		   numbers will change: prior permission was obtained from the BC police.
+		3) In DEBUG builds, change RHeap::Free to fill the released block with 0xDE rather than 0
+		4) Add __ASSERT_DEBUG to catch double insertion of a TDblQueLink (and fix two places in
+		   the Base which weren't constructing a link when creating an object).
+		5) Fix SW-3707 by not panicing unnecessarily in DPlatProcess::AllocateDataSectionBase()
+		6) Fix SW-2104 in DTimer::Cancel(), by not calling RequestComplete on a dead thread, and
+		   not doing the expensive timer scan in DThread::Cleanup().
+		7) Fix SW-1185 by interpreting EKeyIncContrast to mean "bigger number in SetContrast" in the
+		   text window server.
+
+3) Morgan
+		1) Preserved the password and its enabled state over a warm reset.
+
+4) Matthew
+		1) Added PlaySineWave() function to RDevSound. Also added an iMaxSineWaveFrequency
+		   member variable to the sound caps structure. Frequencies are in Hz.
+		2) Changed sound LDD so that it gets the alarm name via the kernel's
+		   locale-message-text service. LS_SND.CPP and K32LSND.H have thus been scrapped.
+		3) Fixed bug in sound LDD which caused a kernel panic if FlushRecordBuffer() was
+		   called after a record request had failed with bad power.
+
+
+Version 0.01.100
+================
+(Made by Graham, 23rd April 1997)
+
+1) Dennis
+		1) Modified ARM boot code to automatically work out the size and bus width of
+		   the ROMs connected to CS0 and CS1 chip selects. This information is stored
+		   in the super page in the iRomConfig entries. Both banks of ROM are then mapped
+		   to consecutive linear addresses.
+		2) Added a new function Hal::PrepareForRepro, which re-maps all the ROM in the
+		   machine. This is to make sure repro works correctly even if ROM page shadowing
+		   is in use. This function uses the information stored in the iRomConfig entries
+		   in the super page to work out which ROM to map and how to map it.
+		3) Removed ROM mapping calls from VA_HW.CPP for all variants, and added code to set
+		   up the ROM speed and type. For P2 variant, added code to set up the ROM size
+		   for CS1 and the total ROM size. This is required to ensure that repro will work
+		   correctly even if the CS1 ROM is initially blank.
+		4) Added code to SF_MAIN.CPP to load an LDD (BOOT.LDD) from Z: immediately prior to
+		   loading the window server. This allows any shadowing of the ROM for bug fixes to
+		   be done.
+		5) Added a new function UserHal::RomInfo to read the iRomConfig entries from the
+		   super page. Updated T_INF.CPP to display this information.
+		6) Modified ARM boot code to allocate 1K for each page table instead of 4K as it
+		   does at the moment. Also use page tables 6 onwards for ROM mapping instead of
+		   8 onwards, since page tables 6 and 7 are unused at the moment.
+		   This saves 44K RAM for the standard Protea configuration.
+		7) Modified ARM boot code to make checking the RAM configuration non-destructive.
+
+2) Graham
+				1) SW-3765 Export TReal96::IsZero by number instead of by name.
+				2) SW-3760 Removed E32VIRT.H from the release
+				3) SW-3759 Removed temporary __ARRAY_NO_PTRS__ from E32DEF.H
+				   and appropriate function definitions.
+				4) SW-3058 Removed __DECLARE_DLL_UID().
+				5) SW-3480 Removed default Southern daylight savings
+				   time from the UK localisation DLL.
+				6) SW-3565 Implemented ~ as FN+J on Lime keyboards
+				7) SW-3564 Implemented the dial key as Fn+Menu on a
+				   Lime and as F3 on WINS. This comes through as
+				   EStdKeyDial and EKeyDIal (in E32KEYS.H).
+
+3) Morgan
+		1) Moved the locale configuration into the SuperPage to preserve it
+		   over a warm-reset.
+		2) Implemented TDes::TrimAll();
+		3) Checked Uid[1] in S::PhysicalDeviceLoad and S::LogicalDeviceLoad.
+		   Added WINS Uids to the device drivers in the Base.
+		4) Cold reset is now: Warm-reset followed by LeftShift+RightShift+On
+		   to make it harder to do by accident.
+		5) Fixed K::TickCounter synchronisation after standby, and initialised
+		   iLastLock for locked timers.
+
+4) Matthew
+		1) Fixed SW-2855 - the TRegion::Sort() and CArrayXxxBase::Sort() functions
+		   have been changed from having no return value to returning TInts, they
+		   will return KErrGeneral if there is a stack overflow.
+		2) Fixed blitting bug in eiger text window server which caused blocks of
+		   screen to be cleared.
+		3) Fixed bug in sound driver which made it crash when given a zero-length
+		   sample.
+
+5) Jal
+				1) Added TLocaleMessageText to E32SVR.H
+
+6) Alastair
+		1)	Changed e32\wsrc\ws_main.cpp so that the eikon shell is not loaded
+			if the machine is in test department boot mode.
+		2)	Created new project e32\etest producing an executable which will be
+			loaded instead of ewsrv.exe if the machine is in test department
+			boot mode.  This executable will attempt to load ewsrv.exe and
+			final.exe from the root directory of a cf card containing euser.dll,
+			edisp.dll and econs.dll	from the base in directory D:\system\libs.
+			If this attempt fails, etest.exe will try to load elink.exe from
+			Z:\system\libs which will open the remote link so that the machine
+			can be booted down the serial port.  If this fails etest.exe will
+			attempt to boot the machine up normally.
+
+7) Pete
+			1) Fixed 'Emergency power down with CF card powered results in cold
+			reset' (SW-3620). This was due to QuickEmergencyStandby() not
+			disabling the Etna's wait state controller properly.
+			2) Force ATA and CROM media drivers on ARM to only return KErrNotReady
+			rather than any other error value when a request is interrupted by a
+			media change.
+			3) Added the function CardIsReady() to class DPcCardCntrl. This should
+			be used periodically while using the PC Card Controller to check that
+			a media change hasn't occured. The new function is a quicker alternative
+			to the function CardIsReadyAndVerified(). The later is now only used once
+			at the start of each interface with the controller.
+			4) Requests to Write or Format the CROM card now return KErrAccessDenied
+			rather than KErrNotSupported.
+			5) PC Card Controller now calls P::ResetAutoSwitchOffTimer() on each
+			call off RPccdWindow::SetupChunkHw() to stop the machine going into
+			standby in the middle of a long write to a CF card etc.
+
+Version 0.01.099
+================
+(Made by Graham, 18th April 1997)
+
+1) William
+		1) Fix SW-3331 by ignoring Undertakers owned by threads which have themselves already died
+		2) Tweak UPWINS\BLD.CMD to bootstrap ECONS.LIB more reliably
+		3) Arrange for absolute timers to complete with KErrOverflow for times too far in the future
+		   instead of treating them as times in the past (starts to fix SW-3566)
+
+2) Graham       1) Fixed leaving without a trap harness. This was
+				   calling a slow executive function to panic the
+				   thread inside a fast executive trap function.
+				   Moved the call to panic to the user side.
+				2) Added V32ARMP2.H to INCK release.
+				3) Fixed a problem with 098 which meant that
+				   EKERN.DLL was linking to ELOCL.US rather
+				   than ELOCL.DLL (In WINS).
+				4) Included device driver def files in the INCK
+				   release.
+
+3) Matthew
+				1) Fixed Sound device driver's DTMF tone generating
+				   interrupt handler.
+
+4) Ann
+		1) Fixed doCalculator() function so that KRealFormatCalculator mode displays in no exponent
+		 mode only if full precision may be seen in this mode or if no mor precision will be available
+		 in exponent mode.
+		2) Fixed doNoExponent() function so that KRealFormatNoExponent mode reduces the number of
+		 significant figures used if the given no won't fit.  Now only raises an error if value is too
+		 big or too small to fit into the given width.
+
+
+Version 0.01.098
+================
+(Made by Graham, 16 April 1997)
+
+Note: This release is neither 100% binary compatible with 097, nor 100% source compatible.
+	The binary incompatibility is to do with UID allocation changes, the source incompatibility
+	with the correction of "overriden".
+	The UID changes are such that narrow release DLLs should work as they are. Other targets need
+	tweaking, which maktran 063 will do for you. See below for details.
+
+1) GrahamA
+
+IMPLEMENTATION OF UNICODE CHARACTER CLASSIFICATION, CONVERSION AND COLLATION
+
+NEW FILES
+e32\inc\collate.h
+	header for Unicode collation system
+
+e32\inc\unicode.h
+	header for Unicode character classification system
+
+e32\unicode\collate.cpp
+	Unicode collation system
+
+e32\unicode\unicode.cpp
+	Unicode character classification and attribute retrieval
+
+e32\unicode\unitable.cpp
+	tables of Unicode character attributes; this file is generated by the READTYPE utility from unidata2.txt.
+
+CHANGED FILES
+e32\bmarm\elocl.mak:
+e32\bmisa\elocl.mak:
+e32\bmx86\elocl.mak:
+e32\bwins\elocl.mak:
+	added ls_unic.cpp to list of source files
+
+e32\bmarm\eloclu.def:
+e32\bmarm\eloclud.def
+e32\bmisa\eloclu.def:
+e32\bmisa\eloclud.def
+e32\bmx86\eloclu.def
+e32\bwins\eloclu.def
+	removed UpperTable, LowerTable, FoldTable, CollTable, TypeTable; added CharSet.
+	(where relevant) added ls_unic.cpp to list of source files
+
+e32\bmarm\euser.def:
+e32\bmarm\euser.frz:
+e32\bmarm\euserd.def:
+e32\bmarm\euserd.frz:
+e32\bmisa\euser.def:
+e32\bmisa\euser.frz:
+e32\bmisa\euserd.def:
+e32\bmisa\euserd.frz:
+e32\bmx86\euser.def:
+e32\bmx86\euser.frz:
+e32\bwins\euser.def:
+e32\bwins\euser.frz:
+	added TChar::GetUpperCase, TChar::GetLowerCase
+
+e32\bmarm\euser.mak:
+e32\bmisa\euser.mak:
+e32\bmx86\euser.mak:
+e32\bwins\euser.mak:
+	added collate.cpp, unicode.cpp and unitable.cpp to list of source files, and collate.h and unicode.h
+	to dependencies where needed
+
+e32\bmarm\euseru.def:
+e32\bmarm\euseru.frz:
+e32\bmarm\euserud.def:
+e32\bmarm\euserud.frz:
+e32\bmisa\euseru.def:
+e32\bmisa\euseru.frz:
+e32\bmisa\euserud.def:
+e32\bmisa\euserud.frz:
+e32\bmx86\euseru.def:
+e32\bmx86\euseru.frz:
+e32\bwins\euseru.def:
+e32\bwins\euseru.frz:
+	added TChar::Compose, TChar::Decompose, User::Fold (new overload), TUnicode::Fold,
+	TChar::GetBDCategory, TChar::GetCJKWidth, TChar::GetCategory, TUnicode::GetCategory,
+	TChar::GetCombiningClass, TChar::GetInfo, TCHar::GetLowerCase, TUnicode::GetLowerCase,
+	TChar::GetNumericValue, TChar::GetTitleCase, TChar::GetUpperCase, TUnicode::GetUpperCase,
+	TChar::IsAssigned, TChar::IsMirrored, TChar::IsTitle, User::TitleCase,
+	TChar::TranslateFromUnicode,TChar::TranslateFromUnicode.
+	changed entry for RLogicalChannel::DoCreate to suit new signature
+
+e32\dsound\d_sound.cpp
+	changed an erroneous use of TChar::Fold to TChar::UpperCase
+
+e32\inc\d32ftim.inl
+	corrected penultimate arg to RLogicalChannel::DoCreate to suit new type (const TDesC8 *, not const TDesC 8).
+
+e32\inc\e32std.h
+	added Unicode functions and constants to TChar class
+	added Unicode functions to User class
+
+e32\inc\e32std.inl
+	added inline definitions of TChar::Fold and TChar::TitleCase
+
+e32\inc\k32std.h
+	added declarations for ExecHandler::GetLocaleCharSet, Locl::CharSet, K::CharSet
+
+e32\inc\u32std.h
+	added definition of LCharSet and removed character type bits (__U, __L, etc.), from Unicode build
+	defined EExecGetLocaleCharSet and DExecGetLocaleCharSet
+	added declaration for Exec::GetLocaleCharSet
+
+e32\kearm\ke_int.cpp
+e32\keisa\ke_int.cpp
+e32\kex86\ke_int.cpp
+e32\kpwins\kp_utl.cpp
+	added ExecHandler::GetLocaleCharSet to the dispatch table
+
+e32\ksrc\ks_dat.cpp
+	in the Unicode build, removed K::TypeTable, K::UpperTable, K::LowerTable, K::FoldTable and K::CollTable
+	and added K::CharSet
+
+e32\ksrc\ks_exec.cpp
+	added Unicode functionality to existing functions; added ExecHandler::GetLocaleCharSet
+
+e32\ksrc\ks_ini.cpp
+	in the Unicode build, removed initialisation of K::TypeTable, K::UpperTable, K::LowerTable,
+	K::FoldTable and K::CollTable and added initialisation of K::CharSet
+
+e32\lsrc\ls_lat1.cpp
+	in the Unicode build, used preprocessor directives to remove unused material
+
+e32\lsrc\ls_table.cpp
+	added preprocessor directives to select Unicode-build or Ascii-build material as appropriate
+
+e32\lsrc\ls_std.h
+	in the Unicode build, removed the LAlphabet class and added the TheCharSet object
+
+e32\tbas\t_key.cpp
+e32\t_cdt\t_buf.cpp
+	collation tests now work with new Unicode stuff
+
+e32\t_cdt\t_char.cpp
+	now works with new Unicode stuff; and in the Unicode build tests character classification and
+	my new collation system
+
+e32\tlocale\t_chset.cpp
+	now works with new Unicode stuff
+
+e32\ucdt\uc_des.cpp
+	changed two erroneous uses of TCharF to TCharUC
+
+e32\ucdt\uc_des16.cpp
+e32\ucdt\uc_des8.cpp
+	Capitalize and CopyCP convert first letter to title case, not upper case, in the Unicode build
+
+e32\ucdt\uc_exec.cpp
+	character classification and conversion functions (TChar::IsUpper, etc.) now work for all
+	Unicode values in the Unicode build; added new Unicode-only functions like TChar::IsMirrored
+	and TChar::GetNumericValue
+
+e32\ucdt\uc_func.cpp
+	the Unicode versions of Mem::CompareC now use the Unicode locale-specific string-based collation
+	system implemented by the TCollate class in the new source file collate.cpp
+
+e32\ucdt\uc_ksvr.cpp
+	changed type of penultimate arg to RLogicalChannel::DoCreate from const TDesC* to const TDesC8*
+	so that it works in the Unicode build: this caused changes to exported function signatures in the
+	.def and .frz files
+
+e32\ucdt\uc_lex16.cpp
+e32\ucdt\uc_lex8.cpp
+	changed two erroneous uses of TChar::Fold to TChar::UpperCase: folding isn't guaranteed to make
+	characters upper case, and doesn't in the Unicode build, but UpperCase is
+
+e32\upmarm\up_exec.cpp
+e32\upmx86\up_exec.cpp
+e32\upwins\up_exec.cpp
+	added Exec::GetLocaleCharSet
+
+e32\upmarm\up_lib.cpp
+e32\upmx86\up_lib.cpp
+	changed an erroneous use of CompareC to CompareF
+
+2) William
+		 1) Used Win32 InterlockedIncrement/InterlockedDecrement to implement WINS LockedInc and LockedDec
+		 2) Implemented first-cut exception->leave translation for WINS (as per MARM)
+		 3) Added exception trapping to DThread::RequestComplete, to fix SW-2274
+		 4) Arranged not to complete requests if the requesting thread has already died
+		 5) Enhance T_HEAP test to include truly concurrent access to shared heaps
+		 6) Fix incorrect semaphore count on default heaps (as shown by the revised T_HEAP!)
+		 7) Correct implementation of DThread::GetRamSizes for shared heaps, to fix SW-2671
+		 8) Fix WINS implementation of RDebug::Print, which was assuming a zero-terminated string
+		 9) Add T_REASON, a utility which loops printing the restart reason using RDebug::Print.
+			This isn't a test program as such, but can be put on a CF card as \System\libs\wserv.exe
+			to help debug endless restarting.
+		10) Improve DSession destructor to dequeue any messages which are marked EDelivered, in the
+			hope of fixing SW-1407 and friends.
+		11) Implement scheme to orphan kernel CObjects when their owner goes away, to fix SW-1665 (again!)
+
+3) Dennis
+		1) Modified prefetch abort, data abort and undefined instruction exception
+		   handlers in ke_int.cpp to save correct context if exception occurs in
+		   supervisor mode.
+
+4) Matthew
+		1) Fixed SW-2408 (problems with signals when you come out af standby).
+		2) Fixed SW-3293 (cancelling fallback alarm causes panic).
+		3) Fixed bug with emergency power down during fallback sound.
+		4) Increased DTMF buffer so if can now cope with 32 characters.
+		5) Made kernel noises (keyclicks, buzzes and sound driver activity) obey
+		   the state of the sound info. KErrAccessDenied is returned when sound
+		   cannot be played. Fixes SW-2725.
+		6) Yet more fiddling with algorithmic alarm sounds - fixed nasty distortion
+		   occuring with chimes.
+		7) Fixed potential memory leaks in CSecurityBase and CConsoleBase.
+		8) Fixed TTime::RoundUpToNextMinute() and TTime::operator+(TTimeIntervalMonth)
+		   so they now handle negative values correctly.
+		9) Fixed SW-1974 (Switching on IrDA gives 0xff in Rx buffer).
+		10) Changed comms PDD so that RS232 hardware is not enabled when IrDA is in use.
+		11) Changed "KeyClickOverriden" to "KeyClickOverridden" in lots of places.
+		12) Fixed SW-3097 (Wins Hal switch statement missing a break after TickPeriod).
+
+5) Graham
+				1) Fixed (with help from Morgan) booting up into a text
+				   shell on a normal eikon-based machine by placing
+				   the appropriate components (EWSRV.EXE EUSER.DLL ECONS.DLL
+				   EDISP.DLL ESHELL.EXE) in the \system\libs directory on
+				   a CF card.
+				2) Fixed SW-3163 (Alarms when the case is closed and
+				   'switch off when case is closed' is enabled).
+				3) Fixed SW-3091 (Auto switch of in the presence of
+				   'switch on when case opens').
+				4) Fixed SW-2893 (UserHal::MaxDisplayContrast(TInt&) in
+				   WINS).
+
+6) Geert
+		1) Removed the encoding of build variants in uid[0] of E32 images. Introduced
+		   differentiation between EXEs and DLLs in uid[0]. EXEs have a uid[0] of
+		   KExecutableImageUid [0x1000007a], DLLs come with one of KDynamicLibraryUid
+		   [0x10000079]; ie, DLLs don't change for narrow release builds, EXEs get the
+		   value previously used for narrow debug builds. EXEs won't load unless they
+		   have their uid[0] changed.
+
+		2) Changed lots of other private and public UIDs, taking care to preserve
+		   compatibility for ARM builds. Unless you release an EXE you're alright, and
+		   even EXEs can be fixed at rom build time.
+		   UIDs of interest can be found in a bare <e32uid.h>, which, in addition to
+		   KExecutableImageUid and KDynamicLibraryUid contains KLogicalDeviceDriverUid
+		   and KPhysicalDeviceDriverUid--uid[1] values for device drivers--and unrelated
+		   KMachineConfigurationUid.
+
+		3) Removed the second PREP stage from the rom build process.
+
+7) Morgan
+		1) Fixed a chunk problem with RAM loading the same process twice.
+
+8) Pete
+		1) Fixed 'Panic in DPlatMediaChange::TickService()' in WINS
+		(SW-1962). Now ignore further media change events (F5 keydown)
+		while the door state is open (as per ARM).
+		2) Fixed problems parsing the CIS of Multifunction PC Cards.
+		3) Temporarily fixed 'Occasional Write() / Format()
+		timeouts when accessing CF card' (SW-3311) by increasing the
+		WaitForNotBusy() watch dog in the CF media driver from 40mS to 60mS.
+		4) Door close event in WINS (F5 keyup) now processed
+		when the machine is in standby.
+		5) CRom(Prog) media driver (MEDCRR.PDD) now
+		calculated the CRom size by attempting to read the intelligent ID
+		from each flash device. This driver now has 'high' priority to allow
+		it to open in preference to the normal CRom media driver.
+
+
+Version 0.01.097
+================
+(Made by ???, ??? April 1997)
+
+1) MarkT
+		1) Added Early write completion to serial driver - D_COMM.CPP.
+		   To enable set the flag KConfigWriteBufferedComplete in the
+		   iHandshake of TCommConfigV01 and writes will be completed when
+		   they are in the transmit buffer as oppose to waiting until they are
+		   in the hardware.  To flush data from the transmit buffer either
+		   use Write(0), (Write(0) will not complete until transmit buffer
+		   is empty), or unset KConfigWriteBufferedComplete and do a
+		   write as normal.
+
+2) Pete		1) Change to CF media driver (MEDATA.PDD) so that this reverts to CHS
+		addressing if the LBA disk size is found to be invalid. Allows us to
+		work with Epson PC ATA card.
+		2) Fixed a problem such that the second socket on rack D (E:) wasn't
+		properly being reset following a media change (DPcCardSocket::Reset1()
+		wasn't being called) - only applies to racks modified for
+		VPC control via the CHRGEN signal.
+		3) Pc Card Controller now fully supports Memory Space Description fields
+		when parsing Configuration Table Entry tuples.
+		4) Pc Card Controllers attribute memory chunk increased from 8K to 64K.
+		5) Added the Delaware variant (VARMPG).
+		6) Added PC Card Serial Driver (EUART3.PDD) for Rack D - ie providing a third
+		serial port on Rack D when PC Card Modem or Serial card is inserted into the PC
+		Card Socket (68pin socket). To use it you have to switch the '3.3V/5V' switch to
+		the 5V position (LEFT) and apply a 5V/500mA supply to the '+5V'pin next to this
+		switch. Unfortunately, without a modification to Rack D it is not possible to
+		turn this socket on/off under s/w control. The driver assumes the card is
+		permanently powered and if the rack goes into standby (or the media change switch
+		is operated) then the card is no longer useable.
+		This driver has only received limited testing:-
+		- With a Serial PC Card it passes T_SERIAL up to 115K baud as long as the power-off
+		tests are disabled and the serial port FIFO is enabled. (Passes T_SERIAL up to
+		19200baud with FIFO disabled).
+		- Dacom V34 PC Card modem responds to an AT<CR> with T_TERM.
+		7) Change to CROM media driver so that the page latch
+		is reset after each access. This ensures that the page containing the
+		cards CIS is always selected at the start of each access.
+		8) Fixed problem where DPccdCntrlInterface::DoNotifyChange was adding the same TPccdCallBack
+		to two event queues. This resulted in the wrong event callback being
+		called on media change. This eventually lead to the situation where
+		the DMediaChange Dfc wasn't queued and the door close event was
+		missed. Any subsequent access to the CF card returned KErrNotReady.
+		(Fixes SW-2557)
+
+3) William
+		1) Fixed HeapOffset/ChunkCompressAll interactions to ensure heap safety: the HeapOffset
+		   is now set by RHeap::ChunkHeapCreated after the RHeap has been fully created, and
+		   ChunkCompressAll now respects the RHeap critical sections.
+		2) Add "DebugMask nnn" facility to WINS SYSTEM.INI (sadly you have to specify the
+		   bitmask as a decimal number, but it's still useful).
+		3) Start adding explicit numbering to some of the panic enumerated types, in particular
+		   TBasePanic, TCdtPanic and TExcType.
+		4) Implement CConsoleTextWin::SetTitle
+		5) Add T_HCOMP.CPP heap compressing program used to cause ChunkCompressAll problems.
+		6) Add __KTRACE_ANY which is similar to the previous version of __KTRACE_OPT
+
+4) Graham
+		1) Made pointer click volume default to soft (on a cold boot)
+				2) Removed Steve Townsend's change to TRegn::Clear()
+				3) Removed the leading 'V' from version names
+				4) Changed the fold and collate tables of the ISO
+				   LATIN1 character set so that 'a with a ring above
+				   it' and 'ae combined into one character' both
+				   fold to an 'a' and so that 'o with a slash through
+				   it' folds to an 'o'.
+				5) Froze the complete kernel interface on all builds
+				   except WINC.
+				6) Published CConsoleBase interface def files in
+				   CONSWINS.FRZ, CONSMARM.FRZ, and CONSMISA.FRZ.
+				   These are released in the INCC zip file so they
+				   will end up in \EPOC32\INCLUDE
+
+5) Morgan
+		1) Released E32 as PETRANned components, complete with Uids.
+		2) Removed RLibrary::UidL() and RLibrary::Gate() from the API
+		3) Introduced TUidType RLibrary::Type() and
+		   TUidType RProcess::Type().
+		4) TLoaderInfo has changed, so this E32 and the new F32 must be
+		   used as a pair.
+
+6) Matthew
+		1) Fixed comms drivers so they return the correct Ir Capabilities
+		   (KCapsSIR115kbps on Eiger).
+		2) Fixed bug in WINS sound pdd which meant that sometimes cancelling
+		   a play request would only finish after the sound had finished playing
+		   anyway.
+		3) Fixed bug in sound LDD which meant that samples up to the length of
+		   the buffer could be played or recorded on one go. Now descriptors
+		   must be less than or equal to the half the size of the buffer.
+		4) Added code to check that the power was not too low for playing or
+		   recording before it started. Also added code which checks the power
+		   level while it is in use and aborts if the power drops too low.
+		5) Further changes to the algorithmic alarm sounds - they now use beats,
+		   as on the 3a.
+		6) Added EChangesPowerStatus to the change notifier. This change occurs
+		   when either of the two battery statuses changes, or if external power
+		   is connected or disconnected.
+		7) Fixed bugs in TTime::DayNoInWeek() and TTime::DateTime() which were
+		   giving the wrong values for negative TTimes.
+		8) Added horizontal tabs, delete and ascii bell to test window server.
+		   Also made it ignore the null character and vertical tabs.
+
+Version 0.01.096
+================
+(Made by Graham, 2nd April 1997)
+
+Binary compatible with 095
+
+1) Graham
+		1) Improved backup battery voltage monitoring
+		2) Fixed a bug in the sound driver in the presence of
+		   emergency power loss. This should cure all reported
+		   problems of not being able to turn the machine back
+		   on after playing sounds with low batteries.
+
+2) Dennis
+		1) Fixed bug in unsigned division routine when used with
+		   a divisor >= 0x80000000.
+
+3) William
+		1)	Implement primitive support for WINS memory gauge (SW-1183)
+			Note that this won't limit the total memory allocated, so the gauge can
+			exceed 100% (see Defects database for details).
+		2)	Report allocated base address even for chunks of committed size 0 (SW-1876)
+		3)	Fix dangling pointer problem with DChunk::AdjustL (SW-1793)
+		4)	Implement Steve Townsend's suggested shortcut in User::Free and User::FreeZ
+		5)	Tidy up handling of config structures in DoControl in D_COMM.CPP (SW-1970)
+
+4) Matthew
+		1) Fixed SW-1994: Playing no sound can lock up machine.
+
+5) Pete
+		1) Measurement of Vpc when powering up Pc Cards has now been enabled. This is in order
+		   to reject cards which are found to be drawing excessive current.
+		   (This had been disabled until it was possible to convert the ADC reading to millivolts).
+
+Version 0.01.095
+================
+(Made by Graham, 26th March 1997)
+
+1) William
+		1) Fixed bug with shared heaps (SW-1665) and added failure scenario to the T_RHEAP test.
+		2) Fixed SW-1884 bug about timer.At() alarms going off early after switchoff, and
+		   enhanced T_POWR test to check for this.
+
+2) Morgan
+		1) Added code to calibrate the digitiser based on the values in the
+		   E-squared on a cold start.  This may mean that if your E-squared
+		   contains wildly outrageous values the digitiser will be out of
+		   kilter.  You can run \E32\TBAS\T_PROM to rectify this.
+
+3) Matthew
+		1) Fixed B5/B6 bug SW-1726 (volume suddenly shooting to maximum).
+
+		2) Moved algorithmic alarm data into the localisation dll, so the names can
+		   be changed.
+
+		3) Fixed B5/B6 bug SW-1630 in Comms PDDs: trying to set Mark and Space now
+		   returns an error, and they are not returned as part of the capabilities.
+
+		4) Changes to Etna comms:
+			Fixed bug where the TEtna class was ignoring the Parity-Enable bit.
+			Removed the Uart interrupt enable from the boot up, since it was being
+			switched off anyway, and made the Etna comms driver switch interrupts on.
+
+		5) Added Comms driver power handling code. The behaviour is now that read and
+		   write requests are completed with KErrAbort on normal switch-off and with
+		   KErrBadPower if there is an emergency power down. On a power down the input
+		   signals drop. On switch off, writes will keep going until the end of the
+		   hardware fifo.
+
+		6) Fixed some bugs in the Comms LDD to do with signals.
+
+		7) Added Grahams K32DBGDD.H header file, which contains a helpful class for
+		   debugging device drivers.
+
+4) Jal
+		1) Changes to the Pccd interface controller to allow
+				   access to media change notification. Added to UserPcCardCntrl:
+
+						IMPORT_C static TInt NotifyChange(TSocket aSocket,TRequestStatus *aReqStat);
+
+5) Graham
+				1) Tightened up the backlight handling code and added various
+				   backlight tests to T_POWR.CPP
+
+		2) Made Steve Townsends modification to TRegion.
+
+				3) Fixed a bug in Unicode in UM_RTOD.CPP
+
+6) Jonathan
+				1) t_dbg: Added memory read/write tests to user data and, on
+				   MARM, to Eiger registers.
+				2) Forced RDebug::WriteMemory() to use Mem::Move for aligned
+				   writes so that writing to Eiger registers works.
+
+7) Dennis
+		1) Added code to implement real-time clock correction based on a
+		   measured crystal error value in parts per 2^24, written into
+		   K::XtalError at startup.
+8) Pete
+		1) On media change, before writing to a thread which
+		   has requested notification of media change, a check has been added to
+		   verify the thread has not been destroyed.
+		2) Fixed a problem with CRom media driver (MEDCRM.PDD).
+		   Reads/writes from a position which wasn't on a word boundary (or of a
+		   length in bytes which wasn't a multiple of 4), weren't previously supported.
+		3) Implemented a 40ms watchdog timeout on writes to CF cards (MEDATA.PDD).
+		4) Pc Card Controller now supports extended device
+		   speed bytes when parsing Device Information Tuples.
+		5) Added extra fixed media enum to TMediaDevice in E32PCCD.H.
+		6) Various changes to Pc Card Controller to reduce code size.
+		7) It is now possible to disable the media change
+		   implementation by setting iTotalMediaChanges=0 in Custom::PcCardMachineInfo().
+		8) Pc Card inactivity power down and 'not locked' power down periods can now be
+		   set at the custom layer in Custom::PcCardMachineInfo().
+
+Version 0.01.094
+================
+(Made by Graham, 20th March 1997)
+
+1) William
+		1) Changed __KTRACE_OPT for exact matches on multiple trace bits, and tweaked some
+		   of the debug messages a bit.
+		2) Enabled __KTRACE_OPT for WINS builds, writing to "Output" window under MSDEV
+		3) Automatically set KPANIC trace bit if debug mask is non-zero
+		4) Use aThread==NULL to mean &Plat::CurrentThread() in ObjectFromHandle functions,
+		   and adjusted the callers appropriately
+		5) Check in SvSendReceive to make sure that the iSvSession is not NULL, and
+		   fault if it is: the most likely reason for this is a User::Panic in the Supervisor
+		   thread, so we check to see if the message code is ESvThreadPanic and extract the
+		   Panic category and code as appropriate.
+		6) Added a new TCDT\T_KILLER.CPP test program.
+		7) Added simple calibration of WINS ticks, to fix SW-1384 by making the clocks run on time...
+		8) Arranged for Plat::Panic to add 0x10000 to the afult number and call Plat::Fault, so that
+		   the machine will restart rather than loop forever.
+		9) Put back tweaked VA_RCHG.CPP battery charging driver: it will charge batteries without
+		   melting the machine, but it won't do so automatically: still needs more work.
+
+2) Graham
+		1) Changed rack B,C,and D keyboard tables to interpret FN+cursor
+		   keys as home, end, page down and up.
+
+		2) Updated all keyboard tables to handle ctrl+fn as outlined in
+		   the 090 release notes - not sure what happened to these changes,
+		   they seemed to disappear some time after 090
+
+		3) Added code to handle low battery situations a lot faster.
+		   Typically, we remove power from all devices within 110uS and go
+		   into standby within 130uS.
+
+		4) Enhanced the P2 keyboard driver. It no longer locks the keyboard
+		   out fully when three keys are pressed simultaneously. Rather, it
+		   waits until fewer then three keys remain pressed before beginning
+		   to deliver keyboard events again.
+
+		5) Fixed a bug in the keyboard when switching on with the dictaphone
+		   keys - it delivered the key down event but never delivered a
+		   key up event when the key was released.
+
+3) Ann
+		1) Changed TRealFormat KRealFormatExponent mode to be able to use
+		either significant figures or decimal places.  Default is still
+		decimal places, but oring in the KUseSigFigs flag to the format type
+		will allow use of significant figures instead.
+
+		2) Changed TRealForamtFixed mode so that negative numbers < -1 are
+		are "0" rather than "-0" when 0 dp are used.
+
+4) Dennis
+	1) Exec::ThreadRead8, ThreadRead16, ThreadWrite8, ThreadWrite16, ThreadGetDesLength,
+	   ThreadGetDesMaxLength now return an error code of KErrArgument if the pointer into the
+	   remote thread address space is invalid, rather than panicing the caller. This fixes
+	   problem SW-1013.
+
+	2) Supervisor server functions invoked with a bad pointer will now panic the caller,
+	   rather than causing a system fault and rebooting the machine.
+
+	3) The sound driver LDD has been changed to allow only one channel to be open at a time.
+	   This fixes problem SW-1165.
+
+	4) All key and pointer clicks are now disabled during sound recording. This fixes
+	   problem SW-817.
+
+5) Morgan
+	1) Read the E-Squared ROM into RAM on a cold boot.
+
+
+Version 0.01.093
+================
+(Made by Graham, 14th March 1997)
+
+1) Pete
+		1) Fixed a problem with inter-thread reading from CF card.
+	2) Fixed a timeout problem with some CF cards when
+	formatting.
+
+2) Jonathan
+	1) StrongARM port (ISA) brought up-to-date but not tested.
+
+	*) Base team please note that (rightly or wrongly) the ARM Custom
+	   API is shared with ISA (file inc\v32arm.h), so any changes or
+	   additions to the ARM Custom API must be reflected in the ISA
+	   Custom implementation.
+
+3) Graham
+		1) Fixed handling of the emergency power down queue. This
+		   problem was due to the bad design of single queues - it
+		   is impossible to fully check that you are enqueued without
+		   traversing the queue from the top. We might look into
+		   adding a more useful single queue type.
+
+Version 0.01.092
+================
+(Made by Graham, 13th March 1997)
+
+
+1) Pete
+	1) Fixed problem with Format() in Compact Rom (repro version)
+	media driver (MEDCRR.PDD) such that it was only formatting the first
+	2M of a CRom card.
+	2) Compact Rom media driver (MEDCRM.PDD) now included in release.
+
+2) Graham
+		1) Fixed an bug in the mmu abstraction which assumed that the page
+		   directory was aligned linearly in the same way as it was aligned
+		   physically.
+
+3) William
+		1) Fixed a problem with threads dying
+
+Version 0.01.091
+================
+(Made by Graham, 12th March 1997)
+
+1) SimonB
+		1) Fix for Serial PDD in NT 4
+		2) Removal of dependancy on MSVCRT40*.DLL
+
+2) Morgan
+		1) Added screen information to TRomHeader for the bootstrap
+		2) Fixed corrupted ExcInfo on MARM by adding a FiqStack and
+		   moving the exceptions onto the ExceptionStack.
+		3) Moved TExcInfo to E32HAL.H
+		4) System Death due to an exception now saves ExcInfo in the
+		   Superpage and causes a Kernel Fault.  Startup, Fault and
+		   Exception reasons are available through:
+				UserHal::StartupReason()
+				UserHal::FaultReason()
+				UserHal::ExceptionId()
+				UserHal::ExceptionInfo()
+				   There should be a Shell dialogue which retrieves
+				   this information after a kernel fault. This will
+				   enable us to pin down the offending code. Also, along
+				   with each new Protea image, MAKSYM should be run and
+				   the generated log file should be placed on the network
+				   as well. This will give the address of every function
+				   in every module of the ROM.
+		5) Changed the startup beeps
+				ColdStart    1 beep
+				WarmStart    2 beeps
+				KernelFault  3 decending beeps
+		6) Fixed SW-1069 - WINC heaps can grow up to 8Mb
+
+3) Graham
+		1) Enabled the shift key when typing e.g. CTRL-1 a to give
+		   a-umlaut.
+
+		2) Solved the œ sign problem on WINS - this had been
+		   re-introduced by Simon's WINS internationalisation
+		   code.
+
+		3) Re-introduced some digitiser inertia code to prevent
+		   wobble.
+
+		4) Re-structured the Spi controller code.
+
+		5) Fixed a bug in CObjectCon::CheckUniqueFullName() that was
+		   preventing two processes of the same name being loaded.
+		   This cures problems with T_KHEAP.EXE and T_PROC1.EXE.
+
+		6) Fixed T_KEYS.EXE by updating it for the new ISO LATIN 1
+		   keyboard tables.
+
+		7) Made TInt64::GetTInt() and TInt64::GetTReal() const.
+
+		8) Swapped the dictaphone keys round (again?)
+
+		9) Changed the emergency power down list to be on a single
+		   queue instead of an object container.
+
+		10) Changed the P2 keyboard table to make FN-e give e acute
+			and FN-SHIFT-e to give E acute. This is just to test that
+			such things are possible although it might be cool to just
+			leave this in since e acute is probably the most-used
+			accented character in English.
+
+		11) Moved the accenting keys from CTRL+1-6 to FN+Q and FN+Z-B
+
+		12) Completed anti-ghosting logic to disallow more than one
+			modifier and more than one normal key at the same time.
+
+		13) Changed the text window server so that a pointer click outside
+			the region of any window will cause the foreground window to
+			change.
+
+		14) Implemented battery voltage monitoring
+
+		15) Increased the number of frozen functions in the kernel to
+			avoid BITGDI recompilations when E32 is released. Lane, you
+			will have to recompile, hopefully for the last time, for
+			this version of E32.
+
+		16) Changed keyboard driver to recognise when the machine is
+			turned on. It will then scan the keyboard and deliver a
+			keyboard event only if the dictaphone keys are down. It then
+			waits for all keys to be up before proceeding to deliver
+			further events.
+
+4) Matthew
+		1) Fixed B5 bug SW-266 ("%+0*S" formatted incorrectly).
+
+		2) Put in Ir power-down fix (from Mark Ball).
+
+		3) Added emergency power down handling to sound driver. The driver
+		   completes statuses with KErrBadPower on emergency power down.
+		   This fixes B5 bug SW-384.
+
+		4) Added two functions to sound driver - BytesPlayed() and
+		   ResetBytesPlayed() wich give the user feedback on how playing is
+		   progressing.
+
+		5) Increased the volume of EVolumeMedium in Eiger sound PDD so the
+		   steps are more even. "Fixes" SW-543 (No apparent difference
+		   between volume settings).
+
+		6) Moved sound test code from F32 to E32.
+
+5) Jonathan
+	1) Added SA ARM variant for Snowball.
+
+	2) Fixed #defines in ROM.OBY file to make PREP happy.
+
+	3) Made screen size a variant-dependent thing on ARM:
+		- Screen size is no longer hard-coded in ARM text window server
+		  (wd_eiger.cpp) or ImpHal::Init3(). Text window server no
+		  longer handles switching bit depth.
+		- LCD initialisation moved out of boot code into
+		  ImpHal::Init3(), with size-dependant LCD initialisation in
+		  Variant::Init3().
+		- ARM boot code uses screensize parameters in ROM header to
+		  determine video RAM size and placement of page tables.
+
+6) Dennis
+		1) Fixed a bug in the high-resolution timer code, and added a
+		   Cancel() function to TMilliSecondCallBack.
+
+		2) Added a logical device driver for the high-resolution
+		   timer (EFTIM.LDD) accessed via RFastTimer class in
+		   D32FTIM.H
+
+		3) Fixed some bugs in 486 build of E32 and speeded it up
+		   by enabling the processor cache and by coding the Mem::
+		   functions in assembler.
+
+7) Ann
+		1) Fixed a bug in TLex8::Val() which setting next to start of
+		string if an overflow occurred, causing problems for EIKON.
+
+8) Pete
+	1)  On ARM architecture, moved code for Etna device out of the Kernel
+	 into the Variant DLL for P1,P2,RackC and RackD builds.
+	2) Added iInterruptInfo to TPccdConfigInfo class. Users of
+	UserPcCardCntrl::GetConfig() must rebuild - only Pc Card test code should
+	be using this.
+	3) Changes to the inter-thread Read()/Write() functions and the Format()
+	function of DMediaDriver to take a reference to a length (TInt &aLen rather
+	than TInt aLen). Read/Write/Format requests which would result in excessive time 		spent in the Kernel now only partly complete. They then return TErrTooBig
+	with aLength adjusted to the remaining length.
+	4) Removed the current thread read/write functions
+	Read(TInt aPos,TintaLength,TDes8 &aTrg) and Write(TInt aPos,TDesC8 &aSrc) from 	class DMediaDriver as the inter thread read/write versions now perform the same 		function if the target thread is found to be current.
+	5) ARM Ata media driver now adjusts auto power down timeout of CF card to 1sec. 		This prevents it from going into sleep mode between access which could affect CF 		card transfer rates (default is 5mS).
+
+Version 0.01.090
+================
+(Made by Graham, 26th February 1997)
+
+1) Graham
+		1) Changed CTRL+FN+key behaviour. This is a complicated
+		   issue. If one hits CTRL+FN+'1' on a Lime, then it is clear
+		   that the Control and Function modifiers should be set.
+		   However, what should the keycode be? It should be '1'
+		   and not '_'. Higher level software is more interested in
+		   the fact that CTRL+FN+'1' has been pressed than CTRL+'_' has
+		   been pressed. For this reason, in 089, the keyboard tables
+		   were changed to make CTRL override FN as far as keycode code
+		   production was concerned.
+
+		   However, consider the keystroke CTRL+FN+LeftArrow. In this
+		   case, the opposite is true. Higher level software is more
+		   interested in the fact that CTRL+HOME has been pressed
+		   than that CTRL+FN+LeftArrow has been pressed.
+
+		   So, in this release I have changed the keyboard tables to
+		   cater for both problems by judging each key on an
+		   individual basis. On a Lime, the keycode produced for:
+
+		   CTRL+FN+'1' - CTRL+FN+'9'    ->      '1' - '9'
+		   CTRL+FN+'A' - CTRL+FN+'Z'    ->      0x01 - 0x1a
+		   CTRL+FN+LeftArrow            ->      Home
+		   CTRL+FN+RightArrow           ->      End
+		   CTRL+FN+UpArrow              ->      PgUp
+		   CTRL+FN+DownArrow            ->      PgDn
+		   CTRL+FN+Tab                  ->      CapsLock
+		   CTRL+FN+Esc                  ->      Off
+		   CTRL+FN+'                    ->      '
+		   CTRL+FN+.                    ->      .
+		   CTRL+FN+<space>              ->      Backlight
+		   CTRL+FN+,                    ->      Help
+
+		2) Changed the raw key code on WINS for the Alt key from
+		   EStdKeyLeftAlt to EStdKeyLeftFunc. Attempted to get the
+		   windows key to be the Epoc32 Alt key.
+
+		3) Various additions to do with REPROing the upper 2Mb on
+		   Limes.
+
+		4) Protected the eiger internal registers from user mode access
+
+		5) Introduced anti-ghosting algorithm into the P2 keyboard
+		   driver. It doesn't, however, get rid of the ghost FN key
+		   when you hold down LeftShift, DownArrow, and RightArrow
+		   together. This leads me to believe that not all the diodes
+		   have been fitted on the modifier keys.
+
+		   The algorithm is basically one of 2-key rollover. So, any
+		   keypresses made when two keys are already held down should
+		   be ignored. Naturally, this is no good when you want to
+		   hold down certain complex modifier and key combinations.
+		   So, these special cases are compensated for in the software
+		   in the knowledge diodes should be fitted into the modifier keys
+		   to prevent any matrix-ghosting.
+
+2) Ann
+	1) Fixed bug spotted by Natascha in doCalculator() so that values
+	   with negative exponents are displayed correctly.
+
+
+Version 0.01.089
+================
+(Made by Jane, 21st February 1997)
+
+1) SimonB
+	1) Removed dependency on WINMM. Timer now based on a RealTime thread
+	   and sleeps.
+	   Required for Win95 and general compatibility.
+
+	2) Changed WINS Comms PDD to work with Windows 95
+
+	3) Mark T's Comms PDD bug fixes integrated.
+
+		4) International Keyboard support. Just UK and US at the
+		   moment, more to follow.
+
+		5) Removed first chance exceptions from WINS loading.
+		   IsBadWritePtr replaced by VirtualQuery.
+
+2) Jane
+
+	1) Finished the CObjectCon improvements suggested by Andrew. Note
+	   that to pick these up you need the new version of
+	   CheckUniqueName which takes CObject*s rather than names.
+	   The time taken to Add 0x600 named objects to a container has
+	   gone down from 14 seconds to 6 seconds.
+
+	2) Added code for _ftol() to WINS and X86 builds. The function
+	   header is in e32std.h
+
+	3) Fixed various debugging printfs by supplying a simple overflow
+	   handler so that long strings are truncated rather than
+	   panicing the caller.
+
+3) Graham
+
+		1) Fixed the œ gives ae keyboard problem by converting all
+		   keyboard tables from CP850 to ISO Latin 1.
+
+		2) Introduced a new key code - EKeyHelp. This is now F2
+		   on WINS.
+
+		3) Changed the WINS keyboard tables so that the dictaphone
+		   keys give the correct raw scan code as well as the
+		   appropriate Epoc32 key code. Did the same trick for
+		   the menu, help and off keys.
+
+		4) Fixed up the P2 keyboard tables. Note that the backlight
+		   keys have to be handled in higher level software -
+		   presumably the window server. On Protea the key code used
+		   is EKeyBacklightToggle. However, a really skillful
+		   implementation would handle EKeyBacklightOn and
+		   EKeyBacklightOff as well (in case future hardware has
+		   both on and off keys for the backlight).
+
+		5) Fixed the P2 sticky shift and function modifiers.
+
+		6) Removed the keyclick on shift, function and control keys.
+		   This has only been implemented on P2.
+
+4) Pete
+	1) Renamed EPccdEvent enums to prevent name clashing with
+	W32STD.H.
+	2) Enabled media change interrupts on P2 hardware.
+
+5) Morgan
+		1) WarmReset+LeftShift boots with EStartupColdReset on P1,P2,PB,PC,PD
+		2) Added startup beep
+		3) Fixed SW-32
+		4) Write protected the Mmu page directory backup
+
+6) Ann
+		I IMPLEMENTATION OF SPECIAL VALUES:
+
+		TReal96, Math and TDes8/16 classes now handle "special values" - NaNs,
+		infinities, signed zeros and denormals.
+
+		Changes are as follows:
+
+		1) Maths constants renamed:
+			K...ExponentBigBad   now K...SpecialExponent
+			K...ExponentSmallBad now K...ZeroExponent.
+
+		2) The Math member functions
+		ASin(), ACos(), ATAn(), Exp(), Frac(), Int(), Ln(), Log(), Mod(),
+		Pow(), Pow10(), Sin(), Cos(), Tan(), Sqrt()
+		have been changed as follows:
+
+		a) to return an error corresponding to the result, i.e.
+		KErrArgument if the result is indefined / a NaN,
+		KErrOverflow if the result is too big to be represented or infinite
+		positive only if the result is an integer),
+		KErrUnderflow if the result is too small to be represented (or if the
+		result is an integer, if the result is too large or infinite
+		and negative),
+		KErrNone if the result is finite and representable.
+		b) to write a result to the aTrg IN ALL CASES rather than just
+		the return value is KErrNone.  Hence the result is as follows:
+		NaN if the error is KErrArgument,
+		Positive or negative infinity as appropriate if the error is
+			KErrOverflow (or the max value if the result is an integer),
+		Positive or negative zero as appropriate if the error is
+			KErrUnderflow (or the min value if the result is an integer).
+		c) to be able to handle denormals. i.e. all numbers >= 5E-324 and <
+		KMinTReal64=2.2250738585072015E-308.
+
+		3) Math member functions IsZero(), IsNaN(), IsInfinite() and
+		IsFinite() added.  Also private member functions SetZero(), SetNaN()
+		and SetInfinite().
+
+		4) TDes8/16::Num/AppendNum() returns error value or length of string
+		as previously, but if error value is returned an appropriate string
+		is set:
+		"Inf" for positive overflow (KErrOverflow and positive argument)
+		"-Inf" for negative overflow (KErrOverflow and negative argument)
+		"0" for positive underflow (KErrUnderflow and positive argument)
+		"-0" for negative underflow (KErrUnderflow and negative argument)
+		"NaN" for NaN (KErrArgument)
+
+		5) TDes8/16::AppendFormatList() only panics for KErrGeneral and
+		if another error value is returned by Num(), uses the string set
+		as above.
+
+		6) The exponent of TReal96 zero is now -32768, the smallest exponent
+		possible.
+
+		7) TReal96 member functions IsZero(), IsNaN(), IsInfinite(),
+		IsFinite(), SetZero(), SetNaN() and SetInfinite() added.
+
+		II ROUNDING FLAG:
+
+		See Programming DB - Global Rounding Flag Required
+		A new private member of TReal96, iFlag, has been added to
+		indicate whether the mantissa is rounded up, rounded down or exact.
+		This has required changes in member functions to set and use the
+		flag where necessary.
+
+		Changes are:
+
+		1) iSign member changed from TInt16 to TInt8.
+
+		2) Constants for values of iFlag added to e32math.h:
+			const TUint8 KRoundedUp=2;
+			const TUint8 KRoundedDown=1;
+			const TUint8 KExact=0;
+
+		3) New TReal96 member function TReal96::Flag() which returns the
+		value of iFlag as a TInt.
+
+		4) New private function TReal96::Round() taking an argument which
+		specifies the number of binary digits in the mantissa to perform
+		rounding in the (MSDEV and IEEE standard default) round to nearest
+		mode and to set the flag as appropraite has been added to be used by
+		Normalise(), Prepare() and conversion functions.  New private member
+		function TReal96::ShiftToNormalise() added to be used in cases where
+		rounding will never be required e.g. assignment/construction of
+		TReal96 from TInt.
+
+		5) TInt64::Multop() returns integer values between -2 and 1 with the
+		following meanings:
+		-2	least significant 64 bits exactly zero
+		-1	least significant 64 bits less than TInt64(0x80000000,0) but
+			not zero
+		0	least significant 64 bits exactly TInt64(0x80000000,0)
+		1	least significant 64 bits greater than TInt64(0x80000000,0)
+		and TReal96::MultEq() changed to round according to these values.
+
+		6) TReal96::DivEq() rounds on the remainder after division similarly.
+
+
+		All maths test code updated to test special cases including
+		correct return values and setting target values and new functions,
+		etc.  Also fixed to work in X86 build.
+
+
+		III OTHER
+
+		1) UP_GCC.CPP function converting double to float changed to raise
+		the exception.  Also all arithmetic changed to do operation and
+		conversion and raise the exception if an error value is returned at
+		any stage.
+
+		2) Function TReal96::CheckOverUnderflow() used by arithmetic now a
+		private member function and altered to check fewer large-exponent
+		cases for overflow.
+
+7) Matthew
+		1) Fixed SW-25 from B5 database (Power off while recording hangs machine).
+
+
+Version 0.01.088
+================
+(Made by Jane, 12th February 1997)
+
+This version requires F32 053
+
+1) Graham
+				1) Sorted out the digitiser. This should no longer
+				   exhibit wobble or erroneous points when touching
+				   the surface lightly.
+
+				2) Updated digitser driver to use the new digitiser
+				   clicks rather than the keyboard clicks. These
+				   should now be indepenently controllable.
+
+2) Jane
+		1) Added an implementation of User::IsRomAddress from
+		   Simon B.
+
+		2) Added CArrayFixBase::SetReserveL
+
+		3) Fixed a chunk bug - when a TFindChunk was opened read-only
+		   in a process, the top bit of the process address (data
+		   section) was set to indicate this. If another thread was
+		   then created in the process, its heap address was incorrectly
+		   allocated over the TFindChunk, as the latter's address was
+		   stored with top bit set.
+
+		4) Fixed a shared chunk bug on 486 - when T_CHUNK opened the
+		   Window Server chunk RO, and then did an Exec::SessionSend
+		   to the WindowServer, there was a fault when the kernel
+		   attempted to write the message into the Window Server's
+		   heap. Fixed this by unsetting the WP bit in CR0, so that
+		   supervisor can write over User RO chunks. This is OK on the
+		   ARM, but a thing to look out for if we ever port to another
+		   processor.
+
+		5) Improved CArrayPtr<T>::ResetAndDestroy as suggested.
+
+		6) Changed profiler end/start behaviour as detailed on Notes.
+
+		7) Started to optimise CObjectCon::CheckUniqueName as suggested
+		   by Andrew Thoelke.
+		   The time taken to store 0x200 unnamed objects has gone down
+		   from 6 seconds to being as close to 0 as makes no difference.
+		   More on this later...
+
+		8) Added __ftol to EUSER.
+
+		9) Added CObjectCon::AtL which leaves rather than panicking, so that
+		   the kernel can panic a thread which passes an invalid find handle to
+		   open, rather than dying itself.
+
+		10) Increased the WINS main user thread's max heap size to 8M.
+
+3) Pete
+		1) Moved sections of code relating external interrupt control and binding out of
+				the Kernel DLL and down into the Variant DLL.
+				2) Code for Pc Card external interrupts (Ready,IREQ,Status change) added.
+				3) CF card media driver now makes use of card IREQ signal during card writes. This
+				now goes into idle after initiating a write to the card, with the card asserting
+				an interrupt on completion to wake up the system.
+				4) Added a media driver for compact rom card (MEDCRM.PDD).
+				5) Written media driver for programming flash on compact rom card(MEDCRR.PDD).
+				6) Modified the functions
+		7) Changes to functions CardInfo() and ChangeFlag() of UserPcCardCntrl class.
+				8) Monitor the Vpc voltage on first applying power to a Pc Card to check that
+				the card isn't drawing too much current for the rail.
+				9) Alteration to media change simulation in WINS:
+						F5 - Media door open as long as F5 is held down.
+						F4 - This toggles between 1 of two simulated CF cards on socket 0 (ie X:)
+							 when hit while F5 is held down.
+				10) All files used to simulate Pc Card memory and internal ram drive now created in
+				systems temp directory rather than \EPOC32\DATA - ie fixed HA-262.
+				11) Fixed problem with ATA media driver - divide by zero.
+				12) Removed support for Rev 1.0 Asic12.
+				13) Check battery status before commencing write to CF Card - return with
+				KErrBadPower if battery is low.
+				14) CF Card driver now handles emergency power down.
+				15) Pc Card power consumption - K::PcCardCurrentMilliAmps
+				now implemented.
+
+4) Matthew
+		1) User::SetHomeTime() has been changed to return a TInt. This will return KErrOverFlow on
+		   Arm if the new time is out of range (past about 2068, before about 1932).
+
+		2) Sound driver: Added more click controlling code and implemented a fallback alarm.
+
+
+Version 0.01.087
+================
+(Made by Graham, 5th February 1997)
+
+This release is binary compatible with 086
+
+1) Graham
+				1) Implemented dictaphone keys in WINS:
+						F6 Dictaphone Play
+						F7 Dictaphone Stop
+						F8 Dictaphone Record
+
+				2) Begun the production of power supply
+				   information from UserHal::SupplyInfo().
+				   Expanded test code in t_power accordingly.
+
+				3) Added the P2 variant which will be used for green
+				   machines. Changed the keyboard variant to include
+				   the dictaphone keys.
+
+				4) Added PD and P2 variants to the releaseables.
+
+				5) Added the function UserSvr::TestBootSequence(). This
+				   returns true if the machine is being booted by the test
+				   department. The file server should call this function and
+				   load etest.exe rather than ewsrv.exe if this is the case.
+
+				6) Added the function UserHal::ResetAutoSwitchOffTimer().
+
+
+				7) Added the function UserSvr::AddEvent(). This enables user
+				   code to add events into the event queue. Quite apart from
+				   the numerous applications that this might spawn, it is
+				   necessary for user side implementation of a VT100
+				   console driver and handwriting recognition software.
+
+				8) Added the EKeyMenu, EKeyBacklightOn,
+				   EKeyBacklightOff, and EKeyBacklightToggle keycodes
+				   to all variants. On WINS the F1 key is used as the
+				   MENU key.
+
+				9) Rationalised the MARM rom building system. This is
+				   now controlled by a single ROM.OBY file which is
+				   preprocessed with build and variant information.
+
+				10) Added backlight support. The backlight may be
+					either timed or untimed. Should the timeout
+					be reset whenever the machine is used?
+
+				11) Made pointer clicks configurable separately from
+					key clicks.
+
+				12) Added screen clearing on switch on if a password
+					is set.
+
+				13) Added UserHal functions for PointerSwitchesOn,
+					CaseOpenSwitchesOn, and CaseCloseSwitchesOff.
+					Grouped these, together with the
+					AutoSwitchOffTime, AutoSwitchOffBehavior,
+					BacklightTime, and BacklightBehavior information,
+					into a new TOnOffInfo structure.
+
+				14) Implemented switch off on case close and switch
+					on on case open on all platforms.
+
+				15) Simon has implemented a visual simulation on WINS
+					of case closing. On WINS, F11 is also used to simulate
+					both closing and opening the case. You will
+					notice that, while the case is closed, keyboard
+					and pointer events have no effect. This is to
+					simulate the fact that normally you can't get to the
+					keyboard or screen under these conditions.
+
+				16) Enhanced MARM switch on on pen down to take
+					account of the Hal variable PointerSwitchesOn.
+
+				17) Solved Low battery bugs (HA-357, HA-362)
+
+2) Ann
+		1) Test code changes:
+
+		i) Additional tests added to t_math tests for Pow10().  These show
+		that in all but one case inexact string to real conversion is due
+		to inexact calculation by Math::Pow10(). All tests in t_math check
+		for as much accuracy as possible.
+
+		ii) t_float tests are now consistent between WINS and ARM.
+
+		iii) Whetstone benchmark tests added
+
+		iv) t_r96 casting tests now include identity tests (which check
+		consistency with MSDEV in WINS).  Casting to TInt tests changed
+		in line with changes to source code (ii below).
+
+		2) Source code changes:
+
+		i) TReal96::MultEq() altered to do one shift rather than preparing
+		and then shifting to left.  This avoids losing bits which may be
+		shifted off the end by preparation, but for which there is space in
+		the final postition.
+
+		ii) TReal96::operator TInt() changed to round towards zero to
+		comply with IEEE standard and Java requirements (also MSDEV).
+
+		iii) TReal96::Prepare() altered to check for zero sign or zero
+		mantissa.  If so, preparation is not done.  Im the latter case,
+		the mantissa is meaningless and in the second preparation would
+		result in an infinite loop which does nothing.
+
+3) Morgan
+		1) Implemented Kernel Faulting.
+		2) Reorganised low memory to include the Registry just before the
+				   Ram Drive.  This means that the Ram Drive is shoved up and down
+				   in memory as the Registry changes size.
+		   Added class TLowMemory to manage the Ram Drive and Registry
+		   memory allocation and to provide information to F32 about the
+		   drive's changing position.
+		3) The Ram Drive now survives Warm Resets and Kernel Faults
+		   Implemented CPersistantRegistry to do the same for the Registry.
+		   T_RESET tests all this jiggery pokery on MARM.
+		4) Added integer divide by zero exception to MARM
+		5) Implemented a user side mini-loader for loading Dlls from ROM
+		   when an explicit ROM path is provided.
+				   eg. lib.Load(_L("MONKEY.DLL"), _L("Z:\\Animals\\Primates\\Hairy"));
+		   This eliminates most of the time taken to load these Dlls.
+
+4) Jane
+
+		1) Fixed MMU bug which showed up in fairly obscure kernel growth/shrinkage
+		   situations.
+
+		2) Optimised page allocator for faster kernel growth.
+
+		3) Added a routine to compact kernel pages when the machine is reset. This function
+		   is not called yet, except in test code.
+
+		4) Made a TFindChunk::Open() actually add the chunk to the process address space (unless
+		   it is a kernel chunk) so that the chunk can be read/written from another process.
+
+5) Matthew
+		1) Fixed HA-355: added %*a and %*b to TTime::Format() which give
+		   am/pm without a space.
+
+		2) Fixed HA-367: descriptor formatting now accepts things like
+		   %-10f (default fill character space) and % 5F (no "+").
+
+		3) Internal changes to sound driver to reduce the amount of clicking.
+		   Also fiddled with the volumes of DTMF dialling, so it should work now.
+
+
+Version 0.01.086
+================
+(Made by Matthew, 22nd January 1997)
+
+This release is binary compatible with 085
+
+1) Graham
+				1) Renamed T_PARSE to T_TPARSE to eliminate the
+				   conflict with the F32 test program of the same
+				   name.
+				2) Updated the TREALTIM test programs and fixed some
+				   super thread bugs.
+				3) Temporarily reintroduced page-based ROM mapping so
+				   that debugging can be tested again.
+				4) Fixed a bug in the user side event code which
+				   prevented position information being extracted
+				   from the new EPointerSwitchOn events.
+				5) Fixed bugs in the ARM implementation of
+				   TInt64A::MulTop() and changed it to return a TInt.
+
+2) Ann Windsor
+		1) Removed KTReal96MaxExponent and KTReal96MinExponent from
+		 e32math.h
+
+		2) Fixed bug HA-345: constants now correct to full precision.
+
+		3) In t_math test code, all approximate tests now use the
+		function testApprox().  This tests that the relative error
+		is within a specified tolerance.
+
+		4) Removed all approximate tests from t_r96 and t_r64.
+
+		5) In Pow10(), limits for second underflow check changed so
+		1.0E-308 underflows as expected.
+
+		6) TInt64A::Multop() fixed to carry from insignificant parts
+		and now returns a TInt to indicate whether the insignificant
+		64 bits are zero or non-zero.  TInt64::MulTop() changed
+		accordingly.
+
+		7) TReal96::DivEq() fixed to force rounding up where
+		appropriate.  This results in division being up to
+		5E-6 secs slower in the worst case.
+
+		8) SReal64 and SReal32 struct definitions added to um_std.h
+		 and removed from other umath *.cpp files
+
+		9) TReal96::MultEq() fixed to force rounding up where appropriate.
+
+3) Alastair
+		1) Fixed bugs in release versions of T_SEC.
+
+4) Simon
+		1) Protected EventQ from access from WINS Window and Timer threads.
+		   Fixes a few WINS Bugs related to AddEvent causing an Access
+		   Violation.
+
+		2) Added some new shutdown code to allow System threads to continue
+		   execution when the machine is off. This fixes bugs like "Program
+		   does not exit when minimized" and other miscallaneous hangings
+		   after a PowerDown.
+
+		3) Change to E32Initialize to allow WINC apps to call it more than
+		   once.
+
+5) Matthew
+		1) Stopped WINS from adding 1 hour for summer time when it's winter.
+
+		2) Fixed bug in CRegistry::SetContents().
+
+
+Version 0.01.085
+================
+(Made by Jal, 10th January 1997)
+
+1) Morgan
+		1) Fixed OOM alloc heaven in CreateSession and RLoader::LoadLibrary
+		2) Renamed kernel.exe to ekern.exe in the X86 obey file so device
+		   drivers can link to it.
+		3) Added iLanguage bitfield and iHardware members to TRomHeader.
+		   Updated BOOTROM.BIN to match.
+
+2) Jane
+		1) E32 Proposals
+			a) Made CObjectCon::ValidateName -> User::ValidateName (static)
+			b) Removed copy constructors for TPoint, TSize, TRect
+			c) Made TLocale constructor exported, removed setting to 0 from TChar
+			   constructor.
+			d) Removed CDeltaTimerAlloc
+			e) Americanised Capitalise.
+			f) Make TDesC8::Length and TDesC16::Length inline
+			g) Implemented Rog's amendment of David's User::Notify proposal: an RNotifier
+			   class with the following member functions-
+					TInt Connect();
+					void Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2,TInt& aButtonVal,TRequestStatus& aStatus);
+					TInt InfoPrint(const TDesC& aDes);
+
+		2) Bug fixes
+			a) Removed unused User time/date functions
+			b) Kept a list of thread relative threads within the thread so that they
+			   can be closed properly when the thread dies.
+			c) Alloced a bit in the DThread iFlags for whether the thread is the main one, this
+			   fixed the bug with APPRUNs not dying.
+			d) The priority of the NULL thread was incorrect in WINS - spotted by
+			   David Batchelor, thanks.
+			f) Added CServer::Restart() and fixed CServer::RunL()
+			g) Fixed HA-55 kernel alloc heaven causes kernel re-entrancy
+
+3) SteveG
+		1) Fixed bug in the battery recharger hanging when free'd. Added
+		   iChargeTick.Cancel() into the device driver destructor.
+
+4) Geert
+		1) Inlined various TDateTime, TTimeIntervalXxx and TTime members.
+
+		2) Integrated Bruce's TTime::Parse() service. (See the proposal and
+		   spec in E32 Proposals for details.)
+
+		3) Removed all Time member functions duplicating services in TTime.
+
+		4) Removed initialisation code from TTimeIntervalXxx's and TTime's
+		   default ctors. Default constructed instances of these classes now
+		   have undefined, arbitrary values.
+
+5) Graham
+				1) Added functionality to the text window server to allow raw
+				   event information to be passed through to a client. The
+				   primary user of this is the final test program which
+				   needs some way of testing each raw keyboard element.
+
+				2) Updated the double multitasking kernel functions to give
+				   handles wrt the kernel server rather than the device
+				   driver client. Updated the real time test program and
+				   device driver accordingly.
+
+				3) Made relocatable static data changes appropriate for
+				   our real-time needs.
+
+				4) Fixed a further digitiser problem. There should
+				   now be no machines which experience complete
+				   digitiser failure apart from those with hardware
+				   faults in this area.
+
+6) Alastair
+				1) Added overloaded NewL function for Security class which
+				   takes a piece of security data as a parameter so that a
+				   CSecurityBase object can be constructed using security
+				   data stored in a file for decryption purposes.
+
+				2) Removed ConstructL, EncryptL, DecryptL and
+				   IsValid functions from CSecurityBase API.
+
+				3) Added NewEncryptL and NewDecryptL functions to
+				   CSecurityBase API so that objects for handling encryption
+				   sessions and objects for handling decryption sessions can
+				   be created.  The APIs for these object classes -
+				   CSecurityEncryptBase and CSecurityDecryptBase - have been
+				   added to E32BASE.H.
+				   NewEncryptL and NewDecryptL take an initialisation
+				   vector as a parameter to allow for pluggability with
+				   more sophisticated encryption methods.
+
+				4) Written a new UB_SEC.CPP to cater for the above
+				   changes.  The current encryption scheme produces
+				   encrypted data in multiples of 32 bytes.
+
+				5) Rewritten T_SEC.CPP to test security changes.
+
+7) Matthew
+		1) Changed set and free tls functions from exec to sv calls.
+
+		2) Fixed alloc heaven in change notifier, and changed notifier so that
+		   you can only logon once to each notifier, so that the kernel's notify
+		   function can be called from exec functions. This has meant API changes,
+		   and the RUndertaker API has also been changed - the parameter has been
+		   removed from LogonCancel - so the two are more similar.
+
+		3) Added iMaxVolume capability to sound driver, now the volume-by-value
+		   takes a value from 0 to iMaxVolume, instead of 0 to 100.
+
+		4) Removed Time::IsValidDate().
+
+8) Pete
+		1) Added custom and variant DLL for rack D h/w.
+
+		2) Moved sections of code relating to the Pc Card Controller h/w out of
+		   the Kernel DLL and down into the Variant DLL.
+
+		3) Added the function UserHal::DriveInfo() which
+		   returns a TInfoName for each local drive and Pc Card socket as well
+		   as the total number of valid drives and socketss on a given variant.
+
+		4) Various changes to the member functions of UserPcCardCntrl
+		   class.
+
+9) Ann Windsor - CHANGES TO MATHS SOURCE CODE
+
+I e32\inc\e32math.h
+-------------------
+1. Constants KTReal32MinExponent and KTReal32MinExponent, KTReal96MaxExponent,
+KTReal96MinExponent, KTReal96ExponentBigBad and KTReal96ExponentSmallBad added.
+
+2. Functions added to UM_R96.CPP added to TReal96 class
+
+II e32\inc\e32std.h
+-------------------
+1. Constant KErrDivideByZero added.
+
+2. New constants defined for flags in TRealFormat type:
+	KExtraSpaceForSign=0x40000000
+	KAllow ThreeDigitExp=0x20000000
+	KUseSigFigs=0x10000000
+	KDoNotUseTriads=0x08000000
+	KGeneralLimit=0x04000000
+	KRealFormatTypeFlagsMask=0x7c000000
+	KRealFormatTypesMask=0x0000007
+
+3. RealFormatType no longer enum; changed to constant TInts
+	KRealFormatFixed=1
+	KRealFormatExponent=2
+	KRealFormatGeneral=3
+and two new types added:
+	KRealFormatNoExponent=4
+	KRealFormatCalculator=5
+
+4. iDecimalPlaces member of TRealFormat name changed to iPlaces because used
+for decimal places or significant figures as appropriate.
+
+5. TLex8 member function ScndigAfterPoint() added.
+
+
+III e32\ucdt\uc_des.cpp
+----------------------
+1. Changed in line with changes to e32std.h above.
+
+2. AppendFormatList() altered to allow three-digit exponents in E,e (exponent)
+and G,g, so Printf %E,e,G and g all display numbers to the maximum range.
+
+
+IV e32\umath\um_dtor.cpp
+------------------------
+1. Changed TLex8::Val() appropriately to deal with the full range of values.  This
+includes doing multiplications in TReal96's so that errors can be detected.
+
+2. TLex8::ScndigAfterPoint() added to do conversion from decimal after point, so that
+trailing zeros are not included.  This ensures that e.g. 0.2900 and 0.29 have the same
+binary representation.
+
+
+V e32\umath\um_pow.cpp
+-----------------------
+1. Changed to check for aSrc being ±1.  If so, sets result appropriately to ensure exact
+and to save running algorithm.
+
+2. Bug found and fixed: Int() being used for a number potentially larger than 32767.
+Altered to return an error if Int() reports an error, i.e. if the input has an absolute
+value larger than 32767 (a return value larger than 32767 would lead to an error later in
+the function anyway).  This ensures that results over and underflow as expected.
+
+3. Bug found and fixed: reduce() set high part of f to 0 rather than leaving it unchanged.
+This fixes the bug reported in B4 problem report no HA-207: overflows are now reported as
+expected.
+
+
+VI e32\umath\um_pow10.cpp
+-------------------------
+1. Changed to handle the full range of TReals rather than up to 1e±100.
+
+
+VII e32\umath\um_r96.cpp
+------------------------
+1. Set() checks that exponent does not exceed maximum (KTReal64ExponentBigBad/
+KTReal64ExponentBigBad) and is not less than minimum (KTReal32ExponentSmallBad/
+KTReal64ExponentSmallBad). If so, KErrArgument is returned.
+
+2. GetTReal()
+i) In checking for underflow, value against which check is made changed from
+-KTReal32MaxExponent/-KTReal64MaxExponent to KTReal32MinExponent/KTReal64MinExponent.
+ii) Rounding has been implemented for TReal32s so that when a TReal96 mantissa is
+converted to a TReal32 it is rounded to the nearest value using all bits available,
+rather than just being truncated.
+
+3. Casting to a TInt from a TReal96 changed to check for zero by using sign and also to
+round to nearest, rather than always rounding down.
+
+4. Arithmetic
+i) Added functions AddEq(), SubEq(), MultEq() and DivEq() which perform the operations
++=(), -=(), *=() and /=() respectively, as these operator functions did previously, but
+reporting an error constant, rather than panicking.
+ii) Similarly to i), functions Add(), Sub(), Mult() and Div() have been added as the
+non-panicking variants of operator +(), -(), *() and /().  The latter functions panic on
+an error as described in ii).  The result is written to an input target variable.
+iii) operator +=(), -=(), *=() and /=() perform arithmetic operations (using AddEq(),
+SubEq(), MultEq() and DivEq() respectively) and either panic (when unsuccessful), leaving
+the initial arguments unchanged, or otherwise return the result in *this.
+iv) Added function CheckOverUnderflow(), to be used in AddEq(), SubEq(), MultEq() and
+DivEq(), to check for overflow or underflow in cases where it may occur by normalising
+the result and checking the exponent.
+v) Added function PanicOverUnderflowDividebyZero() which is used in operator +=(), -=(),
+*=() and /=() to panic if an error is returned by AddEq(), SubEq(), MultEq() or DivEq()
+respectively.
+vi) Addition operations (in AddEq()) improved to eliminate loops which change exponent by
+1 and shift the mantissa by 1 place on each loop to make the exponents equal before
+addition takes place, instead altering the exponent and shifting as appropriate in one
+step.
+vii) Fixed bug in AddEq() so that it shifts the mantissa of the bigger number right by
+one.  This prevents failure when subtracting numbers of the same sign (or adding numbers
+of the opposite sign) when the ms bit needs to be carried down (and hence only two bits
+are shifted down into the extended part when preparing the result) and the last hex digit
+of the result is 4 when prepared.
+viii) In DivEq(), a new error KErrDivideByZero has been introduced. Also reports
+KErrArgument if 0/0 (invalid operation).
+
+5. Changed Normalise() to round on last three bits to nearest value, rounding to value
+with l.s. bit zero (even) if two values are equally near to be consistent with MSDev and
+to minimise propagation of rounding errors in general.
+
+6. To be consistent with MSDev, increment and decrement operators should normalise after
+each operation.  However, this doubles the time and ultimately decreases accuracy, so
+has not been adopted.
+
+
+VIII e32\umath\um_rtod.cpp
+--------------------------
+1. fDigLim() changed to handle all exponents between -1022 and 1025, i.e. all TReal64s.
+
+2. All do...() functions now take TInt flags as one of their parameters to enable (or
+disable) extra space for sign, three-digit exponents, significant figures rather than
+decimal places, triads and linited accuracy of digbuf.
+
+3. In addtition to the flags above, an internal flag determining whether the digbuf needs
+rounding has been added.
+
+4. doExponent() altered so it can be used both directly and by doGeneral() and
+doCalculator().  In calculator mode, trailing zeros are eliminated.  Also uses three-
+digit exponents if allowed by flag if necesary.
+
+5. doFixed() altered so that a space is left for a potential sign if a flag is set.  This
+allows positive and negative numbers of the same exponent to be of the same accuracy.
+
+6. doGeneral() altered in line with alterations to doFixed() and doExponent().
+
+7. doNoExponent() new function added to deal with calculator representation which does
+not use exponents, i.e. numbers to a maximum number of significant figures.  This
+function is similar to doFixed(), other than it does not pad with zeros and hence does
+not necessarily have a decimal point or deciaml places.  If the triad length is non-zero
+then triads are allowed by default (but can of course be disabled by a flag).  An
+overflow error is reported if the number is too big to fit in the maximum significant
+figures and an underflow if it is too small for any significant digits to appear i.e.
+apparently 0.  If the number does not fit, i.e. not enough space for sign, point or triad
+separators, then a general error is reported.
+
+8. doCalculator() new function added which operates as a conventional calculator would,
+i.e. using non-exponential representation as far as possible and otherwise exponential
+representation.  The number of figures in the display is limited by the maximum
+significant figures.  This function will report a general error if there is insufficient
+space availble to include a sign, decimal point and exponent, as well as the figures,
+EVEN IF THEY ARE NOT REQUIRED.  In this way it operates as a conventional calculator.
+doCalculator() uses either doNoExponent() or doExponent() (in calculator mode, see 4.)
+as necessary.
+
+9. rtob() has been altered in line with the above changes.
+Also it now checks that the numspace is >0, otherwise reporting a general error. iType is
+now used to take both the user-specified flags and type.  If no type or flags are
+specified then it leaves.  Flags are also set as necessary for the various modes (in all
+modes, rounding is needed):
+	fixed - does not use significant figures
+	exponent - does not use significant figures (when accessed directly rather than
+	through calculator)
+	general - does not use significant figures or triads
+	no exponent - uses significant figures
+	calculator - uses significant figures and no triads.
+
+
+IX e32\umath\um_sin.cpp
+-----------------------
+1. sinx() changed to ensure than sin of a multiple of pi and cos of an odd multiple of pi/2
+give exactly zero.
+
+
+X e32\umath\um_std.h
+---------------------
+1. EMathUnknownPanic added to TMathPanic to deal with unknown errors.
+
+
+XI e32\umath\um_tan.cpp
+-----------------------
+1. Tan() changed to ensure that tan of a multiple of pi gives exactly zero and tan of an
+odd multiple of pi/2 reports an overflow error.
+
+
+XII e32\umath\um_utl.cpp
+------------------------
+1. Poly() changed to use TReal96s.
+
+
+XIII e32\upmarm\up_gcc.cpp
+--------------------------
+1. Arithmetic now raises an exception if an error is returned by the TReal96 non-
+panicking arithmetic variants.
+
+
+XIV e32\upwins\up_i64.cpp
+-------------------------
+1. Bug found in MulTop() - the two least significant words are never multiplied together
+and hence the possible carry from this part into the ls word of the result is ignored.
+This part may also need to be used for rounding purposes.
+
+
+CHANGES TO MATHS TEST CODE
+--------------------------
+I T_FLOAT
+---------
+1. Altered and increased appropriately to test altered and new cases due to changes
+in the above.  Also divided into two modules containing data only (FLTDATA1.CPP and
+FLTDATA2.CPP) and a header file containing class definitions because the amount
+of initialised data was too large for the GCC compiler.
+
+2. Altered and increased appropriately to test fully string to real conversion to
+full range. N.B. THESE TESTS ARE CURRENTLY APPROXIMATE DUE TO AN UNRESOLVED BUG.
+
+
+II T_GEN and T_GEN32
+--------------------
+1. Added to generate files for use by T_R64 and T_R32. These are for testing in
+ARM, to see that the GCC and MSDEV compiler give the same results.
+T_GEN also generates special values needed for the generation of these files and
+for T_R32 and T_R64 test code.
+
+
+III T_MATH
+----------
+1. In the light of changes made to sin, cos, tan and power functions various tests have
+been added or updated:
+i) tests exact results are given for: zero to a power, any number to power zero, ±1 to
+any power, sin(n*pi), cos((2n+1)*pi/2) and tan(n*pi) (where n is an integer).
+ii) tests overflows occur as expected for Math::Pow()
+iii) tests tan((2n+1)*pi/2) overflows.
+
+2. More comprehensive tests of trig functions have been included to test multiples of
+"common" values: pi/6, pi/4, pi/3, pi/2 and pi (in addition to test for exact values
+above).
+
+3. Comprehensive testing of Math::Cos() (not just Sin() ) have been added.
+
+4. Added test to check reduce() is working correctly.
+
+
+IV T_R64 and T_R32
+-------------------
+1. Special values generated by T_GEN and T_GEN32 used in all tests.
+
+2. Casting tests for TReal32s now use TReal96s. (A special test following this shows the
+occurrence of an (as yet unresolved) bug.)  Tests have also been added to be used when
+exception handling is fully implemented.
+
+3. All tests improved and made comprehensive.
+
+4. Further tests added using the files generated as described in II.
+
+5. T_R64.CPP and T_R32.CPP have also been split so their data is in a separate file
+to avoid duplication of code in T_GEN and T_GEN32.
+
+6. Arithmetic tests all test for equality rather than using BitApprox, with cases
+which fail being removed until bugs are fixed so exact results are obtained in all cases.
+With changes to um_r96.cpp explained in VII 2. and 4. above, T_R32 tests are now all
+exact.
+
+7. Test code has been included (for use in debug mode only) to test that exceptions
+are raised correctly by the up_gcc.cpp code (which has been copied into separate files -
+emgcc32.cpp and emgcc64.cpp - which may be called by these tests).
+
+
+V T_R96
+--------
+1. Special values for use in the test code have been initialised and used in the tests
+where appropriate.
+
+2. Constructors of TReal96s from TInts, TReal32s and TReal64s tested fully, including
+tests that attempting to construct from values with "bad" exponents (i.e. exponents too
+big or too small) results in a return of KErrArgument.
+
+3. Test of preparing a denormal checks that the value is not already prepared. Also added
+test of preparing of an unprepared value.
+
+4. Arithmetic tests
+i) Arithmetic tests all test for equality rather than using BitApprox, with cases
+which fail being removed until bugs are fixed so exact results are obtained in all cases.
+ii) As a result of the bug fixed in operator/=() by Jal a test of division of denormals
+has been added.
+iii) Extra tests have been added to test the new member functions AddEq(), SubEq(),
+MultEq() and DivEq() which perform arithmetic operations and report an error rather than
+panicking if overflow, underflow or division by zero errors occur. The panicking-variants
+are also tested to be sure panics occur as expected (to be run in debug only).
+
+5. Tests of GetTReal(), casting functions unary operators, increment and decrement
+operators and equalities and inequalities have been made more comprehensive and include
+tests for overflow, underflow and total loss of precision errors where appropriate.
+
+6. Tests for SetExp() and SetSign() and also for assignment operators added.
+
+7. Increment/decrement tests now include normalising to get results consistent with
+Microsoft.
+
+Version 0.01.082
+================
+(Made by Morgan, 20th December 1996)
+
+This release is binary compatible with 081
+
+1) Morgan
+		1) Fixed a bug in the SWI vector code on the ARM that was calling
+		   dispatchDfcAndReschedule incorrectly.
+
+2) Jane
+		1) Changed the base addresses of WINS dlls as suggested by Martin Budden.
+
+		2) Fixed bug in CObjectIx where creating many objects could return a null handle.
+
+		3) Fixed Daylight saving bug in WINS
+
+3) Graham
+				1) Modified bootup code so that it reads the keyboard to
+				   set up ROM memory configuration. This will be used with
+				   the masked ROM to check paged mode rom access
+
+
+Version 0.01.081
+================
+(Made by Matthew, 17th December 1996)
+
+This release is binary compatible with 080
+
+1) Matthew
+		1) Fixed dereferencing-zero bug in CObjectCon and CObjectConIx destructors.
+
+		2) Changed EDLL WINS debug info to C7 format.
+
+
+Version 0.01.080
+================
+(Made by Jane, 16th December 1996)
+
+This release is binary compatible with 079
+
+1) Morgan
+		1) Timers abort on power up and locale changes to universal
+		   time, and daylight saving.
+		2) Fixed HA-307
+
+2) Matthew
+		1) Speeded up several CObjectIx, CObjectCon and CObjectConIx
+		   functions by using pointers into arrays instead of operator[].
+
+3) Jane
+		1) Added support for real time threads. These are supervisor mode threads
+		   whose real time response is greatly improved over ordinary user threads,
+		   as it is possible for them to interrupt the supervisor server and
+		   non-blocked slow exec calls.
+		   Wrote the WINS and X86 implementations of the above, and a test driver
+		   and test program. (D_RTIM and T_RTIM).
+
+4) Graham
+		1) Added ARM implementation of real time threads.
+
+Version 0.01.079
+================
+(Made by Graham, 10th December 1996)
+
+This release is binary compatible with 078
+
+1) Graham
+		1) Changed the bootstrap to map the ROM using ARM MMU 1Mb
+		   sections. This reduces the number of TLB entries used
+		   by the ROM and yields a 4% speed increase on our inter-
+		   process message passing test (T_PROC1).
+
+		2) Fixed MachineInfo problems on WINS (HA-220, HA-303).
+
+		3) Patched up some Hal information services.
+
+		4) Experimentally added clicks when the digitiser is touched.
+
+2) Matthew
+		1) Checked all PP::, KK::, Plat:: Panics and Faults. Some
+		have been changed to panic the calling thread, instead of
+		the kernel. This fixes bugs like HA-276 (Leave without TRAP).
+
+
+Version 0.01.078
+================
+(Made by Graham, 7th December 1996)
+
+This release is binary compatible with 077
+
+1) Simon
+		1) Changed WINC over to use some WINS components, allowing
+		   Store and other components to use WINS librraies for WINC
+		   development.
+
+		   WINC now conists of a EKERN ECONS and EEXE but all other
+		   components are taken from the WINS build. The BLD.CMD has
+		   been changed to reflect this new building model.
+
+		2) WINS EUSER added WINC initialisation functions.
+
+		3) Removed unecessary files from UPWINC
+
+2) Graham
+		1) Implemented User::MachineConfiguration() and
+		   User::SetMachineConfiguration(). These may be used to
+		   save and restore the registry and O/S information such as
+		   whether key clicks are enabled or sound volume is loud etc.
+		   It is hoped that this information will now be standardised
+		   in such a way that anyone moving from one EPOC/32 machine
+		   to another will be able to transfer their machine's
+		   'personality' in one go.
+
+		2) Moved P::DebugMask() to Plat::DebugMask() as it was being
+		   exported.
+
+3) Pete
+	1) PC Cards are now powered down automatically after 5
+	   seconds if the card is left both un-configured and with no memory
+	   allocated.
+	2) Fixed a problem were a CF Card was incorrectly returning
+	   'Not supported'  on each subsequent access following the
+	   situation were a read from the card was interrupted with a media
+	   change. (Unfortunatley interrupted writes still cause the file server
+	   to panic).
+	3) Full 16bit access of CF cards (and therefore support of Hitachi
+	   cards) now takes place when a Rev2 Etna is detected.
+	4) General PC Card related class renameing. Also, PC Card
+	   configuration info. has now been moved from the EKERN into the
+	   appropriate custom DLL for ARM builds.
+
+
+Version 0.01.077
+================
+(Made by Graham, 6th December 1996)
+
+1) SteveG
+	1) Fixed bug in battery charging LDD which hung when free'ing the
+	   device driver. Removed debug information which was being
+	   output to the comms port while charging was in progress
+
+2) Morgan
+		1) Altered the MARM MMU PTE permissions lookup table to enable
+		   write buffers for user data.  Fixes HA-300 (Speed).
+		2) User::Abort now raises EExcKill exception.
+
+3) Jane
+		1) Fixed Lane's shared chunk growing problem
+
+4) Graham
+		1) Fixed a versioning problem with the text window notifier
+		   server.
+
+Version 0.01.076
+================
+(Made by Graham, December 3rd 1996)
+
+This release is binary compatible with 075
+
+1) Graham
+		1) Added Eiger port control code which avoids output bits
+		   reading erroneously when they are connected to circuits
+		   with large rise or decay times.
+
+		2) Added Minor Version 4 to the E32 version number to reflect
+		   the fact that this is a B4 release.
+
+		3) Fixed a problem in the media driver version numbering.
+
+2) SteveG
+		1) Preliminary release of the battery recharging LDD, DARCP1.LDD,
+		   for tests by the hardware dept. This is only for the real
+		   Proteas.
+
+	   The LDD offers the following functions:
+
+	   RDevNicads::Open() to open a channel
+
+	   RDevNicads::Type(TInt& type) to get the charge type in progress
+	   This will be EChargeNone, EChargeFast or EChargeTrickle
+
+	   RDevNicads::SetChargeType(TInt aType) to set the type
+	   The type should be EChargeNone, EChargeFast or EChargeTrickle.
+	   Returns an error if it is not possible to start the requested
+	   charging method.
+
+	   RDevNicads::Close()
+
+	   The functions are defined in D32RCHG.H and D32RCHG.INL
+
+	   Loading the device driver using LoadLogicalDevice will start
+	   the charging if a rechargeable battery pack is fitted. The mains
+	   LED will flash while fast charging is in process. Once fully charged,
+	   the battery pack is trickle charged while mains power is applied.
+	   This can be overridden using the above functions.
+
+3) Morgan
+		1) Fixed WINS so that it reports the same physical screen
+		   size as it did before .INI-file-controlled fascia bitmaps
+		   were introduced.
+
+Version 0.01.075
+================
+(Made by Graham, November 28th 1996)
+
+This release is not binary compatible with any previous version.
+
+1) SteveG
+		a) Wrote the device driver for the serial E2PROM. This is currently
+		   only for P1 Proteas, as the racks do not have the device fitted
+
+		   The device driver is DAE2P1.LDD and provides all the commands
+		   necessary for writing, reading, protecting and locking the
+		   sixteen 16-bit registers in the E2PROM chip
+
+		b) Fixed bug in ARM Mem::Compare with non word aligned buffers >=16
+
+		c) Implemented keyboard repeats in the E32 text WServ
+
+		d) Added an EActive event, which is sent in WINS when the focus
+		   is returned to the WINS window. The EInactive event is still
+		   sent when the WINS window loses focus
+
+		e) Added an EUpdateModifers event, which is sent whenever the
+		   WINS window gains focus. This event includes the current
+		   state of the toggling modifier keys, and should be passed
+		   on to the keyboard translator to update its modifier states
+		   using KeyTranslator->UpdateModifiers(TInt). The modifiers
+		   are extracted from the event using TInt TRawEvent::Modifiers();
+		   E32 text WServ modified accordingly. This event is sent before
+	   the EActive event. This event will also be sent when booting
+	   up WINS, so the caps/num lock states will be correct at bootup.
+	   KeyTranslator->UpdateModifiers() also resets the state of the
+	   key translator to normal
+
+		f) Implemented keyboard clicks, the following UserHal functions
+		   can be used to set the clicks:
+
+		   to set/read the volume:
+				   UserHal::SetKeyClickLoud(TBool)
+				   UserHal::KeyClickLoud(TBool&)
+
+		   to set/read if clicks are enabled:
+				   UserHal::SetKeyClickEnabled(TBool);
+				   UserHal::KeyClickEnabled(TBool&);
+
+		   to override the system on/off setting, forcing clicks off
+		   (will be used by WServ to turn off clicks when an application
+		   requests to disable clicks while in foreground):
+				   UserHal::SetKeyClickOverriden(TBool)
+				   UserHal::KeyClickOverriden(TBool&)
+		   (This function could do with a better name...:-)
+
+	   Using SetKeyClickOverriden(ETrue) will disable key clicks
+	   regardless of the system setting. The system setting can
+	   still be changed while overriden.
+
+		   Note that key clicks will not work in WINS as they produced
+		   more of a key fart than a click. The functionality is there,
+		   and if a way of producing a suitable click is found, will be
+		   added in a later release (function P::KeyClick() in KP_UTL.CPP)
+
+		g) Fixed problem with CTimers going off 1 second early - this
+		   solves the problem of alarms going off a second or so early
+		   in TimeW app on MARM. There still appear to be problems
+		   in WINS, which may lie elsewhere...
+
+		   TSecondLink::At() now converts the absolute time you specify
+		   to seconds since year2000, and uses this to work out the
+		   delta value to put into the queue. This is more accurate
+		   since the time that the queue was last ticked over is also
+		   stored in seconds since year2000. Previously the value added
+		   to the delta queue was the difference between the system time
+		   and the time you supplied, which could be upto a second out
+		   if the microseconds part of the system time was non-zero
+		   which would be 99.9999% of the time
+
+2) Morgan,
+	a) Added support for a WINS system ini file allowing some system defaults
+		   to be setup.  The .INI file lives at \EPOC32\DATA\SYSTEM.INI
+	   and allows you to change the screen dimentions, fascia and the
+		   LED arrangement.
+		   The defaults are
+		ScreenWidth 640
+		ScreenHeight 240
+		ScreenOffsetX 123
+		ScreenOffsetY 53
+		FasciaBitmap \epoc32\data\Fascia.bmp
+		LedOffsetX 30
+		LedOffsetY 26
+		LedSize 14
+		LedGap 5
+		LedArrangeHorizontally
+		#LedArrangeVertically
+
+	b) Added exception support for MX86, MARM, and WINS:
+
+		   TExceptionHandler* RThread::ExceptionHandler() const;
+	   TInt RThread::SetExceptionHandler(TExceptionHandler* aHandler,TUint32 aMask);
+	   void RThread::ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask);
+	   TInt RThread::RaiseException(TExcType aType);
+	   TBool RThread::IsExceptionHandled(TExcType aType);
+
+		   If a thread has no handler for an exception it is passed onto the
+		   kernel for handling.  The default action is to panic the offending
+		   thread.  Unhandled exceptions caused by RThread::RaiseException()
+		   force the thread to exit via User::Exit().
+		   Otherwise handlers are executed in the context of the thread on
+		   which the exception is raised and control returned to the
+		   point of the exception.
+
+		   When debugging under WINS, MSDEV will intercept the exception before
+		   the handler has a chance to execute.
+
+	c) Fixed HA-258
+
+	d) Added Uids (and -type-safe-link for ROMBUILD) to the Base components under ARM.
+	   The Uids are #defined in \Epoc32\include\E32UID.H and \e32\kbarm\E32UID.IBY.
+
+	e) Added an iTextSize to TLoaderInfo and TRomImageHeader for GDB
+
+	f) Implemented Dll::GlobalAlloc, Dll::GlobalAllocated, Dll::GlobalRead, and
+	   Dll::GlobalWrite.
+
+3) Matthew
+	a) Fixed HA-208 (IsPresent and IsValid in TUidType should return TBool).
+	   Also changed loads of other Is*() functions to return a TBool instead
+	   of a TInt. A few Is*() functions which returned KErr values have been
+	   renamed:
+
+			CObjectCon::IsValidName -> ValidateName
+			CObjectCon::IsUniqueFullName -> CheckUniqueName
+			DComm::IsValid -> Validate
+
+	b) Fixed HA-196 (inline TLocale functions not expanded in release builds).
+
+	c) Fixed HA-238 (Shortcomings of KNullUid definition): removed TUidC class
+	   and added static functions TUid::Uid(TInt) and TUid::Null() to get round
+	   GCC bug. #defined KNullUid as TUid::Null().
+
+	d) Changed WINS Uid scheme so that the UId is stored in a segment of its own
+	   called ".E32_UID", to add a UID to a windows file include the code
+
+			#pragma data_seg(".E32_UID")
+			__WINS_UID(Uid1,Uid2,Uid3)
+			#pragma data_seg()
+
+	   in your source.
+
+	e) Added the capability to detect thread death to the RChangeNotifier
+	   (completes with the EChangesThreadDeath bit set).
+
+	f) Implemented User::InfoPrint() function. Also added a very simple notifier
+	   server to the text window server so that little windows appear when
+	   anyone calls User::Notify or InfoPrint.
+
+	g) Improved the Tls scheme so that it uses a CArrayFixFlat. According to my
+	   benchmarking this should speed up Dll::Tls(), though it remains to be
+	   seen what happens in the real world.
+
+	   Note that there is now a Dll::FreeTls() function, and that Dll::SetTls
+	   can now return KErrNoMemory.
+
+	h) Changed midnight crossover code, to avoid costly divisions.
+
+	i) Changes to sound driver: Fixed several bugs to do with having two LDDs
+	   going at once. This has caused the driver to become more sensitive to
+	   playing and recording at once, and may mean that code that previously
+	   worked fine now returns KErrInUse. Remember that the driver keeps
+	   playing aLaw even after the last play request has been completed, and
+	   keeps recording until the buffer is full. If you find problems, check
+	   that you flush the record buffer when you have stopped recording, and if
+	   you try to record and get KErrInUse, you may want to wait until the play
+	   buffer has had time to drain and try again before reporting an error.
+
+	   Added some preliminary power handling code. Playing will stop on
+	   switch-off and the restart from where it left off; recording will
+	   terminate with KErrGeneral (this seemed the only appropriate value)
+	   when you switch back on.
+
+	   The PDDs now support EVolumeByValue. The values are as follows:
+
+				0-20  = EVolumeNone
+			21-40 = EVolumeSoft
+			41-60 = EVolumeMedium
+			61-80 = between EVolumeMedium and EVolumeLoud
+			81-100 = EVolumeLoud
+
+4) Jane
+		a) Changed MMU from a scheme of passing 3 parameters denoting the chunk's
+		owner, its type (code, data etc.) and whether it was locked in physical or
+		linear memory, to a simpler scheme where the chunk's owner is passed throughout the MMU
+		system (there being a greatly increased possible number of chunk owners). This
+		was to enable the ARM MMU, which is more limited than the X86 one, to cope with
+		shared chunks being read only in one process and writable in another etc.
+
+		b) When creating certain types of chunks, kept a list of allocated pages, so that it
+		is possible to support 3 possible states of permissions. (On the X86 this is achievable
+		by merely changing the top level PDE permissions - this is not so on the ARM). This change
+		allows the ARM MMU to support code chunks which are read/write to start with when the file
+		server reads the code into them from a CF card, but later are both supervisor read/only
+		when in the home section and user read/only when running.
+
+		c) Made a note early on of the file server's process. Changed the ram drive chunk
+		to being two-state chunk, and when the file server runs, change the permissions on the
+		RAM chunk (top level PDEs only) so that the file server has direct access to the
+		RAM drive.
+
+		d) Made the RAM drive supervisor priviledges, so that no-one except the file
+		server (see above) can access it.
+
+		e) Added size reporting functions for spy programs
+			TInt RLibrary::GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize);
+			TInt RThread::GetRamSizes(TInt& aHeapSize, TInt& aStackSize);
+			TInt RProcess::GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize, TInt& anInitialisedDataSize, TInt& anUninitialisedDataSize);
+
+		f) Added Andrew Thoelke's optimisations to various Find and Locate functions - see
+		   Notes for more details.
+
+
+5) Graham
+		1) Added and enhanced Kazuhiro Konishi's unicode/japanese changes
+		   to the text window server.
+
+		2) Added the UID into the sound driver make file and removed
+		   all the link dependancies that the sound PDDs had upon
+		   their LDD.
+
+		3) Fixed the dodgy digitiser (HA-284)
+
+		4) Experimentally increased the digitiser sample rate to
+		   50 samples/s.
+
+		5) Introduced the EPointerSwitchOn event. This event contains
+		   x and y information and is generated when pen down causes
+		   the machine to switch on. No further pen events should be
+		   generated until the pen has subsequently been removed from
+		   the surface of the digitiser. I believe appropriate windows
+		   (i.e. the application bar window) will be able to register
+		   with the window server an interest in these events. So, normal
+		   windows should not be troubled by them. This should solve
+		   problem HA-325.
+
+		6) Removed the text window server's beep when switching on
+		   normally and introduced it when switching on with the
+		   digitiser. (This only occurs on debug builds).
+
+6) Rog	1) Fixed RackC COM::1 bug which was causing input RS-232 lines
+	   to be reported incorrectly.
+7) Pete 1) Reduced the wait states introduced by Etna on CF Card
+	   attribute memory reads. This was interfering with screen
+	   refreshing when 16 shades of grey mode was enabled (HA285).
+	2) CF card support when powering on and off the machine has
+	   now been added. On power off, the card is fully powered down. On power
+	   up, TLocalDrive objects are notified of the power down, forcing them
+	   to re-mount the disk on the next access (HA281).
+	3) Added the functions InCritical() and EndInCritical() to
+	   the PC Card controller. While in-critical, media change power down is
+	   delayed. Writes to the CF Card are now critical. Prior to this, if a
+	   media change occured during a write to the card then this could leave
+	   a sector with an ID error on the card.
+	   However, there is currently a problem such that the File Server
+	   panics if a media change occures during a write to the CF card
+	   so this should be avoided for now.
+	4) PC Card controller now able to access a CIS chain in common
+	   memory as well as attribute memory.
+	5) Removed the function User::PcCardCntrlInterface() and
+	   replaced this with the class UserPcCardCntrl.
+	6) Added the following functions to the above class: MediaStart(),
+	   MediaOpen(),MediaInfo(),MediaRead(),MediaWrite(). These
+	   allow access to a media device (eg CF Card) at a media
+	   level (rather than a partition level as do TLocalDrive.Read() and
+	   Write()). I.E. they allow access to the partition table etc.
+
+
+Version 0.01.074
+================
+(Made by Graham, November 6th 1996)
+
+1) Graham
+		1) Fixed a leak in AddProtected() which caused the O/S to
+		   panic with EBadDfc when stressed.
+
+		2) Added followers into the TEiger class for ports A,B,C,D
+		   and E. Modifying these registers can now be safely
+		   achieved without worrying about those bits which are
+		   programmed to be input bits.
+
+		3) Added interrupt protection into all TEiger modify
+		   functions.
+
+		4) Stopped KE_ALL debug information from coming out in all
+		   circumstances.
+
+2) Morgan
+	1) Moved WINS power off button to F9 (HA-214).
+	2) Fixed HA-255 and added test code.
+	3) Made semaphore and mutex names unique for each process to fix
+		   HA-163. It is now possible to run 2 WINS kernels with the same
+		   process name simultaniously.
+
+Version 0.01.073
+================
+(Made by Graham, November 6th 1996)
+
+1) Graham
+		1) Solved the stack problem which prevented debug information
+		   from being emmitted in MARM debug builds.
+
+		2) Fixed WINS keyboard repeat problem when the WINS window
+		   loses focus.
+
+2) SteveG
+		1) Reduced stack usage of CObject::FullName, which was shoving a
+		   TFullName on the stack for every owner of an object. Now only
+		   one TFullName is put on the stack regardless of the number of
+		   owners. This cures HA-273.
+
+Version 0.01.072
+================
+(Made by Jane, October 25th 1996)
+
+This release is the candidate B3 release. Unless there are any show-stopping
+bugs, our next release will be the first in the chain leading to B4, and
+will not be binary compatible with this one.
+
+NOTE: Once again to speed the passage of this non-binary compatible release
+through the system, I have released with test code failures. However in this
+case I believe them to be test code problems. The following tests are failing
+with kernel alloc heaven - T_CHUNK (chunk testing), T_KHEAP (thread testing)
+and T_THREAD (undertaker testing). These tests fail in ARM debug builds only,
+and pass on X86, which leads me to believe that these are granularity
+issues in the kernel heap on ARM.
+
+1) Jane
+		a) Implemented allocation of sub-page tables for ARM.
+
+		b) Fixed bugs to do with lengths of supplied filenames in
+		   process and library loading. Took the opportunity to rationalise
+		   the loader to do this and reduce stack impact considerably.
+
+		c) Added MMU debug supervisor calls to enable the porting of my
+		   MMU system from its emulated environment, and converted several
+		   tests to the new system.
+
+		d) Tidied up various APIs to their correct places, ready for
+		   unfreeze.
+		   Affected are the new unimplemented exception APIS, and the
+		   RLoader::LoadLibrary
+
+		e) Added an enum, TKernPanic, to e32std.h
+		   Now client threads will be panicked with values in this list,
+		   rather than error numbers.
+
+	f) Fixed a couple of bugs in the low-level arm mmu implementation which
+	   showed up with very large RAM disks.
+
+	g) Exported wildcards KMatchAny and KMatchOne from e32std.h
+
+	h) Changed RConsole::Set to RConsole::Init
+
+	i) Stopped RTest writing to comm ports (except in X86 builds)
+
+	j) Rationalised KErrxxxx constants
+	   KErrNoLinearMemory gone, used KErrNoMemory instead
+	   KErrSubSystem gone
+	   KErrDomain gone, used KErrArgument instead
+	   KErrException gone (kernel panic enum used instead)
+	   KErrNotFound becomes -1, so that we could omit KNotFound in future.
+
+	   NOTE - KErrGeneral is no longer -1. This showed up quite a few
+	   bugs in the file server which was assuming that KNotFound was the
+	   same thing as KErrGeneral. This is no longer the case, beware!
+
+	 k) Added RThread::ProcessPriority() and RThread::SetProcessPriority()
+
+	 l) Changed void RThread::GetHeap(RHeap*&) to RHeap* RThread::Heap()
+
+		 m) Speeded up interprocess messaging by about 10%. A further 8%
+			to come in next release.
+
+2) Steve
+		a) Fixed UserHal::MemoryInfo which was returning an incorrect
+		   figure for FreeRam - it was deducting the size of the RAM
+		   disk from the real free ram size.
+
+3) Graham
+		a) Changed the ADC interface to unsigned values. This should give
+		   doubled digitiser accuracy but meant recalibration of the
+		   digitiser on all platforms.
+
+		b) Updated K32VIDEO.H to include power handling functions.
+
+		c) Add CountDown(n) and FirstDelta() function calls to the
+		   priority queue class.
+
+		d) Implemented waking up from alarms.
+
+		e) Implemented waking up from pen down.
+
+		f) Implemented ESwitchOn events on all platforms (HA-229).
+
+		g) Added a beep to the Text Window Server in debug builds
+		   when an ESwitchOn event occurs.
+
+		h) Added a general purpose interface to the ADC channels which
+		   measure battery voltages, thermistor readings etc.
+
+		i) Made Neil Lilliot's change for reducing shadowing on the LCD.
+
+4) Jal
+		a) Fixed a bug in TReal96::operator/=
+
+Version 0.01.071
+================
+(Made by Graham, October 11th 1996)
+
+1) Graham
+		1) Added a millisecond timer queue to the kernel. It
+		   currently uses FRC2. All kernel services which were
+		   using TEiger::WaitMilliseconds should now move over
+		   to the new services provided by this queue.
+		2) Implemented the digitiser in terms of the millisecond
+		   timer queue instead of the system tick queue. This enables
+		   code to be written which can deliver more than 21 digitiser
+		   events per second (it is currently set to 25/s). Not only
+		   this, by driving current across the digitiser only when it
+		   is absolutely necessary, power consumption has been
+		   reduced. The digitiser should now work on upgraded
+		   machines - the H/W fix for digitiser wobble involves an
+		   increase to 1mS in the X/Y drive rise-time. In order to
+		   take account of this rise-time, the millisecond timer was
+		   required.
+		3) Implemented the buzzer in terms of the millisecond timer
+		   queue. Due to variable interrupt latency, this does not
+		   produce a pleasing effect. So, for the time being, I have
+		   left the buzzer monopolising FRC1. You can switch between
+		   this and the new millisecond timer buzzer with the compile
+		   time switch __SOFTWARE_BUZZER__ in KEARM\KE_UTL.CPP
+		4) Introduced Hal::WaitMilliSeconds which uses the
+		   millisecond timer. This replaces TEiger::WaitMilliSeconds.
+		5) Added device driver power handling functions in
+		   KS_POWER.CPP.
+		6) Created a release of header files for those who link to
+		   the E32 kernel (device driver writers mainly). This can
+		   be found in R:\E32\ZIP\INCK.xxx
+		7) Implemented the auto clibration sequence on the ADC
+		   converter. This cures the problem which causes the first
+		   ever pen down event to have the wrong y-coordinate.
+
+2) Pete
+		1) Fixed a bug which prevented the machine booting up with
+		   the CF card door open.
+
+Version 0.01.070
+================
+(Made by Jane, October 4th 1996)
+
+1) Morgan
+		1) Priority of a process is set according to the Executable's E32Image.
+
+		2) Fixed svLibraryLoadExact to deal with statically linked libraries where
+		the ownership of the libraries handle belongs to the newly created process.
+
+2) SteveG
+		1) Changed the keyboard data for P1 to have ' on shift-6, not ^
+
+		2) RDebug changes: Anyone can now request to be informed when a thread
+		   panics, hits a breakpoint or causes an exception without having
+		   called RDebug::Open. This means a panic catcher can be running
+		   continuously and still allow GDB to be used. Previously, only one call
+		   to RDebug::Open was allowed, meaning that the debugger could not
+		   be used while a panic catcher was running and vice-versa.
+
+		   To catch panics etc, use the following code:
+
+			   SDebugInfo info;
+			   TRequestStatus status;
+			   RDebug::GetException(info,status);
+			   User::WaitForRequest(status);
+
+		   SDebugInfo is defined in E32SVR.H
+
+		   You must kill the thread that paniced at some point using:
+
+			   RDebug::KillThread(info.iThread);
+
+		   or it will remain suspended forever. Do not use RDebug::Open
+		   or you will prevent GDB from running at the same time.
+
+		   If someone starts GDB while your request to GetException is pending,
+		   GDB takes priority and you will not recieve any notifications of threads
+		   panicing until GDB quits
+
+		   Only one call to GetException can be active at any one time. It is
+		   quite safe to call GetException while GDB is running, your request
+		   will remain pending until the first app panics after GDB quits
+
+		   To cancel a request to GetException, use RDebug::CancelGetException()
+
+		   This feature has been buried by Jane's RUndertaker class which
+		   should be used in preference ('cos she says it's better :-()
+		   The ability to use GetException without calling RDebug::Open will
+		   be removed in a later release.
+
+		3) Altered D_GDB, the GDB stub, so that if you launch it without
+		   passing a program to debug on the command line, it will wait
+		   for a thread to panic/hit a breakpoint and then call
+		   User::Notify(). You can then start up GDB on the PC and
+		   connect to the Protea and start debugging the thread that
+		   paniced/hit a breakpoint.
+
+		   To put a hardcoded breakpoint into your code, use the line:
+
+			   asm(".word 0xe7ffffff");
+
+		   in your code. Run D_GDB without passing a command line, and
+		   start your program. When the notify appears saying that
+		   a program has hit a breakpoint, start up GDB on the remote
+		   PC and start debugging...
+
+3) Jane
+		1) Added KErrException. Threads which make illegal accesses etc. are
+		   now panicked with this value.
+
+	2) Added RThread::RaiseException(TExcType aType)
+		   For the time being, this just panics a thread with category
+		   "Exception Raised" and panic number = the exception number
+		   TExceptionType is obsolete, and will be retired at the next thaw.
+
+	3) Filled all user mode stacks with 0x29 to aid spy programs
+
+	4) Implemented the thread death notifer service. The class is
+
+		class RUndertaker : public RHandleBase
+			{
+		public:
+			IMPORT_C TInt Create();
+			IMPORT_C TInt Logon(TRequestStatus& aStatus,TInt& aThreadHandle) const;
+			IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
+			};
+
+			To use the class, create an RUndertaker and logon to it like so
+
+		RUndertaker u;
+		u.Create();
+		TRequeststatus stat;
+		TInt handle;
+		u.Logon(stat, handle);
+		User::WaitForRequest(stat);
+
+			When a thread dies, the status word is completed, and the handle is that
+		of the dying thread. To look at why the thread died, for example, you might
+			do the following...
+
+			RThread r;
+			r.SetHandle(handle);
+			if (r.ExitReason()==0x666)
+				{
+				...
+
+		As you now have a handle on the dying thread, it won't go away until
+		you close it.
+
+			r.Close();
+
+			Look at T_THREAD for examples.
+
+		NOTE: This service isn't guaranteed. If a thread dies while you are not
+		logged on to your RUndertaker, obviously you'll miss it - and there is a
+		window of opportunity after a thread has died & your status has completed
+			and before you get chance to deal with this and logon on again.
+
+		NOTE2: Matt will be implementing a more general form of this in his
+		RChangeNotifier class, which will complete to tell you that a thread
+		has died, but not tell you *which* thread.
+
+4) Matthew
+		Fixed bugs: HA-207 (%J in TTime::FormatL should abbreviate in 12hour
+		mode) and HA-215 (CActiveScheduler::Add should assert parameter).
+
+5) Graham
+		Partial implementation of a kernel millisecond timer which
+		now runs the buzzer. Do not be alarmed if buzzing sounds
+		different in this release.
+
+Version 0.01.069
+================
+(Made by Jane, September 26th 1996)
+
+1) Jane
+		1) Clients causing an exception are now panicked KErrAbort.
+
+		2) Possible fix for curtains bug. Any more reports of curtains
+		   welcome (sort of.)
+		   The bug was caused because of the change in behaviour such that
+		   a client thread is still hanging around when the server processes
+		   the disconnect. If the process creator had already closed its
+		   process handle, then the process died immediately, but the client
+		   thread was left. Then when the client thread eventually died, it
+		   closed its chunks, which involved removing them from the (dead)
+		   process's address space. BANG!
+
+		   Now the chunk is removed from the process address space earlier on.
+
+
+2) SteveG
+		1) Release 068 had a problem with the MARM custom DLLs,
+		   which prevented the LEDs from flashing. Now OK.
+
+3) Graham
+		1) When the kernel faulted, it used to continue to run and
+		   possibly do all sorts of bad things.
+		   For the time being, we just print a helpful message to
+		   COMM1 and loop forever. (In the future we will reset.)
+
+
+Version 0.01.068
+================
+(Made by Jane, September 23rd 1996)
+
+NOTE - T_RDRV failed on certain bananas. We think that it is due
+to a problem with the hardware - the door open interrupt is not
+asserted for these fruit.
+
+1) Graham
+		1) Removed nocallentrypoint declarations in MARM .OBY files
+		   and added  dll= appropriately.
+
+		2) Fixed HA-219 which caused the digitiser to stop working
+		   after the sound driver had been used.
+
+		3) Added a system of cumulative inertia into the digitiser.
+		   Consider a system where a physical movement of the pen
+		   produces an actual Pen Move Event only if it has moved
+		   more than 1 pixel. Call this an inertia of value 1. So,
+		   if the digitiser has an inertia value of 3, then it only
+		   produces Pen Move Events when a movement of greater than
+		   3 pixels in any direction has occured. The system I am
+		   now experimenting with is one where the longer the pen
+		   stays in one place, the greater inertia it acquires. So,
+		   normally, with the pen moving all the time, no inertia
+		   effects are apparent. But, when the pen comes to rest,
+		   then the inertia begins to increase by one unit for every
+		   1/4s that it remains within its 'inert event horizon'. It
+		   is currently set so that the maximum possible inertia
+		   value is 5. Clearly, I can't tell if this is a valuable
+		   system until some higher level apps start running with
+		   this O/S. So, feedback on this subject is especially
+		   welcome.
+
+		4) Speculative fix for HA-217 ('Curtains').
+
+		5) Exported Hal::DisableIrqsToLevel1() et al. from the kernel
+
+		6) Reworked the kernel exception interface (TException,Exc).
+
+2) SimonB
+		1) Removal of F32 code from the EWINC library
+
+		1) Addition of a new TWINC directory with MAK files for building all the code in TBAS. (The CPP files
+		   used are the ones in TBAS). The header files from TBAS have been copied into TWINC, but this could
+		   be rectified by changing the #includes to reference "..\TBAS\..."
+
+		1) Addition of bld and run cmd for building WINC libs, and test code. Also for running the test code.
+
+		1) Changes to MNT additional verbs
+
+					winc            build the libarries
+					wincall
+					wincdeb
+					wincrel
+					wincudeb
+					wincurel
+					btwinc          build the test code
+					btwincall
+					btwincdeb
+					btwincrel
+					btwincudeb
+					btwincurel
+					rtwinc          Run the test code
+					rtwincall
+					rtwincdeb
+					rtwincrel
+					rtwincudeb
+					trwincurel
+
+
+		1) Changes to EWINC MAK files and build cmd file to get Unicode variants to build and work. May still
+		   need some more changes - (the mak files were completely stuffed with release builds compiling debug
+		   code). It may be worth recreating all mak files again froms scratch
+
+		1) Changes to E32Initialise. With the file server in a separate Dll, the init code follows the WINS
+		   init code method for the file server.
+
+3) Jane
+		1) Added new RThread::Create which takes an open RLibrary, as discussed in EON defects -
+				IMPORT_C TInt Create(const TDesC &aName,TThreadFunction aFunction,TInt aStackSize,TAny* aPtr,RLibrary* aLibrary,RProcess* aProcess,RHeap* aHeap, TInt aHeapMinSize,TInt aHeapMaxSize,TOwnerType aType);
+		   This function takes all possible parameters so that a thread with an open library
+		   handle can be created in another process, sharing a heap etc. (If the RLibrary*, RProcess*, RHeap*
+		   are not required, just pass in NULL as usual.)
+
+		   The entrypoints of the library are called before the thread's entrypoint.
+
+		   NOTE - obviously the thread cannot access the handle it has on the library, so the library
+		   can only get its final close when the thread dies.
+
+		2) Fixed a bug to do with stack chunk creation. Improved the naming scheme for chunks.
+
+		3) Various E32 Proposals
+			- Processes unmarked by default
+			- Queues don't allow shallow copies
+			- CActive functions const
+			- RTest Console() accessor for iConsole
+
+		4) Improved the kernel server protection method, which was becoming more unsafe
+		   with the addition of each new way of shooting a client thread. (Now if the kernel
+		   server shoots a client, it should always leave KErrKernelServerLeave, after
+		   stashing a suitable error to shoot the client with in K::ClientErrorCode)
+
+		5) Fixed a few situations where the kernel was shooting itself rather than the client.
+
+		6) Pervasive change, such that the Owmer() of a CObject - used in forming the
+		   name - is correct for thread-owned objects.
+		   If a semaphore A is owned by thread B in process C its name is now C::B::A
+		   If it was owned by process C directly it would be called C::A
+
+4) SteveG
+		1) Implemented control of the LEDs on the racks and P1. It is now possible to get your
+		   red alarm LED on your banana to flash, but it will flash green. Please note that this
+		   is not an E32 software bug
+
+		2) Changed all occurances of TheSuperPage().iTotalRamSize to TheSuperPage().iMaxFreeRam,
+		   and added iTotalRamSize and iTotalRomSize to the SuperPage. iRamDriveSize is now
+		   setup correctly, and these figures will be returned properly when using UserHal::MemoryInfo
+
+		3) Added ESpecialKeyBase and ESpeicalKeyCount to E32KEYS.H. Any scancode in this range passed
+		   to the keyboard translator will be passed through unaltered, and can be used for the
+		   on-screen keys facility provided by the window server
+
+5) Morgan
+		1) Added RLibrary::FileName()
+		2) Corrected the key mappings for Func and Alt on the X86 build
+		3) Extended Library and Process RAM loading to share ready loaded code chunks.  RAM loaded
+		   Libraries can use ROM code chunks but currently Processes cannot.  Suitable code chunks
+		   are identified by matching their checksums.
+
+5) Matthew
+		1) Implemented %lx, %ld etc for formatting TInt64s. Added TLex::Val functions for TInt64s.
+		   Removed TLex::Convert() and TLex::ConvertList().
+
+		2) Given DThreads and DProcesses ids: essentially just a unique TUint. Threads and processes
+		   can be now opened by their id.
+
+		3) Changed Hal::RomVersion() so that it now returns version number from the rom header on
+		   Epoc platforms.
+6) Pete
+		1) Changes to support Asci12-Rev2. (Still works with Rev1 though).
+		2) ATA Driver - Validation of partition entries in MBR now added.
+		3) ATA Driver - CHS and LBA addressing now supported (this allows us to work with Hitachi CF
+		   card).
+
+7) Rog
+		1) Introduced a rack only bug into hardware handshaking for the Serial driver. To facilitate a
+		   timely E32 release the serial drivers will be re-released with C32. If you don't need h/w
+		   handshaking or can get by on WINS, these drivers are just fine.
+
+Version 0.01.067
+================
+(Made by Jal, September 7th 1996)
+
+1) Jane
+		1) MMU fix to do with re-allocating linear space after RAM disk
+		   has grown.
+
+		2) More build and mnt fixes.
+
+		3) Fixed HA-204, incorrect error given by in WINS library loading.
+
+		4) Fixed HA-205, bug in RThread::Create
+
+		5) Changed the Environment class, so that all environment variables are
+		   stored and compared in UPPER CASE.
+
+		6) Changed ks_proc as requested by Colly so that names which are duplicates except
+		   for generation are allowed.
+
+		7) Fixed HA-95, allowing the server to refer to the client thread when processing a
+		   disconnect message
+
+		8) Fixed HA-211, RProcess::Open stops process from being destroyed
+
+		9) Fixed HA-210, runtime checks on queues
+
+		10) Implemented basic exception handling - i.e. shooting the offending thread. Fixes
+			bugs HA-137 and HA-157
+
+		11) Fixed HA-212, RLibrary::Load problems after creating thread in foreign process
+
+
+2) Matthew
+		1) Bug fixes HA-188, HA-198 and HA-202. Also fixed a time-mangling bug on
+		   the rack, which effected relative timers due to off after more than
+		   about 30 seconds, and a bug which caused the sound LDD to panic.
+
+3) SteveG
+		1) On the WINS build, F10 and F11 now send EKeySliderDown and
+		   EKeySliderUp keypresses. F12 key is now the OFF key and
+		   sends an EKeyOff keypress. The UserHal::SwitchOff() function
+		   now minimizes the WINS window, simulating switching off.
+		   Maximising the window will simulate switching on by sending
+		   a TEvent::SwitchOn. The Shell, or whoever switches off,
+		   should just look for EKeyOff and then call UserHal::SwitchOff
+		   which will then work with the correct key on all platforms
+
+		2) Implemented the TTime::Set(TDesC& aString) function which
+		   allows setting or constructing a TTime from a date string
+		   in the format YYYYMMDD:HHMMSS.MMMM - any part of the string
+		   may be omitted, but either the dot or colon must be present.
+		   Any parts of the string which are omitted are zero'd.
+
+		3) Added suitable values to be returned by the WINS memory
+		   functions in UserHal::MemoryInfo()
+
+		4) Fixed problem with supplying long category names when
+		   panicing a thread - only the first 16 characters used
+
+4) Morgan
+		1) Fixed HA-191 by not passing the placement new as an argument to
+		   CArrayFixBase::ResizeL.
+		   Fixed HA-187.  Under WINS Mutex are signaled in thread CleanUp code
+		   rather than in the DPlatThread destructor.
+		   Fixed a Bug in Time::FormatL to prevent the %C directive overflowing
+		   the descriptor and causing a panic.
+
+		2) CArray???::FindIsq returns an index of 0 if the array is empty.
+
+		3) User::IsRomAddress is back.  Again.
+
+
+Version 0.01.066
+================
+(Made by Jane, August 23rd 1996)
+
+1) SteveG
+		1) Re-fixed bug in ARM Mem::Copy and Mem::Move, which got
+		   lost prior to releasing 0.01.065. Refixed the test
+		   software T_FUNC.CPP as well. The bug meant that
+		   Mem::Copy and Mem::Move didn't return the correct
+		   address if the source and target were the same
+
+		2) Debugger fixed to take into account the changes in the
+		   way threads start - the change meant the debugger no
+		   longer set a breakpoint at the start of the thread
+		   when starting a debug session
+
+2) Matthew
+		1) Fixes to sound LDD and arm PDD.
+
+3) Jane
+		1) Various build fixes, especially to WINC
+
+
+Version 0.01.065
+================
+(Made by Jane and Jal, 17th August 1996)
+
+IMPORTANT NOTE:
+
+To avoid delaying the chain below us, this version of E32 has been released with
+2 known bugs and one possible bug. They are as follows...
+
+
+1. Problems on ARM build when the RAM drive grows beyond 1 Meg in size. To avoid this
+   bug, this release of E32/F32 implements a maximum size of 1 Meg for the RAM drive.
+
+2. T_SOUND fails on the ARM platform.
+
+3. T_CPER (CPeriodic test) fails on EPOC platforms. However, I believe this is not a bug
+   - Graham fixed the timers but the test code is out of date.
+
+4. There are WINC test code problems which aren't worth delaying the release for.
+
+1) Graham
+		1) Added microseconds to the system time. This required a
+		   fix to TEiger::RtcTickCount() to counteract an Eiger
+		   hardware anomoly - the SYSFLG 64ths do not roll over to
+		   zero at the same time as the RTC rolls over its seconds.
+		   It does this on the half-second instead. Enhanced T_TIMER
+		   to test this roll-over effect.
+
+		2) Changed the MUTATBLE errors in E32DEF.H
+
+		3) Updated EMARM.REL to include the P1 variant device drivers
+
+		4) Fixed warnings in T_BUF.CPP.
+
+		5) Fixed intrnal TTickLink services to work with microseconds
+		   instead of tenths. In order to help device-driver writers,
+		   I have changed the name of the functions to
+		   PeriodicInMicroSeconds and OneShotInMicroSeconds.
+
+		6) IMPORTANT
+
+		I have changed the way in which the timing services in E32 work.
+		Although the changes mean that more of the underlying mechanism
+		is exposed, it is hoped that this policy will result in more
+		programmer-friendly services once the theory has been explained.
+
+		The theory:
+
+		The timing services are based upon the regular pulse that animates
+		the operating system. The time between pulses is called the tick
+		period and this will vary according to the platform being used.
+		The tick period for WINS, for instance, is 100000 uS, while for
+		MARM it is 15625 uS.
+
+		A new service has been introduced which enables the programmer
+		to determine the length of the tick period in microseconds:
+
+	TInt UserHal::TickPeriod(TTimeIntervalMicroSeconds32& aPeriod)
+
+		But, for the purposes of the subsequent discussion, I will call
+		this length of time T.
+
+		So, we have the following situation:
+
+	---|-----------|-----------|-----------|-----------|--
+	   <----------->
+			 T
+
+		At any point in time, a program may request a timing service
+		such as User::After(x). This function should return x uS later.
+		Let us show this on the diagram and introduce the term y.
+
+							User::After(x)
+									 |
+	---|-----------|-----------|-----+-----|-----------|--
+	   <----------->                 <----->
+			 T                          y
+
+		So, y represents the amount of time between the timing service
+		being requested and the next system tick. It is clear that y may
+		be any duration of time less than or equal to T.
+
+		Let's explore the behaviour of User::After(x) for a range of
+		different values of x.
+
+		x=0
+		---
+		This will return on the next system tick. So, if you ask
+		for 0 uS, you actually get y uS.
+
+							User::After(0)     Completes
+									 |     |
+	---|-----------|-----------|-----+-----|-----------|--
+	   <----------->                 <----->
+			 T                          y  |
+
+		x<T
+		---
+		This will also return on the next system tick. So, if you
+		ask for T-1 uS, you actually get y uS.
+
+						  User::After(T-1)     Completes
+									 |     |
+	---|-----------|-----------|-----+-----|-----------|--
+	   <----------->                 <----->
+			 T                          y  |
+
+		x=T
+		---
+		This will cause a wait of 1 tick to be set up. So, if you
+		ask for T uS, you actually get y+T uS.
+
+							User::After(T)                 Completes
+									 |                 |
+	---|-----------|-----------|-----+-----|-----------|--
+	   <----------->                 <----->
+			 T                          y  |
+
+		x=2T-1
+		------
+		Just to expose the workings a little more. 2T-1 gets divided
+		by T to see how many ticks to wait. Any remainder is discarded.
+		Now, in integer maths, (2T-1)/T = 1. So, we set up a wait of
+		1 tick. So, if you ask for 2T-1 uS, you actually get y+T uS.
+
+						 User::After(2T-1)                 Completes
+									 |                 |
+	---|-----------|-----------|-----+-----|-----------|--
+	   <----------->                 <----->
+			 T                          y  |
+
+		x=2T
+		----
+		2T/T = 2. So, we set up a wait of 2 ticks. So, if you ask
+		for 2T uS, you actually get y+2T uS.
+
+						   User::After(2T)                     Completes
+									 |                             |
+	---|-----------|-----------|-----+-----|-----------|-----------|--
+	   <----------->                 <----->
+			 T                          y  |
+
+
+		Notes
+		-----
+
+		a. It is a slightly irksome feature of this system that if you
+		   ask for x uS, you may end up waiting less time than x, or you
+		   might end up waiting more time than x. It all depends on
+		   the value of the 'wobble factor', y.
+
+		   As mentioned above, if you ask for T-1 uS, you actually
+		   get y uS. Now y could be, in fact it will in all probability
+		   be, significantly less than T-1. On the other hand, if you ask
+		   for T uS, you get T+y uS, which means you will be waiting a
+		   longer time than that requested.
+
+		   It is impossible, then, for the operating system using this
+		   system to guarantee that it will wait at least as long as the
+		   period of time requested. If this is the sort of guarantee you
+		   need, then you will have to arrange it yourself by
+		   adding (T-1) to your request. You can determine T using the
+		   UserHal function mentioned above.
+
+		b. In some situations the value of y is known. Consider a
+		   periodic timer. After the first callback, you know that
+		   you are now synchronised to the system tick and that y
+		   is just less than T. The 'wobble factor', in this situation,
+		   can be taken allowed for by the programmer. So, if you start
+		   a CPeriodic with a delay of 0 uS and an interval of 0 uS,
+		   you will get one which immediately starts calling back on
+		   every system tick.
+
+		c. Timing test programs commonly want to synchronise to the
+		   system tick in order to remove the 'wobble factor' from
+		   their calculations. This can now be achieved using User::After(0).
+
+
+2) Jane
+		1) Added new User class layout from Martin Tasker.
+
+		2) Re-fixed WINS RDebug.Print (HA-170) which had become un-edited after
+		   I put it in!
+
+		3) Added CObjectIx::Count() to return the total number of
+		   objects in a CObjectIx.
+
+		4) Added RThread::HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const;
+		   This returns the total number of handles open in a thread and
+		   its owning process.
+
+		5) Added RHandleBase::HandleInfo(THandleInfo* anInfo);
+		   This function fills in a THandleInfo structure with
+		   information about the current handle.
+
+		   class THandleInfo
+				{
+		   public:
+				TInt iNumOpenInProcess;
+				TInt iNumOpenInThread;
+				TInt iNumProcesses;
+				TInt iNumThreads;
+				};
+
+		   iNumOpenInProcess = the number of times the object given by
+			   the handle is open in this process.
+		   iNumOpenInThread = the number of times the object given by
+			   the handle is open in this thread.
+		   iNumProcesses = the number of processes which have a handle on the object.
+		   iNumThreads = the number of threads which have a handle on the object.
+
+		 6) Added an extra defaulted parameter to many RHandleBase derived classes' Create calls.
+			For example, from RMutex...
+			TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+			TInt CreateGlobal(const TDesC &aName,TOwnerType aType=EOwnerProcess);
+
+			The owner type specifies whether the handle created is
+			thread or process relative. (The default is process-relative
+			as before.)
+			Process-relative handles may be passed between threads in
+			the same process without duplication. The handles are held
+			in the process, and are not closed when the thread dies, so
+			the objects will hang around until the process dies.
+			Thread-relative handles need to be duplicated between
+			threads in the same process, but the handles will be closed
+			when the thread dies.
+
+			IMPORTANT NOTE 1
+			Due to design considerations, RLibraries and RTimers are
+			now always thread relative handles. You will need to
+			duplicate them if they are shared between threads. RLibraries
+			should now unload when their access counts become 0.
+
+			Fixes bug HA-170
+
+		 7) Fixed X86 crash on test failure.
+
+		 8) Fixed HA-177 - panicking a dead thread kills the caller.
+
+		 9) Fixed HA-180 - panic enum was incorrect.
+
+		10) Dll loading changes.
+
+			RLibrary load api becomes...
+			TInt Load(const TDesC &aFileName,const TDesC &aPath=_L(""));
+
+			If aFileName is a full filename with path, then aPath will be ignored,
+			and the only load attempted will be that of aFileName. If the dll is not
+			at the specified location, the load will fail.
+			If aFileName is just a rootname, (e.g. _L("ECONS.DLL")), then the dll
+			will be searched for in the following order - specifed path, followed by
+			the system directory on each attached drive.
+
+			IMPORTANT - old calls with the extension specified as the second parameter
+			e.g. lib.Load(_L("MYDLL"),_L(".DLL")) are now likely to fail as the second
+			parameter is now interpreted as a path.
+
+		11) Dll entrypoints
+			For the first time under EPOC, DLL entrypoints are now called.
+
+			When a process is loaded, all the DLLs to which it is statically linked
+			get their entrypoints called with the value EDllThreadAttach. (This call
+			is on behalf of and in the context of the main thread.)
+			When a new thread is created in the process, the statically
+			linked DLLs' entrypoints are again called with EDllThreadAttach in the
+			context of the newly created thread.
+			When each thread in the process dies, the entrypoints are called with
+			EDllThreadDetach in the context of that thread.
+
+			Unlike Windows NT, I do not call entrypoints with EDllProcessAttach and
+			EDllProcessDetach. This is because the function pair Dll::GlobalAlloc()
+			and Dll::GlobalAllocated (currently unimplemented) allow the DLL to
+			discover its first ever call, if necessary. This is though to be more
+			useful in our system then knowing a first call per process. Similarly
+			Dll::SetTls() and Dll::Tls() enable the DLL to discover its first load
+			within a thread.
+
+			When a thread loads a DLL dynamically via RLibrary::Load(), the DLL's
+			entrypoint is called, if and only if this is the first load of this DLL
+			within the thread. (So if a process is statically linked to FRED.DLL and then
+			a thread does an RLibrary::Load of FRED.DLL, then FRED's entrypoint is not called
+			in response to this load.)
+			The entrypoint is called with the value EDllThreadAttach in the context of the
+			thread loading the DLL.
+
+			The above situation is further complicated by DLL's themselves being statically
+			linked to other DLLs. When a DLL is loaded, I make a list of unique DLL entrypoints
+			in the statically linked chain, and call each of them once only. So if DLL
+			A is linked to DLLs B, C and D, and then B is linked to X, C and Y, and D is
+			linked to B, C, and Z, then the entrypoints for A, B, C, D, X, Y and Z are called
+			once each when A is loaded.
+			If A were statically linked to just B and C, then when it was loaded just the
+			entrypoints for A, B, C, X, Y would be called. If the same thread then went
+			on to load D, then the entrypoints which had not already been loaded in that
+			thread would be called - i.e. D and Z.
+
+			All this DLL entrypoint calling can get very time-consuming in the case of
+			many of the DLLs in the ROM which have no need for entrypoints to be called.
+			In this case, add "nocallentrypoint" after the DLL's specification line in the
+			obeyfile, and no entrypoints will be called for that DLL or any DLLs below it
+			in the static linkage chain.
+			All drivers should have "nocallentrypoint" specifiers.
+
+			E.g. primary=\xxx\ekernd.exe sys\kernel.exe nocallentrypoint
+
+
+			IMPORTANT NOTE 2
+
+			Although for many of the files "nocallentrypoint" is optional, it is compulsory for
+			kernel.exe and efile.exe. Bad things happen if the kernel's entrypoint is called
+			when something which is linked to it is loaded, and the file server doesn't take
+			too kindly to it either!
+			Also, note that the name of efsrv.dll has changed in the obeyfile. It's probably
+			best to cut and paste from the released E32 obeyfiles.
+
+			There are new versions of ROMBUILD & PETRAN which support the above obeyfile
+			changes and new structures necessary for the calling of DLL entrypoints.
+
+		12) Due to the new directory scheme, it has been possible to remove
+			RLibrary::LoadExact. RLibrary::Load now does a load exact - i.e. it does no
+			name mangling on the name passed in as a parameter.
+
+			RLoader::LoadExact has been renamed to RLoader::Load. This will affect you
+			if you have one of those "mini-loaders" for WINS which allows you to live
+			without the file server.
+
+
+3) SteveG
+		1) Altered all builds of E32 to use the new directory structure \Epoc32\Build and
+		   \Epoc32\Release
+
+		2) Added SetModifierState function to KeyTranslator:
+
+		   TInt SetModifierState(TEventModifier aModifier,TModifierState aState)
+
+		   which alters the supplied modifier according to the supplied state.
+		   TModifierState is defined in E32Keys.h and is one of ETurnOnModifier,
+		   ETurnOffModifier or EToggleModifier.
+
+		3) Fixed bug in KYTRAN where left and right modifiers were not being set
+
+		4) Implimented DigitizerCalibration functions, and wrote simple text shell
+		   calibration program. A calibrator will need to be written as an Eikon app.
+
+		   A calibration program should:
+
+		   Call UserHal::CalibrationPoints(TCalibration& aCalibration) which will return
+		   three screen coordinates at which points should be plotted. The user should
+		   touch these three points, and the values returned by the digitizer for the points
+		   actually touched should then be returned to
+		   UserHal::SetXYInputCalibration(TCalibration aCalibration)
+
+		   Note that a TCalibration actually has 4 points - the 4th is ignored by
+		   SetXYInputCalibration
+
+		   Suitable default calibration values incorporated into each ARM variant, so
+		   the calibration on your yellow jobbie should be more or less correct without
+		   calibrating. If yours is wildly off, please let us know
+
+		5) Added profiling support to all platforms, and increased the number of nested
+		   profiles to 64. You can specify a range of profiles to clear/read results of.
+		   Results returned in microseconds, but only recorded at tick resolution. This
+		   avoids changing the API when profiles are measured more accurately.
+
+		   Using profiles:
+
+		   Decide on the profile numbers you are going to use, between 0 and 63. You can
+		   use any of them, unless someone else is using some in the same ROM build.
+
+		   Reset the profiles you are using, by:
+
+		   RDebug::ProfileReset(aStart,aCount);
+
+		   which resets aCount profiles starting from profile number aStart.
+
+		   Surround the code with __PROFILE_START(n) and __PROFILE_END(n) where n is
+		   a number of your choice between 0 and 63 inclusive. You can nest the profiles.
+
+		   Return the results using:
+
+		   TProfile profile[n]; // n is the number of results you are reading
+
+		   RDebug::ProfileResults(&profile[0],aStart,aCount);
+
+		   which writes the results of aCount profiles starting with profile number
+		   aStart into your profile array.
+
+		   TProfile is currently defined as:
+
+		   class TProfile
+			   {
+			   TInt iTime;
+			   TInt iCount;
+			   };
+
+		   You need to include E32SVR.H in your code to use profiles
+
+		6) Moved the keystroke data dll to the variant level, allowing
+		   different keyboard layouts for each implementation. Changed
+		   the P1 version to give correct keystrokes and modifiers on the
+		   yellow jobbies.
+
+		   On the real Proteas:
+			   Fn sets EModifierLeftFunc and EModifierFunc
+			   Menu sets EModifierLeftAlt and EModifierAlt
+			   Fn-Esc sends an EKeyOff keypress
+			   Fn-M sends an EKeyDecContrast keypress
+			   Fn-, sends an EKeyIncContrast keypress
+
+		   On B and C racks:
+			   Alt sets EModifierLeftAlt and EModifierAlt
+			   Alt-Esc sends EKeyOff
+			   Alt-, sends EKeyDecContrast
+			   Alt-. sends EKeyIncContrast
+
+		   On WINS:
+			   Left Alt sets EModifierLeftAlt and EModifierAlt
+			   Right Alt sets EModifierFunc and EModifierLeftCtrl
+					and EModiiferCtrl (the setting of Ctrl is a Windows
+					funny and can't be prevented AFAIK)
+
+
+		7) Fixed bug with ARM coded Mem::Copy and Mem::Move where it
+		   returned the wrong value if the source and targets were the same
+
+
+4) AdamG
+		1) Much of ECOMM re-written to speed up data paths and fix all known serial driver
+		   bugs.
+
+		2) Implemented reference counting of interrupts in all serial PDDs for all hardware
+		   and platform variants.
+
+		3) Added use of NT Critical sections to WINS Serial PDD to eliminate multiple
+		   completion bugs.
+
+		4) Corrected signal polarity in all MARM serial PDDs.
+
+5) Matthew
+		1) Changes to TLocale.
+		   Most importantly there are now four date separators and four time separators, one
+		   for the beginning, one for the end and two potentially different internal
+		   separators. The convention is that the NULL character represents no separator.
+		   This has had a knock on effect on the TTime::FormatL() function: now '%:0' means
+		   first time separator, '%/3' means the forth date separator etc.
+
+		   Additionally there is now an AmPmSymbolPosition indicator, and different distance
+		   units for different contexts: one general and two for short/long distances.
+
+		2) Added an RChangeNotifier class, for notifying users of global changes. At the
+		   moment changes to TLocale and midnight crossover are the only things which are
+		   notified.
+
+		   To use call Create() and then Logon() with a TRequestStatus. This first Logon()
+		   will complete straight away with the value EChangesAll. Subsequent logons will
+		   complete next time there is a change and the status will contain a bitfield
+		   indicating what has changed.
+
+		3) Made certain TInt64 functions inline. Also changed the default constructor so
+		   that it does not assign zero.
+
+		4) Changed the X86 build so that getting the time returns fractions of seconds. The
+		   time is now given to the nearest tick (which occur at just over 18.2Hz on the X86).
+
+		5) Added unary minus operators to TPoint and TSize.
+
+		6) Changes to sound driver: Fixed a bug that caused a crash when you tried cancelling
+		   playing alarm sounds. Stopped it from panicking in Wins if you turned beeps off
+		   from the control panel.
+
+6) Jal
+				1) Various internal changes to TLocalDrive and media drivers.
+
+				2) Added operator[] to CObjectIx
+
+7) Morgan
+		1) More RThread test code under Suspend/Resume conditions
+		   and fixes to WINS and EPOC threads.
+		2) Moved User::IsRomAddress to the file server where it is now called
+				 RFs::IsRomAddress
+		3) Added User::TickPeriod
+		4) Added physical screen size (in twips) to MachineInfo
+
+8) Steve & Jane
+
+	Implemented new Epoc32 directory structure (described in more detail on Notes.)
+
+	All makefiles should be changed so that the intermediate files are built to
+	e.g. \Epoc32\Build\WINS\E32\Deb for exes and \Epoc32\Build\WINSD\E32\Deb for dlls.
+	The executables and dlls themselves should be built to
+	e.g. \Epoc32\Release\WINS\Deb. (NOTE - there is no "E32" in this directory path -
+	all releasables for a given build go to the same directory.)
+
+	E32 mnt makework currently makes the whole Epoc32 structure - this can be used to
+	get started.
+
+	mnt gettools gets tools to Epoc32\Tools. This should be added to your path from
+	the control panel. All existing paths to \tools should be removed if possible
+		- if not possible then the e32 tools themselves should be removed from any tools
+	 directories in your path.
+
+	\E32SYS should also be removed from the path.
+
+	The scheme whereby executables can be installed under Epoc32\WINS\Z and appear as
+	if they are under Z: is not in this release, but will be in the next one. For the
+	time being, the old scheme with romfile.bin holds.
+
+	NOTE: GCC only runs from C:\Epoc32\GCC\BIN, so if you are working on a substed
+	drive, you will still need an Epoc32 directory with GCC in on C:.
+
+
+Version 0.01.064
+================
+(Made by Graham, 26 July '96)
+
+1) Graham
+		1) Integrated WINC into MNT.CMD. This version is the first
+		   to include a release of WINC.
+
+		2) Implemented a special version of RDebug::SupervisorMode
+		   which suits the purposes of REPRO.EXE
+
+		3) REPRO.EXE now works. It communicates with a program called
+		   PREPRO.EXE which runs on the PC. You can get this program
+		   from S: using GETREL PTOOL PEIGER 104 in your \TOOLS
+		   directory. You may type PREPRO for command line options, but, in
+		   general, you merely type PREPRO imagefilename.IMG. The PC will
+		   then wait for the Protea to lead communications.
+
+		   Now run the REPRO program on your Protea. Make sure you do
+		   not remove mains power during the reprogramming process.
+
+		   Progress will be reported on the screen of the PC.
+
+		   If an error is detected during the reprogramming process,
+		   then the program on the Protea will just restart - erasing
+		   all the flash chips again and then programming them.
+
+		   This means that if you interrupt the PC program, no
+		   disaster will occur. If you decide you are programming the wrong
+		   image in the middle of the process, then just escape from the PC
+		   program, get the correct image on your PC and restart
+		   PREPRO with this image. By the time you have done this,
+		   the Protea will have timed out and will have decided to
+		   restart.
+
+		4) Added Gillian's bug fix for TTime::MonthsFrom() and
+		   TDateTime::SetHour()
+
+		5) Changed EWSRV.EXE so that it hunts for ESHELL.EXE on all
+		   drives from A: to Z:
+
+		6) Upgraded BOOTROM.BIN to the new E32TOOLS(36)
+
+
+2) SteveG
+		1) Fixed bug in Des::AppendNumUC which converted the whole
+		   descriptor to uppercase rather than just the appended number
+
+		2) Added simple profiling for ARM builds, which counts the
+		   number of times a function or section of code is executed
+		   and the time taken in ticks. A later version will be
+		   more accurate (using a 512kHz timer).
+
+		   To use this, surround the section of code to be tested with:
+
+		   __PROFILE_START(n)
+		   and
+		   __PROFILE_END(n)
+
+		   where n is a number between 0 and 7 inclusive. You use upto
+		   8 profiles, which can be nested if necessary. You will need
+		   to use the RDebug class to access the results as follows:
+
+		   TInt E32Main()
+			   {
+			   RDebug debug;
+
+			   debug.ProfileReset(); // Clear readings & reset counts
+
+			   __PROFILE_START(0);
+			   <test code>
+			   __PROFILE_END(0);
+
+			   SProfileInfo profile;
+
+			   debug.ProfileResult(profile);
+			   }
+
+		   SProfileInfo and RDebug are defined in E32SVR.H.
+
+		   SProfileInfo is defined as:
+
+		   struct SProfileInfo
+			   {
+			   TInt iCount[8];
+			   TUint iTimes[8];
+			   }
+
+		   RDebug::ProfileResults returns the counts and times
+		   for all 8 profiles, even if you are only using 1 profile.
+
+		3) ARM coded the following E32 routines which were dog slow,
+		   and changed the relevent descriptor functions to use these
+		   new functions rather than their own copying code
+
+		   Mem::Copy
+		   Mem::Move
+		   Mem::Swap
+		   Mem::Fill
+		   Mem::Compare
+
+		   TDes8::AppendNum
+		   TDes8::AppendNumUC
+
+		   and added ARM code for signed or unsigned integer divide
+		   by 2,4,5,7,8,10 and 16, which will improve the modulo
+		   function as well.
+
+		   Speed improvements, TDes::AppendNum()
+
+		   TDes8::AppendNum has been optimised for hex, decimal, octal
+		   and binary conversions, and is improved for all other
+		   conversions as well.
+
+		   TDes::AppendNum(num,EHex)     is now  614% faster
+		   TDes::AppendNum(num,EDecimal) is now  611% faster
+		   TDes::AppendNum(num,EOctal)   is now  751% faster
+		   TDes::AppendNum(num,EBinary)  is now 1322% faster
+
+		   The uppercase conversions will be the same speed as the
+		   lowercase ones, but the %age increase will be greater due
+		   to the fact that the string is worked out in uppercase rather
+		   than converting the descriptor to uppercase after the conversion,
+		   as was done in the CPP version.
+
+		   Speed improvements, Mem functions
+
+		   Mem::Fill is now 236% faster for word aligned buffers, and
+		   around 400% faster for non word aligned buffers, which were
+		   slow before
+
+		   Mem::Swap is now 975% faster for buffers which have the same
+		   word or non-word alignment and around 160% faster for buffers
+		   which have different alignments to each other
+
+		   Mem::Move and Mem::Copy are 330% faster for word aligned
+		   buffers. For buffers with the same byte alignment, the speed
+		   increase is around 600%. If the two buffers have different
+		   alignments to each other, the increase is around 157%.
+		   Mem::Move will be slightly faster than Mem::Copy as it knows
+		   the buffers are aligned by definition of the function.
+
+		   Mem::Compare: no figures yet, but descriptor compares are
+		   around 220% faster, although this depends on what you're
+		   comparing
+
+		   Speed improvements, Integer division
+
+		   No speed measurements on this, but for divide by 16,8,4,2
+		   should be pretty big, and the divide by 10 seems to be around
+		   200% faster. Much hair missing after realising that the GCC
+		   routine __umodsi3 in UP_GCC.CPP (which returns the remainder
+		   of a division), doesn't actually 'destroy r3' as it states in
+		   the cpp file, it returns the quotient in r3, which is relied
+		   upon in divide routines which call __umodsi3.
+
+		4) DeBugger. Drastic unimprovements to get a working version,
+		   which is now what we have :-)) The debugger will now not
+		   single step into EUSER or certain other DLLs, as this
+		   causes problems on the ARM build. As the ARM processor
+		   does not have any single step or trace mode, all single
+		   stepping is done by looking at the next instruction to
+		   be executed, working out where the PC will be if that
+		   instruction is executed, and setting a breakpoint at that
+		   address. Stepping into EUSER or certain other DLLs causes
+		   certain death as any thread could hit that breakpoint
+		   before the thread being stepped. Although code has been
+		   written to silently step any thread over a breakpoint
+		   it shouldn't stop at, serious problems occur if the
+		   kernel hits the breakpoint while in supervisor mode or similar.
+
+		   A document on how to use GDB is on R:\E32\DOCS\GDB.DOC.
+		   Contact me on x625 if you are daring enough to try and use
+		   the most excellent GDB software.
+
+		   If you wish to use the debugger, you need to include
+		   D_GDB.EXE in your ROM build. Please ensure this is AFTER
+		   euser.dll in the ROM and BEFORE anything you debug.
+		   The debugger will not single step into any part of the ROM
+		   that is before D_GDB.EXE. This is a quick 'bodge' to get
+		   around the problem mentioned above, and allows a quick
+		   method of changing what you can and can't single step
+		   into.
+
+3) Rog
+		1) Added CAsyncOneShot and CAsyncCallBack. These two active object
+		derived classes are like a single use CIdle. They can also be used
+		to transfer a thread of control between two threads. Because of the
+		way they work both classes are added to the current active scheduler
+		when they are created.
+
+		2) Added delta timer class. CDeltatimer is a resource efficient timer
+		based on a delta queue and a single RTimer. Requests are identified by
+		TTimerHandles which are returned from CDeltaTimer::Queue and may be
+		passed to CDeltaTimer::Remove.
+
+		3) Added the fast timer driver to the source release. Due to beta
+		deadlines work on the fast timer has ceased.
+
+4) Matthew
+		1) Various changes to the sound LDD and PDDs. The main change is that
+		buffering in now done entirely within the LDD.
+
+		2) Renamed TTime::SetNow() to HomeTime(); TTime::SetUniversal() to
+		UniversalTime() and User::SetSystemTime() to SetHomeTime(). The
+		"system time" is now universal time ie GMT. Home time takes into
+		account any daylight saving and time zone.
+
+		3) Changes to TLocale - added SpaceBeforeAmPm and changed the way
+		daylight saving is handled.
+
+		4) Fixed bug in second queue which caused absolute timers to run twice
+		as fast as they should have done.
+
+		5) Implemented RHeap::CompressAll().
+
+5) Jane
+		1) Added changes from Steve Townsend to optimize region code.
+
+		2) Added timer fixes to thread clean-up code
+
+		3) Fixed the RDebug death under WINS, and implemented RDebug::Print using
+		   OutputDebugString to the debug window.
+
+6) Pete		1) Pc card Controller now allows allocation of card memory chunks smaller
+		than page size.
+		2) Various omissions to Pc Card Controller now attended to.
+		3) Improvements to media change handling.
+		4) Internal ram drive supports size changing.
+		5) TLocalDrive::Format() now calls back during formatting.
+		6) TLocalDrive::Caps() returns more than just size.
+
+7) Morgan	1) Thread and Process protection.
+				   The kernel, file server, null thread, supervisor are now marked as
+				   system threads/processes.  They are also Protected.
+				   Any attempt to Panic, Kill, Terminate, SetPriority on a protected thread
+				   will shoot the caller.
+				   A thread's status can be changed with:
+				   RThread::SetProtected(TBool)
+				   RThread::SetSystem(TBool)
+				   RThread::SetNotifyIfDie(TBool)       (was SetServer)
+				   RThread::SetMark(TBool)
+				   Similar functions exist for processes.
+				   The Exec functions (Set)Mark, and (Set)Server have been replaced with
+				   (Set)Flags functions for threads and processes to implement this.
+
+				   T_PS.EXE displays thread and process status.
+
+				2) AppendFormat and AppendFormatList changes.
+				   Both can now take a TDes[8|16]Overflow handler which is called when the
+				   formatting operation would write to the descriptor beyond its max length.
+				   When this happens and no overflow handler is supplied, the default action
+				   is to panic.
+
+				3) TTime::Format has become TTime::FormatL
+
+				4) Added CServer *CSession::Server() to return the session's server.
+				   Added protected member TDblQueIter<CSession *> CServer::iSessionQ, an
+				   itterator over the server's sessions.
+
+				5) Name changes
+				   TTimeIntervalShortMicroSeconds -> TTimeIntervalMicroSeconds32
+				   AfterInMicroSeconds            -> After
+				   TStartup                       -> TMachineStartupType
+				   and some Americanisations
+
+				6) Defined __ARRAY_NO_PTRS__
+				   and *_CAST operators
+				   Changed __ASSERT_*(c,p) to use (... p ,0)
+
+				8) Removed huffman encoding/decoding from TBuf
+
+				9) Implemented User::IsRomAddress(TAny *)
+
+		10) Added a checksum member to TRomHeader
+
+
+
+Version 0.01.063
+================
+(Made by Graham 3 July '96)
+
+1) SteveG
+		1) Applied patches to the GCC tools and rebuilt them all, with lotsa
+	   help from Nick Twyman. You now no longer need template instantiations,
+	   and the code saving seems to be somewhere between a massive 8 and 13%,
+	   although the exact figure will vary between projects. You will need
+	   to remove all occurances of 'template class.....' from your .cpp files.
+
+		2) Altered the whole of E32 to compile with the new tools, removing every
+	   'template class...' line from all the source files, altering all the
+	   MAK files etc. The new compiler/linker are a lot more nit-picky, and
+	   you will experience several warnings such as 'class xxx only defines
+	   private constructors and has no friends' or 'taking address of temporary'.
+	   Handcrafted ARM MAK files will need changing by hand, v033 of MAKTRAN will
+	   take care of any changes for you. Any handmade ARM MAK files will need
+	   changing as follows:
+
+	   change all occurances of -m6 to -mcpu=arm710 -mapcs-32 and remove all
+	   instances of -fno-implicit-templates. Add in -fvtable-thunks after the
+	   -fcheck-new flag. To remove the warnings 'class xxxx only defines
+	   private constructors and has no friends' add in the flag
+	   -Wno-ctor-dtor-privacy after the -Wall flag.
+
+	   If anyone has any problems with the new tools, please hesitate to
+	   contact me on x625.
+
+	   3) Wrote various benchmark tests to identify areas of E32 that could
+	   improve with being written in ARM code. Start made on testing speed
+	   increases for various descriptor/memory/number functions in ARM code.
+
+	   4) Debugger (Arrrrrrrrrgh :-(
+	   Source level debugging now possible to some extent running a debug
+	   .exe file from the E32 text shell (if you can bear to use Gdb).
+	   No success with an eikon app yet. Identified some problems caused
+	   by single stepping through user functions which my breakpoint
+	   handler uses (memcopy, array/descriptor functions etc). The first
+	   thing my breakpoint handler does is to clear any breakpoints in
+	   the ROM, but in doing so it cannot use any functions which might have
+	   breakpoints set in them.
+
+2) Matthew
+	1) Changed RThread::Read() and Write() so that they leave on errors.
+		   This fixes HA-158 - CSession::WriteL(...) panics caller.
+
+	2) Added RThread::SetInitialParameter() and RThread::GetHeap(),
+		   fixing HA-63, so you can now create an RThread, find its heap,
+		   alloc a cell in that heap, pass the pointer to that cell as the
+		   parameter to the thread and the thread can call User::Free on it.
+
+	3) Made KCurrentThreadHandle have the NoClose flag set, so that
+		   Close()ing an RThread which hasn't been Create()ed is harmless.
+
+	4) RThread and RProcess::LogonCancel() now return KErrGeneral if
+		   you are not logged on.
+
+3) Graham
+		1) Built and released Protea Rev 1 (P1) variant of MARM.
+
+		2) Made WeekNoInYear and DayNoInYear const correct.
+
+		3) Removed 'API Freeze Technology'
+
+		4) Added the REPRO program which must be included (In PETRAN
+		   format) in all P1 variant ROMs. NB this program does not
+		   work yet.
+
+		5) Re-included Andrew Theolke's fix for Single Queues. This
+		   means that everyone will have to remove their work-arounds
+
+		6) Fixed the HAL API problem with UserHal::BacklightBehaviour
+
+		7) Reintroduced stack frames into the debug MARM builds of EKERN
+		   and EUSER.
+
+4) Jane.
+	1) Fixed linear address allocation problem with hardware chunks.
+
+	2) Stopped a false read of CMOS data/time information under X86
+		   killing the kernel.
+
+	3) Fixed bug HA-150 - Rng was returning T rather than TBool
+
+	4) Removed J Day hacks and old functionality for RAM loading
+		   of exes and dlls, and added support for new E32Image format etc.
+
+	IMPORTANT NOTE - You must now update to the latest version of E32TOOLS. This
+		version of E32/F32 is incompatible with versions of tools pre 029.
+
+5) Morgan
+	1) Added WINS Led simulation.  To turn the Leds on and off use:
+	   UserHal::ModifyLedMask(TUint aClearMask, TUint aSetMask);
+	   with the masks, KLedMaskRed1 and KLedMaskGreen1
+
+	2) Removed the protea bitmap from the kernels WINS resource.
+	   The bitmap is now loaded from \E32\KPWINS\PROTEA.BMP at runtime.
+
+	3) Implemented TSecondQ::SystemTimeChanged()
+
+		   User::SetSystemTime() now completes all pending timers on the
+		   K::SecondQ with KErrAbort.
+
+		4) Added DTimer::Abort() to support this.
+
+
+Version 0.01.062
+================
+(Made by Graham, 31st May 1996)
+
+
+1) Graham       Fixed MARM Debug mode
+
+2) Pete         Added Media change handling. This allows CF cards to
+				be inserted or removed without the need to reset. All
+				that is now required is that the DOOR switch is
+				depressed during these operations.
+
+				NB Do not attempt to use the CF card (or even boot up
+				a rack with a CF card inserted) if your rack does not
+				have a special capacitor fitted to counteract a fault
+				in the ETNA chip (ASIC12)
+
+Version 0.01.061
+================
+(Made by Graham, 30th May 1996)
+
+1) Jane
+		1. Implemented E32 Proposal: TDes8::Append(const TDesC16&)
+
+		2. Implemented E32 Proposal: calling RMessage::Complete twice panics server not kernel
+
+		3. Implemented E32 Proposal: priority enumeration for active objects
+
+		4. Fixed bug HA-93: referring to a dead thread panics caller
+
+2) Matthew
+		Fixed bug HA-102: K::BeepComplete can be catastrophic
+
+3) Rog          Added IrDA support to serial LDD and COM1 PDDs
+				Enabling Irda will automatically set framing and
+				handshaking to SIR standards (i.e. 8N1 None)
+
+				Added CheckConfig()=0 to PDDs this allows PDDS to
+				furtle with the default configuration before the
+				driver is created (in specific it allows the Etna
+				driver to disable the Fifo.)
+
+4) Pete         Added ATA media driver for Compact Flash cards
+				(MEDATA.PDD). This allows read/write/format of CF cards
+				via TLocalDrive. However, media change interrupts aren't
+				handled yet. Therefore racks must be powered down or Reset
+				before inserting or removing a card to remove power
+				from the CF card socket.
+
+NB Use E32TOOLS(028) - this release contains a .EXE which exposes
+a bug in earlier versions of ROMBUILD. You should also use these
+tools because the new MAKTRAN causes -fcheck-new to be introduced
+into the gcc compiler options.
+
+Version 0.01.060
+================
+(Made by Graham, 23rd May 1996)
+
+1) Pete
+		1.  General enhancement to TLocalDrive and its corresponding
+			kernel side objects to support Media Drivers. TDriveBase/TPlatDrive
+			now replaced with TLocDrv which is platform independant.
+
+		2.  TLocalDrive::Connect() can now take a reference to a
+			media change flag (TBool).
+
+		3.  Internal Ram Drive now implemented using Media Driver.
+
+		4.  Further improvements to RPcCardController.
+
+2) Rog
+		1.  All but a complete re-write of serial LDD. Throughput much
+			increased.
+
+		2.  Support for COM1 on RackC is now available from the new
+			DATXPC1.PDD.
+
+		3.  Hardware handshaking is currently broken.
+
+3) Graham
+		1.  Etna support fixed.
+
+		2.  Removed redundant .FRZ files
+
+4) Jane
+		1. Added support for RAM loading of dlls and exes. Currently entrypoints
+		   are called in the same manner as for ROM exes and dlls, i.e. only once
+		   for a process attach, and never for a thread attach/detach, or a process
+		   detach.
+
+		   IMPORTANT NOTE: To support this, the format of the rom headers has
+		   changed, and there are new rom building tools - see E32TOOLs release notes.
+		   The old tools are incompatible with E32 060.
+
+		2. Added RDebug::Print(TRefByValue<const TDesC> aFmt,...) which outputs
+		   text to COM1 from user side code as an aid in debugging.
+
+
+Version 0.01.059
+================
+(Made by Colly)
+
+1) Fixed RLibrary::LoadExact() which would not load more than 1
+   DLL at a time.
+
+Version 0.01.058
+=============[==
+(Made by Matthew)
+
+1) Colly
+	1. Changed the _S8,_S16 and _S macros to return
+
+		const TText*
+
+	   rather than
+
+		TText*
+
+	   which was allowing writeable descriptors to be constructed illegally
+	   over strings. i.e.
+
+		TPrtC(_S("Test string"));
+
+	   Bad news as strings are in the text segment and read only.
+	   Compiler will now refuse to compile the above code.
+
+	2. Renamed class TGuid to TUid and changed the representation to just
+	   a signed integer (to keep Bill happy). Added the class TUidC where
+	   C stands for constructor which just has two constructor, a default
+	   constructor which effectively sets the UID to KNullUid and one
+	   taking an integer. Given a uid of 0x10000000 then TUidC(0x10000000)
+	   will construct the right UID. KNullUid is unfortunately implemented
+		   as a #define to avoid class consts.
+
+	   Everywhere that guid was used has now been changed to uid which
+	   effected RLibrary and the registry functions.
+
+	   Renamed the uid test DLL from T_UID to T_DUID and the test program
+	   from T_GUID to T_UID.
+
+	3. Changed CObjectCon::FindByName() and CObjectCon::FindByFullName()
+	   to use MatchF() instead of Match(). CObject::FullName() used to
+	   concatenate Owner().Name() with Name(). It now concatenates
+	   Owner().FullName() with Name().
+
+	4. Changed TCreateProcessInfo and TCreateLibraryInfo to have a TUid
+	   which in due course will be supplied by the loader from the
+	   .exe and .dll headers. Added the TUid to DProcess and DLibrary.
+	   Also added iGeneration to DProcess so that more than one process
+	   can be run at the same time.
+
+	5. Changed the name of a library to include the TUid::Name().
+		   If library t_test.dll is loaded and it has a TUid of 0x10000001
+		   then its name will be:
+
+		t_test[10000001]
+
+	6. Changed the name of a Process() to include the TUid::Name()
+		   followed by iGeneration as a 4 digit decimal value. If process
+		   t_test.exe is loaded and it has a TUid of 0x10000001 and
+	   it is the the third copy running its name will be:
+
+		t_test[10000001]0002
+
+	7. Added Mem::Crc()
+
+	   which performs the 16 bit CCITT checksum. It should be called
+	   for a descriptor as follows:
+
+		TPtrC8 des=_L("Check string");
+		TUint16 crc=0;
+		Mem::Crc(crc,des.Ptr(),des.Length());
+
+	8. Added the TUidType class. This class packages three UIDs
+	   together. It is intended to provide Type, SubType and
+		   SubSubType together for the typimng mechanism in E32. It
+		   has the following important functions:
+
+		   TUidType::IsValid()
+				TRUE if at least one of the UIDs is not KNullUid
+		   TUidType::IsPresent(TUid aUid)
+				TRUE if any one of the UIDs == aUid
+		   TUidType::MostDerived()
+				{
+				if (iUid[2]!=KNullUid)
+					return(iUid[2]);
+				if (iUid[1]!=KNullUid)
+					return(iUid[1]);
+				return(iUid[0]);
+				}
+
+	9. Added the TCheckedUid class. This class packages a TUidType
+	   together with a checksum. It is intended to be placed at the
+	   beginning of all E32 binary files as follows:
+
+		TCheckedUid check(TUidType(0x10000001)); // Created the header
+		RFile f;
+		f.Open(theFs,_L("binary.file"),EFileWrite);
+		f.Write(check.Des()); // Write the descriptor
+		....
+
+	   The class can be reinstantiated from the binary file as follows
+
+		TPckgBuf<TCheckedUid> check;
+		RFile f;
+		f.Open(theFs,_L("binary.file"),EFileRead);
+		f.Read(check); // Read the signature
+		if (check().Type().IsValid()) // Is it a valid signature
+
+	10.Added a new type TPassword which is just a 16 character buffer.
+
+	11.Added the new abstract class CSecurityBase which provides
+	   encryption/decryption functions given a TPassword. This is
+	   polymorphic to allow other security systems to be
+	   substituted at a later date. One implementation of a security
+	   system is provided which implements a polyalphabetic
+	   substitution which is similar to that on E32 but no great shakes.
+
+	   In order to use CSecurityBase merely instantiate one with
+	   Security::NewL(). By default the security object will be
+	   initialsed with a zero length password and disabled. To
+	   change its value use SetL(_L(""),new password). Alternatively
+	   it can be re-initialised with a descriptor that was previously
+	   extracted from a CSecurityBase with CSecurityBase::SecurityData().
+	   The data returned by CSecurityBase::SecurityData() is intended to
+	   be saved to file and acts as a token for the associated password.
+
+	   Before encrypting or decrypting data use PrepareL() and there
+	   after make continuous calls to EncryptL() or DecryptL().
+
+	   Hopefully the other functions are self explanatory.
+
+	   Added test code T_SEC.CPP to test the security system.
+
+	   NOTE: Passwords are currently case sensitive.
+
+	12.Added the machine password control functions
+
+		class Password
+			{
+		public:
+			IMPORT_C static TInt IsEnabled();
+			IMPORT_C static TInt SetEnable(const TPassword& aPassword,
+										TBool aIsEnabled);
+			IMPORT_C static TInt IsValid(const TPassword& aPassword);
+			IMPORT_C static TInt Set(const TPassword& anOldPassword,
+									const TPassword& aNewPassword);
+			};
+
+	   Password::IsEnabled() returns the current state of the password
+	   enabled	flag. Password::SetEnabled() allows the state to be
+	   changed but only if the correct password is supplied.
+
+	   Password::IsValid() returns TRUE if the password is valid.
+
+	   Password::Set() allows the password to be changed
+
+	   By default the password is _L("")
+
+	13.Added the notifier functions:
+
+		TInt User::Notify(const TDesC& aLine1,const TDesC& aLine2,
+						  const TDesC& aBut1);
+		TInt User::Notify(const TDesC& aLine1,const TDesC& aLine2,
+						  const TDesC& aBut1,const TDesC& aBut2);
+		TInt User::Notify(const TDesC& aLine1,const TDesC& aLine2,
+						  const TDesC& aBut1,const TDesC& aBut2,
+						  const TDesC& aBut3);
+
+	   The function will attempt to connect to a server called
+	   __NOTIFIER_NAME (#define in E32SVR.H) and then send a message
+	   ENotifierNotify with P0() pointing to a TPckgBuf<TNotifyInfo>.
+	   It is allowable for iButton[1] or iButton[2] to be NULL in which case
+	   one, two or three button should occur in the dialog. If aBut1
+	   is picked then 0 is returned, 1 for aBut2 and 2 for aBut3. Any
+	   other error such as their being no Notifier or a result being
+	   wrong will result in a return of KErrGeneral.
+		14.Added Mem::Move() which has the same API as Mem::Copy(). Move()
+		   assumes that src and trg are 2^2 aligned and that aLength is a
+		   multiple of 4.
+		15.Added a new time interval TTimeIntervalShortMicroSeconds
+		   which is an interval in micro seconds but stored in a 32
+		   integer. This is the new interval when specifying After()
+		   delays. Note that I have left the low level kern services
+		   in ticks for now.
+		16.Renamed
+			   RTimer::After() to RTimer::AfterInMicroSeconds()
+			   CTimer::After() to CTimer::AfterInMicroSeconds()
+			   User::After() to User::AfterInMicroSeconds()
+			   CPeriodic::Start() to CPeriodic::StartInMicroSeconds()
+		   to aid the conversion to the new interval. When converting
+		   just multiply the value being passed originally by 100000
+		   which is ofcourse the number of microseconds in a tenth of
+		   a second.
+		17).RSessionBase::CreateSession() and
+			RSessionBase::SetRetry() both take a
+			TTimeIntervalShortMicroSeconds as the the delay interval.
+		18).Fixed mnt.cmd by adding %_F32VER% as the second parameter
+			of all recursive getXXX calls to fix defect HA-121 reported
+			by DavidW.
+		19).Made the Timer services TicksToTenths() a bit easier to
+			implement and OneShot() timing slightly more accurate.
+
+2) Geert
+
+		1. Removed CArrayFixBase::DestroyAll(). Use the new
+		CArrayPtr<T> class template instead. (See below.)
+
+		2. Added support for objects that can only ever
+		live inside an array. E.g. support for a variable
+		array of TBufC<100000>, where the elements are just
+		big enough to contain the actual data in the
+		buffer.
+
+		CArrayFix<T>::ExpandL(TInt anIndex) opens up a slot
+		at anIndex by shifting the elements after anIndex
+		and returns a reference to the new element. The new
+		element is constructed in place.
+		ArrayFix<T>::ExtendL() is equivalent to ExpandL(Count()).
+		CArrayVar<T>::ExpandL(TInt anIndex,TInt aLength)
+		opens up a slot of size aLength at anIndex by and
+		is otherwise the same as the fixed record case.
+		CArrayVar<T>::ExtendL(TInt aLength) is equivalent
+		to ExpandL(Count(),aLength).
+
+		3. Added repeated insertion and re-sizing functions
+		to CArrayFix.
+
+		CArrayFix<T>::InsertL(TInt anIndex,const T& aRef,TInt aReplicas)
+		inserts a copy of aRef, aReplicas times.
+		CArrayFix<T>::ResizeL(TInt aCount)
+		extends or shrinks the array as needed for it to
+		contain aCount elements. Any new elements are
+		bitwise copies of a default-constructed T.
+		CArrayFix<T>::ResizeL(TInt aCount,const T& aRef)
+		extends or shrinks the array like ResizeL(TInt).
+		New elements, however, are bitwise copies of aRef.
+
+		NB. As a result of these changes, the element type
+		has to have an accessible default constructor. If
+		you have a CArrayXxx<TYyy>, and some custom
+		TYyy::TYyy(TZzz aZzz) exists, a TYyy::TYyy() will
+		have to be added. A knock-on effect is that C-style
+		arrays can no longer be supported as element types.
+
+		Note that array elements are still bitwise copies,
+		and will be Mem::Copy()-ed around during their
+		lifetime. Having the constructor called merely
+		guarantees that they'll be bitwise copies of a
+		properly constructed object, rather than random
+		garbage. In keeping with this, array functions may
+		construct instances of the element types, but they
+		will never destroy them. Element types need not
+		have an accessible destructor.
+
+		4. Changed CArrayXxx::InsertIsqL() and added the
+		new funcion InsertIsqAllowDuplicatesL()
+
+		CArrayFix<T>::InsertIsqL(const T& aRef,TKeyArrayFix &aKey)
+		and
+		CArrayFix<T>::InsertIsqAllowDuplicatesL(const T& aRef,TKeyArrayFix &aKey)
+		return the new element's index.
+		InsertIsqL() leaves with KErrAlreadyExists if a
+		duplicate is discovered, and
+		InsertIsqAllowDuplicatesL() inserts the element
+		after any duplicate. The existing InsertIsqL(),
+		returning KErrNone or KErrAlreadyExists, and taking
+		a TAllowDuplicates argument is withdrawn.
+		In the case of variable-element arrays, the
+		signatures are
+		CArrayVar<T>::InsertIsqL(const T& aRef,TInt aLength,TKeyArrayFix &aKey)
+		and
+		CArrayVar<T>::InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayFix &aKey).
+
+		Note that the meaning of InsertIsqL()'s return
+		value has changed and care should be taken when
+		porting.
+
+		5. Almost all the array manipulation functions in
+		CArrayXxxBase have become public. This is to allow
+		code to operate on incoming (typed) arrays in a
+		type-independent way. It can be argued this reduces
+		type-safety and encapsulation, but the most
+		important thing is to guard against accidental
+		misuse. This is done by providing typed functions
+		in the template classes overriding--and hiding--all
+		the unsafe functions.
+
+		6. Added functions CArrayXxx<T>::At(TInt anIndex).
+		They are synonymous with CArrayXxx<T>::operator[]()
+		and serve to hide the At() functions in the base
+		classes.
+
+		7. Added CArrayFix<TAny>, CArrayFixFlat<TAny> and
+		CArrayFixSeg<TAny> as well as CArrayVar<TAny> and
+		CArrayPak<TAny>. They are hand-crafted and somewhat
+		restricted instances of the templates, for those
+		who wish to use a generic array; e.g., as a member
+		of the base class in a template pair. In the case
+		of CArrayFixXxx<TAny>, the record length is
+		specified as a constructor parameter.
+
+		8. Added functions CArrayXxx::AppendL(), Find(),
+		FindIsq() and InsertL() taking a reference to T
+		instead of a pointer. People wishing to switch to
+		the reference-based API may define the macro
+		__ARRAY_NO_PTRS__, which will hide the
+		pointer-based versions.
+
+		9. Added class template CArrayPtr<T> extending
+		CArrayFix<T*>'s interface with a ResetAndDestroy()
+		function. The function is intended as a type safe
+		replacement for CArrayFix<CBase*>::DestroyAll().
+		It is equivalent to a loop delete-ing all (pointer)
+		elements, followed by Reset().
+
+		10. CBufBase::ExpandL(TInt aPos,TInt aLength) makes
+		room for aLength bytes at aPos. The new contents
+		are undefined. InsertL(Pos,aPtr,aLength) is
+		equivalent to ExpandL(aPos,aLength) followed by
+		Write(aPos,aPtr,aLength).
+
+		11. CBufBase::ResizeL(TInt aSize) expands or
+		deletes from the buffer at the end so that its
+		Size() becomes equal to aSize. Not to be confused
+		with CBufFlat::SetReserveL, which has no effect on
+		the logical size of the buffer.
+
+		12. CBufFlat::Capacity() reports the size the
+		buffer can grow to without reallocation. The buffer
+		insertion functions are guaranteed not to leave
+		until the buffers Size() reaches or exceeds its
+		Capacity(). A flat buffer's capacity is changed
+		using SetReserveL().
+
+		13. Removed the global new operator taking a base
+		pointer and check size; ie., TAny* operator
+		new(TUint aSize,TAny* aBase,TInt aCheckSize)
+
+		Making sure at runtime that the allocated size is
+		he same as the supplied buffer size is not a very
+		common requirement. As it turned out, size checking
+		was really only required for RHeap and derived
+		classes. Supplying it with a custom RHeap::operator
+		new(), as is now the case, is actually a cheaper
+		solution.
+
+		14. Added zero-filling versions of the full set of
+		available global new operators to CBase and removed
+		CBase's delete operator.
+
+		The delete operator was there only as a workaround
+		for a problem with the Visual C++ linker. The
+		problem appears to be fixed in Visual C++ 4.0, so
+		there is now no point in having the operator.
+
+		15. Added pragma's disabling Visual C++ warnings to
+		do with the generation of copy constructors and
+		assignment operators to <e32def.h>.
+
+		16. Added private, undefined copy constructors and
+		assignment operators to CBase. Copying and
+		assignment of CBase-derived classes is now
+		prohibited by default.
+
+3). Graham
+	1. Various keyboard changes.
+
+		2. Added HAL set and sense functions. Most are not
+		yet implemented but will be in 059.
+
+4). Steve
+	1. Debugger:
+	Further improvement and additions to the debugger classes and the Gdb stub.
+	Still no bug fixes back form Cygnus to allow source level debugging using
+	Gdb. Added support for multiple thread debugging, and allowing breakpoints
+	to be set in ROM which effect the threads you specify rather than all
+	threads. Finalised the API for the RDebug class which is used by any
+	debugger or debug stump program. Full details of the E32 debugger class
+	currently in R:\E32\DOCS\RDEBUG.DOC.
+
+	2. Key translator:
+	Fixed the bug where the modifier status wasn't updated on a modifier key
+	down - it was updated on the next key up or down.
+
+5). Jane
+		1. Removed saving and restoring of fs & gs in interrupt code to speed up
+		X86 version of EPOC.
+
+		2.Added support for debugger in finding code address of target processes.
+		Added MMU functions to support debugger in shadowing ROM. (Both untested).
+
+		3.Added process cleanup code to fix process logon - but left it commented
+		out due to time pressure in meeting API freeze. Will be tested and in
+		place in 059.
+
+		4.Added start of code supporting process and dll loading from RAM, and
+		added dummy APIs for future additions to this. Rationalised kernel
+		LoadLibrary functions.
+
+		5.Fixed stack scribble in runThread, which was causing an incorrect
+		return status to be given to logging threads.
+
+6). Roger
+	Serial LDD reliability improved. Fixed double completion bugs.
+
+	Eiger Serial PDD. Turned interrupts off during initial fifo priming.
+
+	Etna Serial PDD. Written not able to test due to a (suspected) kernel bug.
+
+		Further changes to the serial drivers as of Sat 4th May given
+		to Colly.
+
+7). Matthew
+	Preliminary sound Ldd and Pdds for Wins and Eiger. Currently the Wins PDD
+	pretends to play by making random beeps for the appropriate length of time
+	and pretends to record aLaw data by filling a bufer with silence in the
+	appropriate time. The Eiger PDD just plays silence.
+
+8). Pete
+	Improvements to Pc Card Controller and its user interface.
+
+	Simulation of Media Change using F5 key added to WINS (commented out for
+	now).
+
+Version 0.01.057
+================
+(Made by Graham, Friday 19th April)
+
+1) Graham
+		1. Implemented MNT ARMALL, ARM, ARMDEB, ARMREL, ARMUDEB, ARMUREL
+		   BTSTARMALL, BTSTARM, BTSTARMDEB, BTSTARMREL, BTSTARMUDEB,
+		   BTSTARMUREL.
+
+		2. Fixed bugs in BMARM\XDUMM.MAK, XKEYB.MAK, and XXYIN.MAK
+
+		3. Fixed F32\BMARM\ESHELL.MAK to vary name according to
+		   build - ESHELL.EXE, ESHELLD.EXE, ESHELLU.EXE, ESHELLUD.EXE
+
+		4. Updated ARM Rom building system to build debug and unicode
+		   roms as well.
+
+		5. Ensured O/S and test programs build in DEBUG and UNICODE
+		   as well as RELEASE mode.
+
+		6. Removed redundant LCD contrast handling from
+		   VARMPR\VA_KEYB.CPP
+
+		7. Added KE_ETNA.CPP with the help of Roger and Peter.
+
+		8. Rationalised variant system, allowing for three MARM
+		   variants. Each variant for a given architecture has a
+		   two character mnemomnic:
+
+				PB      Protea rack B
+				PC      Protea rack C
+				P1      Protea version 1
+
+		   Each variant has an E32\ sub-directory:
+
+				\E32\VARMPB
+				\E32\VARMPC
+				\E32\VARMP1
+
+		   Each must contain a VA_CUST.CPP which implements class
+		   Custom and produces an ECUST.DLL which the kernel links to.
+		   These ECUST.DLL's are called CARMPB.DLL, CARMPC.DLL, and
+		   CARMP1.DLL until one of them is selected to become
+		   ECUST.DLL in the ROM.
+
+		   They must also include keyboard or pointer device
+		   implementations (VA_KEYB.CPP and VA_XYIN.CPP) which
+		   create CAKYPB.DLL, CAKYPC.DLL, CAKYP1.DLL (Arm keyboard
+		   DLL's) and CAXYPB.DLL, CAXYPC.DLL, CAXYP1.DLL (Arm XY
+		   input device DLL's).
+
+		   Normally, they will also include a VA_HW.CPP which
+		   implements variant-specific hardware functionality. These go
+		   on to produce the variant dll's VARMPB.DLL, VARMPC.DLL,
+		   and VARMP1.DLL. Physical Device drivers (which are intrinsically
+		   Variant-level entities) and custom dll's might want to
+		   link to these DLL's, but the kernel cannot.
+
+		   They will also contain PDD source.
+
+		   The upshot of this is that .OBY files have to change.
+
+		   A typical Protea Rack B .OBY file will begin:
+
+		   romname=arompb.img
+		   version=0.01
+		   bootbinary=c:\work\emarm\bootrom.bin
+		   romsize=0x400000
+		   romlinearbase=0x50000000
+		   romalign=0x1000
+		   kerneldataaddress=0x80100000
+		   kernelstackaddress=0x80000000
+		   kernelheapmin=0x10000
+		   dataaddress=0x400000
+
+		   files=
+		   primary=c:\work\emarm\ekern.exe sys\ekern.exe
+		   file=c:\work\emarm\euser.dll sys\euser.dll
+		   file=c:\work\emarm\elocl.dll sys\elocl.dll
+		   secondary=c:\work\emarm\efile.exe sys\efile.exe
+		   file=c:\work\emarm\efsrv.dll sys\efsrv.dll
+		   file=c:\work\emarm\elocal.fsy sys\elocal.fsy
+		   file=c:\work\emarm\ewsrv.exe sys\ewsrv.exe
+		   file=c:\work\emarm\econs.dll sys\econs.dll
+		   file=c:\work\emarm\edisp.dll sys\edisp.dll
+		   file=c:\work\emarm\varmpb.dll sys\varmpb.dll
+		   file=c:\work\emarm\carmpb.dll sys\ecust.dll
+		   file=c:\work\emarm\cakypb.dll sys\ekeyb.dll
+		   file=c:\work\emarm\caxypb.dll sys\exyin.dll
+		   file=c:\work\emarm\ektran.dll sys\ektran.dll
+		   file=c:\work\emarm\ekdata.dll sys\ekdata.dll
+		   file=c:\work\emarm\eshell.exe sys\eshell.exe
+
+		   A typical Protea Rack C .OBY file will begin:
+
+		   romname=arompc.img
+		   version=0.01
+		   bootbinary=c:\work\emarm\bootrom.bin
+		   romsize=0x400000
+		   romlinearbase=0x50000000
+		   romalign=0x1000
+		   kerneldataaddress=0x80100000
+		   kernelstackaddress=0x80000000
+		   kernelheapmin=0x10000
+		   dataaddress=0x400000
+
+		   files=
+		   primary=c:\work\emarm\ekern.exe sys\ekern.exe
+		   file=c:\work\emarm\euser.dll sys\euser.dll
+		   file=c:\work\emarm\elocl.dll sys\elocl.dll
+		   secondary=c:\work\emarm\efile.exe sys\efile.exe
+		   file=c:\work\emarm\efsrv.dll sys\efsrv.dll
+		   file=c:\work\emarm\elocal.fsy sys\elocal.fsy
+		   file=c:\work\emarm\ewsrv.exe sys\ewsrv.exe
+		   file=c:\work\emarm\econs.dll sys\econs.dll
+		   file=c:\work\emarm\edisp.dll sys\edisp.dll
+		   file=c:\work\emarm\varmpc.dll sys\varmpc.dll
+		   file=c:\work\emarm\carmpc.dll sys\ecust.dll
+		   file=c:\work\emarm\cakypc.dll sys\ekeyb.dll
+		   file=c:\work\emarm\caxypc.dll sys\exyin.dll
+		   file=c:\work\emarm\ektran.dll sys\ektran.dll
+		   file=c:\work\emarm\ekdata.dll sys\ekdata.dll
+		   file=c:\work\emarm\eshell.exe sys\eshell.exe
+
+		9. Enhanced the KBARM\ rom building system to allow for the
+		   production of all three variant ROMs.
+
+		10. Fixed spurious Pen Up events on the digitiser.
+
+		11. Added GETSRC verb to MNT.CMD
+
+2) Morgan
+		1. Completed DEVICE/DRIVER name changes to LDD/PDD.
+
+		2. Added operator++() to TTimerLockSpec
+
+		3. Added TTimerLockSpec User::LockPeriod(). This returns which
+		   of the TTimerLockSpec periods the clock is currently in.
+
+3) Jane
+		1. Fixed some problems with the new chunk sheme, notably to do with
+		   closing EPOC chunks.
+
+		2. Added a new debug only build of the .def files for X86.
+
+		3. Added MMU support for both kernel growth (contigous in linear and
+		   high physical memory) and RAM drive growth (contigous in linear
+		   and low physical memory) - moving other people's pages and page
+		   tables out of the way if necessary. Added TMMU test code to test
+		   these situations.
+
+		4. Added a new function to the bit map allocator
+		   AllocFromTopFrom(TInt aPos) which returns the
+		   next free page after the one specified. Tidied
+		   up AllocFromTop() a bit while I was at it.
+
+4) Colly
+		1. Added User::PageSize() to return the current machine page size.
+
+		2. Renamed RHeap::Destroy() to RHeap::Close().
+
+		3. Implemented heap sharing for heaps in chunks by having it heaps
+		own and use an RCriticalSection as well as supporting access counting.
+	The function TInt RHeap::Open() should be used to open a heap for
+	sharing which increases the access count. A subsequent RHeap::Close()
+	will decrement the access count but the heap will only be discarded
+	if the access count	goes to zero. The static function User::ChunkHeap
+	includes the call to Open(). Fixed address heaps cannot be shared and
+	calls to Open() will be panicked.
+
+	The heaps which are created when a thread is created and which can be
+	retrieved with a call to User::Heap() should not be closed with a call
+	to Close() since the chunk in which the heap is created contains the
+	threads stack as well as the heap. If Close() is called the thread will
+	be panicked. The constanst RHeap::EChunkStack for the heaps type indicate
+	this kind of a heap, while RHeap::EChunkNormal indicate a heap created
+	with User::ChunkHeap(). Type EChunkSupervisor will never be seen
+	by an user mode code.
+
+	A thread is usually created with its own heap, but it can also be
+	created to use either the current thread's heap or a heap already
+	created. To use the current threads heap:
+
+	RThread t;
+	TInt r=t.Create(_L("Shared1"),threadEntryPoint,KDefaultStackSize,
+			 NULL,NULL);
+
+	The first of the TWO NULLs will cause the routine to share the
+	current threads heap. i.e. that returned by User::Heap().
+
+	To use a heap already created:
+
+	RHeap* pH=User::ChunkHeap(_L("Share"),User::PageSize(),0x100000);
+	test(pH!=NULL);
+	RThread t;
+	TInt r=t.Create(_L("Shared1"),threadEntryPoint,KDefaultStackSize,
+			 pH,NULL);
+
+	NOTE: In either case above the Heap will be opened and closed
+	internally so you need not provide any cleanup. If you no longer
+	wish to retain your copy of the heap in the example above after the
+	new thread has been created then you can call pH->Close().
+
+	Finally note that if thread1 creates thread2 to share its heap and
+	then exits thread1's chunk will remain in existence until such time
+	as thread2 exits. This is so since thread2's heap is now in thread1's
+	chunk. Such are the joys of sharing heaps.
+
+		4. Full automated heap growth is now implemented as is RHeap::Compress().
+	If the adjust to the heaps chunk fails the the kernel server will be
+	called to attempt to compress all heaps known to the kernel. When
+	completed a further attempt will be made to adjust the chunk so that
+	the heap can grow. Remember that a heap will never be compressed
+	below its minimum size and that heaps can onlybe compressed if they
+	have free space at the top of the heap.
+
+		5. Added a default argument TOwnerType aType=EOwnerProcess to most
+	of the operating system types CreateLocal(),CreateGlobal() and
+	Open() functions. Because of the default paramter this change is
+	seamless all current programs. The meaning of TOwnerType is to
+	indicate whether the resulting RObject is owned by the Process or
+	the Thread. Owned by the Process has been the only behaviour allowed
+	until this change. EOwnerThread will make the thread the owner of the
+	handle. The effect of being owner by the thread is that when the
+	thread dies any handles owned by the thread and not closed, will be
+	closed automatically. Example of process ownership:
+
+			RLibrary lib;
+			test(lib.Load(_L("TESTDLL"));
+		//
+		// The library handle will be closed when the process exits
+		//
+			User::Exit(KErrNone);
+
+	Example of thread ownership
+
+			RLibrary lib;
+			test(lib.Load(_L("TESTDLL"),EOwnerThread);
+		//
+		// The library handle will be closed when the thread exits
+		//
+			User::Exit(KErrNone);
+
+		NB. Although the addition of TOwnerType arguments to the
+		appropriate function calls has been made, EOwnerThread-type
+		services have not yet been implemented. This change merely
+		prepares the way for such an implementation.
+
+		6. Implemented the full and correct naming strategy for
+		objects in the base.
+
+		7. The test DLLs T_START1.DLL, T_START2.DLL and T_START3.DLL were
+	all using a WIN32 function GetTickCount() to delay their startup
+	which was preventing them from being used as a test under Epoc/32.
+	Changed to use User::TickCount() and removed Kernel32.lib from
+	the link dependencies.
+
+5) Gillian
+
+		1. Added TDateTime::SetYear() etc functions (Brendan's
+		accepted proposal E32.51 TDateTime setting functions)
+
+		2. Added TTime::- and TTime-= functions for all TTimeInterval classes
+		(Richard Knights accepted proposal TTime should define operators -
+		and -=)
+
+		3. Extended TTime::DateTime() function to deal with BC dates
+
+		4. Added tests for all the above and tidied the test code up a
+		little.
+
+6) Roger
+		1. Implemented DFcs under WINS. This allows us to use DFCs
+		from the serial LDD rather than the non WINs PDD. This gives
+		much more reliability under WINs and improved throughput under
+		MX86 and MARM.
+
+7) Steve
+		Key Translator:
+		1) Added new modifier EModifierPureKey, which is set when a
+		   ctrl-key combination does not alter the keycode (basically
+		   any key other than Space,A-Z which return 0 to 26 respectively)
+
+		2) Fixed bug so that ctrl-space returns a NULL key press
+		   rather than being thrown away
+
+		3) TPattern enums moved into E32SVR.H for use by wserv
+
+		Debugger:
+		4) Removed the Gdb stub from the E32 kernel
+
+		5) Added Debug and RDebug classes. Debug is on the Kernel side
+		and provides debugging functions for RDebug on the user side.
+		A user mode debugger or stub opens a channel to RDebug and
+		can then debug one or more threads. The RDebug class provides
+		functions for Single-stepping, setting breakpoints,
+		reading/writing memory and reading/setting of register
+		values. Watching of memory addresses will be provided
+		in a later release
+
+		6) Added 'TInt iDataSize' into DPlatProcess for use by the Debug
+		class for returning the Bss address of a Process
+
+		7) Simple program written to run on the rack which waits for
+		any thread to panic and then displays what has panicked
+		and why
+
+		8) Gdb stub written which communicates between RDebug and Gdb
+		running on a remote host PC. Currently the Gdb stub only copes with
+		debugging one thread at a time, and due to problems with Gdb itself,
+		only limited debugging facilities are available.
+
+8) Pete
+		1. Added PC Card Controller to WINS and MARM.
+
+9) NOTE to shared chunk users (FBSERV etc). Support for read-only
+		shared chunks has been withdrawn. Although the API remains, all
+		shared chunk users should ONLY open for read/write.
+
+
+Version 0.01.056
+================
+(Made by Morgan, Sometime soon)
+
+1) Matthew
+	Bug fixes:
+	HA-81: In Wins if a E32Dll returns an error this is now correctly
+	detected.
+	HA-58: (Just in time debugging added for Kernel Panics) fixed in
+	KSRC\KS_UTL.CPP
+	HA-62: (Flat buffers not compressed when cleared) fixed in
+	UBAS\UB_BUF.CPP.
+	HA-82 (ReadCancel() doesn't complete TRequestStatus) fixed in
+	WSRC\WS_WIN.CPP, tested in T_WSIMP.CPP.
+	HA-73, HA-74, HA-61, HA-52,58,61,62,69,73,74,81,82.
+
+2) Rog
+	Added:
+	IMPORT_C void CActive::SetPriority(TInt aPriority);
+	inline TInt CActive::Priority();
+	SetPriority() will panic if the AO is active when it is called.
+
+3) SteveT
+	1: Added:
+	TBool TRegion::Contains(const TPoint &aPoint);
+	Simply returns True if the point is contained within the region,
+	False if not.
+
+	2. Added a new template class RRegionBuf<N>
+	This is a cross between the two existing variants of the TRegion
+	class, it's black box spec is identical to the RRegion class, you
+	can have unlimited size regions but have to check for errors, but
+	a buffer big enough to hold <N> rectangles is included with the
+	RRegionBuf structure, this is used until it is full up when a
+	cell will be allocated and the whole rectangle list copied into
+	the allocated cell, the region will not revert back to using the
+	buffer even if it shrinks small enough fit.
+
+	These regions are chiefly designed to be used as temporary work
+	space on the stack where they will save a lot of calls to alloc
+	for trivial rectangle lists. Using these for long term region
+	storage would be inefficient as when the buffer overflows it is
+	left lying around empty wasting memory.
+
+	3. After calling Close() the region can safely be reused, before
+	it was left in a dangerous state with a pointer to the old freed
+	cell.
+
+4) Jane
+	Changed EPOC to the new process relative chunk strategy. Under
+	this scheme, the process now owns a chunk, which contains the
+	.data and .bss (zero-filled data) sections. Each additional
+	thread now only has one chunk minimally, which contains its stack
+	and heap. This scheme saves on resources, and will allow the
+	process to live on if the main thread dies, a change I intend to
+	make later on.
+
+	Added support for shared chunks in EPOC. A global chunk - one
+	created with RChunk::CreateGlobal() - can be shared by other
+	processes/threads if they do an OpenGlobal() of the same chunk,
+	by name.
+
+	WARNING! The latter change has necessitated api changes in
+	RChunk, detailed below.
+
+	1. The Create functions have gained an extra parameter, as shown.
+
+	IMPORT_C TInt CreateLocal(TInt aSize,TInt aMaxSize);
+	IMPORT_C TInt CreateGlobal(const TDesC &aName,TInt aSize,TInt
+								aMaxSize);
+
+	The new parameter, aSize, is the number of bytes to initially
+	commit to the chunk. IT IS NO LONGER NECESSARY TO ADJUST A NEW
+	CHUNK - it will be adjusted to aSize on creation.
+
+	2. OpenGlobal has gained an extra parameter, as shown below.
+
+	IMPORT_C TInt OpenGlobal(const TDesC &aName,TBool isReadOnly);
+
+	The new parameter, isReadOnly, specifies whether the sharing
+	process wants readonly access to the chunk. Thus it is now
+	possible for the creator of a chunk to have read/write access to
+	it, but for others who share that chunk to be denied that
+	priviledge.
+
+	3. As mentioned, it is now unnecessary to adjust a newly created
+	chunk. It will be adjusted to aSize bytes on creation.
+
+5) Colly
+		1. Added Registry and Environment services
+
+6) Graham
+		1. All release mode tests run on MARM
+
+		2. Enhanced the MARM build to include DEBUG and UNICODE modes.
+
+		3. Enhanced the Eiger Text Display Deiver to switch between
+		   1bpp, 2bpp, and 4bpp modes.
+
+		4. Text Window server allows CTRL-ALT-1, CTRL-ALT-2,
+		   CTRL-ALT4 to switch display modes. The rack now boots up
+		   in 2bpp.mode.
+
+		5. Released BOOTROM.BIN. It boots the rack in 2bpp mode, so
+		   the same .BIN file may be used for Text Window Server and
+		   Graphics Window Server ROM's.
+
+		6. Added -fno-implicit-templates to the MARM builds and
+		   removed -fvtable-thunks.
+
+7) Peter
+		1. Added proto-ramdrive.
+
+
+Version 0.01.055
+================
+(Made by Morgan, 18 March '96)
+
+1). NickT,
+	TLex??. I have added two new classes TLexMark8 and TLexMark16 and
+	the obvious typedef TLexMark. These classes are used to record or
+	mark a positon in a TLex, hence
+		TLex8::Mark(TLexMark8& aMark)
+	which can be followed by, e.g.
+		TLex8::UnGetToMark(TLexMark8& aMark).
+	By and large, wherever there was a TLex?? member function which
+	used the internal mark, e.g. SkipSpaceAndMark, there is a new
+	member which is passed a TLexMark?? or reference to one.
+	I have retained the internal mark iMark, changing it to a
+	TLexMark, and all the existing member function remain, usually as
+	an inline function which passes the internal mark to the general
+	member function.
+	The TLex??::Val() members no longer use the internal mark to
+	recover from errors but use an automatic TLexMark?? constructed
+	within the function.
+
+	T???Que(Base). I have added a member function Reset() to the Sgl,
+	DBl and Delta ques which just resets the que to be empty (the
+	offset remains unchanged).
+
+	CArrayFix(Base)/CArrayVar(Base). I have added new member function
+	which over load the existing InsertIsqL members. The change is an
+	addition TInt& argument.
+	On returning from InsertIsqL, this is set to contain the position
+	within the array of either the new entry or, if the entry exists
+	and ENoDuplicates is passed, the position of the pre-existing
+	entry.
+
+2). Morgan,
+	Plat::TickCount on WINS fixed so 1 tick = 1/10th of a second.
+	CBufxxx::New is now CBufxxx::NewL.  The CArray classes have been
+	altered to use these.
+	CActiveScheduler made concrete and constructor made public.
+
+	Removed PopAndDestroyAll from TCleanupTrapHandler::Untrap which
+	now calls CCleanup::PreviousLevel().  This ASSERTS that the
+	cleanup stack's current level is empty.  All Pushes to the clean
+	up stack must be balanced with a Pop before the Trap unwinds
+	naturally.  +Test code.
+
+	Added PushL() and Pop() member functions to TAutoClose so they
+	can be pushed onto the cleanup stack and are closed automatically
+	on a leave.  +Test code.
+
+	Added TReal and TReal96 formating to TDes?::Format
+	New specifiers are:
+	%f(%F)	- format TReal(TReal96)  (was padding)
+	%e(%E)	- format TReal(TReal96) using exponent format
+	%g(%G)	- format TReal(TReal96) using general format
+	%p(%P)	- padding (used to be %f)
+	and
+	.n	- specify n decimal places
+
+	New thread test code, to test Suspend/Resume while the thread is
+	suspended on a semaphore.
+
+	Extended RTimer/CTimer with locked timers for synchronisation to
+	fractions of a second.
+
+	Included USERTYPE.DAT in the release.
+
+3). Jane,
+	Fixed Exc::Dispatch which was deferencing NULL in certain cases.
+	Fixed DLogonProcess derivation, which was incorrect under the new
+	single phase destruct.
+	Added kernel protection for bad handles in both kernel server and
+	executive. Now the user thread should get panicked for a bad
+	handle, rather than the kernel dying when dereferencing 0. Now
+	that this is in place, I would welcome reports of any remaining
+	kernel death due to bad parameters, so that we may tighten up any
+	remaining loopholes.
+
+	Fixed CObjectIx::At which was panicking rather than returning 0 in
+	certain circumstances.
+	Added CObjectIx::AtL which leaves on a bad handle.
+
+	Added low memory handling to the MMU, and enhanced test code to
+	test that there are no alloc heavens in low memory situations.
+	Note that the rem page allocator function FreeHomePage() now takes
+	a physical address as a parameter rather than a linear one.
+
+	Added a new type of executive service, EXECUTIVE_SLOW_CONFORMANT
+	(int 22h on x86), which allows certain carefully chosen kernel
+	services to go re-entrant (i.e. be called from another slow kernel
+	executive service). Match8 and Match16 have been changed to this
+	new type, so that Match can be called from Exec::ThreadNext and
+	friends, thus allowing find services to work on EPOC.
+
+4). Matthew,
+	Tiny change to T_CHUNK (x86): now assumes the executable is T_CHUNK
+	rather than TCHUNK, and the case used on the command-line is not
+	important.
+
+5). SteveG
+	Key translation:
+	================
+	Combined the keyboard translator files into two source files,
+	KY_TRAN.CPP and KY_CAPT.CPP.
+	These make up EKTRAN.DLL, which carries out translating the
+	scancodes into keycodes and modifiers and handles capture keys.
+	KD_MC400.CPP makes up the keyboard translator data dll
+	(EKDATA.DLL). Removed all .data from this DLL by copious use of
+	const.
+
+	Fixed the keytranslator so that modifier keys are returned as
+	EKeyNull.
+
+	CCaptureKey and CKeyTranslator are now defined in e32svr.h for use
+	by the Window Server. w32keyb.h and w32keyb.inl no longer exist.
+	In order to use the keyboard translator, theWindow Server must at
+	startup create a new CKeyTranslator, eg:
+	CKeyTranslator* KeyTranslator=CKeyTranslator::New();
+
+	The translate key function is defined as:
+	KeyTranslator->TranslateKey(TUint aScanCode, TBool aKeyUp, const
+			CCaptureKeys& aCaptureKeys, TKeyData& aKeyData)
+	and an extra function for obtaining the current modifier state
+	has been added:
+	TUint KeyTranslator->GetModifierState();
+
+	Key Modifiers
+	=============
+	EModifier enums are now defined in e32virt.h and are at the top
+	level. Anyone making use of 'TEvent::EModifierXxxxx' should
+	globally replace 'TEvent::EModifier' to 'EModifier'.
+	Removed the TModifier class. A normal TUint should be used in
+	place of TModifier, and anyone using the modifier functions
+	IsOn(), IsOff(), TurnOn() etc should do this using | and & etc.
+
+	E32 TEvents
+	===========
+	Changed the E32 TEvent structure, and renamed it TRawEvent. A
+	TRawEvent is passed to the Window Server, which will create a
+	TWservEvent as before. TRawEvent is defined in e32svr.h and no
+	longer includes the modifier state. The modifier state is added in
+	in the Window Server for events that require the modifer state,
+	rather than being worked out and passed around for every event
+	type.
+	Changed the event types. Mouse events have been removed and
+	replaced with EPointerMove and EButtonNDown/Up events. The new
+	event types, defined in e32svr.h are:
+	enum TType
+	{
+	ENone,
+	EPointerMove,
+	EKeyDown,EKeyUp,
+	ERedraw,
+	ESwitchOn,
+	EInactive,
+	EButton1Down,EButton1Up,
+	EButton2Down,EButton2Up,
+	EButton3Down,EButton3Up
+	};
+
+	Changed all occurences of TEvent and TEventBuf to TRawEvent and
+	TRawEventBuf respectively in the E32 source and header files.
+	Changed Event.Set() and RawEvent copy constructors etc so they no
+	longer use the shiftState.
+
+6). Colly,
+	Changes required to implement the proposal to give DLLs a globally
+	unique identifier (GUID) which can be checked before trying to
+	call any of the functions in the DLL. It adds two functions to
+	RLibrary as well as adding the concrete data type TGuid. Included
+	is a test program T_GUID along with a test DLL T_UID, all of which
+	live in TBAS. I have also fixed bugs in the .MAK files for EKTRAN
+	and EKDATA.
+
+	A new version of t_romg.cpp which was broken by changes to
+	TDes?::Format() (i.e. changing %f to %p for padding).
+
+7). Jal,
+	Added methods to CSession:
+	IMPORT_C void ResourceCountMarkStart();
+	Panics client if CountResources returns KErrGeneral
+	IMPORT_C void ResourceCountMarkEnd();
+	Panics client if CountResources != iResourceCountMark
+	IMPORT_C virtual TInt CountResources();
+	Default implementation returns KErrGeneral
+
+
+Version 0.01.054
+================
+(Made by Morgan, 23 Feb '96)
+
+1). Colly
+	Removed two phase destruction. Note that all objects derived from
+	CActive must call Cancel() in their destructors. Note that
+	Adt::Destroy() has disappeared (replace with delete).
+	The class TAggregate depended on Adt::Destroy(), so it has
+	also disappeared (I don't think anyone was using it anyway).
+
+	Renamed E32ADT.H to E32BASE.H and the project UADT and TADT to
+	UBAS and TBAS. Decided not to include E32BASE.H in E32STD.H as
+	anyone can include E32BASE.H directly and achieve the same effect.
+
+	Removed all TBuf_10, TBuf_20 etc variants.
+
+2). Jane
+	Added an extra flag to TModifier: EModifierDoubleClick=0x00800000
+
+	Fixed DLogons which were writing back the wrong status into the
+	logged thread. The net effect being that now when you try to run a
+	program which doesn't exist, you don't crash the OS.
+
+	Added the window server to the dll startup scheme so that the font
+	server can be started before it. Look at wsrc\ws_utl.cpp to see
+	E32's window server startup code.
+
+	Added thread relative handles for DServer, DSession and client
+	DThread in server DThread. This was necessary for proper cleanup
+	of sessions when server and client threads died. It has the
+	side-effect of making the WINS implementation much more like the
+	EPOC one - and will show up any bugs where sessions are used from
+	another thread.
+
+	Added the Window Server to the dll startup scheme so that the font
+	server can be started before it.
+
+	Fixed bug in CObjectIx::Destruct(), HA-19.
+
+3). Matthew
+	Changed the base to use the new CServer/CSession with ServiceL in
+	CSession insted of CServer. The new versions of CSession and
+	CServer are now what used to be called CNewSession and CNewServer.
+	The windows server and test code use this new scheme.
+	If you have your own server/session then to convert you must
+	replace your CServer::ServiceL(RMessage&,CSession&) with a
+	CSession::ServiceL(RMessage&). In addition, if you have supplied
+	a CSession::CreateL() it should now be a
+	CSession::CreateL(CServer&).
+
+	Made TSglQueLink::Enque() private and TSglQueBase a friend of
+	TSglQueLink. Removed calls to Enque in T_SQUE.
+
+	Fixed X86 chunk routines. Additionally, changed WINS so that if
+	you try to create a chunk of negative/zero size it returns
+	KErrArgument instead of KErrGeneral.
+
+4). SteveG
+	This change affects the Window Server:
+	Changed TKeyTranslator::TranslateKey(). It no longer accepts a
+	TModifier as the second parameter. This function now takes care of
+	working out and storing the current key modifier states.
+	Now implemented as:
+	TBoot TKeyTranslator::TranslateKey(TUint aScanCode, TBool aKeyUp,
+		const CCaptureKeys& aCaptureKeys, SKeyData& aKeyData);
+
+	Altered \wsrc\ws_main.cpp and \wsrc\keytran.h accordingly, and
+	altered keytran.cpp to work out the key modifier states from the
+	supplied scancodes.
+	The keycode translator is now part of E32 as two DLL's: EKDATA.DLL
+	and EKTRAN.DLL.
+
+	Added the stub for the Gdb debugger. This adds two classes, Gdb
+	and ImpGdb. Class Gdb handles the communication protocol to the
+	remote PC running the debugger. The ImpGdb class handles all the
+	implementation specific functions such as returning register
+	values, setting breakpoints and the sending and receiving of data
+	packets to the remote PC.
+
+	Altered \e32\kex86\ke_int.cpp to pass control to the Gdb stub when
+	a breakpoint or single step trap occurs, and \e32\kearm\ke_int.cpp
+	to pass control to the Gdb stub when an undefined instruction is
+	executed.
+
+5). Morgan
+	Fixed thread cleanup code to cancel the threads timer if it had
+	not completed when the thread died.  Previously the destructor was
+	attempting to close it after the thread's heap had been removed.
+
+	Made TInt64A::Cmp into a signed compare.
+	Fixed the DivMod function and other small fixes to get TInt64 code
+	running on the rack.
+	TInt64 operator >> now does an ASR.  TInt64::Asr() has become
+	TInt64::Lsr()
+
+	Alloc fail tool changes:
+	__xHEAP_FAILNEXT(n) now fails once on the nth mem alloc.
+	CTimer::Create has become CTimer::ConstructL.
+	CActiveScheduler is now concrete.
+
+6). Graham
+	Incorporated ARM E32 - find GCC porting guide in 'Protea Software Design'.
+	Modified test programs so that they build under gcc.
+	Added digitiser code (XYIN) and general ADC control code.
+	Added compiler support functions for software floating point.
+	Added 'float' conversion routines to UM_R96.CPP
+	Removed data from ELOCL.DLL by appropriate use of const in LSRC\*.CPP
+
+	**** WARNING TO SERVER WRITERS ****
+
+	CSession::CreateL(CServer& aServer) has changed to
+	CSession::CreateL(const CServer& aServer)
+
+	This is a virtual function. If you supply your own version of this
+	function, then be sure to change its prototype. If you don't then you won't
+	get a compiler warning, but your program won't work any more.
+
+
+Version 0.01.053
+================
+(Made by Morgan, 29 Jan '96)
+
+1).	Matthew
+	Removed all trace of the old date\time classes.
+
+	\E32\TCDT\T_FIND, which tests the find handles.
+	There's also a modified version of \E32\TCDT\T_KERN.CPP, which has had it's
+	brief TFindXxxx tests expanded to include the ones it previously missed out.
+
+2).	SteveT
+	I'm just putting keyboard repeats into the window server. I've put this change
+	into \E32\KPWINS\KP_GUI.CPP to block windows auto repeats from getting
+	through.
+
+	line 169:
+	case WM_SYSKEYDOWN:
+	case WM_KEYDOWN:
+	if (!(HIWORD(lParam)&KF_REPEAT))
+		{
+		v.Set(TEvent::EKeyDown,PP::Sca....
+		Kern::AddEvent(v);
+		}
+	break;
+
+	Another change to KP_GUI.CPP to get the keyboard repeats going properly. This
+	adds a new TEvent type EInActive that informs me when the E32 window has lost
+	focus, the change I've done is as below.
+
+	case WM_ACTIVATE:      // line 207
+	if ((lParam&0xFFFF)==WA_INACTIVE)
+		{
+		v.Set(TEvent::EInActive);
+		Kern::AddEvent(v);
+		}
+	break;
+	case WM_CHAR:
+
+	I'm not sure if this the best solution, presumably for completeness there
+	should be an EActive event as well, or add a true/false parameter to the event
+	to say whether it's an active or inactive message.
+	Of course on the real machine these events will never be used but I don't see
+	that as a problem.
+
+3).	Morgan
+	Serial drivers for X86 and Eiger platforms.
+	TLinearSectionRam::CreateRegion now rounds the committed size argument to page
+	size before calling Map.
+
+4).	Natascha
+	Character set conversion.
+	New test code (t_chset, t_chset2, t_chcon) for Unicode build
+
+5).	Jane
+	Added User::SetDebugMask to allow the setting of the trace mask around
+	important sections of code.
+
+	Fixed various DSession closing and CServer bugs, including HA-51. EPOCX86 can
+	now run a test program more than once!!
+
+	Fixed a process creation bug.
+
+
+Version 0.01.052
+================
+(Made by Matthew, 16 Jan '96)
+
+1). Matthew
+	Modified the kernel to use the new date/time classes internally. This includes
+	the addition of new overloaded functions duplicating old ones. This should not
+	effect the external interface except in a few cases, where some functions have
+	been renamed XxxOld().
+
+	In release 053 the old functions will be removed and some data members will be
+	changed to the new date/time classes.
+
+2). Natascha
+	Character set conversion.
+
+	Replaced \e32\lsrc\LS_850.CPP with new file \e32\lsrc\LS_LAT1.CPP, which has
+	the same format:
+
+			type table for characters
+		and     conversions for upper case, lower case, folding and collating.
+
+	for the Windows ISO Latin 1 character set.
+
+	There are 3 test programs:
+
+	1) \e32\tlocale\t_chset.mak which writes to a file "chtest.txt" the descriptions
+	for the characters 32 - 255 together with a description of the character it is
+	mapped to for each of the upper case, lower case, folding and collating conversions.
+	It does this by reading from the tables in LS_LAT1.CPP directly.  This is designed
+	to test the mapping tables in LS_LAT1.CPP.
+
+	2) \e32\tlocale\t_chset2.mak which produces the same output to a file "chtest2.txt"
+	and console, but uses the functions provided by the TChar class instead of reading
+	the tables directly.  This is designed to test that the changes made in
+	\e32\bwins\elocl.mak have taken effect.  Note there is no collate output since
+	TChar has no collate function.
+
+	3) \e32\tlocale\t_chcon.mak which produces a console output displaying the
+	attributes of a range of characters 0xC0-0xCF using functions in TChar.  This
+	tests that the type table in LS_LAT1.CPP is correct.
+
+	All 3 test programs read from the text file e32\tlocale\winiso.txt.
+
+	Note that currently these new tests do not compile in unicode build.
+
+3). Matthew
+	Replaced TBool TRegion::Check() with TBool TRegion::IsContainedBy(), which
+	has the opposite sense, ie it returns ETrue when Check() returned EFalse and
+	vice-versa.
+
+4). Roger
+	Added write(0) functionality to the serial LDD.
+
+	A request to Write(...) with either a zero length descriptor or an explicit
+	zero length will not complete until the control lines are asserted in such a
+	way that a further write would actually send characters on to the line. The
+	exact behaviour of write(0) depends upon the iHandshaking field in the current
+	config.
+
+	eg.
+	void WaitForCTS(RComm& aSerial)
+	//
+	// Synchronously wait for CTS to be asserted, assumes aSerial is Open.
+	//
+		{
+		TCommConfig cBuf;
+		TCommConfigV01& c=cBuf();
+		aSerial.Config(cBuf);
+		c.iHandshake=KConfigObeyCTS;
+		TRequestStatus stat;
+		aSerial.Write(stat,TPtr8(NULL,0),0);
+		User::WaitForRequest(stat);
+		}
+
+	The XOn/XOff bits of iHandshaking are ignored for Write(0).
+
+	There are no changes to the PDD.
+
+5). Jane
+	Wrote display dll, video device (LDD) and VGA driver (PDD) for EPOCx86.
+
+	Fixed ImpHal::DisableInt() which was only pushing 16 bits of flags.
+
+	KMaxSectionBase in m32std.h was wrong - fixed.
+
+	Added TExec which tests number of exec calls in one second.
+
+6). Graham
+	Fixed allocation of run addresses to chunks in DPlatProcess::
+	AllocateDataSectionBase().
+
+7). Roger
+	Implemented CNewServer and CNewSession to run alongside CServer and CSession as
+	proposed in MartinT's E32 proposal "ServiceL() should belong to CSession, not
+	CServer". See E32 proposals for the API.
+
+	This code is not part of a fully accepted proposal as yet - the code is included
+	in the release to A) make further testing with the socket server less painful
+	and B) allow others to migrate servers to the new scheme if they wish.
+
+	Assuming the proposal becomes accepted, CServer and CSession will be replaced
+	with CNewServer and CNewSession.
+
+8). Matthew
+	Maths bug fixes and test code.
+
+
+Version 0.01.051
+================
+(Made by Matthew, 21 Dec '95)
+
+1). Jane
+	Implemented dll and device loading for EPOC platforms.
+
+	IMPORTANT NOTE
+	We have decided that when the entrypoint of a dll (E32Dll) succeeds, it should
+	return KErrNone rather than TRUE. Under WINS, the true entrypoint (_E32Dll)
+	converts KErrNone to TRUE before returning, but under EPOC this is not
+	necessary and we get tighter code by being able just to pass on the return
+	value of E32Dll().
+	So in release 051 all dll entrypoints must now return KErrNone if successful.
+
+	Added functions TBool User::JustInTime() and User::SetJustInTime(TBool) to
+	allow getting/setting a kernel variable which controls whether the debugger
+	macro executes its int 3 to do just in time debugging of panics with Visual
+	C++. The default is ETrue, i.e. just in time debugging is enabled.
+	All test code which traps deliberate panics should set this variable to
+	false around the code in question, to prevent Visual C++ firing up. See
+	TADT\T_CTIMER.CPP
+
+2). Morgan
+	Changes to TReal96:  Changed KMatissaBits back to 53.
+	Added Normalise and Prepare functions.
+	GetTReal is now a const function.
+
+3). Gillian
+	Changes to the date and time classes
+
+	The following is a summary of the new classes, but see the report in E32 proposals
+	(Replacement for the existing date and time classes), and the ensuing discussion
+	for a fuller description of the classes and the motivation for these changes.
+
+	To avoid a name clash, the existing TDateTime class has been renamed TOldDateTime.
+	This along with TSystemTime, SDaySec, SDate and STime and the static date and time
+	functions in Userwill be withdrawn in release 053.
+
+	The functionality previously in TDateTime is provided by TTime which holds the
+	number of microseconds since midnight on 1st January 0AD in a TInt64. A TTime
+	object may be constructed from a TInt64, a TDateTime (see below) or a string
+	literal. Default construction will set the time 0.00am 1st January 2000AD. This
+	class also supports comparisons between TTimes, the addition of TTimeIntervals
+	(see below) to TTimes and the subtraction of TTimes (giving a TTimeInterval as the
+	result). Such arithmetic operations are allowed to over- or underflow, but an error
+	is returned if the results of a subtraction are too large to fit in the relevent
+	(32-bit) TTimeInterval.
+
+	The class TTimeIntervalMicroSeconds represents a 64-bit signed difference and the
+	classes TTimeIntervalSeconds, ...Minutes, ...Hours, ...Days, ...Months, ...Years
+	all derived from TTimeIntervalBase represent the differences in the rest of the
+	time bases in a 32-bit signed integer. These classes only support getting, setting
+	and comparison functions.
+
+	The new class TDateTime has been defined for easy user access to TTime. It has
+	year, month, day, hour, minute, second and microsecond data members, all held as
+	TInts and therefore replaces the SDate and STime structs. This can hold times longer
+	than TTime but no checks will be made on construction or assignment. The TDateTime
+	class will only support getting and setting functions.
+
+	The static functions date and time functions previously in User are now in the class
+	Time.
+
+	Omissions - BC dates, string parsing.
+	Proviso   - Due to bug in TInt64 class Time::MaxTTime() and MinTTime() fail comparisons
+
+4). Colly
+	Removed RThread::Read() and Write() variants taking 2 parameters.
+
+	Provided RMessage::ReadL and WriteL functions. These call the appropriate Client
+	functions, so the code like
+		myMessage.Client().Read(...)
+	should now be changed to
+		myMessage.ReadL(...)
+
+	Removed AllocHeaps.
+
+	Added preliminary code for support of shared heaps. In functions where a heap was
+	previously created using given min and max heap sizes there is now an extra argument:
+	RHeap * aHeap. If this is NULL then everything proceeds as before. Otherwise, the
+	given heap is used. However, this is not properly implemented as yet and so for now
+	you should always pass a null pointer.
+
+	Replaced the constructor RHeap(THeapType aType,TInt aMinLength,TInt aMaxLength,TInt
+	aGrowBy) with RHeap(TInt aMaxLength).
+
+5). Matthew
+	If TCallBack::iFunction==NULL then TCallBack::CallBack() returns 0. The default
+	constructor now sets iFunction=NULL.
+
+	CBufBase::DoInsertL() has been made private and a new overloaded variant of InsertL
+	has been added.
+
+	Added CActiveScheduler::Level(), which returns iLevel.
+
+6). New error codes:
+	const TInt KErrTimedOut=(-33);
+	const TInt KErrCouldNotConnect=(-34);
+	const TInt KErrCouldNotDisconnect=(-35);
+	const TInt KErrSubSystem=(-36);
+	const TInt KErrBadLibraryEntryPoint=(-37);
+	const TInt KErrBadDescriptor=(-38);
+
+
+Version 0.01.050
+================
+(Made by Matthew, 12 Dec '95)
+
+1). Roger/Mark
+	Comms bug fixes.
+
+2). Jal
+	Circular buffer bug fix.
+
+3). Roger
+	RThread::Duplicate() fix.
+
+4). Jane
+	Improved the build system. Added mnt cleanup, mnt cleanwins and mnt
+	cleanx86 which delete all the intermediate files for all builds, just
+	WINS and just X86 respectively. A cleanup should always be performed
+	before the first build of a new release of E32.
+
+	Fixed clean-up of a thread's kernel server session when it dies.
+
+	DPlatThread::Create() was not opening the thread it created, and thus
+	the access count was too low, causing death when the thread died. Fixed.
+
+	Fixed TTimerInt::TimerComplete() to switch interrupts off during the
+	non-atomic decrement of the dfc pending flag.
+
+	Made CObject::AccessCount() public rather than protected - mainly for use
+	in debugging.
+
+5). Geert
+	Changed to a new scheme for boolean values. As the change has considerable
+	impact there is a fair amount of material here, including some background
+	information. Feel free to skip anything that looks familiar:
+
+	In a statement such as
+		if (cond) s1;
+		else s2;
+	C++ will execute s1 if cond!=0, and s2 if cond==0.  In general, C++ treats
+	boolean values as false if they are equal to zero, and true if they are
+	anything else.  The if statement, ?:, &&, || and ! operators all work on
+	this assumption.
+
+	However, the _result_ of a C++ calculation with boolean values is defined
+	to be zero for false, and (int) 1 for true: the built-in &&, ||, !, ==,
+	!=, <, >, <= and >= operators all return either 0 or 1.
+
+	Thus, although 1 is the most usual value representing 'true', it is not
+	the only value that can mean 'true'.  It is therefore _bad practice_ to
+	compare any boolean variable with 1 (or ETrue, or TRUE), to see whether
+	it's true:
+		if (x==ETrue) s1;
+	will only execute s1 if x==1, whereas
+		if (x) s1;
+	will execute s1 if x!=0, which is the correct definition of 'true'ness.
+
+	The draft ANSI C++ standard includes a 'bool' type that has the right
+	properties.  The TBool introduced here has two main design goals:
+	(i) when ANSI compilers become widely available, it will be possible to
+	replace the current type definition with
+		typedef bool TBool;
+	and everything will work perfectly
+	(ii) it is designed to cause the compiler to generate an error message
+	whenever a TBool is compared with ETrue.  This forces you to fix code that
+	is potentially in error, before your code will successfully compile.
+
+	TBool is no longer an enumeration. It is now an integral type best thought
+	of as the type of boolean operators such as <, ==, !=, etc. The only
+	significant property of its values is whether they are zero (false) or
+	non-zero (true). The EFalse and ETrue enumeration constants are available
+	as boolean literals, but a TBool does _not_ have to be equal to ETrue to
+	be considered true.
+
+	This has some impact on the kinds of expressions you can meaningfully
+	write using TBools. Comparisons between boolean variables are meaningless,
+	for instance. On the other hand, a statement such as
+		if (x==EFalse) s1;
+	is equivalent to
+		if (!x) s1;
+	which is not only more concise but also more expressive in many contexts.
+
+	The most common meaningless expressions involving TBools; i.e., the likes
+	of
+		if (x==ETrue) s1;
+	are trapped at compile time, or link time at the latest. Use
+		if (x) s1;
+	instead.
+
+	Another commonly used construct is
+		return(x ? ETrue : EFalse);
+	where the conditional is now entirely redundant. As a side effect of the
+	definition of EFalse and ETrue, this code no longer compiles. Examples of
+	other code intended to achieve the same effect are:
+		return((TBool)(x));
+	or
+		if (x) return(ETrue);
+		else return(EFalse);
+	or one of many variants. These are not picked up by the compiler.
+
+	Comparisons of one TBool to another are not trapped, nor are other
+	meaningless constructs such as
+		if (x<=ETrue) s1;
+
+	To help the human reader, all boolean values should be declared as TBool,
+	including: member data; function parameters taking booleans; functions
+	returning booleans and especially overloaded boolean operators such as
+	operator==(), operator!=() etc. Where booleans are packed into TInt8s or
+	the like to save space, consider using a flags word instead.
+
+	In rare cases TBools may have to be converted into integer values. This
+	may be the case when packing booleans into bytes, or when streaming them
+	out. One elegant and efficient way of doing that is to compare to EFalse;
+	e.g.,
+		TUint8 iPresent[aColorComponent]=(TUint8)(aComponentPresent!=EFalse);
+	Just casting is not sufficient because vital non-zero bits in the incoming
+	boolean may be lost.
+
+	Moreover, it is sometimes useful to assert things about the exact integer
+	value of a boolean. One example of this is test code. The built-in boolean
+	operators return either 0 or 1. It may be desirable to specify the same
+	behaviour for overloaded operators or even ordinary member functions. Use
+	the FALSE and TRUE macros in those cases; e.g.,
+		test((des1<des2)==TRUE);
+
+	The macros may also be useful when an ordinary integer is regarded as a
+	boolean. The E32Dll() entry point returns a TInt, for instance. FALSE and
+	TRUE may be used in that context. Another use is at the interface with
+	external code, such as the Win32 API. As a final example: a callback
+	function to be used in the context of a CIdle object might use the macros,
+	since its TInt return value is interpreted as a boolean.
+
+	Note that the conversion to this new scheme is only partially implemented
+	in the base.
+
+6). Steve
+	New functions TSize TPoint::AsSize and TPoint TSize::AsPoint return
+	this as the respective type. Removed overloaded functions in TPoint,
+	TSize and TRect.
+
+	TSize::SetWH renamed to SetSize.
+
+	TRect - Functions renamed from Offset to Move and Normalise to
+	Normalize. New functions: Size, Width, Height, IsNormalized, Center,
+	SetSize, SetWidth and SetHeight.
+
+
+Version 0.01.049
+================
+(Made by Matthew, 21 Nov 1995)
+
+1). Andrew
+	The constness of the parameters to CCleanup::PushL and
+	CleanupStack::PushL has gone.
+
+	CCleanup and CleanupStack now have an extra PushL overload: This
+	takes a TCleanupItem, which is callback. This enables any component
+	to be placed on the cleanup stack by providing a implicit cast to
+	TCleanupItem: the component will require a static member which conforms
+	to the TCleanupOperation prototype, with which it can constuct a
+	TCleanupItem. The overhead of all this is negligible _only_ if the cast
+	operator is inline!
+
+	See the RItem class in the T_CTRAP test code for an example of how to
+	do this.
+
+	It is possible to push a no-data callback on the stack, though the function
+	must take a dummy TAny * parameter. Such a function can be PushLed
+	directly, as TCleanupItem provides a constructor from a TCleanupOperation.
+
+
+2). Jane
+	Added code for the WINS platform to allow DLLs to startup in a chosen
+	order. When E32Dll() is first called (aReason==EDllProcessAttach), a new
+	function UserSvr::InitRegisterCallback(TCallBack t, TInt p) should be
+	called. This registers t as a callback function with priority p. All the
+	start-up functionality of E32Dll() should now be moved to the callback.
+
+	After all the DLLs have been loaded, the kernel runs through a priority
+	queue, doing callbacks in the requested order, and waiting on a semaphore
+	between each call. Before it terminates, the callback function should call
+	UserSvr::ServerStarted() to signal the semaphore, and allow the kernel to
+	callback to the next DLL's registered function.
+
+	See the t_start files in TADT.
+
+	Added support for sharing loading of dlls.
+
+	Fixed the thread cleanup code to correctly free resources owned by the
+	session, and exit cleanly if the thread creation failed due to lack of
+	heap. Should fix HA-7.
+
+3). Matthew
+	CObject::Close now panics if the access count becomes negative, new test
+	code checks this.
+
+	In WINS, PP:MapLastError returns KErrDoesNotExist for the NT error code
+	ERROR_MOD_NOT_FOUND. This fixes HA-22.
+
+	Added a function RLibrary::LoadExact which loads a DLL without mangling
+	the name. To use this you will need F32 build 13.
+
+4). Roger
+	Added __DEBUGGER() Macro.
+
+	Under WINS and MX86 this macro will place an inline int3 instruction into
+	your code. For ARM builds the macro expands to a SWI instruction.
+
+	The macro compiles out under release builds.
+
+	Under WINS __DEBUGGER() will cause the application to drop into the
+	debugger - it will also invoke just in time debugging if your system has
+	it enabled.
+
+	There is no kernel debugger support for ARM or MX86 builds.
+
+	The Macro is currently defined in E32STD.h this is a temporary measure
+	until there is a good area for platform specific pre-processor macros.
+
+	Fixed the two DPlatThreads with the same NT thread id in the kernel's
+	list of threads bug, HA-16 and HA-6.
+
+5). Graham
+	New ARM code, added function TEiger::BootWaitMilliseconds(), changed
+	ArmVectorIrq() and CScreenDriverMarm::Blit().
+
+
+Version 0.01.048
+================
+(Made by Jane,13 Nov 1995)
+
+1). Colly
+	If a function has a parameter by reference immediately before the
+	ellipsis argument as in:
+
+	RTest::Printf(const TDesC &aFmt,...)
+
+	then there is a problem when using the variable argument macros as
+	follows:
+
+	VA_LIST list;
+	VA_START(list,aFmt);
+
+	since the macro use &aFmt to try and get the address of the argument
+	on the stack. However this does not work with arguments passed by
+	reference since &aFmt is the real address of the descriptor. I have
+	been using a special function User::SetVaArgList() to overcome this
+	difficulty. However this function does not work with register calling
+	conventions as for the ARM compiler and so a better solution has been
+	found. Many thanks to Geert for the solution as follows:
+
+	A new class has been defined TRefByValue as follows:
+
+	template <class T>
+	class TRefByValue
+		{
+	public:
+		inline TRefByValue(T &aRef);
+		inline operator T &();
+	private:
+		TRefByValue &operator=(TRefByValue aRef);
+	private:
+		T &iRef;
+		};
+
+	The assignment operator is just to stop the compiler whining since
+	it cannot generate the assignment operator. The trick is to pass a
+	reference by value and then have a cast to return the refernce again.
+	So all that needs to change is the function declaration as follows:
+
+	RTest::Printf(TRefByValue<const TDesC> aFmt,...)
+
+	Note that the TRefByValue is now passed by value so that
+
+	VA_START(list,aFmt)
+
+	will now work. SetVaArgList has now thankfully been banished.
+
+	NOTE: No functions calling these functions with ... should need
+	to be changed.
+
+	As a consequence of this change three pairs of overloaded functions
+	are now ambiguous:
+
+	TDesC::Format(TRefByValue<const TDesC8> aFmt,...); and
+	TDesC::Format(const TDesC8 &aFmt,VA_LIST aList);
+	TDesC::AppendFormat(TRefByValue<const TDesC8> aFmt,...); and
+	TDesC::AppendFormat(const TDesC8 &aFmt,VA_LIST aList);
+	TLex::Convert(TRefByValue<const TDesC8> aFormat,...);
+	TLex::Convert(const TDesC8 &aFormat,VA_LIST aList);
+
+	Resolved the ambiguity in each case by renaming the function which
+	takes the VA_LIST argument to end in List, i.e.
+
+	TDesC::FormatList(const TDesC8 &aFmt,VA_LIST aList);
+	TDesC::AppendFormatList(const TDesC8 &aFmt,VA_LIST aList);
+	TLex::ConvertList(const TDesC8 &aFormat,VA_LIST aList);
+
+2). Colly
+	A mis-understanding between myself and Nick Twyman caused me to
+	change EXPORT_C to be defined empty. This is not correct and I have
+	put it back to the correct #define EXPORT_C __declspec(dllexport)
+
+3). Colly
+	Fixed a bug in the TReal96 class which then showed up a failure
+	in the implementation of TReal96. TReal96 on being Set() was always
+	shifting the mantissa left three and then subtracting 3 from the
+	exponent. However all the function were not allowing for this. I
+	have changed the Set() code not to to the shift any longer. So if
+	real calculations are to be performed the shift will have to be
+	done before the calculation. GetTReal() and the cast to TReal
+	normalise as before. GetTReal() had a bug in that it was
+	normalising *this along the way to converting to a TReal. It should
+	in fact do nothing and be changed to a const function. Two new
+	functions need to be added, Normalise() and Prepare(). Normalise()
+	will do most of what GetTReal() is doing now but will do it directly
+	on *this, while Prepare() will do the left shift by three.
+
+4). Colly
+	Changed all executive services to have 4 or less arguments to suit
+	the calling convention of the GCC compiler. i.e. all arguments are
+	in registers.
+
+5). Colly
+	Added the ARM implementation of Epoc/32 for the Eiger chip and finally
+	got a workable release of the GNU tool chain from Cygnus. Work is now
+	progressing on getting Epoc/32 running on Eiger.
+
+6). Graham
+	Various Eiger fixes.
+
+7.) Jane
+	Changed build system adding the verbs mnt cleanup (deletes everything from \e32sys
+	and \work\e32\...) and mnt blddef (automated build of all the .def files into
+	\E32\BWINS and \E32\BMX86 directories). Made several changes to the DEFMAKE tool
+	to support this.
+	These should only need to be used by the base team - others can continue to
+	use mnt bldall etc. as usual.
+
+8). Matthew
+	Test code for CPeriodic and TDayName etc added.
+
+	Fixed rounding bug in um_rtod.cpp (HA-15) & adapted Martin Hardman's test
+	code.
+
+9). Jane
+	Fixed HA-13, setting iBase=0 in DestroyAll(), and wrote test code. Note that
+	DestroyAll() is due to be replaced by a function in a new class CArrayFixFlatCBase
+	which will subclass CArrayFixFlat<CBase *> and thus can be type safe.
+
+10). Jane
+	Changed EXE header format in kernel and E32ROM to contain stack & heap maximum
+	and minimum sizes.
+
+11). Jane
+	MMU - added allocation of linear regions (chunks) from high memory for DLLs, and
+	wrote test code.
+
+12). Morgan
+	Maths fixes.
+
+	T_MATH.CPP:
+	2 sin tests (lines 1317-1321) were failing with the new TReal96 due to inaccurate
+	values for sin(3) and sin(4).
+
+	lntest4 now uses a bit test ( using the 'approx' class) to compare the results taking
+	into account any bit wobble.
+
+	UM_INT.CPP:
+	Fixed Math::Int(TReal &aTrg,const TReal &aSrc) aSrc.Exp() = KMantissaBits-32.
+	(Left shifting a TInt by 32 (eg  x<<32)  results in 0xffffffff when it was required to be 0).
+
+	UP_I64.CPP
+	Added TInt64A::MulTop which returns the top 64 bits of a 64x64->128 multiply.
+
+	UM_R96.CPP - TReal96 functions
+	Set() now writes the correct exponent for a 56 bit mantissa (and is consistent with the
+	transendental fuctions when KMantissaBits=56)
+
+	Added TMathPanics
+
+	Added test code for TReal96, RChunks and more tests for Int64
+
+
+13). Colly
+	Various X86 keyboard fixes.
+
+14). Martin
+	Changed Alloc heaven 'dialog' so that address of offending cell is visible.
+
+	Added a Replace function to descriptors (courtesy of Brendan), with test code.
+
+	Fixed TPtr::Set function to do the right thing with maxlen, modified test code.
+
+15). Graham
+	Windows server changes.
+
+16). Jane
+	Added KBX86 and KBARM boot source to PVCS.
+
+
+Version 0.01.047
+================
+(Made by Colly, 9 Oct 1995)
+
+1). Changed all TUint to TInt.
+
+2). The UserSvr::RequestEvent(TEvent &anEvent,TRequestStatus &aStatus)
+	was unworkable for the Epoc/32 micro-kernel variants since the
+	O/S needs to write the resulting event back in the context of the
+	interrupt which may not be the same process as that requesting the
+	event. Like servers, this needs to be written using RThread::Write()
+	which needs to write to a descriptor in the requesting process. To
+	this end I have defined:
+
+	class TEventBuf : public TPckgBuf<TEvent>
+		{
+	public:
+		inline TEvent &Event() const {return(*((TEvent *)&iBuf[0]));}
+		};
+
+	The function now becomes:
+
+	UserSvr::RequestEvent(TEventBuf &anEvent,TRequestStatus &aStatus);
+
+	i.e. it takes the packaged event. The actual event can be returned
+	by using the () operator on the package or by calling Event().
+
+3). The text window server had a bug which was causing the unicode
+	release build to fail reading the setup parameters in a random way.
+
+4). CObjectIx::Destruct() was deleting NULL object handles. Fixed.
+
+5). Made TRequestStatus a proper class so that it is now strongly typed.
+	This helps the compiler pick the correct overloaded function as
+	can happen in the file server for example. Note that there is no
+	conversion from a TRequestStatus to a TInt. Use the Int() function.
+
+6). ROM sizes are now quoted for the Epoc/32 microkernel builds and
+	not for WINS as previously.
+
+ROM SIZES
+
+			X86    ARM
+			---   ----
+EUSER.DLL   94K   154K
+EKERN.DLL   70K   110K
+ELOCL.DLL    3K     3K
+EFSRV.DLL   27K    41K
+----------------------
+TOTAL      194K   308K
+----------------------
+
+Version 0.01.046
+================
+(Made by Colly, 2 Oct 1995)
+
+1). Added #defines _L8, _L16, _S8 and _S16 for string literals.
+
+2). Eliminated wait handlers for device drivers. The function
+	User::AllowRequestsToComplete() is now redundant. Withdrawn.
+
+3). KMinTInt8 and KMinTInt16 were not defined correctly. Fixed.
+
+4). Completed the implementation of RHeap(). The various UserHeap
+	creation functions now have new	arguments, aMinLength,
+	aMaxLength and aGrowBy. The heap will initially be aMinLength
+	in size, and can grow to be aMaxLength in size. If there is no
+	space in the heap then an attempt will be made to grow the heap
+	in aGrowBy increments. There is a new function Compress() which
+	will free any excess space at the end of the heap. Compress() will
+	never shrink the heap to less than aMinLength. The sizing code has
+	been modified to take account of the RHeap structure at the bottom
+	of the heap, so that the free size of a newly created heap will
+	always be >= aMinLength. None of this affects fixed heaps.
+
+5). Changed RThread::Create() to allow the initial size of the heap
+	to be specified as well as the maximum size of the heap. These
+	are given as the aHeapMinSize and aHeapMaxSize parameters. All
+	heaps created in chunks are targets for compression if the system
+	runs out of memory.
+
+6). Implemented the process handling functions for the first time in
+	the micro-kernel version, including an interface to allow a loader
+	server to actually load .EXEs and .DLLs. In a normal system the
+	loader server will be part of the file server. The 486 version
+	of Epoc/32 now supports multiple processes, full pre-emptive
+	scheduling, and execute in place .DLLs and .EXEs.
+
+7). Added User::Beep(TInt aFrequency,TInt aDuration). The frequency
+	is in hertz so 440 is middle A. The duration is in tenths
+	of a second. As in Epoc/16 a negative duration indicates that if
+	the hardware to perform the beep is being used for another purpose
+	no beep will be sounded. As before if the duration is positive the
+	beep can hang up the program until the hardware is free to make
+	the beep. And as before the first beep will return immediately if
+	the hardware is not busy and the beep will continue in background.
+	Note that in Epoc/16 the frequency was specified as an interval.
+	This function is not playing a sound constinuously due to a bug in
+	Win32. It is however functionally correct. I will fix it in the
+	next release.
+
+8). The constructor for the TPckg template class was leaving the
+	length of the descriptor as zero, when it should be the sizeof
+	the object T. Fixed.
+
+9). Add support for drivers to the kernel. In Epoc/16 there were LDDs
+	and PDDs. In Epoc/32 a Device is equivalent to an LDD and a Driver
+	is equivalent to a PDD. The only user mode services for drivers
+	are TFindDriver which allows all installed drivers to be listed
+	and User::LoadDriver() and User::FreeDriver(). With the addition
+	of drivers \E32\KSRC\KS_DEV.CPP got too big to handle so I have
+	split out channels into KS_CHN.CPP and libraries (DLLs) into
+	KS_LIB.CPP and put drivers in KS_DRV.CPP.
+
+10).Completed the implementation of the device driver functions in the
+	kernel and implemented the RDevComm device as well as a WINS driver.
+	Ax X86 driver for 16450s and 16550s is coming soon. Serial comms lives
+	again! The comms device	and WINS driver are now part of the standard
+	release of E32 for WINS. The interface to the device is in D32COMM.H
+	and D32COMM.INL. It is necessary to load both the device driver
+	and	the physical driver in order to use the comms device. An example
+	of how to do this is in \e32\dpwins\t_comm.cpp.
+
+11).Added a public function CActive::Deque() which will allow the
+	active object to be removed from the scheduler queue. Deque()
+	will call Cancel() before dequeing the object. The object must
+	already be on the scheduler queue to be dequed or else a panic
+	will result.
+
+12).Added a circular buffer template class CCirBuf<T> to E32ADT.H and
+	its test program T_CIRC.CPP. This is used by the serial device
+	to implement receive and transmit buffers. It allows items to be
+	added at the head of the queue while allowing items to be removed
+	from the tail of the queue. The buffers size can be changed
+	dynamically by calling SetLengthL(), although it will discard the
+	current contents of the buffer. Also added a class CCirBufer
+	derived from CCirBuf<TUint8> which add Get() and Put() which will
+	add or remove a single item and are	optimised for speed.
+
+13).Added the text window server to the standard build of E32. This has
+	now been implemented for WINS and EPOC/32-MX86 platforms. The source
+	of this server is in \E32\WSRC. It uses a screen driver .DLL
+	to perform character blitting to the screen. The test programs are
+	in \E32\TWIN. The RConsole class has the following facilities:
+
+	RConsole is used to communicate with the text windows server.
+
+	Version()	Reports client side version information
+
+	Create()	If necessary, opens a connection to the window server, then creates a default window without displaying
+				it. The default window characteristics may then be changed using Control() before proceeding to display
+				the window using Set().
+
+	Set()		If necessary, opens a connection to the window server. If necessary, creates a window. Then displays
+				the window with the given title and attaches the given buffer size characteristics to it.
+
+	Write()		Writes the given text at the current cursor position.
+
+	Clear()		Clears the whole window and places the cursor at the top left corner.
+
+	ClearToEndOfLIne() Clears from the current cursor position to the end of the line
+
+	Destroy()	Removes the window from the screen. Another may then be opened using Create()/Set().
+
+	SetCursorSize()	  Sets the percentage height of the cursor
+	SetCursorPosAbs() Places cursor at given absolute position.
+	SetCursorPosRel() Places cursor relative to current position.
+	CursorPos()		  Returns current cursor position
+
+	Control()	Controls various window characteristics. The text passed to this function may contain near-English
+				commands. However, only the '+', '-', and upper-case letters are actually interpreted:
+
+				'+'		Apply subsequent characteristics
+				'-'		Remove subsequent characteristics
+				'V'		Visibility
+				'C'		Cursor on
+				'S'		Scroll bars
+				'L'		Scroll lock
+				'W'		Wrap lock
+				'M'		Maximum Window Size
+				'N'		'/n' is CR and LF
+
+				Before interpreting the text, a silent '+' is assumed:
+
+						Control(_L("Visibility -Cursor Lock + Scroll"))
+
+				This would cause the window to become visible, with no text cursor, no scroll lock active,
+				but with scroll bars present. Of course, the following command would achieve exactly the same
+				result, but would not posses the same level of self-documentation or readability:
+
+						Control(_L("VS-CL"))
+
+				Further more, the next command would achieve the same thing with even more readability:
+
+						Control(_L("+Visibility -Cursor -Lock +Scroll"))
+
+	Read()		Read a character.
+
+	ReadCancel()	Cancel asynchronous read request
+
+14).Set the priority of the kernel server thread and null thread
+	correctly on the EPOC/32 platforms.
+
+15).Now allocating data section base addresses correctly so that multiple
+	threads will now work correctly on the EPOC/32 platforms.
+
+16).Changed THandleBase::Duplicate(RProcess &aProcess) to be
+	THandleBase::Duplicate(RThread &aThread) since it is usual
+	to have the remote thread handle and unusual to have the remote
+	threads process handle. The O/S uses the thread's process as the
+	handle's source process.
+
+17).RTimer.After() and User::After() were using a duration in ticks. This
+	has now been changed to a duration in tenths of a second so that it
+	is platform independent.
+
+18).RProcess RThread::Process() was always returning the current
+	process rather than the thread's process. Also returning a new
+	handle based object can fail with out of memory so I have changed
+	this function to TInt RThread::Process(RProcess &aProcess) so that
+	it can return the error.
+
+19).Under Windows/NT a mutex once owned by a thread can be waited on again
+	without locking the thread, on the basis that this protects a thread
+	from entering deadlock. However this is nonsense since a mutex can
+	be used to prevent a thread from accessing the resource as
+	happens in the case of the User::Beep() function. Basically the
+	mutex is used to lock out threads until the current beep has
+	completed. What takes the thread out of potential deadlock is the
+	beep completing in due course. Changed the WINS implementation to
+	behave correctly and lock the thread.
+
+20).TLex::Val(TReal &) did not fail with a number like _L("1.2e"). Fixed.
+
+21).The default constructor for the TLex class was still being set up for
+	zero terminated descriptors which were discarded in January. Fixed.
+
+22).TLex::Peek() would happily try and access a character from a default
+	constructed TLex which resulted in an access violation. Now fixed.
+	Also dropped inline for Inc(),Peek() and Get().
+
+23).CBufBase::Read(TUint aPos,TDes8 &aDes) is documented as reading up to
+	aDes.MaxLength() characters, but was in fact reading up to
+	aDes.Length() characters. Fixed.
+
+24).RTimer was not setting the request status to KRequestPending after
+	an asynchronous request. Fixed.
+
+25).I have changed EXPORT_C to just be nothing rather than
+	__declspec(dllexport). For the time being it is still required to
+	declare functions as EXPORT_C. If you had a function which did
+	not have a corresponding IMPORT_C then make sure that there is
+	an IMPORT_C defined somewhere or else the function will not be
+	exported.
+
+26).Changed the heap checking macros to have understandable names and have
+	simplified their implementation. I have also made them orthogonal. The
+	new names and their old equivalents are as follows:
+
+	// For the user heap
+
+	__UHEAP_MARK							MARKSTART
+	__UHEAP_CHECK(aCount)					CHECKNUM1(x)
+	__UHEAP_CHECKALL(aCount)				CHECKTOTALNUM1(x)
+	__UHEAP_MARKEND							MARKEND
+	__UHEAP_MARKEND(aCount)					MARKEND1(x)
+	__UHEAP_FAILNEXT(aCount)				SETFAIL(x,y)
+	__UHEAP_SETFAIL(aType,aRate)			SETFAIL(x,y)
+	__UHEAP_RESET							RESET
+
+	// For the kernel heap
+
+	__KHEAP_MARK
+	__KHEAP_CHECK(aCount)
+	__KHEAP_CHECKALL(aCount)
+	__KHEAP_MARKEND
+	__KHEAP_MARKEND(aCount)
+	__KHEAP_FAILNEXT(aCount)				K_SETFAIL(x,y)
+	__KHEAP_SETFAIL(aType,aRate)			K_SETFAIL(x,y)
+	__KHEAP_RESET							K_RESET
+
+	// For any RHeap
+
+	__RHEAP_MARK(aHeap)						MARKSTART1(x)
+	__RHEAP_CHECK(aHeap,aCount)				CHECKNUM2(x,y)
+	__RHEAP_CHECKALL(aHeap,aCount)			CHECKTOTALNUM2(x,y)
+	__RHEAP_MARKEND(aHeap)					MARKEND1(x)
+	__RHEAP_MARKEND(aHeap,aCount)			MARKEND2(x,y)
+	__RHEAP_FAILNEXT(aHeap,aCount)			UH_SETFAIL(x,y,z)
+	__RHEAP_SETFAIL(aHeap,aType,aRate)		UH_SETFAIL(x,y,z)
+	__RHEAP_RESET(aHeap)					UH_RESET
+
+	FAILNEXT,UH_FAILNEXT and K_FAILNEXT can be replaced
+	with __?HEAP_FAILNEXT(1)
+
+	It is no longer possible to check a threads heap since this will
+	not work under Epoc/32 if a thread is in another process.
+
+	In the first trial implementation of __?HEAP__FAILNEXT(aCount) I
+	had not realised that aCount did not do anything. This is now
+	fixed. Note that aCount==1 fails the next alloc call.
+
+27).The member variable of TScreenInfoV01 were not declared with a lower
+	case i prefix. Fixed.
+
+28).Released the console classes. The header for the console class in
+	E32CONS.H. It has an abstract base class CConsoleBase which just
+	defines a basic set of console functions. It also has CConsoleTextWin
+	which is the console implementation for the text window server.
+
+29).Changed the WINS platform to use the the CConsoleTextWin instead of
+	a second Windows/NT console window. The test class now uses the
+	CConsoleTextWin. The console is released as ECONS.DLL. The
+	CConsoleTextWin class is defined in the E32TWIN.H header.
+
+30).Changed the test class to use the console. Also added a Getch()
+	function to the test class. Because it now owns a console object
+	I have had to rename the test class RTest. I have also added
+	a Close() member function which will free an allocated console.
+
+31).Added CConsoleBase *Adt::NewConsoleL() which will create a basic
+	console object. Note that you do not need to be linked to ECONS.LIB
+	in order to	use this or any of the member functions of CConsoleBase.
+
+32).Took the opportunity with the release of the X86 platform to rename
+	the WINS platform releaseables to be inline with those of the X86
+	platform. The new names are as follows:
+
+	OLD NAME		NEW NAME
+	============	=============
+	ESTAT.OBJ		EEXE.OBJ
+	ESTAT.LIB		EEXE.LIB
+	EWINS.DLL		EUSER.DLL
+	EWINS.LIB		EUSER.LIB
+	KWINS.DLL		EKERN.DLL
+	LWINS.DLL		ELOCL.DLL
+
+	For programs the programs which use E32 the only changes to .MAK files
+	which are significant are as follows:
+
+	ESTAT?.OBJ	to	EEXE.OBJ	- The startup object for .EXEs
+	ESTAT?.LIB	to	EEXE.LIB	- The startup library for .EXEs
+								  if linking with msvcrt20.lib
+	EWINS?.LIB	to	EUSER.LIB	- The user library
+
+33).Added an inline "construct in place" global new operator.
+
+34).Due to popular demand I have moved the following functions
+	to a new class of their own CleanupStack.
+
+	Adt::PushL(const TAny *)
+	Adt::PushL(const CBase *)
+	Adt::Pop()
+	Adt::Pop(TUint aCount)
+	Adt::PopAndDestroy()
+	Adt::PopAndDestroy(TUint aCount)
+
+	become
+
+	CleanupStack::PushL(const TAny *)
+	CleanupStack::PushL(const CBase *)
+	CleanupStack::Pop()
+	CleanupStack::Pop(TUint aCount)
+	CleanupStack::PopAndDestroy()
+	CleanupStack::PopAndDestroy(TUint aCount)
+
+35).For a long time I have been tracking down a race condition under
+	WINS which resulted in the kernel being hung. This turns out to be
+	a bug in the Windows/NT implementation	of critical	sections.
+	I have replaced the critical section with a mutex which	fixes the bug.
+
+36).I have fixed the T_SEMUTX.CPP program which has also long had a
+	deliberate race condition as part of its test. However the problem
+	was that sometimes it raced and sometimes it did not. By making each
+	thread wait different times its possible to always make the race
+	conditions occur so that the test will always pass consistently.
+
+37).The CIdle class was doing a User::WaitForAnyRequest() in the
+	DoCancel() function. DoCancel() should just do nothing ofcourse
+	since the CActive::Cancel() function will do the WaitForAnyRequest().
+	Many thanks to Brendan for spotting the bug and for providing
+	the test code t_idle.cpp.
+
+38).Adt::DestroyZ() was never any use, so I have removed it.
+
+39).CSession::CreateL() was defined as pure virtual so that server
+	implmentors had to define a CreateL() function even, as is often
+	the case, the function did nothing. I have now supplied a default
+	implementation which does nothing.
+
+40).CActiveScheduler::Install() would not allow the current scheduler
+	to be removed by passing NULL. This is now allowed. Note that if
+	you want to change the scheduler you must first de-install by using
+	NULL and then replace with the new scheduler.
+
+41).Got most of the base test code working in release mode. For some
+	unknow reason, some of the test code template classes are not
+	instaniating in release builds. All tests pass but the following
+	have the body of their code eliminated.
+
+	T_BUF, T_CHAR, T_DES, T_HEAPDB,	T_HUF
+	T_LEX, T_QUE, T_SQUE, T_KEY, T_FLOAT
+
+	In getting the test programs to work in the release build almost
+	all problems wre due to a dependency on the lifetime of
+	temporaries. In debug builds temporaries are never re-used so they
+	exist for the duration of the function. However in release builds
+	they are re-used at the first opportunity. Typical buggy code is
+	as follows:
+
+	class TBug
+		{
+	public:
+		TBuf();
+		void Set1(const TDesC *aDes);
+		void Set2(const TDesC *aDes);
+	private:
+		const TDesC *iPtr1;
+		const TDesC *iPtr2;
+		};
+
+	TBuf b;
+	b.Set1(&_L("Temporary 1"));
+	b.Set2(&_L("Temporary 2"));
+
+	This will work fine in debug builds but will result in iPtr1 and
+	iPtr2 pointing to the same value. This is because _L is defined
+	as a constructor for a TPtrC which creates a temporary. The same
+	automatic space will be used for the temporary.
+
+42).HBufC::NewMax(),HBufC::NewMaxL() and HBufC::NewMaxLC() all ended
+	up setting the length to the size of the allocated cell which can
+	be bigger that the requested length. Changed to set the length
+	to the requested length.
+
+43).Moved MemCopy(),MemCompare(),MemCompareF(),MemCompareC()
+	MemFill(),MemFillZ() and MemSwap() to a class of their own
+	called Mem and dropped the Mem prefix. So User::MemCopy() is
+	now Mem::Copy() etc.
+
+44).Changed TDesC functions Match(),Locate(),LocateReverse() and Find()
+	to return an unsigned result. They all return KNotFound which is
+	defined as KMaxTUint if they fail.
+
+45).The message system was not tidying up correctly when a session
+	was closed by the client or if the client died before closing. The
+	new implementation of messaging has now fixed this problem.
+
+NOTE
+====
+
+20th September 1995.
+
+The X86 implementation of the Epoc/32 platform ran through the
+creation and execution of the first user mode process and then
+eventually ended up in the NULL process and consequently the idle
+loop. The MMU and protection is fully enabled, so this constitutes
+the birth of Epoc/32. We hope to have the remainder of the boot
+sequence, i.e. file server, window server and shell completed
+by the end of the next week.
+
+ROM SIZES
+
+			X86    ARM
+			---   ----
+EUSER.DLL   90K   148K
+EKERN.DLL   33K    47K
+ELOCL.DLL    3K     3K
+EFSRV.DLL   28K    42K
+----------------------
+TOTAL      154K   240K
+----------------------
+
+Version 0.01.045
+================
+(Made by Colly, 30 Aug 1995)
+
+1). Changed the way messaging worked internally. RServer::Receive() used
+	to get a pointer to the message received. I was hoping to pass this
+	pointer directly from supervisor space for efficiency, but I have
+	decided that its not worth the extra overhead of read only shared
+	memory that wouldbe required. RServer now has a RMessage by value
+	which receives the contents of the message when it arrives. If the
+	server needs to hold onto the message then it must either copy
+	the message in full (I have added a copy constructor and an assignment
+	operator to allow this) or it must use the new function MessagePtr()
+	which returns a const RMessagePtr. The only thing you can do with
+	an RMessagePtr is to complete the message as you do with a normal
+	RMessage by call RMessagePtr::Complete().
+
+	While I was about it I also changes the naming of the accessor
+	functions I1(),P1() etc. The problem with the names was that on
+	the client side arguments were being set into an array using normal
+	indexing, i.e. base 0, while on the server side the names were based 1.
+	In order to help the conversion	I have renamed I to Int and P to Ptr
+	so that:
+
+	I1() is now Int0()
+	I2() is now Int1()
+	I3() is now Int2()
+	I4() is niw Int3()
+	P1() is now Ptr0()
+	P2() is now Ptr1()
+	P3() is now Ptr2()
+	P4() is niw Ptr3()
+
+	Sorry for the inconvenience.
+
+2). Moved a number of constructors in abstract base	classes which were
+	public to protected. This should have no affect other than to stop
+	them being instantiated.
+
+3). Withdrawn the new(ECleanup) and new(ECleanupObj) options. new(ELeave)
+	still exists. CBase * is not nescessarily the start of the heap cell
+	when MI is involved. In general a cast of (TAny *) to a CBase * will
+	not work unless the TAny * was originally downcast to a CBase *. If
+	you know the type T of a TAny *ptr then its o.k. to code
+
+	(CBase *)(T *)ptr;
+
+	but not
+
+	(CBase *)ptr;
+
+4). More tiresome CBase * problems. TDblQue::DeletaAll and
+	TSglQue::DeleteAll were removing each item from the que and then
+	casting the ptr to a CBase * to call Adt::Destroy(). Withdrawn.
+
+5). CActiveScheduler::Start() was not nesting levels correctly. Fixed.
+
+6). Added TLex?::Offset() and TLex?::MarkedOffset().
+
+7). The various TLex::Val() routines should not change iNext if they
+	fail to lex a valid number. Fixed.
+
+8). Added TLex?::Val(TReal32 &aReal,TChar aPoint) and
+	TLex?::Val(TReal64 &aReal,TChar aPoint).
+
+9). Added some extra key difinitions to E32VIRT.H
+
+	EKeyBell=0x0007,
+	EKeyLineFeed=0x000a,
+	EKeyVerticalTab=0x000b,
+	EKeyFormFeed=0x000c,
+	EKeySpace=0x0020
+
+10).Implemented default constructors for TPtrC8 and TPtrC16 which
+	set the pointer NULL and the length to zero.
+
+11).The X86 version of E32 now builds in unicode.
+
+12).Changed CObjectConIx::Remove(CObjectCon *aCon) so that it can be
+	passed NULL. It does nothing if aCon is NULL.
+
+13).Added CObjectCon::operator[]() to allow access to all objects in a
+	container by straight indexing.
+
+Version 0.01.044
+================
+(Made by Colly, 23 Aug 1995)
+
+1). TDes8::SetMax() and TDes16::SetMax() did not work correctly if the
+	TDes was from a TBufC.Des() or HBufC.Des(). This caused the
+	HBufC::NewMax() and HBufC::NewMaxL() to fail to set length to
+	MaxLength(). Fixed.
+
+2). Added a new type TTrapHandler. This is an abstract class which needs
+	to be derived to provide a handler to work with the TRAP mechanism.
+	The trap handler can be installed by calling User::SetTrapHandler()
+	and can be cleared by passing a NULL pointer. By default there is no
+	trap handler. Once a trap handler is installed then each time TRAP is
+	invoked TTrapHandler::Trap() is called. If a leave is called then
+	TTrapHandler::Leave() is called. If the function being trapped does
+	not leave then TTrapHandler::UnTrap() is called. Each thread has its
+	own trap handler. Its not a good idea to install a trap handler while
+	under a TRAP (exercise for the reader to work out why), so a panic
+	will be given if this is attempted. The current trap handler can be
+	retrieved by calling User::TrapHandler().
+
+3). Added a new ADT class CCleanup. The purpose of this class is to
+	provide an automated cleanup mechanism to go with the TTrapHandler
+	facility. This class is basically a stack onto which either
+	allocated cells can be pushed using PushL(TAny *aPtr) or objects
+	derived from CBase with PushL(CBase *aPtr). The object can
+	be popped from the stack with Pop() or popped and destroyed with
+	PopAndDestroy(). It is possible to pop a number of items from the
+	stack by using the overloaded Pop(TUint aCount) functions.
+
+	The object also allows for nesting so that all objects at the
+	current nesting level can be popped or popped and destroyed with
+	PopAll() or PopAndDestroyAll(). These functions automatically
+	decrement the nesting level. The nesting level can be incremented
+	with NextLevel(). When the object is created the level is zero.
+	Objects cannot be pushed while the nesting level is zero so it is
+	necessary to call NextLevel() before doing a PushL().
+
+	If the object is destroyed then all items on the stack will also
+	be destroyed.
+
+	The cleanup object keeps a free slot at all times. Thus an object
+	can always be guaranteed to be added to the cleanup stack. Having
+	added the object, room is made for another free slot. This may
+	leave but it will be alright as the object has already been pushed
+	onto the stack and will be cleaned up. Cleaning up leaves room for
+	another free slot.
+
+4). Added a new ADT class CTrapCleanup which puts 2) and 3) together to
+	give a framework for cleanup. All thats necessary to implement this
+	facility is to call CTrapCleanup::New(). There is no NewL() since
+	the trap handler can only be installed while not under a TRAP.
+	Destroying this object will remove the trap handler. Added the static
+	functions Adt::PushL(const TAny *), Adt::PushL(const CBase *),
+	Adt::Pop(), Adt::Pop(TUint aCount) and the PopAndDestroy()
+	equivalents which all use the installed CTrapCleanup object. Note
+	that the PopAll() variants are not available, since this is done
+	by the trap handler.
+
+5). Added 2 more types to TLeave, i.e. ECleanup and ECleanupObj. ECleanup
+	will allocate the storage and leave on error. If successful it will
+	add the new cell to the cleanup list. ECleaupObj is the same except
+	that it will add the cell as a CBase derived object. It is possible
+	to use ::new with ECleanupObj, but you will just get
+	panicked. It should only be used with CBase::new. Note that any
+	call to new within a member function in a class derived from CBase
+	will be calling CBase::new and so will need ECleanup. If creating an
+	object then ECleanupObj is correct. Using User::AllocLC() is probably
+	preferable and always call new(ECleanupObj) or new(ELeave).
+
+	Added RHeap::AllocLC(), User::AllocLC(), TDesC::AllocLC(),
+	HBufC::NewLC() and HBufC::NewMaxLC() which all are the same as
+	the equivalent L functions except that they add the object to
+	the cleanup list if successful.
+
+	Remember that a Pop() of some kind will be required.
+
+6). Added the function to return machine information from the Hardware
+	Abstraction Layer (HAL). This is retrieved by calling User::HalInfo().
+	The class is declared in E32HAL.H. Setting functions will be added
+	in a forthcoming release.
+	Note that this function takes a TDes8. This is to allow for extensions
+	to the class as developments proceed apace. The function will always
+	fill the entire descriptor with zero and then copy the smaller of the
+	current size of the info class or size of the descriptor. Thus if a
+	new info class is used with an old O/S all new members are guaranteed
+	to be zeroed. If an old info class is used with a new O/S only the
+	appropriate slice of the new info struct is	returned. There is a
+	typedef for a packaged THalInfoV1 called THalInfoV1Buf which can be
+	passed to User::HalInfo(). Ofcourse later version will be derived
+	from THalInfoV1 as THalInfoV2 and so on, leaving a clear picture of
+	what has been added between versions. The object can be retrieved
+	from the package as follows:
+
+	THalInfoV1Buf b;
+	User::HalInfo(b);
+	THalInfoV1 &info=b();
+	test.Printf(_L("Machine name = %S\n"),&info.MachineName());
+
+	See the test program \E32\TCDT\T_HAL.CPP for details.
+
+7). The O/S was running DLL startup procedures before starting the file
+	server and window server threads. It has to do this to allow the
+	Window and File server DLLs to register their threads so that they
+	can be started in an ordered manner. However many other servers
+	like the alarm, comms and secokets servers would also like to start
+	the server thread from their E32Dll() entry point. The solution is
+	to hang all starting threads except the Window and File server
+	threads until the Window and File server threads have started.
+
+8).	Changed the RLibrary::Load() function so that it will automatically
+	add the approriate suffix for the current build. Thus if the file
+	server wants to load a .DLL called "elocal.fsy" it just uses
+	"elocal.fsy". The O/S will look for the .DLL names as follows:
+
+	   Build         Source     Suffix     Target
+	============  ============  ======  ==============
+	ansi release  "elocal.fsy"   none     "elocal.fsy"
+	ansi debug    "elocal.fsy"      d    "elocald.fsy"
+	uni release   "elocal.fsy"      u    "elocalu.fsy"
+	uni debug     "elocal.fsy"     ud   "elocalud.fsy"
+
+	Because of 8 character name limits the maximum length name of a DLL
+	can only be 6 characters. If an extension is not supplied it will
+	be assumed to be .DLL.
+
+9). Added TPtrC8::Set(const TDesC8 &aDes) and TPtr8::Set(const TPtr8 &aPtr)
+	and the TPtrC16 and TPtr16 equivalents.
+
+10).The resource file \E32\KPWINS\KWINS.RC was including afxres.h from
+	\msvc20\mfc\include which is not actually required. Fixed.
+
+11).Fixed a bug in TLex::Val(TInt?) which has been lurking from day one
+	and was scraping by through good fortune.
+
+12).Fixed a bug in creating global operating system objects such as
+	RSempahores etc.
+
+13).Changed CArrayPakBase to be derived directly from CBase rather
+	than CArrayVarBase. This was being done to share code but because
+	of the public inheritance it caused some nasty problems since a
+	CArrayPakBase is definitely not ISA CArrayVarBase. Users of this
+	class note that the sort function is SortL() and not Sort() since
+	it makes a copy of the array as a CArrayVar and then sorts it.
+	Making the copy can clearly fail. Also note that since the sort is
+	actually performed on a CArrayVar the key for SortL() needs to be
+	a TKeyArrVar. Other functions take a TKeyArrPak as normal. No code
+	should be affected by this change.
+
+14).Added const TArray<T> Array() to each of the array template classes,
+	which allows a degree of polymorphism amongst the arrays.
+	TArray<T> only allows const T &operator[]() and Count().
+
+	If you want a function to be able to read any of the arrays then
+	declare it as follows:
+
+	void ReadAnyArray(const TArray<TBuf_40> anArray);
+
+	It could use the TArray as follows:
+
+	TUint count=anArray.Count();
+	for (TUint i=0;i<count;i++)
+		test.Printf(_L("%S\n"),&anArray[i]);
+
+	Then if you have:
+
+	CArrayFixFlat<TBuf_40> *fix;
+	CArrayFixFlat<TBuf_40> *var;
+	CArrayFixFlat<TBuf_40> *pak;
+
+	They can all be passed to ReadAnyArray() as follows:
+
+	ReadAnyArray(fix->Array());
+	ReadAnyArray(var->Array());
+	ReadAnyArray(pak->Array());
+
+15).SteveT was getting a weird problem with delete in one of
+	his CBase derived classes with the virtual destructor calling the
+	delete from the Windows library. The fix to his problem is to
+	provide CBase::operator delete() even though its not necessary.
+
+Version 0.01.043
+================
+(Made by Colly, 21 Aug 1995)
+
+1). Renamed CBufFlat::Capacity() to CBufFlat::SetReserveL().
+2). Added the L suffix to all the methods in the ADT classes which
+	can leave.
+	CBufBase::InsertL(), CBufFlat::InsertL() and CBufSeg::InsertL().
+	CArrayFix::AppendL(), CArrayVar::AppendL() and CArrayPak::AppendL().
+	CArrayFix::InsertL(), CArrayVar::InsertL() and CArrayPak::InsertL().
+	CArrayFix::InsertIsqL(), CArrayVar::InsertIsqL() and CArrayPak::InsertIsqL().
+	Note that all occurences of ISQ (uppercase) have been changed to
+	lower case. Thus FindISQ() has become FindIsq().
+	Note also that the virtual function InsertL() has been renamed to
+	DoInsertL(), so that the derived classes do not have to re-define
+	the two new InsertL()'s in CBufBase.
+3). The CArray classes had a kludged way of delaying allocation of the
+	CBufBase. Fixed.
+4). Incorporated SteveT's changes to TPoint, TSize and TRect. His release
+	notes are as follows:
+		There are 3 changes to the TRect spec as agreed with Martin Tasker:-
+		Replaced
+			TInt TRect::InterSect()
+			with
+			void TRect::InterSection() &
+			TBool TRect::Intersects()
+		Changed the names of:-
+			TRect:Union() to TRect::BoundingRect()
+			TRect::Inside() to TRect::Contains()
+		I have also removed most of the inline functions from the TPoint,
+		TSize & TRect functions. The only ones left as inline are the
+		TPoint & TSize constructors and operator=, although I'm still not
+		too sure whether they should stay inline or not.
+5).	Changed CBufBase::Ptr() and CBufBase::BackPtr() to return TPtrs
+	rather than pointer and length.
+	Added CBufBase::Read(TUint aPos,TDes8 &aDes)
+		which will read aDes.Length() bytes.
+	Added CBufBase::Read(TUint aPos,TDes8 &aDes,TUint aLength)
+		which will read aLength bytes.
+	Added CBufBase::Write(TUint aPos,const TDesC8 &aDes)
+		which will write aDes.Length() bytes.
+	Added CBufBase::Write(TUint aPos,const TDesC8 &aDes,TUint aLength)
+		which will write aLength bytes.
+	Added CBufBase::InsertL(TUint aPos,const TDesC8 &aDes)
+		which will insert aDes.Length() bytes.
+	Added CBufBase::InsertL(TUint aPos,const TDesC8 &aDes,TUint aLength)
+		which will insert aLength bytes.
+6). Removed the protected destructor (not actually implemented) from CBase
+	and changed CBase::Destroy() so that it does not delete this.
+
+	Renamed	CBase::Destroy() as CBase::Destruct() and all other
+	virtual Destroy()s to Destruct().
+
+	Changed Adt::Destroy() to call delete after the Destruct().
+
+	This allows CBase derived objects to be aggregated by value, although
+	it is not Psion policy to do this (preferring to aggegrate by reference).
+
+	Note that there is no longer any requirement to call CBase::Destroy()
+	from classes derived from CBase.
+
+	Note that if aggregating by reference which should be the case for
+	all Psion code then the object must be destroyed with Adt::Destroy()
+	rather than the Destruct() function. Its probably a good idea to
+	search all code for ->Destroy() and check each case. Also make sure
+	that all classes derived from CBase	which have virtual void Destroy()
+	are changed to virtual void Destruct().
+7). CObjectIx, CObjectCon and CObjectConIx could all be created with
+	optional leave on error. This is not in the spirit of
+	the ADT classes and so I have removed the option. They will now
+	always leave on errors. The methods have been renamed where
+	applicable with the L suffix. These classes were also privately
+	derived from CArrayFixFlat<T> which was breaking the ISA
+	relationship with CBase, which prevents use of Adt::Destroy().
+	They now have a CArrayFixFlat<T> and are derived directly from
+	CBase. CObject and CObjectCon used to capitalise the name. They
+	are now case sensitive on the names. Note this affects server
+	names (watch out SteveT and Brendan).
+8). TPckg<T>::operator->() and TPckg<T>::operator()() were returning
+	const T * and const T & respectively. Fixed.
+9). Added HBufC::NewMax() and HBufC::NewMaxL() which allocate an HBufC
+	of the requested size and then set the length to the maximum length.
+	Note in the proposals database a function it was agreed to add
+	a function SetLengthToMax() to TDes. This has been done but I decided
+	to call it SetMax(). Obviously these functions are available for 8
+	and 16 HBufC's as well.
+10).If multiple inheritance is to be allowed for then the only way to
+	guarantee that an Adt::Destroy() through a CBase pointer will work
+	correctly is to have a virtual destructor. This has been implemented
+	in CBase. No derived classes need to be changed as the compiler will
+	generate the appropriate destructors automatically. If this seems
+	like a waste then I have to agree, however it will make us compatible
+	with the C++ language and all proper C++ implementations. If you want
+	to know more details then ask me, Gerry or DavidW.
+11).The ENTER,CATCH,END_ENTER mechanism had a serious flaw when using
+	a register calling convention. This has now been replaced with the
+	pre-processor macros TRAP and TRAPD. These are defined as below:
+
+#define TRAP(_r,_s) {TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+#define TRAPD(_r,_s) TInt _r;{TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+
+	Basically _r is an integer variable which will receive the result of
+	any User::Leave() and _s is a statement to be executed. It can be any
+	valid C++ statement, but will normally be a function call.
+
+	The difference between TRAP and TRAPD is that TRAPD will declare the
+	integer variable for you. The integer variable will always be
+	initialised to 0 before the statement _s is executed. It is possible
+	to use a number of statements for _s by separating them with ; but
+	this will possibly lead to failure.
+
+	Examples:
+
+	CSomething *pS=new(ELeave) CSomething;
+	TRAPD(ret,pC->ConstructL())
+	if (ret!=KErrNone)
+		{
+		Adt::Destroy(pS);
+		User::Leave(ret);
+		}
+
+	is the same as
+
+	CSomething *pS=new(ELeave) CSomething;
+	TInt ret;
+	TRAP(ret,pC->ConstructL())
+	if (ret!=KErrNone)
+		{
+		Adt::Destroy(pS);
+		User::Leave(ret);
+		}
+
+	If you have a function, say TInt DoSomethingL() and you want to
+	get the result of the function or the leave then do this:
+
+	TRAPD(ret,ret=DoSomethingL())
+12).Changed RHeap::Free() to zero the cell it has just freed in the debug
+	build.
+13).Added User::RequestComplete() which will complete a request in for
+	the current thread.
+14).Added a new CDT TCallBack which packages a function taking a TAny *
+	argument and returning an integer with a TAny * value. It has a two
+	constructors, the one which does not have a TAny * value will set the
+	value to NULL. It has one function CallBack which can be used to call
+	the function passing it the TAny * value. e.g.
+
+	class TMyIdle
+		{
+	public:
+		void Run();
+		static TInt Idle(TAny *aPtr);
+		};
+
+	TInt TMyIdle::Idle(TAny *anObj)
+		{((TMyIdle *)anObj)->Run();}
+
+	TMyIdle idler;
+	CIdle *pI=CIdle::New();
+	pI->ConstructL(TCallBack(TMyIdle::Idle,&idler));
+15).Added a new active object CIdle which will call back whenever
+	the active scheduler has scheduled all higher priority objects.
+	CIdle will re-schedule itself as long as the callback function
+	returns TRUE. It can be re-started by calling Start() again.
+	New() and NewL() add the idle object to the scheduler.
+16).Changed CPeriodic to use a TCallBack. Note the CPeriodic::RunL()
+	now always calls the callback.
+17).Added TLex8::UnGetToMark() and TLex16::UnGetToMark() which just
+	reset iNext to iMark.
+18).Renamed all the functions which were in the debug build but not in
+	the release build to have an __Dbg prefix. Also renamed the test
+	functions __TestInvariant() and __Test to __DbgTestInvariant and
+	__DbgTest. This is partly as a reminder to users of these functions
+	that they should only be used inside #if defined(_DEBUG) and partly
+	to ease producing the .DEF file to control the .DLL build process
+	using linkage by ordinal. An automated tool will generate the .DEF
+	file for a .DLL linked by name and will produce the .DEF for the
+	debug build. It can then produce the .DEF for the release build
+	by leaving out all the functions starting with __Dbg.
+
+Version 0.01.042
+================
+(Made by Colly, 3 Aug 1995)
+
+1). All DLLs now link by ordinal.
+2). The release versions had a startup bug with some configurations of DLL
+	useage. DavidW this is what cause the BAFL test code to fail.
+3). Includes the first release of the Epoc/32 microkernel platform and
+	implementation for 486 processor on an IBM/PC.
+
+NOTES
+=====
+
+Its a good idea to turn on DEBUG under link so that release EXEs and DLLs
+have at least the public symbols for debugging. This can be done for
+all build variants. I have done this for all .MAK files in E32 and F32.
+
+Version 0.01.041
+================
+(Made by Colly, 25 July 1995)
+
+1). RThread::Read() failed when reading a descriptor of the type
+	generated by TBufC::Des(). Added a test and fixed.
+2). Made the NULL thread hang around forever instead of exiting to help
+	with debugging.
+3). Added a new directory BWINS to the group which now has all the .MAK
+	files used to build the base. If the .MAK is in the same directory
+	as the source files then the debug databases .PDB files don't store
+	a full path which causes the debugger to prompt for the source
+	directory. Putting them in BWINS causes all paths to be stored in the
+	.PDB. Note that the BLD.CMD files remain where they were they just
+	pick up the .MAK file from BWINS. If using VC++ then load the .MAK
+	file directly from BWINS. Moved the startup files from USTAT to
+	UPWINS and dropped the USTAT directory from the group.
+	Split the startup module us_stat.cpp into two UP_EXE.CPP for
+	starting .EXEs and UP_DLL.CPP for starting DLLs.
+4). Split EWINS into two .DLLs. EWINS still	survives but now contains
+	just the user mode functions. KWINS is new and contains the kernel.
+	There is no need to change any .MAK files as it is only the
+	EWINSxx.DLLs which link to KWINSxx.DLL.
+5). Stopped releasing the include file E32CHAR.H.
+6). Merged the E32EVNT.H and E32WSRV.H header files into one header file
+	E32SVR.H which is just for communication with system servers such
+	as the Window server and File server etc. Moved the functions which
+	were in the UserWindowServer class to the UserSvr class and gave
+	the functions better names. Note that I have given the functions in
+	the UserSvr class more meaningful names. SteveT, these changes will
+	affect you!
+7). Fixed missing external references to _fltused, _adj_fdiv, _adjust_fdiv,
+	_adjust_fdivr_m64 and _adjust_fdiv_m64.
+8). Added the functions to support Global and thread local data in DLLs.
+	The functions are as follows:
+
+	TAny *Dll::Tls() - Returns the Thread Local Storage variable for the
+					   current DLL.
+	void Dll::SetTls(TAny *aPtr) - Sets the Thread Local Storage variable
+								   for the current DLL.
+	Usually in the entry point E32Dll() when the process is attached or
+	when a thread is attached to the DLL some memory will be allocated
+	on the threads heap. This value will then be saved with Dll::SetTls().
+	Thereafter it can be retrieved with Dll::Tls().
+
+	The following functions are not yet fully implemented:
+
+	TBool Dll::GlobalAllocated();
+	TInt Dll::GlobalAlloc(TUint aSize);
+	TInt Dll::GlobalRead(TUint aPos,TDes8 &aDes);
+	TInt Dll::GlobalWrite(TUint aPos,TDesC8 &aDes);
+
+	Dll::GlobalAlloc() allocates the global data for the currently
+	running	DLL. Specifying a size of 0 will free the data. The amount
+	of data allocated can be changed by calling Dll::GlobalAlloc()
+	repeatedly. It is normal to allocate the global data in the entry
+	point E32Dll() when a process attaches and when
+	Dll::GlobalAllocated() returns EFalse. There is no need to free
+	the data since if the DLL is unloaded the data will be freed. However
+	it is possible to use some of the allocated data to keep a reference
+	count which can be incremented on process attach and decremented on
+	process detach. When the count is zero it can be discarded.
+
+	Since the data is kept in the kernel the DLL cannot have direct
+	access to the data, so it must be read and written using the
+	Dll::GlobalRead() and Dll::GlobalWrite() functions. It
+	is considered a panic to write past the current size of the data
+	but not an error to read past the end of the data.
+
+	These functions are implemented in a class of their own since they
+	need to be statically linked with each DLL or EXE (note than an
+	EXE is also potentially a DLL) on the WINS platform.
+
+	Finally it is a good idea to minimize the size of the global data.
+
+	Look at the test DLL \e32\tcdt\t_dll.mak and the test program
+	\e32\tcdt\t_tdll.mak to see how this works in practice.
+
+9). Now release EXDLL??.PDB	files. These come from EXDLL??.OBJ which is
+	a start up module for EWINS??.DLL, KWINS??.DLL and LWINS??.DLL which
+	have special initialisation	requirements. These are just released as
+	an aide to debugging.
+
+NOTES
+=====
+
+It is now vital that programs are build with proper make files. In
+particular any program still linking to the C runtime library MSVCRT20.DLL
+will fail to start correctly. Note that we are only talking about the
+C runtime library and not the Win32 API libraries kernel32.lib,
+gdi32.lib, user32.lib etc. The C runtime library is no longer necessary
+as the base is now running entirely independently.
+
+All EXEs should be linked with ESTAT??.OBJ and should have _E32Startup
+set as the entry point.
+
+All DLLs should be linked with EDLL??.OBJ and should have _E32Dll set
+as the entry point. Remeber that a DLL must now supply a function
+E32Dll(). To see and example look at the code in \E32\DPWINS\WS_UTL.CPP.
+
+Everything should be linked with the user library EWINS??.LIB. Apart from
+other E32 software nothing else should be necessary.
+
+Make sure that "Ignore all default libraries" is set and that
+"Disable exception handling is also checked" and that alignment is
+set to 4 bytes.
+
+If you are not sure then start with one of the .MAK files released by
+the base and modify it to suit your project.
+
+Version 0.01.040
+================
+(Made by Colly, 20 July 1995)
+
+1). Converted the kernel to having a Kernel Supervisor Server and an
+	executive.
+2). Replaced the specific exit type of exception with a Panic() category
+	of Exception.
+3). Clean compiled all the platform independent source code with the GCC
+	compiler with the exception of the sources in UMATH.
+4). Added cleanup functionality to the kernel.
+5). Incorporated SteveT's fixes to pointer messages with the new screen
+	surround.
+6). Added Martin Dolphin's CArrayPacked classes. Renamed the classes
+	"Packed" to "Pak". His release notes follow:
+
+	 This version of CArrayPak inherits from CArrayVar and uses
+	 some virtual functions to achieve code reuse. TKeyArrayPak
+	 inherits from TKeyArrayVar.
+
+	 ucdt\uc_func.cpp
+		This has a slightly modified binary search.
+		This modification guarantees that:
+		//if no match is found.
+		//the index of the record logically following the value being searched
+		//for will be returned in aPos.
+
+	uadt\ua_array.cpp
+		Has the new CArrayPak code plus some other small
+		modification listed below.
+		CArrayFixBase::InsertIsq changed to reflect change in BinarySearch.
+		CArrayVarBase::Find, FindIsq have had unused length parameter
+		removed, some functions made virtual to achieve code reuse.
+8). Fixed further bugs in TInt64 divide and remainder functions as
+	reported by SteveT.
+9). Incorporated SteveT's changes to the region classes.
+10).Incorporated the faster versions of User::MemCopy(),User::MemFill()
+	and User::MemFillZ()
+11).Added two template inline functions to align pointers.
+	inline T *Align2(T *aPtr)
+	inline T *Align4(T *aPtr)
+	Align2 will make ((T *)&1)==0
+	Align4 will make ((T *)&3)==0
+	and two template functions to align integers.
+	inline TUint Align4(T aVal)
+	inline TUint Align2(T aVal)
+12).Removed the Notify() and SetNotify methods from RThread and RProcess.
+	They will re-appear in the file server in due course.
+13).Added the executive dispatcher to the kernel.
+14).Rationalised the RThread and RChunk read/write routines.
+15).Changed CActiveScheduler::Destroy() to just remove active objects
+	from the schedule queue. It used to destroy them as well. Before
+	removing each active object it will call CActive::Cancel();
+16).Fixed a bug in TLex8::NextToken() and TLex16::NextToken() which
+	was not checking properly for the end of the buffer. Found by Martin
+	Dolphin by trying to lex an empty command line.
+17).Changed the name of the key matching enumerates as follows:
+	TKeyArrayCmp to TKeyCmpText
+	TKeyArrayCmpNumeric to TKeyCmpNumeric
+	Added another constructor for comparing descriptors and changed
+	the order of the parameters as follows:
+	inline TKey(TUint anOffset,TKeyCmpText aType);
+		At anOffset should be one of the descriptor types, TPtr,TBufC etc
+	inline TKey(TUint anOffset,TKeyCmpText aType,TUint aLength);
+		At anOffset should be TText of length aLength.
+	inline TKey(TUint anOffset,TKeyCmpNumeric aType);
+		At anOffset should be an integer of some type.
+	Added support for TInt64s.
+	This change is propagated to the various TKeyArrayXXX:: classes.
+18).Fixed a race condition in the kernel when resuming threads.
+19).If a thread panics then it just quietly disappears. If this is
+	one of the server threads then the program appears to hang for
+	no reason. To this end I have added new services RThread::Server()
+	and RThread::SetServer(TBool aState). Any thread marking itself as
+	a server with RThread().SetServer(ETrue) will have its panics
+	reported through the messagebox and will then abort the program.
+	Note that this is done for the main thread as well.
+
+NOTES
+	All test programs pass in all builds.
+
+Version 0.01.039
+================
+(Made by Colly, 23 June 1995)
+
+1). Finally removed the dependency on the C runtime libarary.
+
+	There are new libraries in t:\msvc21\lib which should all
+	be copied to c:\msvc20\lib. This is still necessary as the
+	main operating system .DLL and SteveT's .DLL still link to
+	the runtime library MSVCRT20.DLL. Also copy
+	t:\msvc21\system32\*.* to c:\winnt35\system32\*.*
+
+	The build for a .EXE has now changed as follows:
+
+	a). Select project settings and highlight all 4 builds:
+			Select the Link tab and the Output category.
+			Set Entry-point symbol to _E32Startup
+			(The case is important in _E32Startup)
+			Select the general category.
+			Delete all the libraries/object modules.
+			Make sure "Ignore all Default libraries" is selected.
+	b). Select each build in turn and set the libraries/object modules
+		as follows:
+
+		Release     : \e32sys\estat.obj \e32sys\ewins.lib
+		Debug       : \e32sys\estatd.obj \e32sys\ewinsd.lib
+		Uni Release : \e32sys\estatu.obj \e32sys\ewinsu.lib
+		Uni Debug   : \e32sys\estatud.obj \e32sys\ewinsud.lib
+
+	If in doubt look at one of the test programs.
+
+	The build for a .DLL which is linked to Win32 does not need to
+	change at all.
+
+	The build for a .DLL which is linked only to E32 must be changed
+	as follows:
+
+	a). Select project settings and highlight all 4 builds:
+			Select the Link tab and the Output category.
+			Set Entry-point symbol to _E32Dll
+			(The case is important in _E32Dll)
+			Select the general category.
+			Delete all the libraries/object modules.
+			Make sure "Ignore all Default libraries" is selected.
+	b). Select each build in turn and set the libraries/object modules
+		as follows:
+
+		Release     : \e32sys\edll.obj \e32sys\ewins.lib
+		Debug       : \e32sys\edlld.obj \e32sys\ewinsd.lib
+		Uni Release : \e32sys\edllu.obj \e32sys\ewinsu.lib
+		Uni Debug   : \e32sys\edllud.obj \e32sys\ewinsud.lib
+
+	c). Provide a function prototyped as follows:
+
+		GLDEF_C TInt E32Dll(TDllReason aReason)
+
+		See \f32\sfsrv\fs_utl.cpp for an example of such a function.
+
+	The new system cannot be build with the project system at the
+	moment and must be built with the VC++ IDE. The correct build
+	order is as follows:
+
+	\e32\lsrc\lwins.mak
+	\e32\kpwins\ewins.mak
+	\e32\ustat\estat.mak
+	\e32\ustat\edll.mak
+
+2). Added the fancy graphics screen bitmap of protea to surround the screen.
+	It does not appear in its full glory on my work machine, but it does on
+	my home machine. Perhaps SteveT can sort this out for me. I am also
+	assuming that SteveT will handle the buttons on the imaghe and return
+	them as key strokes.
+3). CServer::RunL() was still using delete to remove a session when
+	a client disconnected rather than Destroy().
+4). Added a protected destructor to CBase which will stop any objects
+	derived from CBase being placed on the stack.
+5). Increased the Window servers stack to 1MByte.
+6). TInt64 divide was not working for large intergers.
+7). Absorbed SteveT's new region code.
+8). Fixed a bug in TLex::Val() which was not dealing with the end of the
+	descriptor properly. MartinH's fix.
+9). Added the TReal to buffer and buffer to TReal functions. The maths
+	library is now complete. Thanks to MartinH.
+10).Fixed a bug in CArrayFixBase::DestroyAll().
+11).Moved the TInt64 class from E32MATH.H to E32STD.H and its source
+	code from umath to ucdt.
+12).Took the additions to the bitmap allocator from JaneS
+13).New version of enter and leave which should fix previous problems
+
+NOTES
+=====
+
+1). T_LEX.CPP failed because the TReal functions now work. I have
+	commented these out until MH can fix them.
+2). T_THREAD.CPP and T_SEMUTX.CPP fail under the unicode debug version.
+	T_THREAD because their is a race condition in the kernel somwhere
+	and T_SEMUTX.CPP because there is a bug in the program logic. I will
+	fix these in the next release.
+
+Version 0.01.038
+================
+(Made by DavidW, 19 May 1995)
+
+One step backwards before taking two steps forward again!
+Put back RRegion::~RRegion to allow the Window Server and GDI to
+release new versions quickly, compatible with the latest E32, before
+they take more time over the next week to convert to a new RRegion
+scheme altogether.
+
+[Added later - fixed INCC.PRJ to release E32DES8.H & E32DES16.H]
+
+Also made a fix to MNT.CMD which meant that only the Release build
+versions were being released.  The ESTAT*.PDB files weren't being
+released either.
+
+Note: T_I64 still fails in UON.
+T_SEMUTX fails intermittently (in either UON and UOFF).
+
+Version 0.01.037
+================
+(Made by Colly, 19 May 1995)
+
+1). Fixed a bug in Math::Rand().
+2). Moved the private classes TRectKey and TRectSwap in RRegion
+	to be declared locally in u_regn.cpp.
+	RRegion still has a virtual destructor which I have now removed. I
+	notice that the test code t_regn.cpp does not test either the Close()
+	or Destroy() functions.
+3). Re-organized the entire group.
+	SUSER has been split into
+		UCDT	- User Concrete Data Types, platform independent
+		UPWINS	- User Wins platform dependent
+	SOLIB renamed to UADT - User Abstract Data Types
+	SMATH renamed to UMATH
+	TUSER renamed to TCDT
+	TOLIB renamed to TADT
+	SKERN renamed to KSRC
+	SWINS renamed to KPWINS
+	SWINSD renamed to DPWINS
+	SLOCL renamed to LSRC
+4). In line with the above I have renamed E32OLIB.H and E32OLIB.INL
+	to E32ADT.H and E32ADT.INL.
+5). Added class CBitMapAllocator to Adt. This class uses a bitmap to
+	control allocation of resources. It is used by the PageAllocator
+	in the micro kernel to allocate free physical pages. Another
+	potential use is in implementing a block allocation scheme in
+	a binary file such as a BTree index file.
+6). I have changed the way the version numbers are formatted by TVersion.
+7). Fixed a bug in RSubSession::Close() which did not check for a NULL
+	handle before despatching the close message to the server. It is
+	normal practice to allow a close on something which has never been
+	opened/created.
+8). Recorded the size of components in the release history.
+9). The localising code is now released separately as LWINS.DLL. This
+	is currently included in the base release zip file ewins. Note that
+	only ewins.dll has a dependency on this file so that no build files
+	need change.
+10).Changed TDblQueIterBase::Wind() and TDblQueIterBase::Rewind()
+	to TDblQueIterBase::SetToFirst() and TDblQueIterBase::SetToLast()
+	Also added TDblQueIter<T>::Set(T &aLink) which will start the
+	iterator on a particular link.
+11).Changed TSglQueIterBase::Rewind() to TSglQueIterBase::SetToFirst()
+	Also added TSglQueIter<T>::Set(T &aLink) which will start the
+	iterator on a particular link.
+12).Added a function Adt::DestroyZ(CBase * &anObject) which will
+	destroy an object if anObject is not NULL and will then zero
+	anObject.
+13).Added DestroyAll() to CArrayFixFlat and CArrayFixSeg which
+	assumes that the array is a set of CBase pointers, i.e.
+	CArrayFixFlat<CBase *>. The only check that is made is the the
+	record length==sizeof(CBase *). Note that DestroyAll() destroys
+	all the non-NULL pointers and then calls the normal Destroy().
+14).Added a new template class TAggregate to e32atd.h. The idea
+	behind TAggregate is to automate the desctruction of aggregate
+	objects in CBase derived classes. Say you have three active
+	objects owned by your object CMyObject the current way of
+	writing the class is as follows:
+
+	class CMyObject : public CBase
+		{
+	public:
+		CMyObject();
+		virtual void Destroy();
+		inline CTimer &Timer(*iTimer);
+		inline CServer &Server(*iServer);
+		inline CComms &Comms(*iComms);
+	private:
+		CTimer *iTimer;
+		CServer *iServer;
+		CComms *iComms;
+		};
+
+	And the Destroy() is as follows:
+
+	void CMyObject::Destroy()
+		{
+
+		Adt::DestroyZ(iTimer);
+		Adt::DestroyZ(iServer);
+		Adt::DestroyZ(iComms);
+		CBase::Destroy();
+		};
+
+	With TAggregate you would do it as follows.
+
+	class CMyObject : public CBase
+		{
+	private:
+		enum {ETimer,EServer,EComms,EMaxAggregate};
+	public:
+		CMyObject();
+		virtual void Destroy();
+		inline CTimer &Timer(*((CTimer *)iAgg.iPtrs[ETimer]));
+		inline CServer &Server(*((CServer *)iAgg.iPtrs[EServer]));
+		inline CComms &Comms(*((CComms *)iAgg.iPtrs[EComms]));
+	private:
+		TAggregate iAgg[EMaxAggregate];
+		};
+
+	And the destructor is as follows:
+
+	void CMyObject::Destroy()
+		{
+
+		iAgg.Destroy();
+		CBase::Destroy();
+		};
+
+	If one of the aggregates is removed or another is added all that
+	has to be done is add a new enum and the accessor method.
+	The Destroy() will automatically be correct. Note that there is
+	no additional overhead for the iAgg.iPtrs[] in the accessors.
+15).I have added a new template class TAutoClose to e32std.h which
+	will add a destructor to any class which has a Close() method.
+	This is	useful for functions in which you want to take advantage
+	of the compiler automatically destructing the object when it goes
+	out of scope. e.g.
+
+	TInt ReadFile(const TDesC &aFile)
+	//
+	// Read a file
+	//
+		{
+
+		TAutoClose<RFile> f;
+		TInt r=f.iObj.Open(aFile,KFileStreamText|EFileExclusive);
+		if (r!=KErrNone)
+			return(r);
+		TBuf_100 b;
+		if ((r=f.iObj.Read(b))!=KErrNone)
+			return(r);
+		.....
+		}
+
+	There is no need to call f.iObj.Close() as the compiler will do that
+	automatically when f goes out of scope. Even if the early return
+	after f.iObj.Read() is taken the compiler will still call
+	f.iObj.Close(). There is no overhead to using the TAutoClose class.
+16).Added SetMax() to TDes which set the length of the TDes to
+	MaxLength(). i.e. equivalent to:
+	TBuf_100 b;
+	b.SetLength(b.MaxLength());
+17).Added TPtrC::Set(const TText *aBuf,TUint aLength) and
+	TPtr::Set(TText *aBuf,TUint aLength,TUint aMaxLength)
+	since assignment of a TPtrC is not supported and assignment
+	of a TPtr means a deep copy rather than a shallow copy.
+18).Renamed the files E32DES8.INL and E32DES16.INL if E32DES8.H and
+	E32DES16.H
+
+Comp     Date   Bld  .text   .bss .rdata  .data .idata  Total
+===== ========= === ====== ====== ====== ====== ====== ======
+LWINS 17-Mar-95  37    822     32   1344   1092    268   2704
+EWINS 17-Mar-95  37  82484    560   6012   1156   2916  92568
+
+.text  = The code size (a good indication)
+.bss   = The uninitialized data size (a good indication)
+.rdata = The const data size (a good indication)
+.data  = The initialized data size (a good indication)
+.idata = C++ initialisation + .DLL export table (unreliable indication)
+
+The .idata section is unreliable since it has all .dll refences by name.
+As .dll references will be by ordinal rather than by name I expect these
+sizes to fall quite a bit.
+
+Note that the current conversion factor from VC++ to GC++ is multiply
+by 1.16
+
+NOTES
+=====
+
+1). I think that all the heap debug macros in e32std.h should be prefixed
+	with __ and should be moved to their own include file e32hdbg.h which
+	is included by e32def.h. I also removed the unnecessary spaces in
+	their declaration which have been added back in build 035.
+2). The functions RHeapDebug() in the RHeap class look like constrcutors
+	which they are not. The should be declared as returning void and
+	should also be given a different name. There are a number of comments
+	in the RHeap class declaration which I have removed.
+3). T_thread.cpp fails. Also this program was including the header file
+	k32kern.h so that is could call Plat::CurrentProcess() to get the
+	current process. It is a bad idea for any test programs to call any
+	function in the kernel. This won't be possible on any other platform.
+	The correct way to get the current thread or the current process is
+	just to use an RProcess() or RThread() constructor. i.e.
+
+	if (RProcess().Mark())
+		etc.
+
+	if (RThread().Priority==EPriorityNormal)
+		RThread().SetPriority(EPriorityAboveNormal);
+
+	This works because the constructor for an RProcess or RThread sets
+	the RThread or RProcess handle to a special token which means the
+	currrent process or the current thread. It does no have to be
+	opened or created in the normal way.
+
+	Also the current process can be got from the current thread e.g.
+
+	RThread().Process()
+
+	P.S. This was covered in the release 26 release notes.
+4). T_HEAPDB.CPP also includes k32kern.h (now k32std.h) so that it
+	can call Kern::UserHeap(). This is unnecessary as there is
+	already a call User::Heap() which returns the current heap. I have
+	fixed the test program.
+5). T_I64.CPP still fails on divide. I will fix this in the next release.
+
+Version 0.01.036
+================
+(Made by MartinB, 11 May 1995)
+
+1) New SetThreadAllocFail method in User (MartinH).
+2) New macros in e32def.h (MartinH).
+3) New Math functions and test code (MartinH),
+4) New ASSERT_DEBUGs in RHeap::Alloc.
+5) Removed User::SetWSAllocFail, since cannot have window server
+	dependencies in the base.
+6) Improved region code (Lane).
+7) Added several "long ptr" qualifiers in P_I64.CPP.  MSVC was
+	treating constants as 16 bit values when moved into (say)
+	[ebx]. (MartinB).
+
+All test code runs for ASCII DEBUG and UNICODE DEBUG builds (MartinB)
+(except T_I64 which does not run in UNICODE).
+
+Version 0.01.035
+================
+(Made by MartinB, 9 May 1995)
+
+1) Fix to Mul routine in P_I64.CPP.
+2) New region code from Steve/Lane.
+3) New T_THREAD test code from MartinH.
+4) New T_I64 test code from MartinH.
+
+All test code runs for ASCII DEBUG and UNICODE DEBUG builds (MartinB).
+
+Version 0.01.034
+================
+(Made by Colly, 9 May 1995)
+
+1). In both versions of RSessionBase::SendReceive() the parameter
+	TAny *aPtr can be passed as NULL.
+2). Converted the design E32 to make the categories Kernel, User and
+	Olib as units. This allows other designs to import these units.
+3). Added to RChannelBase overloads for DoRequest() and DoControl() which
+	allow none, one or two arguments.
+4). Added three functions to the TLex classes.
+	void SkipAndMark(TInt aNumber) which moves the mark along by aNumber.
+	TPtrC Remainder() which returns the remainder of the buffer after
+	the mark.
+	void Inc(TInt aNumber) which moves the pointer on by aNumber.
+5).	Added IMPORT_C TAny *operator new(TUint aSize,TUint anExtraSize)
+	to CBase.
+6). I have removed the resource file stuff from Olib because I do not
+	want the base to have a dependency on the file system. Note that in
+	due course the file server like the window server will live in its own
+	group and is only included with E32 for convenience while I develop
+	it. The file server is already completely independent of the operating
+	system.
+	I suggest that we have two DLLs called something like HCILI and HCILU.
+	HCILI would contain user interface independent code and HCILU would
+	have user interface dependent code. Then a getbld can go something like
+	this:
+
+	GET E32		// The base
+	GET F32		// The file server
+	GET W32		// The window server
+	GET HCIL	// Both HCIL DLLs
+
+	I originally intended to supply the base as 3 DLLs, i.e.
+	E32KERN.DLL,E32USER.DLL and E32OLIB.DLL I now intend to supply it as
+	just two merging E32OLIB.DLL and E32USER.DLL into E32USER.DLL. For
+	those who are fond of the name OLIB I am quite happy to relinquish
+	the name and HCILI.DLL could be OLIB.DLL. But OLIB is a funny name
+	as it stands for Object library which is strange since all libraries
+	are now object libraries. Maybe its time for OLIB to just disappear.
+7). In messages associated with a RSubSession the handle was being passed
+	in P1(). This was not the best option so I have now changed it to P4().
+	Note that for a SubSessionCreate message a descriptor is passed in P4()
+	rather than P1() which a server should use to write back the handle
+	of the sub session. See \e32\swinsd\ws_main.cpp for an example of the
+	approriate code.
+8). Added Math::Rand(TInt64 &aSeed). This returns a random number in the
+	range 0 to KMaxTInt (i.e. positive) and updates the seed.
+9). Renamed the operating systems Segment to Chunk to avoid confusion on
+	80x86 platforms with segment registers. Thus RSegment has become
+	RChunk and User::SegmentHeap has become User::ChunkHeap.
+10). The function Test::Next() was assuming a zero terminated string. Fixed.
+11). RProcess::CommandLine() was not getting the full command line. Fixed.
+
+NOTES
+=====
+
+1). MartinB. Surely HufEncode should belong to class TDes and convert its
+	argument a TDesC into the TDes rather than belong to TDesC. As well
+	don't we need a second version of HufDecode called something like
+	HufDecodeInPlace which will do a decode in place on a TDes since
+	this is what the resource system does currently. Finally should we
+	not make a 32 bit version of the resource compiler.
+2). There is a #define test in E32TEST.H. All #defines should be in
+	upper case.
+3). Why does RRegion have a virtual destructor, a Close() and a
+	Destroy(). I suspect that the destructor should go.
+4). In TOLIB t_ctimer.cpp and t_cact.cpp both have a #include to
+	\e32\olib\o_std.h. This is not correct!
+5). In TUSER t_heapdb.cpp has a dependency on the window server header
+	file and in fact uses the window server. This is definitely
+	incorrect?
+6). Can everyone try and make an effort before releasing E32 that
+	all projects are left in the DEBUG build and that all test
+	programs do not have windows open and breakpoints left enabled.
+
+Version 0.01.033
+================
+(Made by MartinB, 4 May 1995)
+
+1) Changed jcxz to a jecxz in P_I64.CPP (!!!)
+2) Fixed some alloc heaven in CArrayVarBase::Delete.
+3) Improved T_RSC test code.
+4) Added MaxSize() to TDes.
+5) New RRegion code from Steve.
+6) Loads of test code from MartinH.
+7) Note u_heap.cpp temporarily includes <stdlib.h> (for
+	random number generators) for heap alloc failure testing.
+	This is a temporary  measure until the real file handling an
+	random number generation becomes available.
+8) T_HEAPDB requires window server to run (since it tests for window
+	server heap failure).
+
+All test code runs for ASCII DEBUG and UNICODE DEBUG builds (MartinB).
+
+
+Version 0.01.032
+================
+(Made by MartinB, 26 April 1995)
+
+1) Added a new CResourceFile class (and its superclass CFile).  CFile
+	uses standard C files as a temporary measure until Colly
+	releases the real filing system.
+2) Added a KErrFile const to go with the above.  Again a temporary
+	measure.
+3) CResourceFile reads resource files produced using our resource
+	compiler.  (S_.RSC and S_.RZC were used in the test code, and
+	form part of the release of the test code).  Note that
+	CResourceFile also reads compressed resource files.  This
+	meant that:
+4) Added Huffman compression for TDes16.  Actually this does not
+	quite work yet, one or two of the test cases are #ifdefed out
+	in the UNICODE build.  However it is 90% there and I have a
+	good idea of what the problem is (its to do with the unused
+	byte at the end when the descriptor compresses to an odd number of
+	bytes).
+5) New test code from MartinH.
+6) Minor fixes to threads from Colly/MartinH.
+
+NOTES
+=====
+
+1) Should we have a TDes::MaxSize() function?
+
+2) All test code runs for ASCII DEBUG and UNICODE DEBUG builds, except
+	T_RSC does not run in UNICODE.
+
+
+Version 0.01.031
+================
+(Made by Colly, 18 April 1995)
+
+1). Changed KEventPending to KRequestPending.
+2). Made CActiveScheduler::Start() call the virtual function
+	WaitForAnyRequest().
+3). Fixed ..\rel\ewinsdb.prj to release the estat*.pdb files
+	rather that wwins*.pdb files.
+4). When a thread had an exception or was killed, terminated or
+	panicked, execution unfortunately continued. Fixed.
+5). Added a function User::Dying() which is called by all the kernel
+	functions just before they kill,terminate,except or panic a thread
+	or process. This is a very good place for a breakpoint when
+	debugging. It will catch everything.
+6). Added support to dynamically load a DLL and then lookup functions
+	in the DLL. See class RLibrary.
+7). Added support for device drivers. See User::LoadDevice() and
+	User::FreeDevice() as well as the example device driver in
+	\e32\swinsd\d_timer.mak and its test program \e32\swinsd\t_devc.mak.
+8). Added a constructor to all TFindHandle derived classes to allow
+	initialisation with the find string.
+9). Converted the rose designs to rose 2.525
+
+NOTES
+=====
+
+1). The fact that CActiveScheduler::Start() is static is no reason why
+	the virtual function WaitForAnyRequest() cannot be called. Just use
+	the static pointer to the scheduler:
+	theActiveScheduler->WaitForAnyRequest()
+
+All test code runs for ASCII DEBUG and UNICODE DEBUG builds (MartinB).
+
+
+Version 0.01.030
+================
+(Made by Colly, 12 April 1995)
+
+1). Removed the virtual destructor in CBase. Added vitrual void Destroy().
+	CBase::Destroy() now calls delete this. It is now generally necessary
+	to call the base classes Destroy() in order to get proper destruction
+	of the object. Note that the DeleteAll methods in TDblQue and TSglQue
+	only work if the objects on the queue are derived from CBase. Added
+	a static function Olib::Destroy(CBase *anObject) which will only
+	destroy the object if anObject is not NULL.
+2). Added a static function:
+	CActiveScheduler * CActiveScheduler::Current();
+	which return the currently installed active scheduler.
+3). In RSubSession::CreateSubSession() was not passing as P1() in the
+	message the address of the reply so that the subsession handle could
+	be returned by the server.
+4). Creating a semaphore with an initial count other than 0 did not set
+	the internal count with the initial count although the Windows/NT
+	semaphore was being set correctly. The same bug applied to Mutexes.
+5). When a process was dying its access count was not being decremented
+	so that if no handles were outstanding the object was not being
+	destroyed.
+6). CObjectIx::Add() and CObjectCon::Add() were closing the object being
+	added if the add failed. This proves to be unhelpful so they have
+	been changed to just fail and not do the close.
+7). Added the following functions to RThread and RProcess to determine
+	the reason a thread or process exited.
+	IMPORT_C TExitType ExitType() const;
+	IMPORT_C TInt ExitReason() const;
+	IMPORT_C TName ExitCategory() const;
+8). The design of the CPeriodic class made it unusable. This has now been
+	changed so that the New functions add the active object to the
+	scheduler. Start() is now defined as:
+
+	void Start(TInt aDelay,TInt anInterval,
+			   TPeriodicCallBack aCallBack,TAny *aPtr);
+
+	which allows a CPeriodic to be restarted after it has been cancelled.
+	StartL() has been dropped since Start() is void.
+	There was also a bug in the RunL() method in that it issued the callback
+	and then requested the next timer. It should request the next timer and
+	then issue the callback.
+
+The following merged in by MartinB:
+
+9) Removed double definition of TText8 and TText16 form e32def.h
+10) Moved enclosing #endif (matched to #if !defined(__E32DEF_H__)) to
+	end of e32def.h.
+11) Changed make files so that .PDB files are built into \e32sys.
+12) Added virtual WaitForAnyRequest to CActiveScheduler.  This is not
+	called from Start, however, since Start is a static function.
+	After discussion with DW I retained User::WaitForAnyRequest
+	in Start, until we have time to discuss which functions
+	should be static.
+13) Changed KErrPending to KEventPending.
+
+
+Version 0.01.029
+================
+(Made by Martin, 3 April 1995)
+
+1) New alloc testing code does not include filename and lineno
+	(MartinH).
+2) New SglQue test code (DougF).
+3) New test code (JalP).
+4) Move common functionality of TKeyArrayFix and TKeyArrayVar into
+	TKey (JalP).
+5) Fix to TEnter (DavidW).
+
+All test code runs for ASCII DEBUG and UNICODE DEBUG builds.
+
+
+Version 0.01.028
+================
+(Made by Colly, 22 Mar 1995)
+
+1). Definitely the last name changes for the descriptor and buffer classes.
+		Old Name		New Name
+		========		========
+		TDesC			TDesC
+		TDes			TDes
+		TBufBase		TBufCBase
+		TBuf			TBufC
+		HBuf			HBufC
+		TDesR			TPtrC
+		TDesW			TPtr
+		TBufW			TBuf
+
+	Note that the function:
+		TDesW DesW()
+	in TBufBase has now been renamed:
+		TPtr Des()
+	Its helpful to consult the Rose class diagram to see why these names
+	are sensible.
+2). Took Steve's new region code.
+3). Added the missing #defines for __TEST_INVARIANT.
+4). Changed the graphics window to position to 10,10.
+5). Fixed the re-entrancy bug with UserWindowServer::Request().
+6). Added the fix to stop the beep on ALT + char.
+7). Added the code for User::Abort() and User::Exit().
+8). User::Panic() was panicking the process and not the current thread
+	making it impossible to run test threads to see if they panic.
+
+	All the test code passes under the DEBUG build.
+
+NOTES
+
+1).	The virtual destructor in CActive is calling the virtual DoCancel
+	which since the destructor is running at the CActive level has
+	no method to call as its pure virtual. The only reasonable solution
+	is to introduce a virtual Destroy() function to CBase() which can
+	do the necessary cleanup and then do the delete.
+2). Many of the test programs do not have a standard comment header.
+	One did not even have a header.	This is just careless.
+	I have fixed them all.
+3). Many people when declaring an enum leave a comma on the last
+	declaration which is untidy.
+4). A number of people are decalring automatic variables with capital
+	letters. Please avoid this practice.
+
+
+Version 0.01.027
+================
+(Made by Martin, 16 Mar 1995)
+
+1) Changed TBuf to TBufW, TLcb to TBuf and TLcbH to HBuf.
+2) Fixed .lnk files so test code works if built from command line
+	(Duncan).
+3) New T_REF test code (Jal).
+4) Added previously missing RRef<T>::AllocL to e32std.inl (Jal).
+5) Fixed bug in RRefBase::DoAlloc (Jal).
+6) Added invariant to TDateTime (Gill).
+7) Improved T_DATE test code (Gill).
+8) Improved T_KEY test code (MartinH).
+9) Fix to heap checking code (MartinH).
+10) Changed T_QUE to use V classes (rather than S classes) (Doug).
+11) Made iInterval protected (was private) in CPeriodic (at Steve's
+	request).
+12) This release contains a zip file release (in s:\e32\zip) so that
+	users should not need to build E32.  Only the ASCII DEBUG
+	version has been released.
+
+All test code (ASCII DEBUG) can now be built and run from the command line
+(except T_HEAPDB).
+
+Actions:
+
+1) Now that C classes rely on zero filling for initialisation their
+	definitions MUST be changed so that they cannot be declared on the
+	stack.
+2) MartinH to fix T_HEAPDB.
+3) Steve to complete transformation of CRegion to RRegion.
+4) MartinB to complete (or remove) Huffman encoding (did not have
+	time to do it this release).
+5) T_ARRAY and T_VARRAY need more test.Start() and test.Next()
+	messages (Jal).
+6) Many classes still have no __TestInvariant methods (All).
+7) CBufSeg has a test class defined under #if defined(_DEBUG) (Jal).
+
+
+Version 0.01.026
+================
+(Made by Colly, 11 Mar 1995)
+
+1). Added an operator new() to class CBase which fills memory with zeroes
+	so that most constructors need do nothing. Note that a constructor
+	is still required in order to set the name of the class in debug
+	builds.
+2). Changed the RProcess::FileName() and RProcess::CommandLine() functions
+	to return their result rather than take an them as reference args.
+3). Added RHandleBase::Duplicate(RProcess aSrc) which allows a handle from
+	another process to be duplicated in the current process. This is also
+	the mechanism by which the pseudo handles for the current thread and
+	the current process to be turned into real handles. i.e.
+
+	RThread self;
+	self.Duplicate(RProcess());
+
+	Note that you will now need to call self.Close() at some stage since
+	the resource must be freed.
+
+	In case you have missed the examples in ..\tuser\t_kern.cpp
+	instantiating a RThread or RProcess by default give handles to the
+	current thread and current process respectively. i.e.
+
+	RThread().Name() will return the current threads name.
+
+	These objects use a pseudo handle since it is not possible to close
+	these handles since if you could close them they would have to
+	delete the current thread or current process. Since these are pseudo
+	handles passing them to another process will not work as in the other
+	process they will also mean the current process and current thread.
+	Duplicate overcomes this problem since it gives a real handle to
+	either the current thread or the current process.
+4). Added the RThread::Logon(),RThread::LogonCancel(),RProcess::Logon()
+	and RProcess::LogonCancel() functions.
+5). Cleanup on Thread termination by the kernel now implemented.
+6). RThread::Kill(),RThread::Exit(),RProcess::Kill() and RProcess::Exit()
+	implemented fully.
+7). Changed Plat::Panic() and Plat::Fault() to always use the desktop
+	window for the messagebox.
+8). Changed to build options for all variants. Everyone should make a new
+	.MAK file from T_KERN.MAK as a prototype. Presumably the tool sets
+	will have to be updated to reflect these changes. Also fixed a number
+	of link failures which had crept into the system.
+9). Note that because of the use User::SetVaArgList() the optimisation
+	in the release versions to drop stack frames cannot be used.
+10). The definition of the private class TLink in CBufSeg is a waste
+	of space in the headers. So I have declared a forward reference
+	to the class TBufSegLink and then only need the actual declaration
+	and implementation in O_BUF.CPP.
+
+The following merged in by MartinB:
+
+11) Uses new toolsets (use TOOLS WINS and TOOLS WINSD to get them).
+12) New T_DES test code. (From Duncan).
+13) Fixed integer compares in TKeyArrayFix and TKeyArrayVar. (From
+	Jal).
+14) Fixed bug in CArrayFixBase::InsertISQ. (From Jal).
+15) Added classes: TSglQueLink, TSglQueBase, TSglQue, TSglQueIterBase
+	and TSglQueIter. (From Colly). (No test code yet).
+16) Added classes: RRefBase and RRef. (From Colly). (No test code
+	yet).
+17) Added Alloc functions that take a size parameter to RRef classes
+	(at Jal's request).
+18) Added __TEST_INVARIANT macro to e32std.h. (from MartinH).
+19) Added MartinH's heap checking code.  Note took some functions
+	even though they were not commented - they will be commented for next
+	release.
+20) Took keycode code from DavidB.  NOTE: P_STDKEY.CPP still contains
+	some numbers that should be converted to symbolic constants.
+21) Small changes to code in winsd from Steve.
+22) Changed User::MemSwap in u_func.cpp so that it does not swap if
+	memory locations are identical.  There is an argument to do
+	this in the compare routines as well.
+23) Moved region to e32std.h and called it RRegion.  Steve will implement it as
+	a proper 'R' in a subsequent release.
+
+ASCII Debug version only was tested.
+
+All test code passes except T_QUE which fails on DeleteAll.  Note
+that
+
+T_HEAPDB, T_ARRAY, T_CACT, T_VARRAY fail when built from the command
+line.
+
+Version 0.01.025
+================
+(Made by MartinB, 7 Mar 1995)
+
+1)  From Gillian: New TDateTime code.
+	Changed DateAsString() to Format().
+	Removed 3 unnecessary Add() functions.
+	Ammended t_time.cpp test code.
+	Renamed u_time.cpp to u_date.cpp (to lessen confusion with
+	timer code).
+2)  From Jal: Bug fix in CBufSeg::Delete() method. New test code.
+3)  From Duncan: mnt.cmd altered to build math functions and test code.
+4)  From Duncan: Updated all .lnk files for test code, so that they are built as
+	windows rather than console applications.
+5)  From Duncan: Introduced bld.prj in SMATH: this contains all the buildable math
+	routines (there are some .cpp files in li.prj that have not yet
+	been converted to E32).
+6)  From Duncan: Introduced bld.prj in SWINSD: this contains all the buildable cpp
+	files (there are some .cpp files in li.prj that have not yet
+	been converted to E32).
+7)  From Doug: Removed DEBUG friend declarations from Que classes.
+8)  From Jal: New CRefCountBase and CRefCount classes added to Olib.
+9)  From MartinH: New TKeyArrayCmpNumeric comparision types for
+	TKeyArrays.  Ammended T_KEY test code.
+10) From MartinH: Ammended T_ACT test code.
+11) From DavidW: new T_VERSION test code.
+12) Minor fixes to test code.
+
+All ASCII DEBUG test code runs.  There is one anomally: T_COBJ runs
+fine if build inside VC++ but panics with a user panic of 37 if built
+from the command line.  It was getting late so I decided not to track
+this one down.
+
+Version 0.01.024
+================
+(Made by Colly, 1 Mar 1995)
+
+1). Renamed TPackage to TPckgBuf which packages an object in a TBuf8 and
+	added TPckgC which packages in a TDesR8 and TPckg which packages in
+	a TDesW8.
+2). Added new Panic function to RMessage which panics the client and
+	frees the message as well as one to CSession which just panics the
+	client. This is necessary as the Client() functions return a const
+	RThread & on which Panic cannot be called.
+3). Noticed that Convert(const TDesC &aDes,...) would not work properly
+	as taking the address of aDes on the stack would fail. Changed to
+	use the User::SetVaArgList() function. Also removed the version
+	of Convert which took a string as an argument. Fixed the test
+	code accordingly.
+4). My code in the example window server client side code was being very
+	naughty and assuming that all arguments were being passed on the
+	stack (TRUE for VC++, but not TRUE for GCC ARM code generation). Fixed.
+5). Removed the function numbers from the RWindowServerBase class as
+	they can be entirely private.
+6). The platform code to get system time was not subtracting 1 from the
+	day so TDateTime was correctly panicking the kernel on 28 Feb since
+	it was trying 29 Feb.
+
+Version 0.01.023
+================
+(Made by Colly, 27 Feb 1995)
+
+1). Moved the region code to SUSER in the file U_REGN.CPP. Moved the
+	test code from TOLIB to TUSER.
+2). The OLIB CServer class was deleting the server object on disconnect
+	rather than the CSession. Fixed some other bugs as well.
+3). Renamed CActive::Run() to CActive::RunL() to indicate that it may
+	leave.
+4). Renamed CServer::Service() to CServer::ServiceL() to indicate that
+	it may leave.
+5). Renamed CServer::NewSession() to CServer::NewSessionL() to indicate
+	that it may leave.
+6). Added the TInt64 class and a number of the maths functions. See
+	\e32\inc\e32math.h.
+7). Completely changed the whole scheme for E32 programs from being
+	console based to being GUI based. Test programs will write to
+	a normal Windows/NT console and the GUI window will be ignored.
+	All GUI programs now need to link with a window server library,
+	i.e. one of wwins,wwinsd,wwinsu,wwinsud. See the make file in
+	\e32\tuser\t_gui.mak.
+	A basic window server which just provides console services can be
+	found in swinsd in the project wwins.mak until Steve can get his
+	window server running.
+	All programs now use:
+	GLDEF_C TInt E32Main()
+	for the main program instead of main().
+	The functions for the basic window server and console are in header
+	\e32\inc\e32wsrv.h. Steve will provide these and extended functions
+	by subclassing these in his Window server library.
+8). Added a variant to RThread::Read() which allows an offset to be
+	specified withing the descriptor to allow reading in smaller chunks
+	in case the user sends over a huge chunk of data.
+9). Added the TEvent class and various functions all of which are
+	only for a Window server. I will discuss these with Steve directly.
+	The data is in \e32\inc\e32evnt.h.
+10). The CArray classes were leaving in their constructors. Fixed by
+	 delaying allocation of the CBufBase till an insert. Increased
+	 the error checking.
+11). The kernel was not doing unicode properly since UNICODE was
+	 not defined in \e32\swins\p_std.h before windows.h was included.
+12). Added TDes8::Copy(const TDesC16 &aRef) and
+	 TDes16::Copy(const TDesC8 &aBuf) conversions between 8 and 16.
+
+	Notes:
+
+	Many of the test programs were not keeping test.Start() and
+	test.End() in balance.
+	In U_TIME.CPP the unicode build was disabled because Gillian
+	was using a TLex8 instead of a plain TLex8. I also not that
+	the API for DateAsString takes the format string as a pointer
+	and not as a reference. Also the name of the function should
+	surely be Format().
+
+Version 0.01.022
+================
+(Made by Martin, 17 Feb 1995)
+
+1) Fixed construction of TLex over strings.
+2) New time class from Gillian.
+3) Fixed t_buf,t_bflat and t_bseg test code from Jal.
+4) Fixed t_lex test code from MartinH.
+5) Changed CRegion to RRegion (after consultation with Steve).
+6) NOTE: the TDateTime::DateAsString function fails to build under
+   unicode.
+7) K_MES.CPP does not build under UNICODE, search for !!! string to
+   find where.
+
+Note that there are new wins and winsd toolsets and a new version of
+EPR.  Get these by doing
+		TOOLS WINS
+		TOOLS WINSD
+in the usual way.
+
+Version 0.01.021
+================
+(Made by Colly, 16 Feb 1995)
+
+1). In TUSER t_buf,t_lex do not compile.
+2). In TOLIB t_bflat,t_bseg do not compile.
+3). In TOLIB t_cact,t_cobj compile but fail. Note t_cact was t_creq.
+4). Made the kernel platform function Plat::SetVaArgList(VA_LIST &aList)
+	public in class User. This function was written assuming the argument
+	const TDesC &aFmt was the first argument. Using it in
+	Test::Panic(TInt anError,const TDesC &aFmt
+	would not work correctly. Changed this function to take a second
+	argument which says how many bytes to skip before the
+	const TDesC &aFmt argument. For Test::Panic this is 4 and 0
+	for all other uses.
+5). Renamed CRequester to CActive and CRequestManager to CActiveScheduler.
+6). Renamed all T classes which require closing to free their resources
+	to R classes. I have not renamed CRegion to RRegion in this release
+	but would propose that we do this (Steve?).
+7). Added User::At() and User::After() to put the current process to
+	sleep for relative and absolute time repectively. These are sync
+	functions.
+8). Implemented the RMessage, RServer and RSessionBase classes and added
+	the Olib classes CServer and CSession. See the T_SVR.CPP test code
+	to see how these are used.
+9). Renamed t_req.* in TOLIB to t_act.*
+10). Added the template class TPackage<T> which will package any type
+	 T in a TBuf<sizeof(T)>. Note the -> and () operator overloading.
+
+	 TPackage<TVersion> v;
+	 v->iMajor
+	 v().iMajor
+
+	 This is most useful for passing and receiving non TDesC arguments
+	 to a server so that the server can subsequently read/write to it.
+11). Added the minimum,maximum values for all integers in e32std.h look
+	 for KMaxTInt8 etc.
+
+Queries
+-------
+
+1). Are we going to implement a 16 bit version of Hufman coding. If not
+	then we cannot have this functionality as there cannot be a difference
+	between 8 and 16 bit character versions as far as functionality goes.
+2). Someone put #ifdef UNICODE into one of the files in swins. This is
+	wrong and should have been #if defined(_UNICODE). Although Microsoft
+	are confused we should always use the _UNICODE form.
+3). I think we should rename User::Check and User::Available to have
+	Heap in their name somewhere.
+
+Version 0.01.020
+================
+(Made by MartinB, 15 Feb 1995)
+
+1)  Removed (most) string functions from descriptors.
+2)  Fixed bug in unicode Printf.
+3)  Time class changed to DateTime.
+4)  Made some queue parameters constant.
+5)  Tidied up some of the Locale code.
+6)  Tidied up mnt.bat and renamed it to mnt.cmd.
+7)  Fixed Format for %S in descriptors.
+8)  Added Huffman coding to TDesC8 (finally).
+9)  Added some DateTime validation routines.
+10) Removed SetActive and SetInActive functions from CRequestors.
+11) Fixed most test code to run with the new descriptors, but there
+was too much to do for some (ie t_buf, t_lex, t_bflat).
+
+Version 0.01.019
+================
+(Made by Colly, 7 Feb 1995)
+
+1). Added the new TTimer concrete data type (CDT).
+2). Added the OLIB classes CRequestManager and CRequester.
+3). Added the OLIB requesters CTimer and CPeriodic.
+4). UNICODE needs to be defined as well as _UNICODE.
+5). Fixed a bug in TDblQueIter where neither the inc or dec operators
+	returned NULL at the end of the queue. Changed the test code to deal
+	with this. Note that if the iterator is positioned at the end of the
+	queue it will also return NULL when being casted.
+6). Fixed a bug in the TDes::Format(const TDesC &aDes) functons which
+	when try to set up the VA_LIST were taking the address of aDes and
+	getting it rather than the expected address of the argument on the
+	stack. Fixed by using the new User::SetVaArgList() function. The
+	test code is not testing this part of the code.
+7). Added the new static time validation functions to User.
+8). The User::WaitForRequest() type functions are now operational.
+9). Added the device driver code. Still to write a test device driver
+	but this will probably be a console device.
+10). Changed all the kernel classes to be D something rather than C
+	 something to avoid name clashes with OLIB.
+11). Changed the CObject class to allocate the name of the resource so
+	 that NULL can be used to indicate an unnamed object. This has
+	 changed the API's for some of the CreateLocal functions to no
+	 longer require a name, i.e. TSemaphore::CreateLocal().
+12). Changed all the API's to the kernel to use const TDesC& rather
+	 than const TName& etc.
+13). All tests pass in non-unicode debug.
+
+Version 0.01.018
+================
+(Made by MartinB,  3 Feb 1995)
+
+1) Improvements to MartinH's test code.
+2) Uses new format link files (so needs new tools release).
+3) Incorporates Duncan's test code.
+4) Improvements to Strings in test code (ie _TL macro).
+5) Removed most of the #if defined(_DEBUG) stuff from include files,
+   but not for the friend classes.  Working on a plan for this though.
+6) Fixed T_VARRAY .MAK file (was building T_ARRAY).
+7) This is a consolidation release.
+
+Version 0.01.017
+================
+(Made by Colly, 26 Jan 1995)
+
+1) Integrated the changes in preparation for device drivers.
+2) Note that the #if defined(_DEBUG) stuff for queues in the
+   headers is unacceptable.
+3) Note that I am not confident of the enumerate for EAllowDuplicates
+   nor the provision of default parameters.
+
+Version 0.01.016
+================
+(Made by MartinB, 24 Jan 1995)
+All test code passes.  (But have not tried UNICODE build).
+
+Now builds with 32bit EBLD.  To get this type
+
+TOOLS ETSET
+TOOLS WINS
+TOOLS WINSD
+
+You can then do MNT BLD etc from the command line.
+
+1) Added _S macro and changed _L macro in preparation for removing
+   strings from descriptors.  Changed code to use _S and _L so that
+   strings could be easily removed in next release.
+2) Took T_TKEY test code from MartinH.
+3) Removed Free from CBuf class.
+4) Minor bug fixes here and there.
+5) Took Que code from Douglas
+
+Version 0.01.015
+================
+(Made by Colly, 18 Jan 1995)
+
+1).	Made the final re-organisation to the descriptors and introduced
+	the new derived class TDesR. Note that TDesC and TDes are real
+	abstract base classes as they cannot be directly instantiated.
+	(They have no contructors). Note that functions like Mid(),Left()
+	etc. now return a TDesR.
+
+	Added the template TLcb class. This class is intended for use
+	as a member of a struct or class since it needs the minimum
+	storage space.
+
+	This is similar to the TBuf class except that it is a length
+	followed by the buffer, i.e. no max length. Thus apart from
+	assigning to it and behaving as a TDesC a TLcb cannot be
+	manipulated as it was a TDes. However help is at hand since there
+	is a function DesW() which return a writeable descriptor through
+	which a TLcb can be manipulated in the same was as a TBuf. i.e.
+
+	TLcb<KMaxName> b;
+	b=_L("   Some spaces");
+	b.TrimLeft(); // This will fail.
+	b.DesW().TrimLeft(); // This will work fine.
+	b.DesW().UpperCase();
+
+	If a lot of write operations are to be performed on the TLcb then
+	it is more efficient to take a copy of the TDesW. i.e.
+
+	TDesW w=a.DesW();
+
+	Note that there is no public constructor on TDesW for a TLcb
+	directly as it would need you to pass the maximum length as well
+	which is best left to the template to do on your behalf.
+
+	If a function needs a writeable descriptor then just pass b.DesW()
+	and all will be well.
+
+	As a last final thing for descriptors I have added one final class
+	TLcbH (H stands for heap). A TLcbH has the property that the TDesW
+	returned by DesW() has its iMaxLength set to the size of the alloc
+	cell - sizeof(TUint). A fine feature of	this is that the length of
+	an alloc cell which is always present can now be used to good
+	purpose. It is also possible to call the TLcbH member functions
+	ReAlloc() or ReAllocL() on the cell and the get another TDesW
+	which will have changed its iMaxLength to the new size of the cell.
+
+	TLcbH *TLcbH::ReAlloc(); // Returns NULL if fails
+	TLcbH *TLcbH::ReAllocL(); // Leaves if fails
+
+	It is possible to directly construct a TLcbH with the static
+	functions:
+
+	TLcbH *TLcbH::New(TUint aMaxLength) // Returns NULL if fails
+	TLcbH *TLcbH::NewL(TUint aMaxLength) // Leaves if fails
+
+	The TDesC class also has two methods:
+
+	TLcbH *TDesC::Alloc(); // Returns NULL if fails
+	TLcbH *TDesC::AllocL(); // Leaves if fails
+
+	which will clone the descriptor on the heap. The size of the TLcbH
+	will be the length of the descriptor. Remember that these objects
+	must be freed with either delete or User::Free().
+
+	Note that there is a class TLcbBase which is just used to provide a
+	place to provide the code for the template class and although this
+	could be placed in the TDesC class this could only be done by
+	sacrificing the efficiency of the constructors for the TLcb class.
+	TDesC has so many constructors that TLcbBase is useful in providing a
+	selector for the base constructor. If this was removed an artificial
+	enum would have to be added to the constructors in TDesC to ease
+	selection. Since these are called inline by TLcb this would waste
+	code.
+
+	It is useful to look at the Rose class diagram in \e32\desn\e32.dsn
+	in the User\Descriptors category.
+
+2). Took the fixed u_time.cpp and new t_time.cpp.
+
+3). Changed the build plan so that all 4 build versions are supported
+	in all E32 .MAK files and that all releaseable files are in \e32sys
+	as follows:
+
+	Build Name			Object directory
+	==========			================
+	Win32 Release		\work\e32\wins\rel
+	Win32 Debug			\work\e32\wins\deb
+	Win32 Uni Release	\work\e32\wins\urel
+	Win32 Uni Debug		\work\e32\wins\udeb
+
+	Build Name			.DLLs
+	==========			================
+	Win32 Release		\e32sys\ewins.dll
+	Win32 Debug			\e32sys\ewinsd.dll
+	Win32 Uni Release	\e32sys\ewinsu.dll
+	Win32 Uni Debug		\e32sys\ewinsud.dll
+
+	Build Name			.LIBs
+	==========			=====================================
+	Win32 Release		\e32sys\ewins.lib	\e32sys\estat.lib
+	Win32 Debug			\e32sys\ewinsd.lib	\e32sys\estatd.lib
+	Win32 Uni Release	\e32sys\ewinsu.lib	\e32sys\estatu.lib
+	Win32 Uni Debug		\e32sys\ewinsud.lib	\e32sys\estatud.lib
+
+	The directory \e32\lib has been deleted and replaced with
+	\e32\rel where the release project files are kept.
+
+	As a result of this no generated files get placed in the \e32
+	source tree, meaning a check -a li should always show no
+	additional or missing files
+
+4). Fixed most of the death in the unicode build but some test
+	programs are not building properly.
+
+5). Added the __DECLARE_TEST() macro for adding the test operations
+	to classes for debug builds. This macro should always be declared
+	as the last thing in the class as it switches back to public: as
+	follows:
+
+	public:
+		void __TestInvariant() const;
+		void __Test() const;
+
+	If a DLL is being built the __DLL__ #define should be present and the
+	macro will generate:
+
+		IMPORT_C void __TestInvariant() const;
+
+	The operation __TestInvariant() is expected to be supplied for all
+	classes and should do all the checking that it can to determine that
+	the object is in a healthy state. If it finds an error it should call
+	User::Invariant() which will cause a panic. If a class is derived from
+	a base class then the base class __TestInvariant() should be called
+	first and then further checking should be done.
+
+	This macro should not be added to template functions as the base class
+	from which the template function is derived should be able to do all
+	the necessary checking.
+
+	The __Test() function is not implemented and is provided to allow
+	test code a way of directly accessing all the members of a class.
+	Test code needs only to provide the function and then call it as it
+	is always assumed to be in the same .exe as the calling program.
+
+	Look at e32des8.inl and \e32\suser\u_des8.cpp for an example of how
+	to implement __DECLARE_TEST().
+
+	N.B.
+	It is expected that all classes will implement this scheme.
+
+6). Taken Gillian's fix to u_loc.cpp which was returning day names
+	for months.
+
+Version 0.01.014
+================
+(Made by Colly, 16 Jan 1995)
+1). THeap::Available() was not subtracting the header from the cells size.
+2). The insert bug in CBufSeg has been fixed.
+3). Implemented the new TDes/TBuf plan. This now allows TBufs to be moved
+	around in memory so that CArray<TBuf_40> is now O.K. Note that TDes8
+	cannot be instantiated, instead instantiate a TDesW8. TBufs now only
+	have an overhead of 8 bytes. See TDesC8::Ptr() to understand how
+	this trickery is accomplished. In general note that the values of the
+	members of TDesC8 and its derived classes are now meaningless so don't
+	jump to conclusions. The iLength should be divided by 4 to get the
+	real length. The bottom two bits provide flags for the Ptr() function.
+	For TDes8,TBuf8 and TDesW8 iPtr is in fact the maximum length. The
+	address of the buffer for TBuf8 is assumed to follow iPtr. For a
+	TDesW8 the real pointer to the buffer follows iPtr.
+4). Added the TVersion class and the User::Version() function.
+5). In class TLex, renamed Token() to NextToken() and made
+	MarkedToken() and NextToken() return a TDesC8.
+6). Removed the new operator in class CBase. As the cell is no longer
+	zero filled all relevant fields must be initialised.
+7). Added a member variable TText *__iName to CBase when the _DEBUG
+	flag is set. All constructors of classed derived from CBase should
+	initialise by using the __DECLARE_NAME macro. For CBufSeg this would
+	be :
+	EXPORT_C CBufSeg::CBufSeg(TUint anExpandSize)
+	//
+	// Constructor
+	//
+		: CBufBase(anExpandSize),iSeg(NULL)
+		{
+
+		__DECLARE_NAME(_L("CBufSeg"));
+		}
+8). Changed the ASSERT1,ASSERT2 and ASSERT3 macros to
+	__ASSERT_ALWAYS - applied in all builds
+	__ASSERT_DEBUG - applied only in debug builds
+	__ASSERT_OPT - applied if __OPT__ is defined
+	The previous versions assumed that Panic was called, i.e.
+	#define ASSERT1(c,p) if (!(c)) Panic(p)
+	This has been changed to allow other functions to be called.
+	#define __ASSERT_ALWAYS(c,p) if (!(c)) p
+	This should be used as follows:
+	__ASSERT_ALWAYS(anIndex<iLength,Panic(EDes8IndexOutOfRange));
+9). Further bugs showed up in T_BFLAT which was still assuming that
+	a TBuf was zero terminated. Changed the code to zero terminate
+	after construction.
+
+Version 0.01.013
+================
+(Made by Colly, 12 Jan 1995)
+1). Completed the implementation of the descriptor/buffer classes.
+2). The TLocale class is now working.
+3). Move SDate,STime and SDaySecs out of TTime. Made the members
+	start with a lower case. Changed the order of members so that
+	sorting	will occur correctly. Changed the filler on STime to be
+	1/100ths of a second. Provided a service in the kernel to retrieve
+	the current 1/100ths.
+4). Changed TTime to call the kernel to get the current time and TLocale
+	to get the start of week. The function to set system time is in
+	User. i.e. User::SetSystemTime(TSystemTime aTime);
+5). Moved the static functions from TTime to User.
+6). Converted the u_time.cpp to E32 code standards.
+7). Converted the u_graph.cpp to E32 code standards.
+8). Converted the o_region.cpp to E32 code standards.
+9). Fixed the bug if you ran a program from the command line without
+	the .exe.
+10). Changed TDblQue::Next() to be TDblQue::First() and
+	TDblQue()::Prev() to be TDblQue()::Last(). Changed the
+	implementation of AddFirst() and AddLast() to take a T * rather
+	that a TDblQueLink *.
+11). Changed the static New()'s in CBufFlat and CBufSeg to return a
+	pointer to the class rather than to CBufBase.
+12). Add a further global new operator which will leave if it cannot
+	allocate the memory. This is called as follows:
+	Normally:
+	TRect *p=new TRect(0,0,10,10);
+	With leave:
+	TRect *p=new(ELeave) TRect(0,0,10,10);
+13). Renamed TEnter::Throw() to TEnter::Leave();
+14). Fixed User::Leave().
+15). Add the full queue implemetations.
+16). Threads other than the main thread did not have their heap set.
+17). Lots more that I have forgotten.
+
+The TLex test code does not pass since it was relying on the zero
+terminator and I don't have the time to fix it. There is bug shown
+in CBufSeg with the test program T_ARRAY, although not surprisingly
+by T_BSEG.
+All the test code should now be reviewed and checked.
+
+Version 0.01.012
+================
+(Made by MartinB, 6 Jan 1995)
+1) Fixed death in release 11 below.
+2) Descriptor classes essentially complete.  Moved iMaxLength from
+   TDesC to TDes.  However must still define unicode-independent
+   buffers.
+3) Passes all test code now (except T_SEM).
+
+
+Version 0.01.011
+================
+(Made by MartinB, 6 Jan 1995)
+1) Bug fixes to Heap from MartinH.
+2) Bug fixes to arrays from Jal.
+3) Changed some pointer parameters to references.
+4) Changed to new Descriptor class hierarchy.  The change is not yet
+   complete.
+5) Some things are now (partially) broken:
+		T_BUF does not pass all test code (wierd stack death),
+		T_ARRAY.CPP and T_BFLAT.CPP do not build,
+		T_LEX does not pass all test code.
+
+Version 0.01.010
+================
+(Made by MartinB, 4 Jan 1995)
+1) Minor bug fix to o_array.cpp.
+2) Fixes to slocl to support dynamic loading.
+3) Fixes to TLex and TChar code.
+4) Converted to using spaces for tabs.
+5) Incorporated DWs time class.
+6) Moved Steve's CRegion class to SOLIB.
+
+Version 0.01.009
+================
+(Made by MartinB, 22 Dec 1994)
+1) Minor bug fixes and improvements to descriptor code.
+2) Now partially buildable under EPR (courtesy of DuncanS).  To get
+   extended toolset type:
+
+		TOOLS ETSET
+		TOOLS WINS
+
+You will also need to set your DOS box to run off a PIF file
+(ETSET.PIF in this directory will do), otherwise you will get out of
+memory/environment space problems.
+
+Then
+		ETON WINS
+and (in the usual way)
+		CONT E32 GROUP
+		DON
+		BUILD DEB
+
+Then you should be able to do MNT BLDALL.  Unfortunately we don't yet
+have the technology to build DLLs yet, but we can do CCs and LFs.
+This certainly makes it much less tedious to build the test code.
+In CONT E32 TUSER type
+		EBLD ETLI
+In CONT E32 TOLIB type
+		EBLD LI
+
+Version 0.01.008
+================
+(Made by MartinB, 21 Dec 1994)
+1) Took Jal's fixes for CBufSeg class.
+2) Added
+		void Append(const TUint8* aBuf,TUint aLength);
+   function to TDesBase class.
+3) Removed the Assign() functions that were just duplicates of Copy()
+   from TDesBase.
+4) Split data in slocl into country dependent, language dependent and
+   alphabet (character set) dependent parts.  Split not yet complete.
+
+Version 0.01.007
+================
+(Made by MartinB, 20 Dec 1994)
+1) Produces e32winsu.* and e32statu.* on UDEB and UREL builds.
+2) Moved to warning level 4.
+3) operator= changed to return reference in TPoint, TSize and TRect classes
+4) Converted CBuf* classes to constant reference convention.
+5) Changed TLex to use descriptors.
+
+Version 0.01.006
+================
+(Made by MartinB, 20 Dec 1994)
+1) #defined _UNICODE on UDEB and UREL in e32ver.h in preparation
+   for epr building.
+2) Converted TLex* class to constant reference convention.
+3) Renamed TSuffix to TDateSuffix.
+
+Version 0.01.005
+================
+(Made by MartinB, 19 Dec 1994)
+1) First version with buffers replaced by descriptors.  Note that
+		..\inc\e32db16.h
+   is a copy of
+		..\inc\e32db8.h
+   with 8 replaced by 16 throughout, and
+		..\suser\u_dsbf16.cpp
+   is a copy of
+		..\suser\u_dsbf8.cpp
+   with 8 replaced by 16 throughout.
+
+   This is necessary since it seems impossible to use templates in
+   this case (this is because there seems to be no way to manually
+   instantiate the template so that it can be placed in the DLL).
+2) Passes all test code except T_BFLAT (which I didn't get to work on
+   version 004) and T_SEM (which I'm not sure about).
+3) TThread class broken?  It may well work but I have not yet looked
+   into the implications for this class.
+4) Made this version for a "safe" one to come back to.
+5) U_LEX*.CPP and U_SEG.CPP can now be much improved by using
+   Descriptors instead of temporary buffers.
+
+Version 0.01.004
+================
+(Made by MartinB, 19 Dec 1994)
+1) Minor fixes to SLOCL tables.
+2) Defined ASSERTn and ASSERT_VALIDn macros.
+3) Last version before new TDes and TBuf classes.
+
+Version 0.01.003
+================
+(Made by MartinB, 14 Dec 1994)
+1) Incorporates TPoint, TSize, TRect & TRegion classes.
+2) Incorporates test code for above.
+3) Moved TCheckedHeapWalk declaration into THeap (ie nested class
+   declaration), partially because of name class with TSize (above).
+
+Version 0.01.002
+================
+(Made by MartinB, 13 Dec 1994)
+1) Incorporates buf fixes to TChar, TLex & TBuf classes.
+2) Incorporates test code for above.
+3) First working UNICODE version.
+
+Version 0.01.001
+================
+(Made by Colly, 10 Dec 1994)
+1) First release.