dd_checksum.c 1.88 KB
/*---------------------------------------------------------------------*
        Copyright (C) 1998 Nintendo.
        
        $RCSfile: dd_checksum.c,v $
        $Revision: 1.1.1.1 $
        $Date: 2002/05/02 03:27:33 $
 *---------------------------------------------------------------------*/

/*  ReadWrite時のチェック関数です。 */
/*  アプリケーションに合わせ下の関数の内容を変更してください。 */

#define CHECK_VAGUE 256

s32
dd_checkSum(void)
{
  /*  指定領域の終端四バイトをチェックします。 */
  s32 i;
  u32 sum=0,*cs;

  u8  *buf = _rwbuf;

  for(i = 0; i < (s32)dd_stat.buffer_size - CHECK_VAGUE - 4; i += CHECK_VAGUE , buf += CHECK_VAGUE )
    {
        sum += *buf;
    }

  buf = _rwbuf;
  cs = (u32 *)((u32)buf + dd_stat.buffer_size - 4);
  
  return (*cs == sum) ?  LEO_ERROR_GOOD : LEO_ERROR_CHECKSUM;
}

s32
dd_makeSum(void)
{
  /*  指定領域の終端四バイトをチェックサムで上書きします。 */
  /*  従って転送データの実サイズは (指定サイズ - 4) バイト になります */

  s32 i;
  u8  *buf;
  u32 sum=0,*cs;

  buf = _rwbuf;

   for(i = 0; i < (s32)dd_stat.buffer_size - CHECK_VAGUE - 4 ; i += CHECK_VAGUE , buf += CHECK_VAGUE )
    {
        sum += *buf;
    }
 
  buf = _rwbuf;
  cs = (u32 *)((u32)buf + dd_stat.buffer_size - 4);
  *cs = sum;

  return -1;
}

s32
dd_restoreData( void )
{
  /*
   * 破損LBA復旧ルーチンです。  
   * 失われたデータ内容は基本的に元には戻せないことに注意してください。
   * ここでは単純に現在のバッファの内容で再ライトを行っています。
   */

  s32 lba_size,ret;
  TDDStatus _keep;

  bcopy( &dd_stat,&_keep,sizeof(TDDStatus));
  dd_freeze( ERRMES__NOW_IN_RESTORE ); /*  外部応答を待つ。 */

  LeoByteToLBA(  dd_stat.position , (u32)dd_stat.buffer_size , &lba_size);
  while( ( ret = dd_lbaWrite( dd_stat.position ,lba_size ) ) & DDSTAT_CONTINUE ) 
	dd_wait();
  bcopy( &_keep,&dd_stat,sizeof(TDDStatus));

  dd_closeDialog(0);
  
  return ret ? DDSTAT_DEAD : DDSTAT_GOOD;
}