diff options
Diffstat (limited to 'src/mame/video/dooyong.c')
-rw-r--r-- | src/mame/video/dooyong.c | 542 |
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)); } |