champbas: merge driver files

This commit is contained in:
hap 2023-06-26 18:03:06 +02:00
parent e137725d9f
commit 8d081eac03
4 changed files with 420 additions and 462 deletions

View File

@ -68,26 +68,409 @@ Notes:
original board has vastly improved sound hardware which is therefore missing
from the bootleg.
TODO:
-----
- Exciting Soccer: interrupt source for sound CPU is unknown.
- Exciting Soccer: sound CPU writes to unknown ports on startup. Timer configure?
- Exciting Soccer: Unknown writes to 8910 I/O ports (filters?)
***************************************************************************/
#include "emu.h"
#include "champbas.h"
#include "alpha8201.h"
#include "cpu/z80/z80.h"
#include "cpu/m6805/m68705.h"
#include "machine/74259.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "machine/watchdog.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "video/resnet.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class champbas_state : public driver_device
{
public:
champbas_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_mainlatch(*this, "mainlatch"),
m_alpha_8201(*this, "alpha_8201"),
m_watchdog(*this, "watchdog"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_mainram(*this, "mainram"),
m_vram(*this, "vram"),
m_spriteram(*this, "spriteram"),
m_spriteram2(*this, "spriteram2")
{ }
int watchdog_bit2();
void init_champbas();
void champbas(machine_config &config);
void champbb2(machine_config &config);
void champbb2j(machine_config &config);
void talbot(machine_config &config);
void tbasebal(machine_config &config);
void champbasjb(machine_config &config);
void champbasj(machine_config &config);
void champbasja(machine_config &config);
protected:
// handlers
void irq_enable_w(int state);
uint8_t champbja_protection_r(offs_t offset);
void vblank_irq(int state);
void tilemap_w(offs_t offset, uint8_t data);
void gfxbank_w(int state);
void palette_bank_w(int state);
void flipscreen_w(int state);
void champbas_palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(champbas_get_bg_tile_info);
uint32_t screen_update_champbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void champbas_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void machine_start() override;
virtual void video_start() override;
void champbas_map(address_map &map);
void champbasj_map(address_map &map);
void champbasja_map(address_map &map);
void champbasjb_map(address_map &map);
void champbb2_map(address_map &map);
void champbb2j_map(address_map &map);
void tbasebal_map(address_map &map);
void champbas_sound_map(address_map &map);
// devices, memory pointers
required_device<cpu_device> m_maincpu;
required_device<ls259_device> m_mainlatch;
optional_device<alpha_8201_device> m_alpha_8201;
required_device<watchdog_timer_device> m_watchdog;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_mainram;
required_shared_ptr<uint8_t> m_vram;
required_shared_ptr<uint8_t> m_spriteram;
optional_shared_ptr<uint8_t> m_spriteram2;
// internal state
uint8_t m_irq_mask = 0U;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_gfx_bank = 0U;
uint8_t m_palette_bank = 0U;
};
class exctsccr_state : public champbas_state
{
public:
exctsccr_state(const machine_config &mconfig, device_type type, const char *tag) :
champbas_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu")
{ }
void init_exctsccr();
void exctsccr(machine_config &config);
void exctsccrb(machine_config &config);
void exctscc2(machine_config &config);
protected:
TIMER_DEVICE_CALLBACK_MEMBER(exctsccr_sound_irq);
void exctsccr_palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(exctsccr_get_bg_tile_info);
uint32_t screen_update_exctsccr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void exctsccr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void video_start() override;
void exctsccr_map(address_map &map);
void exctsccrb_map(address_map &map);
void exctsccr_sound_map(address_map &map);
void exctsccr_sound_io_map(address_map &map);
void exctscc2_sound_io_map(address_map &map);
private:
required_device<cpu_device> m_audiocpu;
};
/***************************************************************************
Convert the color PROMs into a more useable format.
The palette PROM is connected to the RGB output this way:
bit 7 -- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
-- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
bit 0 -- 1 kohm resistor -- RED
***************************************************************************/
void champbas_state::champbas_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
static const int resistances_rg[3] = { 1000, 470, 220 };
static const int resistances_b [2] = { 470, 220 };
/* compute the color output resistor weights */
double rweights[3], gweights[3], bweights[2];
compute_resistor_weights(0, 255, -1.0,
3, &resistances_rg[0], rweights, 0, 0,
3, &resistances_rg[0], gweights, 0, 0,
2, &resistances_b[0], bweights, 0, 0);
/* create a lookup table for the palette */
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
/* red component */
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = combine_weights(rweights, bit0, bit1, bit2);
/* green component */
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = combine_weights(gweights, bit0, bit1, bit2);
/* blue component */
bit0 = (color_prom[i] >> 6) & 0x01;
bit1 = (color_prom[i] >> 7) & 0x01;
int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
color_prom += 0x20;
for (int i = 0; i < 0x200; i++)
{
uint8_t const ctabentry = (color_prom[i & 0xff] & 0x0f) | ((i & 0x100) >> 4);
palette.set_pen_indirect(i, ctabentry);
}
}
void exctsccr_state::exctsccr_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
/* create a lookup table for the palette */
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
/* red component */
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;
/* green component */
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;
/* blue component */
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_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x20;
/* characters / sprites (3bpp) */
for (int i = 0; i < 0x100; i++)
{
int const swapped_i = bitswap<8>(i, 2, 7, 6, 5, 4, 3, 1, 0);
uint8_t const ctabentry = (color_prom[swapped_i] & 0x0f) | ((i & 0x80) >> 3);
palette.set_pen_indirect(i, ctabentry);
}
/* sprites (4bpp) */
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[0x100 + i] & 0x0f) | 0x10;
palette.set_pen_indirect(i + 0x100, ctabentry);
}
}
/*************************************
*
* Callbacks for the TileMap code
*
*************************************/
TILE_GET_INFO_MEMBER(champbas_state::champbas_get_bg_tile_info)
{
int const code = m_vram[tile_index] | (m_gfx_bank << 8);
int const color = (m_vram[tile_index + 0x400] & 0x1f) | 0x20;
tileinfo.set(0, code, color, 0);
}
TILE_GET_INFO_MEMBER(exctsccr_state::exctsccr_get_bg_tile_info)
{
int const code = m_vram[tile_index] | (m_gfx_bank << 8);
int const color = m_vram[tile_index + 0x400] & 0x0f;
tileinfo.set(0, code, color, 0);
}
/*************************************
*
* Video system start
*
*************************************/
void champbas_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(champbas_state::champbas_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
void exctsccr_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exctsccr_state::exctsccr_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
/*************************************
*
* Video update
*
*************************************/
void champbas_state::champbas_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element* const gfx = m_gfxdecode->gfx(1);
assert (m_spriteram.bytes() == 0x10);
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram holds x/y data
int sx = m_spriteram[offs + 1] - 16;
int sy = 255 - m_spriteram[offs];
// attribute data is from last section of mainram
uint8_t *attr = &(m_mainram[0x7f0]);
int code = (attr[offs] >> 2 & 0x3f) | (m_gfx_bank << 6);
int color = (attr[offs + 1] & 0x1f) | (m_palette_bank << 6);
int flipx = ~attr[offs] & 1;
int flipy = ~attr[offs] & 2;
gfx->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
m_palette->transpen_mask(*gfx, color, 0));
// wraparound
gfx->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx + 256, sy,
m_palette->transpen_mask(*gfx, color, 0));
}
}
void exctsccr_state::exctsccr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element* const gfx1 = m_gfxdecode->gfx(1);
gfx_element* const gfx2 = m_gfxdecode->gfx(2);
assert (m_spriteram.bytes() == 0x10);
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram holds x/y data
int sx = m_spriteram[offs + 1] - 16;
int sy = 255 - m_spriteram[offs];
// attribute data is from videoram
int code = (m_vram[offs] >> 2 & 0x3f) | (m_vram[offs + 1] << 2 & 0x40);
int flipx = ~m_vram[offs] & 1;
int flipy = ~m_vram[offs] & 2;
int color = m_vram[offs + 1] & 0xf;
gfx1->transpen(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy, 0);
}
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram2 holds x/y data
int sx = m_spriteram2[offs + 1] - 16;
int sy = 255 - m_spriteram2[offs];
// attribute data is from mainram
int code = m_mainram[offs] >> 2 & 0x3f;
int flipx = ~m_mainram[offs] & 1;
int flipy = ~m_mainram[offs] & 2;
int color = m_mainram[offs + 1] & 0xf;
gfx2->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
m_palette->transpen_mask(*gfx2, color, 0x10));
}
}
uint32_t champbas_state::screen_update_champbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
champbas_draw_sprites(bitmap, cliprect);
return 0;
}
uint32_t exctsccr_state::screen_update_exctsccr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
exctsccr_draw_sprites(bitmap, cliprect);
return 0;
}
@ -115,6 +498,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(exctsccr_state::exctsccr_sound_irq)
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
}
void champbas_state::tilemap_w(offs_t offset, uint8_t data)
{
m_vram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void champbas_state::gfxbank_w(int state)
{
m_gfx_bank = state;
m_bg_tilemap->mark_all_dirty();
}
void champbas_state::palette_bank_w(int state)
{
m_palette_bank = state;
m_bg_tilemap->set_palette_offset(m_palette_bank << 8);
}
void champbas_state::flipscreen_w(int state)
{
flip_screen_set(!state);
}
/*************************************
@ -501,11 +907,6 @@ GFXDECODE_END
void champbas_state::machine_start()
{
// zerofill
m_irq_mask = 0;
m_palette_bank = 0;
m_gfx_bank = 0;
// register for savestates
save_item(NAME(m_irq_mask));
save_item(NAME(m_palette_bank));
@ -1290,6 +1691,8 @@ void exctsccr_state::init_exctsccr()
}
}
} // anonymous namespace
/*************************************

View File

@ -1,139 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi, Jarek Parchanski, Nicola Salmoria
/*************************************************************************
Talbot - Champion Base Ball - Exciting Soccer
*************************************************************************/
#ifndef MAME_ALPHA_CHAMPBAS_H
#define MAME_ALPHA_CHAMPBAS_H
#pragma once
#include "machine/74259.h"
#include "alpha8201.h"
#include "machine/timer.h"
#include "machine/watchdog.h"
#include "emupal.h"
#include "tilemap.h"
class champbas_state : public driver_device
{
public:
champbas_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_mainlatch(*this, "mainlatch"),
m_alpha_8201(*this, "alpha_8201"),
m_watchdog(*this, "watchdog"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_mainram(*this, "mainram"),
m_vram(*this, "vram"),
m_spriteram(*this, "spriteram"),
m_spriteram2(*this, "spriteram2")
{
}
int watchdog_bit2();
void init_champbas();
void champbas(machine_config &config);
void champbb2(machine_config &config);
void champbb2j(machine_config &config);
void talbot(machine_config &config);
void tbasebal(machine_config &config);
void champbasjb(machine_config &config);
void champbasj(machine_config &config);
void champbasja(machine_config &config);
protected:
// handlers
void irq_enable_w(int state);
uint8_t champbja_protection_r(offs_t offset);
void vblank_irq(int state);
void tilemap_w(offs_t offset, uint8_t data);
void gfxbank_w(int state);
void palette_bank_w(int state);
void flipscreen_w(int state);
void champbas_palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(champbas_get_bg_tile_info);
uint32_t screen_update_champbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void champbas_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void machine_start() override;
virtual void video_start() override;
void champbas_map(address_map &map);
void champbasj_map(address_map &map);
void champbasja_map(address_map &map);
void champbasjb_map(address_map &map);
void champbb2_map(address_map &map);
void champbb2j_map(address_map &map);
void tbasebal_map(address_map &map);
void champbas_sound_map(address_map &map);
// devices, memory pointers
required_device<cpu_device> m_maincpu;
required_device<ls259_device> m_mainlatch;
optional_device<alpha_8201_device> m_alpha_8201;
required_device<watchdog_timer_device> m_watchdog;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_mainram;
required_shared_ptr<uint8_t> m_vram;
required_shared_ptr<uint8_t> m_spriteram;
optional_shared_ptr<uint8_t> m_spriteram2;
// internal state
uint8_t m_irq_mask = 0U;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_gfx_bank = 0U;
uint8_t m_palette_bank = 0U;
};
class exctsccr_state : public champbas_state
{
public:
exctsccr_state(const machine_config &mconfig, device_type type, const char *tag) :
champbas_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu")
{
}
void init_exctsccr();
void exctsccr(machine_config &config);
void exctsccrb(machine_config &config);
void exctscc2(machine_config &config);
protected:
TIMER_DEVICE_CALLBACK_MEMBER(exctsccr_sound_irq);
void exctsccr_palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(exctsccr_get_bg_tile_info);
uint32_t screen_update_exctsccr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void exctsccr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void video_start() override;
void exctsccr_map(address_map &map);
void exctsccrb_map(address_map &map);
void exctsccr_sound_map(address_map &map);
void exctsccr_sound_io_map(address_map &map);
void exctscc2_sound_io_map(address_map &map);
private:
required_device<cpu_device> m_audiocpu;
};
#endif // MAME_ALPHA_CHAMPBAS_H

View File

@ -1,299 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi, Jarek Parchanski, Nicola Salmoria
/*************************************************************************
Talbot - Champion Base Ball - Exciting Soccer
*************************************************************************/
#include "emu.h"
#include "video/resnet.h"
#include "champbas.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
The palette PROM is connected to the RGB output this way:
bit 7 -- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
-- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
bit 0 -- 1 kohm resistor -- RED
***************************************************************************/
void champbas_state::champbas_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
static const int resistances_rg[3] = { 1000, 470, 220 };
static const int resistances_b [2] = { 470, 220 };
/* compute the color output resistor weights */
double rweights[3], gweights[3], bweights[2];
compute_resistor_weights(0, 255, -1.0,
3, &resistances_rg[0], rweights, 0, 0,
3, &resistances_rg[0], gweights, 0, 0,
2, &resistances_b[0], bweights, 0, 0);
/* create a lookup table for the palette */
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
/* red component */
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = combine_weights(rweights, bit0, bit1, bit2);
/* green component */
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = combine_weights(gweights, bit0, bit1, bit2);
/* blue component */
bit0 = (color_prom[i] >> 6) & 0x01;
bit1 = (color_prom[i] >> 7) & 0x01;
int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
color_prom += 0x20;
for (int i = 0; i < 0x200; i++)
{
uint8_t const ctabentry = (color_prom[i & 0xff] & 0x0f) | ((i & 0x100) >> 4);
palette.set_pen_indirect(i, ctabentry);
}
}
void exctsccr_state::exctsccr_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
/* create a lookup table for the palette */
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
/* red component */
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;
/* green component */
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;
/* blue component */
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_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x20;
/* characters / sprites (3bpp) */
for (int i = 0; i < 0x100; i++)
{
int const swapped_i = bitswap<8>(i, 2, 7, 6, 5, 4, 3, 1, 0);
uint8_t const ctabentry = (color_prom[swapped_i] & 0x0f) | ((i & 0x80) >> 3);
palette.set_pen_indirect(i, ctabentry);
}
/* sprites (4bpp) */
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[0x100 + i] & 0x0f) | 0x10;
palette.set_pen_indirect(i + 0x100, ctabentry);
}
}
/*************************************
*
* Callbacks for the TileMap code
*
*************************************/
TILE_GET_INFO_MEMBER(champbas_state::champbas_get_bg_tile_info)
{
int const code = m_vram[tile_index] | (m_gfx_bank << 8);
int const color = (m_vram[tile_index + 0x400] & 0x1f) | 0x20;
tileinfo.set(0, code, color, 0);
}
TILE_GET_INFO_MEMBER(exctsccr_state::exctsccr_get_bg_tile_info)
{
int const code = m_vram[tile_index] | (m_gfx_bank << 8);
int const color = m_vram[tile_index + 0x400] & 0x0f;
tileinfo.set(0, code, color, 0);
}
/*************************************
*
* Video system start
*
*************************************/
void champbas_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(champbas_state::champbas_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
void exctsccr_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exctsccr_state::exctsccr_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
/*************************************
*
* Memory handlers
*
*************************************/
void champbas_state::tilemap_w(offs_t offset, uint8_t data)
{
m_vram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void champbas_state::gfxbank_w(int state)
{
m_gfx_bank = state;
m_bg_tilemap->mark_all_dirty();
}
void champbas_state::palette_bank_w(int state)
{
m_palette_bank = state;
m_bg_tilemap->set_palette_offset(m_palette_bank << 8);
}
void champbas_state::flipscreen_w(int state)
{
flip_screen_set(!state);
}
/*************************************
*
* Video update
*
*************************************/
void champbas_state::champbas_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element* const gfx = m_gfxdecode->gfx(1);
assert (m_spriteram.bytes() == 0x10);
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram holds x/y data
int sx = m_spriteram[offs + 1] - 16;
int sy = 255 - m_spriteram[offs];
// attribute data is from last section of mainram
uint8_t *attr = &(m_mainram[0x7f0]);
int code = (attr[offs] >> 2 & 0x3f) | (m_gfx_bank << 6);
int color = (attr[offs + 1] & 0x1f) | (m_palette_bank << 6);
int flipx = ~attr[offs] & 1;
int flipy = ~attr[offs] & 2;
gfx->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
m_palette->transpen_mask(*gfx, color, 0));
// wraparound
gfx->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx + 256, sy,
m_palette->transpen_mask(*gfx, color, 0));
}
}
void exctsccr_state::exctsccr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element* const gfx1 = m_gfxdecode->gfx(1);
gfx_element* const gfx2 = m_gfxdecode->gfx(2);
assert (m_spriteram.bytes() == 0x10);
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram holds x/y data
int sx = m_spriteram[offs + 1] - 16;
int sy = 255 - m_spriteram[offs];
// attribute data is from videoram
int code = (m_vram[offs] >> 2 & 0x3f) | (m_vram[offs + 1] << 2 & 0x40);
int flipx = ~m_vram[offs] & 1;
int flipy = ~m_vram[offs] & 2;
int color = m_vram[offs + 1] & 0xf;
gfx1->transpen(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy, 0);
}
for (int offs = 0x10-2; offs >= 0; offs -= 2)
{
// spriteram2 holds x/y data
int sx = m_spriteram2[offs + 1] - 16;
int sy = 255 - m_spriteram2[offs];
// attribute data is from mainram
int code = m_mainram[offs] >> 2 & 0x3f;
int flipx = ~m_mainram[offs] & 1;
int flipy = ~m_mainram[offs] & 2;
int color = m_mainram[offs + 1] & 0xf;
gfx2->transmask(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
m_palette->transpen_mask(*gfx2, color, 0x10));
}
}
uint32_t champbas_state::screen_update_champbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
champbas_draw_sprites(bitmap, cliprect);
return 0;
}
uint32_t exctsccr_state::screen_update_exctsccr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
exctsccr_draw_sprites(bitmap, cliprect);
return 0;
}

