diff options
author | Aaron Giles <aaron@aarongiles.com> | 2007-12-24 03:09:07 +0000 |
---|---|---|
committer | Aaron Giles <aaron@aarongiles.com> | 2007-12-24 03:09:07 +0000 |
commit | ec956ae1bf1485c2f2bec4852bebc0e58450baea (patch) | |
tree | 0d8d25d8afe746ece79ffe17c04f8d162fd6df8e | |
parent | 959d2d85bba3a89868e8e4287f89212e6d26c7db (diff) |
Further Zeus 2 implementation.
Hooked up ZPRAM for Zeus 2.
Fixed digital inputs for crusnexo.
Fixed default screen parameters to match the games.
-rw-r--r-- | src/mame/drivers/midzeus.c | 233 | ||||
-rw-r--r-- | src/mame/video/midzeus2.c | 72 |
2 files changed, 208 insertions, 97 deletions
diff --git a/src/mame/drivers/midzeus.c b/src/mame/drivers/midzeus.c index 32dadf4aab4..3e434447e29 100644 --- a/src/mame/drivers/midzeus.c +++ b/src/mame/drivers/midzeus.c @@ -35,6 +35,8 @@ static emu_timer * gun_timer[2]; static INT32 gun_x[2], gun_y[2]; static UINT32 *ram_base; +static UINT32 *zpram; +static size_t zpram_size; static UINT8 cmos_protected; static emu_timer *timer[2]; @@ -63,6 +65,8 @@ static MACHINE_RESET( midzeus ) gun_timer[0] = timer_alloc(invasn_gun_callback, NULL); gun_timer[1] = timer_alloc(invasn_gun_callback, NULL); + + cmos_protected = TRUE; } @@ -75,7 +79,7 @@ static MACHINE_RESET( midzeus ) static WRITE32_HANDLER( cmos_protect_w ) { - cmos_protected = 0; + cmos_protected = FALSE; } @@ -83,6 +87,7 @@ static WRITE32_HANDLER( cmos_w ) { if (!cmos_protected) COMBINE_DATA(generic_nvram32 + offset); + cmos_protected = TRUE; } @@ -92,6 +97,41 @@ static READ32_HANDLER( cmos_r ) } +static WRITE32_HANDLER( zpram_w ) +{ + /* ZPRAM seems to use the same protection control as CMOS */ +// if (!cmos_protected) + COMBINE_DATA(zpram + offset); + cmos_protected = TRUE; +} + + +static READ32_HANDLER( zpram_r ) +{ + return zpram[offset] | 0xffffff00; +} + + +static NVRAM_HANDLER( zeus2_nvram ) +{ + if (read_or_write) + { + mame_fwrite(file, generic_nvram, generic_nvram_size); + mame_fwrite(file, zpram, zpram_size); + } + else if (file) + { + mame_fread(file, generic_nvram, generic_nvram_size); + mame_fread(file, zpram, zpram_size); + } + else + { + memset(generic_nvram, 0xff, generic_nvram_size); + memset(zpram, 0xff, zpram_size); + } +} + + /************************************* * @@ -231,6 +271,7 @@ static READ32_HANDLER( invasn_gun_r ) // read 8d0003, check bit 1, skip some stuff if 0 // write junk to 9e0000 +static UINT32 *unknown_8a0000; static UINT32 *unknown_8d0000; static READ32_HANDLER( unknown_8d0000_r ) { @@ -252,6 +293,20 @@ static WRITE32_HANDLER( rombank_select_w ) memory_set_bank(1, data); } +static READ32_HANDLER( unknown_8a0000_r ) +{ + logerror("%06X:unknown_8a000_r(%02X)\n", activecpu_get_pc(), offset); + if (offset == 0) + return 0x30313042; + return unknown_8a0000[offset]; +} + +static WRITE32_HANDLER( unknown_8a0000_w ) +{ + logerror("%06X:unknown_8a000_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); + COMBINE_DATA(&unknown_8a0000[offset]); +} + static ADDRESS_MAP_START( zeus_map, ADDRESS_SPACE_PROGRAM, 32 ) ADDRESS_MAP_FLAGS( AMEF_UNMAP(1) ) @@ -275,8 +330,10 @@ static ADDRESS_MAP_START( zeus2_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x400000, 0x43ffff) AM_RAM AM_RANGE(0x808000, 0x80807f) AM_READWRITE(tms32031_control_r, tms32031_control_w) AM_BASE(&tms32031_control) AM_RANGE(0x880000, 0x8801ff) AM_READWRITE(zeus2_r, zeus2_w) AM_BASE(&zeusbase) + AM_RANGE(0x8a0000, 0x8a0027) AM_READWRITE(unknown_8a0000_r, unknown_8a0000_w) AM_BASE(&unknown_8a0000) AM_RANGE(0x8d0000, 0x8d0003) AM_READWRITE(unknown_8d0000_r, unknown_8d0000_w) AM_BASE(&unknown_8d0000) AM_RANGE(0x8d0005, 0x8d0005) AM_WRITE(rombank_select_w) + AM_RANGE(0x900000, 0x91ffff) AM_READWRITE(zpram_r, zpram_w) AM_BASE(&zpram) AM_SIZE(&zpram_size) AM_MIRROR(0x020000) AM_RANGE(0x990000, 0x99000f) AM_READWRITE(midway_ioasic_r, midway_ioasic_w) AM_RANGE(0x9e0000, 0x9e0000) AM_WRITENOP // watchdog? AM_RANGE(0x9f0000, 0x9f7fff) AM_READWRITE(cmos_r, cmos_w) AM_BASE(&generic_nvram32) AM_SIZE(&generic_nvram_size) @@ -425,7 +482,7 @@ static INPUT_PORTS_START( invasn ) PORT_DIPNAME( 0x0040, 0x0040, "Flip Y" ) PORT_DIPSETTING( 0x0040, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x0080, 0x0000, "Test Switch" ) + PORT_DIPNAME( 0x0080, 0x0080, "Test Switch" ) PORT_DIPSETTING( 0x0080, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) PORT_DIPNAME( 0x0100, 0x0100, "Mirrored Display" ) @@ -497,58 +554,58 @@ INPUT_PORTS_END static INPUT_PORTS_START( crusnexo ) PORT_START /* DS1 */ - PORT_DIPNAME( 0x0001, 0x0001, "Game Type" ) /* Manual states "*DIP 1, Switch 1 MUST be set */ - PORT_DIPSETTING( 0x0001, "Dedicated" ) /* to OFF position for proper operation" */ + PORT_DIPNAME( 0x001f, 0x001f, "Country Code" ) + PORT_DIPSETTING( 0x001f, DEF_STR( USA ) ) + PORT_DIPSETTING( 0x001e, "Germany" ) + PORT_DIPSETTING( 0x001d, "France" ) + PORT_DIPSETTING( 0x001c, "Canada" ) + PORT_DIPSETTING( 0x001b, "Switzerland" ) + PORT_DIPSETTING( 0x001a, "Italy" ) + PORT_DIPSETTING( 0x0019, "UK" ) + PORT_DIPSETTING( 0x0018, "Spain" ) + PORT_DIPSETTING( 0x0017, "Austrilia" ) + PORT_DIPSETTING( 0x0016, DEF_STR( Japan ) ) + PORT_DIPSETTING( 0x0015, "Taiwan" ) + PORT_DIPSETTING( 0x0014, "Austria" ) + PORT_DIPSETTING( 0x0013, "Belgium" ) + PORT_DIPSETTING( 0x000f, "Sweden" ) + PORT_DIPSETTING( 0x000e, "Findland" ) + PORT_DIPSETTING( 0x000d, "Netherlands" ) + PORT_DIPSETTING( 0x000c, "Norway" ) + PORT_DIPSETTING( 0x000b, "Denmark" ) + PORT_DIPSETTING( 0x000a, "Hungary" ) + PORT_DIPSETTING( 0x0008, "General" ) + PORT_DIPNAME( 0x0060, 0x0060, "Coin Mode" ) + PORT_DIPSETTING( 0x0060, "Mode 1" ) /* USA1/GER1/FRA1/SPN1/AUSTRIA1/GEN1/CAN1/SWI1/ITL1/JPN1/TWN1/BLGN1/NTHRLND1/FNLD1/NRWY1/DNMK1/HUN1 */ + PORT_DIPSETTING( 0x0040, "Mode 2" ) /* USA3/GER1/FRA1/SPN1/AUSTRIA1/GEN3/CAN2/SWI2/ITL2/JPN2/TWN2/BLGN2/NTHRLND2 */ + PORT_DIPSETTING( 0x0020, "Mode 3" ) /* USA7/GER1/FRA1/SPN1/AUSTRIA1/GEN5/CAN3/SWI3/ITL3/JPN3/TWN3/BLGN3 */ + PORT_DIPSETTING( 0x0000, "Mode 4" ) /* USA8/GER1/FRA1/SPN1/AUSTRIA1/GEN7 */ + PORT_DIPNAME( 0x0080, 0x0080, "Test Switch" ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off )) + PORT_DIPSETTING( 0x0000, DEF_STR( On )) + PORT_DIPNAME( 0x0100, 0x0100, "Game Type" ) /* Manual states "*DIP 1, Switch 1 MUST be set */ + PORT_DIPSETTING( 0x0100, "Dedicated" ) /* to OFF position for proper operation" */ PORT_DIPSETTING( 0x0000, "Kit" ) - PORT_DIPNAME( 0x0002, 0x0002, "Seat Motion" ) /* For dedicated Sit Down models with Motion Seat */ - PORT_DIPSETTING( 0x0002, DEF_STR( Off )) + PORT_DIPNAME( 0x0200, 0x0200, "Seat Motion" ) /* For dedicated Sit Down models with Motion Seat */ + PORT_DIPSETTING( 0x0200, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Cabinet )) - PORT_DIPSETTING( 0x0004, "Stand Up" ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Cabinet )) + PORT_DIPSETTING( 0x0400, "Stand Up" ) PORT_DIPSETTING( 0x0000, "Sit Down" ) - PORT_DIPNAME( 0x0008, 0x0008, "Wheel Invert" ) - PORT_DIPSETTING( 0x0000, DEF_STR( Off )) - PORT_DIPSETTING( 0x0008, DEF_STR( On )) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown )) /* Manual lists this dip as Unused */ - PORT_DIPSETTING( 0x0010, DEF_STR( Off )) + PORT_DIPNAME( 0x0800, 0x0800, "Wheel Invert" ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x0020, 0x0020, "Link" ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off )) + PORT_DIPNAME( 0x1000, 0x1000, "ROM Configuration" ) /* Manual lists this dip as Unused */ + PORT_DIPSETTING( 0x1000, "32M ROM Normal" ) + PORT_DIPSETTING( 0x0000, "16M ROM Split Active" ) + PORT_DIPNAME( 0x2000, 0x2000, "Link" ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x00c0, 0x00c0, "Linking I.D.") - PORT_DIPSETTING( 0x00c0, "Master #1" ) - PORT_DIPSETTING( 0x0080, "Slave #2" ) - PORT_DIPSETTING( 0x0040, "Slave #3" ) + PORT_DIPNAME( 0xc000, 0xc000, "Linking I.D.") + PORT_DIPSETTING( 0xc000, "Master #1" ) + PORT_DIPSETTING( 0x8000, "Slave #2" ) + PORT_DIPSETTING( 0x4000, "Slave #3" ) PORT_DIPSETTING( 0x0000, "Slave #4" ) - PORT_DIPNAME( 0x1f00, 0x1f00, "Country Code" ) - PORT_DIPSETTING( 0x1f00, DEF_STR( USA ) ) - PORT_DIPSETTING( 0x1e00, "Germany" ) - PORT_DIPSETTING( 0x1d00, "France" ) - PORT_DIPSETTING( 0x1c00, "Canada" ) - PORT_DIPSETTING( 0x1b00, "Switzerland" ) - PORT_DIPSETTING( 0x1a00, "Italy" ) - PORT_DIPSETTING( 0x1900, "UK" ) - PORT_DIPSETTING( 0x1800, "Spain" ) - PORT_DIPSETTING( 0x1700, "Austrilia" ) - PORT_DIPSETTING( 0x1600, DEF_STR( Japan ) ) - PORT_DIPSETTING( 0x1500, "Taiwan" ) - PORT_DIPSETTING( 0x1400, "Austria" ) - PORT_DIPSETTING( 0x1300, "Belgium" ) - PORT_DIPSETTING( 0x0f00, "Sweden" ) - PORT_DIPSETTING( 0x0e00, "Findland" ) - PORT_DIPSETTING( 0x0d00, "Netherlands" ) - PORT_DIPSETTING( 0x0c00, "Norway" ) - PORT_DIPSETTING( 0x0b00, "Denmark" ) - PORT_DIPSETTING( 0x0a00, "Hungary" ) - PORT_DIPSETTING( 0x0800, "General" ) - PORT_DIPNAME( 0x6000, 0x6000, "Coin Mode" ) - PORT_DIPSETTING( 0x6000, "Mode 1" ) /* USA1/GER1/FRA1/SPN1/AUSTRIA1/GEN1/CAN1/SWI1/ITL1/JPN1/TWN1/BLGN1/NTHRLND1/FNLD1/NRWY1/DNMK1/HUN1 */ - PORT_DIPSETTING( 0x4000, "Mode 2" ) /* USA3/GER1/FRA1/SPN1/AUSTRIA1/GEN3/CAN2/SWI2/ITL2/JPN2/TWN2/BLGN2/NTHRLND2 */ - PORT_DIPSETTING( 0x2000, "Mode 3" ) /* USA7/GER1/FRA1/SPN1/AUSTRIA1/GEN5/CAN3/SWI3/ITL3/JPN3/TWN3/BLGN3 */ - PORT_DIPSETTING( 0x0000, "Mode 4" ) /* USA8/GER1/FRA1/SPN1/AUSTRIA1/GEN7 */ - PORT_DIPNAME( 0x8000, 0x8000, "Test Switch" ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off )) - PORT_DIPSETTING( 0x0000, DEF_STR( On )) PORT_START PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -565,35 +622,36 @@ static INPUT_PORTS_START( crusnexo ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_VOLUME_UP ) PORT_BIT( 0x6000, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BILL1 ) /* Bill */ + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BILL1 ) PORT_START /* Listed "names" are via the manual's "JAMMA" pinout sheet" */ - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY /* Not Used */ - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY /* Radio Switch */ - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY /* Not Used */ - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY /* Not Used */ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* View 2 */ - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) /* View 3 */ - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* View 1 */ - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY /* Gear 1 */ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY /* Gear 2 */ - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY /* Gear 3 */ - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY /* Gear 4 */ - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) /* Not Used */ - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* Not Used */ - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* Not Used */ - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON6 ) /* Radio Switch */ + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* View 1 */ + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) /* View 2 */ + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* View 3 */ + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) /* View 4 */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) /* Gear 1 */ + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) /* Gear 2 */ + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) /* Gear 3 */ + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON5 ) /* Gear 4 */ + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Not Used */ + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) - PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) /* keypad 3 */ + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) /* keypad 1 */ + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(3) /* keypad 2 */ + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -682,6 +740,7 @@ static INPUT_PORTS_START( thegrid ) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_VOLUME_UP ) PORT_BIT( 0x6000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BILL1 ) /* Bill */ + PORT_BIT (0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* Listed "names" are via the manual's "JAMMA" pinout sheet" */ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY /* Not Used */ @@ -700,6 +759,7 @@ static INPUT_PORTS_START( thegrid ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* No Connection */ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* No Connection */ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT (0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) @@ -710,6 +770,7 @@ static INPUT_PORTS_START( thegrid ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT (0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -727,18 +788,16 @@ static MACHINE_DRIVER_START( midzeus ) MDRV_CPU_PROGRAM_MAP(zeus_map,0) MDRV_CPU_VBLANK_INT(irq0_line_assert,1) - MDRV_SCREEN_REFRESH_RATE(57) - MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) - MDRV_MACHINE_RESET(midzeus) MDRV_NVRAM_HANDLER(generic_1fill) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) - MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_SIZE(512, 278) - MDRV_SCREEN_VISIBLE_AREA(0, 399, 0, 255) MDRV_PALETTE_LENGTH(32768) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/8, 529, 0, 400, 278, 0, 256) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_VIDEO_START(midzeus) MDRV_VIDEO_UPDATE(midzeus) @@ -749,17 +808,27 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( midzeus2 ) - MDRV_IMPORT_FROM(midzeus) /* basic machine hardware */ - MDRV_CPU_MODIFY("main") + MDRV_CPU_ADD_TAG("main", TMS32032, CPU_CLOCK) MDRV_CPU_PROGRAM_MAP(zeus2_map,0) - + MDRV_CPU_VBLANK_INT(irq0_line_assert,1) + + MDRV_MACHINE_RESET(midzeus) + MDRV_NVRAM_HANDLER(zeus2_nvram) + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/4, 666, 0, 512, 438, 0, 400) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MDRV_VIDEO_START(midzeus2) MDRV_VIDEO_UPDATE(midzeus2) + + /* sound hardware */ + MDRV_IMPORT_FROM(dcs2_audio_2104) MACHINE_DRIVER_END diff --git a/src/mame/video/midzeus2.c b/src/mame/video/midzeus2.c index 264f8afed79..835051f83d6 100644 --- a/src/mame/video/midzeus2.c +++ b/src/mame/video/midzeus2.c @@ -64,6 +64,7 @@ static rectangle zeus_cliprect; static void *waveram[2]; +static UINT32 max_waveram[2][2]; /************************************* @@ -75,7 +76,7 @@ static void *waveram[2]; static void exit_handler(running_machine *machine); static void zeus_register32_w(offs_t offset, UINT32 data, int logit); -static void zeus_register_update(offs_t offset, UINT32 oldval); +static void zeus_register_update(offs_t offset, UINT32 oldval, int logit); static int zeus_fifo_process(const UINT32 *data, int numwords); static void log_fifo_command(const UINT32 *data, int numwords, const char *suffix); @@ -250,6 +251,9 @@ static void exit_handler(running_machine *machine) #endif poly_free(poly); + +printf("max[0] = %X, %X\n", max_waveram[0][0], max_waveram[0][1]); +printf("max[1] = %X, %X\n", max_waveram[1][0], max_waveram[1][1]); } @@ -319,9 +323,11 @@ VIDEO_UPDATE( midzeus2 ) READ32_HANDLER( zeus2_r ) { + int logit = (offset != 0x00 && offset != 0x01 && offset != 0x54 && offset != 0x48 && offset != 0x49 && offset != 0x58 && offset != 0x59 && offset != 0x5a); UINT32 result = zeusbase[offset]; - logerror("%06X:zeus2_r(%02X)\n", activecpu_get_pc(), offset); + if (logit) + logerror("%06X:zeus2_r(%02X)\n", activecpu_get_pc(), offset); switch (offset) { @@ -337,10 +343,15 @@ READ32_HANDLER( zeus2_r ) if (video_screen_get_vblank(0)) result |= 0x04; break; + + case 0x07: + /* this is needed to pass the self-test in thegrid */ + result = 0x10451998; + break; case 0x54: - /* upper 16 bits are masked when read -- is that the hpos? */ - result = video_screen_get_vpos(0); + /* lower 16 bits are masked when read -- is that the hpos? */ + result = video_screen_get_vpos(0) << 16; break; } @@ -357,13 +368,16 @@ READ32_HANDLER( zeus2_r ) WRITE32_HANDLER( zeus2_w ) { - logerror("%06X:zeus2_w", activecpu_get_pc()); - zeus_register32_w(offset, data, TRUE); + int logit = (offset != 0x40 && offset != 0x41 && offset != 0x48 && offset != 0x49 && offset != 0x4e && + offset != 0x50 && offset != 0x51 && offset != 0x57 && offset != 0x58 && offset != 0x59 && offset != 0x5a && offset != 0x5e); + if (logit) + logerror("%06X:zeus2_w", activecpu_get_pc()); + zeus_register32_w(offset, data, logit); } - /************************************* +/************************************* * * Handle register writes * @@ -385,7 +399,7 @@ static void zeus_register32_w(offs_t offset, UINT32 data, int logit) logerror("(%02X) = %08X\n", offset, data); /* handle the update */ - zeus_register_update(offset, oldval); + zeus_register_update(offset, oldval, logit); } @@ -396,7 +410,7 @@ static void zeus_register32_w(offs_t offset, UINT32 data, int logit) * *************************************/ -static void zeus_register_update(offs_t offset, UINT32 oldval) +static void zeus_register_update(offs_t offset, UINT32 oldval, int logit) { /* handle the writes; only trigger on low accesses */ switch (offset) @@ -406,6 +420,16 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) if (zeus_fifo_process(zeus_fifo, zeus_fifo_words)) zeus_fifo_words = 0; break; + + case 0x20: + /* toggles between two values based on the page: + + Page # zeusbase[0x20] zeusbase[0x38] + ------ -------------- -------------- + 0 $04000190 $00000000 + 1 $04000000 $01900000 + */ + break; case 0x33: case 0x34: @@ -432,6 +456,15 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) } break; + case 0x38: + { + UINT32 temp = zeusbase[0x38]; + zeusbase[0x38] = oldval; + video_screen_update_partial(0, video_screen_get_vpos(0)); + zeusbase[0x38] = temp; + } + break; + case 0x41: /* this is the address, except in read mode, where it latches values */ if (zeusbase[0x4e] & 0x10) @@ -467,6 +500,8 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) void *dest = waveram_ptr_from_expanded_addr(0, zeusbase[0x41]); WAVERAM_WRITE32(dest, 0, zeusbase[0x48]); WAVERAM_WRITE32(dest, 1, zeusbase[0x49]); + max_waveram[0][0] = MAX(max_waveram[0][0], zeusbase[0x41] & 0xffff); + max_waveram[0][1] = MAX(max_waveram[0][1], zeusbase[0x41] >> 16); if (zeusbase[0x4e] & 0x40) { @@ -478,7 +513,7 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) } /* make sure we log anything else */ - else + else if (logit) logerror("\t[40]=%08X [4E]=%08X\n", zeusbase[0x40], zeusbase[0x4e]); break; @@ -515,10 +550,12 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) WAVERAM_WRITE32(dest, 0, zeusbase[0x58]); if (zeusbase[0x57] & 4) WAVERAM_WRITE32(dest, 1, zeusbase[0x59]); + max_waveram[1][0] = MAX(max_waveram[1][0], zeusbase[0x51] & 0xffff); + max_waveram[1][1] = MAX(max_waveram[1][1], zeusbase[0x51] >> 16); } /* make sure we log anything else */ - else + else if (logit) logerror("\t[50]=%08X [5E]=%08X\n", zeusbase[0x50], zeusbase[0x5e]); break; @@ -547,6 +584,8 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) WAVERAM_WRITE32(dest, 1, zeusbase[0x59]); WAVERAM_WRITE32(dest, 2, zeusbase[0x5a]); } + max_waveram[1][0] = MAX(max_waveram[1][0], zeusbase[0x51] & 0xffff); + max_waveram[1][1] = MAX(max_waveram[1][1], zeusbase[0x51] >> 16); if (zeusbase[0x5e] & 0x40) { @@ -558,7 +597,7 @@ static void zeus_register_update(offs_t offset, UINT32 oldval) } /* make sure we log anything else */ - else + else if (logit) logerror("\t[50]=%08X [5E]=%08X\n", zeusbase[0x50], zeusbase[0x5e]); break; } @@ -588,9 +627,12 @@ static int zeus_fifo_process(const UINT32 *data, int numwords) break; default: - printf("Unknown command %08X\n", data[0]); - if (log_fifo) - log_fifo_command(data, numwords, "\n"); + if (data[0] != 0x2c0) + { + printf("Unknown command %08X\n", data[0]); + if (log_fifo) + log_fifo_command(data, numwords, "\n"); + } break; } return TRUE; |