formatdisk.c
3.17 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "ddwriteint.h"
/*
* ディスクに書き込んである disk type, load addr, ipl size を
* 覚えておく
* (ユーザが -1 とか指定したときのために)
*/
DDInfo __ddInfo;
void __ddFormatDisk(DDCmd *command)
{
u32 result;
__SystemInfo_s sys;
__DefectInfo_s def;
u32 formatType;
s32 doFormat = 0;
/*
* Write bad ecc
*/
result = __ddWriteErrorECC();
if(result)
{
__ddWriteError = (s32)result;
return;
}
/*
* format する必要があるかのチェック。
* format するのは、FORMAT フラグが立てられている場合と、システム情
* 報を読んだときにエラー23が出た場合である。
* format するときは doFormat の値を1にする。
*/
if (command->flags & DDWRITE_FLG_FORMAT)
doFormat = 1;
else
{
result = __ddReadSystemBlock(&sys, &def, &formatType);
if ( result == 0 )
doFormat = 0;
else if ( result == LEO_ERROR_UNRECOVERED_READ_ERROR )
doFormat = 1;
else
{
__ddWriteError = (s32)result;
return;
}
}
if (doFormat)
{
/*
* フォーマットする。
* 呼び出し側にそのことを通知する(formatHook)
*/
if ( command->formatHook != (void (*)(void))0 )
(*command->formatHook)();
result = __ddReadDefectBlock(&def, &formatType);
if (result)
{
__ddWriteError = (s32)result;
return;
}
}
else
{
/*
* フォーマットする必要はなく、かつ load addr,
* ipl size, disk type 全てが変更なしの指定であれば、
* システム領域を書く必要はない
*/
if ( (command->diskType == -1) &&
(command->iplSize == 0) && (command->startLBA != 0) &&
(command->loadAddr == 0) )
{
__ddInfo.diskType = (s32)(sys.diskType);
__ddInfo.loadAddr = sys.loadAddr;
__ddInfo.iplSize = sys.iplSize;
if ( command->infoHook != (void (*)(DDInfo *))0 )
(*command->infoHook)(&__ddInfo);
__ddWriteError = (s32)0;
return;
}
}
/*
* doFormat が立っていない場合は、systemData には現在のディスクから
* 読み出した情報が入っていることに注意
*/
/*
* Put the specified values to the buffer
*/
sys.country = 0;
if (command->diskType != -1)
sys.diskType = (u32)command->diskType;
if (command->iplSize == 0)
{
if (command->startLBA == 0)
{
/*
* getdata が指定されていない場合は writeSize, 指定されている
* 場合は totalSize がファイルサイズになる。
*/
if (command->getdata)
sys.iplSize = (u32)((command->totalSize + 19719) / 19720);
else
sys.iplSize = (u32)((command->writeSize + 19719) / 19720);
}
}
else
{
sys.iplSize = (u32)command->iplSize;
}
if (command->loadAddr != 0)
sys.loadAddr = command->loadAddr;
/*
* Write it to the system information block
*/
result = __ddWriteSystemBlock(&sys, &def, formatType);
if (result)
{
__ddWriteError = (s32)result;
return;
}
__ddInfo.diskType = (s32)(sys.diskType);
__ddInfo.loadAddr = sys.loadAddr;
__ddInfo.iplSize = sys.iplSize;
/*
* diskType, loadAddr, iplSize を呼び出し側に通知する
*/
if ( command->infoHook != (void (*)(DDInfo *))0 )
(*command->infoHook)(&__ddInfo);
__ddWriteError = (s32)0;
return;
} /* formatDisk() */