diff options
Diffstat (limited to 'trunk/src/mame/drivers/metalmx.c')
-rw-r--r-- | trunk/src/mame/drivers/metalmx.c | 917 |
1 files changed, 917 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/metalmx.c b/trunk/src/mame/drivers/metalmx.c new file mode 100644 index 00000000000..b235d567a3d --- /dev/null +++ b/trunk/src/mame/drivers/metalmx.c @@ -0,0 +1,917 @@ +/*************************************************************************** + + Atari Metal Maniax + + Preliminary driver + +***************************************************************************/ + +/*************************************************************************** + +Metal Maniax +Atari Prototype + +This is a truly insane board stack. Side view: + + +----(1l)----+ +----(1r)----+ ++-----(2l)------------+ +------(2r)------------+ ++-----(3l)-------------+ +------(3r)------------+ ++-----------------------(4)-----------------------+ ++-----------------------(5)-----------------------+ + +The two bottom boards (4) and (5) are common. +The top stack of 3 boards are duplicated twice. + +Here, in detail, is a list of components on each board: + +---------------------- +Layer 1: (1l) and (1r) +---------------------- +Dimensions: 5" x 8" +ID: ROMCH31 A053443 ATARI GAMES (c) 94 MADE IN U.S.A. +Title: "Teenage Kicks Right Through the Night" + +Programmable: +16 x 27C040-10 EPROMs, labelled datametl 0-15, 10/19/94 11:08:05 + 1 x 27C040-10 EPROM, labelled bootmetl rel 34, 10/19/94 16:22:49 + 1 x GAL16V8B, labelled 136103-1500 + +Logic: + 3 x SN74F245 + + |------------------------------------------------------------------| + | datametl4 datametl12 | + | datametl0 datametl8 | + | datametl5 datametl13 | + | datametl1 datametl9 | + | datametl6 datametl14 | + | datametl2 datametl10 | + | datametl7 datametl15 | + | datametl3 datametl11 | + | bootmetl34 | + | SN74F245 SN74F245 | + | 136103-1500 SN74F245 | + | |------------------------------|socket | + | |------------------------------|JROMBUS | + |------------------------------------------------------------------| + + +---------------------- +Layer 2: (2l) and (2r) +---------------------- +Dimensions: 5.5" x 8" +ID: CH31.2 A053304 ATARI GAMES (c) 93 MADE IN U.S.A. +Title: "Silly Putty: Thixotropic or Dilatent" + +Programmable: + 4 x unpopulated 42-pin sockets (11B-11E) + 1 x unpopulated 32-pin socket (11A) + 1 x GAL16V8A-25, labelled DSP + 1 x GAL16V8A-25, labelled IRQ2 + 1 x GAL16V8A-25, labelled XDEC + +CPU/DSP: + 1 x TMS320C31PQL DSP + 1 x 33.8688MHz crystal + +RAM: + 4 x CY7C199-20 32k*8 SRAM + +DAC: + 2 x Asahi Kasei AK4316-VS + +Logic: + 1 x SN74F138 + 4 x SN74LS374 + + |--------------------------------------------------| + | | + | | + | JXBUS | + | || AK4136-VS AK4136-VS | + | || | + | || | + | || SN74LS374 CY7C199 -------- | + | || SN74LS374 CY7C199 |320C31| SN74F138| + | || SN74LS374 CY7C199 | | | + | || SN74LS374 CY7C199 -------- LED | + | || XDEC | + | || 11A 11B 11C 11D 11E IRQ2Q | + | LED | + | DSP | + | 33.8MHz | + | |------------------------------|socket | + | |------------------------------|JROMBUS | + |--------------------------------------------------| + + +---------------------- +Layer 3: (3l) and (3r) +---------------------- +Dimensions: 9" x 12" +ID: MCUBE A052137 ATARI GAMES (c) 93 + +Programmable: + 4 x 27C040-10 EPROMs, labelled tgs665e 0-3, 9/28/94 15:53:52 + 4 x 27C040-10 EPROMs, labelled st665e 0-3, 9/28/94 15:56:02 + 1 x 27C512-IJL EPROM, labelled MTL MANIAX 136103-2308PP + 1 x GAL20V8B-15, labelled 136103-1300 + +CPU/DSP: + 1 x ADSP-2105 KP-40 DSP + 1 x 10.000MHz crystal + 1 x MC68EC020FG16 CPU + 1 x 14.318180MHz crystal + +RAM: + 1 x MK48Z02B-15 ZEROPOWER RAM + 1 x MK48T02B-15 TIMEKEEPER RAM + 4 x MOSEL 62256H-20NC 32k*8 SRAM + +Unknown: + 1 x XILINX FPGA XC3142-3 TQ144C X25839M AIG9326 + 1 x XILINX 1736DPC, labelled 3302 (checksum?) + 1 x DALLAS DS1232 MicroMonitor + +ADCs: + 1 x AD7582KN 12-bit ADC + 1 x ADC0809CCN 8-bit ADC with 8-way mux + +Logic: + 1 x SN74F138 + 7 x SN74F244 +15 x SN74F245 + 1 x SN74LS240 + 3 x SN74LS259 + 5 x SN74LS374 + 1 x SN75ALS194 + 1 x SN75ALS195 + 1 x 74F04PC + +Misc: + 1 x 8-position DIP switch + 3 x green LEDs + 2 x red LEDs + + +------------ +Layer 4: (4) +------------ +Dimensions: 8" x 18" +ID: TGSMATH A052043 ATARI GAMES (c) 93 MADE IN U.S.A. + +Programmable: + 2 x GAL22V10B, labelled 136103-1200 + 1 x GAL22V10B, labelled 136103-1202 + 1 x GAL22V10B, labelled 136103-1203 + 1 x GAL22V10B, labelled 136103-1204 + 1 x GAL22V10B, labelled 136103-1205 + 1 x GAL22V10B, labelled 136103-1218 + 1 x GAL20V8B, labelled 136103-1217 + 4 x GAL16V8B, labelled 136103-1219 + +CPU/DSP: + 4 x DSP32C F33 DSPs, labelled Freda, Gus, Herb, Irene + +RAM: +32 x MOSEL 62256H-20NC 32k*8 SRAM +16 x MT5C1008-20 128k*8 SRAM + +Logic: + 4 x 74F04PC + 1 x SN74LS74 + 2 x SN74LS174 +16 x SN74ALS373 + 2 x SN74ALS374 + + +------------ +Layer 5: (5) +------------ +Dimensions: 12" x 18" +ID: ATARI GAMES (c) 93 MADE IN U.S.A. TGS A051985 + +Programmable: + 8 x 27C040-10, labelled TEX0-7 0 + 8 x 27C040-10, labelled TEX0-7 1 + 2 x GAL16V8B, labelled 136103-1114 + 1 x GAL16V8B, labelled 136103-1116 + 1 x GAL22V10B, labelled 136103-1106 + 1 x GAL22V10B, labelled 136103-1107 + 2 x GAL22V10B, labelled 136103-1108 + 2 x GAL22V10B, labelled 136103-1111 + 2 x GAL22V10B, labelled 136103-1112 + 2 x N82S147 512*8 BPROM, labelled RED + 2 x N82S147 512*8 BPROM, labelled GREEN + 2 x N82S147 512*8 BPROM, labelled BLUE + +CPU/DSP: + 2 x TMS34020-40 + 1 x unknown crystal + 1 x 16.00000MHz crystal + +RAM: + 4 x TMS45160DZ-80 256k*16 DRAM + 4 x TMS55160DGH-70 256k*16 VRAM + +Unknown: + 1 x HP FPGA 1FY5-0003 9351-HONG KONG NPFY5B5880 + 1 x XILINX FPGA XC3190-3 PQ160C X35728M AIG9427 + 1 x XILINX FPGA CX4003-6 PQ100C X25788M ASG9325 + 2 x XILINX 1765DPC + +Logic: + 8 x SN74BCT652 +20 x DM74ALS541 + 5 x ACT7814-25 64x18 strobed FIFO + 1 x 74F04PC + 4 x 74F273 + 1 x SN74ALS2232 + 6 x 74HCT374 + 1 x 74ALS164 + + + The board stack drives a two-seat cabinet. + Each side uses the following CPUs: + + Main: 68EC020 + Network: ADSP-2105 + 2D Engine: TMS34020 + 3D Math: 2 x DSP32C + Sound (CAGE): TMS320C31 + + Two cabinets can be linked together to support 4 players. + + Interrupts: + IRQ2 = ? + IRQ3 = ? + IRQ4 = TMS34020 + IRQ5 = Network + IRQ6 = Timer + + 2/3 are either CAGE or the Mathbox CPUs + +***************************************************************************/ + +#include "emu.h" +#include "audio/cage.h" +#include "includes/metalmx.h" + + +/************************************* + * + * Forward definitions + * + *************************************/ + +static MACHINE_RESET( metalmx ); + + +/************************************* + * + * Video hardware (move to /video) + * + *************************************/ + +static VIDEO_START( metalmx ) +{ + +} + +static SCREEN_UPDATE( metalmx ) +{ + /* TODO: TMS34020 should take care of this */ + metalmx_state *state = screen->machine().driver_data<metalmx_state>(); + +// UINT32 *src_base = &gsp_vram[(vreg_base[0x40/4] & 0x40) ? 0x20000 : 0]; + UINT16 *src_base = state->m_gsp_vram; + int y; + + for (y = 0; y < 384; ++y) + { + int x; + UINT16 *src = &src_base[512 * y]; + UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + + for(x = 0; x < 512; x++) + *dst++ = *src++; + } + + return 0; +} + + +/************************************* + * + * Miscellany + * + *************************************/ + +static READ32_HANDLER( unk_r ) +{ + return 0;//space->machine().rand(); +} + +static READ32_HANDLER( watchdog_r ) +{ + return 0xffffffff; +} + +static WRITE32_HANDLER( shifter_w ) +{ + +} + +static WRITE32_HANDLER( motor_w ) +{ + +} + +static WRITE32_HANDLER( reset_w ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + if (ACCESSING_BITS_16_31) + { + data >>= 16; + device_set_input_line(state->m_dsp32c_1, INPUT_LINE_RESET, data & 2 ? CLEAR_LINE : ASSERT_LINE); + device_set_input_line(state->m_dsp32c_2, INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + } +} + + +/************************************* + * + * Sound I/O + * + *************************************/ + +static READ32_HANDLER( sound_data_r ) +{ + UINT32 result = 0; + + if (ACCESSING_BITS_0_15) + result |= cage_control_r(space->machine()); + if (ACCESSING_BITS_16_31) + result |= cage_main_r(space) << 16; + return result; +} + +static WRITE32_HANDLER( sound_data_w ) +{ + if (ACCESSING_BITS_0_15) + cage_control_w(space->machine(), data); + if (ACCESSING_BITS_16_31) + cage_main_w(space, data >> 16); +} + +static void cage_irq_callback(running_machine &machine, int reason) +{ + /* TODO */ +} + +/************************************* + * + * Host/DSP32C parallel interface + * + *************************************/ + +static WRITE32_HANDLER( dsp32c_1_w ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + offset <<= 1; + + if (ACCESSING_BITS_0_15) + offset += 1; + else if (ACCESSING_BITS_16_31) + data >>= 16; + + state->m_dsp32c_1->pio_w(offset, data); +} + +static READ32_HANDLER( dsp32c_1_r ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + UINT32 data; + + offset <<= 1; + + if (ACCESSING_BITS_0_15) + offset += 1; + + data = state->m_dsp32c_1->pio_r(offset); + + if (ACCESSING_BITS_16_31) + data <<= 16; + + return data; +} + +static WRITE32_HANDLER( dsp32c_2_w ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + offset <<= 1; + + if (ACCESSING_BITS_0_15) + offset += 1; + else if (ACCESSING_BITS_16_31) + data >>= 16; + + state->m_dsp32c_2->pio_w(offset, data); +} + +static READ32_HANDLER( dsp32c_2_r ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + UINT32 data; + + offset <<= 1; + + if (ACCESSING_BITS_0_15) + offset += 1; + + data = state->m_dsp32c_2->pio_r(offset); + + if (ACCESSING_BITS_16_31) + data <<= 16; + + return data; +} + + +/************************************* + * + * Host/TMS34020 accesors + * + *************************************/ + +static WRITE32_HANDLER( host_gsp_w ) +{ + address_space *gsp_space = space->machine().device("gsp")->memory().space(AS_PROGRAM); + + gsp_space->write_word((0xc0000000 + (offset << 5) + 0x10) / 8, data); + gsp_space->write_word((0xc0000000 + (offset << 5))/ 8 , data >> 16); +} + +static READ32_HANDLER( host_gsp_r ) +{ + address_space *gsp_space = space->machine().device("gsp")->memory().space(AS_PROGRAM); + UINT32 val; + + val = gsp_space->read_word((0xc0000000 + (offset << 5) + 0x10) / 8); + val |= gsp_space->read_word((0xc0000000 + (offset << 5)) / 8) << 16; + return val; +} + + +static READ32_HANDLER( host_dram_r ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + return (state->m_gsp_dram[offset * 2] << 16) | state->m_gsp_dram[offset * 2 + 1]; +} + +static WRITE32_HANDLER( host_dram_w ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + COMBINE_DATA(state->m_gsp_dram + offset * 2 + 1); + data >>= 16; + mem_mask >>= 16; + COMBINE_DATA(state->m_gsp_dram + offset * 2); +} + +static READ32_HANDLER( host_vram_r ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + return (state->m_gsp_vram[offset * 2] << 16) | state->m_gsp_vram[offset * 2 + 1]; +} + +static WRITE32_HANDLER( host_vram_w ) +{ + metalmx_state *state = space->machine().driver_data<metalmx_state>(); + + COMBINE_DATA(state->m_gsp_vram + offset * 2 + 1); + data >>= 16; + mem_mask >>= 16; + COMBINE_DATA(state->m_gsp_vram + offset * 2); +} + +static void tms_interrupt(device_t *device, int state) +{ + cputag_set_input_line(device->machine(), "maincpu", 4, state ? HOLD_LINE : CLEAR_LINE); +} + + +static WRITE32_HANDLER( timer_w ) +{ + // Offsets + // 9000 with 1 changes to external clock source + // 1000 with 1 changes to link clock + // 8000 with 1 changes to 4ms clock rate + // 0000 with 1 changes to 1ms clock rate + // a000 with 1 changes to 4ms counter rate + // 2000 with 1 changes to 1ms counter rate + // 3000 ? + // b000 ? + // f08000 with 1 resets +} + + +/************************************* + * + * Main 68EC020 Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32 ) + AM_RANGE(0x000000, 0x1fffff) AM_ROM + AM_RANGE(0x200000, 0x3fffff) AM_ROM + AM_RANGE(0x400000, 0x4000ff) AM_READWRITE(host_gsp_r, host_gsp_w) + AM_RANGE(0x600000, 0x6fffff) AM_READWRITE(host_dram_r, host_dram_w) + AM_RANGE(0x700000, 0x7fffff) AM_READWRITE(host_vram_r, host_vram_w) + AM_RANGE(0x800000, 0x80001f) AM_READWRITE(dsp32c_2_r, dsp32c_2_w) + AM_RANGE(0x800000, 0x85ffff) AM_NOP /* Unknown */ + AM_RANGE(0x880000, 0x88001f) AM_READWRITE(dsp32c_1_r, dsp32c_1_w) + AM_RANGE(0x980000, 0x9800ff) AM_WRITE(reset_w) + AM_RANGE(0xb40000, 0xb40003) AM_READWRITE(sound_data_r, sound_data_w) + AM_RANGE(0xf00000, 0xf00003) AM_RAM /* Network message port */ + AM_RANGE(0xf02000, 0xf02003) AM_READWRITE(watchdog_r, shifter_w) + AM_RANGE(0xf03000, 0xf03003) AM_READ_PORT("P1") AM_WRITE(motor_w) + AM_RANGE(0xf04000, 0xf04003) AM_READ_PORT("P2") + AM_RANGE(0xf05000, 0xf05fff) AM_WRITENOP /* Lamps */ // f06000 = ADC // f01xxx = ADC + AM_RANGE(0xf19000, 0xf19003) AM_WRITENOP /* Network */ + AM_RANGE(0xf1a000, 0xf1a003) AM_WRITENOP + AM_RANGE(0xf1b000, 0xf1b003) AM_WRITENOP + AM_RANGE(0xf1e000, 0xf1e003) AM_RAM /* Network status flags : 1000 = LIRQ 4000 = SFLAG 8000 = 68FLAG */ + AM_RANGE(0xf20000, 0xf2ffff) AM_WRITE(timer_w) + AM_RANGE(0xfc0000, 0xfc1fff) AM_RAM /* Zero power RAM */ + AM_RANGE(0xfd0000, 0xffffff) AM_RAM /* Scratch RAM */ +ADDRESS_MAP_END + + +/************************************* + * + * Network ADSP-2105 Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( adsp_program_map, AS_PROGRAM, 32 ) + AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE_MEMBER(metalmx_state, m_adsp_internal_program_ram) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( adsp_data_map, AS_DATA, 16 ) + AM_RANGE(0x3800, 0x39ff) AM_RAM + AM_RANGE(0x2000, 0x2007) AM_RAM + AM_RANGE(0x3fe0, 0x3fff) AM_RAM // TODO: CPU control registers +ADDRESS_MAP_END + + +/************************************* + * + * 2D Engine TMS34020 Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( gsp_map, AS_PROGRAM, 16 ) + AM_RANGE(0x88800000, 0x8880000f) AM_RAM /* ? */ + AM_RANGE(0x88c00000, 0x88c0000f) AM_RAM /* ? */ + AM_RANGE(0xc0000000, 0xc00003ff) AM_READWRITE(tms34020_io_register_r, tms34020_io_register_w) + AM_RANGE(0xff000000, 0xff7fffff) AM_RAM AM_BASE_MEMBER(metalmx_state, m_gsp_dram) + AM_RANGE(0xff800000, 0xffffffff) AM_RAM AM_BASE_MEMBER(metalmx_state, m_gsp_vram) +ADDRESS_MAP_END + + +/************************************* + * + * Math Box DSP32C 1 Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( dsp32c_1_map, AS_PROGRAM, 32 ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x000000, 0x03ffff) AM_RAM + AM_RANGE(0x600000, 0x67ffff) AM_RAM + AM_RANGE(0x700000, 0x700003) AM_WRITENOP /* LEDs? */ + AM_RANGE(0xa00000, 0xa00003) AM_READ(unk_r) + AM_RANGE(0xb00000, 0xb00003) AM_READ(unk_r) + AM_RANGE(0xc00000, 0xc00003) AM_RAM /* FIFO? */ + AM_RANGE(0xf00000, 0xffffff) AM_RAM /* 3D registers */ +ADDRESS_MAP_END + +/************************************* + * + * Math Box DSP32C 2 Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( dsp32c_2_map, AS_PROGRAM, 32 ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x000000, 0x03ffff) AM_RAM + AM_RANGE(0x600000, 0x67ffff) AM_RAM + AM_RANGE(0x700000, 0x700003) AM_WRITENOP /* LEDs? */ + AM_RANGE(0xa00000, 0xa00003) AM_READ(unk_r) + AM_RANGE(0xb00000, 0xb00003) AM_READ(unk_r) + AM_RANGE(0xc00000, 0xc00003) AM_RAM /* FIFO? */ + AM_RANGE(0xf00000, 0xffffff) AM_RAM /* 3D registers */ +ADDRESS_MAP_END + + +/************************************* + * + * Input definitions + * + *************************************/ + +static INPUT_PORTS_START( metalmx ) + PORT_START("P1") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + /* COINS */ + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_COIN4 ) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_TOGGLE + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) + + /* AUX */ + PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START("P2") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gear Shift") PORT_TOGGLE + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Fire") + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("View Change") + PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +/************************************* + * + * CPU configuration + * + *************************************/ + +static const adsp21xx_config adsp_config = +{ + NULL, /* callback for serial receive */ + NULL, /* callback for serial transmit */ + NULL, /* callback for timer fired */ +}; + +static const tms34010_config gsp_config = +{ + TRUE, /* halt on reset */ + "screen", /* the screen operated on */ + 4000000, /* pixel clock */ + 2, /* pixels per clock */ + NULL, /* scanline callback */ + tms_interrupt, /* generate interrupt */ +}; + +static const dsp32_config dsp32c_config = +{ + NULL /* a change has occurred on an output pin */ +}; + + +/************************************* + * + * Machine driver + * + *************************************/ + +static MACHINE_CONFIG_START( metalmx, metalmx_state ) + + MCFG_CPU_ADD("maincpu", M68EC020, XTAL_14_31818MHz) + MCFG_CPU_PROGRAM_MAP(main_map) + + MCFG_CPU_ADD("adsp", ADSP2105, XTAL_10MHz) + MCFG_ADSP21XX_CONFIG(adsp_config) + MCFG_CPU_PROGRAM_MAP(adsp_program_map) + MCFG_CPU_DATA_MAP(adsp_data_map) + + MCFG_CPU_ADD("gsp", TMS34020, 40000000) /* Unverified */ + MCFG_CPU_CONFIG(gsp_config) + MCFG_CPU_PROGRAM_MAP(gsp_map) + + MCFG_CPU_ADD("dsp32c_1", DSP32C, 40000000) /* Unverified */ + MCFG_CPU_CONFIG(dsp32c_config) + MCFG_CPU_PROGRAM_MAP(dsp32c_1_map) + + MCFG_CPU_ADD("dsp32c_2", DSP32C, 40000000) /* Unverified */ + MCFG_CPU_CONFIG(dsp32c_config) + MCFG_CPU_PROGRAM_MAP(dsp32c_2_map) + + MCFG_MACHINE_RESET(metalmx) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_SIZE(512, 384) + MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) + MCFG_SCREEN_UPDATE(metalmx) + + MCFG_PALETTE_LENGTH(65536) + MCFG_PALETTE_INIT(RRRRR_GGGGGG_BBBBB) + + MCFG_VIDEO_START(metalmx) + + MCFG_FRAGMENT_ADD(cage) +MACHINE_CONFIG_END + + +static DRIVER_INIT( metalmx ) +{ + UINT8 *adsp_boot = (UINT8*)machine.region("adsp")->base(); + metalmx_state *state = machine.driver_data<metalmx_state>(); + + state->m_adsp->load_boot_data(adsp_boot, state->m_adsp_internal_program_ram); + + cage_init(machine, 0); // TODO: speedup address + cage_set_irq_handler(cage_irq_callback); +} + +static MACHINE_RESET( metalmx ) +{ + metalmx_state *state = machine.driver_data<metalmx_state>(); + + device_set_input_line(state->m_dsp32c_1, INPUT_LINE_RESET, ASSERT_LINE); + device_set_input_line(state->m_dsp32c_2, INPUT_LINE_RESET, ASSERT_LINE); +} + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( metalmx ) + +/* ------------------------------------------------ + MCUBE A052137 (there are 2 of these boards) +-------------------------------------------------*/ + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD32_BYTE( "st665e.0", 0x000000, 0x80000, CRC(b2a90fd0) SHA1(ae483ab0aa68493904ea8d1906e22fdaa16a8a27) ) + ROM_LOAD32_BYTE( "st665e.1", 0x000001, 0x80000, CRC(559fecb7) SHA1(092e7e358d02f179a59849db0cafad0b4a95c0ed) ) + ROM_LOAD32_BYTE( "st665e.2", 0x000002, 0x80000, CRC(ee64b773) SHA1(8b1f51450804f16e73045ac9198daa7bd92d993b) ) + ROM_LOAD32_BYTE( "st665e.3", 0x000003, 0x80000, CRC(42b78cde) SHA1(a441fcd1cd34e1a8234be44ab33e56fbb73bac79) ) + + ROM_LOAD32_BYTE( "tgs665e.0", 0x200000, 0x80000, CRC(2a4102f1) SHA1(2d21956b27cc9ac3d418f4595c1b8aa08a0298f6) ) + ROM_LOAD32_BYTE( "tgs665e.1", 0x200001, 0x80000, CRC(7d0eff8f) SHA1(c815cfa55619c3363c86c843047fe8487daaa6c1) ) + ROM_LOAD32_BYTE( "tgs665e.2", 0x200002, 0x80000, CRC(3f965f1a) SHA1(7333e1cd5a9428d78236a5532b6a60203fd1485b) ) + ROM_LOAD32_BYTE( "tgs665e.3", 0x200003, 0x80000, CRC(bb0ea984) SHA1(92a273675b32a2e1782012d49a404c9e8658eb2d) ) + + ROM_REGION( 0x10000, "adsp", 0 ) + ROM_LOAD( "103-2308.bin", 0x00000, 0x10000, CRC(af1781d0) SHA1(f3f69e2fd83a949b447b71410ba9e165229e5aad) ) + + ROM_REGION( 0x80000, "mcube_pals", 0 ) + ROM_LOAD( "103-1300.bin", 0x000, 0x157, CRC(eec18a29) SHA1(cc41cc921f59d385df805217f3b09bc289379f79) ) + +/* ------------------------------------------------ + ROMCH31 A053443 (there are 2 of these boards) +-------------------------------------------------*/ + ROM_REGION32_LE( 0x200000, "cageboot", 0 ) + ROM_LOAD32_BYTE( "bootmetl.r34", 0x00000, 0x80000, CRC(ec799644) SHA1(32c77abb70fee1da8e3d7141bce2032e73e0eb35) ) + + ROM_REGION32_LE( 0x80000, "cage", 0 ) + ROM_LOAD( "datametl.0", 0x00000, 0x80000, CRC(004dc445) SHA1(e52e539cc38afa917d1c769f9ad1794f4bd833b2) ) + ROM_LOAD( "datametl.1", 0x00000, 0x80000, CRC(e0465fc5) SHA1(cd8584e48b6cf33bc103cdfdb68d32eef3f2bec5) ) + ROM_LOAD( "datametl.2", 0x00000, 0x80000, CRC(2fb4b470) SHA1(b5ec1f9579200684cfd7e46c7774687df9330e19) ) + ROM_LOAD( "datametl.3", 0x00000, 0x80000, CRC(00f2bab2) SHA1(20ee4b185c9ac637be28cdc96c003c8f3c7ba3ee) ) + ROM_LOAD( "datametl.4", 0x00000, 0x80000, CRC(45f3d3ed) SHA1(cc83e61f4572ebe0a32c12b7c463daa1db0b7d09) ) + ROM_LOAD( "datametl.5", 0x00000, 0x80000, CRC(866bad4d) SHA1(67ed2f183a8e0424ca8963032d34c24c1f0a1e9a) ) + ROM_LOAD( "datametl.6", 0x00000, 0x80000, CRC(82c52a2f) SHA1(4250749c5e7281248315986150040f00529439c4) ) + ROM_LOAD( "datametl.7", 0x00000, 0x80000, CRC(6d4f81ab) SHA1(94fcad3f9348e95022327562803583b2e0b94caa) ) + ROM_LOAD( "datametl.8", 0x00000, 0x80000, CRC(697dda37) SHA1(2d5b8c1c5ce52f10472c3bb0c4aa3d14cb67be27) ) + ROM_LOAD( "datametl.9", 0x00000, 0x80000, CRC(a54ab7a9) SHA1(c2cba71188aec74766413961aa78444e64005634) ) + ROM_LOAD( "datametl.10",0x00000, 0x80000, CRC(532ace72) SHA1(84f3b112a7edba794c9ce7fdd0d81c57157203c8) ) + ROM_LOAD( "datametl.11",0x00000, 0x80000, CRC(3a7ce25d) SHA1(2dc4cad858207b645b4cb71ce5be74e3ce5383d3) ) + ROM_LOAD( "datametl.12",0x00000, 0x80000, CRC(13b2b1c7) SHA1(ab37b04e04b8a6a6929e5f039c2bcf6fbd330545) ) + ROM_LOAD( "datametl.13",0x00000, 0x80000, CRC(e8894400) SHA1(7c094502404b897347950f943c79f6fa80c984a1) ) + ROM_LOAD( "datametl.14",0x00000, 0x80000, CRC(709df01f) SHA1(639d8d4cf79ae7e0406d11ed1c475986f3e595f6) ) + ROM_LOAD( "datametl.15",0x00000, 0x80000, CRC(c55dbfbf) SHA1(63de1b24f5024e94601bcdffa7a3e418a195342f) ) + + ROM_REGION( 0x80000, "cage_rom_pals", 0 ) + ROM_LOAD( "103-1500.bin", 0x000, 0x117, CRC(9883af90) SHA1(62b4a0cce5832628149c48e6810055ad3919cc5b) ) + +/* ------------------------------------------------ + CH31.2 A053304 (there are 2 of these boards) +-------------------------------------------------*/ + ROM_REGION( 0x80000, "cage_pals", 0 ) + ROM_LOAD( "dsp.bin", 0x000, 0x117, CRC(321b5250) SHA1(8d9c2ed9b0375c4624ea3efa80ba0a78135b756c) ) + ROM_LOAD( "irq2q.bin", 0x000, 0x117, CRC(983cb6e1) SHA1(0222fd2b79691b3b249f6b353f5687be83e291a7) ) + ROM_LOAD( "xdec.bin", 0x000, 0x117, CRC(fcb37143) SHA1(c95a6714f151868d42722684c8b67e9356f70544) ) + +/* ------------------------------------------------ + TGSMATH A052043 +-------------------------------------------------*/ + ROM_REGION( 0x80000, "tgsmath_pals", 0 ) + ROM_LOAD( "103-1200.bin", 0x000, 0x2e5, CRC(cf1d4df4) SHA1(2ae592df2f16af070620766b7ebf60918c7f725d) ) + ROM_LOAD( "103-1202.bin", 0x000, 0x2e5, CRC(dab3b17f) SHA1(ac825063a293a32ae6ba5cbf5cfb52aa4aea62c9) ) + ROM_LOAD( "103-1204.bin", 0x000, 0x2e5, CRC(bb675ce0) SHA1(e3b188ebfe13e826e3d14c1cc456810d85750314) ) + ROM_LOAD( "103-1217.bin", 0x000, 0x157, CRC(a6418db0) SHA1(5b23fcb6123f0402f7483ffd38625846b0432efa) ) + ROM_LOAD( "103-1219.bin", 0x000, 0x117, CRC(bf08d1e8) SHA1(5710cbc941830594087320ed2b22bcbb2b5c48de) ) + +/* ------------------------------------------------ + TGS A051985 +-------------------------------------------------*/ + ROM_REGION( 0x100000, "tex", 0 ) + ROM_LOAD16_BYTE( "tex0h.bin", 0x00001, 0x80000, CRC(b4dc459e) SHA1(cd2c6616951bdedeb5bb0c81179b4eee42ed5148) ) + ROM_LOAD16_BYTE( "tex0l.bin", 0x00000, 0x80000, CRC(370f9dca) SHA1(e26633f0f78f821fc59d8070ad927507f33d04d2) ) + ROM_LOAD16_BYTE( "tex1h.bin", 0x00001, 0x80000, CRC(e9224c54) SHA1(741f34cfad23d54c5bb70536489d661e7a505812) ) + ROM_LOAD16_BYTE( "tex1l.bin", 0x00000, 0x80000, CRC(0cb0c44b) SHA1(463736719dc0d00df8b22455effb17d00355ffd7) ) + ROM_LOAD16_BYTE( "tex2h.bin", 0x00001, 0x80000, CRC(f7096b75) SHA1(cf976039e8c0e4a5b5155fa4f108ae6a19712dc8) ) + ROM_LOAD16_BYTE( "tex2l.bin", 0x00000, 0x80000, CRC(33c47b1e) SHA1(20f6aff0ef31d71244ce3d0277d264fac7fa5229) ) + ROM_LOAD16_BYTE( "tex3h.bin", 0x00001, 0x80000, CRC(0cf25571) SHA1(08d78dfcb80742fb1f15b92e2f686b554109b01b) ) + ROM_LOAD16_BYTE( "tex3l.bin", 0x00000, 0x80000, CRC(56ab7d89) SHA1(0f88bba8b685f4cc7264ce042b3950dbaadbb495) ) + ROM_LOAD16_BYTE( "tex4h.bin", 0x00001, 0x80000, CRC(900d9ecf) SHA1(d0f0cb6dcfc25cd0ff10716d8242a82e4b000773) ) + ROM_LOAD16_BYTE( "tex4l.bin", 0x00000, 0x80000, CRC(d87d909c) SHA1(0eb26e37449ffd3d5a132189cdcbfc9129808c50) ) + ROM_LOAD16_BYTE( "tex5h.bin", 0x00001, 0x80000, CRC(7fcf4516) SHA1(4bd307afda9f499d26c9a802775bf57989fd7376) ) + ROM_LOAD16_BYTE( "tex5l.bin", 0x00000, 0x80000, CRC(da3fa060) SHA1(338dc2510a0fbb242c054b03264bd88ba9aa152f) ) + ROM_LOAD16_BYTE( "tex6h.bin", 0x00001, 0x80000, CRC(b6e6a0b3) SHA1(e302c997be5a612b37bb947245331d2f941df8fa) ) + ROM_LOAD16_BYTE( "tex6l.bin", 0x00000, 0x80000, CRC(c0b0638f) SHA1(11805da9efff04ec835042c91cec861a80f27b6d) ) + ROM_LOAD16_BYTE( "tex7h.bin", 0x00001, 0x80000, CRC(ef32fb90) SHA1(393c0f219ff550c9e9d60dbd872349d770c33580) ) + ROM_LOAD16_BYTE( "tex7l.bin", 0x00000, 0x80000, CRC(d9278afd) SHA1(6d86e0608cbb7697d63d3dbb74365d46be74074b) ) + + ROM_REGION( 0x80000, "proms", 0 ) + ROM_LOAD( "blue.bpr", 0x000, 0x200, CRC(58e48ec5) SHA1(b2dfc6ad2b60fa3d9898c5d7a5fcc65af39117a1) ) + ROM_LOAD( "green.bpr", 0x000, 0x200, CRC(a80fd47d) SHA1(5bdffe022cbe2527c89c17f37e90e7e49c48be99) ) + ROM_LOAD( "red.bpr", 0x000, 0x200, CRC(bc8a3266) SHA1(87f98ea3657ae08ae80282c7940f00f31a407035) ) + + ROM_REGION( 0x80000, "tgs_pals", 0 ) + ROM_LOAD( "103-1106.bin", 0x000, 0x2e5, CRC(fd8a872e) SHA1(03f4033d77617d2c372f4656cb1cdb6ea6bd20d6) ) + ROM_LOAD( "103-1107.bin", 0x000, 0x2e5, CRC(c16e71fe) SHA1(6d1e9fa1894778381bb6b8954023e4d1816241bb) ) + ROM_LOAD( "103-1108.bin", 0x000, 0x2e5, CRC(b3680191) SHA1(36d006ca6bff5592a84fba812df43f2f5ddfe927) ) + ROM_LOAD( "103-1109.bin", 0x000, 0x2e5, CRC(ce803542) SHA1(9da822cedf0015399939524639fec9a0720626d4) ) + ROM_LOAD( "103-1111.bin", 0x000, 0x2e5, CRC(a48b2dc1) SHA1(18713aea428c8109fda4b6abec2ef0bb75f38078) ) + ROM_LOAD( "103-1112.bin", 0x000, 0x2e5, CRC(087bfb83) SHA1(330daf872e2e7dbdc30d65d74e487904e2091374) ) + ROM_LOAD( "103-1114.bin", 0x000, 0x117, CRC(47443136) SHA1(83ea193d9d10d74fed941d5a14dd84c8a03d229f) ) + ROM_LOAD( "103-1116.bin", 0x000, 0x117, CRC(37edc36c) SHA1(be53131c52e84cb3fe055af5ca4e2f6aa5442ff0) ) +ROM_END + + +/************************************* + * + * Game driver + * + *************************************/ + +GAME( 1994, metalmx, 0, metalmx, metalmx, metalmx, ROT0, "Atari Games", "Metal Maniax (prototype)", GAME_NO_SOUND | GAME_NOT_WORKING ) |