summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/pacman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/pacman.cpp')
-rw-r--r--src/mame/video/pacman.cpp598
1 files changed, 0 insertions, 598 deletions
diff --git a/src/mame/video/pacman.cpp b/src/mame/video/pacman.cpp
deleted file mode 100644
index 9a4ceaaf21a..00000000000
--- a/src/mame/video/pacman.cpp
+++ /dev/null
@@ -1,598 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-/*************************************************************************
-
- Namco Pac Man
-
-**************************************************************************
-
- This file is used by the Pac Man, Pengo & Jr Pac Man drivers.
-
- Pengo & Pac Man are almost identical, the only differences being the
- extra gfx bank in Pengo, and the need to compensate for an hardware
- sprite positioning "bug" in Pac Man.
-
- Jr Pac Man has the same sprite hardware as Pac Man, the extra bank
- from Pengo and a scrolling playfield at the expense of one color per row
- for the playfield so it can fit in the same amount of ram.
-
-**************************************************************************/
-
-#include "emu.h"
-#include "includes/pacman.h"
-#include "video/resnet.h"
-
-
-
-/***************************************************************************
-
- Convert the color PROMs into a more useable format.
-
-
- Pac Man has a 32x8 palette PROM and a 256x4 color lookup table PROM.
-
- Pengo has a 32x8 palette PROM and a 1024x4 color lookup table PROM.
-
- 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
-
-
- Jr. Pac Man has two 256x4 palette PROMs (the three msb of the address are
- grounded, so the effective colors are only 32) and one 256x4 color lookup
- table PROM.
-
- The palette PROMs are connected to the RGB output this way:
-
- bit 3 -- 220 ohm resistor -- BLUE
- -- 470 ohm resistor -- BLUE
- -- 220 ohm resistor -- GREEN
- bit 0 -- 470 ohm resistor -- GREEN
-
- bit 3 -- 1 kohm resistor -- GREEN
- -- 220 ohm resistor -- RED
- -- 470 ohm resistor -- RED
- bit 0 -- 1 kohm resistor -- RED
-
-***************************************************************************/
-
-void pacman_state::pacman_palette(palette_device &palette) const
-{
- const uint8_t *color_prom = memregion("proms")->base();
- static constexpr int resistances[3] = { 1000, 470, 220 };
-
- // compute the color output resistor weights
- double rweights[3], gweights[3], bweights[2];
- compute_resistor_weights(0, 255, -1.0,
- 3, &resistances[0], rweights, 0, 0,
- 3, &resistances[0], gweights, 0, 0,
- 2, &resistances[1], bweights, 0, 0);
-
- // create a lookup table for the palette
- for (int i = 0; i < 32; i++)
- {
- int bit0, bit1, bit2;
-
- // red component
- bit0 = BIT(color_prom[i], 0);
- bit1 = BIT(color_prom[i], 1);
- bit2 = BIT(color_prom[i], 2);
- int const r = combine_weights(rweights, bit0, bit1, bit2);
-
- // green component
- bit0 = BIT(color_prom[i], 3);
- bit1 = BIT(color_prom[i], 4);
- bit2 = BIT(color_prom[i], 5);
- int const g = combine_weights(gweights, bit0, bit1, bit2);
-
- // blue component
- bit0 = BIT(color_prom[i], 6);
- bit1 = BIT(color_prom[i], 7);
- int const b = combine_weights(bweights, bit0, bit1);
-
- palette.set_indirect_color(i, rgb_t(r, g, b));
- }
-
- // color_prom now points to the beginning of the lookup table
- color_prom += 32;
-
- // allocate the colortable
- for (int i = 0; i < 64*4; i++)
- {
- uint8_t const ctabentry = color_prom[i] & 0x0f;
-
- // first palette bank
- palette.set_pen_indirect(i, ctabentry);
-
- // second palette bank
- palette.set_pen_indirect(i + 64*4, 0x10 | ctabentry);
- }
-}
-
-TILEMAP_MAPPER_MEMBER(pacman_state::pacman_scan_rows)
-{
- int offs;
-
- row += 2;
- col -= 2;
- if (col & 0x20)
- offs = row + ((col & 0x1f) << 5);
- else
- offs = col + (row << 5);
-
- return offs;
-}
-
-TILE_GET_INFO_MEMBER(pacman_state::pacman_get_tile_info)
-{
- int code = m_videoram[tile_index] | (m_charbank << 8);
- int attr = (m_colorram[tile_index] & 0x1f) | (m_colortablebank << 5) | (m_palettebank << 6 );
-
- tileinfo.set(0,code,attr,0);
-}
-
-/***************************************************************************
-
- Start the video hardware emulation.
-
-***************************************************************************/
-
-void pacman_state::init_save_state()
-{
- save_item(NAME(m_charbank));
- save_item(NAME(m_spritebank));
- save_item(NAME(m_palettebank));
- save_item(NAME(m_colortablebank));
- save_item(NAME(m_flipscreen));
- save_item(NAME(m_bgpriority));
- save_item(NAME(m_irq_mask));
- save_item(NAME(m_interrupt_vector));
-}
-
-
-VIDEO_START_MEMBER(pacman_state,pacman)
-{
- init_save_state();
-
- m_charbank = 0;
- m_spritebank = 0;
- m_palettebank = 0;
- m_colortablebank = 0;
- m_flipscreen = 0;
- m_bgpriority = 0;
- m_inv_spr = 0;
- m_interrupt_vector = 0;
-
- /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */
- /* one pixel to the left to get a more correct placement */
- m_xoffsethack = 1;
-
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pacman_state::pacman_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(pacman_state::pacman_scan_rows)), 8, 8, 36, 28);
-}
-
-VIDEO_START_MEMBER(pacman_state,birdiy)
-{
- VIDEO_START_CALL_MEMBER( pacman );
- m_xoffsethack = 0;
- m_inv_spr = 1; // sprites are mirrored in X-axis compared to normal behaviour
-}
-
-void pacman_state::pacman_videoram_w(offs_t offset, uint8_t data)
-{
- m_videoram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset );
-}
-
-void pacman_state::pacman_colorram_w(offs_t offset, uint8_t data)
-{
- m_colorram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset );
-}
-
-WRITE_LINE_MEMBER(pacman_state::flipscreen_w)
-{
- m_flipscreen = state;
- m_bg_tilemap->set_flip(m_flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) );
-}
-
-
-void mspactwin_state::mspactwin_videoram_w(offs_t offset, uint8_t data)
-{
- m_videoram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset );
- m_screen->update_partial(m_screen->vpos());
-}
-
-WRITE_LINE_MEMBER(mspactwin_state::flipscreen_w)
-{
- m_flipscreen = state;
- m_bg_tilemap->set_flip(m_flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) );
-// logerror("Flip: %02x\n", state);
-}
-
-
-uint32_t pacman_state::screen_update_pacman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- if (m_bgpriority != 0)
- bitmap.fill(0, cliprect);
- else
- m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0);
-
- if( m_spriteram != nullptr )
- {
- uint8_t *spriteram = m_spriteram;
- uint8_t *spriteram_2 = m_spriteram2;
- int offs;
-
- rectangle spriteclip(2*8, 34*8-1, 0*8, 28*8-1);
- spriteclip &= cliprect;
-
- /* Draw the sprites. Note that it is important to draw them exactly in this */
- /* order, to have the correct priorities. */
- for (offs = m_spriteram.bytes() - 2;offs > 2*2;offs -= 2)
- {
- int color;
- int sx,sy;
- uint8_t fx,fy;
-
- if(m_inv_spr)
- {
- sx = spriteram_2[offs + 1];
- sy = 240 - (spriteram_2[offs]);
- }
- else
- {
- sx = 272 - spriteram_2[offs + 1];
- sy = spriteram_2[offs] - 31;
- }
-
- fx = (spriteram[offs] & 1) ^ m_inv_spr;
- fy = (spriteram[offs] & 2) ^ ((m_inv_spr) << 1);
-
- color = ( spriteram[offs + 1] & 0x1f ) | (m_colortablebank << 5) | (m_palettebank << 6 );
-
- m_gfxdecode->gfx(1)->transmask(bitmap,spriteclip,
- ( spriteram[offs] >> 2 ) | (m_spritebank << 6),
- color,
- fx,fy,
- sx,sy,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
-
- /* also plot the sprite with wraparound (tunnel in Crush Roller) */
- m_gfxdecode->gfx(1)->transmask(bitmap,spriteclip,
- ( spriteram[offs] >> 2 ) | (m_spritebank << 6),
- color,
- fx,fy,
- sx - 256,sy,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
- }
- /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */
- /* one pixel to the left to get a more correct placement */
- for (offs = 2*2;offs >= 0;offs -= 2)
- {
- int color;
- int sx,sy;
- uint8_t fx,fy;
-
- if(m_inv_spr)
- {
- sx = spriteram_2[offs + 1];
- sy = 240 - (spriteram_2[offs]);
- }
- else
- {
- sx = 272 - spriteram_2[offs + 1];
- sy = spriteram_2[offs] - 31;
- }
- color = ( spriteram[offs + 1] & 0x1f ) | (m_colortablebank << 5) | (m_palettebank << 6 );
-
- fx = (spriteram[offs] & 1) ^ m_inv_spr;
- fy = (spriteram[offs] & 2) ^ ((m_inv_spr) << 1);
-
- m_gfxdecode->gfx(1)->transmask(bitmap,spriteclip,
- ( spriteram[offs] >> 2 ) | (m_spritebank << 6),
- color,
- fx,fy,
- sx,sy + m_xoffsethack,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
-
- /* also plot the sprite with wraparound (tunnel in Crush Roller) */
- m_gfxdecode->gfx(1)->transmask(bitmap,spriteclip,
- ( spriteram[offs] >> 2 ) | (m_spritebank << 6),
- color,
- fx,fy,
- sx - 256,sy + m_xoffsethack,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
- }
- }
-
- if (m_bgpriority != 0)
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
- return 0;
-}
-
-
-/*************************************************************************
-
- Sega Pengo
-
-**************************************************************************/
-
-VIDEO_START_MEMBER(pacman_state,pengo)
-{
- init_save_state();
-
- m_charbank = 0;
- m_spritebank = 0;
- m_palettebank = 0;
- m_colortablebank = 0;
- m_flipscreen = 0;
- m_bgpriority = 0;
- m_inv_spr = 0;
- m_xoffsethack = 0;
-
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pacman_state::pacman_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(pacman_state::pacman_scan_rows)), 8, 8, 36, 28);
-}
-
-WRITE_LINE_MEMBER(pacman_state::pengo_palettebank_w)
-{
- m_palettebank = state;
- m_bg_tilemap->mark_all_dirty();
-}
-
-WRITE_LINE_MEMBER(pacman_state::pengo_colortablebank_w)
-{
- m_colortablebank = state;
- m_bg_tilemap->mark_all_dirty();
-}
-
-WRITE_LINE_MEMBER(pacman_state::pengo_gfxbank_w)
-{
- m_spritebank = state;
- m_charbank = state;
- m_bg_tilemap->mark_all_dirty();
-}
-
-
-/*************************************************************************
-
-S2650 Games
-
-**************************************************************************/
-
-TILE_GET_INFO_MEMBER(pacman_state::s2650_get_tile_info)
-{
- int colbank, code, attr;
-
- colbank = m_s2650games_tileram[tile_index & 0x1f] & 0x3;
-
- code = m_videoram[tile_index] + (colbank << 8);
- attr = m_colorram[tile_index & 0x1f];
-
- tileinfo.set(0,code,attr & 0x1f,0);
-}
-
-VIDEO_START_MEMBER(pacman_state,s2650games)
-{
- init_save_state();
-
- m_charbank = 0;
- m_spritebank = 0;
- m_palettebank = 0;
- m_colortablebank = 0;
- m_flipscreen = 0;
- m_bgpriority = 0;
- m_inv_spr = 0;
- m_xoffsethack = 1;
-
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pacman_state::s2650_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
-
- m_bg_tilemap->set_scroll_cols(32);
-}
-
-uint32_t pacman_state::screen_update_s2650games(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- uint8_t *spriteram = m_spriteram;
- uint8_t *spriteram_2 = m_spriteram2;
- int offs;
-
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
-
- for (offs = m_spriteram.bytes() - 2;offs > 2*2;offs -= 2)
- {
- int color;
- int sx,sy;
-
-
- sx = 255 - spriteram_2[offs + 1];
- sy = spriteram_2[offs] - 15;
- color = spriteram[offs + 1] & 0x1f;
-
- /* TODO: ?? */
- m_gfxdecode->gfx(1)->transmask(bitmap,cliprect,
- (spriteram[offs] >> 2) | ((m_s2650_spriteram[offs] & 3) << 6),
- color,
- spriteram[offs] & 1,spriteram[offs] & 2,
- sx,sy,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
- }
- /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */
- /* one pixel to the left to get a more correct placement */
- for (offs = 2*2;offs >= 0;offs -= 2)
- {
- int color;
- int sx,sy;
-
-
- sx = 255 - spriteram_2[offs + 1];
- sy = spriteram_2[offs] - 15;
- color = spriteram[offs + 1] & 0x1f;
-
- /* TODO: ?? */
- m_gfxdecode->gfx(1)->transmask(bitmap,cliprect,
- (spriteram[offs] >> 2) | ((m_s2650_spriteram[offs] & 3)<<6),
- color,
- spriteram[offs] & 1,spriteram[offs] & 2,
- sx,sy + m_xoffsethack,
- m_palette->transpen_mask(*m_gfxdecode->gfx(1), color & 0x3f, 0));
- }
- return 0;
-}
-
-void pacman_state::s2650games_videoram_w(offs_t offset, uint8_t data)
-{
- m_videoram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset);
-}
-
-void pacman_state::s2650games_colorram_w(offs_t offset, uint8_t data)
-{
- int i;
- m_colorram[offset & 0x1f] = data;
- for (i = offset; i < 0x0400; i += 32)
- m_bg_tilemap->mark_tile_dirty(i);
-}
-
-void pacman_state::s2650games_scroll_w(offs_t offset, uint8_t data)
-{
- m_bg_tilemap->set_scrolly(offset, data);
-}
-
-void pacman_state::s2650games_tilesbank_w(offs_t offset, uint8_t data)
-{
- m_s2650games_tileram[offset] = data;
- m_bg_tilemap->mark_all_dirty();
-}
-
-
-/*************************************************************************
-
-Jr. Pac-Man
-
-**************************************************************************/
-
-/*
- 0 - 31 = column 2 - 33 attr (used for all 54 rows)
- 64 - 1791 = column 2 - 33 code (54 rows)
-1794 - 1821 = column 34 code (28 rows)
-1826 - 1853 = column 35 code (28 rows)
-1858 - 1885 = column 0 code (28 rows)
-1890 - 1917 = column 1 code (28 rows)
-1922 - 1949 = column 34 attr (28 rows)
-1954 - 1981 = column 35 attr (28 rows)
-1986 - 2013 = column 0 attr (28 rows)
-2018 - 2045 = column 1 attr (28 rows)
-*/
-
-TILEMAP_MAPPER_MEMBER(pacman_state::jrpacman_scan_rows)
-{
- int offs;
-
- row += 2;
- col -= 2;
- if ((col & 0x20) && (row & 0x20))
- offs = 0;
- else if (col & 0x20)
- offs = row + (((col&0x3) | 0x38)<< 5);
- else
- offs = col + (row << 5);
- return offs;
-}
-
-TILE_GET_INFO_MEMBER(pacman_state::jrpacman_get_tile_info)
-{
- int color_index, code, attr;
- if( tile_index < 1792 )
- {
- color_index = tile_index & 0x1f;
- }
- else
- {
- color_index = tile_index + 0x80;
- }
-
- code = m_videoram[tile_index] | (m_charbank << 8);
- attr = (m_videoram[color_index] & 0x1f) | (m_colortablebank << 5) | (m_palettebank << 6 );
-
- tileinfo.set(0,code,attr,0);
-}
-
-void pacman_state::jrpacman_mark_tile_dirty( int offset )
-{
- if( offset < 0x20 )
- {
- /* line color - mark whole line as dirty */
- int i;
- for( i = 2 * 0x20; i < 56 * 0x20; i += 0x20 )
- {
- m_bg_tilemap->mark_tile_dirty(offset + i );
- }
- }
- else if (offset < 1792)
- {
- /* tiles for playfield */
- m_bg_tilemap->mark_tile_dirty(offset );
- }
- else
- {
- /* tiles & colors for top and bottom two rows */
- m_bg_tilemap->mark_tile_dirty(offset & ~0x80 );
- }
-}
-
-VIDEO_START_MEMBER(pacman_state,jrpacman)
-{
- init_save_state();
-
- m_charbank = 0;
- m_spritebank = 0;
- m_palettebank = 0;
- m_colortablebank = 0;
- m_flipscreen = 0;
- m_bgpriority = 0;
- m_inv_spr = 0;
- m_xoffsethack = 1;
-
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pacman_state::jrpacman_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(pacman_state::jrpacman_scan_rows)), 8, 8, 36, 54);
-
- m_bg_tilemap->set_transparent_pen(0 );
- m_bg_tilemap->set_scroll_cols(36 );
-}
-
-void pacman_state::jrpacman_videoram_w(offs_t offset, uint8_t data)
-{
- m_videoram[offset] = data;
- jrpacman_mark_tile_dirty(offset);
-}
-
-WRITE_LINE_MEMBER(pacman_state::jrpacman_charbank_w)
-{
- m_charbank = state;
- m_bg_tilemap->mark_all_dirty();
-}
-
-WRITE_LINE_MEMBER(pacman_state::jrpacman_spritebank_w)
-{
- m_spritebank = state;
-}
-
-void pacman_state::jrpacman_scroll_w(uint8_t data)
-{
- int i;
- for( i = 2; i < 34; i++ )
- {
- m_bg_tilemap->set_scrolly(i, data );
- }
-}
-
-WRITE_LINE_MEMBER(pacman_state::jrpacman_bgpriority_w)
-{
- m_bgpriority = state;
-}