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

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

extern	Gfx	clearCfb[];
extern	Gfx	tmemOutput[];

/*---------------------------------------------------------------------------*
 * タスクデータ定義
 *---------------------------------------------------------------------------*/
OSTask	tlist = {
  M_GFXTASK,					/* task type                */
  OS_TASK_DP_WAIT|OS_TASK_LOADABLE,		/* task flags               */
  (u64 *)&rspbootTextStart,			/* boot ucode ptr           */
  SP_BOOT_UCODE_SIZE,				/* boot ucode size          */
  (u64 *)&gspF3DEX_fifoTextStart,		/* ucode ptr                */
  SP_UCODE_SIZE,				/* ucode size               */
  (u64 *)&gspF3DEX_fifoDataStart,		/* ucode data ptr           */
  SP_UCODE_DATA_SIZE,				/* ucode data size          */
  NULL, 					/* dram stack      (不使用) */
  0,						/* dram stack size (不使用) */
  (u64 *)system_rdpfifo,			/* fifo buffer top          */
  (u64 *)system_rdpfifo+RDPFIFO_SIZE,		/* fifo buffer bottom       */
  NULL,						/* data ptr      (後で設定) */
  NULL, 					/* data size     (設定不要) */
  (u64 *)system_rspyield,			/* yield data ptr           */
  OS_YIELD_DATA_SIZE,				/* yield data size          */
};

Gfx     glist[GLIST_LEN];
u16	u16txtr[64*32];

Gfx	loadTexture[] = {  
  gsDPPipeSync(),

#if 1
  /*------ 調査対象の Texture Load 命令 ------*/
  gsDPLoadTextureBlock(u16txtr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0,
		       0, 0, 0, 0, G_TX_NOLOD, G_TX_NOLOD),    
#endif

  /*------ 確認のために出力してみる(無くても問題ない) ------*/
  gsDPSetCycleType(G_CYC_1CYCLE),
  gsDPSetAlphaCompare(G_AC_THRESHOLD),
  gsDPSetBlendColor(0, 0, 0, 0),
  gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
  gsSPTextureRectangle(100*4, 100*4, 164*4, 132*4,
		       G_TX_RENDERTILE, 0, 0, 1024,1024),

  gsSPEndDisplayList(),
};


/*---------------------------------------------------------------------------*
 * M A I N 
 *---------------------------------------------------------------------------*/
void	Main(void *arg)
{
  u8	 draw_frame = 0;
  Gfx	*gp;
  u32	 i;

  /*------ テクスチャ作成 ------*/
  for (i = 0; i < 64*32; i ++){
    u16txtr[i] = i;
  }
  osWritebackDCacheAll();
  
  while(1){
    /*------ リトレース待ち ------*/
    osRecvMesg(&retraceMessageQ, NULL, OS_MESG_BLOCK);

    /*------ RSP 初期設定 ------*/
    gp = glist;

    /*------ GBI 設定 ------*/
    gSPSegment(gp ++, CFB_SEGMENT, system_cfb[draw_frame]);
    gSPDisplayList(gp ++, clearCfb);
    gSPDisplayList(gp ++, loadTexture);
    gSPDisplayList(gp ++, tmemOutput);
    
    /*------ GBI 終了処理 ------*/
    gDPFullSync(gp ++);
    gSPEndDisplayList(gp ++);		// 終端

    /*------ Gfx タスク実行 ------*/
    tlist.t.data_ptr = (u64 *)glist;
    osWritebackDCache(glist, ((u32)gp)-((u32)glist));
    osSpTaskStart(&tlist);

    /*------ 終了待ち ------*/
    osRecvMesg(&rspMessageQ, NULL, OS_MESG_BLOCK);
    osRecvMesg(&rdpMessageQ, NULL, OS_MESG_BLOCK);    

    /*------ Frame 切り替え ------*/
    osViSwapBuffer(system_cfb[draw_frame]);
    draw_frame ^= 1;

    /*------ TMEM の内容を画面に出力する ------*/
    for (i = 0; i < 4096; i += 4){
      if ((i % 32) == 0){
	osSyncPrintf("%3d [%03x]: ", i/8, i/8);
      }
      if (i & 64){
	osSyncPrintf("%08x", IO_READ(TMEMBUF_ADDRESS + (i^4)));
      } else {
	osSyncPrintf("%08x", IO_READ(TMEMBUF_ADDRESS + i));
      }
      if ((i % 8) == 4){
	osSyncPrintf(" ");
      }
      if ((i % 32) == 28){
	osSyncPrintf("\n");
      }
    }
    
    /*------ 処理停止 ------*/
    while(1);
  }
}

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