| 968 | } |
| 969 | |
| 970 | int loadState(int stateNum) { |
| 971 | FILE *inFile; |
| 972 | StateStruct state; |
| 973 | char statename[100]; |
| 974 | int version; |
| 975 | |
| 976 | memset(&state, 0, sizeof(StateStruct)); |
| 977 | |
| 978 | if (stateNum == -1) |
| 979 | siprintf(statename, "%s.yss", basename); |
| 980 | else |
| 981 | siprintf(statename, "%s.ys%d", basename, stateNum); |
| 982 | inFile = fopen(statename, "r"); |
| 983 | |
| 984 | if (inFile == 0) { |
| 985 | printMenuMessage("State doesn't exist."); |
| 986 | return 1; |
| 987 | } |
| 988 | |
| 989 | fread(&version, sizeof(int), 1, inFile); |
| 990 | |
| 991 | if (version == 0 || version > STATE_VERSION) { |
| 992 | printMenuMessage("State is from an incompatible version."); |
| 993 | return 1; |
| 994 | } |
| 995 | |
| 996 | fread((char*)bgPaletteData, 1, sizeof(bgPaletteData), inFile); |
| 997 | fread((char*)sprPaletteData, 1, sizeof(sprPaletteData), inFile); |
| 998 | fread((char*)vram, 1, sizeof(vram), inFile); |
| 999 | fread((char*)wram, 1, sizeof(wram), inFile); |
| 1000 | fread((char*)hram, 1, 0x200, inFile); |
| 1001 | |
| 1002 | if (version <= 4 && ramSize == 0x04) |
| 1003 | // Value "0x04" for ram size wasn't interpreted correctly before |
| 1004 | fread((char*)externRam, 1, 0x2000*4, inFile); |
| 1005 | else |
| 1006 | fread((char*)externRam, 1, 0x2000*numRamBanks, inFile); |
| 1007 | |
| 1008 | fread((char*)&state, 1, sizeof(StateStruct), inFile); |
| 1009 | |
| 1010 | /* MBC-specific values have been introduced in v3 */ |
| 1011 | if (version >= 3) { |
| 1012 | switch (MBC) { |
| 1013 | case MBC3: |
| 1014 | if (version == 3) { |
| 1015 | u8 rtcReg; |
| 1016 | fread(&rtcReg, 1, sizeof(u8), inFile); |
| 1017 | if (rtcReg != 0) |
| 1018 | currentRamBank = rtcReg; |
| 1019 | } |
| 1020 | break; |
| 1021 | case HUC3: |
| 1022 | fread(&HuC3Mode, 1, sizeof(u8), inFile); |
| 1023 | fread(&HuC3Value, 1, sizeof(u8), inFile); |
| 1024 | fread(&HuC3Shift, 1, sizeof(u8), inFile); |
| 1025 | break; |
| 1026 | } |
| 1027 |
no test coverage detected