mirror of
https://github.com/ksherlock/mpw.git
synced 2024-06-26 03:29:29 +00:00
EmptyHandle / ReallocHandle (DumpObj)
This commit is contained in:
parent
07e4e3686e
commit
0fa19adbc5
101
toolbox/mm.cpp
101
toolbox/mm.cpp
|
@ -460,6 +460,107 @@ namespace MM
|
||||||
return Native::DisposeHandle(hh);
|
return Native::DisposeHandle(hh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t EmptyHandle(uint16_t trap)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* on entry:
|
||||||
|
* A0 Handle to be disposed of
|
||||||
|
*
|
||||||
|
* on exit:
|
||||||
|
* D0 Result code
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t hh = cpuGetAReg(0);
|
||||||
|
Log("%04x EmptyHandle(%08x)\n", trap, hh);
|
||||||
|
|
||||||
|
auto iter = HandleMap.find(hh);
|
||||||
|
|
||||||
|
if (iter == HandleMap.end()) return SetMemError(memWZErr);
|
||||||
|
|
||||||
|
auto &info = iter->second;
|
||||||
|
if (info.address == 0) return SetMemError(0);
|
||||||
|
if (info.locked) return SetMemError(memLockedErr); // ?
|
||||||
|
|
||||||
|
void *address = Memory + info.address;
|
||||||
|
|
||||||
|
mplite_free(&pool, address);
|
||||||
|
|
||||||
|
info.address = 0;
|
||||||
|
info.size = 0;
|
||||||
|
|
||||||
|
memoryWriteLong(0, hh);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ReallocHandle (h: Handle; logicalSize: Size);
|
||||||
|
*
|
||||||
|
* ReallocHandle allocates a new relocatable block with a logical
|
||||||
|
* size of logicalSize bytes. It then updates handle h by setting
|
||||||
|
* its master pointer to point to the new block. The main use of
|
||||||
|
* this procedure is to reallocate space for a block that has
|
||||||
|
* been purged. Normally h is an empty handle, but it need not
|
||||||
|
* be: If it points to an existing block, that block is released
|
||||||
|
* before the new block is created.
|
||||||
|
*
|
||||||
|
* In case of an error, no new block is allocated and handle h is
|
||||||
|
* left unchanged.
|
||||||
|
*/
|
||||||
|
uint16_t ReallocHandle(uint16_t trap)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* on entry:
|
||||||
|
* A0 Handle to be disposed of
|
||||||
|
* D0 Logical Size
|
||||||
|
*
|
||||||
|
* on exit:
|
||||||
|
* D0 Result code
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t hh = cpuGetAReg(0);
|
||||||
|
uint32_t logicalSize = cpuGetDReg(0);
|
||||||
|
|
||||||
|
Log("%04x ReallocHandle(%08x, %08x)\n", trap, hh, logicalSize);
|
||||||
|
|
||||||
|
auto iter = HandleMap.find(hh);
|
||||||
|
|
||||||
|
if (iter == HandleMap.end()) return SetMemError(memWZErr);
|
||||||
|
|
||||||
|
auto& info = iter->second;
|
||||||
|
|
||||||
|
if (info.locked) return SetMemError(memLockedErr);
|
||||||
|
|
||||||
|
if (info.address)
|
||||||
|
{
|
||||||
|
void *address = Memory + info.address;
|
||||||
|
|
||||||
|
mplite_free(&pool, address);
|
||||||
|
|
||||||
|
info.address = 0;
|
||||||
|
info.size = 0;
|
||||||
|
memoryWriteLong(0, hh);
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate a new block...
|
||||||
|
if (logicalSize == 0) return SetMemError(0);
|
||||||
|
|
||||||
|
void *address = mplite_malloc(&pool, logicalSize);
|
||||||
|
if (!address) return SetMemError(memFullErr);
|
||||||
|
|
||||||
|
uint32_t mcptr = (uint8_t *)address - Memory;
|
||||||
|
|
||||||
|
info.size = logicalSize;
|
||||||
|
info.address = mcptr;
|
||||||
|
|
||||||
|
memoryWriteLong(mcptr, hh);
|
||||||
|
|
||||||
|
// lock? clear purged flag?
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t GetHandleSize(uint16_t trap)
|
uint32_t GetHandleSize(uint16_t trap)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,9 @@ namespace MM
|
||||||
uint16_t DisposeHandle(uint16_t trap);
|
uint16_t DisposeHandle(uint16_t trap);
|
||||||
uint16_t DisposePtr(uint16_t trap);
|
uint16_t DisposePtr(uint16_t trap);
|
||||||
|
|
||||||
|
uint16_t EmptyHandle(uint16_t trap);
|
||||||
|
uint16_t ReallocHandle(uint16_t trap);
|
||||||
|
|
||||||
uint32_t GetHandleSize(uint16_t);
|
uint32_t GetHandleSize(uint16_t);
|
||||||
uint32_t GetPtrSize(uint16_t);
|
uint32_t GetPtrSize(uint16_t);
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,14 @@ namespace ToolBox {
|
||||||
d0 = MM::NewHandle(trap);
|
d0 = MM::NewHandle(trap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0xA027:
|
||||||
|
d0 = MM::ReallocHandle(trap);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xA02B:
|
||||||
|
d0 = MM::EmptyHandle(trap);
|
||||||
|
break;
|
||||||
|
|
||||||
// resource manager stuff.
|
// resource manager stuff.
|
||||||
|
|
||||||
// Get1Resource (theType: ResType; thelD: INTEGER) : Handle;
|
// Get1Resource (theType: ResType; thelD: INTEGER) : Handle;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user