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:: 2009-06-19#$
14 $Rev: 10786 $
15 $Author: okajima_manabu $
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_TASSERTMSG(!(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_TASSERTMSG(((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_TASSERTMSG(( ((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 abcd_size = efg_size = 0;
290
291 SDK_ASSERT(HW_VRAM_A_SIZE == HW_VRAM_B_SIZE &&
292 HW_VRAM_A_SIZE == HW_VRAM_C_SIZE && HW_VRAM_A_SIZE == HW_VRAM_D_SIZE);
293
294 if (gGXState.vramCnt.bg & (GX_VRAM_H | GX_VRAM_I))
295 {
296 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg);
297 return;
298 }
299
300 vram_abcd = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_512_ABCD);
301 vram_efg = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_96_EFG);
302
303 switch (vram_efg)
304 {
305 case GX_VRAM_BG_NONE:
306 efg_size = 0;
307 break;
308 case GX_VRAM_BG_16_F:
309 case GX_VRAM_BG_16_G:
310 efg_size = HW_VRAM_F_SIZE;
311 break;
312 case GX_VRAM_BG_32_FG:
313 efg_size = HW_VRAM_F_SIZE + HW_VRAM_G_SIZE;
314 break;
315 case GX_VRAM_BG_64_E:
316 efg_size = HW_VRAM_E_SIZE;
317 break;
318 case GX_VRAM_BG_80_EF:
319 case GX_VRAM_BG_80_EG:
320 efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE;
321 break;
322 case GX_VRAM_BG_96_EFG:
323 efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE;
324 break;
325 }
326
327 switch (vram_abcd)
328 {
329 case GX_VRAM_BG_NONE:
330 abcd_size = 0;
331 break;
332 case GX_VRAM_BG_128_A:
333 case GX_VRAM_BG_128_B:
334 case GX_VRAM_BG_128_C:
335 case GX_VRAM_BG_128_D:
336 abcd_size = HW_VRAM_A_SIZE;
337 break;
338 case GX_VRAM_BG_256_AB:
339 case GX_VRAM_BG_256_BC:
340 case GX_VRAM_BG_256_CD:
341 case GX_VRAM_BG_256_AC:
342 case GX_VRAM_BG_256_AD:
343 case GX_VRAM_BG_256_BD:
344 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE;
345 break;
346 case GX_VRAM_BG_384_ABC:
347 case GX_VRAM_BG_384_BCD:
348 case GX_VRAM_BG_384_ABD:
349 case GX_VRAM_BG_384_ACD:
350 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE;
351 break;
352 case GX_VRAM_BG_512_ABCD:
353 abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE + HW_VRAM_D_SIZE;
354 break;
355 }
356
357 if (vram_abcd && vram_efg)
358 {
359 if (vram_abcd == GX_VRAM_BG_512_ABCD)
360 {
361 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg);
362 return;
363 }
364
365 SDK_REGION_ASSERT_EX(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size,
366 HW_BG_VRAM + HW_VRAM_A_SIZE, HW_BG_VRAM + HW_VRAM_A_SIZE + abcd_size,
367 first, last);
368 }
369 else if (vram_abcd)
370 {
371 SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + abcd_size, first, last);
372 }
373 else
374 {
375 SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size, first, last);
376 }
377 }
378
379
380 /*---------------------------------------------------------------------------*
381 Name: GX_RegionCheck_SubOBJ_(INTERNAL USE ONLY)
382
383 Description: Checks if memory exists at the destination address.
384 This is invoked by GXS_LoadOBJ only if SDK_DEBUG is defined.
385
386 Arguments: first a start address
387 last an end address
388
389 Returns: none
390 *---------------------------------------------------------------------------*/
GX_RegionCheck_SubOBJ_(u32 first,u32 last)391 void GX_RegionCheck_SubOBJ_(u32 first, u32 last)
392 {
393 switch (gGXState.vramCnt.sub_obj)
394 {
395 case GX_VRAM_SUB_OBJ_NONE:
396 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM, first, last);
397 break;
398 case GX_VRAM_SUB_OBJ_128_D:
399 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_D_SIZE, first, last);
400 break;
401 case GX_VRAM_SUB_OBJ_16_I:
402 SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_I_SIZE, first, last);
403 break;
404 }
405 }
406
407
408 /*---------------------------------------------------------------------------*
409 Name: GX_RegionCheck_SubBG_(INTERNAL USE ONLY)
410
411 Description: Checks if memory exists at the destination address.
412 This is invoked by GXS_LoadBGXXXXX only if SDK_DEBUG is defined.
413
414 Arguments: first a start address
415 last an end address
416
417 Returns: none
418 *---------------------------------------------------------------------------*/
GX_RegionCheck_SubBG_(u32 first,u32 last)419 void GX_RegionCheck_SubBG_(u32 first, u32 last)
420 {
421 switch (gGXState.vramCnt.sub_bg)
422 {
423 case GX_VRAM_SUB_BG_NONE:
424 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM, first, last);
425 break;
426 case GX_VRAM_SUB_BG_128_C:
427 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_C_SIZE, first, last);
428 break;
429 case GX_VRAM_SUB_BG_32_H:
430 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_H_SIZE, first, last);
431 break;
432 case GX_VRAM_SUB_BG_48_HI:
433 SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM,
434 HW_DB_BG_VRAM + HW_VRAM_H_SIZE + HW_VRAM_I_SIZE, first, last);
435 break;
436 default:
437 SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.sub_bg);
438 break;
439 }
440 }
441
442
GX_RegionCheck_TexPltt_(GXVRamTexPltt texPltt,u32 first,u32 last)443 void GX_RegionCheck_TexPltt_(GXVRamTexPltt texPltt, u32 first, u32 last)
444 {
445 #if defined(SDK_NO_MESSAGE)
446 #pragma unused(first)
447 #endif
448 switch (texPltt)
449 {
450 case GX_VRAM_TEXPLTT_0_F:
451 case GX_VRAM_TEXPLTT_0_G:
452 SDK_TASSERTMSG(last <= 0x04000,
453 "Texture pallete 0x04000-0x18000 not available(0x%5x->0x%5x)", first, last);
454 break;
455
456 case GX_VRAM_TEXPLTT_01_FG:
457 SDK_TASSERTMSG(last <= 0x08000,
458 "Texture pallete 0x08000-0x18000 not available(0x%5x->0x%5x)", first, last);
459 break;
460
461 case GX_VRAM_TEXPLTT_0123_E:
462 SDK_TASSERTMSG(last <= 0x10000,
463 "Texture pallete 0x10000-0x18000 not available(0x%5x->0x%5x)", first, last);
464 break;
465
466 case GX_VRAM_TEXPLTT_01234_EF:
467 SDK_TASSERTMSG(last <= 0x14000,
468 "Texture pallete 0x14000-0x18000 not available(0x%5x->0x%5x)", first, last);
469 break;
470
471 case GX_VRAM_TEXPLTT_012345_EFG:
472 SDK_TASSERTMSG(last <= 0x18000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last);
473 break;
474
475 default:
476 SDK_INTERNAL_ERROR("unknown case 0x%x", texPltt);
477 break;
478 }
479 }
480
481
GX_RegionCheck_Tex_(GXVRamTex tex,u32 first,u32 last)482 void GX_RegionCheck_Tex_(GXVRamTex tex, u32 first, u32 last)
483 {
484 #if defined(SDK_NO_MESSAGE)
485 #pragma unused(first)
486 #endif
487 switch (tex)
488 {
489 case GX_VRAM_TEX_0_A:
490 case GX_VRAM_TEX_0_B:
491 case GX_VRAM_TEX_0_C:
492 case GX_VRAM_TEX_0_D:
493 SDK_TASSERTMSG(last <= 0x20000,
494 "Texture slot 0x20000-0x80000 not available(0x%5x->0x%5x)", first, last);
495 break;
496
497 case GX_VRAM_TEX_01_AB:
498 case GX_VRAM_TEX_01_BC:
499 case GX_VRAM_TEX_01_CD:
500 case GX_VRAM_TEX_01_AC:
501 case GX_VRAM_TEX_01_AD:
502 case GX_VRAM_TEX_01_BD:
503 SDK_TASSERTMSG(last <= 0x40000,
504 "Texture slot 0x40000-0x80000 not available(0x%5x->0x%5x)", first, last);
505 break;
506
507 case GX_VRAM_TEX_012_ABC:
508 case GX_VRAM_TEX_012_BCD:
509 case GX_VRAM_TEX_012_ABD:
510 case GX_VRAM_TEX_012_ACD:
511 SDK_TASSERTMSG(last <= 0x60000,
512 "Texture slot 0x60000-0x80000 not available(0x%5x->0x%5x)", first, last);
513 break;
514
515 case GX_VRAM_TEX_0123_ABCD:
516 SDK_TASSERTMSG(last <= 0x80000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last);
517 break;
518
519 default:
520 SDK_INTERNAL_ERROR("unknown case 0x%x", tex);
521 break;
522 };
523 }
524
525
526
527 #endif
528