diff --git a/src/devices/video/v9938.c b/src/devices/video/v9938.c index 3192593e76a..33d5b74d5fb 100644 --- a/src/devices/video/v9938.c +++ b/src/devices/video/v9938.c @@ -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; const device_type V9958 = &device_creator; + 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) diff --git a/src/devices/video/v9938.h b/src/devices/video/v9938.h index 4430c2ba4d5..1287edd41bf 100644 --- a/src/devices/video/v9938.h +++ b/src/devices/video/v9938.h @@ -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(device)->set_interrupt_callback(DEVCB_##_irq); @@ -58,7 +82,6 @@ public: template 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 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]; }; diff --git a/src/mame/drivers/big10.c b/src/mame/drivers/big10.c index e72d2d8eae8..be3858993f1 100644 --- a/src/mame/drivers/big10.c +++ b/src/mame/drivers/big10.c @@ -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 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 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") diff --git a/src/mame/drivers/csplayh5.c b/src/mame/drivers/csplayh5.c index 914c0de6bae..0d016cea4d0 100644 --- a/src/mame/drivers/csplayh5.c +++ b/src/mame/drivers/csplayh5.c @@ -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 m_maincpu; @@ -51,6 +55,10 @@ public: required_device m_v9958; required_device m_dac1; required_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 ) diff --git a/src/mame/drivers/kas89.c b/src/mame/drivers/kas89.c index 7c7d4bf1919..1b5fd70b3b0 100644 --- a/src/mame/drivers/kas89.c +++ b/src/mame/drivers/kas89.c @@ -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 m_maincpu; required_device m_audiocpu; - required_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") diff --git a/src/mame/drivers/kurukuru.c b/src/mame/drivers/kurukuru.c index 346924720b2..e4f6d5fbca8 100644 --- a/src/mame/drivers/kurukuru.c +++ b/src/mame/drivers/kurukuru.c @@ -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 m_audiocpu; required_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 m_maincpu; required_device m_adpcm; + required_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("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 ) diff --git a/src/mame/drivers/meritm.c b/src/mame/drivers/meritm.c index 67cf8e126ab..f765ac75de5 100644 --- a/src/mame/drivers/meritm.c +++ b/src/mame/drivers/meritm.c @@ -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 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 m_maincpu; required_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")->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") diff --git a/src/mame/drivers/sangho.c b/src/mame/drivers/sangho.c index 863194c7dc8..28f281c2a28 100644 --- a/src/mame/drivers/sangho.c +++ b/src/mame/drivers/sangho.c @@ -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 m_v9958; + required_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 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; diff --git a/src/mame/drivers/sfkick.c b/src/mame/drivers/sfkick.c index bb6b52d866e..563588635f4 100644 --- a/src/mame/drivers/sfkick.c +++ b/src/mame/drivers/sfkick.c @@ -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 m_maincpu; required_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)) diff --git a/src/mame/drivers/sothello.c b/src/mame/drivers/sothello.c index 5305fc60ced..3c42c552d4c 100644 --- a/src/mame/drivers/sothello.c +++ b/src/mame/drivers/sothello.c @@ -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 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 m_soundcpu; required_device m_subcpu; required_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") diff --git a/src/mame/drivers/tonton.c b/src/mame/drivers/tonton.c index 9747e06c20d..0cf6f675911 100644 --- a/src/mame/drivers/tonton.c +++ b/src/mame/drivers/tonton.c @@ -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 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 m_maincpu; + required_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("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 ) diff --git a/src/mess/drivers/geneve.c b/src/mess/drivers/geneve.c index af87a338470..c366b70b2e7 100644 --- a/src/mess/drivers/geneve.c +++ b/src/mess/drivers/geneve.c @@ -619,8 +619,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(geneve_state::geneve_hblank_interrupt) { int scanline = param; - machine().device(VDP_TAG)->interrupt(); - if (scanline == 0) // was 262 { // TODO diff --git a/src/mess/drivers/msx.c b/src/mess/drivers/msx.c index d6d03b292d3..3dfd67a935a 100644 --- a/src/mess/drivers/msx.c +++ b/src/mess/drivers/msx.c @@ -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 diff --git a/src/mess/drivers/ti99_4p.c b/src/mess/drivers/ti99_4p.c index 0f1e1e9e4c7..7122ab40a05 100644 --- a/src/mess/drivers/ti99_4p.c +++ b/src/mess/drivers/ti99_4p.c @@ -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(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) diff --git a/src/mess/drivers/ti99_4x.c b/src/mess/drivers/ti99_4x.c index 8980453a0fd..a90dc92aaf2 100644 --- a/src/mess/drivers/ti99_4x.c +++ b/src/mess/drivers/ti99_4x.c @@ -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(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) diff --git a/src/mess/includes/msx.h b/src/mess/includes/msx.h index 0d7b3930508..d849693ec14 100644 --- a/src/mess/includes/msx.h +++ b/src/mess/includes/msx.h @@ -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(); diff --git a/src/mess/machine/msx.c b/src/mess/machine/msx.c index 75488dad92a..92add704ebe 100644 --- a/src/mess/machine/msx.c +++ b/src/mess/machine/msx.c @@ -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();