From 342f861e0cb8a73e0dd9ac17dbdd49a9464974c6 Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 10 Apr 2020 20:31:54 -0400 Subject: [PATCH] i8x9x: Fix EXTINT; add some very preliminary HSI stuff (nw) --- src/devices/cpu/mcs96/i8x9x.cpp | 62 ++++++++++++++++++++++++++++--- src/devices/cpu/mcs96/i8x9x.h | 16 +++++++- src/devices/cpu/mcs96/mcs96.cpp | 18 --------- src/devices/cpu/mcs96/mcs96.h | 6 --- src/mame/drivers/roland_cm32p.cpp | 2 +- src/mame/drivers/roland_d10.cpp | 4 +- src/mame/drivers/roland_s50.cpp | 8 ++-- src/mame/drivers/roland_u20.cpp | 4 +- 8 files changed, 80 insertions(+), 40 deletions(-) diff --git a/src/devices/cpu/mcs96/i8x9x.cpp b/src/devices/cpu/mcs96/i8x9x.cpp index f4aae129d3e..0c986bdcd23 100644 --- a/src/devices/cpu/mcs96/i8x9x.cpp +++ b/src/devices/cpu/mcs96/i8x9x.cpp @@ -20,9 +20,10 @@ i8x9x_device::i8x9x_device(const machine_config &mconfig, device_type type, cons m_in_p0_cb(*this), m_out_p1_cb(*this), m_in_p1_cb(*this), m_out_p2_cb(*this), m_in_p2_cb(*this), - base_timer2(0), ad_done(0), hsi_mode(0), hso_command(0), ad_command(0), hso_time(0), ad_result(0), pwm_control(0), + base_timer2(0), ad_done(0), hsi_mode(0), hsi_status(0), hso_command(0), ad_command(0), hso_time(0), ad_result(0), pwm_control(0), port1(0), port2(0), - ios0(0), ios1(0), ioc0(0), ioc1(0), sbuf(0), sp_con(0), sp_stat(0), serial_send_buf(0), serial_send_timer(0) + ios0(0), ios1(0), ioc0(0), ioc1(0), extint(false), + sbuf(0), sp_con(0), sp_stat(0), serial_send_buf(0), serial_send_timer(0), baud_reg(0), brh(false) { for (auto &hso : hso_info) { @@ -58,6 +59,9 @@ void i8x9x_device::device_start() cycles_scaling = 3; state_add(I8X9X_HSI_MODE, "HSI_MODE", hsi_mode); + state_add(I8X9X_HSI_STATUS, "HSI_STATUS", + [this]() -> u8 { return hsi_status; }, + [this](u8 data) { hsi_status = (data & 0x55) | (hsi_status & 0xaa); }); state_add(I8X9X_HSO_TIME, "HSO_TIME", hso_time); state_add(I8X9X_HSO_COMMAND, "HSO_COMMAND", hso_command); state_add(I8X9X_AD_COMMAND, "AD_COMMAND", ad_command).mask(0xf); @@ -89,6 +93,7 @@ void i8x9x_device::device_start() save_item(NAME(base_timer2)); save_item(NAME(ad_done)); save_item(NAME(hsi_mode)); + save_item(NAME(hsi_status)); save_item(NAME(hso_command)); save_item(NAME(ad_command)); save_item(NAME(hso_time)); @@ -100,6 +105,7 @@ void i8x9x_device::device_start() save_item(NAME(ios1)); save_item(NAME(ioc0)); save_item(NAME(ioc1)); + save_item(NAME(extint)); save_item(NAME(sbuf)); save_item(NAME(sp_con)); save_item(NAME(sp_stat)); @@ -241,9 +247,7 @@ void i8x9x_device::hso_command_w(u8 data) u8 i8x9x_device::hsi_status_r() { - if (!machine().side_effects_disabled()) - logerror("read hsi status (%04x)\n", PPC); - return 0x00; + return hsi_status; } void i8x9x_device::sbuf_w(u8 data) @@ -331,7 +335,7 @@ void i8x9x_device::port2_w(u8 data) u8 i8x9x_device::port2_r() { // P2.0 and P2.5 are for output only (but can be read back despite what Intel claims?) - return (m_in_p2_cb() | 0x21 | ~i8x9x_p2_mask()) & (port2 | 0x1e); + return (m_in_p2_cb() | 0x25 | ~i8x9x_p2_mask()) & (port2 | (extint ? 0x1e : 0x1a)); } void i8x9x_device::sp_con_w(u8 data) @@ -414,6 +418,23 @@ void i8x9x_device::timer2_reset(u64 current_time) base_timer2 = current_time; } +void i8x9x_device::set_hsi_state(int pin, bool state) +{ + if(pin == 0 && !BIT(hsi_status, 1) && state) { + if(BIT(ioc1, 1)) { + pending_irq |= IRQ_HSI0; + check_irq(); + } + if((ioc0 & 0x28) == 0x28) + timer2_reset(total_cycles()); + } + + if(state) + hsi_status |= 2 << (pin * 2); + else + hsi_status &= ~(2 << (pin * 2)); +} + void i8x9x_device::trigger_cam(int id, u64 current_time) { hso_cam_entry &cam = hso_info[id]; @@ -514,6 +535,35 @@ void i8x9x_device::internal_update(u64 current_time) recompute_bcount(event_time); } +void i8x9x_device::execute_set_input(int linenum, int state) +{ + switch(linenum) { + case EXTINT_LINE: + if(!extint && state && !BIT(ioc1, 1)) { + pending_irq |= IRQ_EXTINT; + check_irq(); + } + extint = state; + break; + + case HSI0_LINE: + set_hsi_state(0, state); + break; + + case HSI1_LINE: + set_hsi_state(1, state); + break; + + case HSI2_LINE: + set_hsi_state(2, state); + break; + + case HSI3_LINE: + set_hsi_state(3, state); + break; + } +} + c8095_90_device::c8095_90_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : i8x9x_device(mconfig, C8095_90, tag, owner, clock, 16) { diff --git a/src/devices/cpu/mcs96/i8x9x.h b/src/devices/cpu/mcs96/i8x9x.h index d3ee1777ad4..bb0cc710b24 100644 --- a/src/devices/cpu/mcs96/i8x9x.h +++ b/src/devices/cpu/mcs96/i8x9x.h @@ -15,8 +15,17 @@ class i8x9x_device : public mcs96_device { public: + enum { + EXTINT_LINE = 0, + HSI0_LINE, + HSI1_LINE, + HSI2_LINE, + HSI3_LINE + }; + enum { I8X9X_HSI_MODE = MCS96_LAST_REG + 1, + I8X9X_HSI_STATUS, I8X9X_HSO_TIME, I8X9X_HSO_COMMAND, I8X9X_AD_COMMAND, @@ -65,6 +74,9 @@ protected: virtual void device_start() override; virtual void device_reset() override; + virtual uint32_t execute_input_lines() const noexcept override { return 5; } + virtual void execute_set_input(int linenum, int state) override; + virtual std::unique_ptr create_disassembler() override; virtual void do_exec_full() override; @@ -132,11 +144,12 @@ private: hso_cam_entry hso_cam_hold; u64 base_timer2, ad_done; - u8 hsi_mode, hso_command, ad_command; + u8 hsi_mode, hsi_status, hso_command, ad_command; u16 hso_time, ad_result; u8 pwm_control; u8 port1, port2; u8 ios0, ios1, ioc0, ioc1; + bool extint; u8 sbuf, sp_con, sp_stat; u8 serial_send_buf; u64 serial_send_timer; @@ -146,6 +159,7 @@ private: u16 timer_value(int timer, u64 current_time) const; u64 timer_time_until(int timer, u64 current_time, u16 timer_value) const; void timer2_reset(u64 current_time); + void set_hsi_state(int pin, bool state); void commit_hso_cam(); void trigger_cam(int id, u64 current_time); void set_hso(u8 mask, bool state); diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp index 260a7964661..7070645bb52 100644 --- a/src/devices/cpu/mcs96/mcs96.cpp +++ b/src/devices/cpu/mcs96/mcs96.cpp @@ -89,11 +89,6 @@ uint32_t mcs96_device::execute_max_cycles() const noexcept return 33; } -uint32_t mcs96_device::execute_input_lines() const noexcept -{ - return 1; -} - void mcs96_device::recompute_bcount(uint64_t event_time) { if(!event_time || event_time >= total_cycles() + icount) { @@ -152,19 +147,6 @@ void mcs96_device::execute_run() } } -void mcs96_device::execute_set_input(int inputnum, int state) -{ - switch(inputnum) { - case EXINT_LINE: - if(state) - pending_irq |= 0x80; - else - pending_irq &= 0x7f; - check_irq(); - break; - } -} - device_memory_interface::space_config_vector mcs96_device::memory_space_config() const { return space_config_vector { diff --git a/src/devices/cpu/mcs96/mcs96.h b/src/devices/cpu/mcs96/mcs96.h index 80844334aa6..f24ad31a53b 100644 --- a/src/devices/cpu/mcs96/mcs96.h +++ b/src/devices/cpu/mcs96/mcs96.h @@ -15,10 +15,6 @@ class mcs96_device : public cpu_device { public: - enum { - EXINT_LINE = 1 - }; - enum { MCS96_PC = 1, MCS96_PSW, @@ -57,9 +53,7 @@ protected: // device_execute_interface overrides virtual uint32_t execute_min_cycles() const noexcept override; virtual uint32_t execute_max_cycles() const noexcept override; - virtual uint32_t execute_input_lines() const noexcept override; virtual void execute_run() override; - virtual void execute_set_input(int inputnum, int state) override; // device_memory_interface overrides virtual space_config_vector memory_space_config() const override; diff --git a/src/mame/drivers/roland_cm32p.cpp b/src/mame/drivers/roland_cm32p.cpp index cdf95207816..d595b02af8b 100644 --- a/src/mame/drivers/roland_cm32p.cpp +++ b/src/mame/drivers/roland_cm32p.cpp @@ -554,7 +554,7 @@ void cm32p_state::cm32p(machine_config &config) SPEAKER(config, "rspeaker").front_right(); MB87419_MB87420(config, pcm, 32.768_MHz_XTAL); - //pcm->int_callback().set_inputline(cpu, i8x9x_device::EXTINT_LINE); + pcm->int_callback().set_inputline(cpu, i8x9x_device::EXTINT_LINE); pcm->add_route(0, "lspeaker", 1.0); pcm->add_route(1, "rspeaker", 1.0); diff --git a/src/mame/drivers/roland_d10.cpp b/src/mame/drivers/roland_d10.cpp index 46d33a3c5c2..c6f952eb399 100644 --- a/src/mame/drivers/roland_d10.cpp +++ b/src/mame/drivers/roland_d10.cpp @@ -292,8 +292,8 @@ void roland_d10_state::d10(machine_config &config) // Shall become a proper memcard device someday NVRAM( config, m_memcs, nvram_device::DEFAULT_ALL_0 ); - MB63H149(config, "keyscan", 16.384_MHz_XTAL); - //keyscan.int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE); + mb63h149_device &keyscan(MB63H149(config, "keyscan", 16.384_MHz_XTAL)); + keyscan.int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); screen.set_refresh_hz(50); diff --git a/src/mame/drivers/roland_s50.cpp b/src/mame/drivers/roland_s50.cpp index 7249d8dc8c2..d85a272e481 100644 --- a/src/mame/drivers/roland_s50.cpp +++ b/src/mame/drivers/roland_s50.cpp @@ -261,11 +261,11 @@ void roland_s50_state::s50(machine_config &config) m_io->set_addrmap(0, &roland_s50_state::s50_io_map); MB63H149(config, m_keyscan, 24_MHz_XTAL / 2); - //m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); + m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); WD1772(config, m_fdc, 8_MHz_XTAL); // WD1770-00 or WD1772-02 - //m_fdc->drq_wr_callback().set_inputline(m_maincpu, i8x9x_device::HSI2_LINE); - //m_fdc->intrq_wr_callback().set_inputline(m_maincpu, i8x9x_device::HSI3_LINE); + m_fdc->drq_wr_callback().set_inputline(m_maincpu, i8x9x_device::HSI2_LINE); + m_fdc->intrq_wr_callback().set_inputline(m_maincpu, i8x9x_device::HSI3_LINE); // Floppy unit: FDD4261A0K or FDD4251G0K FLOPPY_CONNECTOR(config, m_floppy, s50_floppies, "35dd", floppy_image_device::default_floppy_formats).enable_sound(true); @@ -318,7 +318,7 @@ void roland_w30_state::w30(machine_config &config) m_sram->set_addrmap(0, &roland_w30_state::sram_map); MB63H149(config, m_keyscan, 24_MHz_XTAL / 2); - //m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); + m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); WD1772(config, m_fdc, 8_MHz_XTAL); // WD1772-02 m_fdc->intrq_wr_callback().set(FUNC(roland_w30_state::fdc_irq_w)); diff --git a/src/mame/drivers/roland_u20.cpp b/src/mame/drivers/roland_u20.cpp index 007b4bb58a1..f8e7bc88e60 100644 --- a/src/mame/drivers/roland_u20.cpp +++ b/src/mame/drivers/roland_u20.cpp @@ -52,7 +52,7 @@ void roland_u20_state::u20(machine_config &config) SPEAKER(config, "rspeaker").front_right(); MB87419_MB87420(config, m_pcm, 32.768_MHz_XTAL); - //m_pcm->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); + m_pcm->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE); m_pcm->set_device_rom_tag("waverom"); m_pcm->add_route(0, "lspeaker", 1.0); m_pcm->add_route(1, "rspeaker", 1.0); @@ -63,7 +63,7 @@ void roland_u20_state::u220(machine_config &config) u20(config); //config.device_remove("keyscan"); - //m_pcm->int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE); + m_pcm->int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE); } ROM_START(u20)