Skip to content

Commit 5d4f5d3

Browse files
committed
memcard progress
1 parent f4ed724 commit 5d4f5d3

File tree

2 files changed

+136
-98
lines changed

2 files changed

+136
-98
lines changed
Lines changed: 133 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
#include <common.h>
22

3+
// Not part of original game,
4+
// just for cleaning up repetition
5+
enum MC_EXTRA
6+
{
7+
MC_EXTRA_NULL = 0,
8+
MC_EXTRA_CLOSE = 1,
9+
};
10+
311
// TODO: Name function, add symbol (MEMCARD_GetStageResult)
412
int FUN_8003ddac(void)
513
{
614
int readResult;
715
int event;
816
int iVar4;
917
int *ptrData;
18+
19+
int extra = 0;
1020

1121
switch (sdata->memcard_stage)
1222
{
1323

1424
// after checking info
1525
case MC_STAGE_GETINFO:
16-
26+
{
1727
event = MEMCARD_GetNextSwEvent();
1828

1929
if (event == MC_RETURN_PENDING)
@@ -26,36 +36,43 @@ int FUN_8003ddac(void)
2636
if ((sdata->memcardStatusFlags & 1) != 0)
2737
{
2838
// discard any previous events
29-
// submit a load to make sure format worked,
30-
// check the result of a NEW CARD
39+
// submit a load to test the card
3140
MEMCARD_SkipEvents();
3241
while (_card_load(sdata->memcardSlot) != 1);
42+
3343
sdata->memcard_stage = MC_STAGE_NEWCARD;
34-
return 7;
44+
return MC_RETURN_PENDING;
3545
}
3646
if ((sdata->memcardStatusFlags & 2) == 0)
3747
{
3848
sdata->memoryCard_SizeRemaining = 0;
39-
event = 5;
49+
return MC_RETURN_UNFORMATTED;
4050
}
51+
52+
sdata->memcard_stage = MC_STAGE_IDLE;
53+
return MC_RETURN_IOE;
4154
}
4255

4356
else if (event == MC_RETURN_NEWCARD)
4457
{
58+
// discard any previous events
59+
// submit a load to test the card
4560
MEMCARD_SkipEvents();
4661
while (_card_clear(sdata->memcardSlot) != 1);
4762

4863
event = MEMCARD_WaitForHwEvent();
4964
if (event == 0)
5065
{
5166
// discard any previous events
52-
// submit a load to make sure format worked,
53-
// check the result of a NEW CARD
67+
// submit a load to test the card
5468
MEMCARD_SkipEvents();
5569
while (_card_load(sdata->memcardSlot) != 1);
70+
5671
sdata->memcard_stage = MC_STAGE_NEWCARD;
57-
return 7;
72+
return MC_RETURN_PENDING;
5873
}
74+
75+
return MC_RETURN_NEWCARD;
5976
}
6077

6178
else
@@ -64,10 +81,7 @@ int FUN_8003ddac(void)
6481
sdata->memoryCard_SizeRemaining = 0;
6582
return event;
6683
}
67-
68-
sdata->memcard_stage = MC_STAGE_IDLE;
69-
break;
70-
84+
}
7185
// after checking new card
7286
case MC_STAGE_NEWCARD:
7387

@@ -82,19 +96,20 @@ int FUN_8003ddac(void)
8296
// set stage to idle, record free bytes
8397
if (event == MC_RETURN_IOE)
8498
{
85-
sdata->memcardStatusFlags = sdata->memcardStatusFlags & 0xfffffffe | 2;
99+
sdata->memcardStatusFlags &= ~(1);
100+
sdata->memcardStatusFlags |= 2;
86101
MEMCARD_GetFreeBytes(sdata->memcardSlot);
87-
return 3;
102+
return MC_RETURN_NEWCARD;
88103
}
89104

90105
// if new card was just inserted
91106
if (event == MC_RETURN_NEWCARD)
92107
{
93-
sdata->memcardStatusFlags = sdata->memcardStatusFlags & 0xfffffffc;
94-
return 5;
108+
sdata->memcardStatusFlags &= ~(1|2);
109+
return MC_RETURN_UNFORMATTED;
95110
}
96111

97-
break;
112+
return event;
98113

