main.c 5.2 KB
/*---------------------------------------------------------------------
  $Id: main.c,v 1.1.1.1 2002/05/02 03:27:21 blythe Exp $
  
  File : main.c

  Coded     by Yoshitaka Yasumoto.   Apr 11, 1997.
  Copyright by Nintendo, Co., Ltd.           1997.
  ---------------------------------------------------------------------*/
#include	<ultra64.h>
#include	"system.h"

/*---------------------------------------------------------------------------*
 * テクスチャデータ
 *---------------------------------------------------------------------------*/
#include	"RGBA16mario.h"

/*---------------------------------------------------------------------------*
 * gsDPSetOtherMode 用 mode 定義
 *---------------------------------------------------------------------------*/
// 共通項目の定義
#define	MODE_A_BASE	(G_PM_1PRIMITIVE|G_TP_NONE|G_TD_CLAMP|G_TL_TILE|\
			 G_TT_NONE|G_TF_BILERP|G_TC_FILT|G_CK_NONE|\
			 G_CD_DISABLE|G_AD_PATTERN)
#define	MODE_B_BASE	(G_ZS_PIXEL|G_AC_THRESHOLD)

// FILL モードの設定
#define	MODE_A_FILL	(MODE_A_BASE|G_CYC_FILL)
#define	MODE_B_FILL	(MODE_B_BASE|G_RM_NOOP|G_RM_NOOP2)

// COPY モードの設定
#define	MODE_A_COPY	(MODE_A_BASE|G_CYC_COPY)
#define	MODE_B_COPY	(MODE_B_BASE|G_RM_NOOP|G_RM_NOOP2)

// 1 CYCLE モードの設定
#define	MODE_A_1CYCLE	(MODE_A_BASE|G_CYC_1CYCLE)
#define	MODE_B_1CYCLE	(MODE_B_BASE|G_RM_OPA_SURF|G_RM_OPA_SURF2)

/*---------------------------------------------------------------------------*
 * RDP 用コマンドリスト
 *---------------------------------------------------------------------------*/
Gfx rdpcmd[] = {
  /* [0-2] 描画フレーム設定 */
  gsDPPipeSync(),
  gsDPSetColorImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, 0),	/* Overwrite */
  gsDPSetScissor(G_SC_NON_INTERLACE, 0, 0, SCREEN_WD, SCREEN_HT),
  
  /* [3-4] FILL モードの設定 */
  gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
  gsDPSetOtherMode(MODE_A_FILL, MODE_B_FILL),
  
  /* [5-7] FILL コマンドの実行 */
  gsDPSetFillColor(GPACK_RGBA5551(64,64,255,1) << 16 | 
		   GPACK_RGBA5551(64,64,255,1)),
  gsDPFillRectangle(0, 0, SCREEN_WD-1, SCREEN_HT-1),
  gsDPPipeSync(),
  
  /* [8-10] COPY モードの設定 */
  gsDPSetOtherMode(MODE_A_COPY, MODE_B_COPY),
  gsDPSetBlendColor(0, 0, 0, 0x01),
  gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),

  /* [11-17] テクスチャのロード
     (注意) 1 つで 7 コマンド分の領域が必要
     gsDPSetTextureImage,gsDPSetTile,gsDPLoadSync,
     gsDPLoadBlock,gsDPPipeSync,gsDPSetTile,gsDPSetTileSize の 7 つ */
  gsDPLoadTextureBlock(RGBA16mario, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
		       G_TX_WRAP | G_TX_MIRROR, G_TX_WRAP | G_TX_MIRROR,
		       5, 5, G_TX_NOLOD, G_TX_NOLOD),

  /* [18-19] テクスチャレクタングルの表示
     (注意) 1 つで 2 コマンド分の領域が必要 */
  gsDPTextureRectangle(100<<2, 100<<2,		// xl, yl
		       131<<2, 131<<2,		// xh, yh
		       G_TX_RENDERTILE,		// tile
		       0, 0,			// s, t
		       4<<10, 1<<10),		// dsdx, dtdy

  /* [20] 終了通知 */
  gsDPFullSync(),
};

/*---------------------------------------------------------------------------*
 * M A I N 
 *---------------------------------------------------------------------------*/
void	Main(void *arg)
{
  static u32	framePtr[] = {CFB_ADDRESS,CFB_ADDRESS+SCREEN_WD*SCREEN_HT*2};
  u8		frame = 0;
  s16		x, y, xl, yl, xh, yh, w, h, s, t, px, py;
  s16		scisXL, scisYL, scisXH, scisYH;
  u32		rdpcmd_size;
  
  /* シザリングボックスの設定 */
#if 1
  scisXL = scisYL = 0<<2;
  scisXH = SCREEN_WD<<2;
  scisYH = SCREEN_HT<<2;
#else
  scisXL = scisYL = 50<<2;
  scisXH = (SCREEN_WD-50)<<2;
  scisYH = (SCREEN_HT-50)<<2;
#endif
  
  /* パラメータ初期値設定 */
  x = 160<<2;
  y = 120<<2;
  w = h = 32<<2;
  
  while(1){

    /*------ リトレース待ち ------*/
    osRecvMesg(&retraceMessageQ, NULL, OS_MESG_BLOCK);

    /*------ フレームバッファ設定 ------*/
    gDPSetColorImage(rdpcmd+1, G_IM_FMT_RGBA,
		     G_IM_SIZ_16b, SCREEN_WD, framePtr[frame]);
    
    /*------ テクスチャレクタングルの設定 ------*/
    /* 移動処理 */
    x += (1<<2);
    if (x > (SCREEN_WD<<2)) x = -(32<<2);
    y += (1<<2);
    if (y > (SCREEN_HT<<2)) y = -(32<<2);

    /* シザリング */
    xh = (xl = x) + w;
    yh = (yl = y) + h;
    s  = t = 0;
    if (0 < (px = scisXL - xl)){
      xl += px;
      s  += (px << 3);		// s は (s10.5) フォーマット
    }
    if (0 < (py = scisYL - yl)){
      yl += py;
      t  += (py << 3);		// t は (s10.5) フォーマット
    }
    if (0 > (px = scisXH - xh)){
      xh += px;
    }
    if (0 > (py = scisYH - yh)){
      yh += py;
    }
    
    /* 表示領域があるなら表示 */
    if (xl < xh && yl < yh){
      /* コピーモードの時は xh, yh に 1 小さい値を設定する */
      gDPTextureRectangle(rdpcmd+18,
			  xl,   yl,		// xl, yl
			  xh-1, yh-1,		// xh, yh
			  G_TX_RENDERTILE,	// tile
			  s, t,			// s, t
			  4<<10, 1<<10);	// dsdx, dtdy
      rdpcmd_size = sizeof(rdpcmd);
    } else {
      gDPFullSync(rdpcmd+18);
      rdpcmd_size = sizeof(Gfx)*19;
    }
    
    /*------ 変更のライトバック ------*/
    osWritebackDCache(rdpcmd, sizeof(rdpcmd));
    
    /*------ RDP 描画開始 ------*/
    osDpSetNextBuffer(rdpcmd, rdpcmd_size);
    
    /*------ 終了待ち ------*/
    osRecvMesg(&rdpMessageQ, NULL, OS_MESG_BLOCK);
    
    /*------ Frame 切り替え ------*/
    osViSwapBuffer((void *)framePtr[frame]);
    frame ^= 1;
  }
}

/*======== End of main.c ========*/