1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - demos.TWL - os - os_jump
3 File: screen.c
4
5 Copyright 2007-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-10-08#$
14 $Rev: 8901 $
15 $Author: okajima_manabu $
16 *---------------------------------------------------------------------------*/
17 #include <nitro.h>
18 #include "screen.h"
19 #include "font.h"
20
21 /*---------------------------------------------------------------------------*
22 Constant Definitions
23 *---------------------------------------------------------------------------*/
24 #define TEXT_SCREEN_SIZE 2048
25
26 /*---------------------------------------------------------------------------*
27 Internal Variable Definitions
28 *---------------------------------------------------------------------------*/
29
30 // Virtual screen [top and bottom screens][number of backgrounds][number of characters]
31 static u16 gScreen[2 ][ 1 ][ TEXT_SCREEN_SIZE / sizeof(u16) ] ATTRIBUTE_ALIGN(32);
32
33 /*---------------------------------------------------------------------------*
34 Name: InitScreen
35
36 Description: Initialize display settings for text display system.
37
38 Arguments: None.
39
40 Returns: None.
41 *---------------------------------------------------------------------------*/
InitScreen(void)42 void InitScreen(void)
43 {
44 // Various VRAM initialization steps
45 GX_SetBankForLCDC(GX_VRAM_LCDC_ALL);
46 MI_CpuClearFast((void*)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE);
47 (void)GX_DisableBankForLCDC();
48
49 // Initialize OAM
50 MI_CpuFillFast((void*)HW_OAM, 0xc0, HW_OAM_SIZE);
51 MI_CpuFillFast((void*)HW_DB_OAM, 0xc0, HW_DB_OAM_SIZE);
52
53 // Initialize palette
54 MI_CpuClearFast((void*)HW_PLTT, HW_PLTT_SIZE);
55 MI_CpuClearFast((void*)HW_DB_PLTT, HW_DB_PLTT_SIZE);
56
57 // Top screen settings
58 GX_SetBankForBG(GX_VRAM_BG_128_A);
59 G2_SetBG0Control(GX_BG_SCRSIZE_TEXT_256x256, GX_BG_COLORMODE_16, GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,
60 GX_BG_EXTPLTT_01);
61 G2_SetBG0Priority(0);
62 GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
63 GX_SetVisiblePlane(GX_PLANEMASK_BG0);
64 GX_LoadBG0Char(d_CharData, 0, sizeof(d_CharData));
65 GX_LoadBGPltt(d_PaletteData, 0, sizeof(d_PaletteData));
66 ((u16*)HW_PLTT)[0] = 0x0000; // Black
67 MI_CpuFillFast(gScreen[0][0], 0, TEXT_SCREEN_SIZE);
68 DC_StoreRange(gScreen[0][0], TEXT_SCREEN_SIZE);
69 GX_LoadBG0Scr(gScreen[0][0], 0, TEXT_SCREEN_SIZE);
70
71 // Bottom screen settings
72 GX_SetBankForSubBG(GX_VRAM_SUB_BG_32_H);
73 G2S_SetBG0Control(GX_BG_SCRSIZE_TEXT_256x256, GX_BG_COLORMODE_16, GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,
74 GX_BG_EXTPLTT_01);
75 G2S_SetBG0Priority(0);
76 GXS_SetGraphicsMode(GX_BGMODE_0);
77 GXS_SetVisiblePlane(GX_PLANEMASK_BG0);
78 GXS_LoadBG0Char(d_CharData, 0, sizeof(d_CharData));
79 GXS_LoadBGPltt(d_PaletteData, 0, sizeof(d_PaletteData));
80 ((u16*)HW_DB_PLTT)[0] = 0x0000; // Black
81 MI_CpuFillFast(gScreen[1][0], 0, TEXT_SCREEN_SIZE);
82 DC_StoreRange(gScreen[1][0], TEXT_SCREEN_SIZE);
83 GXS_LoadBG0Scr(gScreen[1][0], 0, TEXT_SCREEN_SIZE);
84 }
85
86 /*---------------------------------------------------------------------------*
87 Name: ClearScreen
88
89 Description: Clears text display from the screen.
90
91 Arguments: None.
92
93 Returns: None.
94 *---------------------------------------------------------------------------*/
ClearScreen(void)95 void ClearScreen(void)
96 {
97 MI_CpuClearFast(gScreen[0][0], TEXT_SCREEN_SIZE);
98 MI_CpuClearFast(gScreen[1][0], TEXT_SCREEN_SIZE);
99 }
ClearMainScreen(void)100 void ClearMainScreen(void)
101 {
102 MI_CpuClearFast(gScreen[0][0], TEXT_SCREEN_SIZE);
103
104 }
ClearSubScreen(void)105 void ClearSubScreen(void)
106 {
107 MI_CpuClearFast(gScreen[1][0], TEXT_SCREEN_SIZE);
108 }
109 /*---------------------------------------------------------------------------*
110 Name: PutMainScreen
111
112 Description: Outputs text to main screen.
113
114 Arguments: text: String to be output
115 ...: Virtual argument
116
117 Returns: None.
118 *---------------------------------------------------------------------------*/
PutMainScreen(s32 x,s32 y,u8 palette,char * text,...)119 void PutMainScreen(s32 x, s32 y, u8 palette, char* text, ...)
120 {
121 va_list vlist;
122 char temp[33];
123 s32 i;
124
125 va_start(vlist, text);
126 (void)vsnprintf(temp, 33, text, vlist);
127 va_end(vlist);
128
129 for (i = 0; i < 32; i++)
130 {
131 if (temp[i] == 0x00)
132 {
133 break;
134 }
135
136 gScreen[0][0][((y * 32) + x + i) % (32 * 32)] = (u16) (palette << 12 | temp[i]);
137 }
138 }
139
140 /*---------------------------------------------------------------------------*
141 Name: PrintSubScreen
142
143 Description: Outputs text to the sub-screen.
144
145 Arguments: text: String to be output
146 ...: Virtual argument
147
148 Returns: None.
149 *---------------------------------------------------------------------------*/
PutSubScreen(s32 x,s32 y,u8 palette,char * text,...)150 void PutSubScreen(s32 x, s32 y, u8 palette, char* text, ...)
151 {
152 va_list vlist;
153 char temp[33];
154 s32 i;
155
156 va_start(vlist, text);
157 (void)vsnprintf(temp, 33, text, vlist);
158 va_end(vlist);
159
160 for (i = 0; i < 32; i++)
161 {
162 if (temp[i] == 0x00)
163 {
164 break;
165 }
166
167 gScreen[1][0][((y * 32) + x + i) % (32 * 32)] = (u16) (palette << 12 | temp[i]);
168 }
169 }
170
171 /*---------------------------------------------------------------------------*
172 Name: UpdateScreen
173
174 Description: Reflects the virtual screen content to VRAM.
175 Assumed to be called during the V-Blank period.
176
177 Arguments: None.
178
179 Returns: None.
180 *---------------------------------------------------------------------------*/
UpdateScreen(void)181 void UpdateScreen(void)
182 {
183 // Reflects the virtual screen content to V-RAM
184 DC_StoreRange(gScreen[0][0], TEXT_SCREEN_SIZE);
185 GX_LoadBG0Scr(gScreen[0][0], 0, TEXT_SCREEN_SIZE);
186 DC_StoreRange(gScreen[1][0], TEXT_SCREEN_SIZE);
187 GXS_LoadBG0Scr(gScreen[1][0], 0, TEXT_SCREEN_SIZE);
188 }
189
190 /*---------------------------------------------------------------------------*
191 End of file
192 *---------------------------------------------------------------------------*/
193