main.c 5.15 KB
/*
   main.c

   NuSYSTEM sample nuoverlay

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

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

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

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

/* 外部関数宣言 */
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];

/* for stage00 and stage01 */
float triPos_x; /* 表示位置X */
float triPos_y; /* 表示位置Y */
float theta;  /* 正方形の回転角度 */

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

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

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

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

  while(1)
    {
      /* 指定している stage を読みこむ */
      overlay(stage);

      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();
}

/*
 * overlay
 *   指定した stage をオーバーレイする
 *   (注) 上書きするコードが実行中で無いこと。
 *        このサンプルではオーバーレイする内容にコールバック関数を
 *        含んでいるのでステージ切り替え前にコールバック関数内で
 *        nuGfxFuncRemove()を呼んでおくこと。
 *
 */
void overlay(int stage)
{
    NUPiOverlaySegment	segment;

    /* 指定されてステージを読みこむ */
    switch(stage)
    {
    case 0:
	segment.romStart	= _stage00SegmentRomStart;
	segment.romEnd		= _stage00SegmentRomEnd;
	segment.ramStart	= _stage00SegmentStart;
	segment.textStart	= _stage00SegmentTextStart;
	segment.textEnd		= _stage00SegmentTextEnd;
	segment.dataStart	= _stage00SegmentDataStart;
	segment.dataEnd		= _stage00SegmentDataEnd;
	segment.bssStart	= _stage00SegmentBssStart;
	segment.bssEnd		= _stage00SegmentBssEnd;
	break;
    case 1:
	segment.romStart	= _stage01SegmentRomStart;
	segment.romEnd		= _stage01SegmentRomEnd;
	segment.ramStart	= _stage01SegmentStart;
	segment.textStart	= _stage01SegmentTextStart;
	segment.textEnd		= _stage01SegmentTextEnd;
	segment.dataStart	= _stage01SegmentDataStart;
	segment.dataEnd		= _stage01SegmentDataEnd;
	segment.bssStart	= _stage01SegmentBssStart;
	segment.bssEnd		= _stage01SegmentBssEnd;
	break;
    default:
	return;
    }

    nuPiReadRomOverlay(&segment);
}