99114
// after the attempt to read icon,
100115
// MC_STAGE_LOAD_PART1_ICON
@@ -134,16 +149,13 @@ int FUN_8003ddac(void)
134149
// if failed, restart attempting icon
135150
if (sdata->memcard_remainingAttempts > 0)
136151
{
137-
// replicate MEMCARD_ReadFile(0, 0x80) from MEMCARD_LOAD
138-
iVar4 = 0;
139-
event = 0x80;
140-
141-
sdata->memcard_remainingAttempts = sdata->memcard_remainingAttempts - 1;
142-
143-
goto READCARD_JUMP;
152+
sdata->memcard_remainingAttempts--;
153+
extra = MC_EXTRA_READ_ICON;
154+
break;
144155
}
145156

146-
goto CLOSEFILE_JUMP;
157+
extra = MC_EXTRA_CLOSE;
158+
break;
147159

148160
case 4:
149161
case 6:
@@ -157,27 +169,29 @@ int FUN_8003ddac(void)
157169
{
158170
sdata->crc16_checkpoint_byteIndex = 0;
159171
sdata->crc16_checkpoint_status = 0;
160-
sdata->memcard_stage = sdata->memcard_stage + 1;
172+
sdata->memcard_stage++;
173+
161174
if ((sdata->memcardStatusFlags & 8) == 0)
162175
{
163-
sdata->crc16_checkpoint_byteIndex = 0;
164-
sdata->crc16_checkpoint_status = 0;
165176
return 7;
166177
}
167-
goto CASE7_JUMP;
168-
}
169-
170-
if (sdata->memcard_remainingAttempts > 0)
171-
{
172-
iVar4 = sdata->memcardIconSize + (sdata->memcard_stage - 4) * sdata->memcardFileSize;
173-
event = sdata->memcardFileSize;
174-
175-
sdata->memcard_remainingAttempts = sdata->memcard_remainingAttempts + -1;
176-
177-
goto READCARD_JUMP;
178+
179+
// === Do NOT break, goto 5/7 ===
178180
}
179-
180-
goto CLOSEFILE_JUMP;
181+
else
182+
{
183+
if (sdata->memcard_remainingAttempts > 0)
184+
{
185+
sdata->memcard_remainingAttempts--;
186+
extra = MC_EXTRA_READ_FILE;
187+
break;
188+
}
189+
190+
extra = MC_EXTRA_CLOSE;
191+
break;
192+
}
193+
194+
// === Do NOT break, goto 5/7 ===
181195

182196
case 5:
183197
case 7:
@@ -190,30 +204,21 @@ int FUN_8003ddac(void)
190204

191205
if (event == MC_RETURN_IOE)
192206
{
193-
CLOSEFILE_JUMP:
194-
MEMCARD_CloseFile();
207+
extra = MC_EXTRA_CLOSE;
195208
break;
196209
}
197210

198211
// at this point, assume checksum succeeded (return 1)
199212

200213
if (((sdata->memcardStatusFlags & 4) == 0) && (sdata->memcard_stage < 7))
201214
{
202-
// Make "switch" statement go to "next" stage
203-
sdata->memcard_stage = sdata->memcard_stage + 1;
204-
205-
iVar4 = sdata->memcardIconSize + (sdata->memcard_stage - 4) * sdata->memcardFileSize;
206-
event = sdata->memcardFileSize;
207-
208-
READCARD_JUMP:
209-
return MEMCARD_ReadFile(iVar4, event);
215+
sdata->memcard_stage++;
216+
extra = MC_EXTRA_READ_FILE;
217+
break;
210218
}
211219

212-
break;
220+
return event;
213221

214-
default:
215-
event = 1;
216-
break;
217222
case 9:
218223
case 10:
219224
case 11:
@@ -225,62 +230,92 @@ int FUN_8003ddac(void)
225230

