Merge pull request #103 from negativeExponent/huc3
HuC3: Refactoring to avoid breaking savestates
This commit is contained in:
commit
6dca6fe8df
|
@ -5515,6 +5515,8 @@ unsigned int gbWriteSaveState(uint8_t* data, unsigned)
|
||||||
utilWriteMem(data, &gbDataMBC5, sizeof(gbDataMBC5));
|
utilWriteMem(data, &gbDataMBC5, sizeof(gbDataMBC5));
|
||||||
utilWriteMem(data, &gbDataHuC1, sizeof(gbDataHuC1));
|
utilWriteMem(data, &gbDataHuC1, sizeof(gbDataHuC1));
|
||||||
utilWriteMem(data, &gbDataHuC3, sizeof(gbDataHuC3));
|
utilWriteMem(data, &gbDataHuC3, sizeof(gbDataHuC3));
|
||||||
|
if (gbRomType == 0xfe) // HuC3 rtc data
|
||||||
|
utilWriteMem(data, &gbRTCHuC3, sizeof(gbRTCHuC3));
|
||||||
utilWriteMem(data, &gbDataTAMA5, sizeof(gbDataTAMA5));
|
utilWriteMem(data, &gbDataTAMA5, sizeof(gbDataTAMA5));
|
||||||
if (gbTAMA5ram != NULL)
|
if (gbTAMA5ram != NULL)
|
||||||
utilWriteMem(data, gbTAMA5ram, gbTAMA5ramSize);
|
utilWriteMem(data, gbTAMA5ram, gbTAMA5ramSize);
|
||||||
|
@ -5632,6 +5634,8 @@ bool gbReadSaveState(const uint8_t* data, unsigned)
|
||||||
utilReadMem(&gbDataMBC5, data, sizeof(gbDataMBC5));
|
utilReadMem(&gbDataMBC5, data, sizeof(gbDataMBC5));
|
||||||
utilReadMem(&gbDataHuC1, data, sizeof(gbDataHuC1));
|
utilReadMem(&gbDataHuC1, data, sizeof(gbDataHuC1));
|
||||||
utilReadMem(&gbDataHuC3, data, sizeof(gbDataHuC3));
|
utilReadMem(&gbDataHuC3, data, sizeof(gbDataHuC3));
|
||||||
|
if (gbRomType == 0xfe) // HuC3 rtc data
|
||||||
|
utilReadMem(&gbRTCHuC3, data, sizeof(gbRTCHuC3));
|
||||||
utilReadMem(&gbDataTAMA5, data, sizeof(gbDataTAMA5));
|
utilReadMem(&gbDataTAMA5, data, sizeof(gbDataTAMA5));
|
||||||
if (gbTAMA5ram != NULL) {
|
if (gbTAMA5ram != NULL) {
|
||||||
utilReadMem(gbTAMA5ram, data, gbTAMA5ramSize);
|
utilReadMem(gbTAMA5ram, data, gbTAMA5ramSize);
|
||||||
|
|
|
@ -1000,31 +1000,40 @@ mapperHuC3 gbDataHuC3 = {
|
||||||
0, // RAM read value
|
0, // RAM read value
|
||||||
0, // Register 1
|
0, // Register 1
|
||||||
0, // Register 2
|
0, // Register 2
|
||||||
|
0, // Register 3
|
||||||
|
0, // Register 4
|
||||||
|
0, // Register 5
|
||||||
|
0, // Register 6
|
||||||
|
0, // Register 7
|
||||||
|
0 // Register 8
|
||||||
|
};
|
||||||
|
|
||||||
|
mapperHuC3RTC gbRTCHuC3 = {
|
||||||
|
0, // lastTime
|
||||||
0, // DateTime
|
0, // DateTime
|
||||||
0, // WritingTime
|
0, // WritingTime
|
||||||
0, // ModeFlag
|
0, // ModeFlag
|
||||||
0, // ClockShift
|
0 // ClockShift
|
||||||
0 // lastTime
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void memoryupdateHuC3Latch() {
|
void memoryupdateHuC3Latch() {
|
||||||
uint64_t now = time(NULL);
|
uint64_t now = time(NULL);
|
||||||
uint64_t diff = now - gbDataHuC3.mapperLastTime;
|
uint64_t diff = now - gbRTCHuC3.mapperLastTime;
|
||||||
|
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
unsigned minute = (diff / 60) % 1440;
|
unsigned minute = (diff / 60) % 1440;
|
||||||
unsigned day = (diff / 86400) & 0xFFF;
|
unsigned day = (diff / 86400) & 0xFFF;
|
||||||
|
|
||||||
gbDataHuC3.mapperDateTime = (day << 12) | minute;
|
gbRTCHuC3.mapperDateTime = (day << 12) | minute;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void memoryupdateHuC3Clock() {
|
void memoryupdateHuC3Clock() {
|
||||||
uint64_t now = time(NULL);
|
uint64_t now = time(NULL);
|
||||||
unsigned minute = (gbDataHuC3.mapperWritingTime & 0xFFF) % 1440;
|
unsigned minute = (gbRTCHuC3.mapperWritingTime & 0xFFF) % 1440;
|
||||||
unsigned day = (gbDataHuC3.mapperWritingTime & 0xFFF000) >> 12;
|
unsigned day = (gbRTCHuC3.mapperWritingTime & 0xFFF000) >> 12;
|
||||||
|
|
||||||
gbDataHuC3.mapperLastTime = now - minute * 60 - day * 86400;
|
gbRTCHuC3.mapperLastTime = now - minute * 60 - day * 86400;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HuC3 ROM write registers
|
// HuC3 ROM write registers
|
||||||
|
@ -1108,11 +1117,11 @@ void mapperHuC3RAM(uint16_t address, uint8_t value)
|
||||||
|
|
||||||
// read time
|
// read time
|
||||||
memoryupdateHuC3Latch();
|
memoryupdateHuC3Latch();
|
||||||
if (gbDataHuC3.mapperModeFlag == HUC3_READ) {
|
if (gbRTCHuC3.mapperModeFlag == HUC3_READ) {
|
||||||
gbDataHuC3.mapperRAMValue = (gbDataHuC3.mapperDateTime >> gbDataHuC3.mapperClockShift) & 0x0F;
|
gbDataHuC3.mapperRAMValue = (gbRTCHuC3.mapperDateTime >> gbRTCHuC3.mapperClockShift) & 0x0F;
|
||||||
gbDataHuC3.mapperClockShift += 4;
|
gbRTCHuC3.mapperClockShift += 4;
|
||||||
if (gbDataHuC3.mapperClockShift > 24)
|
if (gbRTCHuC3.mapperClockShift > 24)
|
||||||
gbDataHuC3.mapperClockShift = 0;
|
gbRTCHuC3.mapperClockShift = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x30:
|
case 0x30:
|
||||||
|
@ -1123,15 +1132,15 @@ void mapperHuC3RAM(uint16_t address, uint8_t value)
|
||||||
gbDataHuC3.mapperAddress = (gbDataHuC3.mapperRegister6 << 24) | (gbDataHuC3.mapperRegister5 << 16) | (gbDataHuC3.mapperRegister4 << 8) | (gbDataHuC3.mapperRegister3 << 4) | (gbDataHuC3.mapperRegister2);*/
|
gbDataHuC3.mapperAddress = (gbDataHuC3.mapperRegister6 << 24) | (gbDataHuC3.mapperRegister5 << 16) | (gbDataHuC3.mapperRegister4 << 8) | (gbDataHuC3.mapperRegister3 << 4) | (gbDataHuC3.mapperRegister2);*/
|
||||||
|
|
||||||
// write time
|
// write time
|
||||||
if (gbDataHuC3.mapperModeFlag == HUC3_WRITE) {
|
if (gbRTCHuC3.mapperModeFlag == HUC3_WRITE) {
|
||||||
if (gbDataHuC3.mapperClockShift == 0)
|
if (gbRTCHuC3.mapperClockShift == 0)
|
||||||
gbDataHuC3.mapperWritingTime = 0;
|
gbRTCHuC3.mapperWritingTime = 0;
|
||||||
if (gbDataHuC3.mapperClockShift <= 24) {
|
if (gbRTCHuC3.mapperClockShift <= 24) {
|
||||||
gbDataHuC3.mapperWritingTime |= (value & 0x0F) << gbDataHuC3.mapperClockShift;
|
gbRTCHuC3.mapperWritingTime |= (value & 0x0F) << gbRTCHuC3.mapperClockShift;
|
||||||
gbDataHuC3.mapperClockShift += 4;
|
gbRTCHuC3.mapperClockShift += 4;
|
||||||
if (gbDataHuC3.mapperClockShift == 24) {
|
if (gbRTCHuC3.mapperClockShift == 24) {
|
||||||
memoryupdateHuC3Clock();
|
memoryupdateHuC3Clock();
|
||||||
gbDataHuC3.mapperModeFlag = HUC3_READ;
|
gbRTCHuC3.mapperModeFlag = HUC3_READ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1151,16 +1160,16 @@ void mapperHuC3RAM(uint16_t address, uint8_t value)
|
||||||
switch(value & 0x0F) {
|
switch(value & 0x0F) {
|
||||||
case 0x0:
|
case 0x0:
|
||||||
// shift reset?
|
// shift reset?
|
||||||
gbDataHuC3.mapperClockShift = 0;
|
gbRTCHuC3.mapperClockShift = 0;
|
||||||
break;
|
break;
|
||||||
case 0x3:
|
case 0x3:
|
||||||
// write time?
|
// write time?
|
||||||
gbDataHuC3.mapperModeFlag = HUC3_WRITE;
|
gbRTCHuC3.mapperModeFlag = HUC3_WRITE;
|
||||||
gbDataHuC3.mapperClockShift = 0;
|
gbRTCHuC3.mapperClockShift = 0;
|
||||||
break;
|
break;
|
||||||
case 0x7:
|
case 0x7:
|
||||||
gbDataHuC3.mapperModeFlag = HUC3_READ;
|
gbRTCHuC3.mapperModeFlag = HUC3_READ;
|
||||||
gbDataHuC3.mapperClockShift = 0;
|
gbRTCHuC3.mapperClockShift = 0;
|
||||||
break;
|
break;
|
||||||
// others are unimplemented so far
|
// others are unimplemented so far
|
||||||
}
|
}
|
||||||
|
@ -1169,7 +1178,7 @@ void mapperHuC3RAM(uint16_t address, uint8_t value)
|
||||||
//gbDataHuC3.mapperRegister1 = (gbDataHuC3.mapperRegister1 & 0x0f) | ((value << 4) & 0x0f);
|
//gbDataHuC3.mapperRegister1 = (gbDataHuC3.mapperRegister1 & 0x0f) | ((value << 4) & 0x0f);
|
||||||
break;
|
break;
|
||||||
case 0x60:
|
case 0x60:
|
||||||
gbDataHuC3.mapperModeFlag = HUC3_READ; // ???
|
gbRTCHuC3.mapperModeFlag = HUC3_READ; // ???
|
||||||
gbDataHuC3.mapperRAMValue = 1;
|
gbDataHuC3.mapperRAMValue = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -77,12 +77,6 @@ struct mapperHuC1 {
|
||||||
int mapperRAMAddress;
|
int mapperRAMAddress;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
|
||||||
HUC3_READ = 0,
|
|
||||||
HUC3_WRITE = 1,
|
|
||||||
HUC3_NONE = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mapperHuC3 {
|
struct mapperHuC3 {
|
||||||
int mapperRAMEnable;
|
int mapperRAMEnable;
|
||||||
int mapperROMBank;
|
int mapperROMBank;
|
||||||
|
@ -93,14 +87,29 @@ struct mapperHuC3 {
|
||||||
int mapperRAMValue;
|
int mapperRAMValue;
|
||||||
int mapperRegister1;
|
int mapperRegister1;
|
||||||
int mapperRegister2;
|
int mapperRegister2;
|
||||||
int mapperDateTime;
|
int mapperRegister3;
|
||||||
int mapperWritingTime;
|
int mapperRegister4;
|
||||||
int mapperModeFlag;
|
int mapperRegister5;
|
||||||
int mapperClockShift;
|
int mapperRegister6;
|
||||||
|
int mapperRegister7;
|
||||||
|
int mapperRegister8;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
HUC3_READ = 0,
|
||||||
|
HUC3_WRITE = 1,
|
||||||
|
HUC3_NONE = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mapperHuC3RTC {
|
||||||
union {
|
union {
|
||||||
time_t mapperLastTime;
|
time_t mapperLastTime;
|
||||||
uint64_t _time_pad; /* so that 32bit and 64bit saves are compatible */
|
uint64_t _time_pad; /* so that 32bit and 64bit saves are compatible */
|
||||||
};
|
};
|
||||||
|
uint32_t mapperDateTime;
|
||||||
|
uint32_t mapperWritingTime;
|
||||||
|
uint32_t mapperModeFlag;
|
||||||
|
uint32_t mapperClockShift;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mapperTAMA5 {
|
struct mapperTAMA5 {
|
||||||
|
@ -155,6 +164,7 @@ extern mapperMBC3 gbDataMBC3;
|
||||||
extern mapperMBC5 gbDataMBC5;
|
extern mapperMBC5 gbDataMBC5;
|
||||||
extern mapperHuC1 gbDataHuC1;
|
extern mapperHuC1 gbDataHuC1;
|
||||||
extern mapperHuC3 gbDataHuC3;
|
extern mapperHuC3 gbDataHuC3;
|
||||||
|
extern mapperHuC3RTC gbRTCHuC3;
|
||||||
extern mapperTAMA5 gbDataTAMA5;
|
extern mapperTAMA5 gbDataTAMA5;
|
||||||
extern mapperMMM01 gbDataMMM01;
|
extern mapperMMM01 gbDataMMM01;
|
||||||
extern mapperGS3 gbDataGS3;
|
extern mapperGS3 gbDataGS3;
|
||||||
|
|
|
@ -173,7 +173,7 @@ static void* gb_rtcdata_prt(void)
|
||||||
case 0xfd: // TAMA5 + extended
|
case 0xfd: // TAMA5 + extended
|
||||||
return &gbDataTAMA5.mapperSeconds;
|
return &gbDataTAMA5.mapperSeconds;
|
||||||
case 0xfe: // HuC3 + Clock
|
case 0xfe: // HuC3 + Clock
|
||||||
return &gbDataHuC3.mapperDateTime;
|
return &gbRTCHuC3.mapperLastTime;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ static size_t gb_rtcdata_size(void)
|
||||||
case 0xfd: // TAMA5 + extended
|
case 0xfd: // TAMA5 + extended
|
||||||
return TAMA5_RTC_DATA_SIZE;
|
return TAMA5_RTC_DATA_SIZE;
|
||||||
case 0xfe: // HuC3 + Clock
|
case 0xfe: // HuC3 + Clock
|
||||||
return HUC3_RTC_DATA_SIZE;
|
return sizeof(gbRTCHuC3);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1438,7 +1438,7 @@ void retro_run(void)
|
||||||
initRTC = true;
|
initRTC = true;
|
||||||
break;
|
break;
|
||||||
case 0xfe:
|
case 0xfe:
|
||||||
if (!gbDataHuC3.mapperLastTime)
|
if (!gbRTCHuC3.mapperLastTime)
|
||||||
initRTC = true;
|
initRTC = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue