kernel/eka/release_old.txt
author William Roberts <williamr@symbian.org>
Tue, 05 Oct 2010 14:38:32 +0100
changeset 284 e76171403744
parent 0 a41df078684a
permissions -rw-r--r--
Missing part of the workaround for Bug 2149 - need to remove bootstrap.xml as well to disable SBS use of bootstrap.flm


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.