1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - WXC - demos - wxc-dataShare
3   File:     disp.c
4 
5   Copyright 2005-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:: 2007-11-15#$
14   $Rev: 2414 $
15   $Author: hatamoto_minoru $
16  *---------------------------------------------------------------------------*/
17 
18 //----------------------------------------------------------------------
19 // Basic string display functionality
20 //----------------------------------------------------------------------
21 
22 #include <nitro.h>
23 #include "disp.h"
24 
25 
26 //============================================================================
27 //  Prototype Declarations
28 //============================================================================
29 static void VramClear(void);
30 static void ObjInitForPrintStr(void);
31 static void BgInitForPrintStr(void);
32 
33 
34 //============================================================================
35 //  Constant Definitions
36 //============================================================================
37 
38 #define BGSTR_MAX_LENGTH        32
39 
40 //============================================================================
41 //  Variable Definitions
42 //============================================================================
43 
44 /* Virtual screen */
45 static u16 vscr[32 * 32];
46 
47 /* Temporary OAM for V-Blank transfer */
48 static GXOamAttr oamBak[128];
49 
50 
51 /* For various rendering usages */
52 extern const u32 sampleFontCharData[8 * 0xe0];
53 extern const u16 samplePlttData[16][16];
54 
55 
56 //============================================================================
57 //  Function Definitions
58 //============================================================================
59 
60 /*---------------------------------------------------------------------------*
61   Name:         BgInitForPrintStr
62 
63   Description:  Initializes BG character drawing (fixed to BG0, VRAM-C, BG mode 0).
64 
65   Arguments:    None.
66 
67   Returns:      None.
68  *---------------------------------------------------------------------------*/
BgInitForPrintStr(void)69 static void BgInitForPrintStr(void)
70 {
71     GX_SetBankForBG(GX_VRAM_BG_128_C);
72     G2_SetBG0Control(GX_BG_SCRSIZE_TEXT_256x256, GX_BG_COLORMODE_16, GX_BG_SCRBASE_0xf800,      /* SCR base block 31 */
73                      GX_BG_CHARBASE_0x00000,    /* CHR base block 0 */
74                      GX_BG_EXTPLTT_01);
75     G2_SetBG0Priority(0);
76     G2_BG0Mosaic(FALSE);
77     GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
78     G2_SetBG0Offset(0, 0);
79 
80     GX_LoadBG0Char(sampleFontCharData, 0, sizeof(sampleFontCharData));
81     GX_LoadBGPltt(samplePlttData, 0, sizeof(samplePlttData));
82 
83     MI_CpuFillFast((void *)vscr, 0, sizeof(vscr));
84     DC_FlushRange(vscr, sizeof(vscr));
85     /* I/O register is accessed using DMA operation, so cache wait is not needed */
86     // DC_WaitWriteBufferEmpty();
87     GX_LoadBG0Scr(vscr, 0, sizeof(vscr));
88 }
89 
90 /*---------------------------------------------------------------------------*
91   Name:         ObjInitForPrintStr
92 
93   Description:  OBJ initialization (VRAM-B, 2D mode).
94 
95   Arguments:    None.
96 
97   Returns:      None.
98  *---------------------------------------------------------------------------*/
ObjInitForPrintStr(void)99 static void ObjInitForPrintStr(void)
100 {
101     GX_SetBankForOBJ(GX_VRAM_OBJ_128_B);
102     GX_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_2D);
103     MI_DmaFill32(3, oamBak, 0xc0, sizeof(oamBak));
104 
105     GX_LoadOBJ(sampleFontCharData, 0, sizeof(sampleFontCharData));
106     GX_LoadOBJPltt(samplePlttData, 0, sizeof(samplePlttData));
107 
108 }
109 
110 /*---------------------------------------------------------------------------*
111   Name:         VramClear
112 
113   Description:  Clears VRAM.
114 
115   Arguments:    None.
116 
117   Returns:      None.
118  *---------------------------------------------------------------------------*/
VramClear(void)119 static void VramClear(void)
120 {
121     GX_SetBankForLCDC(GX_VRAM_LCDC_ALL);
122     MI_CpuClearFast((void *)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE);
123     (void)GX_DisableBankForLCDC();
124     MI_CpuFillFast((void *)HW_OAM, 192, HW_OAM_SIZE);
125     MI_CpuClearFast((void *)HW_PLTT, HW_PLTT_SIZE);
126     MI_CpuFillFast((void *)HW_DB_OAM, 192, HW_DB_OAM_SIZE);
127     MI_CpuClearFast((void *)HW_DB_PLTT, HW_DB_PLTT_SIZE);
128 }
129 
130 /*---------------------------------------------------------------------------*
131   Name:         DispInit
132 
133   Description:  Render initialization.
134 
135   Arguments:    None.
136 
137   Returns:      None.
138  *---------------------------------------------------------------------------*/
DispInit(void)139 void DispInit(void)
140 {
141     /* Rendering settings initialization */
142     VramClear();
143 
144     // Object initialization
145     ObjInitForPrintStr();
146 
147     // Background initialization
148     BgInitForPrintStr();
149 
150     GX_SetVisiblePlane(GX_PLANEMASK_BG0 | GX_PLANEMASK_OBJ);
151 
152 }
153 
154 
155 /*---------------------------------------------------------------------------*
156   Name:         DispOn
157 
158   Description:  Displays screen.
159 
160   Arguments:    None.
161 
162   Returns:      None.
163  *---------------------------------------------------------------------------*/
DispOn(void)164 void DispOn(void)
165 {
166     /* Start display */
167     GX_DispOn();
168     GXS_DispOn();
169 }
170 
171 /*---------------------------------------------------------------------------*
172   Name:         DispOff
173 
174   Description:  Hides screen.
175 
176   Arguments:    None.
177 
178   Returns:      None.
179  *---------------------------------------------------------------------------*/
DispOff(void)180 void DispOff(void)
181 {
182     /* Start display */
183     GX_DispOff();
184     GXS_DispOff();
185 }
186 
187 
188 
189 
190 /*---------------------------------------------------------------------------*
191   Name:         DispVBlankFunc
192 
193   Description:  Rendering V-Blank processing.
194 
195   Arguments:    None.
196 
197   Returns:      None.
198  *---------------------------------------------------------------------------*/
DispVBlankFunc(void)199 void DispVBlankFunc(void)
200 {
201     //---- OAM updating
202     DC_FlushRange(oamBak, sizeof(oamBak));
203     /* I/O register is accessed using DMA operation, so cache wait is not needed */
204     // DC_WaitWriteBufferEmpty();
205     MI_DmaCopy32(3, oamBak, (void *)HW_OAM, sizeof(oamBak));
206 
207     //---- Background screen update
208     DC_FlushRange(vscr, sizeof(vscr));
209     /* I/O register is accessed using DMA operation, so cache wait is not needed */
210     // DC_WaitWriteBufferEmpty();
211     GX_LoadBG0Scr(vscr, 0, sizeof(vscr));
212 }
213 
214 /*---------------------------------------------------------------------------*
215   Name:         BgPutStringN
216 
217   Description:  Outputs N character to background.
218 
219   Arguments:    None.
220 
221   Returns:      None.
222  *---------------------------------------------------------------------------*/
BgPutStringN(s32 x,s32 y,s32 palette,const char * text,s32 num)223 void BgPutStringN(s32 x, s32 y, s32 palette, const char *text, s32 num)
224 {
225     s32 i;
226     if (num > BGSTR_MAX_LENGTH)
227     {
228         num = BGSTR_MAX_LENGTH;
229     }
230 
231     for (i = 0; i < num; i++)
232     {
233         if (text[i] == '\0')
234         {
235             break;
236         }
237         BgPutChar(x + i, y, palette, text[i]);
238     }
239 }
240 
241 /*---------------------------------------------------------------------------*
242   Name:         BgPutChar
243 
244   Description:  Outputs 1 background character.
245 
246   Arguments:    None.
247 
248   Returns:      None.
249  *---------------------------------------------------------------------------*/
BgPutChar(s32 x,s32 y,s32 palette,s8 c)250 void BgPutChar(s32 x, s32 y, s32 palette, s8 c)
251 {
252     vscr[((y * 32) + x) % (32 * 32)] = (u16)((palette << 12) | c);
253 }
254 
255 /*---------------------------------------------------------------------------*
256   Name:         BgPutString
257 
258   Description:  Outputs 32 background characters.
259 
260   Arguments:    None.
261 
262   Returns:      None.
263  *---------------------------------------------------------------------------*/
BgPutString(s32 x,s32 y,s32 palette,const char * text)264 void BgPutString(s32 x, s32 y, s32 palette, const char *text)
265 {
266     BgPutStringN(x, y, palette, text, BGSTR_MAX_LENGTH);
267 }
268 
269 /*---------------------------------------------------------------------------*
270   Name:         BgPrintStr
271 
272   Description:  Background formatted output.
273 
274   Arguments:    None.
275 
276   Returns:      None.
277  *---------------------------------------------------------------------------*/
BgPrintStr(s32 x,s32 y,s32 palette,const char * text,...)278 void BgPrintStr(s32 x, s32 y, s32 palette, const char *text, ...)
279 {
280     char temp[(BGSTR_MAX_LENGTH + 1) * 2];
281     va_list vlist;
282 
283     MI_CpuClear8(temp, sizeof(temp));
284     va_start(vlist, text);
285     (void)vsnprintf(temp, sizeof(temp) - 1, text, vlist);
286     va_end(vlist);
287     BgPutString(x, y, palette, temp);
288 }
289 
290 /*---------------------------------------------------------------------------*
291   Name:         BgClear
292 
293   Description:  Clears the background.
294 
295   Arguments:    None.
296 
297   Returns:      None.
298  *---------------------------------------------------------------------------*/
BgClear(void)299 void BgClear(void)
300 {
301     MI_CpuClearFast(vscr, sizeof(vscr));
302 }
303