summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vis.cpp')
-rw-r--r--src/mame/drivers/vis.cpp42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp
index 470b22be7fc..ecf65fb91b4 100644
--- a/src/mame/drivers/vis.cpp
+++ b/src/mame/drivers/vis.cpp
@@ -724,7 +724,7 @@ private:
uint8_t unk_r(offs_t offset);
void unk_w(offs_t offset, uint8_t data);
uint8_t unk2_r();
- uint8_t memcard_r();
+ uint8_t memcard_r(offs_t offset);
void memcard_w(offs_t offset, uint8_t data);
uint16_t pad_r(offs_t offset);
void pad_w(offs_t offset, uint16_t data);
@@ -739,6 +739,7 @@ private:
uint8_t m_unkidx;
uint8_t m_unk[16];
uint8_t m_unk1[4];
+ uint8_t m_cardreg, m_cardval, m_cardcnt;
uint16_t m_padctl, m_padstat;
};
@@ -775,17 +776,42 @@ uint8_t vis_state::unk2_r()
return 0x40;
}
-//memory card reader?
-uint8_t vis_state::memcard_r()
+uint8_t vis_state::memcard_r(offs_t offset)
{
- return m_card->data_r() ? 0x20 : 0;
+ if(offset)
+ {
+ if((m_cardreg & 0x18) == 0x18)
+ {
+ if(m_cardcnt == 8)
+ return 0;
+ m_card->clock_w(1);
+ m_card->clock_w(0);
+ m_cardval = (m_cardval >> 1) | (m_card->data_r() ? 0x80 : 0);
+ m_cardcnt++;
+ return 0x80;
+ }
+ }
+ else
+ {
+ m_cardcnt = 0;
+ return m_cardval;
+ }
+ return 0;
}
void vis_state::memcard_w(offs_t offset, uint8_t data)
{
- m_card->clock_w(BIT(data, 0));
- m_card->data_w(BIT(data, 1));
- m_card->reset_w(BIT(data, 2));
+ if(offset)
+ {
+ if((data & 0x18) != 0x18)
+ {
+ m_card->data_w(BIT(data, 1));
+ m_card->clock_w(BIT(data, 0));
+ m_card->reset_w(!BIT(data, 2));
+ }
+ m_cardreg = data;
+ m_cardcnt = 0;
+ }
}
uint16_t vis_state::pad_r(offs_t offset)
@@ -878,7 +904,7 @@ void vis_state::io_map(address_map &map)
map(0x00e0, 0x00e1).noprw();
map(0x023c, 0x023f).rw(FUNC(vis_state::unk1_r), FUNC(vis_state::unk1_w));
map(0x0268, 0x026f).rw(FUNC(vis_state::pad_r), FUNC(vis_state::pad_w));
- map(0x031a, 0x031a).rw(FUNC(vis_state::memcard_r), FUNC(vis_state::memcard_w)).umask16(0x00ff);
+ map(0x0318, 0x031a).rw(FUNC(vis_state::memcard_r), FUNC(vis_state::memcard_w)).umask16(0x00ff);
}
static void vis_cards(device_slot_interface &device)