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 *)&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_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