diff --git a/.gitattributes b/.gitattributes index afa4cd39dcd..d61f8bfd1d7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2970,6 +2970,7 @@ src/mame/drivers/sidepckt.c svneol=native#text/plain src/mame/drivers/sigmab52.c svneol=native#text/plain src/mame/drivers/sigmab98.c svneol=native#text/plain src/mame/drivers/silkroad.c svneol=native#text/plain +src/mame/drivers/silvmil.c svneol=native#text/plain src/mame/drivers/simpl156.c svneol=native#text/plain src/mame/drivers/simpsons.c svneol=native#text/plain src/mame/drivers/skeetsht.c svneol=native#text/plain diff --git a/src/emu/cpu/m68000/68340sim.c b/src/emu/cpu/m68000/68340sim.c index 7cb2f3a4466..e5f20f0d6c6 100644 --- a/src/emu/cpu/m68000/68340sim.c +++ b/src/emu/cpu/m68000/68340sim.c @@ -4,7 +4,7 @@ #include "m68kcpu.h" -READ32_HANDLER( m68340_internal_sim_r ) +READ16_HANDLER( m68340_internal_sim_r ) { m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); m68340_sim* sim = m68k->m68340SIM; @@ -13,13 +13,13 @@ READ32_HANDLER( m68340_internal_sim_r ) if (sim) { int pc = cpu_get_pc(&space->device()); - logerror("%08x m68340_internal_sim_r %08x, (%08x)\n", pc, offset*4,mem_mask); + logerror("%08x m68340_internal_sim_r %04x, (%04x)\n", pc, offset*2,mem_mask); } - return 0x00000000; + return 0x0000; } -WRITE32_HANDLER( m68340_internal_sim_w ) +WRITE16_HANDLER( m68340_internal_sim_w ) { m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); m68340_sim* sim = m68k->m68340SIM; @@ -28,7 +28,7 @@ WRITE32_HANDLER( m68340_internal_sim_w ) if (sim) { int pc = cpu_get_pc(&space->device()); - logerror("%08x m68340_internal_sim_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); + logerror("%08x m68340_internal_sim_w %04x, %04x (%04x)\n", pc, offset*2,data,mem_mask); } } diff --git a/src/emu/cpu/m68000/68340sim.h b/src/emu/cpu/m68000/68340sim.h index 998433141ed..5999cbd6b84 100644 --- a/src/emu/cpu/m68000/68340sim.h +++ b/src/emu/cpu/m68000/68340sim.h @@ -1,6 +1,6 @@ -READ32_HANDLER( m68340_internal_sim_r ); -WRITE32_HANDLER( m68340_internal_sim_w ); +READ16_HANDLER( m68340_internal_sim_r ); +WRITE16_HANDLER( m68340_internal_sim_w ); class m68340_sim { diff --git a/src/emu/cpu/m68000/m68kcpu.c b/src/emu/cpu/m68000/m68kcpu.c index 5bd2d5d0253..487ad52be23 100644 --- a/src/emu/cpu/m68000/m68kcpu.c +++ b/src/emu/cpu/m68000/m68kcpu.c @@ -2741,7 +2741,7 @@ static WRITE32_HANDLER( m68340_internal_base_w ) { int base = m68k->m68340_base & 0xfffff000; - m68k->internal->install_legacy_readwrite_handler(base + 0x000, base + 0x05f, FUNC(m68340_internal_sim_r), FUNC(m68340_internal_sim_w)); + m68k->internal->install_legacy_readwrite_handler(base + 0x000, base + 0x05f, FUNC(m68340_internal_sim_r), FUNC(m68340_internal_sim_w),0xffffffff); m68k->internal->install_legacy_readwrite_handler(base + 0x600, base + 0x67f, FUNC(m68340_internal_timer_r), FUNC(m68340_internal_timer_w)); m68k->internal->install_legacy_readwrite_handler(base + 0x700, base + 0x723, FUNC(m68340_internal_serial_r), FUNC(m68340_internal_serial_w)); m68k->internal->install_legacy_readwrite_handler(base + 0x780, base + 0x7bf, FUNC(m68340_internal_dma_r), FUNC(m68340_internal_dma_w)); diff --git a/src/mame/drivers/bfm_sc4h.c b/src/mame/drivers/bfm_sc4h.c index 10feb3e5516..311fc2b8ee5 100644 --- a/src/mame/drivers/bfm_sc4h.c +++ b/src/mame/drivers/bfm_sc4h.c @@ -34,6 +34,10 @@ #include "machine/68681.h" #include "bfm_sc4.lh" #include "machine/bfm_bd1.h" +#include "video/awpvid.h" +#include "machine/steppers.h" // stepper motor + + class sc4_state : public driver_device { @@ -57,6 +61,15 @@ public: UINT8 vfd_ser_value; int vfd_ser_count; + + int m_reel_changed; + int m_reels; + int m_reel12_latch; + int m_reel3_latch; + int m_reel4_latch; + int m_reel56_latch; + int m_optic_pattern; + DECLARE_READ16_MEMBER(sc4_mem_r); DECLARE_WRITE16_MEMBER(sc4_mem_w); }; @@ -181,6 +194,9 @@ READ16_MEMBER(sc4_state::sc4_mem_r) return 0x0000; } +static WRITE8_HANDLER( bfm_sc4_reel4_w ); + + WRITE16_MEMBER(sc4_state::sc4_mem_w) { int pc = cpu_get_pc(&space.device()); @@ -222,6 +238,9 @@ WRITE16_MEMBER(sc4_state::sc4_mem_w) ymz280b_w(m_ymz,1, data & 0xff); break; + case 0x1330: + bfm_sc4_reel4_w(&space,0,data&0xf); + break; default: logerror("%08x maincpu write access offset %08x data %04x mem_mask %04x cs %d (LAMPS etc.)\n", pc, offset*2, data, mem_mask, cs); @@ -326,10 +345,51 @@ void bfm_sc4_write_serial_vfd(running_machine &machine, bool cs, bool clock, boo static WRITE8_HANDLER( bfm_sc4_68307_porta_w ) { - int pc = cpu_get_pc(&space->device()); - logerror("%08x bfm_sc4_68307_porta_w %04x\n", pc, data); + sc4_state *state = space->machine().driver_data(); + + state->m_reel12_latch = data; + + if ( stepper_update(0, data&0x0f ) ) state->m_reel_changed |= 0x01; + if ( stepper_update(1, (data>>4))&0x0f ) state->m_reel_changed |= 0x02; + + if ( stepper_optic_state(0) ) state->m_optic_pattern |= 0x01; + else state->m_optic_pattern &= ~0x01; + if ( stepper_optic_state(1) ) state->m_optic_pattern |= 0x02; + else state->m_optic_pattern &= ~0x02; + + awp_draw_reel(0); + awp_draw_reel(1); } +static WRITE8_HANDLER( bfm_sc4_reel3_w ) +{ + sc4_state *state = space->machine().driver_data(); + + state->m_reel3_latch = data; + + if ( stepper_update(2, data&0x0f ) ) state->m_reel_changed |= 0x04; + + if ( stepper_optic_state(2) ) state->m_optic_pattern |= 0x04; + else state->m_optic_pattern &= ~0x04; + + awp_draw_reel(2); +} + +static WRITE8_HANDLER( bfm_sc4_reel4_w ) +{ + sc4_state *state = space->machine().driver_data(); + + state->m_reel4_latch = data; + + if ( stepper_update(3, data&0x0f ) ) state->m_reel_changed |= 0x08; + + if ( stepper_optic_state(3) ) state->m_optic_pattern |= 0x08; + else state->m_optic_pattern &= ~0x08; + + awp_draw_reel(3); +} + + static WRITE16_HANDLER( bfm_sc4_68307_portb_w ) { int pc = cpu_get_pc(&space->device()); @@ -337,11 +397,9 @@ static WRITE16_HANDLER( bfm_sc4_68307_portb_w ) // serial output to the VFD at least.. logerror("%08x bfm_sc4_68307_portb_w %04x %04x\n", pc, data, mem_mask); - // this seems good for the earlier sets which use the VFD, but I think the later games use a generic DMD of some kind instead? - // we have game specific DMD roms in a couple of cases, is it possible ALL the later games are meant to have - // their own DMD roms rather than it being something generic? (if so we're missing a lot of DMD roms..) bfm_sc4_write_serial_vfd(space->machine(), (data & 0x4000)?1:0, (data & 0x1000)?1:0, !(data & 0x2000)?1:0); -// bfm_sc4_write_serial_vfd(space->machine(), (data & 0x1000)?1:0, (data & 0x4000)?0:1, !(data & 0x2000)?1:0); + + bfm_sc4_reel3_w(space, 0, (data&0x0f00)>>8); } @@ -359,6 +417,21 @@ static READ16_HANDLER( bfm_sc4_68307_portb_r ) return 0x0000;//0xffff;//space->machine().rand(); } +static MACHINE_RESET( sc4 ) +{ + sc4_state *state = machine.driver_data(); + + int pattern =0, i; + + for ( i = 0; i < state->m_reels; i++) + { + stepper_reset_position(i); + if ( stepper_optic_state(i) ) pattern |= 1<m_optic_pattern = pattern; +} + static MACHINE_START( sc4 ) { sc4_state *state = machine.driver_data(); @@ -373,7 +446,19 @@ static MACHINE_START( sc4 ) bfm_sc4_68307_portb_w ); BFM_BD1_init(0); + int reels = 6; + state->m_reels=reels; + // todo, make reel configs a per game structure + for ( int n = 0; n < reels; n++ ) + { + if (n!=3) stepper_config(machine, n, &starpoint_interface_48step); + else stepper_config(machine, n, &starpoint_interface_200step_reel); // luckb + } + if (reels) + { + awp_reel_setup(); + } } @@ -403,14 +488,28 @@ void bfm_sc4_duart_tx(device_t *device, int channel, UINT8 data) UINT8 bfm_sc4_duart_input_r(device_t *device) { - logerror("bfm_sc4_duart_input_r\n"); - return 0x2; + sc4_state *state = device->machine().driver_data(); +// printf("bfm_sc4_duart_input_r\n"); + return state->m_optic_pattern; } void bfm_sc4_duart_output_w(device_t *device, UINT8 data) { - logerror("bfm_sc4_duart_output_w\n"); -// cputag_set_input_line(device->machine(), "audiocpu", INPUT_LINE_RESET, data & 0x20 ? CLEAR_LINE : ASSERT_LINE); +// logerror("bfm_sc4_duart_output_w\n"); + sc4_state *state = device->machine().driver_data(); + + state->m_reel56_latch = data; + + if ( stepper_update(4, data&0x0f ) ) state->m_reel_changed |= 0x10; + if ( stepper_update(5, (data>>4)&0x0f) ) state->m_reel_changed |= 0x20; + + if ( stepper_optic_state(4) ) state->m_optic_pattern |= 0x10; + else state->m_optic_pattern &= ~0x10; + if ( stepper_optic_state(5) ) state->m_optic_pattern |= 0x20; + else state->m_optic_pattern &= ~0x20; + + awp_draw_reel(4); + awp_draw_reel(5); } @@ -458,6 +557,7 @@ MACHINE_CONFIG_START( sc4, sc4_state ) MCFG_CPU_PERIODIC_INT(sc4_fake_int_check,1000) MCFG_MACHINE_START( sc4 ) + MCFG_MACHINE_RESET( sc4 ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -465,7 +565,7 @@ MACHINE_CONFIG_START( sc4, sc4_state ) MCFG_DUART68681_ADD("duart68681", 16000000/4, bfm_sc4_duart68681_config) // ?? Mhz - MCFG_DEFAULT_LAYOUT(layout_bfm_sc4) + MCFG_DEFAULT_LAYOUT(layout_awpvid14) MCFG_SOUND_ADD("ymz", YMZ280B, 16000000) // ?? Mhz MCFG_SOUND_CONFIG(ymz280b_config) diff --git a/src/mame/drivers/ecoinf3.c b/src/mame/drivers/ecoinf3.c index efa9e2a4de3..c2b135eeb19 100644 --- a/src/mame/drivers/ecoinf3.c +++ b/src/mame/drivers/ecoinf3.c @@ -378,7 +378,7 @@ INPUT_PORTS_END static MACHINE_CONFIG_START( ecoinf3_pyramid, ecoinf3_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z180,4000000) // certainly not a plain z80 at least, invalid opcodes for that + MCFG_CPU_ADD("maincpu", Z180,16000000) // certainly not a plain z80 at least, invalid opcodes for that MCFG_CPU_PROGRAM_MAP(pyramid_memmap) MCFG_CPU_IO_MAP(pyramid_portmap) diff --git a/src/mame/drivers/jpmsys7.c b/src/mame/drivers/jpmsys7.c index 594d2ea4416..318301efe17 100644 --- a/src/mame/drivers/jpmsys7.c +++ b/src/mame/drivers/jpmsys7.c @@ -1,7 +1,7 @@ /* Unkonwn JPM Platform */ -/* seems to be 68340 (or similar) based, so probably after IMPACT - uses opcodes not handled by 68020, similar to SC5 */ +/* seems to be Coldfire based */ /* only Ker - Chinq has sound roms, they seem to map in cpu space, but are missing from the rest? */ -/* I don't think this is Pluto, or other known platforms */ +/* Could be Pluto 6? */ @@ -24,18 +24,24 @@ protected: static ADDRESS_MAP_START( jpmsys7_map, AS_PROGRAM, 32, jpmsys7_state ) - AM_RANGE(0x000000, 0x2fffff) AM_ROM + AM_RANGE(0x00000000, 0x002fffff) AM_ROM + AM_RANGE(0x10000000, 0x1000ffff) AM_RAM + AM_RANGE(0x20000018, 0x2000001b) AM_WRITENOP // large data upload like astra/pluto? + AM_RANGE(0x50000000, 0x50001fff) AM_RAM + +// AM_RANGE(0xf0000000, 0xf0000fff) AM_RAM + ADDRESS_MAP_END static INPUT_PORTS_START( jpmsys7 ) INPUT_PORTS_END static MACHINE_CONFIG_START( jpmsys7, jpmsys7_state ) - MCFG_CPU_ADD("maincpu", M68020, 16000000) // 68340? + MCFG_CPU_ADD("maincpu", MCF5206E, 40000000) // seems to be a Coldfire of some kind MCFG_CPU_PROGRAM_MAP(jpmsys7_map) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - /* unknown sound */ + /* unknown sound (probably DMA driven DAC) */ MACHINE_CONFIG_END diff --git a/src/mame/drivers/proconn.c b/src/mame/drivers/proconn.c index 239cb31d416..0c38fb2f9cf 100644 --- a/src/mame/drivers/proconn.c +++ b/src/mame/drivers/proconn.c @@ -13,6 +13,8 @@ #include "machine/z80ctc.h" #include "machine/z80sio.h" #include "sound/ay8910.h" +#include "video/awpvid.h" +#include "machine/roc10937.h" class proconn_state : public driver_device { @@ -121,8 +123,6 @@ protected: }; - - static ADDRESS_MAP_START( proconn_map, AS_PROGRAM, 8, proconn_state ) AM_RANGE(0x0000, 0xefff) AM_ROM AM_RANGE(0xf000, 0xffff) AM_RAM @@ -138,14 +138,14 @@ static ADDRESS_MAP_START( proconn_portmap, AS_IO, 8, proconn_state ) // sio (vfd should be connected to it?) AM_RANGE(0x00ff, 0x00ff) AM_READWRITE(sio_r0, sio_w0) - AM_RANGE(0x01ff, 0x01ff) AM_READWRITE(sio_r1, sio_w1) - AM_RANGE(0x02ff, 0x02ff) AM_READWRITE(sio_r2, sio_w2) + AM_RANGE(0x01ff, 0x01ff) AM_READWRITE(sio_r2, sio_w2) + AM_RANGE(0x02ff, 0x02ff) AM_READWRITE(sio_r1, sio_w1) AM_RANGE(0x03ff, 0x03ff) AM_READWRITE(sio_r3, sio_w3) // ctc AM_RANGE(0x00fe, 0x00fe) AM_READWRITE(ctc_r0, ctc_w0) - AM_RANGE(0x01fe, 0x01fe) AM_READWRITE(ctc_r1, ctc_w1) - AM_RANGE(0x02fe, 0x02fe) AM_READWRITE(ctc_r2, ctc_w2) + AM_RANGE(0x01fe, 0x01fe) AM_READWRITE(ctc_r2, ctc_w2) + AM_RANGE(0x02fe, 0x02fe) AM_READWRITE(ctc_r1, ctc_w1) AM_RANGE(0x03fe, 0x03fe) AM_READWRITE(ctc_r3, ctc_w3) // ay (meters connected to it?) @@ -246,10 +246,11 @@ static Z80PIO_INTERFACE( pio_interface_5 ) DEVCB_NULL }; + static Z80CTC_INTERFACE( ctc_intf ) { 0, // timer disables - DEVCB_NULL, // interrupt handler + DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), /* interrupt handler */ DEVCB_NULL, // ZC/TO0 callback DEVCB_NULL, // ZC/TO1 callback DEVCB_NULL // ZC/TO2 callback @@ -257,13 +258,17 @@ static Z80CTC_INTERFACE( ctc_intf ) static WRITE8_DEVICE_HANDLER( serial_transmit ) { - logerror("serial_transmit %02x\n", data); +// if (offset == 0) + { + ROC10937_newdata(0, data); + ROC10937_draw_16seg(0); + } } static int serial_receive(device_t *device, int channel) { - return -1; + return 0xff; } @@ -286,22 +291,45 @@ static const ay8910_interface ay8910_config = }; +static const z80_daisy_config z80_daisy_chain[] = +{ + { "z80ctc" }, + { "z80sio" }, + { NULL } +}; + +static MACHINE_RESET( proconn ) +{ + ROC10937_reset(0); + ROC10937_draw_16seg(0); +} + +static MACHINE_START( proconn ) +{ + ROC10937_init(0, ROCKWELL10937,1); +} static MACHINE_CONFIG_START( proconn, proconn_state ) MCFG_CPU_ADD("maincpu", Z80, 4000000) /* ?? Mhz */ + MCFG_CPU_CONFIG(z80_daisy_chain) MCFG_CPU_PROGRAM_MAP(proconn_map) MCFG_CPU_IO_MAP(proconn_portmap) - MCFG_Z80PIO_ADD( "z80pio_1", 1000000, pio_interface_1 ) /* ?? Mhz */ - MCFG_Z80PIO_ADD( "z80pio_2", 1000000, pio_interface_2 ) /* ?? Mhz */ - MCFG_Z80PIO_ADD( "z80pio_3", 1000000, pio_interface_3 ) /* ?? Mhz */ - MCFG_Z80PIO_ADD( "z80pio_4", 1000000, pio_interface_4 ) /* ?? Mhz */ - MCFG_Z80PIO_ADD( "z80pio_5", 1000000, pio_interface_5 ) /* ?? Mhz */ - MCFG_Z80CTC_ADD( "z80ctc", 1000000, ctc_intf ) /* ?? Mhz */ - MCFG_Z80SIO_ADD( "z80sio", 1000000, sio_intf ) /* ?? Mhz */ + MCFG_Z80PIO_ADD( "z80pio_1", 4000000, pio_interface_1 ) /* ?? Mhz */ + MCFG_Z80PIO_ADD( "z80pio_2", 4000000, pio_interface_2 ) /* ?? Mhz */ + MCFG_Z80PIO_ADD( "z80pio_3", 4000000, pio_interface_3 ) /* ?? Mhz */ + MCFG_Z80PIO_ADD( "z80pio_4", 4000000, pio_interface_4 ) /* ?? Mhz */ + MCFG_Z80PIO_ADD( "z80pio_5", 4000000, pio_interface_5 ) /* ?? Mhz */ + MCFG_Z80CTC_ADD( "z80ctc", 4000000, ctc_intf ) /* ?? Mhz */ + MCFG_Z80SIO_ADD( "z80sio", 4000000, sio_intf ) /* ?? Mhz */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_MACHINE_START( proconn ) + MCFG_MACHINE_RESET( proconn ) + + MCFG_DEFAULT_LAYOUT(layout_awpvid16) + MCFG_SOUND_ADD("aysnd", AY8910, 1000000) /* ?? Mhz */ // YM2149F on PC92? MCFG_SOUND_CONFIG(ay8910_config) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) diff --git a/src/mame/drivers/silvmil.c b/src/mame/drivers/silvmil.c new file mode 100644 index 00000000000..4cabd369d18 --- /dev/null +++ b/src/mame/drivers/silvmil.c @@ -0,0 +1,435 @@ +/* + Silver Millennium + + yet another Data East / Tumble Pop derived hardware + this one seems similar to (but not identical to) + the crospang.c hardware from F2 system + + todo: check clocks, refresh rate, audio balance + add dipswitches + +*/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "cpu/m68000/m68000.h" +#include "sound/okim6295.h" +#include "sound/3812intf.h" +#include "video/decospr.h" +#include "sound/2151intf.h" + + +class silvmil_state : public driver_device +{ +public: + silvmil_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { + + + } + + /* memory pointers */ + UINT16 * m_bg_videoram; + UINT16 * m_fg_videoram; + UINT16 * m_spriteram; + size_t m_spriteram_size; + + /* video-related */ + tilemap_t *m_bg_layer; + tilemap_t *m_fg_layer; + int m_silvmil_tilebank[4]; + int m_whichbank; + + DECLARE_WRITE16_MEMBER(silvmil_tilebank_w) + { + m_silvmil_tilebank[m_whichbank] = (data>>8) & 0x1f; + + // printf("%08x tilebank_w %04x (which = %04x)\n",pc, data, m_whichbank); + m_fg_layer->mark_all_dirty(); + m_bg_layer->mark_all_dirty(); + } + + DECLARE_WRITE16_MEMBER(silvmil_tilebank1_w) + { + m_whichbank = (data>>8)&0x3; + } + + DECLARE_WRITE16_MEMBER(silvmil_fg_scrolly_w) + { + m_fg_layer->set_scrolly(0, data + 8); + } + + DECLARE_WRITE16_MEMBER(silvmil_bg_scrolly_w) + { + m_bg_layer->set_scrolly(0, data + 8); + } + + DECLARE_WRITE16_MEMBER(silvmil_fg_scrollx_w) + { + m_fg_layer->set_scrollx(0, data); + } + + DECLARE_WRITE16_MEMBER(silvmil_bg_scrollx_w) + { + m_bg_layer->set_scrollx(0, data + 4); + } + + + DECLARE_WRITE16_MEMBER(silvmil_fg_videoram_w) + { + COMBINE_DATA(&m_fg_videoram[offset]); + m_fg_layer->mark_tile_dirty(offset); + } + + DECLARE_WRITE16_MEMBER(silvmil_bg_videoram_w) + { + COMBINE_DATA(&m_bg_videoram[offset]); + m_bg_layer->mark_tile_dirty(offset); + } + + DECLARE_WRITE16_MEMBER(silvmil_soundcmd_w) + { + if (ACCESSING_BITS_0_7) + { + soundlatch_byte_w(space, 0, data & 0xff); + machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); + + } + } + + +}; + + +static TILE_GET_INFO( get_bg_tile_info ) +{ + silvmil_state *state = machine.driver_data(); + int data = state->m_bg_videoram[tile_index]; + int tile = data & 0x3ff; + int color = (data >> 12) & 0x0f; + int bank = state->m_silvmil_tilebank[(data&0xc00)>>10]*0x400; + + SET_TILE_INFO(1, tile + bank, color + 0x20, 0); +} + +static TILE_GET_INFO( get_fg_tile_info ) +{ + silvmil_state *state = machine.driver_data(); + int data = state->m_fg_videoram[tile_index]; + int tile = data & 0x3ff; + int color = (data >> 12) & 0x0f; + int bank = state->m_silvmil_tilebank[(data&0xc00)>>10]*0x400; + + SET_TILE_INFO(1, tile + bank, color + 0x10, 0); +} + +static TILEMAP_MAPPER( deco16_scan_rows ) +{ + /* logical (col,row) -> memory offset */ + return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6); +} + +VIDEO_START( silvmil ) +{ + silvmil_state *state = machine.driver_data(); + state->m_bg_layer = tilemap_create(machine, get_bg_tile_info, deco16_scan_rows, 16, 16, 64, 32); + state->m_fg_layer = tilemap_create(machine, get_fg_tile_info, deco16_scan_rows, 16, 16, 64, 32); + + state->m_fg_layer->set_transparent_pen(0); +} + +SCREEN_UPDATE_IND16( silvmil ) +{ + silvmil_state *state = screen.machine().driver_data(); + + state->m_bg_layer->draw(bitmap, cliprect, 0, 0); + state->m_fg_layer->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); + return 0; +} + + + + +static ADDRESS_MAP_START( silvmil_map, AS_PROGRAM, 16, silvmil_state ) + AM_RANGE(0x000000, 0x0fffff) AM_ROM + + AM_RANGE(0x100000, 0x100001) AM_WRITE(silvmil_tilebank1_w) + AM_RANGE(0x100002, 0x100003) AM_WRITE(silvmil_fg_scrollx_w) + AM_RANGE(0x100004, 0x100005) AM_WRITE(silvmil_fg_scrolly_w) + AM_RANGE(0x100006, 0x100007) AM_WRITE(silvmil_bg_scrollx_w) + AM_RANGE(0x100008, 0x100009) AM_WRITE(silvmil_bg_scrolly_w) + AM_RANGE(0x10000e, 0x10000f) AM_WRITE(silvmil_tilebank_w) + + AM_RANGE(0x120000, 0x120fff) AM_RAM_WRITE(silvmil_fg_videoram_w) AM_BASE(m_fg_videoram) + AM_RANGE(0x122000, 0x122fff) AM_RAM_WRITE(silvmil_bg_videoram_w) AM_BASE(m_bg_videoram) + AM_RANGE(0x200000, 0x2005ff) AM_RAM_WRITE(paletteram_xRRRRRGGGGGBBBBB_word_w) AM_SHARE("paletteram") + AM_RANGE(0x210000, 0x2107ff) AM_RAM AM_BASE_SIZE(m_spriteram, m_spriteram_size) + AM_RANGE(0x270000, 0x270001) AM_WRITE(silvmil_soundcmd_w) + AM_RANGE(0x280000, 0x280001) AM_READ_PORT("P1_P2") + AM_RANGE(0x280002, 0x280003) AM_READ_PORT("COIN") + AM_RANGE(0x280004, 0x280005) AM_READ_PORT("DSW") + AM_RANGE(0x300000, 0x30ffff) AM_RAM +ADDRESS_MAP_END + + +static INPUT_PORTS_START( silvmil ) + PORT_START("P1_P2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START("COIN") + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0xfc00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW") + PORT_DIPNAME( 0x0001, 0x0001, "DSW1:1" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, "DSW1:2" ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, "DSW1:3" ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, "DSW1:4" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, "DSW1:5" ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, "DSW1:6" ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, "DSW1:7" ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, "DSW1:8" ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "DSW2:1" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, "DSW2:2" ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, "DSW2:3" ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, "DSW2:4" ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, "DSW2:5" ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, "DSW2:6" ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, "DSW2:7" ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, "DSW2:8" ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + +static const gfx_layout tlayout = +{ + 16,16, + RGN_FRAC(1,2), + 4, + { RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0, 8, 0 }, + { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7, + 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, + 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 }, + 64*8 +}; + + +static GFXDECODE_START( silvmil ) + GFXDECODE_ENTRY( "gfx2", 0, tlayout, 0, 64 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, tlayout, 0, 64 ) /* Sprites 16x16 */ +GFXDECODE_END + + +static MACHINE_START( silvmil ) +{ + +} + +static MACHINE_RESET( silvmil ) +{ + silvmil_state *state = machine.driver_data(); + state->m_silvmil_tilebank[0] = 0; + state->m_silvmil_tilebank[1] = 0; + state->m_silvmil_tilebank[2] = 0; + state->m_silvmil_tilebank[3] = 0; + state->m_whichbank = 0; +} + + +static ADDRESS_MAP_START( silvmil_sound_map, AS_PROGRAM, 8, silvmil_state ) + AM_RANGE(0x0000, 0xbfff) AM_ROM + AM_RANGE(0xd000, 0xd7ff) AM_RAM + AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE_LEGACY("ymsnd", ym2151_r, ym2151_w) + AM_RANGE(0xc002, 0xc002) AM_DEVREADWRITE("oki", okim6295_device, read, write) + AM_RANGE(0xc003, 0xc003) AM_DEVREADWRITE("oki", okim6295_device, read, write) + AM_RANGE(0xc006, 0xc006) AM_READ(soundlatch_byte_r) + AM_RANGE(0xc00f, 0xc00f) AM_WRITENOP // ?? +ADDRESS_MAP_END + +/* CLOCKS UNKNOWN! */ + +static void silvmil_irqhandler( device_t *device, int irq ) +{ + device_set_input_line(device->machine().device("audiocpu"), 0, irq ? ASSERT_LINE : CLEAR_LINE); +} + + +static const ym2151_interface silvmil_ym2151_interface = +{ + silvmil_irqhandler +}; + + +static MACHINE_CONFIG_START( silvmil, silvmil_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M68000, 14000000) // ?? + MCFG_CPU_PROGRAM_MAP(silvmil_map) + MCFG_CPU_VBLANK_INT("screen", irq6_line_hold) + + MCFG_CPU_ADD("audiocpu", Z80, 14000000/4) // ?? + MCFG_CPU_PROGRAM_MAP(silvmil_sound_map) + + MCFG_MACHINE_START(silvmil) + MCFG_MACHINE_RESET(silvmil) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(64*8, 64*8) + MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1) + MCFG_SCREEN_UPDATE_STATIC(silvmil) + + MCFG_PALETTE_LENGTH(0x300) + MCFG_GFXDECODE(silvmil) + + MCFG_VIDEO_START(silvmil) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 0); + decospr_device::set_is_bootleg(*device, true); + decospr_device::set_offsets(*device, 5,7); + + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_SOUND_ADD("ymsnd", YM2151, 3427190) // ?? + MCFG_SOUND_CONFIG(silvmil_ym2151_interface) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) + + MCFG_OKIM6295_ADD("oki", 1000000, OKIM6295_PIN7_HIGH) // ?? + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.2) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.2) +MACHINE_CONFIG_END + + +ROM_START( silvmil ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68k */ + ROM_LOAD16_BYTE( "d-13_u3.bin", 0x00000, 0x40000, CRC(46106c59) SHA1(ab965c1ea9ce89a67875530d76ac2bde7fd13e13) ) + ROM_LOAD16_BYTE( "d-14_u2.bin", 0x00001, 0x40000, CRC(65421eca) SHA1(5258df7ceab6427e1b6f93f51896f7f3a651300c) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* z80 */ + ROM_LOAD( "d-11_uz02.bin", 0x00000, 0x10000, CRC(b41289e6) SHA1(edf83206de418757a154d5a085b0b2fd97a77807) ) + + ROM_REGION( 0x40000, "oki", 0 ) /* samples */ + ROM_LOAD( "d-12_uz1.bin", 0x00000, 0x40000, CRC(a170d8a9) SHA1(77339382570498f9f6eeb80595bfe72fc853fd68)) + + ROM_REGION( 0x400000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "d-16_u41.bin", 0x000000, 0x20000, CRC(ff5ea605) SHA1(38e32f391b211ed280dd7f05eb13301cb9ddf57c) ) + ROM_CONTINUE ( 0x200000,0x20000 ) + ROM_CONTINUE ( 0x040000,0x20000 ) + ROM_CONTINUE ( 0x240000,0x20000 ) + ROM_LOAD16_BYTE( "d-15_u42.bin", 0x000001, 0x20000, CRC(5f72d6cc) SHA1(88641a42c0fc6e84ffd009fb40d0b1774e8c0630) ) + ROM_CONTINUE ( 0x200001,0x20000 ) + ROM_CONTINUE ( 0x040001,0x20000 ) + ROM_CONTINUE ( 0x240001,0x20000 ) + ROM_LOAD16_BYTE( "d-20_pat01.bin", 0x080001, 0x20000, CRC(cc4d3b49) SHA1(a2ef0d949443c9133487f83d5879daabca688d66) ) + ROM_CONTINUE ( 0x280001,0x20000 ) + ROM_CONTINUE ( 0x0c0001,0x20000 ) + ROM_CONTINUE ( 0x2c0001,0x20000 ) + ROM_LOAD16_BYTE( "d-17_pat11.bin", 0x080000, 0x20000, CRC(2facb3f1) SHA1(ea380345e1f15451e1ded5de178ec4648c33e2f0) ) + ROM_CONTINUE ( 0x280000,0x20000 ) + ROM_CONTINUE ( 0x0c0000,0x20000 ) + ROM_CONTINUE ( 0x2c0000,0x20000 ) + ROM_LOAD16_BYTE( "d-17_pat02.bin", 0x100001, 0x20000, CRC(addc5261) SHA1(73c5e29a39364c286a110678eb65b85ab1cf97d4) ) + ROM_CONTINUE ( 0x300001,0x20000) + ROM_CONTINUE ( 0x140001,0x20000) + ROM_CONTINUE ( 0x340001,0x20000) + ROM_LOAD16_BYTE( "d-18_pat12.bin", 0x100000, 0x20000, CRC(a429b237) SHA1(ab709b93c5232f3fdbb60954f93d04bb3828ac76) ) + ROM_CONTINUE ( 0x300000,0x20000) + ROM_CONTINUE ( 0x140000,0x20000) + ROM_CONTINUE ( 0x340000,0x20000) + ROM_LOAD16_BYTE( "d-18_pat03.bin", 0x180001, 0x20000, CRC(36b9c407) SHA1(291e29a2f5de6db639988e99a010fcac233387ad) ) + ROM_CONTINUE ( 0x380001,0x20000) + ROM_CONTINUE ( 0x1c0001,0x20000) + ROM_CONTINUE ( 0x3c0001,0x20000) + ROM_LOAD16_BYTE( "d-19_pat13.bin", 0x180000, 0x20000, CRC(af2507ce) SHA1(280b3995a6164e4ef834247d637ee46c61bf9950) ) + ROM_CONTINUE ( 0x380000,0x20000) + ROM_CONTINUE ( 0x1c0000,0x20000) + ROM_CONTINUE ( 0x3c0000,0x20000) + + ROM_REGION( 0x200000, "gfx2", 0 ) /* sprites */ + ROM_LOAD16_BYTE( "d-17_u53.bin", 0x000000, 0x80000, CRC(4d177bda) SHA1(980205dead92830362095dac61d2e99bf62f0f5d) ) + ROM_LOAD16_BYTE( "d-18_u54.bin", 0x000001, 0x80000, CRC(218c4471) SHA1(6a64d7a6c18eb078a5848f4f97aa0c65e74ad3d9) ) + ROM_LOAD16_BYTE( "d-19_u55.bin", 0x100000, 0x80000, CRC(59507521) SHA1(8e0eaf8ecdfcaefccb5657278ecb2fea7489afb3) ) + ROM_LOAD16_BYTE( "d-20_u56.bin", 0x100001, 0x80000, CRC(e67c2c7d) SHA1(cddfd6a3d934e71853af62e3d2bf312618c9b4ff) ) +ROM_END + + +static void tumblepb_gfx1_rearrange(running_machine &machine) +{ + UINT8 *rom = machine.region("gfx1")->base(); + int len = machine.region("gfx1")->bytes(); + int i; + + /* gfx data is in the wrong order */ + for (i = 0; i < len; i++) + { + if ((i & 0x20) == 0) + { + int t = rom[i]; rom[i] = rom[i + 0x20]; rom[i + 0x20] = t; + } + } + /* low/high half are also swapped */ + for (i = 0; i < len / 2; i++) + { + int t = rom[i]; rom[i] = rom[i + len / 2]; rom[i + len / 2] = t; + } +} + +static DRIVER_INIT( silvmil ) +{ + tumblepb_gfx1_rearrange(machine); +} + +GAME( 1995, silvmil, 0, silvmil, silvmil, silvmil, ROT270, "Para", "Silver Millennium", 0 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8f253133d14..52a73b2a9a3 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -10221,6 +10221,7 @@ supertnk // (c) 1981 VIDEO GAMES GmbH, W.-GERMANY crospang // (c) 1998 F2 System heuksun // (c) 1998 Oksan / F2 System bestri // (c) F2 System +silvmil // (c) 1995 Para funybubl // (c) 1999 In Chang Electronic Co funybublc // (c) 1999 Comad Industries dcheese // (c) 1993 HAR diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 9870385c4eb..f9a6c11c0d4 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -693,6 +693,7 @@ $(MAMEOBJ)/exidy.a: \ $(MAMEOBJ)/f32.a: \ $(DRIVERS)/crospang.o $(VIDEO)/crospang.o \ + $(DRIVERS)/silvmil.o \ $(DRIVERS)/f-32.o \ $(MAMEOBJ)/funworld.a: \