summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2019-12-23 23:00:48 +0100
committer yz70s <yz70s@users.noreply.github.com>2019-12-23 23:00:48 +0100
commitcd5e994b86e7b552ca3974c6ef7985680b0d40b0 (patch)
treecdb49c9e6a20c45c1936029f0c7cf67f69ace98a
parent11a58eeee4595b15feb03d52190ddad688be411e (diff)
naomi dimm board: add communication between sh4 and security pic (nw)
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.cpp3
-rw-r--r--src/mame/machine/naomigd.cpp72
-rw-r--r--src/mame/machine/naomigd.h11
3 files changed, 81 insertions, 5 deletions
diff --git a/src/devices/cpu/pic16c62x/pic16c62x.cpp b/src/devices/cpu/pic16c62x/pic16c62x.cpp
index d7cdb791b8b..0ebb09d6090 100644
--- a/src/devices/cpu/pic16c62x/pic16c62x.cpp
+++ b/src/devices/cpu/pic16c62x/pic16c62x.cpp
@@ -169,7 +169,8 @@ device_memory_interface::space_config_vector pic16c62x_device::memory_space_conf
{
return space_config_vector{
std::make_pair(AS_PROGRAM, &m_program_config),
- std::make_pair(AS_DATA, &m_data_config)
+ std::make_pair(AS_DATA, &m_data_config),
+ std::make_pair(AS_IO, &m_io_config)
};
}
diff --git a/src/mame/machine/naomigd.cpp b/src/mame/machine/naomigd.cpp
index 8274fd33bf7..a1c699399f9 100644
--- a/src/mame/machine/naomigd.cpp
+++ b/src/mame/machine/naomigd.cpp
@@ -408,14 +408,72 @@ naomi_gdrom_board::naomi_gdrom_board(const machine_config &mconfig, const char *
picdata(*this, finder_base::DUMMY_TAG)
{
image_tag = nullptr;
+ picbus = 0;
+ picbus_pullup = 0xf;
+ picbus_io[0] = 0xf;
+ picbus_io[1] = 0xf;
+ picbus_used = false;
}
-void naomi_gdrom_board::sh4_map(address_map& map)
+void naomi_gdrom_board::sh4_map(address_map &map)
{
map(0x00000000, 0x001fffff).rom().region("bios", 0);
map.unmap_value_high();
}
+void naomi_gdrom_board::sh4_io_map(address_map &map)
+{
+ map(0x00, 0x0f).rw(FUNC(naomi_gdrom_board::i2cmem_dimm_r), FUNC(naomi_gdrom_board::i2cmem_dimm_w));
+}
+
+READ64_MEMBER(naomi_gdrom_board::i2cmem_dimm_r)
+{
+ if (picbus_used == true)
+ return ((picbus | picbus_pullup) & 0xf) << 2;
+ else
+ return 0;
+}
+
+WRITE64_MEMBER(naomi_gdrom_board::i2cmem_dimm_w)
+{
+ if (data & 0x0200)
+ {
+ picbus_used = true;
+ picbus_io[0] = (uint8_t)(~data >> (16 + 5 * 2 - 3)) & 0x8; // clock only for now
+ picbus = (data >> 2) & 0xf;
+ picbus_pullup = (picbus_io[0] & picbus_io[1]) & 0xf; // high if both are inputs
+ // TODO: abort timeslice of sh4
+ }
+ else
+ picbus_used = false;
+}
+
+void naomi_gdrom_board::pic_map(address_map &map)
+{
+ map(0x00, 0x1f).rw(FUNC(naomi_gdrom_board::pic_dimm_r), FUNC(naomi_gdrom_board::pic_dimm_w));
+}
+
+READ8_MEMBER(naomi_gdrom_board::pic_dimm_r)
+{
+ if (offset == 1)
+ return picbus | picbus_pullup;
+ return 0;
+}
+
+WRITE8_MEMBER(naomi_gdrom_board::pic_dimm_w)
+{
+ if (offset == 1)
+ {
+ picbus = data;
+ // TODO: abort timeslice of pic
+ }
+ if (offset == 3)
+ {
+ picbus_io[1] = data; // for each bit specify direction, 0 out 1 in
+ picbus_pullup = (picbus_io[0] & picbus_io[1]) & 0xf; // high if both are inputs
+ }
+}
+
void naomi_gdrom_board::find_file(const char *name, const uint8_t *dir_sector, uint32_t &file_start, uint32_t &file_size)
{
file_start = 0;
@@ -494,7 +552,7 @@ void naomi_gdrom_board::device_start()
memcpy((uint8_t*)m_securitycpu->space(AS_PROGRAM).get_read_ptr(0), picdata, 0x400);
} else {
// use extracted pic data
- // printf("This PIC key hasn't been converted to a proper PIC binary yet!\n");
+ // printf("This PIC key hasn't been converted to a proper PIC binary yet!\n");
memcpy(name, picdata+33, 7);
memcpy(name+7, picdata+25, 7);
@@ -591,6 +649,10 @@ void naomi_gdrom_board::device_start()
}
save_item(NAME(dimm_cur_address));
+ save_item(NAME(picbus));
+ save_item(NAME(picbus_pullup));
+ save_item(NAME(picbus_io));
+ save_item(NAME(picbus_used));
}
void naomi_gdrom_board::device_reset()
@@ -620,7 +682,7 @@ void naomi_gdrom_board::board_advance(uint32_t size)
#define CPU_CLOCK 200000000 // need to set the correct value here
-void naomi_gdrom_board::device_add_mconfig(machine_config& config)
+void naomi_gdrom_board::device_add_mconfig(machine_config &config)
{
SH4LE(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_md(0, 1);
@@ -634,8 +696,10 @@ void naomi_gdrom_board::device_add_mconfig(machine_config& config)
m_maincpu->set_md(8, 0);
m_maincpu->set_sh4_clock(CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &naomi_gdrom_board::sh4_map);
+ m_maincpu->set_addrmap(AS_IO, &naomi_gdrom_board::sh4_io_map);
m_maincpu->set_disable();
- PIC16C621A(config, m_securitycpu, 1000000); // need to set the correct value for clock
+ PIC16C621A(config, m_securitycpu, 2000000); // need to set the correct value for clock
+ m_securitycpu->set_addrmap(AS_IO, &naomi_gdrom_board::pic_map);
m_securitycpu->set_disable();
}
diff --git a/src/mame/machine/naomigd.h b/src/mame/machine/naomigd.h
index 35cb3614f6c..eb2819814dd 100644
--- a/src/mame/machine/naomigd.h
+++ b/src/mame/machine/naomigd.h
@@ -33,6 +33,8 @@ public:
virtual void device_add_mconfig(machine_config &config) override;
void sh4_map(address_map &map);
+ void sh4_io_map(address_map &map);
+ void pic_map(address_map &map);
void set_image_tag(const char *_image_tag)
{
@@ -43,6 +45,11 @@ public:
virtual const tiny_rom_entry *device_rom_region() const override;
+ DECLARE_READ64_MEMBER(i2cmem_dimm_r);
+ DECLARE_WRITE64_MEMBER(i2cmem_dimm_w);
+ DECLARE_READ8_MEMBER(pic_dimm_r);
+ DECLARE_WRITE8_MEMBER(pic_dimm_w);
+
protected:
virtual void device_start() override;
virtual void device_reset() override;
@@ -61,6 +68,10 @@ private:
optional_region_ptr<uint8_t> picdata;
uint32_t dimm_cur_address;
+ uint8_t picbus;
+ uint8_t picbus_pullup;
+ uint8_t picbus_io[2]; // 0 for sh4, 1 for pic
+ bool picbus_used;
// Note: voluntarily not saved into the state
uint8_t *dimm_data;