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