aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/Hardware/EmHAL.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/Hardware/EmHAL.cpp')
-rw-r--r--SrcShared/Hardware/EmHAL.cpp939
1 files changed, 939 insertions, 0 deletions
diff --git a/SrcShared/Hardware/EmHAL.cpp b/SrcShared/Hardware/EmHAL.cpp
new file mode 100644
index 0000000..a4b0030
--- /dev/null
+++ b/SrcShared/Hardware/EmHAL.cpp
@@ -0,0 +1,939 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+\* ===================================================================== */
+
+#include "EmCommon.h"
+#include "EmHAL.h"
+
+#include "EmTransportSerial.h" // EmTransportSerial
+#include "ErrorHandling.h" // Errors::ReportErrCommPort
+#include "PreferenceMgr.h" // gEmuPrefs
+
+#include "Logging.h"
+
+
+EmHALHandler* EmHAL::fgRootHandler;
+
+#define PRINTF if (!0) ; else LogAppendMsg
+
+static void PrvHandlePortOpenErrors (ErrCode err, string errString);
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::AddHandler
+// ---------------------------------------------------------------------------
+
+void EmHAL::AddHandler (EmHALHandler* handler)
+{
+ EmAssert (handler->fNextHandler == NULL);
+ EmAssert (handler->fPrevHandler == NULL);
+ EmAssert (fgRootHandler == NULL || fgRootHandler->fPrevHandler == NULL);
+
+ if (fgRootHandler != NULL)
+ {
+ fgRootHandler->fPrevHandler = handler;
+ handler->fNextHandler = fgRootHandler;
+ }
+
+ fgRootHandler = handler;
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::RemoveHandler
+// ---------------------------------------------------------------------------
+
+void EmHAL::RemoveHandler (EmHALHandler* handler)
+{
+ if (handler->fNextHandler)
+ {
+ handler->fNextHandler->fPrevHandler = handler->fPrevHandler;
+ }
+
+ if (handler->fPrevHandler)
+ {
+ handler->fPrevHandler->fNextHandler = handler->fNextHandler;
+ }
+ else
+ {
+ fgRootHandler = handler->fNextHandler;
+ }
+
+ handler->fNextHandler = NULL;
+ handler->fPrevHandler = NULL;
+
+ EmAssert (handler->fNextHandler == NULL);
+ EmAssert (handler->fPrevHandler == NULL);
+ EmAssert (fgRootHandler == NULL || fgRootHandler->fPrevHandler == NULL);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::RemoveHandler
+// ---------------------------------------------------------------------------
+
+void EmHAL::EnsureCoverage (void)
+{
+#if 0
+ // Rats...can't get this work...
+
+ Bool isHandled[20];
+ EmHALHandler* thisHandler = fgRootHandler;
+ EmHALHandler baseHandler;
+
+ while (thisHandler)
+ {
+ typedef void (EmHALHandler::*CycleHandler)(Bool);
+ CycleHandler p1 = (thisHandler->Cycle);
+ CycleHandler p2 = (baseHandler.Cycle);
+
+ if (p1 != p2)
+ {
+ isHandled[0] = true;
+ }
+
+ thisHandler = thisHandler->fNextHandler;
+ }
+
+ for (int ii = 0; ii < sizeof (isHandled); ++ii)
+ {
+ EmAssert (isHandled[ii]);
+ }
+#endif
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::Cycle
+// ---------------------------------------------------------------------------
+
+#if 0 // It's inline
+void EmHAL::Cycle (Bool sleeping)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->Cycle (sleeping);
+}
+#endif
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::CycleSlowly
+// ---------------------------------------------------------------------------
+
+void EmHAL::CycleSlowly (Bool sleeping)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->CycleSlowly (sleeping);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::ButtonEvent
+// ---------------------------------------------------------------------------
+
+void EmHAL::ButtonEvent (SkinElementType button, Bool buttonIsDown)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->ButtonEvent (button, buttonIsDown);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::TurnSoundOff
+// ---------------------------------------------------------------------------
+
+void EmHAL::TurnSoundOff (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->TurnSoundOff ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::ResetTimer
+// ---------------------------------------------------------------------------
+
+void EmHAL::ResetTimer (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->ResetTimer ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::ResetRTC
+// ---------------------------------------------------------------------------
+
+void EmHAL::ResetRTC (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->ResetRTC ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetInterruptLevel
+// ---------------------------------------------------------------------------
+
+int32 EmHAL::GetInterruptLevel (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetInterruptLevel ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetInterruptBase
+// ---------------------------------------------------------------------------
+
+int32 EmHAL::GetInterruptBase (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetInterruptBase ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLCDScreenOn
+// ---------------------------------------------------------------------------
+// Called in various portXDataWrite methods to determine if Screen::InvalidateAll
+// needs to be called. Typically implemented in the EmRegs<Product> or
+// EmRegs<LCDDriver> subclass.
+
+Bool EmHAL::GetLCDScreenOn (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetLCDScreenOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLCDBacklightOn
+// ---------------------------------------------------------------------------
+// Called in various portXDataWrite methods to determine if Screen::InvalidateAll
+// needs to be called. Typically implemented in the EmRegs<Product> or
+// EmRegs<LCDDriver> subclass.
+
+Bool EmHAL::GetLCDBacklightOn (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetLCDBacklightOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLCDHasFrame
+// ---------------------------------------------------------------------------
+// Called by host LCD code to know if it needs to draw a 2-pixel white frame.
+// Typically implemented in the EmRegs<Processor> or EmRegs<LCDDriver> subclass.
+
+Bool EmHAL::GetLCDHasFrame (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetLCDHasFrame ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLCDBeginEnd
+// ---------------------------------------------------------------------------
+// Called by Screen class in order to mark the memory used for the framebuffer.
+// Typically implemented in the EmRegs<Processor> or EmRegs<LCDDriver> subclass.
+
+void EmHAL::GetLCDBeginEnd (emuptr& begin, emuptr& end)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->GetLCDBeginEnd (begin, end);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLCDScanlines
+// ---------------------------------------------------------------------------
+// Fill in the output fields of EmScreenUpdateInfo. Typically implemented in
+// the EmRegs<Processor> or EmRegs<LCDDriver> subclass.
+
+void EmHAL::GetLCDScanlines (EmScreenUpdateInfo& info)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->GetLCDScanlines (info);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetDynamicHeapSize
+// ---------------------------------------------------------------------------
+
+int32 EmHAL::GetDynamicHeapSize (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetDynamicHeapSize ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetROMSize
+// ---------------------------------------------------------------------------
+
+int32 EmHAL::GetROMSize (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetROMSize ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetROMBaseAddress
+// ---------------------------------------------------------------------------
+
+emuptr EmHAL::GetROMBaseAddress (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetROMBaseAddress ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::ChipSelectsConfigured
+// ---------------------------------------------------------------------------
+
+Bool EmHAL::ChipSelectsConfigured (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->ChipSelectsConfigured ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetSystemClockFrequency
+// ---------------------------------------------------------------------------
+
+int32 EmHAL::GetSystemClockFrequency (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetSystemClockFrequency ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetCanStop
+// ---------------------------------------------------------------------------
+
+Bool EmHAL::GetCanStop (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetCanStop ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetAsleep
+// ---------------------------------------------------------------------------
+
+Bool EmHAL::GetAsleep (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetAsleep ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetPortInputValue
+// ---------------------------------------------------------------------------
+
+uint8 EmHAL::GetPortInputValue (int port)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetPortInputValue (port);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetPortInternalValue
+// ---------------------------------------------------------------------------
+
+uint8 EmHAL::GetPortInternalValue (int port)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetPortInternalValue (port);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::PortDataChanged
+// ---------------------------------------------------------------------------
+
+void EmHAL::PortDataChanged (int port, uint8 oldVal, uint8 newVal)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->PortDataChanged (port, oldVal, newVal);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetKeyInfo
+// ---------------------------------------------------------------------------
+
+void EmHAL::GetKeyInfo (int* numRows, int* numCols,
+ uint16* keyMap, Bool* rows)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ EmHAL::GetRootHandler()->GetKeyInfo (numRows, numCols, keyMap, rows);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::LineDriverChanged
+// ---------------------------------------------------------------------------
+// Open or close the transports in response to their line drivers being
+// enabled or disabled.
+
+void EmHAL::LineDriverChanged (EmUARTDeviceType type)
+{
+ ErrCode err = errNone;
+ EmTransport* transport = gEmuPrefs->GetTransportForDevice (type);
+
+ if (transport)
+ {
+ if (EmHAL::GetLineDriverState (type))
+ {
+ err = transport->Open ();
+ }
+ else
+ {
+ /* err = */ transport->Close ();
+ }
+
+ if (err != errNone)
+ {
+ string errString (transport->GetSpecificName ());
+ ::PrvHandlePortOpenErrors (err, errString);
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLineDriverState
+// ---------------------------------------------------------------------------
+// Return whether or not the line drivers for the given object are open or
+// closed.
+
+Bool EmHAL::GetLineDriverState (EmUARTDeviceType type)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetLineDriverState (type);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetUARTDevice
+// ---------------------------------------------------------------------------
+// Return what sort of device is hooked up to the given UART.
+
+EmUARTDeviceType EmHAL::GetUARTDevice (int uartNum)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetUARTDevice (uartNum);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLineDriverStates
+// ---------------------------------------------------------------------------
+// Collect all the states of all the driver types we know about. Pass in to
+// this routine a variable of type Bool[kUARTEnd].
+
+void EmHAL::GetLineDriverStates (Bool* states)
+{
+ for (EmUARTDeviceType ii = kUARTBegin; ii < kUARTEnd; ++ii)
+ {
+ states[ii] = EmHAL::GetLineDriverState (ii);
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::CompareLineDriverStates
+// ---------------------------------------------------------------------------
+// Collect the current state of all the line drivers, and compare them to
+// a previously-saved snapshot. For any differences, call LineDriverChanged.
+
+void EmHAL::CompareLineDriverStates (const Bool* oldStates)
+{
+ Bool newStates[kUARTEnd];
+ EmHAL::GetLineDriverStates (newStates);
+
+ for (EmUARTDeviceType ii = kUARTBegin; ii < kUARTEnd; ++ii)
+ {
+ if (newStates[ii] != oldStates[ii])
+ {
+ EmHAL::LineDriverChanged (ii);
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetDTR
+// ---------------------------------------------------------------------------
+// DTR is "Data Terminal Ready". In the same way that the RTS signal is
+// typically hooked up to the external device's CTS signal, our DTR pin is
+// hooked up to the external device's DSR pin. It can be modified in order
+// to tell the external device if we can accept any data.
+
+Bool EmHAL::GetDTR (int uartNum)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetDTR (uartNum);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::DTRChanged
+// ---------------------------------------------------------------------------
+// Called when the Palm OS changes the setting of the DTR pin. We respond
+// to this change by reflecting the setting in the host's DTR pin.
+
+void EmHAL::DTRChanged (int uartNum)
+{
+ EmUARTDeviceType type = EmHAL::GetUARTDevice (uartNum);
+ EmTransport* transport = gEmuPrefs->GetTransportForDevice (type);
+ EmTransportSerial* serTransport = dynamic_cast<EmTransportSerial*> (transport);
+
+ if (serTransport)
+ {
+ Bool state = EmHAL::GetDTR (uartNum);
+ PRINTF ("EmHAL::DTRChanged: DTR changed in emulated port to %d.", (int) state);
+ serTransport->SetDTR (state);
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetVibrateOn
+// ---------------------------------------------------------------------------
+
+Bool EmHAL::GetVibrateOn (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetVibrateOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHAL::GetLEDState
+// ---------------------------------------------------------------------------
+
+uint16 EmHAL::GetLEDState (void)
+{
+ EmAssert (EmHAL::GetRootHandler());
+ return EmHAL::GetRootHandler()->GetLEDState ();
+}
+
+
+#pragma mark -
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::EmHALHandler
+// ---------------------------------------------------------------------------
+
+EmHALHandler::EmHALHandler (void) :
+ fNextHandler (NULL),
+ fPrevHandler (NULL)
+{
+ EmHAL::AddHandler (this);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::~EmHALHandler
+// ---------------------------------------------------------------------------
+
+EmHALHandler::~EmHALHandler (void)
+{
+ EmHAL::RemoveHandler (this);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::Cycle
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::Cycle (Bool sleeping)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->Cycle (sleeping);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::CycleSlowly
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::CycleSlowly (Bool sleeping)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->CycleSlowly (sleeping);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::ButtonEvent
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::ButtonEvent (SkinElementType button, Bool buttonIsDown)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->ButtonEvent (button, buttonIsDown);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::TurnSoundOff
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::TurnSoundOff (void)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->TurnSoundOff ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::ResetTimer
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::ResetTimer (void)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->ResetTimer ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::ResetRTC
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::ResetRTC (void)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->ResetRTC ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetInterruptLevel
+// ---------------------------------------------------------------------------
+
+int32 EmHALHandler::GetInterruptLevel (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetInterruptLevel ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetInterruptBase
+// ---------------------------------------------------------------------------
+
+int32 EmHALHandler::GetInterruptBase (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetInterruptBase ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLCDScreenOn
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetLCDScreenOn (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetLCDScreenOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLCDBacklightOn
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetLCDBacklightOn (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetLCDBacklightOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLCDHasFrame
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetLCDHasFrame (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetLCDHasFrame ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLCDBeginEnd
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::GetLCDBeginEnd (emuptr& begin, emuptr& end)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->GetLCDBeginEnd (begin, end);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLCDScanlines
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::GetLCDScanlines (EmScreenUpdateInfo& info)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->GetLCDScanlines (info);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetDynamicHeapSize
+// ---------------------------------------------------------------------------
+
+int32 EmHALHandler::GetDynamicHeapSize (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetDynamicHeapSize ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetROMSize
+// ---------------------------------------------------------------------------
+
+int32 EmHALHandler::GetROMSize (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetROMSize ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetROMBaseAddress
+// ---------------------------------------------------------------------------
+
+emuptr EmHALHandler::GetROMBaseAddress (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetROMBaseAddress ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::ChipSelectsConfigured
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::ChipSelectsConfigured (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->ChipSelectsConfigured ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetSystemClockFrequency
+// ---------------------------------------------------------------------------
+
+int32 EmHALHandler::GetSystemClockFrequency (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetSystemClockFrequency ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetCanStop
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetCanStop (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetCanStop ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetAsleep
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetAsleep (void)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetAsleep ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetPortInputValue
+// ---------------------------------------------------------------------------
+
+uint8 EmHALHandler::GetPortInputValue (int port)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetPortInputValue (port);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetPortInternalValue
+// ---------------------------------------------------------------------------
+
+uint8 EmHALHandler::GetPortInternalValue (int port)
+{
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetPortInternalValue (port);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::PortDataChanged
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::PortDataChanged (int port, uint8 oldVal, uint8 newVal)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->PortDataChanged (port, oldVal, newVal);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetKeyInfo
+// ---------------------------------------------------------------------------
+
+void EmHALHandler::GetKeyInfo (int* numRows, int* numCols,
+ uint16* keyMap, Bool* rows)
+{
+ EmAssert (this->GetNextHandler());
+ this->GetNextHandler()->GetKeyInfo (numRows, numCols, keyMap, rows);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLineDriverState
+// ---------------------------------------------------------------------------
+// Return whether or not the line drivers for the given object are open or
+// closed.
+
+Bool EmHALHandler::GetLineDriverState (EmUARTDeviceType type)
+{
+ if (EmHALHandler::GetNextHandler())
+ {
+ return EmHALHandler::GetNextHandler()->GetLineDriverState (type);
+ }
+
+ return false;
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetUARTDevice
+// ---------------------------------------------------------------------------
+// Return what sort of device is hooked up to the given UART.
+
+EmUARTDeviceType EmHALHandler::GetUARTDevice (int uartNum)
+{
+ if (EmHALHandler::GetNextHandler())
+ {
+ return EmHALHandler::GetNextHandler()->GetUARTDevice (uartNum);
+ }
+
+ return kUARTNone;
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetDTR
+// ---------------------------------------------------------------------------
+// DTR is "Data Terminal Ready". In the same way that the RTS signal is
+// typically hooked up to the external device's CTS signal, our DTR pin is
+// hooked up to the external device's DSR pin. It can be modified in order
+// to tell the external device if we can accept any data.
+
+Bool EmHALHandler::GetDTR (int uartNum)
+{
+ if (EmHALHandler::GetNextHandler())
+ {
+ return EmHALHandler::GetNextHandler()->GetDTR (uartNum);
+ }
+
+ return false;
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetVibrateOn
+// ---------------------------------------------------------------------------
+
+Bool EmHALHandler::GetVibrateOn (void)
+{
+ if (!this->GetNextHandler())
+ return false;
+
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetVibrateOn ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmHALHandler::GetLEDState
+// ---------------------------------------------------------------------------
+
+uint16 EmHALHandler::GetLEDState (void)
+{
+ if (!this->GetNextHandler())
+ return 0;
+
+ EmAssert (this->GetNextHandler());
+ return this->GetNextHandler()->GetLEDState ();
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: PrvHandlePortOpenErrors
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: none.
+ *
+ * RETURNED: nothing, but displays one of two warnings if its cases
+ * are tripped.
+ *
+ ***********************************************************************/
+
+void PrvHandlePortOpenErrors (ErrCode err, string errString)
+{
+ switch (err)
+ {
+ // access denied, comm port, on Win32
+ case 5:
+ Errors::ReportErrCommPort (errString);
+ break;
+
+ // comm port error on Mac
+ case -97:
+ Errors::ReportErrCommPort (errString);
+ break;
+ }
+}