v9938.c: Fix MT#05622 and MT#05623

This commit is contained in:
Wilbert Pol 2015-09-21 22:58:39 +02:00
parent bfb9dd7b34
commit cd7ed78f98
17 changed files with 455 additions and 473 deletions

View File

@ -5,6 +5,25 @@
v9938 / v9958 emulation
Vertical display parameters from Yamaha V9938 Technical Data Book.
NTSC: page 146, Table 7-2
PAL: page 147, Table 7-3
Vertical timing:
PAL NTSC
192(LN=0) 212(LN=1) 192(LN=0) 212(LN=1)
------------------- --------------------
1. Top erase (top blanking) 13 13 13 13
2. Top border 53 43 26 16
3. Active display 192 212 192 212
4. Bottom border 49 39 25 15
5. Bottom erase (bottom blanking) 3 3 3 3
6. Vertical sync (bottom blanking) 3 3 3 3
7. Total 313 313 262 262
Refresh rate 50.158974 59.922743
***************************************************************************/
/*
@ -59,8 +78,8 @@ Similar to the TMS9928, the V9938 has an own address space. It can handle
at most 192 KiB RAM (128 KiB base, 64 KiB expansion).
*/
static ADDRESS_MAP_START(memmap, AS_DATA, 8, v99x8_device)
ADDRESS_MAP_GLOBAL_MASK(0x3ffff)
AM_RANGE(0x00000, 0x2ffff) AM_RAM
ADDRESS_MAP_GLOBAL_MASK(0x3ffff)
AM_RANGE(0x00000, 0x2ffff) AM_RAM
ADDRESS_MAP_END
@ -68,6 +87,7 @@ ADDRESS_MAP_END
const device_type V9938 = &device_creator<v9938_device>;
const device_type V9958 = &device_creator<v9958_device>;
v99x8_device::v99x8_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
device_memory_interface(mconfig, *this),
@ -96,7 +116,8 @@ v99x8_device::v99x8_device(const machine_config &mconfig, device_type type, cons
m_button_state(0),
m_vdp_ops_count(0),
m_vdp_engine(NULL),
m_palette(*this, "palette")
m_palette(*this, "palette"),
m_pal_ntsc(0)
{
static_set_addrmap(*this, AS_DATA, ADDRESS_MAP_NAME(memmap));
}
@ -114,59 +135,105 @@ v9958_device::v9958_device(const machine_config &mconfig, const char *tag, devic
}
int v99x8_device::interrupt ()
void v99x8_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
int scanline, max, pal, scanline_start;
int scanline = (m_scanline - (m_scanline_start + m_offset_y));
update_command ();
pal = m_cont_reg[9] & 2;
if (pal) scanline_start = 53; else scanline_start = 22;
// set flags
if (m_scanline == (m_offset_y + scanline_start) )
if (m_scanline == (m_scanline_start + m_offset_y))
{
m_stat_reg[2] &= ~0x40;
}
else if (m_scanline == (m_offset_y + m_visible_y + scanline_start) )
else if (m_scanline == (m_scanline_start + m_offset_y + m_visible_y))
{
m_stat_reg[2] |= 0x40;
m_stat_reg[0] |= 0x80;
}
max = (pal) ? 255 : (m_cont_reg[9] & 0x80) ? 234 : 244;
scanline = (m_scanline - scanline_start - m_offset_y);
if ( (scanline >= 0) && (scanline <= max) &&
( ( (scanline + m_cont_reg[23]) & 255) == m_cont_reg[19]) )
if ( (scanline >= 0) && (scanline <= m_scanline_max) &&
(((scanline + m_cont_reg[23]) & 255) == m_cont_reg[19]) )
{
m_stat_reg[1] |= 1;
LOG(("V9938: scanline interrupt (%d)\n", scanline));
}
else
if ( !(m_cont_reg[0] & 0x10) ) m_stat_reg[1] &= 0xfe;
check_int ();
// check for start of vblank
if ((pal && (m_scanline == 310)) ||
(!pal && (m_scanline == 259)))
interrupt_start_vblank ();
// render the current line
if ((m_scanline >= scanline_start) && (m_scanline < (212 + 28 + scanline_start)))
else if (!(m_cont_reg[0] & 0x10))
{
scanline = (m_scanline - scanline_start) & 255;
refresh_line (scanline);
m_stat_reg[1] &= 0xfe;
}
max = (m_cont_reg[9] & 2) ? 313 : 262;
if (++m_scanline >= max)
m_scanline = 0;
check_int();
return m_int_state;
// check for start of vblank
if (m_scanline == m_vblank_start)
{
interrupt_start_vblank();
}
// render the current line
if (m_scanline < m_vblank_start)
{
refresh_line(scanline);
}
if (++m_scanline >= m_height)
{
m_scanline = 0;
// PAL/NTSC changed?
int pal = m_cont_reg[9] & 2;
if (m_pal_ntsc != pal)
{
m_pal_ntsc = pal;
configure_pal_ntsc();
}
//m_screen->reset_origin();
m_offset_y = position_offset(m_cont_reg[18] >> 4);
set_screen_parameters();
}
}
void v99x8_device::set_screen_parameters()
{
if (m_pal_ntsc)
{
// PAL
m_scanline_start = (m_cont_reg[9] & 0x80) ? 43 : 53;
m_scanline_max = 255;
}
else
{
// NYSC
m_scanline_start = (m_cont_reg[9] & 0x80) ? 16 : 26;
m_scanline_max = (m_cont_reg[9] & 0x80) ? 234 : 244;
}
m_visible_y = (m_cont_reg[9] & 0x80) ? 212 : 192;
}
void v99x8_device::configure_pal_ntsc()
{
if (m_pal_ntsc)
{
// PAL
m_height = VTOTAL_PAL;
rectangle visible;
visible.set(0, HVISIBLE - 1, VERTICAL_ADJUST * 2, VVISIBLE_PAL * 2 - 1 - VERTICAL_ADJUST * 2);
m_screen->configure(HTOTAL, VTOTAL_PAL * 2, visible, HZ_TO_ATTOSECONDS(50.158974));
}
else
{
// NTSC
m_height = VTOTAL_NTSC;
rectangle visible;
visible.set(0, HVISIBLE - 1, VERTICAL_ADJUST * 2, VVISIBLE_NTSC * 2 - 1 - VERTICAL_ADJUST * 2);
m_screen->configure(HTOTAL, VTOTAL_NTSC * 2, visible, HZ_TO_ATTOSECONDS(59.922743));
}
m_vblank_start = m_height - VERTICAL_SYNC - TOP_ERASE; /* Sync + top erase */
}
/*
Not really right... won't work with sprites in graphics 7
and with palette updated mid-screen
@ -570,6 +637,8 @@ void v99x8_device::device_start()
for (int addr = m_vram_size; addr < 0x30000; addr++) m_vram_space->write_byte(addr, 0xff);
}
m_line_timer = timer_alloc(TIMER_LINE);
save_item(NAME(m_offset_x));
save_item(NAME(m_offset_y));
save_item(NAME(m_visible_y));
@ -612,6 +681,11 @@ void v99x8_device::device_start()
save_item(NAME(m_mmc.MXS));
save_item(NAME(m_mmc.MXD));
save_item(NAME(m_vdp_ops_count));
save_item(NAME(m_pal_ntsc));
save_item(NAME(m_scanline_start));
save_item(NAME(m_vblank_start));
save_item(NAME(m_scanline_max));
save_item(NAME(m_height));
}
void v99x8_device::device_reset()
@ -620,7 +694,7 @@ void v99x8_device::device_reset()
// offset reset
m_offset_x = 8;
m_offset_y = 8 + 16;
m_offset_y = 0;
m_visible_y = 192;
// register reset
reset_palette (); // palette registers
@ -644,10 +718,16 @@ void v99x8_device::device_reset()
// TODO: SR3-S6 do not yet store the information about the sprite collision
m_stat_reg[4] = 0xfe;
m_stat_reg[6] = 0xfc;
// Start the timer
m_line_timer->adjust(attotime::from_ticks(HTOTAL*2, m_clock), 0, attotime::from_ticks(HTOTAL*2, m_clock));
configure_pal_ntsc();
set_screen_parameters();
}
void v99x8_device::reset_palette ()
void v99x8_device::reset_palette()
{
// taken from V9938 Technical Data book, page 148. it's in G-R-B format
static const UINT8 pal16[16*3] = {
@ -795,17 +875,8 @@ void v99x8_device::register_write (int reg, int data)
case 9:
m_cont_reg[reg] = data;
// recalc offset
m_offset_x = (( (~m_cont_reg[18] - 8) & 0x0f) + 1);
m_offset_y = ((~(m_cont_reg[18]>>4) - 8) & 0x0f) + 7;
if (m_cont_reg[9] & 0x80)
{
m_visible_y = 212;
}
else
{
m_visible_y = 192;
m_offset_y += 10;
}
m_offset_x = 8 + position_offset(m_cont_reg[18] & 0x0f);
// Y offset is only applied once per frame?
break;
case 15:
@ -1789,32 +1860,31 @@ void v99x8_device::refresh_16(int line)
if (m_cont_reg[9] & 0x08)
{
ln = &m_bitmap.pix16(line*2+((m_stat_reg[2]>>1)&1));
ln = &m_bitmap.pix16(m_scanline*2+((m_stat_reg[2]>>1)&1));
}
else
{
ln = &m_bitmap.pix16(line*2);
ln2 = &m_bitmap.pix16(line*2+1);
ln = &m_bitmap.pix16(m_scanline*2);
ln2 = &m_bitmap.pix16(m_scanline*2+1);
double_lines = true;
}
if ( !(m_cont_reg[1] & 0x40) || (m_stat_reg[2] & 0x40) )
{
(this->*s_modes[m_mode].border_16) (pens, ln);
(this->*s_modes[m_mode].border_16)(pens, ln);
}
else
{
int i = (line - m_offset_y) & 255;
(this->*s_modes[m_mode].visible_16) (pens, ln, i);
(this->*s_modes[m_mode].visible_16)(pens, ln, line);
if (s_modes[m_mode].sprites)
{
(this->*s_modes[m_mode].sprites) (i, col);
(this->*s_modes[m_mode].draw_sprite_16) (pens, ln, col);
(this->*s_modes[m_mode].sprites)(line, col);
(this->*s_modes[m_mode].draw_sprite_16)(pens, ln, col);
}
}
if (double_lines)
memcpy (ln2, ln, (512 + 32) * 2);
memcpy(ln2, ln, (512 + 32) * 2);
}
void v99x8_device::refresh_line(int line)

View File

@ -26,6 +26,30 @@
MCFG_VIDEO_SET_SCREEN(_screen) \
v9938_device::static_set_vram_size(*device, _vramsize);
#define MCFG_V99X8_SCREEN_ADD_NTSC(_screen_tag, _v9938_tag, _clock) \
MCFG_SCREEN_ADD(_screen_tag, RASTER) \
MCFG_SCREEN_RAW_PARAMS(_clock, \
v99x8_device::HTOTAL, \
0, \
v99x8_device::HVISIBLE - 1, \
v99x8_device::VTOTAL_NTSC * 2, \
v99x8_device::VERTICAL_ADJUST * 2, \
v99x8_device::VVISIBLE_NTSC * 2 - 1 - v99x8_device::VERTICAL_ADJUST * 2) \
MCFG_SCREEN_UPDATE_DEVICE(_v9938_tag, v9938_device, screen_update) \
MCFG_SCREEN_PALETTE(_v9938_tag":palette")
#define MCFG_V99X8_SCREEN_ADD_PAL(_screen_tag, _v9938_tag, _clock) \
MCFG_SCREEN_ADD(_screen_tag, RASTER) \
MCFG_SCREEN_RAW_PARAMS(_clock, \
v99x8_device::HTOTAL, \
0, \
v99x8_device::HVISIBLE - 1, \
v99x8_device::VTOTAL_PAL * 2, \
v99x8_device::VERTICAL_ADJUST * 2, \
v99x8_device::VVISIBLE_PAL * 2 - 1 - v99x8_device::VERTICAL_ADJUST * 2) \
MCFG_SCREEN_UPDATE_DEVICE(_v9938_tag, v9938_device, screen_update) \
MCFG_SCREEN_PALETTE(_v9938_tag":palette")
#define MCFG_V99X8_INTERRUPT_CALLBACK(_irq) \
downcast<v99x8_device *>(device)->set_interrupt_callback(DEVCB_##_irq);
@ -58,7 +82,6 @@ public:
template<class _irq> void set_interrupt_callback(_irq irq) {
m_int_callback.set_callback(irq);
}
int interrupt ();
int get_transpen();
bitmap_ind16 &get_bitmap() { return m_bitmap; }
void update_mouse_state(int mx_delta, int my_delta, int button_state);
@ -80,7 +103,22 @@ public:
/* RESET pin */
void reset_line(int state) { if (state==ASSERT_LINE) device_reset(); }
static const int HTOTAL = 684;
static const int HVISIBLE = 544;
static const int VTOTAL_NTSC = 262;
static const int VTOTAL_PAL = 312;
static const int VVISIBLE_NTSC = 26 + 192 + 25;
static const int VVISIBLE_PAL = 53 + 192 + 49;
// Looking at some youtube videos of real units on real monitors
// there appear to be small vertical timing differences. Some (LCD)
// monitors show the full borders, other CRT monitors seem to
// display ~5 lines less at the top and bottom of the screen.
static const int VERTICAL_ADJUST = 5;
static const int TOP_ERASE = 13;
static const int VERTICAL_SYNC = 3;
protected:
static const device_timer_id TIMER_LINE = 0;
const address_space_config m_space_config;
address_space* m_vram_space;
@ -89,12 +127,17 @@ protected:
// device overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_DATA) const { return (spacenum == AS_DATA) ? &m_space_config : NULL; }
void configure_pal_ntsc();
void set_screen_parameters();
private:
// internal helpers
inline int position_offset(UINT8 value) { value &= 0x0f; return (value < 8) ? -value : 16 - value; }
void reset_palette();
void vram_write(int offset, int data);
int vram_read(int offset);
@ -220,6 +263,12 @@ private:
} ;
static const v99x8_mode s_modes[];
required_device<palette_device> m_palette;
emu_timer *m_line_timer;
UINT8 m_pal_ntsc;
int m_scanline_start;
int m_vblank_start;
int m_scanline_max;
int m_height;
protected:
static UINT16 s_pal_indYJK[0x20000];
};

