11#include "libspu2_internal.h"
13static int getNeedBlock(
int unk_a1,
int unk_a2,
int addr_area,
int unk_a4);
15int SpuMallocWithStartAddr(
unsigned int addr,
int size)
33 if ( _spu_rev_reserve_wa )
34 v7 = 0x200000 - _spu_rev_offsetaddr;
37 v8 = 2 * ((int)addr >> 1);
39 if ( v8 < 0x5010 || (
int)(0x200000 - v7) < v8 + v9 )
42 v11 = _spu_AllocBlockNum;
44 for ( v13 = 0; v13 < _spu_AllocBlockNum; v13 += 1 )
46 if ( (_spu_memList[v13].addr_area & 0x40000000) != 0 )
52 v29 = _spu_AllocBlockNum - v11;
53 for ( v15 = 0; v15 < _spu_AllocBlockNum; v15 += 1 )
58 v17 = &_spu_memList[v15];
59 size_area = v17->size_area;
60 addr_area = v17->addr_area;
61 v2 = v17->addr_area & 0xFFFFFFF;
64 v19 = size_area - (v8 - v2);
67 v5 = addr_area & 0xF0000000;
68 if ( (addr_area & 0xF0000000) != 0 )
70 NeedBlock = getNeedBlock(v8, v9, addr_area, v19);
71 if ( v29 >= NeedBlock )
88 for ( v21 = v11; v21 > v12; v21 -= 1 )
92 v25 = &_spu_memList[v11];
93 if ( _spu_AllocBlockNum >= v21 + NeedBlock )
97 v26 = &_spu_memList[v21 + NeedBlock];
98 v26->addr_area = v25->addr_area;
99 v26->size_area = v25->size_area;
107 v28 = &_spu_memList[v12];
108 v28[1].addr_area = (v2 + v9) | v5;
111 v28[1].size_area = size_area - v9;
117 v27 = &_spu_memList[v12];
118 v27->addr_area = v2 | 0x80000000;
119 v27->size_area = v8 - v2;
120 v27[1].addr_area = v8;
121 v27[1].size_area = v9;
122 if ( NeedBlock == 2 )
124 v27[2].addr_area = (v8 + v9) | v5;
125 v27[2].size_area = size_area - (v8 - v2) - v9;
132 v22 = &_spu_memList[v12];
133 v20 = v22->addr_area & 0xFFFFFFF;
134 v22->addr_area = v20;
139static int getNeedBlock(
int unk_a1,
int unk_a2,
int addr_area,
int unk_a4)
141 if ( (addr_area & 0xFFFFFFF) >= unk_a1 )
143 if ( unk_a2 != unk_a4 )
145 return (addr_area & 0x40000000) != 0;
149 if ( unk_a2 == unk_a4 )
151 if ( (addr_area & 0x40000000) != 0 )