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