1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - GX -
3   File:     g2_oam.h
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-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NITRO_G2_OAM_H_
19 #define NITRO_G2_OAM_H_
20 
21 #ifdef SDK_NITRO
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