1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - GX -
3 File: gxstate.c
4
5 Copyright 2003-2008 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2008-09-17#$
14 $Rev: 8556 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17
18 #include "../include/gxstate.h"
19 #include <nitro/gx/gx_vramcnt.h>
20
21 #ifdef SDK_NITRO
22 #include <nitro/hw/ARM9/mmap_vram.h>
23 #else
24 #include <twl/hw/ARM9/mmap_vram.h>
25 #endif
26
27 GX_State gGXState;
28
29
30 /*---------------------------------------------------------------------------*
31 Name: GX_InitGXState(INTERNAL USE ONLY)
32
33 Description: Initializes the VRAM bank controls.
34
35 Arguments: none
36
37 Returns: none
38 *---------------------------------------------------------------------------*/
39 #ifdef SDK_CW_WARNOFF_SAFESTRB
40 #include <nitro/code32.h>
41 #endif
GX_InitGXState()42 void GX_InitGXState()
43 {
44 gGXState.vramCnt.lcdc = 0;
45 gGXState.vramCnt.bg = 0;
46 gGXState.vramCnt.obj = 0;
47 gGXState.vramCnt.arm7 = 0;
48 gGXState.vramCnt.tex = 0;
49 gGXState.vramCnt.texPltt = 0;
50 gGXState.vramCnt.clrImg = 0;
51 gGXState.vramCnt.bgExtPltt = 0;
52 gGXState.vramCnt.objExtPltt = 0;
53
54 gGXState.vramCnt.sub_bg = 0;
55 gGXState.vramCnt.sub_obj = 0;
56 gGXState.vramCnt.sub_bgExtPltt = 0;
57 gGXState.vramCnt.sub_objExtPltt = 0;
58
59 reg_GX_VRAMCNT = 0;
60 *((u8 *)®_GX_WVRAMCNT + 0) = 0;
61 *((u8 *)®_GX_WVRAMCNT + 1) = 0;
62 *((u8 *)®_GX_WVRAMCNT + 2) = 0;
63 reg_GX_VRAM_HI_CNT = 0;
64 }
65
66 #ifdef SDK_CW_WARNOFF_SAFESTRB
67 #include <nitro/codereset.h>
68 #endif
69
70 #define SDK_CONFLICT_ASSERT(a, b, name1, name2) \
71 SDK_ASSERTMSG(!(a & b), \
72 "VRAM Bank conflicts between "#name1" and "#name2" (0x%02x, 0x%02x)\n", \
73 a, b)
74
75 #define SDK_CONFLICT_CHECK(val, bank) \
76 if (val & bank) goto SDK_VRAMCNT_ERROR; else val |= bank
77
78
79 #ifdef SDK_DEBUG
80 /*---------------------------------------------------------------------------*
81 Name: GX_StateCheck_VRAMCnt_(INTERNAL USE ONLY)
82
83 Description: Checks VRAM bank conflicts.
84 This is invoked by GX_SetBankForXXXXX only if SDK_DEBUG is
85 defined.
86
87 Arguments: none
88
89 Returns: none
90 *---------------------------------------------------------------------------*/
GX_StateCheck_VRAMCnt_()91 void GX_StateCheck_VRAMCnt_()
92 {
93 GX_VRAMCnt_ *p = &gGXState.vramCnt;
94 u16 tmp = p->lcdc;
95 SDK_CONFLICT_CHECK(tmp, p->bg);
96 SDK_CONFLICT_CHECK(tmp, p->obj);
97 SDK_CONFLICT_CHECK(tmp, p->arm7);
98 SDK_CONFLICT_CHECK(tmp, p->tex);
99 SDK_CONFLICT_CHECK(tmp, p->texPltt);
100 SDK_CONFLICT_CHECK(tmp, p->clrImg);
101 SDK_CONFLICT_CHECK(tmp, p->bgExtPltt);
102 SDK_CONFLICT_CHECK(tmp, p->objExtPltt);
103 SDK_CONFLICT_CHECK(tmp, p->sub_bg);
104 SDK_CONFLICT_CHECK(tmp, p->sub_obj);
105 SDK_CONFLICT_CHECK(tmp, p->sub_bgExtPltt);
106 SDK_CONFLICT_CHECK(tmp, p->sub_objExtPltt);
107 return;
108
109 SDK_VRAMCNT_ERROR:
110 SDK_CONFLICT_ASSERT(p->lcdc, p->bg, LCDC, BG);
111 SDK_CONFLICT_ASSERT(p->lcdc, p->obj, LCDC, OBJ);
112 SDK_CONFLICT_ASSERT(p->lcdc, p->arm7, LCDC, ARM7);
113 SDK_CONFLICT_ASSERT(p->lcdc, p->tex, LCDC, Tex);
114 SDK_CONFLICT_ASSERT(p->lcdc, p->texPltt, LCDC, TEXPltt);
115 SDK_CONFLICT_ASSERT(p->lcdc, p->clrImg, LCDC, ClearImage);
116 SDK_CONFLICT_ASSERT(p->lcdc, p->bgExtPltt, LCDC, BGExtPltt);
117 SDK_CONFLICT_ASSERT(p->lcdc, p->objExtPltt, LCDC, OBJExtPltt);
118 SDK_CONFLICT_ASSERT(p->lcdc, p->sub_bg, LCDC, SubBG);
119 SDK_CONFLICT_ASSERT(p->lcdc, p->sub_obj, LCDC, SubOBJ);
120 SDK_CONFLICT_ASSERT(p->lcdc, p->sub_bgExtPltt, LCDC, SubBGExtPltt);
121 SDK_CONFLICT_ASSERT(p->lcdc, p->sub_objExtPltt, LCDC, SubOBJExtPltt);
122
123 SDK_CONFLICT_ASSERT(p->bg, p->obj, BG, OBJ);
124 SDK_CONFLICT_ASSERT(p->bg, p->arm7, BG, ARM7);
125 SDK_CONFLICT_ASSERT(p->bg, p->tex, BG, Tex);
126 SDK_CONFLICT_ASSERT(p->bg, p->texPltt, BG, TexPltt);
127 SDK_CONFLICT_ASSERT(p->bg, p->clrImg, BG, ClearImage);
128 SDK_CONFLICT_ASSERT(p->bg, p->bgExtPltt, BG, BGExtPltt);
129 SDK_CONFLICT_ASSERT(p->bg, p->objExtPltt, BG, OBJExtPltt);
130 SDK_CONFLICT_ASSERT(p->bg, p->sub_bg, BG, SubBG);
131 SDK_CONFLICT_ASSERT(p->bg, p->sub_obj, BG, SubOBJ);
132 SDK_CONFLICT_ASSERT(p->bg, p->sub_bgExtPltt, BG, SubBGExtPltt);
133 SDK_CONFLICT_ASSERT(p->bg, p->sub_objExtPltt, BG, SubOBJExtPltt);
134
135 SDK_CONFLICT_ASSERT(p->obj, p->arm7, OBJ, ARM7);
136 SDK_CONFLICT_ASSERT(p->obj, p->tex, OBJ, Tex);
137 SDK_CONFLICT_ASSERT(p->obj, p->texPltt, OBJ, TexPltt);
138 SDK_CONFLICT_ASSERT(p->obj, p->clrImg, OBJ, ClearImage);
139 SDK_CONFLICT_ASSERT(p->obj, p->bgExtPltt, OBJ, BGExtPltt);
140 SDK_CONFLICT_ASSERT(p->obj, p->objExtPltt, OBJ, OBJExtPltt);
141 SDK_CONFLICT_ASSERT(p->obj, p->sub_bg, OBJ, SubBG);
142 SDK_CONFLICT_ASSERT(p->obj, p->sub_obj, OBJ, SubOBJ);
143 SDK_CONFLICT_ASSERT(p->obj, p->sub_bgExtPltt, OBJ, SubBGExtPltt);
144 SDK_CONFLICT_ASSERT(p->obj, p->sub_objExtPltt, OBJ, SubOBJExtPltt);
145
146 SDK_CONFLICT_ASSERT(p->arm7, p->tex, ARM7, Tex);
147 SDK_CONFLICT_ASSERT(p->arm7, p->texPltt, ARM7, TexPltt);
148 SDK_CONFLICT_ASSERT(p->arm7, p->clrImg, ARM7, ClearImage);
149 SDK_CONFLICT_ASSERT(p->arm7, p->bgExtPltt, ARM7, BGExtPltt);
150 SDK_CONFLICT_ASSERT(p->arm7, p->objExtPltt, ARM7, OBJExtPltt);
151 SDK_CONFLICT_ASSERT(p->arm7, p->sub_bg, ARM7, SubBG);
152 SDK_CONFLICT_ASSERT(p->arm7, p->sub_obj, ARM7, SubOBJ);
153 SDK_CONFLICT_ASSERT(p->arm7, p->sub_bgExtPltt, ARM7, SubBGExtPltt);
154 SDK_CONFLICT_ASSERT(p->arm7, p->sub_objExtPltt, ARM7, SubOBJExtPltt);
155
156 SDK_CONFLICT_ASSERT(p->tex, p->texPltt, Tex, TexPltt);
157 SDK_CONFLICT_ASSERT(p->tex, p->clrImg, Tex, ClearImage);
158 SDK_CONFLICT_ASSERT(p->tex, p->bgExtPltt, Tex, BGExtPltt);
159 SDK_CONFLICT_ASSERT(p->tex, p->objExtPltt, Tex, OBJExtPltt);
160 SDK_CONFLICT_ASSERT(p->tex, p->sub_bg, Tex, SubBG);
161 SDK_CONFLICT_ASSERT(p->tex, p->sub_obj, Tex, SubOBJ);
162 SDK_CONFLICT_ASSERT(p->tex, p->sub_bgExtPltt, Tex, SubBGExtPltt);
163 SDK_CONFLICT_ASSERT(p->tex, p->sub_objExtPltt, Tex, SubOBJExtPltt);
164
165 SDK_CONFLICT_ASSERT(p->texPltt, p->clrImg, TexPltt, ClearImage);
166 SDK_CONFLICT_ASSERT(p->texPltt, p->bgExtPltt, TexPltt, BGExtPltt);
167 SDK_CONFLICT_ASSERT(p->texPltt, p->objExtPltt, TexPltt, OBJExtPltt);
168 SDK_CONFLICT_ASSERT(p->texPltt, p->sub_bg, TexPltt, SubBG);
169 SDK_CONFLICT_ASSERT(p->texPltt, p->sub_obj, TexPltt, SubOBJ);
170 SDK_CONFLICT_ASSERT(p->texPltt, p->sub_bgExtPltt, TexPltt, SubBGExtPltt);
171 SDK_CONFLICT_ASSERT(p->texPltt, p->sub_objExtPltt, TexPltt, SubOBJExtPltt);
172
173 SDK_CONFLICT_ASSERT(p->clrImg, p->bgExtPltt, ClearImage, BGExtPltt);
174 SDK_CONFLICT_ASSERT(p->clrImg, p->objExtPltt, ClearImage, OBJExtPltt);
175 SDK_CONFLICT_ASSERT(p->clrImg, p->sub_bg, ClearImage, SubBG);
176 SDK_CONFLICT_ASSERT(p->clrImg, p->sub_obj, ClearImage, SubOBJ);
177 SDK_CONFLICT_ASSERT(p->clrImg, p->sub_bgExtPltt, ClearImage, SubBGExtPltt);
178 SDK_CONFLICT_ASSERT(p->clrImg, p->sub_objExtPltt, ClearImage, SubOBJExtPltt);
179
180 SDK_CONFLICT_ASSERT(p->bgExtPltt, p->objExtPltt, BGExtPltt, OBJExtPltt);
181 SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_bg, BGExtPltt, SubBG);
182 SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_obj, BGExtPltt, SubOBJ);
183 SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_bgExtPltt, BGExtPltt, SubBGExtPltt);
184 SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_objExtPltt, BGExtPltt, SubOBJExtPltt);
185
186 SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_bg, OBJExtPltt, SubBG);
187 SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_obj, OBJExtPltt, SubOBJ);
188 SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_bgExtPltt, OBJExtPltt, SubBGExtPltt);
189 SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_objExtPltt, OBJExtPltt, SubOBJExtPltt);
190
191 SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_obj, SubBG, SubOBJ);
192 SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_bgExtPltt, SubBG, SubBGExtPltt);
193 SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_objExtPltt, SubBG, SubOBJExtPltt);
194
195 SDK_CONFLICT_ASSERT(p->sub_obj, p->sub_bgExtPltt, SubOBJ, SubBGExtPltt);
196 SDK_CONFLICT_ASSERT(p->sub_obj, p->sub_objExtPltt, SubOBJ, SubOBJExtPltt);
197
198 SDK_CONFLICT_ASSERT(p->sub_bgExtPltt, p->sub_objExtPltt, SubBGExtPltt, SubOBJExtPltt);
199 }
200
201 #define SDK_REGION_ASSERT(name, r1, r2, d1, d2) \
202 SDK_ASSERTMSG(((r1) <= (d1)) && ((r2) >= (d2)), \
203 "Region allocated to "#name" is (0x%08x -> 0x%08x),\n"\
204 "access occured (0x%08x -> 0x%08x).", r1, r2, d1, d2)
205
206 #define SDK_REGION_ASSERT_EX(name, r1, r2, r3, r4, d1, d2) \
207 SDK_ASSERTMSG(( ((r1) <= (d1)) && ((r2) >= (d2)) ) || ( ((r3) <= (d1)) && ((r4) >= (d2)) ), \
208 "Region allocated to "#name" is (0x%08x -> 0x%08x, 0x%08x -> 0x%08x),\n"\
209 "access occured (0x%08x -> 0x%08x).", r1, r2, r3, r4, d1, d2)
210
211
212 /*---------------------------------------------------------------------------*
213 Name: GX_RegionCheck_OBJ_(INTERNAL USE ONLY)
214
215 Description: Checks if memory exists at the destination address.
216 This is invoked by GX_LoadOBJ only if SDK_DEBUG is defined.
217
218 Arguments: first a start address
219 last an end address
220
221 Returns: none
222 *---------------------------------------------------------------------------*/
GX_RegionCheck_OBJ_(u32 first,u32 last)223 void GX_RegionCheck_OBJ_(u32 first, u32 last)
224 {
225 switch (gGXState.vramCnt.obj)
226 {
227 case GX_VRAM_OBJ_NONE:
228 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM, first, last);
229 break;
230 // HW_VRAM_F_SIZE and HW_VRAM_G_SIZE Must be same size.
231 case GX_VRAM_OBJ_16_F:
232 case GX_VRAM_OBJ_16_G:
233 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_F_SIZE, first, last);
234 break;
235 case GX_VRAM_OBJ_32_FG:
236 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM,
237 HW_OBJ_VRAM + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE, first, last);
238 break;
239 case GX_VRAM_OBJ_64_E:
240 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_E_SIZE, first, last);
241 break;
242 case GX_VRAM_OBJ_80_EF:
243 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM,
244 HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_F_SIZE, first, last);
245 break;
246 case GX_VRAM_OBJ_80_EG:
247 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM,
248 HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_G_SIZE, first, last);
249 break;
250 case GX_VRAM_OBJ_96_EFG:
251 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM,
252 HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE,
253 first, last);
254 break;
255 // HW_VRAM_A_SIZE and HW_VRAM_B_SIZE Must be same size.
256 case GX_VRAM_OBJ_128_A:
257 case GX_VRAM_OBJ_128_B:
258 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_A_SIZE, first, last);
259 break;
260 case GX_VRAM_OBJ_256_AB:
261 SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM,
262 HW_OBJ_VRAM + HW_VRAM_A_SIZE + HW_VRAM_B_SIZE, first, last);
263 break;
264 default:
265 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.obj);
266 break;
267 }
268 }
269
270
271 /*---------------------------------------------------------------------------*
272 Name: GX_RegionCheck_BG_(INTERNAL USE ONLY)
273
274 Description: Checks if memory exists at the destination address.
275 This is invoked by GX_LoadBGXXXXX only if SDK_DEBUG is
276 defined.
277
278 Arguments: first a start address
279 last an end address
280
281 Returns: none
282 *---------------------------------------------------------------------------*/
GX_RegionCheck_BG_(u32 first,u32 last)283 void GX_RegionCheck_BG_(u32 first, u32 last)
284 {
285 u16 vram_abcd;
286 u16 vram_efg;
287 u32 abcd_size, efg_size;
288
289 SDK_ASSERT(HW_VRAM_A_SIZE == HW_VRAM_B_SIZE &&
290 HW_VRAM_A_SIZE == HW_VRAM_C_SIZE && HW_VRAM_A_SIZE == HW_VRAM_D_SIZE);
291
292 if (gGXState.vramCnt.bg & (GX_VRAM_H | GX_VRAM_I))
293 {
294 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg);
295 return;
296 }
297
298 vram_abcd = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_512_ABCD);
299 vram_efg = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_96_EFG);
300
301 switch (vram_efg)
302 {
303 case GX_VRAM_BG_NONE:
304 efg_size = 0;
305 break;
306 case GX_VRAM_BG_16_F:
307 case GX_VRAM_BG_16_G:
308 efg_size = HW_VRAM_F_SIZE;
309 break;
310 case GX_VRAM_BG_32_FG:
311 efg_size = HW_VRAM_F_SIZE + HW_VRAM_G_SIZE;
312 break;
313 case GX_VRAM_BG_64_E:
314 efg_size = HW_VRAM_E_SIZE;
315 break;
316 case GX_VRAM_BG_80_EF:
317 case GX_VRAM_BG_80_EG:
318 efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE;
319 break;
320 case GX_VRAM_BG_96_EFG:
321 efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE;
322 break;
323 }
324
325 switch (vram_abcd)
326 {
327 case GX_VRAM_BG_NONE:
328 abcd_size = 0;
329 break;
330 case GX_VRAM_BG_128_A:
331 case GX_VRAM_BG_128_B:
332 case GX_VRAM_BG_128_C:
333 case GX_VRAM_BG_128_D:
334 abcd_size = HW_VRAM_A_SIZE;
335 break;
336 case GX_VRAM_BG_256_AB:
337 case GX_VRAM_BG_256_BC:
338 case GX_VRAM_BG_256_CD:
339 case GX_VRAM_BG_256_AC:
340 case GX_VRAM_BG_256_AD:
341 case GX_VRAM_BG_256_BD:
342 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE;
343 break;
344 case GX_VRAM_BG_384_ABC:
345 case GX_VRAM_BG_384_BCD:
346 case GX_VRAM_BG_384_ABD:
347 case GX_VRAM_BG_384_ACD:
348 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE;
349 break;
350 case GX_VRAM_BG_512_ABCD:
351 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE + HW_VRAM_D_SIZE;
352 break;
353 }
354
355 if (vram_abcd && vram_efg)
356 {
357 if (vram_abcd == GX_VRAM_BG_512_ABCD)
358 {
359 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg);
360 return;
361 }
362
363 SDK_REGION_ASSERT_EX(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size,
364 HW_BG_VRAM + HW_VRAM_A_SIZE, HW_BG_VRAM + HW_VRAM_A_SIZE + abcd_size,
365 first, last);
366 }
367 else if (vram_abcd)
368 {
369 SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + abcd_size, first, last);
370 }
371 else
372 {
373 SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size, first, last);
374 }
375 }
376
377
378 /*---------------------------------------------------------------------------*
379 Name: GX_RegionCheck_SubOBJ_(INTERNAL USE ONLY)
380
381 Description: Checks if memory exists at the destination address.
382 This is invoked by GXS_LoadOBJ only if SDK_DEBUG is defined.
383
384 Arguments: first a start address
385 last an end address
386
387 Returns: none
388 *---------------------------------------------------------------------------*/
GX_RegionCheck_SubOBJ_(u32 first,u32 last)389 void GX_RegionCheck_SubOBJ_(u32 first, u32 last)
390 {
391 switch (gGXState.vramCnt.sub_obj)
392 {
393 case GX_VRAM_SUB_OBJ_NONE:
394 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM, first, last);
395 break;
396 case GX_VRAM_SUB_OBJ_128_D:
397 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_D_SIZE, first, last);
398 break;
399 case GX_VRAM_SUB_OBJ_16_I:
400 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_I_SIZE, first, last);
401 break;
402 }
403 }
404
405
406 /*---------------------------------------------------------------------------*
407 Name: GX_RegionCheck_SubBG_(INTERNAL USE ONLY)
408
409 Description: Checks if memory exists at the destination address.
410 This is invoked by GXS_LoadBGXXXXX only if SDK_DEBUG is defined.
411
412 Arguments: first a start address
413 last an end address
414
415 Returns: none
416 *---------------------------------------------------------------------------*/
GX_RegionCheck_SubBG_(u32 first,u32 last)417 void GX_RegionCheck_SubBG_(u32 first, u32 last)
418 {
419 switch (gGXState.vramCnt.sub_bg)
420 {
421 case GX_VRAM_SUB_BG_NONE:
422 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM, first, last);
423 break;
424 case GX_VRAM_SUB_BG_128_C:
425 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_C_SIZE, first, last);
426 break;
427 case GX_VRAM_SUB_BG_32_H:
428 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_H_SIZE, first, last);
429 break;
430 case GX_VRAM_SUB_BG_48_HI:
431 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM,
432 HW_DB_BG_VRAM + HW_VRAM_H_SIZE + HW_VRAM_I_SIZE, first, last);
433 break;
434 default:
435 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.sub_bg);
436 break;
437 }
438 }
439
440
GX_RegionCheck_TexPltt_(GXVRamTexPltt texPltt,u32 first,u32 last)441 void GX_RegionCheck_TexPltt_(GXVRamTexPltt texPltt, u32 first, u32 last)
442 {
443 #if defined(SDK_NO_MESSAGE)
444 #pragma unused(first)
445 #endif
446 switch (texPltt)
447 {
448 case GX_VRAM_TEXPLTT_0_F:
449 case GX_VRAM_TEXPLTT_0_G:
450 SDK_ASSERTMSG(last <= 0x04000,
451 "Texture pallete 0x04000-0x18000 not available(0x%5x->0x%5x)", first, last);
452 break;
453
454 case GX_VRAM_TEXPLTT_01_FG:
455 SDK_ASSERTMSG(last <= 0x08000,
456 "Texture pallete 0x08000-0x18000 not available(0x%5x->0x%5x)", first, last);
457 break;
458
459 case GX_VRAM_TEXPLTT_0123_E:
460 SDK_ASSERTMSG(last <= 0x10000,
461 "Texture pallete 0x10000-0x18000 not available(0x%5x->0x%5x)", first, last);
462 break;
463
464 case GX_VRAM_TEXPLTT_01234_EF:
465 SDK_ASSERTMSG(last <= 0x14000,
466 "Texture pallete 0x14000-0x18000 not available(0x%5x->0x%5x)", first, last);
467 break;
468
469 case GX_VRAM_TEXPLTT_012345_EFG:
470 SDK_ASSERTMSG(last <= 0x18000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last);
471 break;
472
473 default:
474 SDK_INTERNAL_ERROR("unknown case 0x%x", texPltt);
475 break;
476 }
477 }
478
479
GX_RegionCheck_Tex_(GXVRamTex tex,u32 first,u32 last)480 void GX_RegionCheck_Tex_(GXVRamTex tex, u32 first, u32 last)
481 {
482 #if defined(SDK_NO_MESSAGE)
483 #pragma unused(first)
484 #endif
485 switch (tex)
486 {
487 case GX_VRAM_TEX_0_A:
488 case GX_VRAM_TEX_0_B:
489 case GX_VRAM_TEX_0_C:
490 case GX_VRAM_TEX_0_D:
491 SDK_ASSERTMSG(last <= 0x20000,
492 "Texture slot 0x20000-0x80000 not available(0x%5x->0x%5x)", first, last);
493 break;
494
495 case GX_VRAM_TEX_01_AB:
496 case GX_VRAM_TEX_01_BC:
497 case GX_VRAM_TEX_01_CD:
498 case GX_VRAM_TEX_01_AC:
499 case GX_VRAM_TEX_01_AD:
500 case GX_VRAM_TEX_01_BD:
501 SDK_ASSERTMSG(last <= 0x40000,
502 "Texture slot 0x40000-0x80000 not available(0x%5x->0x%5x)", first, last);
503 break;
504
505 case GX_VRAM_TEX_012_ABC:
506 case GX_VRAM_TEX_012_BCD:
507 case GX_VRAM_TEX_012_ABD:
508 case GX_VRAM_TEX_012_ACD:
509 SDK_ASSERTMSG(last <= 0x60000,
510 "Texture slot 0x60000-0x80000 not available(0x%5x->0x%5x)", first, last);
511 break;
512
513 case GX_VRAM_TEX_0123_ABCD:
514 SDK_ASSERTMSG(last <= 0x80000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last);
515 break;
516
517 default:
518 SDK_INTERNAL_ERROR("unknown case 0x%x", tex);
519 break;
520 };
521 }
522
523
524
525 #endif
526