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 *)&reg_GX_WVRAMCNT + 0) = 0;
61     *((u8 *)&reg_GX_WVRAMCNT + 1) = 0;
62     *((u8 *)&reg_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