dd_checksum.c
1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*---------------------------------------------------------------------*
Copyright (C) 1998 Nintendo.
$RCSfile: dd_checksum.c,v $
$Revision: 1.1.1.1 $
$Date: 2002/05/02 03:27:30 $
*---------------------------------------------------------------------*/
/* 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;
}