summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2025-10-19 18:50:42 +0200
committer Olivier Galibert <galibert@pobox.com>2025-10-19 18:50:48 +0200
commit47d47ba596c5d267a9b1d8bfb777b3556bcf5380 (patch)
treec6d898c19b9d49c75565a8ecd1f7730109f2f81a
parent18149254618ce846c37565cc63e222e6f7c7400d (diff)
sab80c535: hook up the ports 4-5
-rw-r--r--src/devices/cpu/mcs51/i8051.cpp18
-rw-r--r--src/devices/cpu/mcs51/i8051.h8
-rw-r--r--src/devices/cpu/mcs51/sab80c535.cpp95
-rw-r--r--src/devices/cpu/mcs51/sab80c535.h14
-rw-r--r--src/mame/access/acvirus.cpp33
5 files changed, 159 insertions, 9 deletions
diff --git a/src/devices/cpu/mcs51/i8051.cpp b/src/devices/cpu/mcs51/i8051.cpp
index d47b294b449..2f36491c16d 100644
--- a/src/devices/cpu/mcs51/i8051.cpp
+++ b/src/devices/cpu/mcs51/i8051.cpp
@@ -398,6 +398,24 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty
/* default to standard cmos interfacing */
for (auto & elem : m_forced_inputs)
elem = 0;
+
+ for(int i=0; i != 8; i++) {
+ m_port_in_cb[i].bind().set([this, i]() { return port_default_r(i); });
+ m_port_out_cb[i].bind().set([this, i](u8 data) { port_default_w(i, data); });
+ }
+}
+
+
+u8 mcs51_cpu_device::port_default_r(int port)
+{
+ if(!machine().side_effects_disabled())
+ logerror("read of un-hooked port %d (PC=%X)\n", port, m_ppc);
+ return 0xff;
+}
+
+void mcs51_cpu_device::port_default_w(int port, u8 data)
+{
+ logerror("write of un-hooked port %d %02x\n", port, data);
}
i8031_device::i8031_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
diff --git a/src/devices/cpu/mcs51/i8051.h b/src/devices/cpu/mcs51/i8051.h
index b960e8de5c2..42b5718e3a4 100644
--- a/src/devices/cpu/mcs51/i8051.h
+++ b/src/devices/cpu/mcs51/i8051.h
@@ -294,8 +294,8 @@ protected:
memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_intd;
memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_inti;
- devcb_read8::array<4> m_port_in_cb;
- devcb_write8::array<4> m_port_out_cb;
+ devcb_read8::array<8> m_port_in_cb;
+ devcb_write8::array<8> m_port_out_cb;
// for the debugger
u8 m_rtemp;
@@ -311,6 +311,10 @@ protected:
virtual bool manage_idle_on_interrupt(u8 ints);
virtual void handle_irq(int irqline, int state, u32 new_state, u32 tr_state);
+
+ u8 port_default_r(int port);
+ void port_default_w(int port, u8 data);
+
u8 iram_r(offs_t offset);
void iram_w(offs_t offset, u8 data);
void push_pc();
diff --git a/src/devices/cpu/mcs51/sab80c535.cpp b/src/devices/cpu/mcs51/sab80c535.cpp
index 0b334cc7fcb..2908f418a31 100644
--- a/src/devices/cpu/mcs51/sab80c535.cpp
+++ b/src/devices/cpu/mcs51/sab80c535.cpp
@@ -7,9 +7,102 @@
DEFINE_DEVICE_TYPE(SAB80C535, sab80c535_device, "sab80c535", "Siemens SAB80C535")
+// 80:*p0
+// 81:*sp
+// 82:*dpl
+// 83:*dph
+// 87:*pcon, power control
+// 88:*tcon, timer control
+// 89:*tmod
+// 8a:*tl0
+// 8b:*tl1
+// 8c:*th0
+// 8d:*th1
+// 90:*p1
+// 98:*scon, serial control
+// 99:*sbuf, serial buffer
+// a0:*p2
+// a8:*ien0
+// a9:!ip0
+// b0:*p3
+// b8:!ien1
+// b9: ip1
+// c0: ircon, interrupt request control
+// c1: ccen
+// c2: ccl1
+// c3: cch1
+// c4: ccl2
+// c5: cch2
+// c6: ccl3
+// c7: cch3
+// c8:*t2con
+// ca:*crcl
+// cb:*crch
+// cc:*tl2
+// cd:*th2
+// d0:*psw
+// d8: adcon, a/d control
+// d9: addat, a/d data
+// da: dapr, d/a program
+// db: p6 (also a/d)
+// e0:*acc
+// e8: p4
+// f0:*b
+// f8: p5
+
+
+
+void sab80c535_device::p4_w(u8 data)
+{
+ m_p4 = data;
+ m_port_out_cb[4](m_p4);
+}
+
+u8 sab80c535_device::p4_r()
+{
+ if(m_p4 == 0)
+ return 0;
+ return m_p4 & m_port_in_cb[4]();
+}
+
+void sab80c535_device::p5_w(u8 data)
+{
+ m_p5 = data;
+ m_port_out_cb[5](m_p5);
+}
+
+u8 sab80c535_device::p5_r()
+{
+ if(m_p5 == 0)
+ return 0;
+ return m_p5 & m_port_in_cb[5]();
+}
+
+
+void sab80c535_device::sfr_map(address_map &map)
+{
+ i8052_device::sfr_map(map);
+ map(0xe8, 0xe8).rw(FUNC(sab80c535_device::p4_r), FUNC(sab80c535_device::p4_w));
+ map(0xf8, 0xf8).rw(FUNC(sab80c535_device::p5_r), FUNC(sab80c535_device::p5_w));
+}
+
sab80c535_device::sab80c535_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : i80c52_device(mconfig, SAB80C535, tag, owner, clock, 0)
+ : i8052_device(mconfig, SAB80C535, tag, owner, clock, 0)
+{
+}
+
+void sab80c535_device::device_start()
+{
+ i8052_device::device_start();
+ save_item(NAME(m_p4));
+ save_item(NAME(m_p5));
+}
+
+void sab80c535_device::device_reset()
{
+ i8052_device::device_reset();
+ m_p4 = 0xff;
+ m_p5 = 0xff;
}
std::unique_ptr<util::disasm_interface> sab80c535_device::create_disassembler()
diff --git a/src/devices/cpu/mcs51/sab80c535.h b/src/devices/cpu/mcs51/sab80c535.h
index 5d659934896..50b077207ec 100644
--- a/src/devices/cpu/mcs51/sab80c535.h
+++ b/src/devices/cpu/mcs51/sab80c535.h
@@ -6,14 +6,26 @@
#include "i80c52.h"
-class sab80c535_device : public i80c52_device
+class sab80c535_device : public i8052_device
{
public:
// construction/destruction
sab80c535_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ virtual void sfr_map(address_map &map) override ATTR_COLD;
+
+private:
+ u8 m_p4, m_p5;
+
+ void p4_w(u8 data);
+ u8 p4_r();
+ void p5_w(u8 data);
+ u8 p5_r();
};
DECLARE_DEVICE_TYPE(SAB80C535, sab80c535_device)
diff --git a/src/mame/access/acvirus.cpp b/src/mame/access/acvirus.cpp
index b5e90b30457..ea635bed1a5 100644
--- a/src/mame/access/acvirus.cpp
+++ b/src/mame/access/acvirus.cpp
@@ -84,13 +84,18 @@ public:
void init_virus();
private:
+ required_device<sab80c535_device> m_maincpu;
+ required_memory_bank m_rombank;
+
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
- void virus_map(address_map &map) ATTR_COLD;
+ void prog_map(address_map &map) ATTR_COLD;
+ void data_map(address_map &map) ATTR_COLD;
- required_device<cpu_device> m_maincpu;
- required_memory_bank m_rombank;
+ void p5_w(u8 data);
+
+ u8 p402_r();
};
void acvirus_state::machine_start()
@@ -103,16 +108,34 @@ void acvirus_state::machine_reset()
{
}
-void acvirus_state::virus_map(address_map &map)
+void acvirus_state::p5_w(u8 data)
+{
+ m_rombank->set_entry((data >> 4) & 15);
+}
+
+u8 acvirus_state::p402_r()
+{
+ return 0x02; // ready?
+}
+
+void acvirus_state::prog_map(address_map &map)
{
map(0x0000, 0x7fff).rom().region("maincpu", 0); // fixed 32K of flash image
map(0x8000, 0xffff).bankr(m_rombank);
}
+void acvirus_state::data_map(address_map &map)
+{
+ map(0x0402, 0x0402).r (FUNC(acvirus_state::p402_r));
+}
+
+
void acvirus_state::virus(machine_config &config)
{
SAB80C535(config, m_maincpu, XTAL(12'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &acvirus_state::virus_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &acvirus_state::prog_map);
+ m_maincpu->set_addrmap(AS_DATA, &acvirus_state::data_map);
+ m_maincpu->port_out_cb<5>().set(FUNC(acvirus_state::p5_w));
SPEAKER(config, "speaker", 2).front();
}