|
|
1.1 root 1: /*
2: Hatari
3:
4: Memory Snapshot
5:
6: This handles the saving/restoring of the emulator's state so any game/application can be saved
7: and restored at any time. This is quite complicated as we need to store all STRam, all chip states,
8: all emulation variables and then things get really complicated as we need to restore file handles
9: and such like.
10: To help keep things simple each file has one function which is used to save/restore all variables
11: that are local to it. We use one function to reduce redundancy and the function 'MemorySnapShot_Store'
12: decides if it should save or restore the data.
13: */
14:
15: #include "main.h"
16: /*#include "compress.h"*/
17: #include "debug.h"
18: #include "dialog.h"
19: #include "fdc.h"
20: #include "file.h"
21: #include "floppy.h"
22: #include "gemdos.h"
23: #include "ikbd.h"
24: #include "int.h"
25: #include "m68000.h"
26: #include "memorySnapShot.h"
27: #include "mfp.h"
28: #include "psg.h"
29: #include "reset.h"
30: #include "sound.h"
31: #include "tos.h"
32: #include "video.h"
33: #include "view.h"
34:
35: //#define COMPRESS_MEMORYSNAPSHOT // Compress snapshots to reduce disc space used
36:
37: //HFILE CaptureFile;
38: //OFSTRUCT CaptureFileInfo;
39: BOOL bCaptureSave, bCaptureError;
40: BOOL bSaveMemoryState=FALSE, bRestoreMemoryState=FALSE;
41: char szSnapShotFileName[MAX_FILENAME_LENGTH];
42:
43: //-----------------------------------------------------------------------
44: /*
45: Check if need to save/restore emulation memory state, via flag 'bSaveMemoryState', and 'bRestoreMemoryState'
46: */
47: void MemorySnapShot_CheckSaveRestore(void)
48: {
49: // Is chose to save memory state, one of these two flags will be set
50: /*FIXME*/
51: /*
52: if (bSaveMemoryState || bRestoreMemoryState) {
53: Main_PauseEmulation(); // Hold things...
54: View_ToggleWindowsMouse(MOUSE_WINDOWS); // Put mouse into ST mode
55: View_LimitCursorToScreen(); // Free mouse from Window constraints
56:
57: // Do we need user to enter a filename?
58: if (strlen(ConfigureParams.Memory.szMemoryCaptureFileName)<=0) {
59: if (!File_OpenSelectDlg(hWnd,ConfigureParams.Memory.szMemoryCaptureFileName,FILEFILTER_MEMORYFILE,FALSE,bSaveMemoryState))
60: bSaveMemoryState = bRestoreMemoryState = FALSE;
61: }
62:
63: // Do save/load
64: if (bSaveMemoryState)
65: MemorySnapShot_Capture(ConfigureParams.Memory.szMemoryCaptureFileName);
66: else if (bRestoreMemoryState)
67: MemorySnapShot_Restore(ConfigureParams.Memory.szMemoryCaptureFileName);
68: bSaveMemoryState = bRestoreMemoryState = FALSE;
69:
70: View_LimitCursorToClient(); // And limit mouse in Window
71: View_ToggleWindowsMouse(MOUSE_ST); // Put mouse into ST mode
72: Main_UnPauseEmulation(); // And off we go...
73: }
74: */
75: }
76:
77: //-----------------------------------------------------------------------
78: /*
79: Get filename to save/restore to, so can compress
80: */
81: char *MemorySnapShot_CompressBegin(char *pszFileName)
82: {
83: #ifdef COMPRESS_MEMORYSNAPSHOT
84: // Create temporary filename
85: sprintf(szSnapShotFileName,"%s/%s",szWorkingDir,"snapshot.mem");
86: return(szSnapShotFileName);
87: #else //COMPRESS_MEMORYSNAPSHOT
88: return(pszFileName);
89: #endif //COMPRESS_MEMORYSNAPSHOT
90: }
91:
92: //-----------------------------------------------------------------------
93: /*
94: Compress memory snap shot
95: */
96: void MemorySnapShot_CompressEnd(char *pszFileName)
97: {
98: #ifdef COMPRESS_MEMORYSNAPSHOT
99: // Compress file from temporary to final destination
100: Compress_Pack_File(szSnapShotFileName,pszFileName);
101: // And delete temporary
102: File_Delete(szSnapShotFileName);
103: #endif //COMPRESS_MEMORYSNAPSHOT
104: }
105:
106: //-----------------------------------------------------------------------
107: /*
108: Uncompress memory snap shot to temporary file
109: */
110: char *MemorySnapShot_UnCompressBegin(char *pszFileName)
111: {
112: #ifdef COMPRESS_MEMORYSNAPSHOT
113: // Uncompress to temporary file
114: sprintf(szSnapShotFileName,"%s/%s",szWorkingDir,"snapshot.mem");
115: Compress_UnPack_File(pszFileName,szSnapShotFileName);
116: return(szSnapShotFileName);
117: #else //COMPRESS_MEMORYSNAPSHOT
118: return(pszFileName);
119: #endif //COMPRESS_MEMORYSNAPSHOT
120: }
121:
122: //-----------------------------------------------------------------------
123: /*
124: Clean up after uncompression
125: */
126: void MemorySnapShot_UnCompressEnd(void)
127: {
128: // And delete temporary
129: File_Delete(szSnapShotFileName);
130: }
131:
132: //-----------------------------------------------------------------------
133: /*
134: Open/Create snapshot file, and set flag so 'MemorySnapShot_Store' knows how to handle data
135: */
136: BOOL MemorySnapShot_OpenFile(char *pszFileName,BOOL bSave)
137: {
138: char szString[256];
139: char VersionString[VERSION_STRING_SIZE];
140: /* FIXME */
141: /*
142: // Set error
143: bCaptureError = FALSE;
144:
145: // Open file, set flag so 'MemorySnapShot_Store' can load to/save from file
146: if (bSave) {
147: // Save
148: CaptureFile = OpenFile(pszFileName,&CaptureFileInfo,OF_CREATE | OF_WRITE);
149: if (CaptureFile==HFILE_ERROR) {
150: bCaptureError = TRUE;
151: return(FALSE);
152: }
153: bCaptureSave = TRUE;
154: // Store version string
155: MemorySnapShot_Store(VERSION_STRING,VERSION_STRING_SIZE);
156: }
157: else {
158: // Restore
159: CaptureFile = OpenFile(pszFileName,&CaptureFileInfo,OF_READ);
160: if (CaptureFile==HFILE_ERROR) {
161: bCaptureError = TRUE;
162: return(FALSE);
163: }
164: bCaptureSave = FALSE;
165: // Restore version string
166: MemorySnapShot_Store(VersionString,VERSION_STRING_SIZE);
167: // Does match current version?
168: if (stricmp(VersionString,VERSION_STRING)) {
169: // No, inform user and error
170: sprintf(szString,"Unable to Restore Memory State.\nFile is only compatible with Hatari v%s",VersionString);
171: Main_Message(szString,PROG_NAME,MB_OK | MB_ICONSTOP);
172: bCaptureError = TRUE;
173: return(FALSE);
174: }
175: }
176:
177: // All OK
178: return(TRUE);
179: */
180: return FALSE;
181: }
182:
183: //-----------------------------------------------------------------------
184: /*
185: Close snapshot file
186: */
187: void MemorySnapShot_CloseFile(void)
188: {
189: //FIXME _lclose(CaptureFile);
190: }
191:
192: //-----------------------------------------------------------------------
193: /*
194: Save/Restore data to/from file
195: */
196: void MemorySnapShot_Store(void *pData, int Size)
197: {
198: long nBytes;
199: /*FIXME*/
200: /*
201: // Check no file errors
202: if (CaptureFile!=HFILE_ERROR) {
203: // Saving or Restoring?
204: if (bCaptureSave)
205: nBytes = _hwrite(CaptureFile,(char *)pData,Size);
206: else
207: nBytes = _hread(CaptureFile,(char *)pData,Size);
208:
209: // Did save OK?
210: if (nBytes==HFILE_ERROR)
211: bCaptureError = TRUE;
212: else if (nBytes!=Size)
213: bCaptureError = TRUE;
214: }
215: */
216: }
217:
218: //-----------------------------------------------------------------------
219: /*
220: Save 'snapshot' of memory/chips/emulation variables
221: */
222: void MemorySnapShot_Capture(char *pszFileName)
223: {
224: char *pszSnapShotFileName;
225: /*FIXME*/
226: /*
227: // Wait...
228: SetCursor(Cursors[CURSOR_HOURGLASS]);
229:
230: // If to be compressed, return temporary filename
231: pszSnapShotFileName = MemorySnapShot_CompressBegin(pszFileName);
232:
233: // Set to 'saving'
234: if (MemorySnapShot_OpenFile(pszSnapShotFileName,TRUE)) {
235: // Capture each files details
236: Main_MemorySnapShot_Capture(TRUE);
237: FDC_MemorySnapShot_Capture(TRUE);
238: Floppy_MemorySnapShot_Capture(TRUE);
239: GemDOS_MemorySnapShot_Capture(TRUE);
240: IKBD_MemorySnapShot_Capture(TRUE);
241: Int_MemorySnapShot_Capture(TRUE);
242: M68000_MemorySnapShot_Capture(TRUE);
243: M68000_Decode_MemorySnapShot_Capture(TRUE);
244: MFP_MemorySnapShot_Capture(TRUE);
245: PSG_MemorySnapShot_Capture(TRUE);
246: Sound_MemorySnapShot_Capture(TRUE);
247: TOS_MemorySnapShot_Capture(TRUE);
248: Video_MemorySnapShot_Capture(TRUE);
249:
250: // And close
251: MemorySnapShot_CloseFile();
252: }
253:
254: // And compress, if need to
255: MemorySnapShot_CompressEnd(pszFileName);
256:
257: // We're back
258: SetCursor(Cursors[CURSOR_ARROW]);
259:
260: // Did error
261: if (bCaptureError)
262: Main_Message("Unable to Save Memory State to file.",PROG_NAME,MB_OK | MB_ICONSTOP);
263: else
264: Main_Message("Memory State file saved.",PROG_NAME,MB_OK | MB_ICONINFORMATION);
265: */
266: }
267:
268: //-----------------------------------------------------------------------
269: /*
270: Restore 'snapshot' of memory/chips/emulation variables
271: */
272: void MemorySnapShot_Restore(char *pszFileName)
273: {
274: char *pszSnapShotFileName;
275: /*FIXME*/
276: /*
277: // Wait...
278: SetCursor(Cursors[CURSOR_HOURGLASS]);
279:
280: // If to be uncompressed, return temporary filename
281: pszSnapShotFileName = MemorySnapShot_UnCompressBegin(pszFileName);
282:
283: // Set to 'restore'
284: if (MemorySnapShot_OpenFile(pszSnapShotFileName,FALSE)) {
285: // Reset emulator to get things running
286: Reset_Cold();
287:
288: // Capture each files details
289: Main_MemorySnapShot_Capture(FALSE);
290: FDC_MemorySnapShot_Capture(FALSE);
291: Floppy_MemorySnapShot_Capture(FALSE);
292: GemDOS_MemorySnapShot_Capture(FALSE);
293: IKBD_MemorySnapShot_Capture(FALSE);
294: Int_MemorySnapShot_Capture(FALSE);
295: M68000_MemorySnapShot_Capture(FALSE);
296: M68000_Decode_MemorySnapShot_Capture(FALSE);
297: MFP_MemorySnapShot_Capture(FALSE);
298: PSG_MemorySnapShot_Capture(FALSE);
299: Sound_MemorySnapShot_Capture(FALSE);
300: TOS_MemorySnapShot_Capture(FALSE);
301: Video_MemorySnapShot_Capture(FALSE);
302:
303: // And close
304: MemorySnapShot_CloseFile();
305: }
306:
307: // And clean up
308: MemorySnapShot_UnCompressEnd();
309:
310: // We're back
311: SetCursor(Cursors[CURSOR_ARROW]);
312:
313: // Did error
314: if (bCaptureError)
315: Main_Message("Unable to Restore Memory State from file.",PROG_NAME,MB_OK | MB_ICONSTOP);
316: else
317: Main_Message("Memory State file restored.",PROG_NAME,MB_OK | MB_ICONINFORMATION);
318: */
319: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.