View File

@ -6,15 +6,13 @@ license:CC0-1.0
<element name="overlay">
<!-- backdrop -->
<!-- backdrop -->
<rect>
<color red="0.0" green="0.85" blue="0.20" />
<bounds x="0" y="0" width="6000" height="6000" />
</rect>
<!-- top-left blob -->
<!-- top-left blob -->
<disk>
<color red="0.0" green="0.85" blue="0.20" />
<bounds x="0" y="0" width="2500" height="2500" />
@ -52,8 +50,7 @@ license:CC0-1.0
<bounds x="304" y="304" width="1892" height="1892" />
</disk>
<!-- top-right blob -->
<!-- top-right blob -->
<disk>
<color red="0.0" green="0.85" blue="0.20" />
<bounds x="3500" y="0" width="2500" height="2500" />
@ -91,8 +88,7 @@ license:CC0-1.0
<bounds x="3804" y="304" width="1892" height="1892" />
</disk>
<!-- bottom-left blob -->
<!-- bottom-left blob -->
<disk>
<color red="0.0" green="0.85" blue="0.20" />
<bounds x="0" y="3500" width="2500" height="2500" />
@ -130,8 +126,7 @@ license:CC0-1.0
<bounds x="304" y="3804" width="1892" height="1892" />
</disk>
<!-- bottom-right blob -->
<!-- bottom-right blob -->
<disk>
<color red="0.0" green="0.85" blue="0.20" />
<bounds x="3500" y="3500" width="2500" height="2500" />
@ -169,9 +164,8 @@ license:CC0-1.0
<bounds x="3804" y="3804" width="1892" height="1892" />
</disk>
<!-- middle blob - note: it should be a more diamond shape, -->
<!-- see MT 1064, but MAME internal layout can't do that -->
<!-- middle blob - note: it should be a more diamond shape, -->
<!-- see MT 1064, but MAME internal layout can't do that -->
<disk>
<color red="0.0" green="0.85" blue="0.2" />
<bounds x="2000" y="2000" width="2000" height="2000" />
@ -204,11 +198,9 @@ license:CC0-1.0
<color red="1.0" green="0.85" blue="0.2" />
<bounds x="2140" y="2140" width="1720" height="1720" />
</disk>
</element>
<view name="Color Overlay">
<view name="Color Overlay (For B/W)">
<bounds left="0" top="0" right="400" bottom="300" />
<screen index="0">
@ -219,4 +211,5 @@ license:CC0-1.0
<bounds x="-100" y="-150" width="600" height="600" />
</element>
</view>
</mamelayout>