PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
s_m_wsa.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
13static int getNeedBlock(int unk_a1, int unk_a2, int addr_area, int unk_a4);
14
15int SpuMallocWithStartAddr(unsigned int addr, int size)
16{
17 int v2;
18 int NeedBlock;
19 int size_area;
20 unsigned int v5;
21 u32 v7;
22 int v8;
23 int v9;
24 int v11;
25 int v12;
26 int v13;
27 int v15;
28 const libspu2_malloc_t *v17;
29 int v20;
31 int v29;
32
33 if ( _spu_rev_reserve_wa )
34 v7 = 0x200000 - _spu_rev_offsetaddr;
35 else
36 v7 = 0;
37 v8 = 2 * ((int)addr >> 1);
38 v9 = 2 * (size >> 1);
39 if ( v8 < 0x5010 || (int)(0x200000 - v7) < v8 + v9 )
40 return -1;
41 _spu_gcSPU();
42 v11 = _spu_AllocBlockNum;
43 v12 = -1;
44 for ( v13 = 0; v13 < _spu_AllocBlockNum; v13 += 1 )
45 {
46 if ( (_spu_memList[v13].addr_area & 0x40000000) != 0 )
47 {
48 v11 = v13;
49 break;
50 }
51 }
52 v29 = _spu_AllocBlockNum - v11;
53 for ( v15 = 0; v15 < _spu_AllocBlockNum; v15 += 1 )
54 {
55 int addr_area;
56 int v19;
57
58 v17 = &_spu_memList[v15];
59 size_area = v17->size_area;
60 addr_area = v17->addr_area;
61 v2 = v17->addr_area & 0xFFFFFFF;
62 v19 = size_area;
63 if ( v2 < v8 )
64 v19 = size_area - (v8 - v2);
65 if ( v19 >= v9 )
66 {
67 v5 = addr_area & 0xF0000000;
68 if ( (addr_area & 0xF0000000) != 0 )
69 {
70 NeedBlock = getNeedBlock(v8, v9, addr_area, v19);
71 if ( v29 >= NeedBlock )
72 {
73 v12 = v15;
74 break;
75 }
76 }
77 }
78 }
79 if ( v12 < 0 )
80 {
81 return -1;
82 }
83 v20 = -1;
84 if ( NeedBlock )
85 {
86 int v21;
87
88 for ( v21 = v11; v21 > v12; v21 -= 1 )
89 {
90 const libspu2_malloc_t *v25;
91
92 v25 = &_spu_memList[v11];
93 if ( _spu_AllocBlockNum >= v21 + NeedBlock )
94 {
96
97 v26 = &_spu_memList[v21 + NeedBlock];
98 v26->addr_area = v25->addr_area;
99 v26->size_area = v25->size_area;
100 }
101 }
102 if ( v2 >= v8 )
103 {
104 libspu2_malloc_t *v28;
105
106 v20 = v2;
107 v28 = &_spu_memList[v12];
108 v28[1].addr_area = (v2 + v9) | v5;
109 v28->addr_area = v2;
110 v28->size_area = v9;
111 v28[1].size_area = size_area - v9;
112 }
113 else
114 {
115 libspu2_malloc_t *v27;
116
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 )
123 {
124 v27[2].addr_area = (v8 + v9) | v5;
125 v27[2].size_area = size_area - (v8 - v2) - v9;
126 }
127 return v8;
128 }
129 }
130 else
131 {
132 v22 = &_spu_memList[v12];
133 v20 = v22->addr_area & 0xFFFFFFF;
134 v22->addr_area = v20;
135 }
136 return v20;
137}
138
139static int getNeedBlock(int unk_a1, int unk_a2, int addr_area, int unk_a4)
140{
141 if ( (addr_area & 0xFFFFFFF) >= unk_a1 )
142 {
143 if ( unk_a2 != unk_a4 )
144 return 1;
145 return (addr_area & 0x40000000) != 0;
146 }
147 else
148 {
149 if ( unk_a2 == unk_a4 )
150 {
151 if ( (addr_area & 0x40000000) != 0 )
152 return 2;
153 return 1;
154 }
155 }
156 return 2;
157}