OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / memblock.c
1 \r
2 #include "core.h"\r
3 \r
4 Memory SystemMemory;\r
5 \r
6 void Initialise_MemoryBlock(IO_MemoryControl *mainctrl)\r
7 {\r
8         SystemMemory.addr = 0;\r
9         SystemMemory.size = 0;\r
10         SystemMemory.next = 0;\r
11         SystemMemory.ctrl = mainctrl;\r
12         SystemMemory.description[0] = 0x00;\r
13         return;\r
14 }\r
15 \r
16 void *MemoryBlock_Allocate_System(uint size)\r
17 {\r
18         Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
19         uint *retaddr;\r
20 \r
21         retaddr = &size;\r
22 \r
23         if(block == 0){\r
24                 Emergency_Out("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
25                 debug("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
26                 for(;;){\r
27                         IO_HLT();\r
28                 }\r
29         }\r
30 \r
31         block->addr = MemoryControl_Allocate(SystemMemory.ctrl, size);\r
32 \r
33         if(block->addr == 0){\r
34                 Emergency_Out("[0x%08X]SysMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
35                 debug("[0x%08X]SysmMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
36                 for(;;){\r
37                         IO_HLT();\r
38                 }\r
39         }\r
40 \r
41         block->size = size;\r
42         block->next = SystemMemory.next;\r
43         SystemMemory.next = block;\r
44         SystemMemory.size++;\r
45         block->ctrl = SystemMemory.ctrl;\r
46         block->description[0] = 0x00;\r
47         return block->addr;\r
48 }\r
49 \r
50 void *MemoryBlock_Allocate_User(uint size, IO_MemoryControl *ctrl)\r
51 {\r
52         Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
53         uint *retaddr;\r
54 \r
55         retaddr = &size;\r
56 \r
57         if(block == 0){\r
58                 Emergency_Out("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
59                 debug("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
60                 for(;;){\r
61                         IO_HLT();\r
62                 }\r
63         }\r
64 \r
65         block->addr = MemoryControl_Allocate(ctrl, size);\r
66 \r
67         if(block->addr == 0){\r
68                 Emergency_Out("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
69                 debug("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
70                 for(;;){\r
71                         IO_HLT();\r
72                 }\r
73         }\r
74 \r
75         block->size = (size + 7) & ~7;\r
76         block->next = SystemMemory.next;\r
77         SystemMemory.next = block;\r
78         SystemMemory.size++;\r
79         block->ctrl = ctrl;\r
80         block->description[0] = 0x00;\r
81         return block->addr;\r
82 }\r
83 \r
84 Memory *MemoryBlock_Verify(void *addr)\r
85 {\r
86         Memory *next;\r
87 \r
88         for(next = &SystemMemory; next->next != 0; next = next->next){\r
89                 if(next->next->addr == addr){\r
90                         return next->next;\r
91                 }\r
92         }\r
93         return 0;\r
94 }\r
95 \r
96 int MemoryBlock_Write_Description(void *addr, const uchar *description)\r
97 {\r
98         uint i;\r
99         Memory *block;\r
100 \r
101         block = MemoryBlock_Verify(addr);\r
102 \r
103         if(block){\r
104                 for(i = 0; i < (MEMORY_DESCRIPTION_LENGTH - 1); i++){\r
105                         if(description[i] == 0x00){\r
106                                 break;\r
107                         }\r
108                         block->description[i] = description[i];\r
109                 }\r
110                 block->description[i] = 0x00;\r
111                 return i;\r
112         }\r
113         return -1;\r
114 }\r
115 \r
116 int MemoryBlock_Free(void *addr)\r
117 {\r
118         Memory *next, *block;\r
119 \r
120         if(addr == 0){\r
121                 return -1;\r
122         }\r
123 \r
124         for(next = &SystemMemory; next->next != 0; next = next->next){\r
125                 if(next->next->addr == addr){\r
126                         block = next->next;\r
127                         next->next = block->next;\r
128                         if(MemoryControl_Free(block->ctrl, block->addr, block->size) != 0){\r
129                                 return -2;\r
130                         }\r
131                         if(MemoryControl_Free(SystemMemory.ctrl, block, sizeof(Memory)) != 0){\r
132                                 return -3;\r
133                         }\r
134                         SystemMemory.size--;\r
135                         return 0;\r
136                 }\r
137         }\r
138         return -1;\r
139 }\r