summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2018-06-17 15:11:33 +0900
committer Vas Crabb <cuavas@users.noreply.github.com>2018-06-17 16:11:33 +1000
commitb140887dd8ae259a3ace1e5974b25da91d74da35 (patch)
tree7d70766dc52265137f5302a4d204d24b8f41d11e
parentdf98fc2024e53ed5f7a14d2aacedc2e4d6f67f4a (diff)
20pacgal.cpp : Updates, Cleanups (#3642)
* 20pacgal.cpp : Add palette_device, Move video start functions into video_start, Reduce runtime tag lookups, Convert some arrays into std::unique_ptr, Make drawing sprite/chars functions related to cliprect, Add notes * 20pacgal.cpp : Minor cleanup of palette
-rw-r--r--src/mame/drivers/20pacgal.cpp24
-rw-r--r--src/mame/includes/20pacgal.h33
-rw-r--r--src/mame/video/20pacgal.cpp103
3 files changed, 99 insertions, 61 deletions
diff --git a/src/mame/drivers/20pacgal.cpp b/src/mame/drivers/20pacgal.cpp
index 5c2e058ab46..20216baf926 100644
--- a/src/mame/drivers/20pacgal.cpp
+++ b/src/mame/drivers/20pacgal.cpp
@@ -45,6 +45,7 @@
* The timed interrupt is a kludge; it is supposed to be generated internally by
the Z180, but the cpu core doesn't support that yet.
* Is the clock divide 3 or 4?
+ * Galaga attract mode isn't correct; referenct : https://youtu.be/OQyWaN9fTgw?t=2m33s
+-------------------------------------------------------+
| +-------------+ |
@@ -146,8 +147,12 @@ WRITE8_MEMBER(_20pacgal_state::_20pacgal_coin_counter_w)
WRITE8_MEMBER(_20pacgal_state::ram_bank_select_w)
{
- m_game_selected = data & 1;
- membank("bank1")->set_entry(m_game_selected);
+ if (m_game_selected != (data & 1))
+ {
+ m_game_selected = data & 1;
+ m_mainbank->set_entry(m_game_selected);
+ get_pens();
+ }
}
WRITE8_MEMBER(_20pacgal_state::ram_48000_w)
@@ -194,7 +199,7 @@ void _25pacman_state::_25pacman_map(address_map &map)
map(0x04800, 0x05fff).ram();
map(0x06000, 0x06fff).writeonly().share("char_gfx_ram");
map(0x07000, 0x0717f).w(FUNC(_25pacman_state::sprite_ram_w));
-// AM_RANGE(0x08000, 0x09fff) AM_READ_BANK("bank1") AM_WRITE(ram_48000_w)
+// map(0x08000, 0x09fff).bankr("mainbank").w(FUNC(_20pacgal_state::ram_48000_w));
map(0x08000, 0x09fff).nopw();
map(0x0a000, 0x0bfff).w(FUNC(_25pacman_state::sprite_gfx_w));
map(0x0c000, 0x0dfff).nopw(); // is this the sound waveforms in a different format?
@@ -215,7 +220,7 @@ void _20pacgal_state::_20pacgal_map(address_map &map)
map(0x45f00, 0x45fff).w("namco", FUNC(namco_cus30_device::namcos1_cus30_w));
map(0x46000, 0x46fff).writeonly().share("char_gfx_ram");
map(0x47100, 0x47100).ram(); /* leftover from original Galaga code */
- map(0x48000, 0x49fff).bankr("bank1").w(FUNC(_20pacgal_state::ram_48000_w)); /* this should be a mirror of 08000-09fff */
+ map(0x48000, 0x49fff).bankr("mainbank").w(FUNC(_20pacgal_state::ram_48000_w)); /* this should be a mirror of 08000-09fff */
map(0x4c000, 0x4dfff).w(FUNC(_20pacgal_state::sprite_gfx_w));
map(0x4e000, 0x4e17f).w(FUNC(_20pacgal_state::sprite_ram_w));
map(0x4e180, 0x4feff).nopw();
@@ -360,12 +365,11 @@ INPUT_PORTS_END
void _20pacgal_state::common_save_state()
{
+ m_ram_48000 = make_unique_clear<uint8_t[]>(0x2000);
+
save_item(NAME(m_game_selected));
- save_item(NAME(m_ram_48000));
+ save_pointer(NAME(m_ram_48000.get()), 0x2000);
save_item(NAME(m_irq_mask));
- save_item(NAME(m_sprite_gfx_ram));
- save_item(NAME(m_sprite_ram));
- save_item(NAME(m_sprite_color_lookup));
}
void _20pacgal_state::machine_start()
@@ -373,8 +377,8 @@ void _20pacgal_state::machine_start()
common_save_state();
// membank currently used only by 20pacgal
- membank("bank1")->configure_entry(0, memregion("maincpu")->base() + 0x08000);
- membank("bank1")->configure_entry(1, m_ram_48000);
+ m_mainbank->configure_entry(0, memregion("maincpu")->base() + 0x08000);
+ m_mainbank->configure_entry(1, m_ram_48000.get());
}
void _25pacman_state::machine_start()
diff --git a/src/mame/includes/20pacgal.h b/src/mame/includes/20pacgal.h
index 179f9fe4113..119c2242e0c 100644
--- a/src/mame/includes/20pacgal.h
+++ b/src/mame/includes/20pacgal.h
@@ -14,15 +14,18 @@
class _20pacgal_state : public driver_device
{
public:
- _20pacgal_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ _20pacgal_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_video_ram(*this, "video_ram"),
m_char_gfx_ram(*this, "char_gfx_ram"),
m_stars_seed(*this, "stars_seed"),
m_stars_ctrl(*this, "stars_ctrl"),
m_flip(*this, "flip"),
+ m_proms(*this, "proms"),
+ m_mainbank(*this, "mainbank"),
m_maincpu(*this, "maincpu"),
- m_eeprom(*this, "eeprom") { }
+ m_eeprom(*this, "eeprom"),
+ m_palette(*this, "palette") { }
/* memory pointers */
required_shared_ptr<uint8_t> m_video_ram;
@@ -31,18 +34,22 @@ public:
required_shared_ptr<uint8_t> m_stars_ctrl;
required_shared_ptr<uint8_t> m_flip;
+ optional_memory_region m_proms;
+ optional_memory_bank m_mainbank;
+
/* machine state */
uint8_t m_game_selected; /* 0 = Ms. Pac-Man, 1 = Galaga */
/* devices */
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_device<palette_device> m_palette;
/* memory */
- uint8_t m_sprite_gfx_ram[0x2000];
- uint8_t m_sprite_ram[0x180];
- uint8_t m_sprite_color_lookup[0x100];
- uint8_t m_ram_48000[0x2000];
+ std::unique_ptr<uint8_t[]> m_sprite_gfx_ram;
+ std::unique_ptr<uint8_t[]> m_sprite_ram;
+ std::unique_ptr<uint8_t[]> m_sprite_color_lookup;
+ std::unique_ptr<uint8_t[]> m_ram_48000;
/* 25pacman and 20pacgal store the sprite palette at a different address, this is a hardware difference and confirmed NOT to be a register */
uint8_t m_sprite_pal_base;
@@ -60,14 +67,16 @@ public:
void init_20pacgal();
virtual void machine_start() override;
virtual void machine_reset() override;
+ virtual void video_start() override;
uint32_t screen_update_20pacgal(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
- void get_pens(pen_t *pens);
+ DECLARE_PALETTE_INIT(starpal_init);
+ void get_pens();
void do_pen_lookup(bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void draw_sprites(bitmap_rgb32 &bitmap);
- void draw_chars(bitmap_rgb32 &bitmap);
- void draw_stars(bitmap_rgb32 &bitmap, const rectangle &cliprect );
- void draw_sprite(bitmap_rgb32 &bitmap, int y, int x,
+ void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void draw_chars(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void draw_stars(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void draw_sprite(bitmap_rgb32 &bitmap, const rectangle &cliprect, int y, int x,
uint8_t code, uint8_t color, int flip_y, int flip_x);
void common_save_state();
void _20pacgal(machine_config &config);
diff --git a/src/mame/video/20pacgal.cpp b/src/mame/video/20pacgal.cpp
index 310b26b5a82..75626a8acec 100644
--- a/src/mame/video/20pacgal.cpp
+++ b/src/mame/video/20pacgal.cpp
@@ -25,10 +25,11 @@
*
*************************************/
-void _20pacgal_state::get_pens(pen_t *pens)
+void _20pacgal_state::get_pens()
{
+ // TODO : Accurate palette when prom isn't exists
offs_t offs;
- uint8_t *color_prom = memregion("proms")->base() + (NUM_PENS * m_game_selected);
+ uint8_t *color_prom = m_proms->base() + (NUM_PENS * m_game_selected);
for (offs = 0; offs < NUM_PENS ;offs++)
{
@@ -52,14 +53,18 @@ void _20pacgal_state::get_pens(pen_t *pens)
bit2 = (*color_prom >> 7) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
- pens[offs] = rgb_t(r, g, b);
+ m_palette->set_pen_color(offs, rgb_t(r, g, b));
color_prom++;
}
+}
+
+PALETTE_INIT_MEMBER(_20pacgal_state,starpal_init)
+{
/* Star field */
/* palette for the stars */
- for (offs = 0;offs < 64;offs++)
+ for (offs_t offs = 0;offs < 64;offs++)
{
int bits,r,g,b;
static const int map[4] = { 0x00, 0x47, 0x97 ,0xde };
@@ -71,21 +76,18 @@ void _20pacgal_state::get_pens(pen_t *pens)
bits = (offs >> 4) & 0x03;
b = map[bits];
- pens[NUM_PENS + offs] = rgb_t(r, g, b);
+ palette.set_pen_color(NUM_PENS + offs, rgb_t(r, g, b));
}
}
void _20pacgal_state::do_pen_lookup(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- int y, x;
- pen_t pens[NUM_PENS + NUM_STAR_PENS];
+ const pen_t *pen = m_palette->pens();
- get_pens(pens);
-
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
- for(x = cliprect.min_x; x <= cliprect.max_x; x++)
- bitmap.pix32(y, x) = pens[bitmap.pix32(y, x)];
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for(int x = cliprect.min_x; x <= cliprect.max_x; x++)
+ bitmap.pix32(y, x) = pen[bitmap.pix32(y, x)];
}
@@ -96,7 +98,7 @@ void _20pacgal_state::do_pen_lookup(bitmap_rgb32 &bitmap, const rectangle &clipr
*
*************************************/
-void _20pacgal_state::draw_sprite(bitmap_rgb32 &bitmap, int y, int x,
+void _20pacgal_state::draw_sprite(bitmap_rgb32 &bitmap, const rectangle &cliprect, int y, int x,
uint8_t code, uint8_t color, int flip_y, int flip_x)
{
int sy;
@@ -115,7 +117,7 @@ void _20pacgal_state::draw_sprite(bitmap_rgb32 &bitmap, int y, int x,
{
int x_sav = x;
- if ((y >= 0) && (y < SCREEN_HEIGHT))
+ if ((y >= cliprect.min_y) && (y <= cliprect.max_y))
{
int sx;
uint32_t data;
@@ -133,7 +135,7 @@ void _20pacgal_state::draw_sprite(bitmap_rgb32 &bitmap, int y, int x,
/* for each pixel in the row */
for (sx = 0; sx < 0x10; sx++)
{
- if ((x >= 0) && (x < SCREEN_WIDTH))
+ if ((x >= cliprect.min_x) && (x <= cliprect.max_x))
{
offs_t pen = (data & 0xc0000000) >> 30;
uint8_t col;
@@ -166,7 +168,7 @@ void _20pacgal_state::draw_sprite(bitmap_rgb32 &bitmap, int y, int x,
}
-void _20pacgal_state::draw_sprites(bitmap_rgb32 &bitmap)
+void _20pacgal_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int offs;
@@ -202,7 +204,7 @@ void _20pacgal_state::draw_sprites(bitmap_rgb32 &bitmap)
for (y = 0; y <= size_y; y++)
for (x = 0; x <= size_x; x++)
- draw_sprite(bitmap,
+ draw_sprite(bitmap, cliprect,
sy + (16 * y), sx + (16 * x),
code + code_offs[y ^ (size_y * flip_y)][x ^ (size_x * flip_x)],
color,
@@ -218,7 +220,7 @@ void _20pacgal_state::draw_sprites(bitmap_rgb32 &bitmap)
*
*************************************/
-void _20pacgal_state::draw_chars(bitmap_rgb32 &bitmap)
+void _20pacgal_state::draw_chars(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
offs_t offs;
@@ -268,27 +270,33 @@ void _20pacgal_state::draw_chars(bitmap_rgb32 &bitmap)
int sx;
int x_sav = x;
- uint16_t data = (gfx[8] << 8) | gfx[0];
-
- /* for each pixel in the row */
- for (sx = 0; sx < 8; sx++)
+ if ((y >= cliprect.min_y) && (y <= cliprect.max_y))
{
- uint32_t col = ((data & 0x8000) >> 14) | ((data & 0x0800) >> 11);
+ uint16_t data = (gfx[8] << 8) | gfx[0];
- /* pen bits A4-A11 */
- if ( col != 0 )
- bitmap.pix32(y, x) = (color_base | col) << 4;
-
- /* next pixel */
- if (flip)
- x = x - 1;
- else
- x = x + 1;
-
- if (sx == 0x03)
- data = data << 5;
- else
- data = data << 1;
+ /* for each pixel in the row */
+ for (sx = 0; sx < 8; sx++)
+ {
+ if ((x >= cliprect.min_x) && (x <= cliprect.max_x))
+ {
+ uint32_t col = ((data & 0x8000) >> 14) | ((data & 0x0800) >> 11);
+
+ /* pen bits A4-A11 */
+ if ( col != 0 )
+ bitmap.pix32(y, x) = (color_base | col) << 4;
+
+ /* next pixel */
+ if (flip)
+ x = x - 1;
+ else
+ x = x + 1;
+
+ if (sx == 0x03)
+ data = data << 5;
+ else
+ data = data << 1;
+ }
+ }
}
/* next row */
@@ -413,14 +421,28 @@ uint32_t _20pacgal_state::screen_update_20pacgal(screen_device &screen, bitmap_r
{
bitmap.fill(0, cliprect);
draw_stars(bitmap,cliprect);
- draw_chars(bitmap);
- draw_sprites(bitmap);
+ draw_chars(bitmap, cliprect);
+ draw_sprites(bitmap, cliprect);
do_pen_lookup(bitmap, cliprect);
return 0;
}
+void _20pacgal_state::video_start()
+{
+ m_sprite_gfx_ram = make_unique_clear<uint8_t[]>(0x2000);
+ m_sprite_ram = make_unique_clear<uint8_t[]>(0x180);
+ m_sprite_color_lookup = make_unique_clear<uint8_t[]>(0x100);
+
+ save_pointer(NAME(m_sprite_gfx_ram.get()), 0x2000);
+ save_pointer(NAME(m_sprite_ram.get()), 0x180);
+ save_pointer(NAME(m_sprite_color_lookup.get()), 0x100);
+
+ if (m_proms != nullptr)
+ get_pens();
+}
+
/*************************************
*
@@ -436,4 +458,7 @@ MACHINE_CONFIG_START(_20pacgal_state::_20pacgal_video)
MCFG_SCREEN_VISIBLE_AREA(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1)
MCFG_SCREEN_UPDATE_DRIVER(_20pacgal_state, screen_update_20pacgal)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, _20pacgal_state, vblank_irq))
+
+ MCFG_PALETTE_ADD("palette", NUM_PENS + NUM_STAR_PENS)
+ MCFG_PALETTE_INIT_OWNER(_20pacgal_state,starpal_init)
MACHINE_CONFIG_END