system.c
2.79 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
/*
* NINTENDO64 SAMPLE PROGRAM
*
* FILE : system.c
*
* Copyright (C) 1998, NINTENDO Co,Ltd.
*/
#include <ultra64.h>
#include "system.h"
#include "mysched.h"
#include "n_libaudio.h"
#include "audio.h"
/*
* 各種宣言
*/
/* メイン関数の extern宣言 */
extern void Main(void *);
/* ブート用 */
u64 bootStack[STACKSIZE / sizeof(u64)];
/* 各スレッド用 */
static OSThread idleThread;
static u64 idleThreadStack[STACKSIZE / sizeof(u64)];
static OSThread mainThread;
static u64 mainThreadStack[STACKSIZE / sizeof(u64)];
/* メッセージ関連 */
OSMesgQueue piMessageQ;
OSMesgQueue siMessageQ;
OSMesgQueue dmaMessageQ;
OSMesgQueue mainFrameMQ;
static OSMesg piMessages[NUM_PI_MSGS];
static OSMesg siMessageBuf;
static OSMesg dmaMessageBuf;
static OSMesg mainFrameBuf;
OSPiHandle *handler;
/* コントローラ関係 */
OSContStatus contStatus[MAXCONTROLLERS];
OSContPad contPad[MAXCONTROLLERS];
u8 contExist;
/* スケジューラ */
MYSched sc;
/*
* メインスレッド
*/
void mainproc(void *arg)
{
/* メッセージキュー作成 */
osCreateMesgQueue(&dmaMessageQ, &dmaMessageBuf, 1);
osCreateMesgQueue(&siMessageQ, &siMessageBuf, 1);
osCreateMesgQueue(&mainFrameMQ, &mainFrameBuf, 1);
/* イベントとメッセージキューとの接続 */
osSetEventMesg(OS_EVENT_SI, &siMessageQ, NULL);
/* コントローラの初期化 */
osContInit(&siMessageQ, &contExist, contStatus);
/* オーディオマネージャ起動 */
initAudio();
/* メイン関数の呼び出し */
Main(arg);
}
/*
* アイドルスレッド
*/
static void idle(void *arg)
{
/* スケジューラ起動 */
#ifdef NORMAL_INTERLACE
myScCreateScheduler(&sc, OS_VI_NTSC_HPN1, 1);
#else
myScCreateScheduler(&sc, OS_VI_NTSC_HPF1, 1);
#endif
/* Pi マネージャ起動 */
osCreatePiManager((OSPri)OS_PRIORITY_PIMGR,
&piMessageQ, piMessages, NUM_PI_MSGS);
/* メインスレッド起動 */
osCreateThread(&mainThread, 3, mainproc, arg,
mainThreadStack + STACKSIZE / sizeof(u64), MAIN_PRIORITY);
osStartThread(&mainThread);
/* アイドルスレッド化 */
osSetThreadPri(0, 0);
while (1);
}
/*
* ブート
*/
void boot(void)
{
osInitialize();
handler = osCartRomInit();
osCreateThread(&idleThread, 1, idle, (void *)0,
idleThreadStack + STACKSIZE / sizeof(u64), MAIN_PRIORITY);
osStartThread(&idleThread);
}
/*
* ROM->RAM Copy
*/
void romCopy(const char *src, const char *dest, const int len)
{
OSIoMesg dmaIoMesgBuf;
OSMesg dummyMesg;
osInvalDCache((void *)dest, (s32) len);
dmaIoMesgBuf.hdr.pri = OS_MESG_PRI_NORMAL;
dmaIoMesgBuf.hdr.retQueue = &dmaMessageQ;
dmaIoMesgBuf.dramAddr = (void*)dest;
dmaIoMesgBuf.devAddr = (u32)src;
dmaIoMesgBuf.size = (u32)len;
osEPiStartDma(handler, &dmaIoMesgBuf, OS_READ);
(void) osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
}