mirror of
https://github.com/ksherlock/mpw.git
synced 2024-11-21 09:30:55 +00:00
mm init, newptr
This commit is contained in:
parent
47b97b04fe
commit
c8da211026
@ -9,3 +9,4 @@ add_definitions(-I ${CMAKE_SOURCE_DIR}/)
|
||||
add_executable(mpw loader.cpp)
|
||||
target_link_libraries(mpw CPU_LIB)
|
||||
target_link_libraries(mpw TOOLBOX_LIB)
|
||||
target_link_libraries(mpw MPLITE_LIB)
|
||||
|
@ -14,6 +14,8 @@
|
||||
#include <cpu/fmem.h>
|
||||
|
||||
#include <toolbox/toolbox.h>
|
||||
#include <toolbox/mm.h>
|
||||
#include <mplite/mplite.h>
|
||||
|
||||
uint8_t *Memory;
|
||||
uint32_t HighWater = 0x10000;
|
||||
@ -467,7 +469,7 @@ int main(int argc, char **argv)
|
||||
|
||||
cpuSetALineExceptionFunc(ToolBox::dispatch);
|
||||
memorySetMemory(Memory, MemorySize);
|
||||
|
||||
MM::Init(Memory, MemorySize, HighWater);
|
||||
|
||||
for (unsigned i = 0; i < 10000; ++i)
|
||||
{
|
||||
|
@ -5,17 +5,74 @@
|
||||
#include <cpu/fmem.h>
|
||||
|
||||
#include <string>
|
||||
#include <deque>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#include <mplite/mplite.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
mplite_t pool;
|
||||
|
||||
uint8_t *Memory;
|
||||
uint32_t MemorySize;
|
||||
|
||||
// queue of free Handles
|
||||
std::deque<uint32_t> HandleQueue;
|
||||
|
||||
// map of ptr -> size
|
||||
std::map<uint32_t, uint32_t> PtrMap;
|
||||
|
||||
// map of handle -> size [? just use Ptr map?]
|
||||
std::map<uint32_t, uint32_t> HandleMap;
|
||||
|
||||
bool alloc_handle_block()
|
||||
{
|
||||
const unsigned HandleCount = 128;
|
||||
uint8_t *block = (uint8_t *)mplite_malloc(&pool,
|
||||
sizeof(uint32_t) * HandleCount);
|
||||
|
||||
if (!block) return false;
|
||||
|
||||
uint32_t hh = block - Memory;
|
||||
uint32_t end = hh + 128 * sizeof(uint32_t);
|
||||
|
||||
for ( ; hh < end; hh += sizeof(uint32_t))
|
||||
{
|
||||
HandleQueue.push_back(hh);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace MM
|
||||
{
|
||||
|
||||
bool Init(uint8_t *memory, uint32_t memorySize, uint32_t reserved)
|
||||
{
|
||||
int ok;
|
||||
|
||||
Memory = memory;
|
||||
MemorySize = memorySize;
|
||||
|
||||
ok = mplite_init(&pool,
|
||||
memory + reserved,
|
||||
memorySize - reserved,
|
||||
32,
|
||||
NULL);
|
||||
|
||||
if (ok != MPLITE_OK) return false;
|
||||
|
||||
// allocate a handle block...
|
||||
|
||||
if (!alloc_handle_block()) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint16_t NewPtr(uint16_t trap)
|
||||
{
|
||||
/* on entry:
|
||||
@ -32,8 +89,33 @@ namespace MM
|
||||
|
||||
fprintf(stderr, "%04x NewPtr(%08x)\n", trap, size);
|
||||
|
||||
cpuSetAReg(0, 0);
|
||||
return memFullErr;
|
||||
|
||||
// todo -- separate pools for sys vs non-sys?
|
||||
// todo -- NewPtr(0) -- null or empty ptr?
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
cpuSetAReg(0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t *ptr = NULL;
|
||||
ptr = (uint8_t *)mplite_malloc(&pool, size);
|
||||
if (!ptr)
|
||||
{
|
||||
cpuSetAReg(0, 0);
|
||||
return memFullErr;
|
||||
}
|
||||
|
||||
if (clear)
|
||||
{
|
||||
std::memset(ptr, 0, size);
|
||||
}
|
||||
|
||||
uint32_t mcptr = ptr - Memory;
|
||||
PtrMap.emplace(std::make_pair(mcptr, size));
|
||||
cpuSetAReg(0, mcptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef __mpw_rm_h__
|
||||
#define __mpw_rm_h__
|
||||
#ifndef __mpw_mm_h__
|
||||
#define __mpw_mm_h__
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
@ -8,7 +8,9 @@ namespace MM
|
||||
enum
|
||||
{
|
||||
memFullErr = -108
|
||||
}
|
||||
};
|
||||
|
||||
bool Init(uint8_t *memory, uint32_t memorySize, uint32_t reserved);
|
||||
|
||||
uint16_t NewPtr(uint16_t trap);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user