main.c 3.64 KB
/*
   main.c

   NuSYSTEM sample nu5

   Copyright (C) 1997-1999, NINTENDO Co,Ltd.			
*/

#include <nusys.h>
#include <nualsgi_n.h>
#include "main.h"
#include "segment.h"

/* ステージ番号 */
volatile int stage;

/* プロトタイプ宣言 */
void stage00(int);
void stage01(int);
void setAudioData(void);

/* 外部関数宣言 */
void initStage00(void);
void makeDL00(void);
void updateGame00(void);

void initStage01(void);
void makeDL01(void);
void updateGame01(void);

NUContData	contdata[1]; /* 1コントローラ読取データ */
/* コールバック関数のペンディングチェックで使用する値 0 or 1 */
int pendflag = 0;	
/* 秒間表示コマ数 */
int dspcount = 0;
/* コンソール表示用バッファ */
char conbuf[40];

/*------------------------
	メイン
--------------------------*/
void mainproc(void)
{
  /* グラフィックの初期化 */
  nuGfxInit();

  /* コントローラマネージャの初期化 */
  nuContInit();
	
  /* オーディオの初期化 */
  nuAuInit();
  /* ROM上のオーディオデータを登録 */
  setAudioData();

  nuAuSeqPlayerSetNo(0,0);
  nuAuSeqPlayerPlay(0);

  /* ステージ番号を0にセットする。*/
  stage = 0;

  while(1)
    {
      switch(stage)
	{
	  /* 
	     ステージ番号により、対応するコールバック関数を登録します。
	     コールバック関数側では、
	     他のコールバック関数に登録変更が必要になった時に、
	     stage に値をセットします。
	     */
	case 0:
	  /* コールバック関数が値をセットするのを待つために、
	     stage の値を-1にセットしておきます*/
	  stage = -1;
	  /* ステージ0の初期化 */
	  initStage00();
	  /* コールバック登録 */
	  nuGfxFuncSet((NUGfxFunc)stage00);
	  /* 表示開始 */
	  nuGfxDisplayOn();
	  break;
	case 1:
	  stage = -1;
	  initStage01();
	  nuGfxFuncSet((NUGfxFunc)stage01);
	  nuGfxDisplayOn();
	  break;
	default:
	  break;
	}
      
      /* コールバック関数が値を切り替えるの(場面切り替え)を待つ */
      while(stage == -1)
	;
      /* 表示を消す */
      nuGfxDisplayOff();
    }
}

/* オーディオデータのセット */
void setAudioData(void)
{
  /* シーケンスプレーヤーにバンクを登録 */
  nuAuSeqPlayerBankSet(_midibankSegmentRomStart,
		       _midibankSegmentRomEnd - _midibankSegmentRomStart,
		       _miditableSegmentRomStart);
  /* シーケンスプレーヤーにMIDIシーケンスデータを登録 */
  nuAuSeqPlayerSeqSet(_seqSegmentRomStart);
  /* サウンドプレーヤーにバンクを登録 */
  nuAuSndPlayerBankSet(_sfxbankSegmentRomStart,
		       _sfxbankSegmentRomEnd - _sfxbankSegmentRomStart,
		       _sfxtableSegmentRomStart);
}


/*-----------------------------------------------------------------------------
  コールバック関数

  Nusystem からコールバック関数の引数として渡される pendingGfx は 
  現在処理中および処理待ちの RCPタスクの合計数です。
-----------------------------------------------------------------------------*/

/* 過去1秒間で何コマ表示出来たかを返す関数 */
int calcFrame(void)
{
  static char frame[60];
  static int ptr = 0;
  static s64 prev = 0,now;
  int i,ctr;

  now = nuScRetraceCounter;
  if(prev >= now)
    now += 0x100000000LL;
  if(now - prev > 60)
    prev = now;
  while(prev < now-1)
    {
      frame[ptr++] = 0;
      ptr = ptr % 60;
      prev++;
    }
  frame[ptr++] = 1;
  ptr = ptr % 60;
  prev = now & 0xFFFFFFFF;
  ctr = 0;
  for(i = 0; i < 60; i++)
    ctr += frame[i];
  return(ctr);
}


/* ステージ0 */
void stage00(int pendingGfx)
{
  /* 処理中/処理待ちのRCPタスクの数により、表示処理行う */
  if(pendingGfx < 3+pendflag)
    {
      dspcount = calcFrame();
      makeDL00();
    }

  /* ゲーム進行処理 */
  updateGame00(); 
}

/* ステージ1 */
void stage01(int pendingGfx)
{
  /* 処理中/処理待ちのRCPタスクの数により、表示処理行う */
  if(pendingGfx < 4+pendflag)
    {
      dspcount = calcFrame();
      makeDL01();
    }

  /* ゲーム進行処理 */
  updateGame01();
}