diff --git a/desmume/src/addons/slot1_retail_nand.cpp b/desmume/src/addons/slot1_retail_nand.cpp index 1474376e9..60c51d1cd 100644 --- a/desmume/src/addons/slot1_retail_nand.cpp +++ b/desmume/src/addons/slot1_retail_nand.cpp @@ -46,6 +46,7 @@ private: u32 mode; u32 handle_save; u32 save_adr; + u32 save_start_adr; public: virtual Slot1Info const* info() @@ -85,12 +86,17 @@ public: { protocol.address = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4]; + //INFO("Start command: %02X%02X%02X%02X%02X%02X%02X%02X\t", + // protocol.command.bytes[0], protocol.command.bytes[1], protocol.command.bytes[2], protocol.command.bytes[3], + // protocol.command.bytes[4], protocol.command.bytes[5], protocol.command.bytes[6], protocol.command.bytes[7]); + //INFO("FROM: %08X\n", NDS_ARM9.instruct_adr); + //pass the normal rom operations along to the rom component switch(operation) { case eSlot1Operation_00_ReadHeader_Unencrypted: case eSlot1Operation_2x_SecureAreaLoad: - case eSlot1Operation_B7_Read: + //case eSlot1Operation_B7_Read: rom.start(operation,protocol.address); return; } @@ -99,10 +105,6 @@ public: int cmd = protocol.command.bytes[0]; switch(cmd) { - //Nand Write Page - case 0x81: - break; - // Nand Init case 0x94: mode = cmd; @@ -112,6 +114,16 @@ public: case 0xD6: break; + //Nand Write Page + case 0x81: + mode = cmd; + if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) + { + save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; + } + handle_save = 1; + break; + case 0x84: //Write disable case 0x85: //Write enable mode = cmd; @@ -121,9 +133,24 @@ public: handle_save = 0; break; + case 0xB7: + if (handle_save) + { + mode = cmd; + if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) + { + save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; + } + } + else + { + rom.start(operation, protocol.address); + } + break; + case 0xB2: //Set save position mode = cmd; - save_adr = (protocol.address & gameInfo.mask) - subAdr; + save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; handle_save = 1; break; }