mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
champbas: merge driver files
This commit is contained in:
parent
e137725d9f
commit
8d081eac03
@ -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
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
|
@ -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
|
@ -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;
|
||||
}
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user