1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - GX -
3 File: g2_oam.h
4
5 Copyright 2003-2009 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-04#$
14 $Rev: 10698 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17
18 #ifndef NITRO_G2_OAM_H_
19 #define NITRO_G2_OAM_H_
20
21 #ifndef SDK_TWL
22 #include <nitro/hw/ARM9/mmap_global.h>
23 #else
24 #include <twl/hw/ARM9/mmap_global.h>
25 #endif
26
27 #include <nitro/gx/gxcommon.h>
28 #include <nitro/fx/fx_const.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 //----------------------------------------------------------------------------
35 // Type definition
36 //----------------------------------------------------------------------------
37 #ifdef SDK_ADS
38 typedef struct
39 {
40 u32 attr01;
41 u16 attr2;
42 u16 _3;
43 }
44 GXOamAttr;
45 #else
46 typedef struct
47 {
48 union
49 {
50 u32 attr01;
51 struct
52 {
53 u16 attr0;
54 u16 attr1;
55 };
56 struct
57 {
58 u32 y:8;
59 u32 rsMode:2;
60 u32 objMode:2;
61 u32 mosaic:1;
62 u32 colorMode:1;
63 u32 shape:2;
64
65 u32 x:9;
66 u32 rsParam:5;
67 u32 size:2;
68 };
69 struct
70 {
71 u32 _0:28;
72 u32 flipH:1;
73 u32 flipV:1;
74 u32 _1:2;
75 };
76 };
77 union
78 {
79 struct
80 {
81 u16 attr2;
82 u16 _3;
83 };
84 u32 attr23;
85 struct
86 {
87 u32 charNo:10;
88 u32 priority:2;
89 u32 cParam:4;
90 u32 _2:16;
91 };
92 };
93 }
94 GXOamAttr;
95 #endif
96
97 typedef struct
98 {
99 u16 _0;
100 u16 _1;
101 u16 _2;
102 s16 PA;
103 u16 _4;
104 u16 _5;
105 u16 _6;
106 s16 PB;
107 u16 _8;
108 u16 _9;
109 u16 _10;
110 s16 PC;
111 u16 _12;
112 u16 _13;
113 u16 _14;
114 s16 PD;
115 }
116 GXOamAffine;
117
118
119 #define GX_OAM_ATTR01_Y_SHIFT 0
120 #define GX_OAM_ATTR01_Y_SIZE 8
121 #define GX_OAM_ATTR01_Y_MASK 0x000000ff
122
123 #define GX_OAM_ATTR01_RSENABLE_SHIFT 8
124 #define GX_OAM_ATTR01_RSENABLE_SIZE 2
125 #define GX_OAM_ATTR01_RSENABLE_MASK 0x00000300
126
127 #define GX_OAM_ATTR01_MODE_SHIFT 10
128 #define GX_OAM_ATTR01_MODE_SIZE 2
129 #define GX_OAM_ATTR01_MODE_MASK 0x00000c00
130
131 #define GX_OAM_ATTR01_MOSAIC_SHIFT 12
132 #define GX_OAM_ATTR01_MOSAIC_SIZE 1
133 #define GX_OAM_ATTR01_MOSAIC_MASK 0x00001000
134
135 #define GX_OAM_ATTR01_CM_SHIFT 13
136 #define GX_OAM_ATTR01_CM_SIZE 1
137 #define GX_OAM_ATTR01_CM_MASK 0x00002000
138
139 #define GX_OAM_ATTR01_SHAPE_SHIFT 14
140 #define GX_OAM_ATTR01_SHAPE_SIZE 2
141 #define GX_OAM_ATTR01_SHAPE_MASK 0x0000c000
142
143 #define GX_OAM_ATTR01_X_SHIFT 16
144 #define GX_OAM_ATTR01_X_SIZE 9
145 #define GX_OAM_ATTR01_X_MASK 0x01ff0000
146
147 #define GX_OAM_ATTR01_RS_SHIFT 25
148 #define GX_OAM_ATTR01_RS_SIZE 5
149 #define GX_OAM_ATTR01_RS_MASK 0x3e000000
150 #define GX_OAM_ATTR01_FLIP_MASK 0x30000000
151
152 #define GX_OAM_ATTR01_HF_SHIFT 28
153 #define GX_OAM_ATTR01_HF_SIZE 1
154 #define GX_OAM_ATTR01_HF_MASK 0x10000000
155
156 #define GX_OAM_ATTR01_VF_SHIFT 29
157 #define GX_OAM_ATTR01_VF_SIZE 1
158 #define GX_OAM_ATTR01_VF_MASK 0x20000000
159
160 #define GX_OAM_ATTR01_SIZE_SHIFT 30
161 #define GX_OAM_ATTR01_SIZE_SIZE 2
162 #define GX_OAM_ATTR01_SIZE_MASK 0xc0000000
163
164
165 #define GX_OAM_ATTR2_NAME_SHIFT 0
166 #define GX_OAM_ATTR2_NAME_SIZE 10
167 #define GX_OAM_ATTR2_NAME_MASK 0x03ff
168
169 #define GX_OAM_ATTR2_PRIORITY_SHIFT 10
170 #define GX_OAM_ATTR2_PRIORITY_SIZE 2
171 #define GX_OAM_ATTR2_PRIORITY_MASK 0x0c00
172
173 #define GX_OAM_ATTR2_CPARAM_SHIFT 12
174 #define GX_OAM_ATTR2_CPARAM_SIZE 4
175 #define GX_OAM_ATTR2_CPARAM_MASK 0xf000
176
177 #define GX_OAM_OBJNUM_ASSERT(obj) SDK_MINMAX_ASSERT(obj, 0, 127)
178 #define GX_OAM_CPARAM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 15)
179 #define GX_OAM_RSPARAM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 31)
180 #define GX_OAM_CHARNAME_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 1023)
181
182
183 //
184 // Parameters for G2_SetOBJShape and G2_SetOBJAttr
185 //
186 typedef enum
187 {
188 GX_OAM_SHAPE_8x8 = (0 << GX_OAM_ATTR01_SHAPE_SHIFT) | (0 << GX_OAM_ATTR01_SIZE_SHIFT),
189 GX_OAM_SHAPE_16x16 = (0 << GX_OAM_ATTR01_SHAPE_SHIFT) | (1 << GX_OAM_ATTR01_SIZE_SHIFT),
190 GX_OAM_SHAPE_32x32 = (0 << GX_OAM_ATTR01_SHAPE_SHIFT) | (2 << GX_OAM_ATTR01_SIZE_SHIFT),
191 GX_OAM_SHAPE_64x64 = (0 << GX_OAM_ATTR01_SHAPE_SHIFT) | (3 << GX_OAM_ATTR01_SIZE_SHIFT),
192 GX_OAM_SHAPE_16x8 = (1 << GX_OAM_ATTR01_SHAPE_SHIFT) | (0 << GX_OAM_ATTR01_SIZE_SHIFT),
193 GX_OAM_SHAPE_32x8 = (1 << GX_OAM_ATTR01_SHAPE_SHIFT) | (1 << GX_OAM_ATTR01_SIZE_SHIFT),
194 GX_OAM_SHAPE_32x16 = (1 << GX_OAM_ATTR01_SHAPE_SHIFT) | (2 << GX_OAM_ATTR01_SIZE_SHIFT),
195 GX_OAM_SHAPE_64x32 = (1 << GX_OAM_ATTR01_SHAPE_SHIFT) | (3 << GX_OAM_ATTR01_SIZE_SHIFT),
196 GX_OAM_SHAPE_8x16 = (2 << GX_OAM_ATTR01_SHAPE_SHIFT) | (0 << GX_OAM_ATTR01_SIZE_SHIFT),
197 GX_OAM_SHAPE_8x32 = (2 << GX_OAM_ATTR01_SHAPE_SHIFT) | (1 << GX_OAM_ATTR01_SIZE_SHIFT),
198 GX_OAM_SHAPE_16x32 = (2 << GX_OAM_ATTR01_SHAPE_SHIFT) | (2 << GX_OAM_ATTR01_SIZE_SHIFT),
199 GX_OAM_SHAPE_32x64 = (2 << GX_OAM_ATTR01_SHAPE_SHIFT) | (3 << GX_OAM_ATTR01_SIZE_SHIFT)
200 }
201 GXOamShape;
202
203 #define GX_OAM_SHAPE_ASSERT(x) \
204 SDK_ASSERT( (x) == GX_OAM_SHAPE_8x8 || \
205 (x) == GX_OAM_SHAPE_16x16 || \
206 (x) == GX_OAM_SHAPE_32x32 || \
207 (x) == GX_OAM_SHAPE_64x64 || \
208 (x) == GX_OAM_SHAPE_16x8 || \
209 (x) == GX_OAM_SHAPE_32x8 || \
210 (x) == GX_OAM_SHAPE_32x16 || \
211 (x) == GX_OAM_SHAPE_64x32 || \
212 (x) == GX_OAM_SHAPE_8x16 || \
213 (x) == GX_OAM_SHAPE_8x32 || \
214 (x) == GX_OAM_SHAPE_16x32 || \
215 (x) == GX_OAM_SHAPE_32x64 )
216
217
218 //
219 // Parameters for G2_SetOBJColorMode and G2_SetOBJAttr
220 //
221 typedef enum
222 {
223 GX_OAM_COLORMODE_16 = 0,
224 GX_OAM_COLORMODE_256 = 1
225 }
226 GXOamColorMode;
227
228 // OBSOLETE
229 typedef GXOamColorMode GXOamColor;
230 #define GX_OAM_COLOR_16 ((GXOamColorMode)GX_OAM_COLORMODE_16)
231 #define GX_OAM_COLOR_256 ((GXOamColorMode)GX_OAM_COLORMODE_256)
232
233
234 #define GX_OAM_COLORMODE_ASSERT(x) \
235 SDK_MINMAX_ASSERT(x, GX_OAM_COLORMODE_16, GX_OAM_COLORMODE_256)
236
237
238 //
239 // Parameters for G2_SetOBJEffect and G2_SetOBJAttr
240 //
241 typedef enum
242 {
243 GX_OAM_EFFECT_NONE =
244 (0 << GX_OAM_ATTR01_RSENABLE_SHIFT) | (0 << GX_OAM_ATTR01_HF_SHIFT) | (0 <<
245 GX_OAM_ATTR01_VF_SHIFT),
246 GX_OAM_EFFECT_FLIP_H =
247 (0 << GX_OAM_ATTR01_RSENABLE_SHIFT) | (1 << GX_OAM_ATTR01_HF_SHIFT) | (0 <<
248 GX_OAM_ATTR01_VF_SHIFT),
249 GX_OAM_EFFECT_FLIP_V =
250 (0 << GX_OAM_ATTR01_RSENABLE_SHIFT) | (0 << GX_OAM_ATTR01_HF_SHIFT) | (1 <<
251 GX_OAM_ATTR01_VF_SHIFT),
252 GX_OAM_EFFECT_FLIP_HV =
253 (0 << GX_OAM_ATTR01_RSENABLE_SHIFT) | (1 << GX_OAM_ATTR01_HF_SHIFT) | (1 <<
254 GX_OAM_ATTR01_VF_SHIFT),
255 GX_OAM_EFFECT_AFFINE = (1 << GX_OAM_ATTR01_RSENABLE_SHIFT),
256 GX_OAM_EFFECT_NODISPLAY = (2 << GX_OAM_ATTR01_RSENABLE_SHIFT),
257 GX_OAM_EFFECT_AFFINE_DOUBLE = (3 << GX_OAM_ATTR01_RSENABLE_SHIFT)
258 }
259 GXOamEffect;
260
261 #define GX_OAM_EFFECT_ASSERT(x) \
262 SDK_ASSERT( (x) == GX_OAM_EFFECT_NONE || \
263 (x) == GX_OAM_EFFECT_FLIP_H || \
264 (x) == GX_OAM_EFFECT_FLIP_V || \
265 (x) == GX_OAM_EFFECT_FLIP_HV || \
266 (x) == GX_OAM_EFFECT_AFFINE || \
267 (x) == GX_OAM_EFFECT_NODISPLAY || \
268 (x) == GX_OAM_EFFECT_AFFINE_DOUBLE )
269
270
271 //
272 // Parameters for G2_SetOBJMode and G2_SetOBJAttr
273 //
274 typedef enum
275 {
276 GX_OAM_MODE_NORMAL = 0,
277 GX_OAM_MODE_XLU = 1,
278 GX_OAM_MODE_OBJWND = 2,
279 GX_OAM_MODE_BITMAPOBJ = 3
280 }
281 GXOamMode;
282
283 #define GX_OAM_MODE_ASSERT(x) \
284 SDK_MINMAX_ASSERT(x, GX_OAM_MODE_NORMAL, GX_OAM_MODE_BITMAPOBJ)
285
286 #define GX_OAM_PRIORTY_ASSERT(x) \
287 SDK_MINMAX_ASSERT(x, 0, 3)
288
289
290 #define GXOamAttrArray ((GXOamAttr*)HW_OAM)
291 #define GXOamAffineArray ((GXOamAffine*)HW_OAM)
292
293
294
295 /* if include from Other Environment for exsample VC or BCB, */
296 /* please define SDK_FROM_TOOL */
297 #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
298
299
300 //----------------------------------------------------------------------------
301 // Declaration of function
302 //----------------------------------------------------------------------------
303
304 static void G2_SetOBJPosition(GXOamAttr *oam, int x, int y);
305 static void G2_SetOBJPriority(GXOamAttr *oam, int priority);
306 static void G2_SetOBJMode(GXOamAttr *oam, GXOamMode mode, int cParam);
307 static void G2_SetOBJEffect(GXOamAttr *oam, GXOamEffect effect, int rsParam);
308 static void G2_SetOBJShape(GXOamAttr *oam, GXOamShape shape);
309 static void G2_SetOBJCharName(GXOamAttr *oam, int name);
310 static void G2_SetOBJColorMode(GXOamAttr *oam, GXOamColorMode color);
311 static void G2_OBJMosaic(GXOamAttr *oam, BOOL enable);
312 static void G2_SetOBJAttr(GXOamAttr *oam,
313 int x,
314 int y,
315 int priority,
316 GXOamMode mode,
317 BOOL mosaic,
318 GXOamEffect effect,
319 GXOamShape shape,
320 GXOamColorMode color, int charName, int cParam, int rsParam);
321 static void G2_SetOBJAffine(GXOamAffine *oam, const MtxFx22 *mtx);
322
323 //----------------------------------------------------------------------------
324 // Implementation of inline function
325 //----------------------------------------------------------------------------
326
327
328 /*---------------------------------------------------------------------------*
329 Name: G2_SetOBJPosition
330
331 Description: Sets the position for an OBJ.
332
333 Arguments: oam pointer to (a mirror of) Object attribute
334 x X coordinate
335 y Y coordinate
336
337 Returns: none
338 *---------------------------------------------------------------------------*/
G2_SetOBJPosition(GXOamAttr * oam,int x,int y)339 static inline void G2_SetOBJPosition(GXOamAttr *oam, int x, int y)
340 {
341 oam->attr01 = ((oam->attr01 & ~(GX_OAM_ATTR01_Y_MASK | GX_OAM_ATTR01_X_MASK)) |
342 (y & GX_OAM_ATTR01_Y_MASK) |
343 ((x & (GX_OAM_ATTR01_X_MASK >> GX_OAM_ATTR01_X_SHIFT)) <<
344 GX_OAM_ATTR01_X_SHIFT));
345 }
346
347
348 /*---------------------------------------------------------------------------*
349 Name: G2_GetOBJPosition
350
351 Description: Gets the position for an OBJ.
352
353 Arguments: oam pointer to (a mirror of) Object attribute
354
355 Returns: x pointer to get X coordinate.
356 y pointer to get Y coordinate.
357 *---------------------------------------------------------------------------*/
G2_GetOBJPosition(const GXOamAttr * oam,u32 * x,u32 * y)358 static inline void G2_GetOBJPosition(const GXOamAttr *oam, u32 *x, u32 *y)
359 {
360 SDK_NULL_ASSERT(oam);
361 SDK_NULL_ASSERT(x);
362 SDK_NULL_ASSERT(y);
363
364 *x = (oam->attr01 & GX_OAM_ATTR01_X_MASK) >> GX_OAM_ATTR01_X_SHIFT;
365 *y = oam->attr01 & GX_OAM_ATTR01_Y_MASK;
366 }
367
368
369 /*---------------------------------------------------------------------------*
370 Name: G2_SetOBJPriority
371
372 Description: Sets the priority for an OBJ.
373
374 Arguments: oam pointer to (a mirror of) Object attribute
375 priority priority
376
377 Returns: none
378 *---------------------------------------------------------------------------*/
G2_SetOBJPriority(GXOamAttr * oam,int priority)379 static inline void G2_SetOBJPriority(GXOamAttr *oam, int priority)
380 {
381 GX_OAM_PRIORTY_ASSERT(priority);
382
383 oam->attr2 = (u16)((oam->attr2 & ~GX_OAM_ATTR2_PRIORITY_MASK) |
384 (priority << GX_OAM_ATTR2_PRIORITY_SHIFT));
385 }
386
387 /*---------------------------------------------------------------------------*
388 Name: G2_GetOBJPriority
389
390 Description: Gets the priority for an OBJ.
391
392 Arguments: oam pointer to (a mirror of) Object attribute
393
394 Returns: priority of Object.
395 *---------------------------------------------------------------------------*/
G2_GetOBJPriority(const GXOamAttr * oam)396 static inline int G2_GetOBJPriority(const GXOamAttr *oam)
397 {
398 SDK_NULL_ASSERT(oam);
399
400 return (oam->attr2 & GX_OAM_ATTR2_PRIORITY_MASK) >> GX_OAM_ATTR2_PRIORITY_SHIFT;
401 }
402
403
404 /*---------------------------------------------------------------------------*
405 Name: G2_SetOBJMode
406
407 Description: Sets the mode for an OBJ.
408
409 Arguments: oam pointer to (a mirror of) Object attribute
410 mode OBJ mode(normal/xlu/objwindow/bitmapobj)
411 cParam color parameter
412
413 Returns: none
414 *---------------------------------------------------------------------------*/
G2_SetOBJMode(GXOamAttr * oam,GXOamMode mode,int cParam)415 static inline void G2_SetOBJMode(GXOamAttr *oam, GXOamMode mode, int cParam)
416 {
417 GX_OAM_MODE_ASSERT(mode);
418 GX_OAM_CPARAM_ASSERT(cParam);
419
420 oam->attr01 = ((oam->attr01 & ~GX_OAM_ATTR01_MODE_MASK) | (mode << GX_OAM_ATTR01_MODE_SHIFT));
421
422 oam->attr2 = (u16)((oam->attr2 & ~GX_OAM_ATTR2_CPARAM_MASK) |
423 (cParam << GX_OAM_ATTR2_CPARAM_SHIFT));
424 }
425
426
427 /*---------------------------------------------------------------------------*
428 Name: G2_GetOBJMode
429
430 Description: Gets the mode for an OBJ.
431
432 Arguments: oam pointer to (a mirror of) Object attribute
433
434 Returns: OBJ mode(normal/xlu/objwindow/bitmapobj)
435 *---------------------------------------------------------------------------*/
G2_GetOBJMode(const GXOamAttr * oam)436 static inline GXOamMode G2_GetOBJMode(const GXOamAttr *oam)
437 {
438 SDK_NULL_ASSERT(oam);
439
440 return (GXOamMode)((oam->attr01 & GX_OAM_ATTR01_MODE_MASK) >> GX_OAM_ATTR01_MODE_SHIFT);
441 }
442
443
444 /*---------------------------------------------------------------------------*
445 Name: G2_GetOBJColorParam
446
447 Description: Gets the color parameter for an OBJ.
448
449 Arguments: oam pointer to (a mirror of) Object attribute
450
451 Returns: color parameter
452 *---------------------------------------------------------------------------*/
G2_GetOBJColorParam(const GXOamAttr * oam)453 static inline int G2_GetOBJColorParam(const GXOamAttr *oam)
454 {
455 SDK_NULL_ASSERT(oam);
456
457 return (oam->attr2 & GX_OAM_ATTR2_CPARAM_MASK) >> GX_OAM_ATTR2_CPARAM_SHIFT;
458 }
459
460
461 /*---------------------------------------------------------------------------*
462 Name: G2_SetOBJEffect
463
464 Description: Sets the effect for an OBJ.
465
466 Arguments: oam pointer to (a mirror of) Object attribute
467 effect specify an effect(none/flip/affine/nodisplay/affine double)
468 rsParam select an affine transformation(0-31) if affine effect specified
469
470 Returns: none
471 *---------------------------------------------------------------------------*/
G2_SetOBJEffect(GXOamAttr * oam,GXOamEffect effect,int rsParam)472 static inline void G2_SetOBJEffect(GXOamAttr *oam, GXOamEffect effect, int rsParam)
473 {
474 GX_OAM_EFFECT_ASSERT(effect);
475 GX_OAM_RSPARAM_ASSERT(rsParam);
476
477 if (GX_OAM_EFFECT_AFFINE != effect && GX_OAM_EFFECT_AFFINE_DOUBLE != effect)
478 {
479 oam->attr01 = ((oam->attr01 & ~(GX_OAM_ATTR01_RSENABLE_MASK | GX_OAM_ATTR01_RS_MASK)) |
480 effect);
481 }
482 else
483 {
484 oam->attr01 = ((oam->attr01 & ~(GX_OAM_ATTR01_RSENABLE_MASK | GX_OAM_ATTR01_RS_MASK)) |
485 effect | (rsParam << GX_OAM_ATTR01_RS_SHIFT));
486 }
487 }
488
489
490 /*---------------------------------------------------------------------------*
491 Name: G2_GetOBJEffect
492
493 Description: Gets the effect for an OBJ.
494
495 Arguments: oam pointer to (a mirror of) Object attribute
496
497 Returns: specify an effect(none/flip/affine/nodisplay/affine double)
498 *---------------------------------------------------------------------------*/
G2_GetOBJEffect(const GXOamAttr * oam)499 static inline GXOamEffect G2_GetOBJEffect(const GXOamAttr *oam)
500 {
501 GXOamEffect effect;
502
503 SDK_NULL_ASSERT(oam);
504
505 effect = (GXOamEffect)(oam->attr01 & GX_OAM_ATTR01_RSENABLE_MASK);
506
507 if (effect == GX_OAM_EFFECT_AFFINE || effect == GX_OAM_EFFECT_AFFINE_DOUBLE)
508 {
509 return effect;
510 }
511
512 return (GXOamEffect)(effect | (oam->attr01 & GX_OAM_ATTR01_FLIP_MASK));
513 }
514
515
516 /*---------------------------------------------------------------------------*
517 Name: G2_SetOBJShape
518
519 Description: Sets the size and shape for an OBJ.
520
521 Arguments: oam pointer to (a mirror of) Object attribute
522 shape specify size and shape of the Object
523
524 Returns: none
525 *---------------------------------------------------------------------------*/
G2_SetOBJShape(GXOamAttr * oam,GXOamShape shape)526 static inline void G2_SetOBJShape(GXOamAttr *oam, GXOamShape shape)
527 {
528 GX_OAM_SHAPE_ASSERT(shape);
529
530 oam->attr01 = ((oam->attr01 & ~(GX_OAM_ATTR01_SHAPE_MASK | GX_OAM_ATTR01_SIZE_MASK)) | shape);
531 }
532
533
534 /*---------------------------------------------------------------------------*
535 Name: G2_GetOBJShape
536
537 Description: Gets the size and shape for an OBJ.
538
539 Arguments: oam pointer to (a mirror of) Object attribute
540
541 Returns: shape specify size and shape of the Object
542 *---------------------------------------------------------------------------*/
G2_GetOBJShape(const GXOamAttr * oam)543 static inline GXOamShape G2_GetOBJShape(const GXOamAttr *oam)
544 {
545 SDK_NULL_ASSERT(oam);
546
547 return (GXOamShape)(oam->attr01 & (GX_OAM_ATTR01_SHAPE_MASK | GX_OAM_ATTR01_SIZE_MASK));
548 }
549
550
551 /*---------------------------------------------------------------------------*
552 Name: G2_SetOBJCharName
553
554 Description: Sets the character name for an OBJ.
555
556 Arguments: oam pointer to (a mirror of) Object attribute
557 name the head character name of an OBJ
558
559 Returns: none
560 *---------------------------------------------------------------------------*/
G2_SetOBJCharName(GXOamAttr * oam,int name)561 static inline void G2_SetOBJCharName(GXOamAttr *oam, int name)
562 {
563 GX_OAM_CHARNAME_ASSERT(name);
564
565 oam->attr2 = (u16)((oam->attr2 & ~GX_OAM_ATTR2_NAME_MASK) | name);
566 }
567
568
569 /*---------------------------------------------------------------------------*
570 Name: G2_GetOBJCharName
571
572 Description: Gets the character name for an OBJ.
573
574 Arguments: oam pointer to (a mirror of) Object attribute
575
576 Returns: the head character name of an OBJ
577 *---------------------------------------------------------------------------*/
G2_GetOBJCharName(const GXOamAttr * oam)578 static inline int G2_GetOBJCharName(const GXOamAttr *oam)
579 {
580 SDK_NULL_ASSERT(oam);
581
582 return oam->attr2 & GX_OAM_ATTR2_NAME_MASK;
583 }
584
585
586 /*---------------------------------------------------------------------------*
587 Name: G2_SetOBJColorMode
588
589 Description: Sets color mode for an OBJ.
590
591 Arguments: oam pointer to (a mirror of) Object attribute
592 enable color mode
593
594 Returns: none
595 *---------------------------------------------------------------------------*/
G2_SetOBJColorMode(GXOamAttr * oam,GXOamColorMode color)596 static inline void G2_SetOBJColorMode(GXOamAttr *oam, GXOamColorMode color)
597 {
598 GX_OAM_COLORMODE_ASSERT(color);
599 SDK_WARNING(!(GX_OAM_COLORMODE_256 == color &&
600 (oam->attr01 & GX_OAM_ATTR01_MODE_MASK) == GX_OAM_ATTR01_MODE_MASK),
601 "Only GX_OAM_COLORMODE_16 can be specified with GX_OAM_MODE_BITMAPOBJ.");
602
603 oam->attr01 = ((oam->attr01 & ~GX_OAM_ATTR01_CM_MASK) | (color << GX_OAM_ATTR01_CM_SHIFT));
604 }
605
606
607 /*---------------------------------------------------------------------------*
608 Name: G2_GetOBJColorMode
609
610 Description: Gets color mode for an OBJ.
611
612 Arguments: oam pointer to (a mirror of) Object attribute
613
614 Returns: color mode
615 *---------------------------------------------------------------------------*/
G2_GetOBJColorMode(const GXOamAttr * oam)616 static inline GXOamColorMode G2_GetOBJColorMode(const GXOamAttr *oam)
617 {
618 SDK_NULL_ASSERT(oam);
619
620 return (GXOamColorMode)((oam->attr01 & GX_OAM_ATTR01_CM_MASK) >> GX_OAM_ATTR01_CM_SHIFT);
621 }
622
623
624 /*---------------------------------------------------------------------------*
625 Name: G2_OBJMosaic
626
627 Description: Enable/Disable mosaic on an OBJ.
628
629 Arguments: oam pointer to (a mirror of) Object attribute
630 enable enable/disable mosaic
631
632 Returns: none
633 *---------------------------------------------------------------------------*/
G2_OBJMosaic(GXOamAttr * oam,BOOL enable)634 static inline void G2_OBJMosaic(GXOamAttr *oam, BOOL enable)
635 {
636 if (enable)
637 {
638 oam->attr01 |= (1 << GX_OAM_ATTR01_MOSAIC_SHIFT);
639 }
640 else
641 {
642 oam->attr01 &= ~(1 << GX_OAM_ATTR01_MOSAIC_SHIFT);
643 }
644 }
645
646
647 /*---------------------------------------------------------------------------*
648 Name: G2_SetOBJAttr
649
650 Description: Sets a bunch of attributes for an OBJ.
651
652 Arguments: oam pointer to (a mirror of) Object attribute
653 x X coordinate
654 y Y coordinate
655 priority priority
656 mode OBJ mode(normal/xlu/objwindow/bitmapobj)
657 mosaic mosaic
658 effect specify an effect(none/flip/affine/nodisplay/affine double)
659 shape specify size and shape of the Object
660 color color mode
661 charName the head character name of an OBJ
662 cParam color parameter
663 rsParam select an affine transformation(0-31) if affine effect specified
664
665 Returns: none
666 *---------------------------------------------------------------------------*/
G2_SetOBJAttr(GXOamAttr * oam,int x,int y,int priority,GXOamMode mode,BOOL mosaic,GXOamEffect effect,GXOamShape shape,GXOamColorMode color,int charName,int cParam,int rsParam)667 static inline void G2_SetOBJAttr(GXOamAttr *oam,
668 int x,
669 int y,
670 int priority,
671 GXOamMode mode,
672 BOOL mosaic,
673 GXOamEffect effect,
674 GXOamShape shape,
675 GXOamColorMode color, int charName, int cParam, int rsParam)
676 {
677 // set rsParam or not
678 #define G2_SET_OBJ_ATTR_AFMODE_AFFINE_() (rsParam << GX_OAM_ATTR01_RS_SHIFT) |
679 #define G2_SET_OBJ_ATTR_AFMODE_NORMAL_()
680
681 // set color or not
682 #define G2_SET_OBJ_ATTR_CLMODE_CHARACTOR_() (color << GX_OAM_ATTR01_CM_SHIFT) |
683 #define G2_SET_OBJ_ATTR_CLMODE_BITMAP_()
684
685 // af_t : AFFINE or NORMAL
686 // bm_t : CHARACTOR or BITMAP
687 #define G2_SET_OBJ_ATTR_(af_t, bm_t) \
688 oam->attr01 = (u32) (G2_SET_OBJ_ATTR_AFMODE_##af_t##_() \
689 G2_SET_OBJ_ATTR_CLMODE_##bm_t##_() \
690 ((y & (GX_OAM_ATTR01_Y_MASK >> GX_OAM_ATTR01_Y_SHIFT)) << GX_OAM_ATTR01_Y_SHIFT) | \
691 (mode << GX_OAM_ATTR01_MODE_SHIFT) | \
692 (mosaic << GX_OAM_ATTR01_MOSAIC_SHIFT) | \
693 shape | \
694 ((x & (GX_OAM_ATTR01_X_MASK >> GX_OAM_ATTR01_X_SHIFT)) << GX_OAM_ATTR01_X_SHIFT) | \
695 effect);
696
697
698 GX_OAM_PRIORTY_ASSERT(priority);
699 GX_OAM_MODE_ASSERT(mode);
700 GX_OAM_EFFECT_ASSERT(effect);
701 GX_OAM_SHAPE_ASSERT(shape);
702 GX_OAM_COLORMODE_ASSERT(color);
703 GX_OAM_CPARAM_ASSERT(cParam);
704 SDK_ASSERT(mosaic == 0 || mosaic == 1);
705 SDK_WARNING(!(mode == GX_OAM_MODE_BITMAPOBJ && color == GX_OAM_COLORMODE_256),
706 "Only GX_OAM_COLORMODE_16 can be specified with GX_OAM_MODE_BITMAPOBJ.");
707
708 // To be small code by optimization when constants specified, I hope.
709
710 // Set color parameter then Charactor OBJ, and set affine parameter then affine mode
711 if (GX_OAM_EFFECT_AFFINE == effect || GX_OAM_EFFECT_AFFINE_DOUBLE == effect)
712 {
713 if (GX_OAM_MODE_BITMAPOBJ == mode)
714 {
715 G2_SET_OBJ_ATTR_(AFFINE, BITMAP);
716 }
717 else
718 {
719 G2_SET_OBJ_ATTR_(AFFINE, CHARACTOR);
720 }
721 }
722 else
723 {
724 if (GX_OAM_MODE_BITMAPOBJ == mode)
725 {
726 G2_SET_OBJ_ATTR_(NORMAL, BITMAP);
727 }
728 else
729 {
730 G2_SET_OBJ_ATTR_(NORMAL, CHARACTOR);
731 }
732 }
733
734 oam->attr2 = (u16)((charName << GX_OAM_ATTR2_NAME_SHIFT) |
735 (priority << GX_OAM_ATTR2_PRIORITY_SHIFT) |
736 (cParam << GX_OAM_ATTR2_CPARAM_SHIFT));
737
738 #undef G2_SET_OBJ_ATTR_AFMODE_AFFINE_
739 #undef G2_SET_OBJ_ATTR_AFMODE_NORMAL_
740 #undef G2_SET_OBJ_ATTR_CLMODE_CHARACTOR_
741 #undef G2_SET_OBJ_ATTR_CLMODE_BITMAP_
742 #undef G2_SET_OBJ_ATTR_
743 }
744
745 /*---------------------------------------------------------------------------*
746 Name: G2_SetOBJAffine
747
748 Description: Sets affine parameters.
749
750 Arguments: oam pointer to (a mirror of) Object attribute
751 mtx a pointer to a 2x2 matrix for affine transformation of OBJs
752
753 Returns: none
754 *---------------------------------------------------------------------------*/
G2_SetOBJAffine(GXOamAffine * oam,const MtxFx22 * mtx)755 static inline void G2_SetOBJAffine(GXOamAffine *oam, const MtxFx22 *mtx)
756 {
757 SDK_MINMAX_ASSERT(mtx->_00, -128 * FX32_ONE, 128 * FX32_ONE - 1);
758 SDK_MINMAX_ASSERT(mtx->_01, -128 * FX32_ONE, 128 * FX32_ONE - 1);
759 SDK_MINMAX_ASSERT(mtx->_10, -128 * FX32_ONE, 128 * FX32_ONE - 1);
760 SDK_MINMAX_ASSERT(mtx->_11, -128 * FX32_ONE, 128 * FX32_ONE - 1);
761
762 // Affine transform parmeters(PA,PB,PC,PD) are in s7.8 format.
763 // Since fx32 is in s19.12 format, shift them rightward by 4 bits.
764 oam->PA = (s16)(mtx->_00 >> 4);
765 oam->PB = (s16)(mtx->_01 >> 4);
766 oam->PC = (s16)(mtx->_10 >> 4);
767 oam->PD = (s16)(mtx->_11 >> 4);
768 }
769
770
771 /*---------------------------------------------------------------------------*
772 Name: G2_GetOBJAffine
773
774 Description: Get affine parameters.
775
776 Arguments: oam pointer to (a mirror of) Object attribute
777 mtx a pointer to a 2x2 matrix for affine transformation of OBJs
778
779 Returns: none
780 *---------------------------------------------------------------------------*/
G2_GetOBJAffine(const GXOamAffine * oam,MtxFx22 * mtx)781 static inline void G2_GetOBJAffine(const GXOamAffine *oam, MtxFx22 *mtx)
782 {
783 // fx32 is in s19.12 format.
784 // Since Affine transform parmeters(PA,PB,PC,PD) are in s7.8 format,
785 // shift them leftward by 4 bits.
786 mtx->_00 = (fx32)(oam->PA << 4);
787 mtx->_01 = (fx32)(oam->PB << 4);
788 mtx->_10 = (fx32)(oam->PC << 4);
789 mtx->_11 = (fx32)(oam->PD << 4);
790 }
791
792
793
794 #endif // SDK_FROM_TOOL
795
796 #ifdef __cplusplus
797 }/* extern "C" */
798 #endif
799
800 #endif
801