mirror of
https://github.com/ksherlock/mpw.git
synced 2025-02-16 12:30:53 +00:00
NewHandle/DisposeHandle
This commit is contained in:
parent
04d878c300
commit
0bb73b10bd
114
toolbox/mm.cpp
114
toolbox/mm.cpp
@ -24,8 +24,18 @@ namespace
|
|||||||
// map of ptr -> size
|
// map of ptr -> size
|
||||||
std::map<uint32_t, uint32_t> PtrMap;
|
std::map<uint32_t, uint32_t> PtrMap;
|
||||||
|
|
||||||
|
struct HandleInfo
|
||||||
|
{
|
||||||
|
uint32_t address;
|
||||||
|
uint32_t size;
|
||||||
|
|
||||||
|
HandleInfo(uint32_t a = 0, uint32_t s = 0) :
|
||||||
|
address(a), size(s)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
// map of handle -> size [? just use Ptr map?]
|
// map of handle -> size [? just use Ptr map?]
|
||||||
std::map<uint32_t, uint32_t> HandleMap;
|
std::map<uint32_t, HandleInfo> HandleMap;
|
||||||
|
|
||||||
inline uint16_t SetMemError(uint16_t error)
|
inline uint16_t SetMemError(uint16_t error)
|
||||||
{
|
{
|
||||||
@ -132,16 +142,50 @@ namespace MM
|
|||||||
|
|
||||||
auto iter = PtrMap.find(mcptr);
|
auto iter = PtrMap.find(mcptr);
|
||||||
|
|
||||||
if (iter == PtrMap.end()) return memWZErr;
|
if (iter == PtrMap.end()) return SetMemError(memWZErr);
|
||||||
PtrMap.erase(iter);
|
PtrMap.erase(iter);
|
||||||
|
|
||||||
uint8_t *ptr = mcptr + Memory;
|
uint8_t *ptr = mcptr + Memory;
|
||||||
|
|
||||||
mplite_free(&pool, ptr);
|
mplite_free(&pool, ptr);
|
||||||
|
|
||||||
return 0;
|
return SetMemError(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t DisposeHandle(uint16_t trap)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* on entry:
|
||||||
|
* A0 Handle to be disposed of
|
||||||
|
*
|
||||||
|
* on exit:
|
||||||
|
* D0 Result code
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t hh = cpuGetAReg(0);
|
||||||
|
|
||||||
|
fprintf(stderr, "%04x DisposeHandle(%08x)\n", trap, hh);
|
||||||
|
|
||||||
|
|
||||||
|
auto iter = HandleMap.find(hh);
|
||||||
|
|
||||||
|
if (iter == HandleMap.end()) return SetMemError(memWZErr);
|
||||||
|
|
||||||
|
HandleInfo info = iter->second;
|
||||||
|
|
||||||
|
HandleMap.erase(iter);
|
||||||
|
|
||||||
|
uint8_t *ptr = info.address + Memory;
|
||||||
|
|
||||||
|
mplite_free(&pool, ptr);
|
||||||
|
|
||||||
|
HandleQueue.push_back(hh);
|
||||||
|
|
||||||
|
return SetMemError(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t NewPtr(uint16_t trap)
|
uint16_t NewPtr(uint16_t trap)
|
||||||
@ -173,7 +217,7 @@ namespace MM
|
|||||||
return SetMemError(0);
|
return SetMemError(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *ptr = NULL;
|
uint8_t *ptr = nullptr;
|
||||||
ptr = (uint8_t *)mplite_malloc(&pool, size);
|
ptr = (uint8_t *)mplite_malloc(&pool, size);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
{
|
{
|
||||||
@ -192,5 +236,67 @@ namespace MM
|
|||||||
return SetMemError(0);
|
return SetMemError(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t NewHandle(uint16_t trap)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* on entry:
|
||||||
|
* D0 Number of logical bytes requested
|
||||||
|
*
|
||||||
|
* on exit:
|
||||||
|
* A0 Address of the new handle or NIL
|
||||||
|
* D0 Result code
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t hh = 0;
|
||||||
|
uint8_t *ptr;
|
||||||
|
uint32_t mcptr;
|
||||||
|
|
||||||
|
bool clear = trap & (1 << 9);
|
||||||
|
//bool sys = trap & (1 << 10);
|
||||||
|
|
||||||
|
uint32_t size = cpuGetDReg(0);
|
||||||
|
|
||||||
|
fprintf(stderr, "%04x NewHandle(%08x)\n", trap, size);
|
||||||
|
|
||||||
|
if (!HandleQueue.size())
|
||||||
|
{
|
||||||
|
if (!alloc_handle_block())
|
||||||
|
{
|
||||||
|
cpuSetAReg(0, 0);
|
||||||
|
return SetMemError(memFullErr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hh = HandleQueue.front();
|
||||||
|
HandleQueue.pop_front();
|
||||||
|
|
||||||
|
ptr = nullptr;
|
||||||
|
mcptr = 0;
|
||||||
|
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
ptr = (uint8_t *)mplite_malloc(&pool, size);
|
||||||
|
if (!ptr)
|
||||||
|
{
|
||||||
|
HandleQueue.push_back(hh);
|
||||||
|
cpuSetAReg(0, 0);
|
||||||
|
return SetMemError(memFullErr);
|
||||||
|
}
|
||||||
|
mcptr = ptr - Memory;
|
||||||
|
|
||||||
|
if (clear)
|
||||||
|
std::memset(ptr, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// need a handle -> ptr map?
|
||||||
|
HandleMap.emplace(std::make_pair(hh, HandleInfo(mcptr, size)));
|
||||||
|
|
||||||
|
memoryWriteLong(mcptr, hh);
|
||||||
|
cpuSetAReg(0, hh);
|
||||||
|
return SetMemError(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -15,7 +15,10 @@ namespace MM
|
|||||||
|
|
||||||
uint16_t BlockMove(uint16_t trap);
|
uint16_t BlockMove(uint16_t trap);
|
||||||
uint16_t DisposePtr(uint16_t trap);
|
uint16_t DisposePtr(uint16_t trap);
|
||||||
|
uint16_t DisposeHandle(uint16_t trap);
|
||||||
|
|
||||||
uint16_t NewPtr(uint16_t trap);
|
uint16_t NewPtr(uint16_t trap);
|
||||||
|
uint16_t NewHandle(uint16_t trap);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -49,6 +49,10 @@ namespace ToolBox {
|
|||||||
d0 = OS::GetVol(trap);
|
d0 = OS::GetVol(trap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0xA023:
|
||||||
|
d0 = MM::DisposeHandle(trap);
|
||||||
|
break;
|
||||||
|
|
||||||
// BlockMove (sourcePtr,destPtr: Ptr; byteCount: Size);
|
// BlockMove (sourcePtr,destPtr: Ptr; byteCount: Size);
|
||||||
case 0xa02e:
|
case 0xa02e:
|
||||||
d0 = MM::BlockMove(trap);
|
d0 = MM::BlockMove(trap);
|
||||||
@ -79,6 +83,12 @@ namespace ToolBox {
|
|||||||
d0 = MM::DisposePtr(trap);
|
d0 = MM::DisposePtr(trap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// NewHandle (logicalSize: Size) : Handle;
|
||||||
|
case 0xA122:
|
||||||
|
case 0xa322:
|
||||||
|
d0 = MM::NewHandle(trap);
|
||||||
|
break;
|
||||||
|
|
||||||
// resource manager stuff.
|
// resource manager stuff.
|
||||||
|
|
||||||
// Get1NamedResource (theType: ResType; name: Str255) : Handle;
|
// Get1NamedResource (theType: ResType; name: Str255) : Handle;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user