New clones marked not working

-----------------------------
Mr. and Mrs. PacMan (set 2) [caius]

- dataeast/compgolf.cpp, dataeast/dassault.cpp: consolidated drivers in single files
This commit is contained in:
Ivan Vangelista 2023-07-05 18:13:17 +02:00
parent 7d184d72bc
commit 19a665dc70
8 changed files with 726 additions and 723 deletions

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese, Pierpaolo Prazzoli, Bryan McPhail
// copyright-holders: Angelo Salese, Pierpaolo Prazzoli, Bryan McPhail
/*******************************************************************************************
Competition Golf Final Round (c) 1986 / 1985 Data East
@ -12,14 +13,200 @@
*******************************************************************************************/
#include "emu.h"
#include "cpu/m6809/m6809.h"
#include "sound/ymopn.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
#include "compgolf.h"
namespace {
class compgolf_state : public driver_device
{
public:
compgolf_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_bg_ram(*this, "bg_ram"),
m_spriteram(*this, "spriteram"),
m_rombank(*this, "rombank"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void init_compgolf() ATTR_COLD;
void compgolf(machine_config &config) ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
private:
// memory pointers
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_bg_ram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_rombank;
// devices
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// video-related
tilemap_t *m_text_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_scrollx_lo = 0;
uint16_t m_scrollx_hi = 0;
uint8_t m_scrolly_lo = 0;
uint16_t m_scrolly_hi = 0;
// misc
int8_t m_bank = 0;
void ctrl_w(uint8_t data);
void video_w(offs_t offset, uint8_t data);
void back_w(offs_t offset, uint8_t data);
void scrollx_lo_w(uint8_t data);
void scrolly_lo_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_text_info);
TILEMAP_MAPPER_MEMBER(back_scan);
TILE_GET_INFO_MEMBER(get_back_info);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void expand_bg() ATTR_COLD;
void program_map(address_map &map) ATTR_COLD;
};
// video
void compgolf_state::palette(palette_device &palette) const
{
uint8_t const *const color_prom = memregion("proms")->base();
for (int i = 0; i < palette.entries(); i++)
{
int bit0, bit1, bit2;
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = 0;
bit1 = (color_prom[i] >> 6) & 0x01;
bit2 = (color_prom[i] >> 7) & 0x01;
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_pen_color(i, rgb_t(r, g, b));
}
}
void compgolf_state::video_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_text_tilemap->mark_tile_dirty(offset / 2);
}
void compgolf_state::back_w(offs_t offset, uint8_t data)
{
m_bg_ram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(compgolf_state::get_text_info)
{
tile_index <<= 1;
tileinfo.set(2, m_videoram[tile_index + 1] | (m_videoram[tile_index] << 8), m_videoram[tile_index] >> 2, 0);
}
TILEMAP_MAPPER_MEMBER(compgolf_state::back_scan)
{
// logical (col,row) -> memory offset
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x10) << 4) + ((row & 0x10) << 5);
}
TILE_GET_INFO_MEMBER(compgolf_state::get_back_info)
{
int const attr = m_bg_ram[tile_index * 2];
int const code = m_bg_ram[tile_index * 2 + 1] + ((attr & 1) << 8);
int const color = (attr & 0x3e) >> 1;
tileinfo.set(1, code, color, 0);
}
void compgolf_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(compgolf_state::get_back_info)), tilemap_mapper_delegate(*this, FUNC(compgolf_state::back_scan)), 16, 16, 32, 32);
m_text_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(compgolf_state::get_text_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_text_tilemap->set_transparent_pen(0);
}
/*
preliminary sprite list:
0 1 2 3
xx------ xxxxxxxx -------- -------- sprite code
---x---- -------- -------- -------- Double Height
----x--- -------- -------- -------- Color,all of it?
-------- -------- xxxxxxxx -------- Y pos
-------- -------- -------- xxxxxxxx X pos
-----x-- -------- -------- -------- Flip X
-------- -------- -------- -------- Flip Y(used?)
*/
void compgolf_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = 0; offs < 0x60; offs += 4)
{
int const sprite = m_spriteram[offs + 1] + (((m_spriteram[offs] & 0xc0) >> 6) * 0x100);
int const x = 240 - m_spriteram[offs + 3];
int const y = m_spriteram[offs + 2];
int const color = (m_spriteram[offs] & 8) >> 3;
int const fx = m_spriteram[offs] & 4;
int const fy = 0; // ?
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect,
sprite,
color, fx, fy, x, y, 0);
// Double Height
if(m_spriteram[offs] & 0x10)
{
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect,
sprite + 1,
color, fx, fy, x, y + 16, 0);
}
}
}
uint32_t compgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int const scrollx = m_scrollx_hi + m_scrollx_lo;
int const scrolly = m_scrolly_hi + m_scrolly_lo;
m_bg_tilemap->set_scrollx(0, scrollx);
m_bg_tilemap->set_scrolly(0, scrolly);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_text_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
/*************************************
*
@ -27,26 +214,26 @@
*
*************************************/
void compgolf_state::compgolf_scrollx_lo_w(uint8_t data)
void compgolf_state::scrollx_lo_w(uint8_t data)
{
m_scrollx_lo = data;
}
void compgolf_state::compgolf_scrolly_lo_w(uint8_t data)
void compgolf_state::scrolly_lo_w(uint8_t data)
{
m_scrolly_lo = data;
}
void compgolf_state::compgolf_ctrl_w(uint8_t data)
void compgolf_state::ctrl_w(uint8_t data)
{
/* bit 4 and 6 are always set */
// bit 4 and 6 are always set
int new_bank = (data & 4) >> 2;
int const new_bank = (data & 4) >> 2;
if (m_bank != new_bank)
{
m_bank = new_bank;
membank("bank1")->set_entry(m_bank);
m_rombank->set_entry(m_bank);
}
m_scrollx_hi = (data & 1) << 8;
@ -60,19 +247,19 @@ void compgolf_state::compgolf_ctrl_w(uint8_t data)
*
*************************************/
void compgolf_state::compgolf_map(address_map &map)
void compgolf_state::program_map(address_map &map)
{
map(0x0000, 0x07ff).ram();
map(0x1000, 0x17ff).ram().w(FUNC(compgolf_state::compgolf_video_w)).share("videoram");
map(0x1800, 0x1fff).ram().w(FUNC(compgolf_state::compgolf_back_w)).share("bg_ram");
map(0x2000, 0x2060).ram().share("spriteram");
map(0x1000, 0x17ff).ram().w(FUNC(compgolf_state::video_w)).share(m_videoram);
map(0x1800, 0x1fff).ram().w(FUNC(compgolf_state::back_w)).share(m_bg_ram);
map(0x2000, 0x2060).ram().share(m_spriteram);
map(0x2061, 0x2061).nopw();
map(0x3000, 0x3000).portr("P1");
map(0x3001, 0x3001).portr("P2").w(FUNC(compgolf_state::compgolf_ctrl_w));
map(0x3001, 0x3001).portr("P2").w(FUNC(compgolf_state::ctrl_w));
map(0x3002, 0x3002).portr("DSW1");
map(0x3003, 0x3003).portr("DSW2");
map(0x3800, 0x3801).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0x4000, 0x7fff).bankr("bank1");
map(0x4000, 0x7fff).bankr(m_rombank);
map(0x8000, 0xffff).rom();
}
@ -138,7 +325,7 @@ static INPUT_PORTS_START( compgolf )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) /* Manual states dips 4-8 are "Unused" */
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) // Manual states dips 4-8 are "Unused"
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
@ -192,9 +379,9 @@ static const gfx_layout tilelayout8 =
};
static GFXDECODE_START( gfx_compgolf )
GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0, 0x10 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayoutbg, 0, 0x20 )
GFXDECODE_ENTRY( "gfx3", 0, tilelayout8, 0, 0x10 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0, 0x10 )
GFXDECODE_ENTRY( "bgtiles", 0, tilelayoutbg, 0, 0x20 )
GFXDECODE_ENTRY( "chars", 0, tilelayout8, 0, 0x10 )
GFXDECODE_END
@ -206,6 +393,8 @@ GFXDECODE_END
void compgolf_state::machine_start()
{
m_rombank->configure_entries(0, 2, memregion("bgdata")->base(), 0x4000);
save_item(NAME(m_bank));
save_item(NAME(m_scrollx_lo));
save_item(NAME(m_scrollx_hi));
@ -224,30 +413,30 @@ void compgolf_state::machine_reset()
void compgolf_state::compgolf(machine_config &config)
{
/* basic machine hardware */
MC6809E(config, m_maincpu, 2000000); // HD68B09EP
m_maincpu->set_addrmap(AS_PROGRAM, &compgolf_state::compgolf_map);
// basic machine hardware
MC6809E(config, m_maincpu, 2'000'000); // HD68B09EP
m_maincpu->set_addrmap(AS_PROGRAM, &compgolf_state::program_map);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
screen.set_size(256, 256);
screen.set_visarea(1*8, 32*8-1, 1*8, 31*8-1);
screen.set_screen_update(FUNC(compgolf_state::screen_update_compgolf));
screen.set_screen_update(FUNC(compgolf_state::screen_update));
screen.set_palette(m_palette);
screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, m_palette, FUNC(compgolf_state::compgolf_palette), 0x100);
PALETTE(config, m_palette, FUNC(compgolf_state::palette), 0x100);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_compgolf);
SPEAKER(config, "mono").front_center();
ym2203_device &ymsnd(YM2203(config, "ymsnd", 1500000));
ym2203_device &ymsnd(YM2203(config, "ymsnd", 1'500'000));
ymsnd.irq_handler().set_inputline(m_maincpu, 0);
ymsnd.port_a_write_callback().set(FUNC(compgolf_state::compgolf_scrollx_lo_w));
ymsnd.port_b_write_callback().set(FUNC(compgolf_state::compgolf_scrolly_lo_w));
ymsnd.port_a_write_callback().set(FUNC(compgolf_state::scrollx_lo_w));
ymsnd.port_b_write_callback().set(FUNC(compgolf_state::scrolly_lo_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
}
@ -262,22 +451,22 @@ ROM_START( compgolf )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "cv05-3.bin", 0x08000, 0x8000, CRC(af9805bf) SHA1(bdde482906bb267e76317067785ac0ab7816df63) )
ROM_REGION( 0x8000, "user1", 0 ) // background data
ROM_REGION( 0x8000, "bgdata", 0 )
ROM_LOAD( "cv06.bin", 0x00000, 0x8000, CRC(8f76979d) SHA1(432f6a1402fd3276669f5f45f03fd12380900178) )
ROM_REGION( 0x18000, "gfx1", 0 ) // Sprites
ROM_REGION( 0x18000, "sprites", 0 )
ROM_LOAD( "cv00.bin", 0x00000, 0x8000, CRC(aa3d3b99) SHA1(eb968e40bcc7e7dd1acc0bbe885fd3f7d70d4bb5) )
ROM_LOAD( "cv01.bin", 0x08000, 0x8000, CRC(f68c2ff6) SHA1(dda9159fb59d3855025b98c272722b031617c89a) )
ROM_LOAD( "cv02.bin", 0x10000, 0x8000, CRC(979cdb5a) SHA1(25c1f3e6ddf50168c7e1a967bfa2753bea6106ec) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "bgtiles", 0 )
ROM_LOAD( "cv03.bin", 0x00000, 0x8000, CRC(cc7ed6d8) SHA1(4ffcfa3f720414e1b7e929bdf29359ebcd8717c3) )
/* we expand rom cv04.bin to 0x8000 - 0xffff */
// we expand ROM cv04.bin to 0x8000 - 0xffff
ROM_REGION( 0x8000, "gfx3", 0 )
ROM_REGION( 0x8000, "chars", 0 )
ROM_LOAD( "cv07.bin", 0x00000, 0x8000, CRC(ed5441ba) SHA1(69d50695e8b92544f9857c6f3de0efb399899a2c) )
ROM_REGION( 0x4000, "gfx4", 0 )
ROM_REGION( 0x4000, "bgtiles2", 0 )
ROM_LOAD( "cv04.bin", 0x00000, 0x4000, CRC(df693a04) SHA1(45bef98c7e66881f8c62affecc1ab90dd2707240) )
ROM_REGION( 0x100, "proms", 0 )
@ -288,22 +477,22 @@ ROM_START( compgolfo )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "cv05.bin", 0x08000, 0x8000, CRC(3cef62c9) SHA1(c4827b45faf7aa4c80ddd3c57f1ed6ba76b5c49b) )
ROM_REGION( 0x8000, "user1", 0 ) // background data
ROM_REGION( 0x8000, "bgdata", 0 )
ROM_LOAD( "cv06.bin", 0x00000, 0x8000, CRC(8f76979d) SHA1(432f6a1402fd3276669f5f45f03fd12380900178) )
ROM_REGION( 0x18000, "gfx1", 0 ) // Sprites
ROM_REGION( 0x18000, "sprites", 0 )
ROM_LOAD( "cv00.bin", 0x00000, 0x8000, CRC(aa3d3b99) SHA1(eb968e40bcc7e7dd1acc0bbe885fd3f7d70d4bb5) )
ROM_LOAD( "cv01.bin", 0x08000, 0x8000, CRC(f68c2ff6) SHA1(dda9159fb59d3855025b98c272722b031617c89a) )
ROM_LOAD( "cv02.bin", 0x10000, 0x8000, CRC(979cdb5a) SHA1(25c1f3e6ddf50168c7e1a967bfa2753bea6106ec) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "bgtiles", 0 )
ROM_LOAD( "cv03.bin", 0x00000, 0x8000, CRC(cc7ed6d8) SHA1(4ffcfa3f720414e1b7e929bdf29359ebcd8717c3) )
/* we expand rom cv04.bin to 0x8000 - 0xffff */
// we expand ROM cv04.bin to 0x8000 - 0xffff
ROM_REGION( 0x8000, "gfx3", 0 )
ROM_REGION( 0x8000, "chars", 0 )
ROM_LOAD( "cv07.bin", 0x00000, 0x8000, CRC(ed5441ba) SHA1(69d50695e8b92544f9857c6f3de0efb399899a2c) )
ROM_REGION( 0x4000, "gfx4", 0 )
ROM_REGION( 0x4000, "bgtiles2", 0 )
ROM_LOAD( "cv04.bin", 0x00000, 0x4000, CRC(df693a04) SHA1(45bef98c7e66881f8c62affecc1ab90dd2707240) )
ROM_REGION( 0x100, "proms", 0 )
@ -317,14 +506,12 @@ ROM_END
*
*************************************/
void compgolf_state::compgolf_expand_bg()
void compgolf_state::expand_bg()
{
uint8_t *GFXDST = memregion("gfx2")->base();
uint8_t *GFXSRC = memregion("gfx4")->base();
uint8_t *GFXDST = memregion("bgtiles")->base();
uint8_t *GFXSRC = memregion("bgtiles2")->base();
int x;
for (x = 0; x < 0x4000; x++)
for (int x = 0; x < 0x4000; x++)
{
GFXDST[0x8000 + x] = (GFXSRC[x] & 0x0f) << 4;
GFXDST[0xc000 + x] = (GFXSRC[x] & 0xf0);
@ -333,10 +520,11 @@ void compgolf_state::compgolf_expand_bg()
void compgolf_state::init_compgolf()
{
membank("bank1")->configure_entries(0, 2, memregion("user1")->base(), 0x4000);
compgolf_expand_bg();
expand_bg();
}
} // anonymous namespace
/*************************************
*
@ -344,5 +532,5 @@ void compgolf_state::init_compgolf()
*
*************************************/
GAME( 1986, compgolf, 0, compgolf, compgolf, compgolf_state, init_compgolf, ROT0, "Data East", "Competition Golf Final Round (revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, compgolf, 0, compgolf, compgolf, compgolf_state, init_compgolf, ROT0, "Data East", "Competition Golf Final Round (revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, compgolfo, compgolf, compgolf, compgolf, compgolf_state, init_compgolf, ROT0, "Data East", "Competition Golf Final Round (Japan, old version)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,69 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese, Pierpaolo Prazzoli, Bryan McPhail
/*************************************************************************
Competition Golf Final Round
*************************************************************************/
#ifndef MAME_DATAEAST_COMPGOLF_H
#define MAME_DATAEAST_COMPGOLF_H
#pragma once
#include "emupal.h"
#include "tilemap.h"
class compgolf_state : public driver_device
{
public:
compgolf_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_bg_ram(*this, "bg_ram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void init_compgolf();
void compgolf(machine_config &config);
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_bg_ram;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t *m_text_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
int m_scrollx_lo = 0;
int m_scrollx_hi = 0;
int m_scrolly_lo = 0;
int m_scrolly_hi = 0;
/* misc */
int m_bank = 0;
void compgolf_ctrl_w(uint8_t data);
void compgolf_video_w(offs_t offset, uint8_t data);
void compgolf_back_w(offs_t offset, uint8_t data);
void compgolf_scrollx_lo_w(uint8_t data);
void compgolf_scrolly_lo_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_text_info);
TILEMAP_MAPPER_MEMBER(back_scan);
TILE_GET_INFO_MEMBER(get_back_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void compgolf_palette(palette_device &palette) const;
uint32_t screen_update_compgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
void compgolf_expand_bg();
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void compgolf_map(address_map &map);
};
#endif // MAME_DATAEAST_COMPGOLF_H

View File

@ -1,129 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese, Pierpaolo Prazzoli, Bryan McPhail
/****************************************************************************************
Competition Golf Final Round
video hardware emulation
****************************************************************************************/
#include "emu.h"
#include "compgolf.h"
void compgolf_state::compgolf_palette(palette_device &palette) const
{
uint8_t const *const color_prom = memregion("proms")->base();
for (int i = 0; i < palette.entries(); i++)
{
int bit0,bit1,bit2;
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = 0;
bit1 = (color_prom[i] >> 6) & 0x01;
bit2 = (color_prom[i] >> 7) & 0x01;
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_pen_color(i, rgb_t(r, g, b));
}
}
void compgolf_state::compgolf_video_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_text_tilemap->mark_tile_dirty(offset / 2);
}
void compgolf_state::compgolf_back_w(offs_t offset, uint8_t data)
{
m_bg_ram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(compgolf_state::get_text_info)
{
tile_index <<= 1;
tileinfo.set(2, m_videoram[tile_index + 1] | (m_videoram[tile_index] << 8), m_videoram[tile_index] >> 2, 0);
}
TILEMAP_MAPPER_MEMBER(compgolf_state::back_scan)
{
/* logical (col,row) -> memory offset */
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x10) << 4) + ((row & 0x10) << 5);
}
TILE_GET_INFO_MEMBER(compgolf_state::get_back_info)
{
int attr = m_bg_ram[tile_index * 2];
int code = m_bg_ram[tile_index * 2 + 1] + ((attr & 1) << 8);
int color = (attr & 0x3e) >> 1;
tileinfo.set(1, code, color, 0);
}
void compgolf_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(compgolf_state::get_back_info)), tilemap_mapper_delegate(*this, FUNC(compgolf_state::back_scan)), 16, 16, 32, 32);
m_text_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(compgolf_state::get_text_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_text_tilemap->set_transparent_pen(0);
}
/*
preliminary sprite list:
0 1 2 3
xx------ xxxxxxxx -------- -------- sprite code
---x---- -------- -------- -------- Double Height
----x--- -------- -------- -------- Color,all of it?
-------- -------- xxxxxxxx -------- Y pos
-------- -------- -------- xxxxxxxx X pos
-----x-- -------- -------- -------- Flip X
-------- -------- -------- -------- Flip Y(used?)
*/
void compgolf_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int offs, fx, fy, x, y, color, sprite;
for (offs = 0; offs < 0x60; offs += 4)
{
sprite = m_spriteram[offs + 1] + (((m_spriteram[offs] & 0xc0) >> 6) * 0x100);
x = 240 - m_spriteram[offs + 3];
y = m_spriteram[offs + 2];
color = (m_spriteram[offs] & 8)>>3;
fx = m_spriteram[offs] & 4;
fy = 0; /* ? */
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
sprite,
color,fx,fy,x,y,0);
/* Double Height */
if(m_spriteram[offs] & 0x10)
{
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
sprite + 1,
color, fx, fy, x, y + 16, 0);
}
}
}
uint32_t compgolf_state::screen_update_compgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int scrollx = m_scrollx_hi + m_scrollx_lo;
int scrolly = m_scrolly_hi + m_scrolly_lo;
m_bg_tilemap->set_scrollx(0, scrollx);
m_bg_tilemap->set_scrolly(0, scrolly);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_text_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,73 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail
/*************************************************************************
Desert Assault
*************************************************************************/
#include "machine/gen_latch.h"
#include "cpu/h6280/h6280.h"
#include "sound/okim6295.h"
#include "deco16ic.h"
#include "decocomn.h"
#include "video/bufsprite.h"
#include "decospr.h"
#include "emupal.h"
class dassault_state : public driver_device
{
public:
dassault_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_audiocpu(*this, "audiocpu")
, m_subcpu(*this, "sub")
, m_deco_tilegen(*this, "tilegen%u", 1U)
, m_oki2(*this, "oki2")
, m_spriteram(*this, "spriteram%u", 1U)
, m_sprgen(*this, "spritegen%u", 1U)
, m_palette(*this, "palette")
, m_soundlatch(*this, "soundlatch")
, m_pf2_rowscroll(*this, "pf2_rowscroll")
, m_pf4_rowscroll(*this, "pf4_rowscroll")
{ }
void dassault(machine_config &config);
void init_dassault();
private:
/* devices */
required_device<cpu_device> m_maincpu;
required_device<h6280_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device_array<deco16ic_device, 2> m_deco_tilegen;
required_device<okim6295_device> m_oki2;
required_device_array<buffered_spriteram16_device, 2> m_spriteram;
required_device_array<decospr_device, 2> m_sprgen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
/* memory pointers */
required_shared_ptr<uint16_t> m_pf2_rowscroll;
required_shared_ptr<uint16_t> m_pf4_rowscroll;
uint16_t m_priority = 0U;
void priority_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void main_irq_ack_w(uint16_t data);
void sub_irq_ack_w(uint16_t data);
uint16_t dassault_control_r(offs_t offset);
void dassault_control_w(uint16_t data);
uint16_t dassault_sub_control_r();
void sound_bankswitch_w(uint8_t data);
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_dassault(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void mixdassaultlayer(bitmap_rgb32 &bitmap, bitmap_ind16* sprite_bitmap, const rectangle &cliprect, uint16_t pri, uint16_t primask, uint16_t penbase, uint8_t alpha);
DECO16IC_BANK_CB_MEMBER(bank_callback);
void dassault_map(address_map &map);
void dassault_sub_map(address_map &map);
void sound_map(address_map &map);
};

View File

@ -1,142 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail
/***************************************************************************
Desert Assault Video emulation - Bryan McPhail, mish@tendril.co.uk
I'm not sure if one of the alpha blending effects is correct (mode 0x8000,
the usual mode 0x4000 should be correct). It may be some kind of orthogonal
priority effect where it should cut a hole in other higher priority sprites
to reveal a non-alpha'd hole, or alpha against a further back tilemap.
(is this the helicopter shadow at the end of lv.1 ?)
Also, some priorities are still a little questionable.
****************************************************************************/
#include "emu.h"
#include "dassault.h"
#include "screen.h"
/******************************************************************************/
void dassault_state::video_start()
{
m_priority = 0;
m_sprgen[0]->alloc_sprite_bitmap();
m_sprgen[1]->alloc_sprite_bitmap();
save_item(NAME(m_priority));
}
void dassault_state::mixdassaultlayer(bitmap_rgb32 &bitmap, bitmap_ind16* sprite_bitmap, const rectangle &cliprect, uint16_t pri, uint16_t primask, uint16_t penbase, uint8_t alpha)
{
pen_t const *const paldata = &m_palette->pen(0);
for (int y=cliprect.top(); y<=cliprect.bottom(); y++)
{
uint16_t const *const srcline = &sprite_bitmap->pix(y, 0);
uint32_t *const dstline = &bitmap.pix(y, 0);
for (int x=cliprect.left(); x<=cliprect.right(); x++)
{
uint16_t pix = srcline[x];
if ((pix & primask) != pri)
continue;
if (pix & 0xf)
{
uint16_t pen = pix&0x1ff;
if (pix & 0x800) pen += 0x200;
if (alpha!=0xff)
{
if (pix&0x400) // TODO, Additive/Subtractive Blending?
{
uint32_t base = dstline[x];
dstline[x] = alpha_blend_r32(base, paldata[pen+penbase], alpha);
}
else if (pix&0x200)
{
uint32_t base = dstline[x];
dstline[x] = alpha_blend_r32(base, paldata[pen+penbase], alpha);
}
else
{
dstline[x] = paldata[pen+penbase];
}
}
else
{
dstline[x] = paldata[pen+penbase];
}
}
}
}
}
/* are the priorities 100% correct? they're the same as they were before conversion to DECO52 sprite device, but if (for example) you walk to the side of the crates in the first part of the game you appear over them... */
uint32_t dassault_state::screen_update_dassault(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint16_t flip = m_deco_tilegen[0]->pf_control_r(0);
uint16_t priority = m_priority;
flip_screen_set(BIT(flip, 7));
m_sprgen[0]->set_flip_screen(BIT(flip, 7));
m_sprgen[1]->set_flip_screen(BIT(flip, 7));
m_sprgen[1]->draw_sprites(bitmap, cliprect, m_spriteram[1]->buffer(), 0x400);
m_sprgen[0]->draw_sprites(bitmap, cliprect, m_spriteram[0]->buffer(), 0x400);
bitmap_ind16* sprite_bitmap1 = &m_sprgen[0]->get_sprite_temp_bitmap();
bitmap_ind16* sprite_bitmap2 = &m_sprgen[1]->get_sprite_temp_bitmap();
/* Update tilemaps */
m_deco_tilegen[0]->pf_update(nullptr, m_pf2_rowscroll);
m_deco_tilegen[1]->pf_update(nullptr, m_pf4_rowscroll);
/* Draw playfields/update priority bitmap */
screen.priority().fill(0, cliprect);
bitmap.fill(m_palette->pen(3072), cliprect);
m_deco_tilegen[1]->tilemap_2_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
/* The middle playfields can be swapped priority-wise */
if ((priority & 3) == 0)
{
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1
m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 2); // 2
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8
m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 16); // 16
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32
mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64?
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128
}
else if ((priority & 3) == 1)
{
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1
m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 2); // 2
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8
mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 16?
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32
m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 64); // 64
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128
}
else if ((priority & 3) == 3)
{
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1
m_deco_tilegen[1]->tilemap_1_draw(screen, bitmap, cliprect, 0, 2); // 2
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8
m_deco_tilegen[0]->tilemap_2_draw(screen, bitmap, cliprect, 0, 16); // 16
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32
mixdassaultlayer(bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64?
mixdassaultlayer(bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128
}
else
{
/* Unused */
}
m_deco_tilegen[0]->tilemap_1_draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -34952,7 +34952,7 @@ mkp286 // Morse KP-286 motherboard (286)
n8810m15 // 1987 Nixdorf 8810 M15 Laptop - PC07
n8810m16c // 1990 Nixdorf 8810 M16 Laptop - PC17 - CGA version
n8810m16v // 1990 Nixdorf 8810 M16 Laptop - PC17 - VGA version
n8810m20 // 1989 Nixdorf 8810/20 Laptop VGA
n8810m20 // 1989 Nixdorf 8810/20 Laptop VGA
n8810m30 // 1990 Nixdorf 8810 M30
n8810m55 // 1986 Nixdorf 8810 M55
ncr3302 // NCR Class 3302 Model 0110
@ -34963,7 +34963,7 @@ necapciv // NEC APC IV
o286foxii // Octek Fox II motherboard (286)
ocfoxm // Octek Fox M 286
octekg2 // Octek motherboard with Headland G2 chipset (286)
ocxt286 // Octek XT-286 motherboard
ocxt286 // Octek XT-286 motherboard
olim203 // Olivetti 286 motherboard
olyport40 // AEG Olympia Olyport 40
pc30iii // Commodore PC 30-III
@ -35338,7 +35338,7 @@ gogostrk //
@source:pc/pc.cpp
ataripc1 // Atari PC1
ataripc3 // Atari PC3
auvip800 // AUVA VIP 800
auvip800 // AUVA VIP 800
bw230 // 1985 Bondwell (CGA)
cadd810 // CompuAdd 810
comdesk // Compaq Deskpro
@ -35352,8 +35352,8 @@ dtkerso // 198? PC-XT clones with a DTK/ERSO BIOS
eaglespirit // Eagle PC Spirit
eppc // 1985 Ericsson Portable PC
hyo88t // Hyosung Topstar 88T
hyu16t // Hyundai Super 16 T
hyu16te // Hyundai Super 16 TE
hyu16t // Hyundai Super 16 T
hyu16te // Hyundai Super 16 TE
ibm5550 //
iskr3104 //
ittxtra // 1984 ITT XTRA
@ -35371,7 +35371,7 @@ mpc1600 // Columbia Data Products MPC 1600
mc1702 //
mk88 //
ncrpc4i // NCR PC4i
ncrpc6 // NCR PC6
ncrpc6 // NCR PC6
nixpc01 // Nixdorf 8810/25 - PC01
olivm15 // Olivetti M15
olystar20f // AEG Olympia Olystar 20F
@ -35745,6 +35745,7 @@ kiss //
kosteel //
lostwrlp //
m_mpac //
m_mpacb //
mdntmrdr //
medusa //
monrobwl //

View File

@ -2241,6 +2241,18 @@ ROM_START(m_mpac)
ROM_LOAD("872-03_5.532", 0xb000, 0x1000, CRC(8fcdf853) SHA1(7c6bffcd974d2684e7f2c69d926f6cabb53e2f90))
ROM_END
ROM_START(m_mpacb)
ROM_REGION(0x8000, "maincpu", 0)
ROM_LOAD( "u2", 0x1000, 0x0800, CRC(a697971a) SHA1(e45cbb7822ac159c447877c4c837be5aaa4ac675))
ROM_CONTINUE( 0x5000, 0x0800)
ROM_LOAD( "720-53_6.732", 0x1800, 0x0800, CRC(c2e92f80) SHA1(61de956a4b6e9fb9ef2b25c01bff1fb5972284ad))
ROM_CONTINUE( 0x5800, 0x0800)
ROM_RELOAD( 0x7000, 0x1000)
ROM_REGION(0x10000, "squawk_n_talk_ay:cpu", 0)
ROM_LOAD("872-01_4.532", 0xa000, 0x1000, CRC(d21ce16d) SHA1(3ee6e2629530e7e6e4d7eac713d34c48297a1047))
ROM_LOAD("872-03_5.532", 0xb000, 0x1000, CRC(8fcdf853) SHA1(7c6bffcd974d2684e7f2c69d926f6cabb53e2f90))
ROM_END
/*-----------------------------------------------------------
/ Grand Slam #1311
/-----------------------------------------------------------*/
@ -2895,7 +2907,8 @@ GAME( 1981, elektra, 0, squawk_n_talk_ay, by35_os5x, by35_state, init_
GAME( 1982, spectrm, 0, squawk_n_talk, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Spectrum", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, spectrm4, spectrm, squawk_n_talk, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Spectrum (ver 4)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, rapidfip, 0, squawk_n_talk, by35, by35_state, init_by35_7, ROT0, "Bally", "Rapid Fire", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, m_mpac, 0, squawk_n_talk_ay, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Mr. and Mrs. PacMan", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, m_mpac, 0, squawk_n_talk_ay, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Mr. and Mrs. PacMan (set 1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, m_mpacb, m_mpac, squawk_n_talk_ay, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Mr. and Mrs. PacMan (set 2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, mysteria, 0, squawk_n_talk_ay, by35_os5x, by35_state, init_by35_7, ROT0, "Bally", "Mysterian (prototype)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // uses 2 sound boards
// Cheap Squeak sound