New games added or promoted from NOT_WORKING status

---------------------------------------------------
Coco Loco [Roberto Fresca, Angelo Salese, Punkyas (from AUMAP),
 Ricky2001 (from AUMAP)]
This commit is contained in:
Roberto Fresca 2014-05-11 17:48:53 +00:00
parent 7e22428d6a
commit 9bf2c3db7f
4 changed files with 369 additions and 0 deletions

1
.gitattributes vendored
View File

@ -4368,6 +4368,7 @@ src/mame/drivers/cmmb.c svneol=native#text/plain
src/mame/drivers/cninja.c svneol=native#text/plain
src/mame/drivers/cntsteer.c svneol=native#text/plain
src/mame/drivers/cobra.c svneol=native#text/plain
src/mame/drivers/cocoloco.c svneol=native#text/plain
src/mame/drivers/coinmstr.c svneol=native#text/plain
src/mame/drivers/coinmvga.c svneol=native#text/plain
src/mame/drivers/combatsc.c svneol=native#text/plain

366
src/mame/drivers/cocoloco.c Normal file
View File

@ -0,0 +1,366 @@
/******************************************************************************
Coco Loco
Petaco S.A. (Spain)
Driver by Roberto Fresca & Angelo Salese.
*******************************************************************************
Hardware Notes:
--------------
Single Board.
Etched in copper: "112-020"
- CPU: 1x R6502AP.
- Sound: 1x AY-3-8910.
- RAM: 11x MM5290N-3 (16K x 1) Dynamic RAM.
- ROMs: 6X 2716.
- PROMs: 1X 74S471 bipolar PROM (256 x 8), filled with 0xff but works).
Colors look fine and without this device there is no picture.
- Crystal: 1x 20 MHz.
- 2x 8 DIP switches banks.
- 1x 2x22 pins edge connector.
*******************************************************************************
*** Memory Map ***
$0000 - $00FF RAM ; Zero Page (pointers and registers)
$0100 - $01FF RAM ; 6502 Stack Pointer.
$0200 - $07FF RAM ; R/W. (settings)
$2000 - $3FFF VRAM ; Video RAM.
$6001 - $6001 PSG ; AY-3-8910 data read.
$6002 - $6002 PSG ; AY-3-8910 data write.
$6003 - $6003 PSG ; AY-3-8910 address write.
$8003 - $8003 BNK ; Video bank register.
$8005 - $8005 ; Coin counter.
$A000 - $A000 INP ; Input port.
$A005 - $A005 ??? ; Unknown reads.
; VRAM clear?
$D000 - $FFFF ROM ; ROM space.
*******************************************************************************
DRIVER UPDATES:
2014-05-11
- Initial Release.
TODO:
- Find the 25 Pesetas missing coin input.
- Verify audio outputs against the real hardware.
- Verify video timings.
- PROM verification and real colors.
- Find the meaning of A005h reads (always discarded).
*******************************************************************************/
#define MASTER_CLOCK XTAL_20MHz /* confirmed */
#define CPU_CLOCK MASTER_CLOCK / 16 /* confirmed */
#define SND_CLOCK MASTER_CLOCK / 8 /* confirmed */
#include "emu.h"
#include "cpu/m6502/m6502.h"
#include "sound/ay8910.h"
class cocoloco_state : public driver_device
{
public:
cocoloco_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette") { }
UINT8 *m_videoram;
UINT8 m_videobank;
DECLARE_READ8_MEMBER(cocoloco_vram_r);
DECLARE_WRITE8_MEMBER(cocoloco_vram_w);
DECLARE_WRITE8_MEMBER(cocoloco_vbank_w);
DECLARE_WRITE8_MEMBER(cocoloco_vram_clear_w);
DECLARE_WRITE8_MEMBER(cocoloco_coin_counter_w);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
virtual void video_start();
DECLARE_PALETTE_INIT(cocoloco);
UINT32 screen_update_cocoloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
};
/***********************************
* Video Hardware *
***********************************/
PALETTE_INIT_MEMBER(cocoloco_state, cocoloco)
{
for(int i = 0; i < 0x10; i += 2)
{
int r,g,b;
r = pal2bit(i & 3);
g = pal2bit((i >> 1) & 3);
b = pal2bit((i >> 2) & 3);
palette.set_pen_color(i, rgb_t(r, g, b));
}
palette.set_pen_color(0x01, rgb_t(0xff, 0xff, 0x00));
palette.set_pen_color(0x02, rgb_t(0x00, 0xff, 0x00));
palette.set_pen_color(0x04, rgb_t(0x00, 0x7f, 0xff));
palette.set_pen_color(0x08, rgb_t(0xff, 0x7f, 0x00));
palette.set_pen_color(0x0a, rgb_t(0x00, 0xff, 0xff));
palette.set_pen_color(0x0c, rgb_t(0xff, 0x00, 0x00));
palette.set_pen_color(0x0e, rgb_t(0xff, 0xff, 0xff));
}
void cocoloco_state::video_start()
{
m_videoram = auto_alloc_array(machine(), UINT8, 0x2000 * 8);
}
UINT32 cocoloco_state::screen_update_cocoloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int x, y, count, xi;
bitmap.fill(m_palette->black_pen(), cliprect);
count = 0;
for(x = 0; x < 256; x += 8)
{
for(y = 0; y < 256; y++)
{
for (xi = 0; xi < 8; xi++)
{
int color;
color = (m_videoram[count|0x0000] >> (xi)) & 1;
color |= ((m_videoram[count|0x2000] >> (xi)) & 1) << 1;
color |= ((m_videoram[count|0x4000] >> (xi)) & 1) << 2;
color |= ((m_videoram[count|0x6000] >> (xi)) & 1) << 3;
if(cliprect.contains(x + xi, 256 - y))
bitmap.pix16(256 - y, x + xi) = m_palette->pen(color & 0x0f);
}
count++;
}
}
return 0;
}
READ8_MEMBER( cocoloco_state::cocoloco_vram_r )
{
return m_videoram[offset|0x0000] | m_videoram[offset|0x2000] | m_videoram[offset|0x4000] | m_videoram[offset|0x6000];
}
WRITE8_MEMBER( cocoloco_state::cocoloco_vram_w )
{
m_videoram[offset|0x0000] = (m_videobank == 0) ? data : 0;
m_videoram[offset|0x2000] = (m_videobank & 2) ? data : 0;
m_videoram[offset|0x4000] = (m_videobank & 4) ? data : 0;
m_videoram[offset|0x6000] = (m_videobank & 8) ? data : 0;
}
WRITE8_MEMBER( cocoloco_state::cocoloco_vbank_w )
{
m_videobank = data;
}
WRITE8_MEMBER( cocoloco_state::cocoloco_vram_clear_w )
{
/* ??? */
// for(int i=0;i<0x8000;i++)
// m_videoram[i] = 0;
// popmessage("A005 writes: %02X", data);
}
WRITE8_MEMBER( cocoloco_state::cocoloco_coin_counter_w )
{
/* - bits -
7654 3210
---- x--- Coin counter (see $DF90).
xxxx -xxx Unknown.
The coin counter gives 2 pulses for each coin inserted.
They explain in a sheet that the coin in for 50 pesetas
behaves like 2x 25 pesetas (1 duro) coins, so has sense.
*/
coin_counter_w(machine(), 0, data & 0x08);
}
/***********************************
* Memory Map Information *
***********************************/
static ADDRESS_MAP_START( cocoloco_map, AS_PROGRAM, 8, cocoloco_state )
AM_RANGE(0x0000, 0x1fff) AM_RAM
AM_RANGE(0x2000, 0x3fff) AM_READWRITE(cocoloco_vram_r, cocoloco_vram_w) // 256 x 256 x 1
AM_RANGE(0x6001, 0x6001) AM_DEVREAD("ay8910", ay8910_device, data_r)
AM_RANGE(0x6002, 0x6002) AM_DEVWRITE("ay8910", ay8910_device, data_w)
AM_RANGE(0x6003, 0x6003) AM_DEVWRITE("ay8910", ay8910_device, address_w)
AM_RANGE(0x8003, 0x8003) AM_WRITE(cocoloco_vbank_w)
AM_RANGE(0x8005, 0x8005) AM_WRITE(cocoloco_coin_counter_w)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("IN0")
AM_RANGE(0xa005, 0xa005) AM_WRITE(cocoloco_vram_clear_w)
AM_RANGE(0xd000, 0xffff) AM_ROM
ADDRESS_MAP_END
/*
1800-3fff: RW --> code inits reading and writting the whole range.
All 3 instances of A005 reads (d07e, d355 and dca8),
discard the read in a non-sense way....
There is another register (8005h), that is written by the code
(bit3 on/off) after coin-in, and checking the inputs too...
Seems coin counter, but the input check is suspicious.
To see this. Put a BP at DF90h, run the game and coin in...
*/
/***********************************
* Input Ports *
***********************************/
INPUT_CHANGED_MEMBER(cocoloco_state::coin_inserted)
{
if(newval)
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
static INPUT_PORTS_START( cocoloco )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, cocoloco_state, coin_inserted, 0)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select / Speed-Up Button")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_START("DSW1") // DSW1 @4B
PORT_DIPNAME( 0x01, 0x00, "Char Speed" ) PORT_DIPLOCATION("DSW1:!1")
PORT_DIPSETTING( 0x00, "Fast" )
PORT_DIPSETTING( 0x01, "Slow" )
PORT_DIPNAME( 0x02, 0x00, "Monsters Speed" ) PORT_DIPLOCATION("DSW1:!2")
PORT_DIPSETTING( 0x00, "Fast" )
PORT_DIPSETTING( 0x02, "Slow" )
PORT_DIPNAME( 0x0c, 0x00, "Monsters: Time before go out" ) PORT_DIPLOCATION("DSW1:!3,!4")
PORT_DIPSETTING( 0x00, "Long" )
PORT_DIPSETTING( 0x04, "Medium-Long" )
PORT_DIPSETTING( 0x08, "Medium-Short" )
PORT_DIPSETTING( 0x0c, "Short" )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) // switches 5-6-7-8 marked as unused.
PORT_START("DSW2") // DSW2 @5C
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW2:!1,!2")
PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("DSW2:!3,!4")
PORT_DIPSETTING( 0x00, "10000 Points" )
PORT_DIPSETTING( 0x04, "15000 Points" )
PORT_DIPSETTING( 0x08, "20000 Points" )
PORT_DIPSETTING( 0x0c, "30000 Points" )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW2:!5")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x10, "3" )
PORT_DIPNAME( 0x20, 0x00, "Monsters" ) PORT_DIPLOCATION("DSW2:!6")
PORT_DIPSETTING( 0x00, "4" )
PORT_DIPSETTING( 0x20, "5" )
PORT_DIPNAME( 0xc0, 0x00, "Vitamine Time" ) PORT_DIPLOCATION("DSW2:!7,!8")
PORT_DIPSETTING( 0x00, "Long" )
PORT_DIPSETTING( 0x40, "Medium-Long" )
PORT_DIPSETTING( 0x80, "Medium-Short" )
PORT_DIPSETTING( 0xc0, "Short" )
INPUT_PORTS_END
/***********************************
* Machine Drivers *
***********************************/
static MACHINE_CONFIG_START( cocoloco, cocoloco_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, CPU_CLOCK) /* confirmed */
MCFG_CPU_PROGRAM_MAP(cocoloco_map)
// MCFG_CPU_VBLANK_INT_DRIVER("screen", cocoloco_state, nmi_line_pulse)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(CPU_CLOCK * 4, 384, 0, 256, 262, 0, 256) /* TODO: not accurate, ~50 Hz */
MCFG_SCREEN_UPDATE_DRIVER(cocoloco_state, screen_update_cocoloco)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 0x10)
MCFG_PALETTE_INIT_OWNER(cocoloco_state, cocoloco)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ay8910", AY8910, SND_CLOCK) /* confirmed */
MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW1"))
MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW2"))
// MCFG_SOUND_ROUTE(0, "mono", 0.75)
// MCFG_SOUND_ROUTE(1, "mono", 1.40)
// MCFG_SOUND_ROUTE(2, "mono", 0.75)
/* Extremely high values due to skew bias (negative offset) stream */
MCFG_SOUND_ROUTE(0, "mono", 1.50)
MCFG_SOUND_ROUTE(1, "mono", 4.50)
MCFG_SOUND_ROUTE(2, "mono", 1.50)
MACHINE_CONFIG_END
/***********************************
* Rom Load *
***********************************/
ROM_START( cocoloco )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "coco1-c.b1", 0xd000, 0x0800, CRC(f2a699a9) SHA1(7032af9b416665df2f17bb308a297d65c29a09fb) )
ROM_LOAD( "coco1-d.b1", 0xd800, 0x0800, CRC(08e00d09) SHA1(82b3982df81fb374bd385935c3ca61330f1a673f) )
ROM_LOAD( "coco1-e.c1", 0xe000, 0x0800, CRC(2adbf6ff) SHA1(f2d3f33b7d8812974765303f3ea5230e3b7bed37) )
ROM_LOAD( "coco1-f.c1", 0xe800, 0x0800, CRC(2ada04a0) SHA1(8d0402d7f77e382afebecf5e8f7b2aac4567b9e7) )
ROM_LOAD( "coco1-g.e1", 0xf000, 0x0800, CRC(454fbc8e) SHA1(edf22d1939a3a14f30f14c021e47aa9404fa4c75) )
ROM_LOAD( "coco1-h.e1", 0xf800, 0x0800, CRC(b6d0ebea) SHA1(a8f09558f71dfe0d300a6bb946dcb3bf6393c02b) )
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "prom.c10", 0x0000, 0x0100, CRC(fea8a821) SHA1(c744cac6af7621524fc3a2b0a9a135a32b33c81b) )
ROM_END
/***********************************
* Game Drivers *
***********************************/
/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */
GAME( 198?, cocoloco, 0, cocoloco, cocoloco, driver_device, 0, ROT90, "Petaco S.A.", "Coco Loco", 0 )

View File

@ -31334,3 +31334,4 @@ gluck2 // 1992 Yung Yu / CYE
fireball
amusco // 1987, Amusco.
cocoloco // 198?, Petaco S.A.

View File

@ -2211,6 +2211,7 @@ $(MAMEOBJ)/misc.a: \
$(DRIVERS)/chicago.o \
$(DRIVERS)/chsuper.o \
$(DRIVERS)/cidelsa.o $(VIDEO)/cidelsa.o \
$(DRIVERS)/cocoloco.o \
$(DRIVERS)/coinmstr.o \
$(DRIVERS)/coinmvga.o \
$(DRIVERS)/comebaby.o \