From 13657ab76029fd8233f056e4445f31f7d902ae0a Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Wed, 26 Jun 2013 22:50:53 -0400 Subject: [PATCH] MM::StackSpace / MM::HandleZone --- toolbox/mm.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ toolbox/mm.h | 3 +++ 2 files changed, 58 insertions(+) diff --git a/toolbox/mm.cpp b/toolbox/mm.cpp index 68725f7..c95fb90 100644 --- a/toolbox/mm.cpp +++ b/toolbox/mm.cpp @@ -410,6 +410,34 @@ namespace MM } + uint32_t StackSpace(uint16_t trap) + { + + /* + * on entry: + * + * on exit: + * D0: Number of bytes between stack and heap + * + */ + + uint32_t sp = cpuGetAReg(7); + + SetMemError(0); + + // find the pointer base... + for (const auto & iter : PtrMap) + { + if (sp >= iter.first && sp < iter.first + iter.second) + { + return sp - iter.first; + } + } + + return 0; + } + + #pragma mark Pointers @@ -945,5 +973,32 @@ namespace MM return address; } + uint16_t HandleZone(uint16_t trap) + { + // FUNCTION HandleZone (h: Handle): THz; + /* + * on entry: + * A0 Handle whose zone is to be found + * + * on exit: + * A0 Pointer to handle’s heap zone + * D0 Result code + * + */ + + uint32_t h = cpuGetAReg(0); + + Log("%04x HandleZone(%08x)\n", trap, h); + + + if (HandleMap.find(h) == HandleMap.end()) + { + cpuSetAReg(0, 0); + return SetMemError(MacOS::memWZErr); + } + + cpuSetAReg(0, 0); + return SetMemError(0); + } } \ No newline at end of file diff --git a/toolbox/mm.h b/toolbox/mm.h index 2ed1013..82fda0a 100644 --- a/toolbox/mm.h +++ b/toolbox/mm.h @@ -65,6 +65,9 @@ namespace MM uint16_t PtrToHand(uint16_t trap); uint16_t PtrToXHand(uint16_t trap); + uint32_t StackSpace(uint16_t trap); + + uint16_t HandleZone(uint16_t trap); }