system.c 2.79 KB
/*
 *  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);
}