summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/dooyong.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/dooyong.c')
-rw-r--r--src/mame/video/dooyong.c542
1 files changed, 246 insertions, 296 deletions
diff --git a/src/mame/video/dooyong.c b/src/mame/video/dooyong.c
index 96c913041dd..3f6c14b5a49 100644
--- a/src/mame/video/dooyong.c
+++ b/src/mame/video/dooyong.c
@@ -2,7 +2,7 @@
#include "includes/dooyong.h"
-inline void dooyong_state::dooyong_scroll8_w(offs_t offset, UINT8 data, UINT8 *scroll, tilemap_t *map)
+inline void dooyong_state::scroll8_w(offs_t offset, UINT8 data, UINT8 *scroll, tilemap_t *map)
{
UINT8 old = scroll[offset];
if (old != data)
@@ -18,7 +18,7 @@ inline void dooyong_state::dooyong_scroll8_w(offs_t offset, UINT8 data, UINT8 *s
break;
case 3: /* Low byte of y scroll */
case 4: /* High byte of y scroll */
- map->set_scrolly(0, (int)scroll[3] | ((int)scroll[4] << 8));
+ map->set_scrolly(0, (unsigned)scroll[3] | ((unsigned)scroll[4] << 8));
break;
case 6: /* Tilemap enable and mode control */
map->enable(!(data & 0x10));
@@ -43,55 +43,31 @@ inline void dooyong_state::dooyong_scroll8_w(offs_t offset, UINT8 data, UINT8 *s
}
-/* These handle writes to the tilemap scroll registers in 8-bit machines.
+/* These handle writes to the tilemap scroll registers.
There is one per tilemap, wrapping the above function that does the work. */
-WRITE8_MEMBER(dooyong_state::dooyong_bgscroll8_w)
+WRITE8_MEMBER(dooyong_state::bgscroll_w)
{
- dooyong_scroll8_w(offset, data, m_bgscroll8, m_bg_tilemap);
+ scroll8_w(offset, data, m_bgscroll8, m_bg_tilemap);
}
-WRITE8_MEMBER(dooyong_state::dooyong_bg2scroll8_w)
+WRITE8_MEMBER(dooyong_state::bg2scroll_w)
{
- dooyong_scroll8_w(offset, data, m_bg2scroll8, m_bg2_tilemap);
+ scroll8_w(offset, data, m_bg2scroll8, m_bg2_tilemap);
}
-WRITE8_MEMBER(dooyong_state::dooyong_fgscroll8_w)
+WRITE8_MEMBER(dooyong_state::fgscroll_w)
{
- dooyong_scroll8_w(offset, data, m_fgscroll8, m_fg_tilemap);
+ scroll8_w(offset, data, m_fgscroll8, m_fg_tilemap);
}
-WRITE8_MEMBER(dooyong_state::dooyong_fg2scroll8_w)
+WRITE8_MEMBER(dooyong_state::fg2scroll_w)
{
- dooyong_scroll8_w(offset, data, m_fg2scroll8, m_fg2_tilemap);
+ scroll8_w(offset, data, m_fg2scroll8, m_fg2_tilemap);
}
-/* These handle writes to the tilemap scroll registers in 16-bit machines.
- This is just an 8-bit peripheral in a 16-bit machine. */
-
-WRITE16_MEMBER(dooyong_state::dooyong_bgscroll16_w)
-{
- if (ACCESSING_BITS_0_7) dooyong_bgscroll8_w(space, offset, data & 0x00ff);
-}
-
-WRITE16_MEMBER(dooyong_state::dooyong_bg2scroll16_w)
-{
- if (ACCESSING_BITS_0_7) dooyong_bg2scroll8_w(space, offset, data & 0x00ff);
-}
-
-WRITE16_MEMBER(dooyong_state::dooyong_fgscroll16_w)
-{
- if (ACCESSING_BITS_0_7) dooyong_fgscroll8_w(space, offset, data & 0x00ff);
-}
-
-WRITE16_MEMBER(dooyong_state::dooyong_fg2scroll16_w)
-{
- if (ACCESSING_BITS_0_7) dooyong_fg2scroll8_w(space, offset, data & 0x00ff);
-}
-
-
-WRITE8_MEMBER(dooyong_state::dooyong_txvideoram8_w)
+WRITE8_MEMBER(dooyong_z80_state::txvideoram_w)
{
if (m_txvideoram[offset] != data)
{
@@ -106,7 +82,7 @@ WRITE8_MEMBER(dooyong_state::dooyong_txvideoram8_w)
/* Control registers seem to be different on every game */
-WRITE8_MEMBER(dooyong_state::lastday_ctrl_w)
+WRITE8_MEMBER(dooyong_z80_ym2203_state::lastday_ctrl_w)
{
/* bits 0 and 1 are coin counters */
coin_counter_w(machine(), 0, data & 0x01);
@@ -121,7 +97,7 @@ WRITE8_MEMBER(dooyong_state::lastday_ctrl_w)
flip_screen_set(data & 0x40);
}
-WRITE8_MEMBER(dooyong_state::pollux_ctrl_w)
+WRITE8_MEMBER(dooyong_z80_ym2203_state::pollux_ctrl_w)
{
/* bit 0 is flip screen */
flip_screen_set(data & 0x01);
@@ -136,7 +112,7 @@ WRITE8_MEMBER(dooyong_state::pollux_ctrl_w)
/* bit 4 is used but unknown */
}
-WRITE8_MEMBER(dooyong_state::primella_ctrl_w)
+WRITE8_MEMBER(dooyong_z80_state::primella_ctrl_w)
{
/* bits 0-2 select ROM bank */
membank("bank1")->set_entry(data & 0x07);
@@ -152,7 +128,7 @@ WRITE8_MEMBER(dooyong_state::primella_ctrl_w)
// logerror("%04x: bankswitch = %02x\n",space.device().safe_pc(),data&0xe0);
}
-WRITE8_MEMBER(dooyong_state::paletteram_flytiger_w)
+WRITE8_MEMBER(dooyong_z80_state::paletteram_flytiger_w)
{
if (m_flytiger_palette_bank)
{
@@ -163,7 +139,7 @@ WRITE8_MEMBER(dooyong_state::paletteram_flytiger_w)
}
}
-WRITE8_MEMBER(dooyong_state::flytiger_ctrl_w)
+WRITE8_MEMBER(dooyong_z80_state::flytiger_ctrl_w)
{
/* bit 0 is flip screen */
flip_screen_set(data & 0x01);
@@ -177,21 +153,6 @@ WRITE8_MEMBER(dooyong_state::flytiger_ctrl_w)
m_flytiger_pri = data & 0x10;
}
-WRITE16_MEMBER(dooyong_state::rshark_ctrl_w)
-
-{
- if (ACCESSING_BITS_0_7)
- {
- /* bit 0 flips screen */
- flip_screen_set(data & 0x0001);
-
- /* bit 4 changes tilemaps priority */
- m_rshark_pri = data & 0x0010;
-
- /* bit 5 used but unknown */
- }
-}
-
/* These games all have ROM-based tilemaps for the backgrounds, title
screens and sometimes "bosses" and special attacks. There are three
@@ -203,11 +164,11 @@ WRITE16_MEMBER(dooyong_state::rshark_ctrl_w)
when the x scroll moves out of range (trying to decode the whole lot
at once uses hundreds of megabytes of RAM). */
-inline void dooyong_state::lastday_get_tile_info(tile_data &tileinfo, int tile_index,
- const UINT8 *tilerom, UINT8 *scroll, int graphics)
+inline void dooyong_state::get_tile_info(tile_data &tileinfo, int tile_index,
+ UINT8 const *tilerom, UINT8 const *scroll, int graphics)
{
- int offs = (tile_index + ((int)scroll[1] << 6)) * 2;
- int attr = tilerom[offs];
+ int const offs = (tile_index + ((int)scroll[1] << 6)) * 2;
+ int const attr = tilerom[offs];
int code, color, flags;
if (scroll[6] & 0x20)
{ /* lastday/gulfstrm/pollux/flytiger */
@@ -221,11 +182,10 @@ inline void dooyong_state::lastday_get_tile_info(tile_data &tileinfo, int tile_i
Y = y flip */
code = tilerom[offs + 1] | ((attr & 0x01) << 8) | ((attr & 0x80) << 2);
color = (attr & 0x78) >> 3;
- flags = ((attr & 0x02) ? TILE_FLIPX : 0) | ((attr & 0x04) ? TILE_FLIPY : 0);
+ flags = TILE_FLIPYX((attr & 0x06) >> 1);
}
else
- {
- /* primella */
+ { /* primella/popbingo */
/* Tiles take two bytes in ROM:
MSB LSB
[offs + 0x00] YXCC CCcc (Y flip, X flip, bits 3-0 of color code, bits 9-8 of gfx code)
@@ -245,80 +205,33 @@ inline void dooyong_state::lastday_get_tile_info(tile_data &tileinfo, int tile_i
code = tilerom[offs + 1] | ((attr & codemask) << 8);
color = (attr & palmask) >> 2;
- flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
+ flags = TILE_FLIPYX((attr & 0xC0) >> 6);
}
- SET_TILE_INFO_MEMBER(graphics, code, color, flags);
-}
-
-inline void dooyong_state::rshark_get_tile_info(tile_data &tileinfo, int tile_index,
- const UINT8 *tilerom1, const UINT8 *tilerom2, UINT8 *scroll, int graphics)
-{
- /* Tiles take two bytes in tile ROM 1:
- MSB LSB
- [offs + 0x00] YX?c cccc (Y flip, X flip, bits 12-8 of gfx code)
- [offs + 0x01] cccc cccc (bits 7-0 of gfx code)
- ? = unused/unknown
- c = gfx code
- X = x flip
- Y = y flip */
- int offs = tile_index + ((int)scroll[1] << 9);
- int attr = tilerom1[offs * 2];
- int code = tilerom1[(offs * 2) + 1] | ((attr & 0x1f) << 8);
- int color = tilerom2[offs] & 0x0f;
- int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
-
- SET_TILE_INFO_MEMBER(graphics, code, color, flags);
+ tileinfo.set(graphics, code, color, flags);
}
TILE_GET_INFO_MEMBER(dooyong_state::get_bg_tile_info)
{
- if (m_bg_tilerom2 != NULL)
- rshark_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bg_tilerom2, m_bgscroll8, m_bg_gfx);
- else
- lastday_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bgscroll8, m_bg_gfx);
+ get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bgscroll8, m_bg_gfx);
}
TILE_GET_INFO_MEMBER(dooyong_state::get_bg2_tile_info)
{
- if (m_bg2_tilerom2 != NULL)
- rshark_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2_tilerom2, m_bg2scroll8, m_bg2_gfx);
- else
- lastday_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2scroll8, m_bg2_gfx);
+ get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2scroll8, m_bg2_gfx);
}
TILE_GET_INFO_MEMBER(dooyong_state::get_fg_tile_info)
{
- if (m_fg_tilerom2 != NULL)
- rshark_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fg_tilerom2, m_fgscroll8, m_fg_gfx);
- else
- lastday_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fgscroll8, m_fg_gfx);
+ get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fgscroll8, m_fg_gfx);
}
TILE_GET_INFO_MEMBER(dooyong_state::get_fg2_tile_info)
{
- if (m_fg2_tilerom2 != NULL)
- rshark_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2_tilerom2, m_fg2scroll8, m_fg2_gfx);
- else
- lastday_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2scroll8, m_fg2_gfx);
+ get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2scroll8, m_fg2_gfx);
}
-/* flytiger uses some palette banking technique or something maybe a trash protection */
-
-TILE_GET_INFO_MEMBER(dooyong_state::flytiger_get_fg_tile_info)
-{
- const UINT8 *tilerom = m_fg_tilerom;
-
- int offs = (tile_index + (m_fgscroll8[1] << 6)) * 2;
- int attr = tilerom[offs];
- int code = tilerom[offs + 1] | ((attr & 0x01) << 8) | ((attr & 0x80) << 2);
- int color = (attr & 0x78) >> 3;
- int flags = ((attr & 0x02) ? TILE_FLIPX : 0) | ((attr & 0x04) ? TILE_FLIPY : 0);
-
- SET_TILE_INFO_MEMBER(m_fg_gfx, code, color, flags);
-}
-
-TILE_GET_INFO_MEMBER(dooyong_state::get_tx_tile_info)
+TILE_GET_INFO_MEMBER(dooyong_z80_state::get_tx_tile_info)
{
/* Each tile takes two bytes of memory:
MSB LSB
@@ -326,7 +239,7 @@ TILE_GET_INFO_MEMBER(dooyong_state::get_tx_tile_info)
[offs + 0x01] CCCC cccc (bits 3-0 of color code, bits 11-8 of gfx code)
c = gfx code
C = color code */
- int offs, attr, code, color;
+ unsigned offs, attr;
if (m_tx_tilemap_mode == 0)
{ /* lastday/gulfstrm/pollux/flytiger */
offs = tile_index;
@@ -337,14 +250,14 @@ TILE_GET_INFO_MEMBER(dooyong_state::get_tx_tile_info)
offs = tile_index * 2;
attr = m_txvideoram[offs + 1];
}
- code = m_txvideoram[offs] | ((attr & 0x0f) << 8);
- color = (attr & 0xf0) >> 4;
+ int const code = m_txvideoram[offs] | ((attr & 0x0f) << 8);
+ int const color = (attr & 0xf0) >> 4;
- SET_TILE_INFO_MEMBER(0, code, color, 0);
+ tileinfo.set(0, code, color, 0);
}
-void dooyong_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pollux_extensions)
+void dooyong_z80_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, unsigned extensions)
{
/* Sprites take 32 bytes each in memory:
MSB LSB
@@ -364,53 +277,45 @@ void dooyong_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
w = width
X = x flip
Y = y flip
- * = alters y position in pollux and flytiger - see code below
+ * = alters y position in bluehawk and flytiger - see code below
bit 11 of gfx code only used by gulfstrm, pollux, bluehawk and flytiger
height only used by pollux, bluehawk and flytiger
x flip and y flip only used by pollux and flytiger */
- UINT8 *buffered_spriteram = m_spriteram->buffer();
- int offs;
-
- for (offs = 0; offs < m_spriteram->bytes(); offs += 32)
+ UINT8 const *const buffered_spriteram = m_spriteram->buffer();
+ for (int offs = 0; offs < m_spriteram->bytes(); offs += 32)
{
- int sx, sy, code, color, pri;
- int flipx = 0, flipy = 0, height = 0, y;
-
- sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4);
- sy = buffered_spriteram[offs+2];
- code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3);
- color = buffered_spriteram[offs+1] & 0x0f;
+ int sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4);
+ int sy = buffered_spriteram[offs+2];
+ int code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3);
+ int const color = buffered_spriteram[offs+1] & 0x0f;
//TODO: This priority mechanism works for known games, but seems a bit strange.
//Are we missing something? (The obvious spare palette bit isn't it.)
- pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0);
+ int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0);
- if (pollux_extensions)
+ bool flipx = false, flipy = false;
+ int height = 0;
+ if (extensions)
{
- /* gulfstrm, pollux, bluehawk, flytiger */
- code |= ((buffered_spriteram[offs+0x1c] & 0x01) << 11);
+ UINT8 const ext = buffered_spriteram[offs+0x1c];
+
+ if (extensions & SPRITE_12BIT)
+ code |= ((ext & 0x01) << 11);
- if (pollux_extensions >= 2)
+ if (extensions & SPRITE_HEIGHT)
{
- /* pollux, bluehawk, flytiger */
- height = (buffered_spriteram[offs+0x1c] & 0x70) >> 4;
+ height = (ext & 0x70) >> 4;
code &= ~height;
- flipx = buffered_spriteram[offs+0x1c] & 0x08;
- flipy = buffered_spriteram[offs+0x1c] & 0x04;
+ flipx = ext & 0x08;
+ flipy = ext & 0x04;
+ }
- if (pollux_extensions == 3)
- {
- /* bluehawk */
- sy += 6 - ((~buffered_spriteram[offs+0x1c] & 0x02) << 7);
- }
+ if (extensions & SPRITE_YSHIFT_BLUEHAWK)
+ sy += 6 - ((~ext & 0x02) << 7);
- if (pollux_extensions == 4)
- {
- /* flytiger */
- sy -=(buffered_spriteram[offs+0x1c] & 0x02) << 7;
- }
- }
+ if (extensions & SPRITE_YSHIFT_FLYTIGER)
+ sy -=(ext & 0x02) << 7;
}
if (flip_screen())
@@ -421,7 +326,7 @@ void dooyong_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
flipy = !flipy;
}
- for (y = 0; y <= height; y++)
+ for (int y = 0; y <= height; y++)
{
m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect,
code + y,
@@ -434,79 +339,8 @@ void dooyong_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
}
}
-void dooyong_state::rshark_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- UINT16 *buffered_spriteram16 = m_spriteram16->buffer();
- /* Sprites take 8 16-bit words each in memory:
- MSB LSB
- [offs + 0] ???? ???? ???? ???E
- [offs + 1] ???? ???? hhhh wwww
- [offs + 2] ???? ???? ???? ????
- [offs + 3] cccc cccc cccc cccc
- [offs + 4] ???? ???x xxxx xxxx
- [offs + 5] ???? ???? ???? ????
- [offs + 6] ???? ???y yyyy yyyy
- [offs + 7] ???? ???? ???? CCCC
- ? = unused/unknown
- E = enable
- c = gfx code
- x = x offset
- y = y offset (signed)
- C = color code
- w = width
- h = height */
-
- int offs;
-
- for (offs = (m_spriteram16->bytes() / 2) - 8; offs >= 0; offs -= 8)
- {
- if (buffered_spriteram16[offs] & 0x0001) /* enable */
- {
- int sx, sy, code, color, pri;
- int flipx = 0, flipy = 0, width, height, x, y;
-
- sx = buffered_spriteram16[offs+4] & 0x01ff;
- sy = (INT16)buffered_spriteram16[offs+6] & 0x01ff;
- if (sy & 0x0100) sy |= ~(int)0x01ff; // Correctly sign-extend 9-bit number
- code = buffered_spriteram16[offs+3];
- color = buffered_spriteram16[offs+7] & 0x000f;
- //TODO: This priority mechanism works for known games, but seems a bit strange.
- //Are we missing something? (The obvious spare palette bit isn't it.)
- pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0);
- width = buffered_spriteram16[offs+1] & 0x000f;
- height = (buffered_spriteram16[offs+1] & 0x00f0) >> 4;
-
- if (flip_screen())
- {
- sx = 498 - (16 * width) - sx;
- sy = 240 - (16 * height) - sy;
- flipx = !flipx;
- flipy = !flipy;
- }
-
- for (y = 0; y <= height; y++)
- {
- int _y = sy + (16 * (flipy ? (height - y) : y));
- for (x = 0; x <= width; x++)
- {
- int _x = sx + (16 * (flipx ? (width - x) : x));
- m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect,
- code,
- color,
- flipx, flipy,
- _x, _y,
- screen.priority(),
- pri, 15);
- code++;
- }
- }
- }
- }
-}
-
-
-UINT32 dooyong_state::screen_update_lastday(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_ym2203_state::screen_update_lastday(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
screen.priority().fill(0, cliprect);
@@ -516,11 +350,12 @@ UINT32 dooyong_state::screen_update_lastday(screen_device &screen, bitmap_ind16
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
if (!m_sprites_disabled)
- draw_sprites(screen, bitmap, cliprect, 0);
+ draw_sprites(screen, bitmap, cliprect);
+
return 0;
}
-UINT32 dooyong_state::screen_update_gulfstrm(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_ym2203_state::screen_update_gulfstrm(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
screen.priority().fill(0, cliprect);
@@ -529,11 +364,12 @@ UINT32 dooyong_state::screen_update_gulfstrm(screen_device &screen, bitmap_ind16
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
- draw_sprites(screen, bitmap, cliprect, 1);
+ draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT);
+
return 0;
}
-UINT32 dooyong_state::screen_update_pollux(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_ym2203_state::screen_update_pollux(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
screen.priority().fill(0, cliprect);
@@ -542,11 +378,12 @@ UINT32 dooyong_state::screen_update_pollux(screen_device &screen, bitmap_ind16 &
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
- draw_sprites(screen, bitmap, cliprect, 2);
+ draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT);
+
return 0;
}
-UINT32 dooyong_state::screen_update_flytiger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_state::screen_update_flytiger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
screen.priority().fill(0, cliprect);
@@ -563,12 +400,13 @@ UINT32 dooyong_state::screen_update_flytiger(screen_device &screen, bitmap_ind16
}
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
- draw_sprites(screen, bitmap, cliprect, 4);
+ draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT | SPRITE_YSHIFT_FLYTIGER);
+
return 0;
}
-UINT32 dooyong_state::screen_update_bluehawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_state::screen_update_bluehawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
screen.priority().fill(0, cliprect);
@@ -578,11 +416,12 @@ UINT32 dooyong_state::screen_update_bluehawk(screen_device &screen, bitmap_ind16
m_fg2_tilemap->draw(screen, bitmap, cliprect, 0, 4);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
- draw_sprites(screen, bitmap, cliprect, 3);
+ draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT | SPRITE_YSHIFT_BLUEHAWK);
+
return 0;
}
-UINT32 dooyong_state::screen_update_primella(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+UINT32 dooyong_z80_state::screen_update_primella(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
@@ -590,42 +429,15 @@ UINT32 dooyong_state::screen_update_primella(screen_device &screen, bitmap_ind16
if (m_tx_pri) m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
if (!m_tx_pri) m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- return 0;
-}
-
-UINT32 dooyong_state::screen_update_rshark(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
- screen.priority().fill(0, cliprect);
-
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
- m_bg2_tilemap->draw(screen, bitmap, cliprect, 0, (m_rshark_pri ? 2 : 1));
- m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
- m_fg2_tilemap->draw(screen, bitmap, cliprect, 0, 2);
- rshark_draw_sprites(screen, bitmap, cliprect);
return 0;
}
-UINT32 dooyong_state::screen_update_popbingo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
- screen.priority().fill(0, cliprect);
-
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
-
- rshark_draw_sprites(screen, bitmap, cliprect);
- return 0;
-}
-
-
-VIDEO_START_MEMBER(dooyong_state,lastday)
+VIDEO_START_MEMBER(dooyong_z80_ym2203_state, lastday)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx5")->base();
m_fg_tilerom = memregion("gfx6")->base();
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
m_bg_gfx = 2;
m_fg_gfx = 3;
m_tx_tilemap_mode = 0;
@@ -635,7 +447,7 @@ VIDEO_START_MEMBER(dooyong_state,lastday)
32, 32, 32, 8);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -658,13 +470,11 @@ VIDEO_START_MEMBER(dooyong_state,lastday)
save_item(NAME(m_interrupt_line_2));
}
-VIDEO_START_MEMBER(dooyong_state,gulfstrm)
+VIDEO_START_MEMBER(dooyong_z80_ym2203_state, gulfstrm)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx5")->base();
m_fg_tilerom = memregion("gfx6")->base();
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
m_bg_gfx = 2;
m_fg_gfx = 3;
m_tx_tilemap_mode = 0;
@@ -674,7 +484,7 @@ VIDEO_START_MEMBER(dooyong_state,gulfstrm)
32, 32, 32, 8);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -696,13 +506,11 @@ VIDEO_START_MEMBER(dooyong_state,gulfstrm)
save_item(NAME(m_interrupt_line_2));
}
-VIDEO_START_MEMBER(dooyong_state,pollux)
+VIDEO_START_MEMBER(dooyong_z80_ym2203_state, pollux)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx5")->base();
m_fg_tilerom = memregion("gfx6")->base();
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
m_bg_gfx = 2;
m_fg_gfx = 3;
m_tx_tilemap_mode = 0;
@@ -712,7 +520,7 @@ VIDEO_START_MEMBER(dooyong_state,pollux)
32, 32, 32, 8);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -731,15 +539,12 @@ VIDEO_START_MEMBER(dooyong_state,pollux)
save_item(NAME(m_interrupt_line_2));
}
-VIDEO_START_MEMBER(dooyong_state,bluehawk)
+VIDEO_START_MEMBER(dooyong_z80_state, bluehawk)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx3")->base() + 0x78000;
m_fg_tilerom = memregion("gfx4")->base() + 0x78000;
m_fg2_tilerom = memregion("gfx5")->base() + 0x38000;
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
- m_fg2_tilerom2 = NULL;
m_bg_gfx = 2;
m_fg_gfx = 3;
m_fg2_gfx = 4;
@@ -752,7 +557,7 @@ VIDEO_START_MEMBER(dooyong_state,bluehawk)
32, 32, 32, 8);
m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg2_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -771,13 +576,11 @@ VIDEO_START_MEMBER(dooyong_state,bluehawk)
save_item(NAME(m_fg2scroll8));
}
-VIDEO_START_MEMBER(dooyong_state,flytiger)
+VIDEO_START_MEMBER(dooyong_z80_state, flytiger)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx3")->base() + 0x78000;
m_fg_tilerom = memregion("gfx4")->base() + 0x78000;
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
m_bg_gfx = 2;
m_fg_gfx = 3;
m_tx_tilemap_mode = 0;
@@ -785,9 +588,9 @@ VIDEO_START_MEMBER(dooyong_state,flytiger)
/* Create tilemaps */
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::flytiger_get_fg_tile_info),this), TILEMAP_SCAN_COLS,
+ m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -806,13 +609,11 @@ VIDEO_START_MEMBER(dooyong_state,flytiger)
save_item(NAME(m_flytiger_pri));
}
-VIDEO_START_MEMBER(dooyong_state,primella)
+VIDEO_START_MEMBER(dooyong_z80_state, primella)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx2")->base() + memregion("gfx2")->bytes() - 0x8000;
m_fg_tilerom = memregion("gfx3")->base() + memregion("gfx3")->bytes() - 0x8000;
- m_bg_tilerom2 = NULL;
- m_fg_tilerom2 = NULL;
m_bg_gfx = 1;
m_fg_gfx = 2;
m_tx_tilemap_mode = 1;
@@ -822,7 +623,7 @@ VIDEO_START_MEMBER(dooyong_state,primella)
32, 32, 32, 8);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
32, 32, 32, 8);
- m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
+ m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS,
8, 8, 64, 32);
/* Configure tilemap transparency */
@@ -840,7 +641,156 @@ VIDEO_START_MEMBER(dooyong_state,primella)
save_item(NAME(m_tx_pri));
}
-VIDEO_START_MEMBER(dooyong_state,rshark)
+
+WRITE16_MEMBER(dooyong_68k_state::ctrl_w)
+{
+ if (ACCESSING_BITS_0_7)
+ {
+ /* bit 0 flips screen */
+ flip_screen_set(data & 0x0001);
+
+ /* bit 4 changes tilemaps priority */
+ m_bg2_priority = data & 0x0010;
+
+ /* bit 5 used but unknown */
+ }
+}
+
+
+inline void dooyong_68k_state::rshark_get_tile_info(tile_data &tileinfo, int tile_index,
+ UINT8 const *tilerom1, UINT8 const *tilerom2, UINT8 const *scroll, int graphics)
+{
+ /* Tiles take two bytes in tile ROM 1:
+ MSB LSB
+ [offs + 0x00] YX?c cccc (Y flip, X flip, bits 12-8 of gfx code)
+ [offs + 0x01] cccc cccc (bits 7-0 of gfx code)
+ ? = unused/unknown
+ c = gfx code
+ X = x flip
+ Y = y flip */
+ int const offs = tile_index + ((int)scroll[1] << 9);
+ int const attr = tilerom1[offs * 2];
+ int const code = tilerom1[(offs * 2) + 1] | ((attr & 0x1f) << 8);
+ int const color = tilerom2[offs] & 0x0f;
+ int const flags = TILE_FLIPYX((attr & 0xC0) >> 6);
+
+ tileinfo.set(graphics, code, color, flags);
+}
+
+TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_bg_tile_info)
+{
+ rshark_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bg_tilerom2, m_bgscroll8, m_bg_gfx);
+}
+
+TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_bg2_tile_info)
+{
+ rshark_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2_tilerom2, m_bg2scroll8, m_bg2_gfx);
+}
+
+TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_fg_tile_info)
+{
+ rshark_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fg_tilerom2, m_fgscroll8, m_fg_gfx);
+}
+
+TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_fg2_tile_info)
+{
+ rshark_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2_tilerom2, m_fg2scroll8, m_fg2_gfx);
+}
+
+
+void dooyong_68k_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ /* Sprites take 8 16-bit words each in memory:
+ MSB LSB
+ [offs + 0] ???? ???? ???? ???E
+ [offs + 1] ???? ???? hhhh wwww
+ [offs + 2] ???? ???? ???? ????
+ [offs + 3] cccc cccc cccc cccc
+ [offs + 4] ???? ???x xxxx xxxx
+ [offs + 5] ???? ???? ???? ????
+ [offs + 6] ???? ???y yyyy yyyy
+ [offs + 7] ???? ???? ???? CCCC
+ ? = unused/unknown
+ E = enable
+ c = gfx code
+ x = x offset
+ y = y offset (signed)
+ C = color code
+ w = width
+ h = height */
+
+ UINT16 const *const buffered_spriteram = m_spriteram->buffer();
+ for (int offs = (m_spriteram->bytes() / 2) - 8; offs >= 0; offs -= 8)
+ {
+ if (buffered_spriteram[offs] & 0x0001) /* enable */
+ {
+ int code = buffered_spriteram[offs+3];
+ int const color = buffered_spriteram[offs+7] & 0x000f;
+ //TODO: This priority mechanism works for known games, but seems a bit strange.
+ //Are we missing something? (The obvious spare palette bit isn't it.)
+ int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0);
+ int const width = buffered_spriteram[offs+1] & 0x000f;
+ int const height = (buffered_spriteram[offs+1] & 0x00f0) >> 4;
+
+ bool const flip = flip_screen();
+ int sx = buffered_spriteram[offs+4] & 0x01ff;
+ int sy = (INT16)buffered_spriteram[offs+6] & 0x01ff;
+ if (sy & 0x0100) sy |= ~(int)0x01ff; // Correctly sign-extend 9-bit number
+ if (flip)
+ {
+ sx = 498 - (16 * width) - sx;
+ sy = 240 - (16 * height) - sy;
+ }
+
+ for (int y = 0; y <= height; y++)
+ {
+ int const _y = sy + (16 * (flip ? (height - y) : y));
+ for (int x = 0; x <= width; x++)
+ {
+ int const _x = sx + (16 * (flip ? (width - x) : x));
+ m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect,
+ code,
+ color,
+ flip, flip,
+ _x, _y,
+ screen.priority(),
+ pri, 15);
+ code++;
+ }
+ }
+ }
+ }
+}
+
+UINT32 dooyong_68k_state::screen_update_rshark(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bitmap.fill(m_palette->black_pen(), cliprect);
+ screen.priority().fill(0, cliprect);
+
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
+ m_bg2_tilemap->draw(screen, bitmap, cliprect, 0, (m_bg2_priority ? 2 : 1));
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
+ m_fg2_tilemap->draw(screen, bitmap, cliprect, 0, 2);
+
+ draw_sprites(screen, bitmap, cliprect);
+
+ return 0;
+}
+
+UINT32 dooyong_68k_state::screen_update_popbingo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bitmap.fill(m_palette->black_pen(), cliprect);
+ screen.priority().fill(0, cliprect);
+
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
+
+ draw_sprites(screen, bitmap, cliprect);
+
+ return 0;
+}
+
+
+VIDEO_START_MEMBER(dooyong_68k_state, rshark)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx5")->base();
@@ -857,13 +807,13 @@ VIDEO_START_MEMBER(dooyong_state,rshark)
m_fg2_gfx = 1;
/* Create tilemaps */
- m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS,
+ m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_bg_tile_info),this), TILEMAP_SCAN_COLS,
16, 16, 64, 32);
- m_bg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg2_tile_info),this), TILEMAP_SCAN_COLS,
+ m_bg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_bg2_tile_info),this), TILEMAP_SCAN_COLS,
16, 16, 64, 32);
- m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS,
+ m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_fg_tile_info),this), TILEMAP_SCAN_COLS,
16, 16, 64, 32);
- m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg2_tile_info),this), TILEMAP_SCAN_COLS,
+ m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_fg2_tile_info),this), TILEMAP_SCAN_COLS,
16, 16, 64, 32);
/* Configure tilemap transparency */
@@ -881,10 +831,10 @@ VIDEO_START_MEMBER(dooyong_state,rshark)
save_item(NAME(m_bg2scroll8));
save_item(NAME(m_fgscroll8));
save_item(NAME(m_fg2scroll8));
- save_item(NAME(m_rshark_pri));
+ save_item(NAME(m_bg2_priority));
}
-VIDEO_START_MEMBER(dooyong_state,popbingo)
+VIDEO_START_MEMBER(dooyong_68k_state, popbingo)
{
/* Configure tilemap callbacks */
m_bg_tilerom = memregion("gfx2")->base();
@@ -905,5 +855,5 @@ VIDEO_START_MEMBER(dooyong_state,popbingo)
save_item(NAME(m_bg2scroll8)); // Not used atm
save_item(NAME(m_fgscroll8)); // Not used atm
save_item(NAME(m_fg2scroll8)); // Not used atm
- save_item(NAME(m_rshark_pri));
+ save_item(NAME(m_bg2_priority));
}