main.c 5.45 KB
/*======================================================================*/
/*		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();
}