diff options
author | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-11-23 23:13:26 -0500 |
---|---|---|
committer | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-11-23 23:13:26 -0500 |
commit | e5df1aafb6d1346207343ccb858fa373e6b86301 (patch) | |
tree | fb26f0091dda7dd69d48d6b06169ea618332b99e /SrcShared/EmLowMem.cpp |
Check in the Palm OS Emulator, version 3.5 (2001). These files come from
the tarball present in the Debian archives [1]. The SHA-256 digest of
the tarball, c5e0d23424e88525bfba0ecdf0a432a8d93c885d04740df06a9eeee44e5f25e4,
matches the digest preserved in the FreeBSD ports tree [2], giving
further confidence that these files are as distributed by upstream.
[1] http://archive.debian.org/debian/pool/contrib/p/pose/
[2] https://svnweb.freebsd.org/ports/head/palm/pose/distinfo?revision=271305&view=markup&pathrev=282162
Diffstat (limited to 'SrcShared/EmLowMem.cpp')
-rw-r--r-- | SrcShared/EmLowMem.cpp | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/SrcShared/EmLowMem.cpp b/SrcShared/EmLowMem.cpp new file mode 100644 index 0000000..da7b366 --- /dev/null +++ b/SrcShared/EmLowMem.cpp @@ -0,0 +1,273 @@ +/* -*- 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 "EmLowMem.h" + +#include "EmMemory.h" // CEnableFullAccess +#include "EmPalmFunction.h" // SysTrapIndex +#include "EmPatchState.h" // EmPatchState::OSMajorVersion + + +#include "PalmPack.h" +#define NON_PORTABLE +#include "SysEvtPrv.h" // SysEvtMgrGlobalsType +#undef NON_PORTABLE +#include "PalmPackPop.h" + + +EmAliasLowMemHdrType<PAS> EmLowMem::fgLowMem (EmMemNULL); + + +#pragma mark - + +// =========================================================================== +// ¥ EmLowMem +// =========================================================================== + +static uint16 gSysDispatchTableSize; + +/*********************************************************************** + * + * FUNCTION: EmLowMem::Initialize + * + * DESCRIPTION: Standard initialization function. Responsible for + * initializing this sub-system when a new session is + * created. Will be followed by at least one call to + * Reset or Load. + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmLowMem::Initialize (void) +{ + gSysDispatchTableSize = 0; +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::Reset + * + * DESCRIPTION: Standard reset function. Sets the sub-system to a + * default state. This occurs not only on a Reset (as + * from the menu item), but also when the sub-system + * is first initialized (Reset is called after Initialize) + * as well as when the system is re-loaded from an + * insufficient session file. + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmLowMem::Reset (void) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::Save + * + * DESCRIPTION: Standard save function. Saves any sub-system state to + * the given session file. + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmLowMem::Save (SessionFile&) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::Load + * + * DESCRIPTION: Standard load function. Loads any sub-system state + * from the given session file. + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmLowMem::Load (SessionFile&) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::Dispose + * + * DESCRIPTION: Standard dispose function. Completely release any + * resources acquired or allocated in Initialize and/or + * Load. + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmLowMem::Dispose (void) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::GetEvtMgrIdle + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +uint8 EmLowMem::GetEvtMgrIdle (void) +{ + CEnableFullAccess munge; // Remove blocks on memory access. + + // First, get sysEvtMgrGlobalsP, which is a pointer in low-memory. + + emuptr sysEvtMgrGlobalsP = EmLowMem_GetGlobal (sysEvtMgrGlobalsP); + + /* + ** Next look at the "idle" boolean in the SysEvtMgrGlobalsPtr + ** contained in sysEvtMgrGlobalsP: + ** + ** struct SysEvtMgrGlobalsType + ** { + ** ... + ** Boolean idle; + ** ... + ** }; + */ + + size_t idleOffset = offsetof (SysEvtMgrGlobalsType, idle); + + // Under Palm OS 1.0, there was an extra 4-byte value at the + // location currently holding "gremlinsFlag", which is before + // the "idle" field. Under that version of the OS, we therefore + // have to add 4 to get the right offset. + + if (EmPatchState::OSMajorVersion () == 1) + { + idleOffset += sizeof (Int32); + } + + uint8 idle = EmMemGet8 (sysEvtMgrGlobalsP + idleOffset); + + return idle; +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::TrapExists + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +Bool EmLowMem::TrapExists (uint16 iATrap) +{ +#if 0 + // No longer cache the dispatch table size. Handspring changes the + // size of the dispatch table after the first system call, resulting + // in Poser caching the old table size, and thus complaining that + // some functions are not implemented when in fact they are. + + // If we haven't already, get the number of traps in this system. + + if (gSysDispatchTableSize == 0) + { + CEnableFullAccess munge; // Remove blocks on memory access. + + gSysDispatchTableSize = EmLowMem_GetGlobal (sysDispatchTableSize); + } + + return (::SysTrapIndex (iATrap) == ::SysTrapIndex (sysTrapHostControl)) || + ::SysTrapIndex (iATrap) < gSysDispatchTableSize; +#else + CEnableFullAccess munge; // Remove blocks on memory access. + uint16 sysDispatchTableSize = EmLowMem_GetGlobal (sysDispatchTableSize); + return (::SysTrapIndex (iATrap) == ::SysTrapIndex (sysTrapHostControl)) || + ::SysTrapIndex (iATrap) < sysDispatchTableSize; +#endif +} + + +/*********************************************************************** + * + * FUNCTION: EmLowMem::GetTrapAddress + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +emuptr EmLowMem::GetTrapAddress (uint16 iATrap) +{ + emuptr address = EmMemNULL; + + CEnableFullAccess munge; // Remove blocks on memory access. + + // If the trap number is not in range, just return NULL to signal + // that normal process of the TRAP $F should occur. + +// uint16 sysDispatchTableSize = EmLowMem_GetGlobal (sysDispatchTableSize); + uint16 sysDispatchTableSize = EmMemGet16 (256 + 62); + + iATrap = ::SysTrapIndex (iATrap); + + if ((iATrap == ::SysTrapIndex (sysTrapHostControl)) || + (iATrap < sysDispatchTableSize)) + { + // Get sysDispatchTableP, which is a pointer in low-memory. + +// uint32 sysDispatchTableP = EmLowMem_GetGlobal (sysDispatchTableP); + uint32 sysDispatchTableP = EmMemGet32 (256 + 34); + + // If it's NULL, return NULL. + + if (sysDispatchTableP != EmMemNULL) + { + // Next, get the right guy from its contents. + + address = EmMemGet32 (sysDispatchTableP + iATrap * 4); + } + } + + return address; +} |