From be53737eba305c77c6784981cf8f81e0b9210ae1 Mon Sep 17 00:00:00 2001 From: windwakr <284886+windwakr@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:58:16 -0400 Subject: [PATCH] Slot2: more Sega Card Reader fixes --- desmume/src/addons/slot2_hcv1000.cpp | 45 +++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/desmume/src/addons/slot2_hcv1000.cpp b/desmume/src/addons/slot2_hcv1000.cpp index 5c8747bb1..701f41e0a 100644 --- a/desmume/src/addons/slot2_hcv1000.cpp +++ b/desmume/src/addons/slot2_hcv1000.cpp @@ -20,9 +20,15 @@ #include #include "../slot2.h" - -u8 hcv1000_cnt; -char hcv1000_data[16]; +#include "../emufile.h" + +static u8 hcv1000_cnt; +static u8 hcv1000_data[16] = +{ 0x5F, 0x5F, 0x5F, 0x5F, + 0x5F, 0x5F, 0x5F, 0x5F, + 0x5F, 0x5F, 0x5F, 0x5F, + 0x5F, 0x5F, 0x5F, 0x5F +}; class Slot2_HCV1000 : public ISlot2Interface { @@ -34,17 +40,15 @@ class Slot2_HCV1000 : public ISlot2Interface return &info; } - virtual bool init() + virtual void connect() { hcv1000_cnt = 0; - memset(hcv1000_data, 0x5F, 16); - - return TRUE; } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { - if (addr == 0xA000000) { hcv1000_cnt = (val & 0x83); } + if (addr == 0xA000000) + hcv1000_cnt = (val & 0x83); } virtual u8 readByte(u8 PROCNUM, u32 addr) @@ -58,12 +62,15 @@ class Slot2_HCV1000 : public ISlot2Interface } //HCV_CNT - else if (addr == 0xA000000) { slot_byte = hcv1000_cnt; } + else if (addr == 0xA000000) + { + slot_byte = hcv1000_cnt; + } //HCV_DATA else if ((addr >= 0xA000010) && (addr <= 0xA00001F)) { - slot_byte = (u8)hcv1000_data[addr & 0xF]; + slot_byte = hcv1000_data[addr & 0xF]; } return slot_byte; @@ -71,6 +78,24 @@ class Slot2_HCV1000 : public ISlot2Interface virtual u16 readWord(u8 PROCNUM, u32 addr) { return 0xFDFD; }; virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xFDFDFDFD; }; + + virtual void savestate(EMUFILE &os) + { + s32 version = 0; + os.write_32LE(version); + + os.write_u8(hcv1000_cnt); + } + + virtual void loadstate(EMUFILE &is) + { + s32 version = is.read_s32LE(); + + if (version >= 0) + { + is.read_u8(hcv1000_cnt); + } + } }; ISlot2Interface* construct_Slot2_HCV1000() { return new Slot2_HCV1000(); }