From 8d081eac038b36497a0946823b4acf18aa3be14b Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 26 Jun 2023 18:03:06 +0200 Subject: [PATCH] champbas: merge driver files --- src/mame/alpha/champbas.cpp | 419 +++++++++++++++++++++++++++++++++- src/mame/alpha/champbas.h | 139 ----------- src/mame/alpha/champbas_v.cpp | 299 ------------------------ src/mame/layout/spacezap.lay | 25 +- 4 files changed, 420 insertions(+), 462 deletions(-) delete mode 100644 src/mame/alpha/champbas.h delete mode 100644 src/mame/alpha/champbas_v.cpp diff --git a/src/mame/alpha/champbas.cpp b/src/mame/alpha/champbas.cpp index 85208aa81ff..7ee183ac992 100644 --- a/src/mame/alpha/champbas.cpp +++ b/src/mame/alpha/champbas.cpp @@ -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 m_maincpu; + required_device m_mainlatch; + optional_device m_alpha_8201; + required_device m_watchdog; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_mainram; + required_shared_ptr m_vram; + required_shared_ptr m_spriteram; + optional_shared_ptr 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 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 + /************************************* diff --git a/src/mame/alpha/champbas.h b/src/mame/alpha/champbas.h deleted file mode 100644 index 2dca4c22ce4..00000000000 --- a/src/mame/alpha/champbas.h +++ /dev/null @@ -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 m_maincpu; - required_device m_mainlatch; - optional_device m_alpha_8201; - required_device m_watchdog; - required_device m_gfxdecode; - required_device m_palette; - - required_shared_ptr m_mainram; - required_shared_ptr m_vram; - required_shared_ptr m_spriteram; - optional_shared_ptr 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 m_audiocpu; -}; - -#endif // MAME_ALPHA_CHAMPBAS_H diff --git a/src/mame/alpha/champbas_v.cpp b/src/mame/alpha/champbas_v.cpp deleted file mode 100644 index 688e8cef122..00000000000 --- a/src/mame/alpha/champbas_v.cpp +++ /dev/null @@ -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; -} diff --git a/src/mame/layout/spacezap.lay b/src/mame/layout/spacezap.lay index 3f91daf9391..ba0eabe2d35 100644 --- a/src/mame/layout/spacezap.lay +++ b/src/mame/layout/spacezap.lay @@ -6,15 +6,13 @@ license:CC0-1.0 - - + - - + @@ -52,8 +50,7 @@ license:CC0-1.0 - - + @@ -91,8 +88,7 @@ license:CC0-1.0 - - + @@ -130,8 +126,7 @@ license:CC0-1.0 - - + @@ -169,9 +164,8 @@ license:CC0-1.0 - - - + + @@ -204,11 +198,9 @@ license:CC0-1.0 - - - + @@ -219,4 +211,5 @@ license:CC0-1.0 +