From d6cbe1bac2888fea746249578e803b8a2810525e Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Sun, 13 Apr 2014 15:09:29 +0000 Subject: [PATCH] Checkpoint --- src/emu/sound/scsp.h | 2 +- src/mame/audio/segam1audio.c | 4 +- src/mame/audio/segam1audio.h | 2 + src/mame/drivers/metro.c | 2 +- src/mame/drivers/model1.c | 2 - src/mame/drivers/model2.c | 80 +++++++++++++++++++++++------------- src/mame/includes/model1.h | 1 + src/mame/includes/model2.h | 4 ++ 8 files changed, 64 insertions(+), 33 deletions(-) diff --git a/src/emu/sound/scsp.h b/src/emu/sound/scsp.h index 7c7e200cf3f..a074afa9a0e 100644 --- a/src/emu/sound/scsp.h +++ b/src/emu/sound/scsp.h @@ -72,7 +72,7 @@ struct SCSP_SLOT class scsp_device : public device_t, - public device_sound_interface + public device_sound_interface { public: scsp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); diff --git a/src/mame/audio/segam1audio.c b/src/mame/audio/segam1audio.c index cd58ae3e05b..2a993ee2dfe 100644 --- a/src/mame/audio/segam1audio.c +++ b/src/mame/audio/segam1audio.c @@ -84,7 +84,8 @@ segam1audio_device::segam1audio_device(const machine_config &mconfig, const char m_audiocpu(*this, M68000_TAG), m_multipcm_1(*this, MULTIPCM_1_TAG), m_multipcm_2(*this, MULTIPCM_2_TAG), - m_ym(*this, YM3438_TAG) + m_ym(*this, YM3438_TAG), + m_main_irq_cb(*this) { } @@ -94,6 +95,7 @@ segam1audio_device::segam1audio_device(const machine_config &mconfig, const char void segam1audio_device::device_start() { + m_main_irq_cb.resolve_safe(); } //------------------------------------------------- diff --git a/src/mame/audio/segam1audio.h b/src/mame/audio/segam1audio.h index ae01a23504e..023d6e07e6f 100644 --- a/src/mame/audio/segam1audio.h +++ b/src/mame/audio/segam1audio.h @@ -15,6 +15,7 @@ #define MCFG_SEGAM1AUDIO_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, SEGAM1AUDIO, 0) + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -53,6 +54,7 @@ private: int m_to_68k[8]; int m_fifo_rptr; int m_fifo_wptr; + devcb2_write_line m_main_irq_cb; }; diff --git a/src/mame/drivers/metro.c b/src/mame/drivers/metro.c index 3a12cd79106..ed136f95dfe 100644 --- a/src/mame/drivers/metro.c +++ b/src/mame/drivers/metro.c @@ -1784,7 +1784,7 @@ WRITE16_MEMBER(metro_state::puzzlet_irq_enable_w) *m_irq_enable = data ^ 0xffff; } - /* FIXME: algorithm not yet understood. */ +/* FIXME: algorithm not yet understood. */ WRITE16_MEMBER(metro_state::vram_0_clr_w) { static int i; diff --git a/src/mame/drivers/model1.c b/src/mame/drivers/model1.c index 2165f16f17f..875544e1160 100644 --- a/src/mame/drivers/model1.c +++ b/src/mame/drivers/model1.c @@ -1508,8 +1508,6 @@ ROM_START( netmerc ) ROM_LOAD( "u2", 0x4000, 0x4000, CRC(c589f428) SHA1(98dc0114a5f89636b4e237ed954e19f1cfd186ab) ) ROM_END - - static MACHINE_CONFIG_START( model1, model1_state ) MCFG_CPU_ADD("maincpu", V60, 16000000) MCFG_CPU_PROGRAM_MAP(model1_mem) diff --git a/src/mame/drivers/model2.c b/src/mame/drivers/model2.c index 29955de2ea8..564a682fc7c 100644 --- a/src/mame/drivers/model2.c +++ b/src/mame/drivers/model2.c @@ -161,6 +161,7 @@ READ32_MEMBER(model2_state::copro_tgp_fifoin_pop) { UINT32 r = m_copro_fifoin_data[m_copro_fifoin_rpos++]; + if (m_copro_fifoin_rpos == COPRO_FIFOIN_SIZE) { m_copro_fifoin_rpos = 0; @@ -181,7 +182,7 @@ static void copro_fifoin_push(device_t *device, UINT32 data) return; } - //mame_printf_debug("COPRO FIFOIN at %08X, %08X, %f\n", device->safe_pc(), data, *(float*)&data); + //printf("COPRO FIFOIN at %08X, %08X, %f\n", device->safe_pc(), data, *(float*)&data); state->m_copro_fifoin_data[state->m_copro_fifoin_wpos++] = data; if (state->m_copro_fifoin_wpos == COPRO_FIFOIN_SIZE) @@ -339,10 +340,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(model2_state::model2_timer_cb) m_timers[tnum]->reset(); m_intreq |= (1<set_input_line(I960_IRQ2, ASSERT_LINE); - } + model2_check_irq_state(); m_timervals[tnum] = 0; m_timerrun[tnum] = 0; @@ -366,6 +364,7 @@ MACHINE_RESET_MEMBER(model2_state,model2_common) m_geocnt = 0; m_ctrlmode = 0; m_analog_channel = 0; + m_soundack = 0; m_timervals[0] = 0xfffff; m_timervals[1] = 0xfffff; @@ -483,7 +482,12 @@ READ32_MEMBER(model2_state::fifoctl_r) READ32_MEMBER(model2_state::videoctl_r) { - return (m_screen->frame_number() & 1) << 2; + return ((m_screen->frame_number() & 1) << 2) | (m_videocontrol & 3); +} + +WRITE32_MEMBER(model2_state::videoctl_w) +{ + COMBINE_DATA(&m_videocontrol); } CUSTOM_INPUT_MEMBER(model2_state::_1c00000_r) @@ -994,6 +998,17 @@ READ32_MEMBER(model2_state::model2_irq_r) return m_intreq; } +void model2_state::model2_check_irq_state() +{ + const int irq_type[16]= {I960_IRQ0,I960_IRQ1,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ2,I960_IRQ3,I960_IRQ3}; + + for(int i=0;i<16;i++) + { + if (m_intena & (1<set_input_line(irq_type[i], ASSERT_LINE); + } +} + WRITE32_MEMBER(model2_state::model2_irq_w) { m_maincpu->i960_noburst(); @@ -1001,10 +1016,12 @@ WRITE32_MEMBER(model2_state::model2_irq_w) if (offset) { COMBINE_DATA(&m_intena); + model2_check_irq_state(); return; } m_intreq &= data; + /* TODO: improve this */ UINT32 irq_ack = data ^ 0xffffffff; if(irq_ack & 1<<0) @@ -1015,6 +1032,7 @@ WRITE32_MEMBER(model2_state::model2_irq_w) } +/* TODO: rewrite this part. */ READ32_MEMBER(model2_state::model2_serial_r) { if ((offset == 0) && (mem_mask == 0xffff0000)) @@ -1025,8 +1043,16 @@ READ32_MEMBER(model2_state::model2_serial_r) return 0xffffffff; } + WRITE32_MEMBER(model2_state::model2o_serial_w) { + if(mem_mask == 0xffff0000) + { + if (!space.debugger_access()) + { + //m_soundack++; + } + } if (mem_mask == 0x0000ffff) { if (!m_m1audio->ready_r(space, 0)) @@ -1081,6 +1107,7 @@ static const UINT8 ZGUNProt[] = 0x94,0xD5,0x73,0x09,0xE4,0x3D,0x2D,0x92,0xC9,0xA7,0xA3,0x53,0x42,0x82,0x55,0x67, 0xE4,0x66,0xD0,0x4A,0x7D,0x4A,0x13,0xDE,0xD7,0x9F,0x38,0xAA,0x00,0x56,0x85,0x0A }; + static const UINT8 DCOPKey1326[]= { 0x43,0x66,0x54,0x11,0x99,0xfe,0xcc,0x8e,0xdd,0x87,0x11,0x89,0x22,0xdf,0x44,0x09 @@ -1376,7 +1403,7 @@ static ADDRESS_MAP_START( model2_base_mem, AS_PROGRAM, 32, model2_state ) AM_RANGE(0x00980004, 0x00980007) AM_READ(fifoctl_r) - AM_RANGE(0x0098000c, 0x0098000f) AM_READ(videoctl_r) + AM_RANGE(0x0098000c, 0x0098000f) AM_READWRITE(videoctl_r,videoctl_w) AM_RANGE(0x00e80000, 0x00e80007) AM_READWRITE(model2_irq_r, model2_irq_w) @@ -1489,6 +1516,7 @@ static ADDRESS_MAP_START( model2a_crx_mem, AS_PROGRAM, 32, model2_state ) AM_RANGE(0x01c00000, 0x01c00003) AM_READ_PORT("1c00000") AM_WRITE(ctrl0_w ) AM_RANGE(0x01c00004, 0x01c00007) AM_READ_PORT("1c00004") + AM_RANGE(0x01c0000c, 0x01c0000f) AM_READ_PORT("1c0000c") AM_RANGE(0x01c00010, 0x01c00013) AM_READ_PORT("1c00010") AM_RANGE(0x01c00014, 0x01c00017) AM_READ_PORT("1c00014") AM_RANGE(0x01c00018, 0x01c0001b) AM_READ(hotd_unk_r ) @@ -1580,6 +1608,10 @@ static INPUT_PORTS_START( model2 ) PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, driver_device,custom_port_read, "IN1") PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, driver_device,custom_port_read, "IN2") + PORT_START("1c0000c") + PORT_BIT( 0xfffffff7, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_START("1c00010") PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, driver_device,custom_port_read, "IN0") PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, driver_device,custom_port_read, "IN1") @@ -1940,18 +1972,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(model2_state::model2_interrupt) { int scanline = param; - if(scanline == 384) // 384 - { - m_intreq |= (1<<10); - if (m_intena & (1<<10)) - m_maincpu->set_input_line(I960_IRQ3, ASSERT_LINE); - } - - if(scanline == 0) + if(scanline == 384) { m_intreq |= (1<<0); - if (m_intena & (1<<0)) - m_maincpu->set_input_line(I960_IRQ0, ASSERT_LINE); + model2_check_irq_state(); + } + else if(scanline == 0) + { + /* From sound to main CPU (TODO: what enables this?) */ + m_intreq |= (1<<10); + model2_check_irq_state(); } } @@ -1962,22 +1992,19 @@ TIMER_DEVICE_CALLBACK_MEMBER(model2_state::model2c_interrupt) if(scanline == 0) // 384 { m_intreq |= (1<<10); - if (m_intena & (1<<10)) - m_maincpu->set_input_line(I960_IRQ3, ASSERT_LINE); + model2_check_irq_state(); } if(scanline == 256) { m_intreq |= (1<<2); - if (m_intena & (1<<2)) - m_maincpu->set_input_line(I960_IRQ2, ASSERT_LINE); + model2_check_irq_state(); } if(scanline == 128) { m_intreq |= (1<<0); - if (m_intena & (1<<0)) - m_maincpu->set_input_line(I960_IRQ0, ASSERT_LINE); + model2_check_irq_state(); } } @@ -2167,10 +2194,7 @@ static MACHINE_CONFIG_START( model2a, model2_state ) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK ) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(62*8, 48*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 48*8-1) + MCFG_SCREEN_RAW_PARAMS(25000000/2, 496+16, 0, 496, 384+16, 0, 384) // not accurate MCFG_SCREEN_UPDATE_DRIVER(model2_state, screen_update_model2) MCFG_PALETTE_ADD("palette", 8192) @@ -5640,7 +5664,7 @@ GAME( 1994, vcop, 0, model2o, vcop, driver_device, 0, ROT0, GAME( 1994, vcopa, 0, model2o, vcop, driver_device, 0, ROT0, "Sega", "Virtua Cop (Revision A)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) // Model 2A-CRX (TGPs, SCSP sound board) -GAME( 1995, manxtt, 0, manxttdx,model2, driver_device, 0, ROT0, "Sega", "Manx TT Superbike - DX (Revision D)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, manxtt, 0, manxttdx,model2, driver_device, 0, ROT0, "Sega", "Manx TT Superbike - DX (Revision D)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) GAME( 1995, manxttc, 0, model2a, model2, driver_device, 0, ROT0, "Sega", "Manx TT Superbike - Twin (Revision C)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) GAME( 1995, srallyc, 0, srallyc, srallyc, model2_state, srallyc, ROT0, "Sega", "Sega Rally Championship - TWIN (Revision C)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) GAME( 1995, srallycb, srallyc, srallyc, srallyc, model2_state, srallyc, ROT0, "Sega", "Sega Rally Championship - TWIN (Revision B)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h index 65ed738437e..4adfbdfb395 100644 --- a/src/mame/includes/model1.h +++ b/src/mame/includes/model1.h @@ -141,6 +141,7 @@ public: DECLARE_MACHINE_RESET(model1); DECLARE_VIDEO_START(model1); DECLARE_MACHINE_RESET(model1_vr); + DECLARE_WRITE_LINE_MEMBER(m1_to_main_irq); UINT32 screen_update_model1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void screen_eof_model1(screen_device &screen, bool state); TIMER_DEVICE_CALLBACK_MEMBER(model1_interrupt); diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h index d462e71cc87..2bba780dcbf 100644 --- a/src/mame/includes/model2.h +++ b/src/mame/includes/model2.h @@ -101,6 +101,9 @@ public: raster_state *m_raster; geo_state *m_geo; bitmap_rgb32 m_sys24_bitmap; + UINT32 m_videocontrol; + UINT32 m_soundack; + void model2_check_irq_state(); DECLARE_CUSTOM_INPUT_MEMBER(_1c00000_r); DECLARE_CUSTOM_INPUT_MEMBER(_1c0001c_r); @@ -112,6 +115,7 @@ public: DECLARE_WRITE32_MEMBER(analog_2b_w); DECLARE_READ32_MEMBER(fifoctl_r); DECLARE_READ32_MEMBER(videoctl_r); + DECLARE_WRITE32_MEMBER(videoctl_w); DECLARE_WRITE32_MEMBER(rchase2_devices_w); DECLARE_WRITE32_MEMBER(srallyc_devices_w); DECLARE_READ32_MEMBER(copro_prg_r);