main.c
5.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/*======================================================================*/
/* NuSYS high resolution sample */
/* main.c */
/* */
/* Copyright (C) 1997, NINTENDO Co,Ltd. */
/* 97/12/08 Created by Kensaku Ohki(SLANP) */
/*======================================================================*/
#include <nusys.h>
#include "localdef.h"
/*----------------------------------------------------------------------*/
/* ハイレゾ画面とローレゾ画面のメモリ配置図 */
/* */
/* ハイレゾ ローレゾ */
/* 0x80000000 +---------+ +----------+ */
/* | System | | System | */
/* 0x80000400 +---------+ +----------+ */
/* | Free | | Z-Buffer | */
/* 0x80025A00 +---------+ +----------+ */
/* | Code | | Code | */
/* | & Data | | & Data | */
/* | & Heap | | & Heap | */
/* 0x801BE000 +---------+ | | */
/* |Z-Buffer | | | */
/* |FrameBuf | 0x8030F800 +----------+ */
/* | | | FrameBuf | */
/* | | | | */
/* 0x80380000 +---------+ +----------+ */
/* | Audio- | | Audio- | */
/* | Heap | | Heap | */
/* 0x083FFFFF +---------+ +----------+ */
/* */
/* */
/* ハイレゾ時は0x80000400-0x80024FFまでが空き領域になりますが */
/* この領域を空けたく無い場合はZ-Buffeをハイレゾとローレゾで */
/* 動的に確保して割り当てれば良いです。 */
/* ただしZ-BufferとFrameBufferは */
/* RDRAMの別バンクに割り当てた方が良いです。 */
/* (このサンプルは,ハイレゾ方のメモリ配置は良くないです(^^; */
/* その代わりヒープメモリの管理は楽) */
/*----------------------------------------------------------------------*/
/* ハイレゾのフレームバッファアドレス配列 */
u16* HighFrameBuf[2] = {
(u16*)CFB_HIGH_ADDR0,
(u16*)CFB_HIGH_ADDR1
};
/* ローレゾのフレームバッファアドレス配列 */
u16* LowFrameBuf[3] = {
(u16*)CFB_LOW_ADDR0,
(u16*)CFB_LOW_ADDR1,
(u16*)CFB_LOW_ADDR2,
};
u32 mainNo;
void setupHigh(void);
void setupLow(void);
extern void graphic(u32 taskNum);
extern void audioInit(void);
extern u32 hireso;
/*----------------------------------------------------------------------*/
/* ゲームのスタートアップ */
/* IN: 特になし */
/* RET: 無し */
/*----------------------------------------------------------------------*/
void mainproc(void* arg)
{
/* グラフィックスの初期化 */
nuGfxInit();
/* コントローラの初期化 */
nuContInit();
/* 最初はハイレゾ */
mainNo = MAIN_HIGH;
/* ゲームメイン */
while(1){
switch(mainNo){
case MAIN_HIGH: /* ハイレゾ */
setupHigh();
mainNo = MAIN_DUMMY;
break;
case MAIN_LOW: /* ローレゾ */
setupLow();
mainNo = MAIN_DUMMY;
break;
case MAIN_DUMMY: /* ダミー */
break;
default:
break;
}
}
}
/*----------------------------------------------------------------------*/
/* setupHigh - ハイレゾ設定 */
/* IN: 特になし */
/* RET: 無し */
/*----------------------------------------------------------------------*/
void setupHigh(void)
{
/* タスクがすべて終了するのを待つ */
nuGfxTaskAllEndWait();
/* VIの設定 */
osViSetMode(&osViModeTable[OS_VI_NTSC_HAN1]);
/* VIのモードを変更するとosViBlackがFALSEになるので */
/* もう一度画面表示をオフに設定しなおす */
nuGfxDisplayOff();
/* フレームバッファのアドレス設定 */
nuGfxSetCfb(HighFrameBuf, 2);
/* Zバッファのアドレス設定 */
nuGfxSetZBuffer((u16*)(ZBUFFER_ADDR));
nuPiReadRom((u32)_himageSegmentRomStart, (u32*)_codeSegmentEnd,
(u32)_himageSegmentRomEnd-(u32)_himageSegmentRomStart);
nuDebConClear(0);
nuDebConTextAttr(0, NU_DEB_CON_ATTR_BLINK);
nuDebConTextPos(0, 13,25);
nuDebConTextColor(0, NU_DEB_CON_TEXT_RED);
nuDebConPuts(0, "High Resolution");
nuDebConTextAttr(0, NU_DEB_CON_ATTR_NORMAL);
/* 画面表示オン */
hireso = 1;
/* コールバック関数の登録 */
nuGfxFuncSet(graphic);
nuGfxDisplayOn();
}
/*----------------------------------------------------------------------*/
/* setupHigh - ローレゾ設定 */
/* IN: 特になし */
/* RET: 無し */
/*----------------------------------------------------------------------*/
void setupLow(void)
{
/* タスクがすべて終了するのを待つ */
nuGfxTaskAllEndWait();
/* VIの設定 */
osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
/* VIのモードを変更するとosViBlackがFALSEになるので */
/* もう一度画面表示をオフに設定しなおす */
nuGfxDisplayOff();
/* フレームバッファのアドレス設定 */
nuGfxSetCfb(LowFrameBuf, 3);
nuPiReadRom((u32)_limageSegmentRomStart, (u32*)_codeSegmentEnd,
(u32)_limageSegmentRomEnd-(u32)_limageSegmentRomStart);
/* Zバッファのアドレス設定 */
nuGfxSetZBuffer((u16*)NU_GFX_ZBUFFER_ADDR);
nuDebConClear(0);
nuDebConTextAttr(0, NU_DEB_CON_ATTR_BLINK);
nuDebConTextPos(0, 13,25);
nuDebConTextColor(0, 1);
nuDebConPuts(0, "Low Resolution");
nuDebConTextAttr(0, NU_DEB_CON_ATTR_NORMAL);
/* 画面表示オン */
nuGfxDisplayOn();
hireso = 0;
/* コールバック関数の登録 */
nuGfxFuncSet(graphic);
nuGfxDisplayOn();
}