mirror of
https://github.com/holub/mame
synced 2025-10-04 16:34:53 +03:00
(MESS) svision.c: Cleanups (nw)
This commit is contained in:
parent
c95df31e26
commit
216bcb56b4
@ -275,9 +275,10 @@ static STREAM_UPDATE( svision_update )
|
|||||||
state->dma.pos += state->dma.step;
|
state->dma.pos += state->dma.step;
|
||||||
if (state->dma.pos >= state->dma.size)
|
if (state->dma.pos >= state->dma.size)
|
||||||
{
|
{
|
||||||
|
svision_state *sv_state = device->machine().driver_data<svision_state>();
|
||||||
state->dma.finished = TRUE;
|
state->dma.finished = TRUE;
|
||||||
state->dma.on = FALSE;
|
state->dma.on = FALSE;
|
||||||
svision_irq(device->machine());
|
sv_state->svision_irq();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
|
|
||||||
// in pixel
|
// in pixel
|
||||||
#define XSIZE (state->m_reg[0]&~3)
|
#define XSIZE (m_reg[0]&~3)
|
||||||
#define XPOS state->m_reg[2]
|
#define XPOS m_reg[2]
|
||||||
#define YPOS state->m_reg[3]
|
#define YPOS m_reg[3]
|
||||||
#define BANK m_reg[0x26]
|
#define BANK m_reg[0x26]
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(svision_state::svision_pet_timer)
|
TIMER_CALLBACK_MEMBER(svision_state::svision_pet_timer)
|
||||||
@ -29,14 +29,17 @@ TIMER_CALLBACK_MEMBER(svision_state::svision_pet_timer)
|
|||||||
switch (m_pet.state)
|
switch (m_pet.state)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_pet.input = machine().root_device().ioport("JOY2")->read();
|
if ( m_joy2 )
|
||||||
|
{
|
||||||
|
m_pet.input = m_joy2->read();
|
||||||
|
}
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
case 2: case 4: case 6: case 8:
|
case 2: case 4: case 6: case 8:
|
||||||
case 10: case 12: case 14:
|
case 10: case 12: case 14:
|
||||||
m_pet.clock=m_pet.state&2;
|
m_pet.clock = m_pet.state & 2;
|
||||||
m_pet.data=m_pet.input&1;
|
m_pet.data = m_pet.input & 1;
|
||||||
m_pet.input>>=1;
|
m_pet.input >>= 1;
|
||||||
m_pet.state++;
|
m_pet.state++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -55,20 +58,19 @@ TIMER_DEVICE_CALLBACK_MEMBER(svision_state::svision_pet_timer_dev)
|
|||||||
svision_pet_timer(ptr,param);
|
svision_pet_timer(ptr,param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_irq(running_machine &machine)
|
void svision_state::svision_irq()
|
||||||
{
|
{
|
||||||
svision_state *state = machine.driver_data<svision_state>();
|
int irq = m_svision.timer_shot && (BANK & 2);
|
||||||
int irq = state->m_svision.timer_shot && (state->BANK & 2);
|
irq = irq || (*m_dma_finished && (BANK & 4));
|
||||||
irq = irq || (*state->m_dma_finished && (state->BANK & 4));
|
|
||||||
|
|
||||||
machine.device("maincpu")->execute().set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
|
m_maincpu->set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(svision_state::svision_timer)
|
TIMER_CALLBACK_MEMBER(svision_state::svision_timer)
|
||||||
{
|
{
|
||||||
m_svision.timer_shot = TRUE;
|
m_svision.timer_shot = TRUE;
|
||||||
m_svision.timer1->enable(FALSE);
|
m_svision.timer1->enable(FALSE);
|
||||||
svision_irq( machine() );
|
svision_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER(svision_state::svision_r)
|
READ8_MEMBER(svision_state::svision_r)
|
||||||
@ -77,34 +79,47 @@ READ8_MEMBER(svision_state::svision_r)
|
|||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case 0x20:
|
case 0x20:
|
||||||
data = ioport("JOY")->read();
|
data = m_joy->read();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x21:
|
case 0x21:
|
||||||
data &= ~0xf;
|
data &= ~0xf;
|
||||||
data |= m_reg[0x22] & 0xf;
|
data |= m_reg[0x22] & 0xf;
|
||||||
if (m_pet.on)
|
if (m_pet.on)
|
||||||
{
|
{
|
||||||
if (!m_pet.clock)
|
if (!m_pet.clock)
|
||||||
|
{
|
||||||
data &= ~4;
|
data &= ~4;
|
||||||
|
}
|
||||||
if (!m_pet.data)
|
if (!m_pet.data)
|
||||||
|
{
|
||||||
data &= ~8;
|
data &= ~8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x27:
|
case 0x27:
|
||||||
data &= ~3;
|
data &= ~3;
|
||||||
if (m_svision.timer_shot)
|
if (m_svision.timer_shot)
|
||||||
|
{
|
||||||
data|=1;
|
data|=1;
|
||||||
|
}
|
||||||
if (*m_dma_finished)
|
if (*m_dma_finished)
|
||||||
|
{
|
||||||
data|=2;
|
data|=2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x24:
|
case 0x24:
|
||||||
m_svision.timer_shot = FALSE;
|
m_svision.timer_shot = FALSE;
|
||||||
svision_irq(machine());
|
svision_irq();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x25:
|
case 0x25:
|
||||||
*m_dma_finished = FALSE;
|
*m_dma_finished = FALSE;
|
||||||
svision_irq(machine());
|
svision_irq();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logerror("%.6f svision read %04x %02x\n", machine().time().as_double(),offset,data);
|
logerror("%.6f svision read %04x %02x\n", machine().time().as_double(),offset,data);
|
||||||
break;
|
break;
|
||||||
@ -125,34 +140,47 @@ WRITE8_MEMBER(svision_state::svision_w)
|
|||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x26: /* bits 5,6 memory management for a000? */
|
case 0x26: /* bits 5,6 memory management for a000? */
|
||||||
logerror("%.6f svision write %04x %02x\n", machine().time().as_double(),offset,data);
|
logerror("%.6f svision write %04x %02x\n", machine().time().as_double(),offset,data);
|
||||||
membank("bank1")->set_base(machine().root_device().memregion("user1")->base() + ((m_reg[0x26] & 0xe0) << 9));
|
m_bank1->set_base(m_user1->base() + ((m_reg[0x26] & 0xe0) << 9));
|
||||||
svision_irq(machine());
|
svision_irq();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x23: /* delta hero irq routine write */
|
case 0x23: /* delta hero irq routine write */
|
||||||
value = data;
|
value = data;
|
||||||
if (!data)
|
if (!data)
|
||||||
|
{
|
||||||
value = 0x100;
|
value = 0x100;
|
||||||
|
}
|
||||||
if (BANK & 0x10)
|
if (BANK & 0x10)
|
||||||
|
{
|
||||||
delay = 16384;
|
delay = 16384;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
delay = 256;
|
delay = 256;
|
||||||
|
}
|
||||||
m_svision.timer1->enable(TRUE);
|
m_svision.timer1->enable(TRUE);
|
||||||
m_svision.timer1->reset(machine().device<cpu_device>("maincpu")->cycles_to_attotime(value * delay));
|
m_svision.timer1->reset(m_maincpu->cycles_to_attotime(value * delay));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x10: case 0x11: case 0x12: case 0x13:
|
case 0x10: case 0x11: case 0x12: case 0x13:
|
||||||
svision_soundport_w(m_sound, 0, offset & 3, data);
|
svision_soundport_w(m_sound, 0, offset & 3, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x14: case 0x15: case 0x16: case 0x17:
|
case 0x14: case 0x15: case 0x16: case 0x17:
|
||||||
svision_soundport_w(m_sound, 1, offset & 3, data);
|
svision_soundport_w(m_sound, 1, offset & 3, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c:
|
case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c:
|
||||||
svision_sounddma_w(m_sound, space, offset - 0x18, data);
|
svision_sounddma_w(m_sound, space, offset - 0x18, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x28: case 0x29: case 0x2a:
|
case 0x28: case 0x29: case 0x2a:
|
||||||
svision_noise_w(m_sound, space, offset - 0x28, data);
|
svision_noise_w(m_sound, space, offset - 0x28, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logerror("%.6f svision write %04x %02x\n", machine().time().as_double(), offset, data);
|
logerror("%.6f svision write %04x %02x\n", machine().time().as_double(), offset, data);
|
||||||
break;
|
break;
|
||||||
@ -350,7 +378,6 @@ PALETTE_INIT_MEMBER(svision_state,svisionp)
|
|||||||
|
|
||||||
UINT32 svision_state::screen_update_svision(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
UINT32 svision_state::screen_update_svision(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
svision_state *state = machine().driver_data<svision_state>();
|
|
||||||
int x, y, i, j=XPOS/4+YPOS*0x30;
|
int x, y, i, j=XPOS/4+YPOS*0x30;
|
||||||
UINT8 *videoram = m_videoram;
|
UINT8 *videoram = m_videoram;
|
||||||
|
|
||||||
@ -382,7 +409,6 @@ UINT32 svision_state::screen_update_svision(screen_device &screen, bitmap_ind16
|
|||||||
|
|
||||||
UINT32 svision_state::screen_update_tvlink(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
UINT32 svision_state::screen_update_tvlink(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
svision_state *state = machine().driver_data<svision_state>();
|
|
||||||
int x, y, i, j = XPOS/4+YPOS*0x30;
|
int x, y, i, j = XPOS/4+YPOS*0x30;
|
||||||
UINT8 *videoram = m_videoram;
|
UINT8 *videoram = m_videoram;
|
||||||
|
|
||||||
@ -426,7 +452,10 @@ DRIVER_INIT_MEMBER(svision_state,svision)
|
|||||||
m_sound = machine().device("custom");
|
m_sound = machine().device("custom");
|
||||||
m_dma_finished = svision_dma_finished(m_sound);
|
m_dma_finished = svision_dma_finished(m_sound);
|
||||||
m_pet.on = FALSE;
|
m_pet.on = FALSE;
|
||||||
membank("bank2")->set_base(memregion("user1")->base() + 0x1c000);
|
m_user1 = memregion("user1");
|
||||||
|
m_bank1 = membank("bank1");
|
||||||
|
m_bank2 = membank("bank2");
|
||||||
|
m_bank2->set_base(m_user1->base() + 0x1c000);
|
||||||
}
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(svision_state,svisions)
|
DRIVER_INIT_MEMBER(svision_state,svisions)
|
||||||
@ -434,8 +463,10 @@ DRIVER_INIT_MEMBER(svision_state,svisions)
|
|||||||
m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this));
|
m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this));
|
||||||
m_sound = machine().device("custom");
|
m_sound = machine().device("custom");
|
||||||
m_dma_finished = svision_dma_finished(m_sound);
|
m_dma_finished = svision_dma_finished(m_sound);
|
||||||
membank("bank2")->set_base(memregion("user1")->base() + 0x1c000);
|
m_user1 = memregion("user1");
|
||||||
m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this));
|
m_bank1 = membank("bank1");
|
||||||
|
m_bank2 = membank("bank2");
|
||||||
|
m_bank2->set_base(m_user1->base() + 0x1c000);
|
||||||
m_pet.on = TRUE;
|
m_pet.on = TRUE;
|
||||||
m_pet.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_pet_timer),this));
|
m_pet.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_pet_timer),this));
|
||||||
}
|
}
|
||||||
@ -476,7 +507,9 @@ static DEVICE_IMAGE_LOAD( svision_cart )
|
|||||||
|
|
||||||
/* With the following, we mirror the cart in the whole "user1" memory region */
|
/* With the following, we mirror the cart in the whole "user1" memory region */
|
||||||
for (i = 0; i < mirror; i++)
|
for (i = 0; i < mirror; i++)
|
||||||
|
{
|
||||||
memcpy(image.device().machine().root_device().memregion("user1")->base() + i * size, temp_copy, size);
|
memcpy(image.device().machine().root_device().memregion("user1")->base() + i * size, temp_copy, size);
|
||||||
|
}
|
||||||
|
|
||||||
auto_free(image.device().machine(), temp_copy);
|
auto_free(image.device().machine(), temp_copy);
|
||||||
|
|
||||||
@ -487,7 +520,7 @@ void svision_state::machine_reset()
|
|||||||
{
|
{
|
||||||
m_svision.timer_shot = FALSE;
|
m_svision.timer_shot = FALSE;
|
||||||
*m_dma_finished = FALSE;
|
*m_dma_finished = FALSE;
|
||||||
membank("bank1")->set_base(memregion("user1")->base());
|
m_bank1->set_base(m_user1->base());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -495,7 +528,7 @@ MACHINE_RESET_MEMBER(svision_state,tvlink)
|
|||||||
{
|
{
|
||||||
m_svision.timer_shot = FALSE;
|
m_svision.timer_shot = FALSE;
|
||||||
*m_dma_finished = FALSE;
|
*m_dma_finished = FALSE;
|
||||||
membank("bank1")->set_base(memregion("user1")->base());
|
m_bank1->set_base(m_user1->base());
|
||||||
m_tvlink.palette_on = FALSE;
|
m_tvlink.palette_on = FALSE;
|
||||||
|
|
||||||
memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller
|
memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller
|
||||||
|
@ -32,17 +32,20 @@ class svision_state : public driver_device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
svision_state(const machine_config &mconfig, device_type type, const char *tag)
|
svision_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag) ,
|
: driver_device(mconfig, type, tag)
|
||||||
m_reg(*this, "reg"),
|
, m_maincpu(*this, "maincpu")
|
||||||
m_videoram(*this, "videoram"){ }
|
, m_reg(*this, "reg")
|
||||||
|
, m_videoram(*this, "videoram")
|
||||||
|
, m_joy(*this, "JOY")
|
||||||
|
, m_joy2(*this, "JOY2")
|
||||||
|
{ }
|
||||||
|
|
||||||
required_shared_ptr<UINT8> m_reg;
|
|
||||||
required_shared_ptr<UINT8> m_videoram;
|
|
||||||
device_t *m_sound;
|
device_t *m_sound;
|
||||||
int *m_dma_finished;
|
int *m_dma_finished;
|
||||||
svision_t m_svision;
|
svision_t m_svision;
|
||||||
svision_pet_t m_pet;
|
svision_pet_t m_pet;
|
||||||
tvlink_t m_tvlink;
|
tvlink_t m_tvlink;
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER(svision_r);
|
DECLARE_READ8_MEMBER(svision_r);
|
||||||
DECLARE_WRITE8_MEMBER(svision_w);
|
DECLARE_WRITE8_MEMBER(svision_w);
|
||||||
DECLARE_READ8_MEMBER(tvlink_r);
|
DECLARE_READ8_MEMBER(tvlink_r);
|
||||||
@ -60,6 +63,18 @@ public:
|
|||||||
TIMER_CALLBACK_MEMBER(svision_pet_timer);
|
TIMER_CALLBACK_MEMBER(svision_pet_timer);
|
||||||
TIMER_CALLBACK_MEMBER(svision_timer);
|
TIMER_CALLBACK_MEMBER(svision_timer);
|
||||||
TIMER_DEVICE_CALLBACK_MEMBER(svision_pet_timer_dev);
|
TIMER_DEVICE_CALLBACK_MEMBER(svision_pet_timer_dev);
|
||||||
|
void svision_irq();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_shared_ptr<UINT8> m_reg;
|
||||||
|
required_shared_ptr<UINT8> m_videoram;
|
||||||
|
required_ioport m_joy;
|
||||||
|
optional_ioport m_joy2;
|
||||||
|
|
||||||
|
memory_region *m_user1;
|
||||||
|
memory_bank *m_bank1;
|
||||||
|
memory_bank *m_bank2;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user