1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - demos - VIB - pulse_vib
3   File:     char_data.c
4 
5   Copyright 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:: $
14   $Rev: $
15   $Author: $
16  *---------------------------------------------------------------------------*/
17 #include <char_data.h>
18 
19 /*-----------------------------------------------------------------------*
20                     Function prototype
21  *-----------------------------------------------------------------------*/
22 
23 //--- Auto Function Prototype --- Don't comment here.
24 void    dp_init(void);
25 void    dp_set_pltt(s32 pltt_no);
26 void    dp_flush(void);
27 void    dp_write(char *str, LcdScreen scr, s32 h_pos, s32 v_pos);
28 void    dp_clear_scr(LcdScreen scr);
29 void    dp_clear(LcdScreen scr, s32 h_pos, s32 v_pos, u32 num);
30 void    dp_write_byte(u8 num, LcdScreen scr, s32 h_pos, s32 v_pos);
31 void    dp_write_dec(s32 num, LcdScreen scr, s32 h_pos, s32 v_pos);
32 void    dp_write_hex(s32 num, LcdScreen scr, s32 h_pos, s32 v_pos);
33 void    dp_write_byte_arr(u8 *arr, u32 length, LcdScreen scr, s32 h_pos, s32 v_pos);
34 static void BgScSet(char *Srcp, u16 *Destp, u8 PlttNo);
35 //--- End of Auto Function Prototype
36 
37 /*-----------------------------------------------------------------------*
38                     Variable
39  *-----------------------------------------------------------------------*/
40 
41 static s32 pltt;
42 static u16 scr_buf_main[SCREEN_SIZE];
43 static u16 scr_buf_sub[SCREEN_SIZE];
44 
45 /*-----------------------------------------------------------------------*
46                     Global Function Definition
47  *-----------------------------------------------------------------------*/
48 
dp_init(void)49 void dp_init(void)
50 {
51 
52     GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN);
53 
54     GX_SetBankForBG(GX_VRAM_BG_128_A);
55     GX_SetBankForSubBG(GX_VRAM_SUB_BG_128_C);
56 
57     GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
58 
59     GXS_SetGraphicsMode(GX_BGMODE_0);
60 
61     G2_SetBG1Control(GX_BG_SCRSIZE_TEXT_256x256,
62                      GX_BG_COLORMODE_16,
63                      GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000, GX_BG_EXTPLTT_01);
64 
65     G2S_SetBG1Control(GX_BG_SCRSIZE_TEXT_256x256,
66                       GX_BG_COLORMODE_16,
67                       GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000, GX_BG_EXTPLTT_01);
68 
69     G2_SetBG1Priority(0);
70     G2S_SetBG1Priority(0);
71 
72     G2_BG1Mosaic(FALSE);
73     G2S_BG1Mosaic(FALSE);
74 
75     GX_LoadBG1Char(CharData_Sample, 0, sizeof(CharData_Sample));
76     GX_LoadBGPltt(PlttData_Sample, 0, sizeof(PlttData_Sample));
77 
78     GXS_LoadBG1Char(CharData_Sample, 0, sizeof(CharData_Sample));
79     GXS_LoadBGPltt(PlttData_Sample, 0, sizeof(PlttData_Sample));
80 
81     MI_CpuClearFast(scr_buf_main, sizeof(scr_buf_main));
82     MI_CpuClearFast(scr_buf_sub, sizeof(scr_buf_sub));
83 
84     dp_flush();
85 
86     GX_SetVisiblePlane(GX_PLANEMASK_BG1);
87     GXS_SetVisiblePlane(GX_PLANEMASK_BG1);
88 }
89 
dp_set_pltt(s32 pltt_no)90 void dp_set_pltt(s32 pltt_no)
91 {
92     pltt = pltt_no;
93 }
94 
dp_flush(void)95 void dp_flush(void)
96 {
97 
98     DC_FlushRange(scr_buf_main, sizeof(scr_buf_main));
99     DC_FlushRange(scr_buf_sub, sizeof(scr_buf_sub));
100 
101     GX_LoadBG1Scr(scr_buf_main, 0, sizeof(scr_buf_main));
102     GXS_LoadBG1Scr(scr_buf_sub, 0, sizeof(scr_buf_sub));
103 }
104 
dp_write(char * str,LcdScreen scr,s32 h_pos,s32 v_pos)105 void dp_write(char *str, LcdScreen scr, s32 h_pos, s32 v_pos)
106 {
107 
108     switch (scr)
109     {
110     case LCD_BOTTOM:
111         BgScSet(str, &scr_buf_main[32 * v_pos + h_pos], 0);
112         break;
113     case LCD_TOP:
114         BgScSet(str, &scr_buf_sub[32 * v_pos + h_pos], 0);
115         break;
116     }
117 }
118 
dp_clear_scr(LcdScreen scr)119 void dp_clear_scr(LcdScreen scr)
120 {
121 
122     switch (scr)
123     {
124     case LCD_BOTTOM:
125         MI_CpuClearFast(scr_buf_main, sizeof(scr_buf_main));
126         break;
127     case LCD_TOP:
128         MI_CpuClearFast(scr_buf_sub, sizeof(scr_buf_sub));
129         break;
130     }
131 }
132 
dp_clear(LcdScreen scr,s32 h_pos,s32 v_pos,u32 num)133 void dp_clear(LcdScreen scr, s32 h_pos, s32 v_pos, u32 num)
134 {
135 
136     switch (scr)
137     {
138     case LCD_BOTTOM:
139         MI_CpuClear8(&scr_buf_main[32 * v_pos + h_pos], num * 2);
140         break;
141     case LCD_TOP:
142         MI_CpuClear8(&scr_buf_sub[32 * v_pos + h_pos], num * 2);
143         break;
144     }
145 }
146 
dp_write_byte(u8 num,LcdScreen scr,s32 h_pos,s32 v_pos)147 void dp_write_byte(u8 num, LcdScreen scr, s32 h_pos, s32 v_pos)
148 {
149 
150     char    str[3];
151 
152     str[2] = 0;
153     str[1] = "0123456789ABCDEF"[num & 0xf];
154     str[0] = "0123456789ABCDEF"[(num >> 4) & 0xf];
155 
156     switch (scr)
157     {
158     case LCD_BOTTOM:
159         BgScSet(str, &scr_buf_main[32 * v_pos + h_pos], 0);
160         break;
161     case LCD_TOP:
162         BgScSet(str, &scr_buf_sub[32 * v_pos + h_pos], 0);
163         break;
164     }
165 }
166 
dp_write_dec(s32 num,LcdScreen scr,s32 h_pos,s32 v_pos)167 void dp_write_dec(s32 num, LcdScreen scr, s32 h_pos, s32 v_pos)
168 {
169 
170     char    buf[64];
171 
172     (void)OS_SNPrintf(buf, 64, "%d", num);
173 
174     dp_write(buf, scr, h_pos, v_pos);
175 }
176 
dp_write_hex(s32 num,LcdScreen scr,s32 h_pos,s32 v_pos)177 void dp_write_hex(s32 num, LcdScreen scr, s32 h_pos, s32 v_pos)
178 {
179 
180     char    buf[64];
181 
182     (void)OS_SNPrintf(buf, 64, "%x", num);
183 
184     dp_write(buf, scr, h_pos, v_pos);
185 }
186 
dp_write_byte_arr(u8 * arr,u32 length,LcdScreen scr,s32 h_pos,s32 v_pos)187 void dp_write_byte_arr(u8 *arr, u32 length, LcdScreen scr, s32 h_pos, s32 v_pos)
188 {
189 
190     s32     i;
191     s32     pltt_temp = pltt;
192 
193     for (i = 0; i < length; i++)
194     {
195         pltt = i & 1;
196         dp_write_byte(arr[i], scr, h_pos + i * 2, v_pos);
197     }
198     pltt = pltt_temp;
199 }
200 
BgScSet(char * Srcp,u16 * Destp,u8 PlttNo)201 static void BgScSet(char *Srcp, u16 *Destp, u8 PlttNo)
202 {
203     PlttNo = (u8)pltt;
204 
205     while (*Srcp != '\0')
206         *Destp++ = (u16)(PlttNo << 12 | *Srcp++);
207 }
208