diff options
| author | 2025-10-19 18:50:42 +0200 | |
|---|---|---|
| committer | 2025-10-19 18:50:48 +0200 | |
| commit | 47d47ba596c5d267a9b1d8bfb777b3556bcf5380 (patch) | |
| tree | c6d898c19b9d49c75565a8ecd1f7730109f2f81a | |
| parent | 18149254618ce846c37565cc63e222e6f7c7400d (diff) | |
sab80c535: hook up the ports 4-5
| -rw-r--r-- | src/devices/cpu/mcs51/i8051.cpp | 18 | ||||
| -rw-r--r-- | src/devices/cpu/mcs51/i8051.h | 8 | ||||
| -rw-r--r-- | src/devices/cpu/mcs51/sab80c535.cpp | 95 | ||||
| -rw-r--r-- | src/devices/cpu/mcs51/sab80c535.h | 14 | ||||
| -rw-r--r-- | src/mame/access/acvirus.cpp | 33 |
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(); } |
