mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
model1.cpp: Acknowledge IRQs explicitly; use MB8421 DPRAM device (nw)
This commit is contained in:
parent
1d1b6b44e7
commit
762b7b1a4e
@ -585,6 +585,7 @@ Notes:
|
||||
|
||||
#include "cpu/i386/i386.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/mb8421.h"
|
||||
#include "machine/model1io.h"
|
||||
#include "speaker.h"
|
||||
|
||||
@ -594,16 +595,6 @@ Notes:
|
||||
// and writes the data to the dual port RAM. This isn't
|
||||
// emulated yet, data just gets written to RAM.
|
||||
|
||||
READ8_MEMBER( model1_state::io_r )
|
||||
{
|
||||
return m_dpram[offset];
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( model1_state::io_w )
|
||||
{
|
||||
m_dpram[offset] = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( model1_state::vf_outputs_w )
|
||||
{
|
||||
// 7654---- unknown (not used?)
|
||||
@ -713,15 +704,39 @@ WRITE16_MEMBER(model1_state::bank_w)
|
||||
void model1_state::irq_raise(int level)
|
||||
{
|
||||
// logerror("irq: raising %d\n", level);
|
||||
// irq_status |= (1 << level);
|
||||
m_last_irq = level;
|
||||
m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
m_irq_status |= (1 << level);
|
||||
m_maincpu->set_input_line(0, ASSERT_LINE);
|
||||
}
|
||||
|
||||
IRQ_CALLBACK_MEMBER(model1_state::irq_callback)
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
if (BIT(m_irq_status, i))
|
||||
{
|
||||
m_last_irq = i;
|
||||
break;
|
||||
}
|
||||
|
||||
return m_last_irq;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(model1_state::irq_control_w)
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case 0x10:
|
||||
m_irq_status = 0;
|
||||
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
m_irq_status &= ~(1 << m_last_irq);
|
||||
if (m_irq_status == 0)
|
||||
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// vf
|
||||
// 1 = fe3ed4
|
||||
// 3 = fe3f5c
|
||||
@ -856,7 +871,7 @@ void model1_state::model1_mem(address_map &map)
|
||||
map(0x900000, 0x903fff).ram().w(this, FUNC(model1_state::p_w)).share("palette");
|
||||
map(0x910000, 0x91bfff).ram().share("color_xlat");
|
||||
|
||||
map(0xc00000, 0xc007ff).ram().share("dpram"); // 2k*8-bit dual port ram
|
||||
map(0xc00000, 0xc00fff).rw("dpram", FUNC(mb8421_device::right_r), FUNC(mb8421_device::right_w)).umask16(0x00ff); // 2k*8-bit dual port ram
|
||||
|
||||
map(0xc40000, 0xc40000).rw(m_m1uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
|
||||
map(0xc40002, 0xc40002).rw(m_m1uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
|
||||
@ -866,7 +881,7 @@ void model1_state::model1_mem(address_map &map)
|
||||
map(0xd80000, 0xd80003).w(this, FUNC(model1_state::v60_copro_fifo_w)).mirror(0x10);
|
||||
map(0xdc0000, 0xdc0003).r(this, FUNC(model1_state::fifoin_status_r));
|
||||
|
||||
map(0xe00000, 0xe00001).nopw(); // Watchdog? IRQ ack? Always 0x20, usually on irq
|
||||
map(0xe00000, 0xe00000).w(this, FUNC(model1_state::irq_control_w));
|
||||
map(0xe00004, 0xe00005).w(this, FUNC(model1_state::bank_w));
|
||||
map(0xe0000c, 0xe0000f).nopw();
|
||||
|
||||
@ -1574,11 +1589,13 @@ MACHINE_CONFIG_START(model1_state::model1)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(model1_state,model1)
|
||||
|
||||
MCFG_DEVICE_ADD("ioboard", SEGA_MODEL1IO, 0)
|
||||
MCFG_MODEL1IO_READ_CB(READ8(model1_state, io_r))
|
||||
MCFG_MODEL1IO_WRITE_CB(WRITE8(model1_state, io_w))
|
||||
MCFG_MODEL1IO_READ_CB(DEVREAD8("dpram", mb8421_device, left_r))
|
||||
MCFG_MODEL1IO_WRITE_CB(DEVWRITE8("dpram", mb8421_device, left_w))
|
||||
MCFG_MODEL1IO_IN0_CB(IOPORT("IN.0"))
|
||||
MCFG_MODEL1IO_IN1_CB(IOPORT("IN.1"))
|
||||
|
||||
MCFG_DEVICE_ADD("dpram", MB8421, 0)
|
||||
|
||||
MCFG_S24TILE_DEVICE_ADD("tile", 0x3fff)
|
||||
MCFG_S24TILE_DEVICE_PALETTE("palette")
|
||||
|
||||
|
@ -50,7 +50,6 @@ public:
|
||||
, m_display_list0(*this, "display_list0")
|
||||
, m_display_list1(*this, "display_list1")
|
||||
, m_color_xlat(*this, "color_xlat")
|
||||
, m_dpram(*this, "dpram")
|
||||
, m_paletteram16(*this, "palette")
|
||||
, m_palette(*this, "palette")
|
||||
, m_tiles(*this, "tile")
|
||||
@ -229,7 +228,9 @@ private:
|
||||
// Machine
|
||||
void irq_raise(int level);
|
||||
void irq_init();
|
||||
DECLARE_WRITE8_MEMBER(irq_control_w);
|
||||
|
||||
uint8_t m_irq_status;
|
||||
int m_last_irq;
|
||||
|
||||
// Devices
|
||||
@ -251,7 +252,6 @@ private:
|
||||
required_shared_ptr<uint16_t> m_display_list0;
|
||||
required_shared_ptr<uint16_t> m_display_list1;
|
||||
required_shared_ptr<uint16_t> m_color_xlat;
|
||||
required_shared_ptr<uint16_t> m_dpram;
|
||||
|
||||
// Sound
|
||||
int m_sound_irq;
|
||||
|
Loading…
Reference in New Issue
Block a user