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)
412int 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}
0 commit comments