OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / memblock.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/memblock.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/memblock.c
new file mode 100644 (file)
index 0000000..636f193
--- /dev/null
@@ -0,0 +1,139 @@
+\r
+#include "core.h"\r
+\r
+Memory SystemMemory;\r
+\r
+void Initialise_MemoryBlock(IO_MemoryControl *mainctrl)\r
+{\r
+       SystemMemory.addr = 0;\r
+       SystemMemory.size = 0;\r
+       SystemMemory.next = 0;\r
+       SystemMemory.ctrl = mainctrl;\r
+       SystemMemory.description[0] = 0x00;\r
+       return;\r
+}\r
+\r
+void *MemoryBlock_Allocate_System(uint size)\r
+{\r
+       Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
+       uint *retaddr;\r
+\r
+       retaddr = &size;\r
+\r
+       if(block == 0){\r
+               Emergency_Out("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               debug("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               for(;;){\r
+                       IO_HLT();\r
+               }\r
+       }\r
+\r
+       block->addr = MemoryControl_Allocate(SystemMemory.ctrl, size);\r
+\r
+       if(block->addr == 0){\r
+               Emergency_Out("[0x%08X]SysMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               debug("[0x%08X]SysmMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               for(;;){\r
+                       IO_HLT();\r
+               }\r
+       }\r
+\r
+       block->size = size;\r
+       block->next = SystemMemory.next;\r
+       SystemMemory.next = block;\r
+       SystemMemory.size++;\r
+       block->ctrl = SystemMemory.ctrl;\r
+       block->description[0] = 0x00;\r
+       return block->addr;\r
+}\r
+\r
+void *MemoryBlock_Allocate_User(uint size, IO_MemoryControl *ctrl)\r
+{\r
+       Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
+       uint *retaddr;\r
+\r
+       retaddr = &size;\r
+\r
+       if(block == 0){\r
+               Emergency_Out("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               debug("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               for(;;){\r
+                       IO_HLT();\r
+               }\r
+       }\r
+\r
+       block->addr = MemoryControl_Allocate(ctrl, size);\r
+\r
+       if(block->addr == 0){\r
+               Emergency_Out("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               debug("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+               for(;;){\r
+                       IO_HLT();\r
+               }\r
+       }\r
+\r
+       block->size = (size + 7) & ~7;\r
+       block->next = SystemMemory.next;\r
+       SystemMemory.next = block;\r
+       SystemMemory.size++;\r
+       block->ctrl = ctrl;\r
+       block->description[0] = 0x00;\r
+       return block->addr;\r
+}\r
+\r
+Memory *MemoryBlock_Verify(void *addr)\r
+{\r
+       Memory *next;\r
+\r
+       for(next = &SystemMemory; next->next != 0; next = next->next){\r
+               if(next->next->addr == addr){\r
+                       return next->next;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+int MemoryBlock_Write_Description(void *addr, const uchar *description)\r
+{\r
+       uint i;\r
+       Memory *block;\r
+\r
+       block = MemoryBlock_Verify(addr);\r
+\r
+       if(block){\r
+               for(i = 0; i < (MEMORY_DESCRIPTION_LENGTH - 1); i++){\r
+                       if(description[i] == 0x00){\r
+                               break;\r
+                       }\r
+                       block->description[i] = description[i];\r
+               }\r
+               block->description[i] = 0x00;\r
+               return i;\r
+       }\r
+       return -1;\r
+}\r
+\r
+int MemoryBlock_Free(void *addr)\r
+{\r
+       Memory *next, *block;\r
+\r
+       if(addr == 0){\r
+               return -1;\r
+       }\r
+\r
+       for(next = &SystemMemory; next->next != 0; next = next->next){\r
+               if(next->next->addr == addr){\r
+                       block = next->next;\r
+                       next->next = block->next;\r
+                       if(MemoryControl_Free(block->ctrl, block->addr, block->size) != 0){\r
+                               return -2;\r
+                       }\r
+                       if(MemoryControl_Free(SystemMemory.ctrl, block, sizeof(Memory)) != 0){\r
+                               return -3;\r
+                       }\r
+                       SystemMemory.size--;\r
+                       return 0;\r
+               }\r
+       }\r
+       return -1;\r
+}\r