View File

@ -69,18 +69,24 @@ class big10_state : public driver_device
{
public:
big10_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_v9938(*this, "v9938") ,
m_maincpu(*this, "maincpu") { }
: driver_device(mconfig, type, tag)
, m_v9938(*this, "v9938")
, m_maincpu(*this, "maincpu")
, m_in1(*this, "IN1")
, m_in2(*this, "IN2")
, m_in3(*this, "IN3")
{ }
required_device<v9938_device> m_v9938;
UINT8 m_mux_data;
DECLARE_READ8_MEMBER(mux_r);
DECLARE_WRITE8_MEMBER(mux_w);
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(big10_interrupt);
DECLARE_WRITE_LINE_MEMBER(big10_vdp_interrupt);
required_device<cpu_device> m_maincpu;
required_ioport m_in1;
required_ioport m_in2;
required_ioport m_in3;
};
@ -96,10 +102,6 @@ WRITE_LINE_MEMBER(big10_state::big10_vdp_interrupt)
m_maincpu->set_input_line(0, (state ? ASSERT_LINE : CLEAR_LINE));
}
TIMER_DEVICE_CALLBACK_MEMBER(big10_state::big10_interrupt)
{
m_v9938->interrupt();
}
/*************************************
@ -125,9 +127,9 @@ READ8_MEMBER(big10_state::mux_r)
{
switch(m_mux_data)
{
case 1: return ioport("IN1")->read();
case 2: return ioport("IN2")->read();
case 4: return ioport("IN3")->read();
case 1: return m_in1->read();
case 2: return m_in2->read();
case 4: return m_in3->read();
}
return m_mux_data;
@ -238,22 +240,13 @@ static MACHINE_CONFIG_START( big10, big10_state )
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* guess */
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_IO_MAP(main_io)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", big10_state, big10_interrupt, "screen", 0, 1)
MCFG_NVRAM_ADD_0FILL("nvram")
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MASTER_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(big10_state, big10_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2)
MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -43,7 +43,11 @@ public:
m_tmp68301(*this, "tmp68301"),
m_v9958(*this, "v9958"),
m_dac1(*this, "dac1"),
m_dac2(*this, "dac2")
m_dac2(*this, "dac2"),
m_key(*this, "KEY"),
m_region_maincpu(*this, "maincpu"),
m_region_audiocpu(*this, "audiocpu"),
m_bank1(*this, "bank1")
{ }
required_device<cpu_device> m_maincpu;
@ -51,6 +55,10 @@ public:
required_device<v9958_device> m_v9958;
required_device<dac_device> m_dac1;
required_device<dac_device> m_dac2;
required_ioport_array<5> m_key;
required_memory_region m_region_maincpu;
required_memory_region m_region_audiocpu;
required_memory_bank m_bank1;
UINT16 m_mux_data;
@ -80,20 +88,15 @@ public:
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(csplayh5_irq);
DECLARE_WRITE_LINE_MEMBER(csplayh5_vdp0_interrupt);
void general_init(int patchaddress, int patchvalue);
void soundbank_w(int data);
};
#define USE_H8 0
// from MSX2 driver, may be not accurate for this HW
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
WRITE_LINE_MEMBER(csplayh5_state::csplayh5_vdp0_interrupt)
{
/* this is not used as the v9938 interrupt callbacks are broken
@ -104,11 +107,11 @@ READ16_MEMBER(csplayh5_state::csplayh5_mux_r)
{
switch(m_mux_data)
{
case 0x01: return ioport("KEY0")->read();
case 0x02: return ioport("KEY1")->read();
case 0x04: return ioport("KEY2")->read();
case 0x08: return ioport("KEY3")->read();
case 0x10: return ioport("KEY4")->read();
case 0x01: return m_key[0]->read();
case 0x02: return m_key[1]->read();
case 0x04: return m_key[2]->read();
case 0x08: return m_key[3]->read();
case 0x10: return m_key[4]->read();
}
return 0xffff;
@ -177,11 +180,9 @@ sound HW is identical to Niyanpai
#define DAC_WRITE write_unsigned8
#endif
static void csplayh5_soundbank_w(running_machine &machine, int data)
void csplayh5_state::soundbank_w(int data)
{
UINT8 *SNDROM = machine.root_device().memregion("audiocpu")->base();
machine.root_device().membank("bank1")->set_base(&SNDROM[0x08000 + (0x8000 * (data & 0x03))]);
m_bank1->set_base(m_region_audiocpu->base() + 0x08000 + (0x8000 * (data & 0x03)));
}
READ8_MEMBER(csplayh5_state::csplayh5_sound_r)
@ -202,7 +203,7 @@ READ8_MEMBER(csplayh5_state::soundcpu_portd_r)
WRITE8_MEMBER(csplayh5_state::soundcpu_porta_w)
{
csplayh5_soundbank_w(machine(), data & 0x03);
soundbank_w(data & 0x03);
}
WRITE8_MEMBER(csplayh5_state::soundcpu_dac2_w)
@ -238,7 +239,7 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( csplayh5 )
PORT_START("KEY0")
PORT_START("KEY.0")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_PLAYER(1)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_PLAYER(1)
@ -256,7 +257,7 @@ static INPUT_PORTS_START( csplayh5 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("KEY1")
PORT_START("KEY.1")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) PORT_PLAYER(1)
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(1)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_PLAYER(1)
@ -274,7 +275,7 @@ static INPUT_PORTS_START( csplayh5 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("KEY2")
PORT_START("KEY.2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(1)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_PLAYER(1)
@ -292,7 +293,7 @@ static INPUT_PORTS_START( csplayh5 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("KEY3")
PORT_START("KEY.3")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_PLAYER(1)
@ -310,7 +311,7 @@ static INPUT_PORTS_START( csplayh5 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("KEY4")
PORT_START("KEY.4")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL ) PORT_PLAYER(1)
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_BIG ) PORT_PLAYER(1)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_FLIP_FLOP ) PORT_PLAYER(1)
@ -440,11 +441,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(csplayh5_state::csplayh5_irq)
if(scanline == 212*2)
m_tmp68301->external_interrupt_0();
if((scanline % 2) == 0)
{
m_v9958->interrupt();
}
}
static const z80_daisy_config daisy_chain_sound[] =
@ -458,7 +454,7 @@ static MACHINE_CONFIG_START( csplayh5, csplayh5_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",M68000,16000000) /* TMP68301-16 */
MCFG_CPU_PROGRAM_MAP(csplayh5_map)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("tmp68301", tmp68301_device, irq_callback)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", csplayh5_state, csplayh5_irq, "screen", 0, 1)
@ -486,15 +482,7 @@ static MACHINE_CONFIG_START( csplayh5, csplayh5_state )
/* video hardware */
MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL_21_4772MHz) // typical 9958 clock, not verified
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(csplayh5_state, csplayh5_vdp0_interrupt))
MCFG_SCREEN_ADD("screen",RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_UPDATE_DEVICE("v9958", v9958_device, screen_update)
MCFG_SCREEN_PALETTE("v9958:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL_21_4772MHz)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@ -515,13 +503,13 @@ MACHINE_CONFIG_END
***************************************************************************/
void general_init(running_machine &machine, int patchaddress, int patchvalue)
void csplayh5_state::general_init(int patchaddress, int patchvalue)
{
UINT16 *MAINROM = (UINT16 *)machine.root_device().memregion("maincpu")->base();
UINT8 *SNDROM = machine.root_device().memregion("audiocpu")->base();
UINT16 *MAINROM = (UINT16 *)m_region_maincpu->base();
UINT8 *SNDROM = m_region_audiocpu->base();
// initialize sound rom bank
csplayh5_soundbank_w(machine, 0);
soundbank_w(0);
/* patch DVD comms check */
MAINROM[patchaddress] = patchvalue;
@ -531,16 +519,16 @@ void general_init(running_machine &machine, int patchaddress, int patchvalue)
}
DRIVER_INIT_MEMBER(csplayh5_state,csplayh1) { general_init(machine(), 0x6880/2,0x6020); }
DRIVER_INIT_MEMBER(csplayh5_state,csplayh1) { general_init(0x6880/2, 0x6020); }
DRIVER_INIT_MEMBER(csplayh5_state,junai) { general_init(machine(), 0x679c/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,mjmania) { general_init(machine(), 0x6b96/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,junai2) { general_init(machine(), 0x6588/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,csplayh5) { general_init(machine(), 0x4cb4/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,bikiniko) { general_init(machine(), 0x585c/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,thenanpa) { general_init(machine(), 0x69ec/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,csplayh7) { general_init(machine(), 0x7a20/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,fuudol) { general_init(machine(), 0x9166/2,0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,junai) { general_init(0x679c/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,mjmania) { general_init(0x6b96/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,junai2) { general_init(0x6588/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,csplayh5) { general_init(0x4cb4/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,bikiniko) { general_init(0x585c/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,thenanpa) { general_init(0x69ec/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,csplayh7) { general_init(0x7a20/2, 0x6018); }
DRIVER_INIT_MEMBER(csplayh5_state,fuudol) { general_init(0x9166/2, 0x6018); }
/* TODO: correct rom labels*/
ROM_START( csplayh1 )

View File

@ -207,8 +207,17 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_v9938(*this, "v9938")
{ }
m_v9938(*this, "v9938"),
m_pl1(*this, "PL1"),
m_pl2(*this, "PL2"),
m_pl3(*this, "PL3"),
m_pl4(*this, "PL4"),
m_pl5(*this, "PL5"),
m_pl6(*this, "PL6"),
m_svc(*this, "SVC"),
m_dsw(*this, "DSW"),
m_unk(*this, "UNK")
{ }
UINT8 m_mux_data;
UINT8 m_main_nmi_enable;
@ -219,8 +228,17 @@ public:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<v9938_device> m_v9938;
required_ioport m_pl1;
required_ioport m_pl2;
required_ioport m_pl3;
required_ioport m_pl4;
required_ioport m_pl5;
required_ioport m_pl6;
required_ioport m_svc;
required_ioport m_dsw;
required_ioport m_unk;
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_READ8_MEMBER(mux_r);
DECLARE_WRITE8_MEMBER(control_w);
@ -231,7 +249,6 @@ public:
DECLARE_DRIVER_INIT(kas89);
virtual void machine_start();
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(kas89_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(kas89_nmi_cb);
TIMER_DEVICE_CALLBACK_MEMBER(kas89_sound_nmi_cb);
DECLARE_WRITE_LINE_MEMBER(kas89_vdp_interrupt);
@ -247,14 +264,6 @@ WRITE_LINE_MEMBER(kas89_state::kas89_vdp_interrupt)
m_maincpu->set_input_line(0, (state ? ASSERT_LINE : CLEAR_LINE));
}
TIMER_DEVICE_CALLBACK_MEMBER(kas89_state::kas89_interrupt)
{
int scanline = param;
if((scanline % 2) == 0)
m_v9938->interrupt();
}
/*************************************
* Machine Start & Reset *
@ -291,19 +300,19 @@ READ8_MEMBER(kas89_state::mux_r)
{
switch(m_mux_data)
{
case 0x01: return ioport("PL1")->read();
case 0x02: return ioport("PL2")->read();
case 0x04: return ioport("PL3")->read();
case 0x08: return ioport("PL4")->read();
case 0x10: return ioport("PL5")->read();
case 0x20: return ioport("PL6")->read();
case 0x01: return m_pl1->read();
case 0x02: return m_pl2->read();
case 0x04: return m_pl3->read();
case 0x08: return m_pl4->read();
case 0x10: return m_pl5->read();
case 0x20: return m_pl6->read();
case 0x40:
{
output_set_lamp_value(37, 1 - ((ioport("SVC")->read() >> 5) & 1)); /* Operator Key LAMP */
return ioport("SVC")->read();
output_set_lamp_value(37, 1 - ((m_svc->read() >> 5) & 1)); /* Operator Key LAMP */
return m_svc->read();
}
case 0x80: return ioport("DSW")->read(); /* Polled at $162a through NMI routine */
case 0x3f: return ioport("UNK")->read();
case 0x80: return m_dsw->read(); /* Polled at $162a through NMI routine */
case 0x3f: return m_unk->read();
}
logerror("Mux_data %02X\n", m_mux_data);
@ -754,7 +763,6 @@ static MACHINE_CONFIG_START( kas89, kas89_state )
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* Confirmed */
MCFG_CPU_PROGRAM_MAP(kas89_map)
MCFG_CPU_IO_MAP(kas89_io)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kas89_state, kas89_interrupt, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("kas89_nmi", kas89_state, kas89_nmi_cb, attotime::from_hz(138))
MCFG_CPU_ADD("audiocpu", Z80, MASTER_CLOCK/6) /* Confirmed */
@ -767,14 +775,7 @@ static MACHINE_CONFIG_START( kas89, kas89_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MASTER_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(kas89_state,kas89_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_SIZE(544, 524)
MCFG_SCREEN_VISIBLE_AREA(0, 544 - 1, 0, 480 - 1)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -209,7 +209,10 @@ public:
m_audiocpu(*this, "audiocpu"),
m_v9938(*this, "v9938"),
m_maincpu(*this, "maincpu"),
m_adpcm(*this, "adpcm") { }
m_adpcm(*this, "adpcm"),
m_hopper(*this, "hopper"),
m_bank1(*this, "bank1")
{ }
required_device<cpu_device> m_audiocpu;
required_device<v9938_device> m_v9938;
@ -230,11 +233,12 @@ public:
void update_sound_irq(UINT8 cause);
virtual void machine_start();
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_vdp_scanline);
DECLARE_WRITE_LINE_MEMBER(kurukuru_msm5205_vck);
DECLARE_WRITE_LINE_MEMBER(kurukuru_vdp_interrupt);
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_adpcm;
required_device<ticket_dispenser_device> m_hopper;
required_memory_bank m_bank1;
};
#define MAIN_CLOCK XTAL_21_4772MHz
@ -245,14 +249,6 @@ public:
#define HOPPER_PULSE 50 // time between hopper pulses in milliseconds
#define VDP_MEM 0x30000
/* from MSX2 driver, may be not accurate for this HW */
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
/*************************************************
* Interrupts *
@ -264,12 +260,6 @@ WRITE_LINE_MEMBER(kurukuru_state::kurukuru_vdp_interrupt)
}
TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_state::kurukuru_vdp_scanline)
{
m_v9938->interrupt();
}
void kurukuru_state::update_sound_irq(UINT8 cause)
{
m_sound_irq_cause = cause & 3;
@ -322,7 +312,7 @@ WRITE8_MEMBER(kurukuru_state::kurukuru_out_latch_w)
coin_counter_w(machine(), 0, data & 0x01); /* Coin Counter 1 */
coin_counter_w(machine(), 1, data & 0x20); /* Coin Counter 2 */
coin_lockout_global_w(machine(), data & 0x40); /* Coin Lock */
machine().device<ticket_dispenser_device>("hopper")->write(space, 0, (data & 0x40)); /* Hopper Motor */
m_hopper->write(space, 0, (data & 0x40)); /* Hopper Motor */
if (data & 0x9e)
logerror("kurukuru_out_latch_w %02X @ %04X\n", data, space.device().safe_pc());
@ -330,7 +320,7 @@ WRITE8_MEMBER(kurukuru_state::kurukuru_out_latch_w)
WRITE8_MEMBER(kurukuru_state::kurukuru_bankswitch_w)
{
membank("bank1")->set_entry(7); // remove banked rom
m_bank1->set_entry(7); // remove banked rom
/*
if bits 5,4 are 00,10,01 then IC10 is enabled
if bits 3,2 are 00,10,01 then IC18 is enabled
@ -342,7 +332,7 @@ WRITE8_MEMBER(kurukuru_state::kurukuru_bankswitch_w)
for (int chip = 0; chip < 3; chip++)
{
if ((data & 3) != 3)
membank("bank1")->set_entry((chip << 1) | (~data & 1));
m_bank1->set_entry((chip << 1) | (~data & 1));
data >>= 2;
}
}
@ -527,7 +517,7 @@ INPUT_PORTS_END
void kurukuru_state::machine_start()
{
membank("bank1")->configure_entries(0, 8, memregion("user1")->base(), 0x8000);
m_bank1->configure_entries(0, 8, memregion("user1")->base(), 0x8000);
}
void kurukuru_state::machine_reset()
@ -545,7 +535,6 @@ static MACHINE_CONFIG_START( kurukuru, kurukuru_state )
MCFG_CPU_ADD("maincpu",Z80, CPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(kurukuru_map)
MCFG_CPU_IO_MAP(kurukuru_io)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kurukuru_state, kurukuru_vdp_scanline, "screen", 0, 1)
MCFG_CPU_ADD("audiocpu", Z80, CPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(audio_map)
@ -556,15 +545,7 @@ static MACHINE_CONFIG_START( kurukuru, kurukuru_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MAIN_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(kurukuru_state,kurukuru_vdp_interrupt))
MCFG_SCREEN_ADD("screen",RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK)
MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )

View File

@ -197,7 +197,13 @@ public:
m_microtouch(*this, "microtouch") ,
m_uart(*this, "ns16550"),
m_maincpu(*this, "maincpu"),
m_palette(*this, "v9938_0:palette") { }
m_palette(*this, "v9938_0:palette"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_region_maincpu(*this, "maincpu"),
m_region_extra(*this, "extra")
{ }
UINT8* m_ram;
required_device<z80pio_device> m_z80pio_0;
@ -240,7 +246,6 @@ public:
DECLARE_MACHINE_START(meritm_crt260);
DECLARE_MACHINE_START(merit_common);
UINT32 screen_update_meritm(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(meritm_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(vblank_start_tick);
TIMER_DEVICE_CALLBACK_MEMBER(vblank_end_tick);
void meritm_crt250_switch_banks( );
@ -251,6 +256,11 @@ public:
DECLARE_WRITE_LINE_MEMBER(meritm_vdp1_interrupt);
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_memory_bank m_bank1;
optional_memory_bank m_bank2;
optional_memory_bank m_bank3;
required_memory_region m_region_maincpu;
optional_memory_region m_region_extra;
};
@ -295,17 +305,6 @@ int meritm_state::meritm_touch_coord_transform(int *touch_x, int *touch_y)
*************************************/
TIMER_DEVICE_CALLBACK_MEMBER(meritm_state::meritm_interrupt)
{
int scanline = param;
if((scanline % 2) == 0)
{
m_v9938_0->interrupt();
m_v9938_1->interrupt();
}
}
WRITE_LINE_MEMBER(meritm_state::meritm_vdp0_interrupt)
{
/* this is not used as the v9938 interrupt callbacks are broken
@ -368,7 +367,7 @@ void meritm_state::meritm_crt250_switch_banks( )
int rombank = (m_bank & 0x07) ^ 0x07;
//logerror( "CRT250: Switching banks: rom = %0x (bank = %x)\n", rombank, m_bank );
membank("bank1")->set_entry(rombank );
m_bank1->set_entry(rombank );
}
WRITE8_MEMBER(meritm_state::meritm_crt250_bank_w)
@ -385,9 +384,9 @@ void meritm_state::meritm_switch_banks( )
(m_psd_a15 & 0x1);
//logerror( "Switching banks: rom = %0x (bank = %x), ram = %0x\n", rombank, m_bank, rambank);
membank("bank1")->set_entry(rombank );
membank("bank2")->set_entry(rombank | 0x01);
membank("bank3")->set_entry(rambank);
m_bank1->set_entry(rombank );
m_bank2->set_entry(rombank | 0x01);
m_bank3->set_entry(rambank);
}
WRITE8_MEMBER(meritm_state::meritm_psd_a15_w)
@ -461,7 +460,7 @@ WRITE8_MEMBER(meritm_state::meritm_crt250_questions_bank_w)
default: logerror( "meritm_crt250_questions_bank_w: unknown data = %02x\n", data ); return;
}
logerror( "Reading question byte at %06X\n", questions_address | m_questions_loword_address);
*dst = memregion("extra")->base()[questions_address | m_questions_loword_address];
*dst = m_region_extra->base()[questions_address | m_questions_loword_address];
}
}
@ -1032,7 +1031,7 @@ MACHINE_START_MEMBER(meritm_state,merit_common)
void meritm_state::machine_start()
{
membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base(), 0x10000);
m_bank1->configure_entries(0, 8, m_region_maincpu->base(), 0x10000);
m_bank = 0xff;
meritm_crt250_switch_banks();
MACHINE_START_CALL_MEMBER(merit_common);
@ -1056,9 +1055,9 @@ MACHINE_START_MEMBER(meritm_state,meritm_crt260)
m_ram = auto_alloc_array(machine(), UINT8, 0x8000 );
machine().device<nvram_device>("nvram")->set_base(m_ram, 0x8000);
memset(m_ram, 0x00, 0x8000);
membank("bank1")->configure_entries(0, 128, memregion("maincpu")->base(), 0x8000);
membank("bank2")->configure_entries(0, 128, memregion("maincpu")->base(), 0x8000);
membank("bank3")->configure_entries(0, 4, m_ram, 0x2000);
m_bank1->configure_entries(0, 128, m_region_maincpu->base(), 0x8000);
m_bank2->configure_entries(0, 128, m_region_maincpu->base(), 0x8000);
m_bank3->configure_entries(0, 4, m_ram, 0x2000);
m_bank = 0xff;
m_psd_a15 = 0;
meritm_switch_banks();
@ -1068,14 +1067,6 @@ MACHINE_START_MEMBER(meritm_state,meritm_crt260)
save_pointer(NAME(m_ram), 0x8000);
}
// from MSX2 driver, may be not accurate for merit games
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
TIMER_DEVICE_CALLBACK_MEMBER(meritm_state::vblank_start_tick)
{
/* this is a workaround to signal the v9938 vblank interrupt correctly */
@ -1095,7 +1086,6 @@ static MACHINE_CONFIG_START( meritm_crt250, meritm_state )
MCFG_CPU_PROGRAM_MAP(meritm_crt250_map)
MCFG_CPU_IO_MAP(meritm_crt250_io_map)
MCFG_CPU_CONFIG(meritm_daisy_chain)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", meritm_state, meritm_interrupt, "screen", 0, 1)
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
MCFG_I8255_OUT_PORTB_CB(WRITE8(meritm_state, meritm_crt250_port_b_w)) // used LMP x DRIVE
@ -1128,15 +1118,8 @@ static MACHINE_CONFIG_START( meritm_crt250, meritm_state )
MCFG_V9938_ADD("v9938_1", "screen", 0x20000, SYSTEM_CLK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(meritm_state,meritm_vdp1_interrupt))
MCFG_SCREEN_ADD("screen",RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938_0", SYSTEM_CLK)
MCFG_SCREEN_UPDATE_DRIVER(meritm_state, screen_update_meritm)
MCFG_SCREEN_PALETTE("v9938_0:palette")
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -55,15 +55,37 @@ class sangho_state : public driver_device
{
public:
sangho_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_v9958(*this, "v9958") ,
m_maincpu(*this, "maincpu") { }
: driver_device(mconfig, type, tag)
, m_v9958(*this, "v9958")
, m_maincpu(*this, "maincpu")
, m_region_user1(*this, "user1")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
, m_bank3(*this, "bank3")
, m_bank4(*this, "bank4")
, m_bank5(*this, "bank5")
, m_bank6(*this, "bank6")
, m_bank7(*this, "bank7")
, m_bank8(*this, "bank8")
{ }
UINT8* m_ram;
UINT8 m_sexyboom_bank[8];
UINT8 m_pzlestar_mem_bank;
UINT8 m_pzlestar_rom_bank;
required_device<v9958_device> m_v9958;
required_device<cpu_device> m_maincpu;
required_memory_region m_region_user1;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
required_memory_bank m_bank5;
required_memory_bank m_bank6;
required_memory_bank m_bank7;
required_memory_bank m_bank8;
UINT8 m_sec_slot[4];
DECLARE_WRITE8_MEMBER(pzlestar_bank_w);
DECLARE_WRITE8_MEMBER(pzlestar_mem_bank_w);
DECLARE_READ8_MEMBER(pzlestar_mem_bank_r);
@ -72,12 +94,9 @@ public:
virtual void machine_start();
DECLARE_MACHINE_RESET(pzlestar);
DECLARE_MACHINE_RESET(sexyboom);
TIMER_DEVICE_CALLBACK_MEMBER(sangho_interrupt);
void pzlestar_map_banks();
void sexyboom_map_bank(int bank);
DECLARE_WRITE_LINE_MEMBER(msx_vdp_interrupt);
required_device<cpu_device> m_maincpu;
UINT8 m_sec_slot[4];
DECLARE_READ8_MEMBER(sec_slot_r);
DECLARE_WRITE8_MEMBER(sec_slot_w);
};
@ -97,15 +116,15 @@ void sangho_state::pzlestar_map_banks()
switch(slot_select)
{
case 0:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x3fff, "bank1");
m_maincpu->space(AS_PROGRAM).install_write_bank(0x0000, 0x3fff, "bank5");
membank("bank1")->set_base(m_ram);
membank("bank5")->set_base(m_ram);
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x3fff, m_bank1);
m_maincpu->space(AS_PROGRAM).install_write_bank(0x0000, 0x3fff, m_bank5);
m_bank1->set_base(m_ram);
m_bank5->set_base(m_ram);
break;
case 2:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x3fff, "bank1");
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x3fff, m_bank1);
m_maincpu->space(AS_PROGRAM).unmap_write(0x0000, 0x3fff);
membank("bank1")->set_base(memregion("user1")->base()+ 0x10000);
m_bank1->set_base(m_region_user1->base()+ 0x10000);
break;
case 1:
case 3:
@ -119,20 +138,20 @@ void sangho_state::pzlestar_map_banks()
switch(slot_select)
{
case 0:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, "bank2");
m_maincpu->space(AS_PROGRAM).install_write_bank(0x4000, 0x7fff, "bank6");
membank("bank2")->set_base(m_ram + 0x4000);
membank("bank6")->set_base(m_ram + 0x4000);
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, m_bank2);
m_maincpu->space(AS_PROGRAM).install_write_bank(0x4000, 0x7fff, m_bank6);
m_bank2->set_base(m_ram + 0x4000);
m_bank6->set_base(m_ram + 0x4000);
break;
case 2:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, "bank2");
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, m_bank2);
m_maincpu->space(AS_PROGRAM).unmap_write(0x4000, 0x7fff);
membank("bank2")->set_base(memregion("user1")->base()+ 0x18000);
m_bank2->set_base(m_region_user1->base()+ 0x18000);
break;
case 3:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, "bank2");
m_maincpu->space(AS_PROGRAM).install_read_bank(0x4000, 0x7fff, m_bank2);
m_maincpu->space(AS_PROGRAM).unmap_write(0x4000, 0x7fff);
membank("bank2")->set_base(memregion("user1")->base()+ 0x20000 + (m_pzlestar_rom_bank*0x8000) + 0x4000);
m_bank2->set_base(m_region_user1->base()+ 0x20000 + (m_pzlestar_rom_bank*0x8000) + 0x4000);
break;
case 1:
m_maincpu->space(AS_PROGRAM).unmap_read(0x4000, 0x7fff);
@ -145,15 +164,15 @@ void sangho_state::pzlestar_map_banks()
switch(slot_select)
{
case 0:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x8000, 0xbfff, "bank3");
m_maincpu->space(AS_PROGRAM).install_write_bank(0x8000, 0xbfff, "bank7");
membank("bank3")->set_base(m_ram + 0x8000);
membank("bank7")->set_base(m_ram + 0x8000);
m_maincpu->space(AS_PROGRAM).install_read_bank(0x8000, 0xbfff, m_bank3);
m_maincpu->space(AS_PROGRAM).install_write_bank(0x8000, 0xbfff, m_bank7);
m_bank3->set_base(m_ram + 0x8000);
m_bank7->set_base(m_ram + 0x8000);
break;
case 3:
m_maincpu->space(AS_PROGRAM).install_read_bank(0x8000, 0xbfff, "bank3");
m_maincpu->space(AS_PROGRAM).install_read_bank(0x8000, 0xbfff, m_bank3);
m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff);
membank("bank3")->set_base(memregion("user1")->base()+ 0x20000 + (m_pzlestar_rom_bank*0x8000));
m_bank3->set_base(m_region_user1->base()+ 0x20000 + (m_pzlestar_rom_bank*0x8000));
break;
case 1:
case 2:
@ -167,10 +186,10 @@ void sangho_state::pzlestar_map_banks()
switch(slot_select)
{
case 0:
m_maincpu->space(AS_PROGRAM).install_read_bank(0xc000, 0xffff, "bank4");
m_maincpu->space(AS_PROGRAM).install_write_bank(0xc000, 0xffff, "bank8");
membank("bank4")->set_base(m_ram + 0xc000);
membank("bank8")->set_base(m_ram + 0xc000);
m_maincpu->space(AS_PROGRAM).install_read_bank(0xc000, 0xffff, m_bank4);
m_maincpu->space(AS_PROGRAM).install_write_bank(0xc000, 0xffff, m_bank8);
m_bank4->set_base(m_ram + 0xc000);
m_bank8->set_base(m_ram + 0xc000);
break;
case 1:
case 2:
@ -204,38 +223,36 @@ READ8_MEMBER(sangho_state::pzlestar_mem_bank_r)
void sangho_state::sexyboom_map_bank(int bank)
{
UINT8 banknum, banktype;
char read_bank_name[6], write_bank_name[6];
memory_bank *read_bank[4] = { m_bank1, m_bank2, m_bank3, m_bank4 };
memory_bank *write_bank[4] = { m_bank5, m_bank6, m_bank7, m_bank8 };
banknum = m_sexyboom_bank[bank*2];
banktype = m_sexyboom_bank[bank*2 + 1];
sprintf(read_bank_name, "bank%d", bank+1);
sprintf(write_bank_name, "bank%d", bank+1+4);
UINT8 banknum = m_sexyboom_bank[bank*2];
UINT8 banktype = m_sexyboom_bank[bank*2 + 1];
if (banktype == 0)
{
if (banknum & 0x80)
{
// ram
membank(read_bank_name)->set_base(&m_ram[(banknum & 0x7f) * 0x4000]);
m_maincpu->space(AS_PROGRAM).install_write_bank(bank*0x4000, (bank+1)*0x4000 - 1, write_bank_name );
membank(write_bank_name)->set_base(&m_ram[(banknum & 0x7f) * 0x4000]);
read_bank[bank]->set_base(&m_ram[(banknum & 0x7f) * 0x4000]);
m_maincpu->space(AS_PROGRAM).install_write_bank(bank*0x4000, (bank+1)*0x4000 - 1, write_bank[bank] );
write_bank[bank]->set_base(&m_ram[(banknum & 0x7f) * 0x4000]);
}
else
{
// rom 0
membank(read_bank_name)->set_base(memregion("user1")->base()+0x4000*banknum);
read_bank[bank]->set_base(m_region_user1->base()+0x4000*banknum);
m_maincpu->space(AS_PROGRAM).unmap_write(bank*0x4000, (bank+1)*0x4000 - 1);
}
}
else if (banktype == 0x82)
{
membank(read_bank_name)->set_base(memregion("user1")->base()+0x20000+banknum*0x4000);
read_bank[bank]->set_base(m_region_user1->base()+0x20000+banknum*0x4000);
m_maincpu->space(AS_PROGRAM).unmap_write(bank*0x4000, (bank+1)*0x4000 - 1);
}
else if (banktype == 0x80)
{
membank(read_bank_name)->set_base(memregion("user1")->base()+0x120000+banknum*0x4000);
read_bank[bank]->set_base(m_region_user1->base()+0x120000+banknum*0x4000);
m_maincpu->space(AS_PROGRAM).unmap_write(bank*0x4000, (bank+1)*0x4000 - 1);
}
else
@ -438,35 +455,16 @@ WRITE_LINE_MEMBER(sangho_state::msx_vdp_interrupt)
m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
}
TIMER_DEVICE_CALLBACK_MEMBER(sangho_state::sangho_interrupt)
{
int scanline = param;
if((scanline % 2) == 0)
{
m_v9958->interrupt();
}
}
static MACHINE_CONFIG_START( pzlestar, sangho_state )
MCFG_CPU_ADD("maincpu", Z80,8000000) // ?
MCFG_CPU_PROGRAM_MAP(sangho_map)
MCFG_CPU_IO_MAP(pzlestar_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sangho_state, sangho_interrupt, "screen", 0, 1)
MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL_21_4772MHz) // typical 9958 clock, not verified
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(sangho_state,msx_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9958", v9958_device, screen_update)
MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2)
MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1)
MCFG_SCREEN_PALETTE("v9958:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL_21_4772MHz)
MCFG_MACHINE_RESET_OVERRIDE(sangho_state,pzlestar)
@ -482,19 +480,10 @@ static MACHINE_CONFIG_START( sexyboom, sangho_state )
MCFG_CPU_ADD("maincpu", Z80,8000000) // ?
MCFG_CPU_PROGRAM_MAP(sangho_map)
MCFG_CPU_IO_MAP(sexyboom_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sangho_state, sangho_interrupt, "screen", 0, 1)
MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL_21_4772MHz) // typical 9958 clock, not verified
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(sangho_state,msx_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9958", v9958_device, screen_update)
MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2)
MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1)
MCFG_SCREEN_PALETTE("v9958:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL_21_4772MHz)
MCFG_MACHINE_RESET_OVERRIDE(sangho_state,sexyboom)
@ -546,7 +535,7 @@ ROM_END
DRIVER_INIT_MEMBER(sangho_state,pzlestar)
{
UINT8 *ROM = memregion("user1")->base();
UINT8 *ROM = m_region_user1->base();
/* patch nasty looping check, related to sound? */
ROM[0x12ca7] = 0x00;

View File

@ -65,9 +65,27 @@ class sfkick_state : public driver_device
public:
sfkick_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_v9938(*this, "v9938"),
m_v9938(*this, "v9938"),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu") { }
m_soundcpu(*this, "soundcpu"),
m_region_bios(*this, "bios"),
m_region_extrom(*this, "extrom"),
m_region_banked(*this, "banked"),
m_region_cartridge(*this, "cartridge"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_bank4(*this, "bank4"),
m_bank5(*this, "bank5"),
m_bank6(*this, "bank6"),
m_bank7(*this, "bank7"),
m_bank8(*this, "bank8"),
m_in0(*this, "IN0"),
m_in1(*this, "IN1"),
m_dial(*this, "DIAL"),
m_dsw1(*this, "DSW1"),
m_dsw2(*this, "DSW2")
{ }
UINT8 *m_main_mem;
int m_bank_cfg;
@ -83,22 +101,32 @@ public:
DECLARE_WRITE8_MEMBER(ppi_port_c_w);
DECLARE_DRIVER_INIT(sfkick);
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(sfkick_interrupt);
void sfkick_remap_banks();
void sfkick_bank_set(int num, int data);
DECLARE_WRITE_LINE_MEMBER(irqhandler);
DECLARE_WRITE_LINE_MEMBER(sfkick_vdp_interrupt);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_memory_region m_region_bios;
required_memory_region m_region_extrom;
required_memory_region m_region_banked;
required_memory_region m_region_cartridge;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
required_memory_bank m_bank5;
required_memory_bank m_bank6;
required_memory_bank m_bank7;
required_memory_bank m_bank8;
required_ioport m_in0;
required_ioport m_in1;
required_ioport m_dial;
required_ioport m_dsw1;
required_ioport m_dsw2;
};
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
#define MASTER_CLOCK XTAL_21_4772MHz
@ -106,11 +134,11 @@ READ8_MEMBER(sfkick_state::ppi_port_b_r)
{
switch(m_input_mux&0x0f)
{
case 0: return ioport("IN0")->read();
case 1: return ioport("IN1")->read();
case 2: return BITSWAP8(ioport("DIAL")->read(),4,5,6,7,3,2,1,0);
case 3: return ioport("DSW2")->read();
case 4: return ioport("DSW1")->read();
case 0: return m_in0->read();
case 1: return m_in1->read();
case 2: return BITSWAP8(m_dial->read(),4,5,6,7,3,2,1,0);
case 3: return m_dsw2->read();
case 4: return m_dsw1->read();
}
return 0xff;
}
@ -122,33 +150,33 @@ void sfkick_state::sfkick_remap_banks()
{
case 0: /* bios */
{
UINT8 *mem = memregion("bios")->base();
membank("bank1")->set_base(mem);
membank("bank2")->set_base(mem+0x2000);
UINT8 *mem = m_region_bios->base();
m_bank1->set_base(mem);
m_bank2->set_base(mem+0x2000);
}
break;
case 1: /* ext rom */
{
UINT8 *mem = memregion("extrom")->base();
membank("bank1")->set_base(mem+0x4000);
membank("bank2")->set_base(mem+0x6000);
UINT8 *mem = m_region_extrom->base();
m_bank1->set_base(mem+0x4000);
m_bank2->set_base(mem+0x6000);
}
break;
case 2: /* banked */
{
UINT8 *mem = memregion("banked")->base();
membank("bank1")->set_base(mem+0x2000*m_bank[0]);
membank("bank2")->set_base(mem+0x2000*m_bank[1]);
UINT8 *mem = m_region_banked->base();
m_bank1->set_base(mem+0x2000*m_bank[0]);
m_bank2->set_base(mem+0x2000*m_bank[1]);
}
break;
case 3: /* unknown */
{
UINT8 *mem = memregion("banked")->base();
membank("bank1")->set_base(mem+0x18000);
membank("bank2")->set_base(mem+0x18000);
UINT8 *mem = m_region_banked->base();
m_bank1->set_base(mem+0x18000);
m_bank2->set_base(mem+0x18000);
}
break;
}
@ -158,26 +186,26 @@ void sfkick_state::sfkick_remap_banks()
{
case 0: /* bios - upper part */
{
UINT8 *mem = memregion("bios")->base();
membank("bank3")->set_base(mem+0x4000);
membank("bank4")->set_base(mem+0x6000);
UINT8 *mem = m_region_bios->base();
m_bank3->set_base(mem+0x4000);
m_bank4->set_base(mem+0x6000);
}
break;
case 1: /* unknown */
case 3:
{
UINT8 *mem = memregion("banked")->base();
membank("bank3")->set_base(mem+0x18000);
membank("bank4")->set_base(mem+0x18000);
UINT8 *mem = m_region_banked->base();
m_bank3->set_base(mem+0x18000);
m_bank4->set_base(mem+0x18000);
}
break;
case 2: /* banked */
{
UINT8 *mem = memregion("banked")->base();
membank("bank3")->set_base(mem+0x2000*m_bank[2]);
membank("bank4")->set_base(mem+0x2000*m_bank[3]);
UINT8 *mem = m_region_banked->base();
m_bank3->set_base(mem+0x2000*m_bank[2]);
m_bank4->set_base(mem+0x2000*m_bank[3]);
}
break;
}
@ -187,26 +215,26 @@ void sfkick_state::sfkick_remap_banks()
{
case 0: /* cartridge */
{
UINT8 *mem = memregion("cartridge")->base();
membank("bank5")->set_base(mem+0x4000);
membank("bank6")->set_base(mem+0x6000);
UINT8 *mem = m_region_cartridge->base();
m_bank5->set_base(mem+0x4000);
m_bank6->set_base(mem+0x6000);
}
break;
case 1: /* unknown */
case 3:
{
UINT8 *mem = memregion("banked")->base();
membank("bank5")->set_base(mem+0x18000);
membank("bank6")->set_base(mem+0x18000);
UINT8 *mem = m_region_banked->base();
m_bank5->set_base(mem+0x18000);
m_bank6->set_base(mem+0x18000);
}
break;
case 2: /* banked */
{
UINT8 *mem = memregion("banked")->base();
membank("bank5")->set_base(mem+0x2000*m_bank[4]);
membank("bank6")->set_base(mem+0x2000*m_bank[5]);
UINT8 *mem = m_region_banked->base();
m_bank5->set_base(mem+0x2000*m_bank[4]);
m_bank6->set_base(mem+0x2000*m_bank[5]);
}
break;
}
@ -217,24 +245,24 @@ void sfkick_state::sfkick_remap_banks()
case 0: /* unknown */
case 1:
{
UINT8 *mem = memregion("banked")->base();
membank("bank7")->set_base(mem+0x18000);
membank("bank8")->set_base(mem+0x18000);
UINT8 *mem = m_region_banked->base();
m_bank7->set_base(mem+0x18000);
m_bank8->set_base(mem+0x18000);
}
break;
case 2: /* banked */
{
UINT8 *mem = memregion("banked")->base();
membank("bank7")->set_base(mem+0x2000*m_bank[6]);
membank("bank8")->set_base(mem+0x2000*m_bank[7]);
UINT8 *mem = m_region_banked->base();
m_bank7->set_base(mem+0x2000*m_bank[6]);
m_bank8->set_base(mem+0x2000*m_bank[7]);
}
break;
case 3: /* RAM */
{
membank("bank7")->set_base(m_main_mem);
membank("bank8")->set_base(m_main_mem+0x2000);
m_bank7->set_base(m_main_mem);
m_bank8->set_base(m_main_mem+0x2000);
}
break;
}
@ -447,11 +475,6 @@ void sfkick_state::machine_reset()
sfkick_remap_banks();
}
TIMER_DEVICE_CALLBACK_MEMBER(sfkick_state::sfkick_interrupt)
{
m_v9938->interrupt();
}
WRITE_LINE_MEMBER(sfkick_state::irqhandler)
{
m_soundcpu->set_input_line_and_vector(0, state ? ASSERT_LINE : CLEAR_LINE, 0xff);
@ -462,7 +485,6 @@ static MACHINE_CONFIG_START( sfkick, sfkick_state )
MCFG_CPU_ADD("maincpu",Z80,MASTER_CLOCK/6)
MCFG_CPU_PROGRAM_MAP(sfkick_map)
MCFG_CPU_IO_MAP(sfkick_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sfkick_state, sfkick_interrupt, "screen", 0, 1)
MCFG_QUANTUM_TIME(attotime::from_hz(60000))
@ -472,14 +494,7 @@ static MACHINE_CONFIG_START( sfkick, sfkick_state )
MCFG_V9938_ADD("v9938", "screen", 0x80000, MASTER_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(sfkick_state,sfkick_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK)
MCFG_DEVICE_ADD("ppi8255", I8255A, 0)
MCFG_I8255_OUT_PORTA_CB(WRITE8(sfkick_state, ppi_port_a_w))

View File

@ -53,7 +53,9 @@ public:
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_subcpu(*this, "sub"),
m_msm(*this, "msm") { }
m_msm(*this, "msm"),
m_bank1(*this, "bank1")
{ }
required_device<v9938_device> m_v9938;
@ -78,7 +80,6 @@ public:
virtual void machine_reset();
TIMER_CALLBACK_MEMBER(subcpu_suspend);
TIMER_CALLBACK_MEMBER(subcpu_resume);
TIMER_DEVICE_CALLBACK_MEMBER(sothello_interrupt);
DECLARE_WRITE_LINE_MEMBER(irqhandler);
DECLARE_WRITE_LINE_MEMBER(adpcm_int);
DECLARE_WRITE_LINE_MEMBER(sothello_vdp_interrupt);
@ -87,6 +88,7 @@ public:
required_device<cpu_device> m_soundcpu;
required_device<cpu_device> m_subcpu;
required_device<msm5205_device> m_msm;
required_memory_bank m_bank1;
};
@ -104,7 +106,7 @@ public:
void sothello_state::machine_start()
{
membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x4000);
m_bank1->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x4000);
}
WRITE8_MEMBER(sothello_state::bank_w)
@ -117,7 +119,7 @@ WRITE8_MEMBER(sothello_state::bank_w)
case 4: bank=2; break;
case 8: bank=3; break;
}
membank("bank1")->set_entry(bank);
m_bank1->set_entry(bank);
}
TIMER_CALLBACK_MEMBER(sothello_state::subcpu_suspend)
@ -336,11 +338,6 @@ WRITE_LINE_MEMBER(sothello_state::sothello_vdp_interrupt)
m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
}
TIMER_DEVICE_CALLBACK_MEMBER(sothello_state::sothello_interrupt)
{
m_v9938->interrupt();
}
WRITE_LINE_MEMBER(sothello_state::adpcm_int)
{
/* only 4 bits are used */
@ -358,7 +355,6 @@ static MACHINE_CONFIG_START( sothello, sothello_state )
MCFG_CPU_ADD("maincpu",Z80, MAINCPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(maincpu_mem_map)
MCFG_CPU_IO_MAP(maincpu_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sothello_state, sothello_interrupt, "screen", 0, 1)
MCFG_CPU_ADD("soundcpu",Z80, SOUNDCPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(soundcpu_mem_map)
@ -372,14 +368,7 @@ static MACHINE_CONFIG_START( sothello, sothello_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MAIN_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(sothello_state,sothello_vdp_interrupt))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2)
MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -35,8 +35,10 @@ class tonton_state : public driver_device
public:
tonton_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_v9938(*this, "v9938") ,
m_maincpu(*this, "maincpu") { }
m_v9938(*this, "v9938"),
m_maincpu(*this, "maincpu"),
m_hopper(*this, "hopper")
{ }
required_device<v9938_device> m_v9938;
DECLARE_WRITE8_MEMBER(tonton_outport_w);
@ -44,9 +46,9 @@ public:
DECLARE_WRITE8_MEMBER(ay_bout_w);
virtual void machine_start();
virtual void machine_reset();
TIMER_DEVICE_CALLBACK_MEMBER(tonton_interrupt);
DECLARE_WRITE_LINE_MEMBER(tonton_vdp0_interrupt);
required_device<cpu_device> m_maincpu;
required_device<ticket_dispenser_device> m_hopper;
};
#define MAIN_CLOCK XTAL_21_4772MHz
@ -57,15 +59,6 @@ public:
#define VDP_MEM 0x30000
/* from MSX2 driver, may be not accurate for this HW */
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
/*************************************************
* Video Hardware *
*************************************************/
@ -84,7 +77,7 @@ WRITE8_MEMBER(tonton_state::tonton_outport_w)
{
coin_counter_w(machine(), offset, data & 0x01);
coin_lockout_global_w(machine(), data & 0x02); /* Coin Lock */
machine().device<ticket_dispenser_device>("hopper")->write(space, 0, (data & 0x02)); /* Hopper Motor */
m_hopper->write(space, 0, (data & 0x02)); /* Hopper Motor */
// if(data & 0xfe)
// logerror("%02x %02x\n",data,offset);
@ -213,12 +206,6 @@ void tonton_state::machine_reset()
* R/W Handlers and Interrupt Routines *
*************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(tonton_state::tonton_interrupt)
{
m_v9938->interrupt();
}
WRITE8_MEMBER(tonton_state::ay_aout_w)
{
logerror("AY8910: Port A out: %02X\n", data);
@ -239,7 +226,6 @@ static MACHINE_CONFIG_START( tonton, tonton_state )
MCFG_CPU_ADD("maincpu",Z80, CPU_CLOCK) /* Guess. According to other MSX2 based gambling games */
MCFG_CPU_PROGRAM_MAP(tonton_map)
MCFG_CPU_IO_MAP(tonton_io)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tonton_state, tonton_interrupt, "screen", 0, 1)
MCFG_NVRAM_ADD_0FILL("nvram")
@ -247,16 +233,7 @@ static MACHINE_CONFIG_START( tonton, tonton_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MAIN_CLOCK)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(tonton_state,tonton_vdp0_interrupt))
MCFG_SCREEN_ADD("screen",RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK)
MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )

View File

@ -619,8 +619,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(geneve_state::geneve_hblank_interrupt)
{
int scanline = param;
machine().device<v9938_device>(VDP_TAG)->interrupt();
if (scanline == 0) // was 262
{
// TODO

View File

@ -1479,19 +1479,11 @@ static MACHINE_CONFIG_DERIVED( msx_tms9929, msx )
MACHINE_CONFIG_END
#define MSX2_XBORDER_PIXELS 16
#define MSX2_YBORDER_PIXELS 28
#define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2)
#define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2)
#define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2
#define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2
static MACHINE_CONFIG_START( msx2, msx_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_21_4772MHz/6) /* 3.579545 MHz */
MCFG_CPU_PROGRAM_MAP(msx_memory_map)
MCFG_CPU_IO_MAP(msx2_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", msx_state, msx2_interrupt, "screen", 0, 2)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
@ -1502,15 +1494,7 @@ static MACHINE_CONFIG_START( msx2, msx_state )
/* video hardware */
MCFG_V9938_ADD("v9938", "screen", 0x20000, XTAL_21_4772MHz)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_irq_source0))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update)
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_PALETTE("v9938:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", XTAL_21_4772MHz)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@ -1556,7 +1540,6 @@ static MACHINE_CONFIG_START( msx2p, msx_state )
MCFG_CPU_ADD("maincpu", Z80, XTAL_21_4772MHz/6) /* 3.579545 MHz */
MCFG_CPU_PROGRAM_MAP(msx_memory_map)
MCFG_CPU_IO_MAP(msx2p_io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", msx_state, msx2p_interrupt, "screen", 0, 2)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
@ -1567,15 +1550,7 @@ static MACHINE_CONFIG_START( msx2p, msx_state )
/* video hardware */
MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL_21_4772MHz)
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(msx_state,msx_irq_source0))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DEVICE("v9958", v9958_device, screen_update)
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
MCFG_SCREEN_PALETTE("v9958:palette")
MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL_21_4772MHz)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@ -1617,9 +1592,8 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( msx2_pal, msx2 )
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 313*2)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_DEVICE_REMOVE("screen")
MCFG_V99X8_SCREEN_ADD_PAL("screen", "v9938", XTAL_21_4772MHz)
MACHINE_CONFIG_END

