i8x9x: Fix EXTINT; add some very preliminary HSI stuff (nw)

This commit is contained in:
AJR 2020-04-10 20:31:54 -04:00
parent f763dbcac6
commit 342f861e0c
8 changed files with 80 additions and 40 deletions

View File

@ -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<u8>(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)
{

View File

@ -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<util::disasm_interface> 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);

View File

@ -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 {

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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));

View File

@ -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)