/***************************************************************************
Mad Alien (c) 1980 Data East Corporation
Original driver by Norbert Kehrer (February 2004)
***************************************************************************/
#include "driver.h"
#include "sound/ay8910.h"
#include "video/mc6845.h"
#include "madalien.h"
#define SOUND_CLOCK XTAL_4MHz
static UINT8 *shift_hi;
static UINT8 *shift_lo;
static INPUT_CHANGED( coin_inserted )
{
/* coin insertion causes an NMI */
cpunum_set_input_line(field->port->machine, 0, INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE);
}
INLINE UINT8 shift_common(running_machine *machine, UINT8 hi, UINT8 lo)
{
const UINT8 *table = memory_region(machine, "user2");
return table[((hi & 0x07) << 8) | lo];
}
static READ8_HANDLER( shift_r )
{
return shift_common(machine, *shift_hi, *shift_lo);
}
static READ8_HANDLER( shift_rev_r )
{
UINT8 hi = *shift_hi ^ 0x07;
UINT8 lo = BITSWAP8(*shift_lo,0,1,2,3,4,5,6,7);
UINT8 ret = shift_common(machine, hi, lo);
return BITSWAP8(ret,7,0,1,2,3,4,5,6) & 0x7f;
}
static WRITE8_HANDLER( madalien_output_w )
{
/* output latch, eight output bits, none connected */
}
static WRITE8_HANDLER( madalien_sound_command_w )
{
cpunum_set_input_line(machine, 1, 0, ASSERT_LINE);
soundlatch_w(machine, offset, data);
}
static READ8_HANDLER(madalien_sound_command_r )
{
cpunum_set_input_line(machine, 1, 0, CLEAR_LINE);
return soundlatch_r(machine, offset);
}
static WRITE8_HANDLER( madalien_portA_w )
{
discrete_sound_w(machine, MADALIEN_8910_PORTA, data);
}
static WRITE8_HANDLER( madalien_portB_w )
{
discrete_sound_w(machine, MADALIEN_8910_PORTB, data);
}
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x03ff) AM_RAM
AM_RANGE(0x6000, 0x63ff) AM_RAM AM_BASE(&madalien_videoram)
AM_RANGE(0x6400, 0x67ff) AM_RAM
AM_RANGE(0x6800, 0x7fff) AM_RAM AM_BASE(&madalien_charram)
AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x0ff0) AM_DEVWRITE(MC6845, "crtc", mc6845_address_w)
AM_RANGE(0x8001, 0x8001) AM_MIRROR(0x0ff0) AM_DEVREADWRITE(MC6845, "crtc", mc6845_register_r, mc6845_register_w)
AM_RANGE(0x8004, 0x8004) AM_MIRROR(0x0ff0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_video_control)
AM_RANGE(0x8005, 0x8005) AM_MIRROR(0x0ff0) AM_WRITE(madalien_output_w)
AM_RANGE(0x8006, 0x8006) AM_MIRROR(0x0ff0) AM_READWRITE(soundlatch2_r, madalien_sound_command_w)
AM_RANGE(0x8008, 0x8008) AM_MIRROR(0x07f0) AM_READWRITE(shift_r, SMH_RAM) AM_BASE(&shift_hi)
AM_RANGE(0x8009, 0x8009) AM_MIRROR(0x07f0) AM_READWRITE(shift_rev_r, SMH_RAM) AM_BASE(&shift_lo)
AM_RANGE(0x800b, 0x800b) AM_MIRROR(0x07f0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_video_flags)
AM_RANGE(0x800c, 0x800c) AM_MIRROR(0x07f0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_headlight_pos)
AM_RANGE(0x800d, 0x800d) AM_MIRROR(0x07f0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_edge1_pos)
AM_RANGE(0x800e, 0x800e) AM_MIRROR(0x07f0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_edge2_pos)
AM_RANGE(0x800f, 0x800f) AM_MIRROR(0x07f0) AM_WRITE(SMH_RAM) AM_BASE(&madalien_scroll)
AM_RANGE(0x9000, 0x9000) AM_MIRROR(0x0ff0) AM_READ_PORT("PLAYER1")
AM_RANGE(0x9001, 0x9001) AM_MIRROR(0x0ff0) AM_READ_PORT("DSW")
AM_RANGE(0x9002, 0x9002) AM_MIRROR(0x0ff0) AM_READ_PORT("PLAYER2")
AM_RANGE(0xa000, 0xffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( audio_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM
AM_RANGE(0x6000, 0x6003) AM_MIRROR(0x1ffc) AM_RAM /* unknown device in an epoxy block, might be tilt detection */
AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x1ffc) AM_READ(madalien_sound_command_r)
AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x1ffc) AM_WRITE(ay8910_control_port_0_w)
AM_RANGE(0x8001, 0x8001) AM_MIRROR(0x1ffc) AM_WRITE(ay8910_write_port_0_w)
AM_RANGE(0x8002, 0x8002) AM_MIRROR(0x1ffc) AM_WRITE(soundlatch2_w)
AM_RANGE(0xf800, 0xffff) AM_ROM
ADDRESS_MAP_END
static INPUT_PORTS_START( madalien )
PORT_START("PLAYER1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives )) PORT_DIPLOCATION("SW:1,2")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coinage )) PORT_DIPLOCATION("SW:3,4")
PORT_DIPSETTING( 0x0c, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) )
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW:5,6")
PORT_DIPSETTING( 0x00, "3000" )
PORT_DIPSETTING( 0x10, "5000" )
PORT_DIPSETTING( 0x20, "7000" )
PORT_DIPSETTING( 0x30, "never" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW:8")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ))
PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ))
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
PORT_START("PLAYER2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED(coin_inserted, 0)
INPUT_PORTS_END
static const ay8910_interface ay8910_config =
{
AY8910_LEGACY_OUTPUT,
AY8910_DEFAULT_LOADS,
NULL,
NULL,
madalien_portA_w,
madalien_portB_w
};
static MACHINE_DRIVER_START( madalien )
/* main CPU */
MDRV_CPU_ADD("main", M6502, MADALIEN_MAIN_CLOCK / 8) /* 1324kHz */
MDRV_CPU_PROGRAM_MAP(main_map, 0)
MDRV_CPU_ADD("audio", M6502, SOUND_CLOCK / 8) /* 512kHz */
MDRV_CPU_PROGRAM_MAP(audio_map, 0)
MDRV_CPU_VBLANK_INT("main", nmi_line_pulse)
/* video hardware */
MDRV_IMPORT_FROM(madalien_video)
/* audio hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("ay", AY8910, SOUND_CLOCK / 4)
MDRV_SOUND_CONFIG(ay8910_config)
MDRV_SOUND_ROUTE_EX(0, "discrete", 1.0, 0)
MDRV_SOUND_ROUTE_EX(1, "discrete", 1.0, 1)
MDRV_SOUND_ROUTE_EX(2, "discrete", 1.0, 2)
MDRV_SOUND_ADD("discrete", DISCRETE, 0)
MDRV_SOUND_CONFIG_DISCRETE(madalien)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END
ROM_START( madalien )
ROM_REGION( 0x10000, "main", 0 ) /* main CPU */
ROM_LOAD( "m7.3f", 0xc000, 0x0800, CRC(4d12f89d) SHA1(e155f9135bc2bea56e211052f2b74d25e76308c8) )
ROM_LOAD( "m6.3h", 0xc800, 0x0800, CRC(1bc4a57b) SHA1(02252b868d0c07c0a18240e9d831c303cdcfa9a6) )
ROM_LOAD( "m5.3k", 0xd000, 0x0800, CRC(8db99572) SHA1(f8cf22f8c134b47756b7f02c5ca0217100466744) )
ROM_LOAD( "m4.3l", 0xd800, 0x0800, CRC(fba671af) SHA1(dd74bd357c82d525948d836a7f860bbb3182c825) )
ROM_LOAD( "m3.4f", 0xe000, 0x0800, CRC(1aad640d) SHA1(9ace7d2c5ef9e789c2b8cc65420b19ce72cd95fa) )
ROM_LOAD( "m2.4h", 0xe800, 0x0800, CRC(cbd533a0) SHA1(d3be81fb9ba40e30e5ff0171efd656b11dd20f2b) )
ROM_LOAD( "m1.4k", 0xf000, 0x0800, CRC(ad654b1d) SHA1(f8b365dae3801e97e04a10018a790d3bdb5d9439) )
ROM_LOAD( "m0.4l", 0xf800, 0x0800, CRC(cf7aa787) SHA1(f852cc806ecc582661582326747974a14f50174a) )
ROM_REGION( 0x10000, "audio", 0 ) /* audio CPU */
ROM_LOAD( "m8", 0xf800, 0x0400, CRC(cfd19dab) SHA1(566dc84ffe9bcaeb112250a9e1882bf62f47b579) )
ROM_LOAD( "m9", 0xfc00, 0x0400, CRC(48f30f24) SHA1(9c0bf6e43b143d6af1ebb9dad2bdc2b53eb2e48e) )
ROM_REGION( 0x0c00, "gfx1", ROMREGION_DISPOSE ) /* background tiles */
ROM_LOAD( "mc.3k", 0x0000, 0x0400, CRC(2daadfb7) SHA1(8be084a39b256e538fd57111e92d47115cb142cd) )
ROM_LOAD( "md.3l", 0x0400, 0x0400, CRC(3ee1287a) SHA1(33bc59a8d09d22f3db80f881c2f37aa788718138) )
ROM_LOAD( "me.3m", 0x0800, 0x0400, CRC(45a5c201) SHA1(ac600afeabf494634c3189d8e96644bd0deb45f3) )
ROM_REGION( 0x0400, "gfx2", ROMREGION_DISPOSE ) /* headlight */
ROM_LOAD( "ma.2b", 0x0000, 0x0400, CRC(aab16446) SHA1(d2342627cc2766004343f27515d8a7989d5fe932) )
ROM_REGION( 0x0400, "user1", 0 ) /* background tile map */
ROM_LOAD( "mf.4h", 0x0000, 0x0400, CRC(e9cba773) SHA1(356c7edb1b412a9e04f0747e780c945af8791c55) )
ROM_REGION( 0x0800, "user2", 0 ) /* shifting table */
ROM_LOAD( "mb.5c", 0x0000, 0x0800, CRC(cb801e49) SHA1(7444c4af7cf07e5fdc54044d62ea4fcb201b2b8b) )
ROM_REGION( 0x0020, "proms", 0 ) /* color PROM */
ROM_LOAD( "mg.7f", 0x0000, 0x0020, CRC(3395b31f) SHA1(26235fb448a4180c58f0887e53a29c17857b3b34) )
ROM_END
/***************************************************************************
Mad Rider / Mad Alien
Data East, 1980
This game runs on 4 boards that plug into a PCB containing slots. The whole
thing is housed in a metal box. All of the PCBs in this box are labelled
'MAD RIDER'. The actual game appears to be Highway Chase on a Mad Alien PCB
and might have been converted from Mad Alien. However, the title screen still
says 'Mad Alien'. The graphics are bad on the edge of the road because one
PROM at 3K is incorrect. If you have access to a Mad Rider PCB, please dump
the PROM at 3K or contact us.
PCB Layouts
-----------
Top board
DE-0048B-1 CPU
|-----------------------------------|
| |
| 10.595MHz |
| DIP8(?) |
| |
| |
| DSW(8) |
| |
| DIP40 |
| |
| |
| |
| |
| |
| |
|-----------------------------------|
Notes:
This is joined to the PCB below with 4 small flat cables
All of the part numbers are scratched out on this PCB
DIP40 is a 6502 @ 1.324375MHz [10.595 / 8]
DE-0044B
|-------------------------------------|
| |
|-| |
| | DIP40 |-|
| | M5L8216P 2114 2114 |
| |* |
| | M5L8216P 2114 2114 |
|-| |
| 2114 M5L8216P 2114 2114 MG-1.7F |
| |
| 2114 M5L8216P 2114 2114 |
| |
| 2114 M5L8216P 2114 2114 |-|
| |
| 2114 M5L8216P 2114 2114 |
|-------------------------------------|
Notes:
* - Flat cable joined to next PCB down
DIP40 - probably 6845 video chip (surface scratched)
MG-1 - 82S123 Bipolar PROM
DE-0045B-1
|-------------------------------------|
| MD-1.3M |
|-| ME-1.3L |
| | MC-1.3K |-|
| | |
| |* MF-1.4H |
| | |
|-| |
| |
| |
| |
| MB.5C |
| |-|
| MA.2B |
| |
|-------------------------------------|
Notes:
* - Flat cable joined to above PCB
MA - 2708 EPROM
MB - 2716 EPROM
MC / MD \
ME / MF - uPB426 or 82S137 Bipolar PROMs
DE-0047B-1
|-------------------------------------|
| DIP16 |
| 555 4MHz |
| 8910 |-|
| 4066 6502 |
| |
| |
|* |
| 555 9_2708.3D |
| 8_2708.4D |
| |
| LM348 |
| 4066 2114 |-|
| 555 |
| LM348 4066 2114 |
|-------------------------------------|
Notes:
* - 3 pin sound output connector
6502 - 6502 CPU running at 0.500MHz [4/8]
NMI on pin 6 measured 50.0Hz
8910 - AY3-8910 sound chip running at 1.000MHz [4/4]
DIP16 - socket for small plug-in board containing 3 chips
which is covered with epoxy resin
Bottom board
DE-0046B-1 ROM
|-------------------------------------|
| @ |
| 2716.3L 2716.4L |
| |-|
|-| 2716.3K 2716.4K |
| | |
| | 2716.3H 2716.4H |
| | # |
| | 2716.3F 2716.4F |
| | |
| | 2716.4E |
| | |
|-| 2716.4C |-|
| |
| & % |
|-------------------------------------|
Notes:
* - 50 pin flat cable connector for controls and video output
& - 4 wire jumpers
% - 4 wire jumpers
# - 6 wire jumpers
@ - 3 wire jumpers
All ROMs type 2716
VSync - 55Hz
HSync - 15.43kHz
***************************************************************************/
ROM_START( madalina )
ROM_REGION( 0x10000, "main", 0 ) /* main CPU */
ROM_LOAD( "2716.4c", 0xb000, 0x0800, CRC(90be68af) SHA1(472ccfd2e04d6d49be47d919cba0c55d850b2887) )
ROM_LOAD( "2716.4e", 0xb800, 0x0800, CRC(aba10cbb) SHA1(6ca213ded8ed7f4f310ab5ae25220cf867dd1d00) )
ROM_LOAD( "2716.3f", 0xc000, 0x0800, CRC(c3af484c) SHA1(c3667526d3b5aeee68823f92826053e657512851) )
ROM_LOAD( "2716.3h", 0xc800, 0x0800, CRC(78ca5a87) SHA1(729d69ee63c710241a098471e9769063dfe8ef1e) )
ROM_LOAD( "2716.3k", 0xd000, 0x0800, CRC(070e81ea) SHA1(006831f4bf289812e4e87a3ece7885e8b901f2f5) )
ROM_LOAD( "2716.3l", 0xd800, 0x0800, CRC(98225cb0) SHA1(ca74f5e33fa9116215b03abadd5d09840c04fb0b) )
ROM_LOAD( "2716.4f", 0xe000, 0x0800, CRC(52fea0fc) SHA1(443fd859daf4279d5976256a4b1c970b520661a2) )
ROM_LOAD( "2716.4h", 0xe800, 0x0800, CRC(dba6c4f6) SHA1(51f815fc7eb99a05eee6204de2d4cad1734adc52) )
ROM_LOAD( "2716.4k", 0xf000, 0x0800, CRC(06991af6) SHA1(19112306529721222b6e1c07920348c263d8b8aa) )
ROM_LOAD( "2716.4l", 0xf800, 0x0800, CRC(57752b47) SHA1(a34d3150ea9082889154042dbea3386f71322a78) )
ROM_REGION( 0x10000, "audio", 0 ) /* audio CPU */
ROM_LOAD( "8_2708.4d", 0xf800, 0x0400, CRC(46162e7e) SHA1(7ed85f4a9ac58d6d9bafba0c843a16c269656563) )
ROM_LOAD( "9_2708.3d", 0xfc00, 0x0400, CRC(4175f5c4) SHA1(45cae8a1fcfd34b91c63cc7e544a32922da14f16) )
ROM_REGION( 0x0c00, "gfx1", ROMREGION_DISPOSE ) /* background tiles */
ROM_LOAD( "mc-1.3k", 0x0000, 0x0400, NO_DUMP )
ROM_LOAD( "me-1.3l", 0x0400, 0x0400, CRC(7328a425) SHA1(327adc8b0e25d93f1ae98a44c26d0aaaac1b1a9c) )
ROM_LOAD( "md-1.3m", 0x0800, 0x0400, CRC(b5329929) SHA1(86890e1b7cc8cb31fc0dcbc2d3cff02e4cf95619) )
ROM_REGION( 0x0400, "gfx2", ROMREGION_DISPOSE ) /* headlight */
ROM_LOAD( "ma.2b", 0x0000, 0x0400, CRC(aab16446) SHA1(d2342627cc2766004343f27515d8a7989d5fe932) )
ROM_REGION( 0x0400, "user1", 0 ) /* background tile map */
ROM_LOAD( "mf-1.4h", 0x0000, 0x0400, CRC(9b04c446) SHA1(918013f3c0244ab6a670b9d1b6b642298e2c5ab8) )
ROM_REGION( 0x0800, "user2", 0 ) /* shifting table */
ROM_LOAD( "mb.5c", 0x0000, 0x0800, CRC(cb801e49) SHA1(7444c4af7cf07e5fdc54044d62ea4fcb201b2b8b) )
ROM_REGION( 0x0020, "proms", 0 ) /* color PROM */
ROM_LOAD( "mg-1.7f", 0x0000, 0x0020, CRC(e622396a) SHA1(8972704bd25fed462e25c453771cc5ca4fc74034) )
ROM_END
/* set parent machine inp init */
GAME( 1980, madalien, 0, madalien, madalien, 0, ROT270, "Data East Corporation", "Mad Alien", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
GAME( 1980, madalina, madalien, madalien, madalien, 0, ROT270, "Data East Corporation", "Mad Alien (Highway Chase)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )