From 4d79e39f36504e7075c642248bfdb6cca68028d9 Mon Sep 17 00:00:00 2001 From: mtabachenko Date: Thu, 7 Nov 2013 02:27:20 +0000 Subject: [PATCH] core: - implemented mc write status command; - add feature custom initial value mc data on reset; (fix bug #1325 Daigassou! Band Brothers DX - JP) --- desmume/src/MMU.cpp | 7 ++-- desmume/src/addons/slot2_expMemory.cpp | 9 ----- desmume/src/mc.cpp | 48 +++++++++++++++++--------- desmume/src/mc.h | 1 + 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 20ac3fb22..3b9c315c1 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -2435,8 +2435,7 @@ u32 DmaController::read32() static INLINE void write_auxspicnt(const int PROCNUM, const int size, const int adr, const int val) { - //u16 oldCnt = MMU.AUX_SPI_CNT; - bool csOld = (MMU.AUX_SPI_CNT & (1 << 6))?true:false; + u16 oldCnt = MMU.AUX_SPI_CNT; switch(size) { @@ -2448,9 +2447,11 @@ static INLINE void write_auxspicnt(const int PROCNUM, const int size, const int break; } + bool csOld = (oldCnt & (1 << 6))?true:false; bool cs = (MMU.AUX_SPI_CNT & (1 << 6))?true:false; + bool spi = (MMU.AUX_SPI_CNT & (1 << 13))?true:false; - if (!cs && csOld) + if ((!cs && csOld) || (spi && (oldCnt == 0) && !cs)) { //printf("MMU%c: CS changed from HIGH to LOW *****\n", PROCNUM?'7':'9'); slot1_device->auxspi_reset(PROCNUM); diff --git a/desmume/src/addons/slot2_expMemory.cpp b/desmume/src/addons/slot2_expMemory.cpp index d8d9dd419..0de0f06aa 100644 --- a/desmume/src/addons/slot2_expMemory.cpp +++ b/desmume/src/addons/slot2_expMemory.cpp @@ -111,9 +111,6 @@ static u8 ExpMemory_read08(u32 procnum, u32 adr) { EXPINFO("ExpMemory: read 08 at 0x%08X\n", adr); - if (adr == 0x08240000) - return (ext_ram_lock?0:1); - if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadByte(header_0x00B0,adr-0x080000B0); @@ -128,9 +125,6 @@ static u8 ExpMemory_read08(u32 procnum, u32 adr) } static u16 ExpMemory_read16(u32 procnum, u32 adr) { - if (adr == 0x08240000) - return (ext_ram_lock?0:1); - if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadWord(header_0x00B0,adr-0x080000B0); @@ -149,9 +143,6 @@ static u16 ExpMemory_read16(u32 procnum, u32 adr) } static u32 ExpMemory_read32(u32 procnum, u32 adr) { - if (adr == 0x08240000) - return (ext_ram_lock?0:1); - if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadLong(header_0x00B0,adr-0x080000B0); diff --git a/desmume/src/mc.cpp b/desmume/src/mc.cpp index de4f67c7a..b6e0f040a 100644 --- a/desmume/src/mc.cpp +++ b/desmume/src/mc.cpp @@ -63,7 +63,7 @@ //the game reads its initial sound volumes from uninitialized data, and if it is 0, the game will be silent //if it is 0xFF then the game starts with its sound and music at max, as presumably it is supposed to. //so in r3303 I finally changed it (no$ appears definitely to initialize to 0xFF) -static const u8 kUninitializedSaveDataValue = 0xFF; +static u8 kUninitializedSaveDataValue = 0xFF; static const char* kDesmumeSaveCookie = "|-DESMUME SAVE-|"; @@ -116,7 +116,7 @@ void backup_setManualBackupType(int type) bool BackupDevice::save_state(EMUFILE* os) { - u32 version = 3; + u32 version = 4; //v0 write32le(version,os); write32le(write_enable,os); @@ -133,6 +133,8 @@ bool BackupDevice::save_state(EMUFILE* os) write8le(motionFlag,os); //v3 writebool(reset_command_state,os); + //v4 + write8le(write_protect,os); return true; } @@ -166,6 +168,11 @@ bool BackupDevice::load_state(EMUFILE* is) readbool(&reset_command_state,is); } + if(version>=4) + { + read8le(&write_protect,is); + } + return true; } @@ -189,6 +196,7 @@ void BackupDevice::movie_mode() void BackupDevice::reset_hardware() { write_enable = FALSE; + write_protect = 0; com = 0; addr = addr_counter = 0; motionInitState = MOTION_INIT_STATE_IDLE; @@ -197,6 +205,10 @@ void BackupDevice::reset_hardware() reset_command_state = false; flushPending = false; lazyFlushPending = false; + + kUninitializedSaveDataValue = 0xFF; + + if(!memcmp(gameInfo.header.gameCode,"AXBJ", 4)) kUninitializedSaveDataValue = 0x00; // Daigassou! Band Brothers DX (JP) } void BackupDevice::reset() @@ -302,7 +314,7 @@ void BackupDevice::checkReset() //for a performance hack, save files are only flushed after each reset command //(hopefully, after each page) - if(flushPending) + if(flushPending && (com == BM_CMD_WRITELOW || com == BM_CMD_WRITEHIGH)) { flush(); flushPending = false; @@ -337,8 +349,13 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) switch (com) { - case BM_CMD_READLOW: + case BM_CMD_WRITESTATUS: + //printf("MC%c: write status %02X\n", PROCNUM?'7':'9', val); + write_protect = (val & 0xFC); + break; + case BM_CMD_WRITELOW: + case BM_CMD_READLOW: //handle data or address if(state == DETECTING) { @@ -391,7 +408,7 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) case BM_CMD_READSTATUS: //handle request to read status //LOG("Backup Memory Read Status: %02X\n", write_enable << 1); - val = (write_enable << 1) | (3<<2); + val = (write_enable << 1) | write_protect; break; case BM_CMD_IRDA: @@ -402,16 +419,20 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) default: if (com != 0) { - //printf("MC%c: Unhandled Backup Memory command %02X, value %02X (PC:%08X)\n", PROCNUM?'7':'9', com, val, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); + printf("MC%c: Unhandled Backup Memory command %02X, value %02X (PC:%08X)\n", PROCNUM?'7':'9', com, val, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); break; } com = val; + val = 0xFF; + //there is no current command. receive one switch (com) { case BM_CMD_NOP: break; + case BM_CMD_WRITESTATUS: break; + #ifdef _ENABLE_MOTION case 0xFE: if(motionInitState == MOTION_INIT_STATE_IDLE) { motionInitState = MOTION_INIT_STATE_FE; return 0; } @@ -449,6 +470,7 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) break; case BM_CMD_WRITEDISABLE: + //printf("MC%c: write disable\n", PROCNUM?'7':'9'); #ifdef _ENABLE_MOTION switch (motionInitState) { @@ -457,18 +479,13 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) } #endif write_enable = FALSE; - com = 0; break; - case BM_CMD_READSTATUS: - //val = (write_enable << 1) | (3<<2); - val = 0xFF; - break; + case BM_CMD_READSTATUS: break; case BM_CMD_WRITEENABLE: //printf("MC%c: write enable\n", PROCNUM?'7':'9'); write_enable = TRUE; - com = 0; break; case BM_CMD_WRITELOW: @@ -476,14 +493,13 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) //printf("XLO: %08X\n",addr); addr_counter = 0; addr = 0; - val = 0xFF; break; case BM_CMD_WRITEHIGH: case BM_CMD_READHIGH: //printf("XHI: %08X\n",addr); - if(val == BM_CMD_WRITEHIGH) com = BM_CMD_WRITELOW; - if(val == BM_CMD_READHIGH) com = BM_CMD_READLOW; + if(com == BM_CMD_WRITEHIGH) com = BM_CMD_WRITELOW; + if(com == BM_CMD_READHIGH) com = BM_CMD_READLOW; addr_counter = 0; addr = 0; if(addr_size==1) @@ -497,7 +513,7 @@ u8 BackupDevice::data_command(u8 val, u8 PROCNUM) break; default: - printf("MC%c: Unhandled Backup Memory command: %02X FROM %08X\n", PROCNUM?'7':'9', val, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); + printf("MC%c: Unhandled Backup Memory command: %02X FROM %08X\n", PROCNUM?'7':'9', com, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); break; } //switch(val) break; diff --git a/desmume/src/mc.h b/desmume/src/mc.h index 3e1231c5e..292a3abb7 100644 --- a/desmume/src/mc.h +++ b/desmume/src/mc.h @@ -126,6 +126,7 @@ private: std::string filename; bool write_enable; //is write enabled? + u8 write_protect; bool reset_command_state; u32 com; //persistent command actually handled u32 addr_size, addr_counter;