mirror of
https://github.com/holub/mame
synced 2025-04-21 16:01:56 +03:00
v9938.c: Fix MT#05622 and MT#05623
This commit is contained in:
parent
bfb9dd7b34
commit
cd7ed78f98
@ -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)
|
||||
|
@ -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];
|
||||
};
|
||||
|
@ -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")
|
||||
|
@ -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 )
|
||||
|
@ -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")
|
||||
|
@ -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 )
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
|
@ -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")
|
||||
|
@ -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 )
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user