View File

@ -101,7 +101,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(alphaW);
virtual void machine_start();
DECLARE_MACHINE_RESET(ti99_4p);
TIMER_DEVICE_CALLBACK_MEMBER(sgcpu_hblank_interrupt);
DECLARE_WRITE_LINE_MEMBER(set_tms9901_INT2_from_v9938);
@ -850,10 +849,6 @@ MACHINE_RESET_MEMBER(ti99_4p_state,ti99_4p)
m_9901_int = 0x03; // INT2* and INT1* set to 1, i.e. inactive
}
TIMER_DEVICE_CALLBACK_MEMBER(ti99_4p_state::sgcpu_hblank_interrupt)
{
machine().device<v9938_device>(VDP_TAG)->interrupt();
}
/*
Machine description.
@ -873,7 +868,6 @@ static MACHINE_CONFIG_START( ti99_4p_60hz, ti99_4p_state )
// painted. Accordingly, the full set of lines is refreshed at 30 Hz,
// not 60 Hz. This should be fixed in the v9938 emulation.
MCFG_TI_V9938_ADD(VIDEO_SYSTEM_TAG, 30, SCREEN_TAG, 2500, 512+32, (212+28)*2, ti99_4p_state, set_tms9901_INT2_from_v9938)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ti99_4p_state, sgcpu_hblank_interrupt, SCREEN_TAG, 0, 1)
// tms9901
MCFG_DEVICE_ADD(TMS9901_TAG, TMS9901, 3000000)

View File

@ -122,7 +122,6 @@ public:
// Interrupt triggers
DECLARE_INPUT_CHANGED_MEMBER( load_interrupt );
TIMER_DEVICE_CALLBACK_MEMBER(ti99_4ev_hblank_interrupt);
private:
void set_keyboard_column(int number, int data);
@ -1044,11 +1043,6 @@ MACHINE_CONFIG_END
replacing the console video processor.
*************************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(ti99_4x_state::ti99_4ev_hblank_interrupt)
{
machine().device<v9938_device>(VDP_TAG)->interrupt();
}
static MACHINE_CONFIG_START( ti99_4ev_60hz, ti99_4x_state )
/* CPU */
MCFG_TMS99xx_ADD("maincpu", TMS9900, 3000000, memmap, cru_map)
@ -1066,7 +1060,6 @@ static MACHINE_CONFIG_START( ti99_4ev_60hz, ti99_4x_state )
// painted. Accordingly, the full set of lines is refreshed at 30 Hz,
// not 60 Hz. This should be fixed in the v9938 emulation.
MCFG_TI_V9938_ADD(VIDEO_SYSTEM_TAG, 30, SCREEN_TAG, 2500, 512+32, (212+28)*2, ti99_4x_state, video_interrupt_in)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ti99_4x_state, ti99_4ev_hblank_interrupt, SCREEN_TAG, 0, 1)
/* Main board */
MCFG_DEVICE_ADD(TMS9901_TAG, TMS9901, 3000000)

View File

@ -200,8 +200,6 @@ public:
DECLARE_WRITE8_MEMBER(msx_psg_port_a_w);
DECLARE_WRITE8_MEMBER(msx_psg_port_b_w);
INTERRUPT_GEN_MEMBER(msx_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(msx2_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(msx2p_interrupt);
DECLARE_WRITE8_MEMBER(msx_ay8910_w);
void msx_memory_init();
void post_load();

View File

@ -212,16 +212,6 @@ void msx_state::post_load()
}
}
TIMER_DEVICE_CALLBACK_MEMBER(msx_state::msx2_interrupt)
{
m_v9938->interrupt();
}
TIMER_DEVICE_CALLBACK_MEMBER(msx_state::msx2p_interrupt)
{
m_v9958->interrupt();
}
INTERRUPT_GEN_MEMBER(msx_state::msx_interrupt)
{
m_mouse[0] = m_io_mouse0->read();