PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
s_m_m.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libspu2_internal.h"
12
13int SpuMalloc(int size)
14{
15 int found_block_idx;
16 u32 rev_size_zero;
17 unsigned int size_adjusted;
18 int p_allocated;
19 libspu2_malloc_t *p_cur_block;
20 u32 addr_area;
21 u32 addr_area_1;
22 u32 p_alloc_last_addr;
23 libspu2_malloc_t *p_last_block_2;
24 u32 addr_area_2;
25 u32 size_area_1;
26 libspu2_malloc_t *p_last_block_3;
27
28 found_block_idx = -1;
29 if ( _spu_rev_reserve_wa )
30 rev_size_zero = 0x200000 - _spu_rev_offsetaddr;
31 else
32 rev_size_zero = 0;
33 size_adjusted = 2 * (size >> 1);
34 if ( (_spu_memList->addr_area & 0x40000000) != 0 )
35 {
36 found_block_idx = 0;
37 }
38 else
39 {
40 int cur_idx;
41
42 _spu_gcSPU();
43 for ( cur_idx = 0; cur_idx < _spu_AllocBlockNum; cur_idx += 1 )
44 {
45 if (
46 !((_spu_memList[cur_idx].addr_area & 0x40000000) == 0
47 && ((_spu_memList[cur_idx].addr_area & 0x80000000) == 0 || _spu_memList[cur_idx].size_area < size_adjusted)) )
48 {
49 found_block_idx = cur_idx;
50 break;
51 }
52 }
53 }
54 p_allocated = found_block_idx;
55 if ( found_block_idx == -1 )
56 {
57 return -1;
58 }
59 p_cur_block = &_spu_memList[p_allocated];
60 addr_area = _spu_memList[p_allocated].addr_area;
61 if ( (addr_area & 0x40000000) != 0 )
62 {
63 libspu2_malloc_t *p_last_block_1;
64
65 if ( found_block_idx >= _spu_AllocBlockNum )
66 {
67 return -1;
68 }
69 if ( p_cur_block->size_area - rev_size_zero < size_adjusted )
70 {
71 return -1;
72 }
73 p_last_block_1 = &_spu_memList[found_block_idx + 1];
74 p_last_block_1->addr_area = ((p_cur_block->addr_area & 0xFFFFFFF) + size_adjusted) | 0x40000000;
75 p_last_block_1->size_area = p_cur_block->size_area - size_adjusted;
76 addr_area_1 = p_cur_block->addr_area;
77 _spu_AllocLastNum = found_block_idx + 1;
78 p_cur_block->size_area = size_adjusted;
79 p_cur_block->addr_area = addr_area_1 & 0xFFFFFFF;
80 _spu_gcSPU();
81 return _spu_memList[p_allocated].addr_area;
82 }
83 else
84 {
85 unsigned int size_area;
86
87 size_area = p_cur_block->size_area;
88 if ( size_adjusted < size_area )
89 {
90 p_alloc_last_addr = addr_area + size_adjusted;
91 if ( _spu_AllocLastNum < _spu_AllocBlockNum )
92 {
93 p_last_block_2 = &_spu_memList[_spu_AllocLastNum];
94 addr_area_2 = p_last_block_2->addr_area;
95 size_area_1 = p_last_block_2->size_area;
96 p_last_block_2->addr_area = p_alloc_last_addr | 0x80000000;
97 p_last_block_2->size_area = size_area - size_adjusted;
98 _spu_AllocLastNum += 1;
99 p_last_block_2[1].addr_area = addr_area_2;
100 p_last_block_2[1].size_area = size_area_1;
101 }
102 }
103 p_last_block_3 = &_spu_memList[found_block_idx];
104 p_last_block_3->size_area = size_adjusted;
105 p_last_block_3->addr_area = p_last_block_3->addr_area & 0xFFFFFFF;
106 _spu_gcSPU();
107 return _spu_memList[found_block_idx].addr_area;
108 }
109}