226231
if (event == MC_RETURN_IOE)
227232
{
228-
if ((sdata->memcard_stage != 9) && ((10 < sdata->memcard_stage || ((sdata->memcardStatusFlags & 4) != 0))))
233+
if (
234+
// 1-file write
235+
(sdata->memcard_stage == 9) ||
236+
(
237+
// 2-file write
238+
((sdata->memcard_stage <= 10)) &&
239+
((sdata->memcardStatusFlags & 4) != 0)
240+
)
241+
)
242+
{
243+
sdata->memcard_stage++;
244+
extra = MC_EXTRA_WRITE_FILE;
245+
break;
246+
}
247+
248+
else
229249
{
230250
MEMCARD_CloseFile();
231-
232251
MEMCARD_GetFreeBytes(sdata->memcardSlot);
233-
234-
return 0;
252+
return MC_RETURN_IOE;
235253
}
236-
237-
sdata->memcard_stage = sdata->memcard_stage + 1;
238-
239-
LAB_8003e1e4:
240-
event = sdata->memcard_stage - 10;
241-
iVar4 = sdata->memcardIconSize + event * sdata->memcardFileSize;
242-
243-
// pointer to memory card bytes
244-
ptrData = sdata->memcard_ptrStart;
245-
246-
// size, 0x1680 bytes
247-
event = sdata->memcardFileSize;
248254
}
249255

250256
else
251257
{
252-
// reduce remaining number of attempts
253-
iVar4 = sdata->memcard_remainingAttempts - 1;
254-
255-
// if out of attempts, go to close file
256-
if (sdata->memcard_remainingAttempts < 1)
257-
goto CLOSEFILE_JUMP;
258+
if (sdata->memcard_remainingAttempts < 1)
259+
{
260+
extra = MC_EXTRA_CLOSE;
261+
break;
262+
}
258263

259-
sdata->memcard_remainingAttempts = iVar4;
260-
if (sdata->memcard_stage != 9)
261-
goto LAB_8003e1e4;
264+
sdata->memcard_remainingAttempts--;
265+
266+
if (sdata->memcard_stage == 9)
267+
{
268+
extra = MC_EXTRA_WRITE_ICON;
269+
break;
270+
}
262271

263-
iVar4 = 0;
264-
265-
// pointer to memory card icon
266-
// psyq hand
267-
ptrData = Data->memcardIcon_PsyqHand;
268-
269-
// 256 bytes, 0x100
270-
event = sdata->memcardIconSize;
271-
}
272-
273-
event = MEMCARD_WriteFile(iVar4, ptrData, event);
274-
break;
272+
extra = MC_EXTRA_WRITE_FILE;
273+
break;
274+
}
275+
275276

276-
case MC_STAGE_ERASE_FAIL: // 13
277+
case MC_STAGE_ERASE_FAIL:
277278
sdata->memcard_stage = MC_STAGE_IDLE;
278-
event = MC_RETURN_TIMEOUT; // 1
279-
break;
279+
return MC_RETURN_TIMEOUT;
280280

281-
case MC_STAGE_ERASE_PASS: // 14
281+
case MC_STAGE_ERASE_PASS:
282282
sdata->memcard_stage = MC_STAGE_IDLE;
283-
event = MC_RETURN_IOE; // 0
283+
return MC_RETURN_IOE;
284+
285+
default:
286+
return MC_RETURN_TIMEOUT;
284287
}
285-
return event;
288+
289+
switch(extra)
290+
{
291+
case MC_EXTRA_NULL:
292+
while(1) {
293+
printf("Did not return?\n");
294+
}
295+
296+
case MC_EXTRA_CLOSE:
297+
MEMCARD_CloseFile();
298+
return event;
299+
300+
case MC_EXTRA_WRITE_ICON:
301+
return MEMCARD_WriteFile(0,
302+
sdata->memcardIcon_PsyqHand,
303+
sdata->memcardIconSize);
304+
305+
case MC_EXTRA_WRITE_FILE:
306+
return MEMCARD_WriteFile(
307+
sdata->memcardIconSize + (sdata->memcard_stage - 10) * sdata->memcardFileSize,
308+
sdata->memcard_ptrStart,
309+
sdata->memcardFileSize);
310+
311+
case MC_EXTRA_READ_ICON:
312+
return MEMCARD_ReadFile(0, 0x80);
313+
314+
case MC_EXTRA_READ_FILE:
315+
return MEMCARD_ReadFile(
316+
sdata->memcardIconSize + (sdata->memcard_stage - 4) * sdata->memcardFileSize,
317+
sdata->memcardFileSize);
318+
};
319+
320+
286321
}

ghidra/MEMCARD.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,9 @@ int FUN_8003ddac(void)
667667
return 7;
668668
}
669669

670+
// === MC_RETURN_NEWCARD (3) ===
671+
672+
// MEMCARD_SkipEvents
670673
FUN_8003db54();
671674

672675
do {

0 commit comments

Comments
 (0)