mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
i8x9x: Fix EXTINT; add some very preliminary HSI stuff (nw)
This commit is contained in:
parent
f763dbcac6
commit
342f861e0c
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user