// license:BSD-3-Clause // copyright-holders:David Haywood, Roberto Fresca, Vas Crabb /*************************************************************************** video.c Functions to emulate the video hardware of the machine. ***************************************************************************/ #include "emu.h" #include "includes/goldstar.h" /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ WRITE8_MEMBER(goldstar_state::goldstar_fg_vidram_w) { m_fg_vidram[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(goldstar_state::goldstar_fg_atrram_w) { m_fg_atrram[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(goldstar_state::get_goldstar_fg_tile_info) { int const code = m_fg_vidram[tile_index]; int const attr = m_fg_atrram[tile_index]; SET_TILE_INFO_MEMBER(0, code | (attr & 0xf0) << 4, attr & 0x0f, 0); } // colour / high tile bits are swapped around TILE_GET_INFO_MEMBER(goldstar_state::get_cherrym_fg_tile_info) { int const code = m_fg_vidram[tile_index]; int const attr = m_fg_atrram[tile_index]; SET_TILE_INFO_MEMBER(0, code | (attr & 0x0f) << 8, (attr & 0xf0) >> 4, 0); } WRITE8_MEMBER(goldstar_state::goldstar_reel1_ram_w) { m_reel1_ram[offset] = data; m_reel1_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(goldstar_state::get_goldstar_reel1_tile_info) { SET_TILE_INFO_MEMBER(1, m_reel1_ram[tile_index], m_bgcolor, 0); } WRITE8_MEMBER(goldstar_state::goldstar_reel2_ram_w) { m_reel2_ram[offset] = data; m_reel2_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(goldstar_state::get_goldstar_reel2_tile_info) { SET_TILE_INFO_MEMBER(1, m_reel2_ram[tile_index], m_bgcolor, 0); } WRITE8_MEMBER(goldstar_state::goldstar_reel3_ram_w) { m_reel3_ram[offset] = data; m_reel3_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(goldstar_state::get_goldstar_reel3_tile_info) { SET_TILE_INFO_MEMBER(1, m_reel3_ram[tile_index], m_bgcolor, 0); } VIDEO_START_MEMBER(goldstar_state, goldstar) { m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel2_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel3_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(64); m_reel2_tilemap->set_scroll_cols(64); m_reel3_tilemap->set_scroll_cols(64); m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64, 32); m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? m_cm_enable_reg = 0x0b; } VIDEO_START_MEMBER(goldstar_state, cherrym) { m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel2_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_goldstar_reel3_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(64); m_reel2_tilemap->set_scroll_cols(64); m_reel3_tilemap->set_scroll_cols(64); m_cmaster_girl_num = 0; m_cmaster_girl_pal = 0; m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goldstar_state::get_cherrym_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64, 32); m_fg_tilemap->set_transparent_pen(0); m_cm_enable_reg = 0x0b; } WRITE8_MEMBER(goldstar_state::goldstar_fa00_w) { /* bit 1 toggles continuously - might be irq enable or watchdog reset */ /* bit 2 selects background gfx color (I think) */ m_bgcolor = (data & 0x04) >> 2; m_reel1_tilemap->mark_all_dirty(); m_reel2_tilemap->mark_all_dirty(); m_reel3_tilemap->mark_all_dirty(); } uint32_t goldstar_state::screen_update_goldstar(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { for (int i = 0; i < 64; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i]); } // are these hardcoded, or registers? const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); const rectangle visible2(0*8, (14+48)*8-1, 12*8, (12+7)*8-1); const rectangle visible3(0*8, (14+48)*8-1, 20*8, (20+7)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } if (m_cm_enable_reg & 0x04) { if (memregion("user1")->base()) { gfx_element *gfx = m_gfxdecode->gfx(2); int const girlyscroll = (int8_t)((m_cm_girl_scroll & 0xf0)); int const girlxscroll = (int8_t)((m_cm_girl_scroll & 0x0f) << 4); gfx->zoom_transpen(bitmap,cliprect,m_cmaster_girl_num,m_cmaster_girl_pal,0,0,-(girlxscroll*2),-(girlyscroll), 0x20000, 0x10000,0); } } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } uint32_t goldstar_state::screen_update_cmast91(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { for (int i = 0; i < 64; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i]); } const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); /* same start for reel1 */ const rectangle visible2(0*8, (14+48)*8-1, 11*8, (12+7)*8-1); /* 4 pixels less for reel2 */ const rectangle visible3(0*8, (14+48)*8-1, 19*8, (19+7)*8-1); /* 8 pixels less for reel3 */ m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } WRITE8_MEMBER(cmaster_state::outport0_w) { m_cm_enable_reg = data; /* ---- ---x (global enable or irq enable?) ---- --x- (fg enable) ---- -x-- (girl enable?) ---- x--- (reels enable) xxxx ---- unused? */ //popmessage("%02x",data); } WRITE8_MEMBER(cmaster_state::girl_scroll_w) { m_cm_girl_scroll = data; /* xxxx ---- yscroll ---- xxxx xscroll this isn't very fine scrolling, but i see no other registers. 1000 1000 is the center of the screen. */ } WRITE8_MEMBER(cmaster_state::background_col_w) { //printf("cm_background_col_w %02x\n",data); /* cherry master writes so it's probably 0ggg cc00 where g is which girl to display and c is the colour palette (note, this doesn't apply to the amcoe games which have no girls, I'm unsure how the priority/positioning works) */ m_cmaster_girl_num = (data >> 4) & 0x7; m_cmaster_girl_pal = (data >> 2) & 0x3; //bgcolor = (data & 0x03) >> 0; // apparently some boards have this colour scheme? // i'm not convinced it isn't just a different prom on them #if 0 m_bgcolor = 0; m_bgcolor |= (data & 0x01) << 1; m_bgcolor |= (data & 0x02) >> 1; #else m_bgcolor = (data & 0x03) >> 0; #endif m_reel1_tilemap->mark_all_dirty(); m_reel2_tilemap->mark_all_dirty(); m_reel3_tilemap->mark_all_dirty(); } uint32_t cmaster_state::screen_update_amcoe1a(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { for (int i= 0;i < 64;i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i]); } rectangle const visible1(0*8, (14+48)*8-1, 4*8, (4+6)*8-1); rectangle const visible2(0*8, (14+48)*8-1, 10*8, (10+6)*8-1); rectangle const visible3(0*8, (14+48)*8-1, 16*8, (16+6)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } if (m_cm_enable_reg & 0x04) { // no girls } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } TILE_GET_INFO_MEMBER(wingco_state::get_magical_fg_tile_info) { int const code = m_fg_vidram[tile_index]; int const attr = m_fg_atrram[tile_index]; SET_TILE_INFO_MEMBER(0, (code | (attr & 0xf0)<<4) + (m_tile_bank * 0x1000), attr & 0x0f, 0); } VIDEO_START_MEMBER(wingco_state, bingowng) { m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_goldstar_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(64); m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_goldstar_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64, 32); m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? m_cm_enable_reg = 0x0b; } VIDEO_START_MEMBER(wingco_state, magical) { m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_goldstar_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_goldstar_reel2_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_goldstar_reel3_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(32); m_reel2_tilemap->set_scroll_cols(32); m_reel3_tilemap->set_scroll_cols(32); m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wingco_state::get_magical_fg_tile_info)),TILEMAP_SCAN_ROWS, 8,8, 64,32); m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? m_cm_enable_reg = 0x0b; } uint32_t wingco_state::screen_update_bingowng(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { for (int i = 0; i < 64; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); } rectangle const visible1(0*8, (14+48)*8-1, 3*8, (4+7)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); } if (m_cm_enable_reg & 0x04) { if (memregion("user1")->base()) { gfx_element *gfx = m_gfxdecode->gfx(2); int const girlyscroll = (int8_t)((m_cm_girl_scroll & 0xf0)); int const girlxscroll = (int8_t)((m_cm_girl_scroll & 0x0f)<<4); gfx->zoom_transpen(bitmap,cliprect,m_cmaster_girl_num,m_cmaster_girl_pal,0,0,-(girlxscroll*2),-(girlyscroll), 0x20000, 0x10000,0); } } if (m_cm_enable_reg & 0x02) { m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); } return 0; } uint32_t wingco_state::screen_update_magical(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { // guess, could be wrong, but different screens clearly need different reel layouts if (m_vidreg & 2) { for (int i = 0; i < 32; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i*2]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i*2]); // m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i*2]); } rectangle const visible1alt(0*8, (16+48)*8-1, 4*8, 16*8-1); rectangle const visible2alt(0*8, (16+48)*8-1, 16*8, 28*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1alt, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2alt, 0, 0); //m_reel3_tilemap->draw(screen, bitmap, &magical_visible3, 0, 0); } else { for (int i = 0; i < 32; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i*2]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i*2]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i*2]); } rectangle const visible1(0*8, (14+48)*8-1, 4*8, (4+8)*8-1); rectangle const visible2(0*8, (14+48)*8-1, 12*8, (12+8)*8-1); rectangle const visible3(0*8, (14+48)*8-1, 20*8, (20+8)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } uint32_t wingco_state::screen_update_mbstar(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { for (int i = 0; i < 64; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i]); } // are these hardcoded, or registers? //const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); const rectangle visible2(0*8, (14+48)*8-1, 14*8, 32*8-1); // seems to be the one used... //const rectangle visible3(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); // m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); // m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } WRITE8_MEMBER(sanghopm_state::fg_vidram_w) { m_fg_vidram[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::fg_atrram_w) { m_fg_atrram[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::bg_vidram_w) { m_bg_vidram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::bg_atrram_w) { m_bg_atrram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::reel1_attrram_w) { m_reel1_attrram[offset] = data; m_reel1_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::reel2_attrram_w) { m_reel2_attrram[offset] = data; m_reel2_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(sanghopm_state::reel3_attrram_w) { m_reel3_attrram[offset] = data; m_reel3_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(sanghopm_state::get_fg_tile_info) { int const code = m_fg_vidram[tile_index]; int const attr = m_fg_atrram[tile_index]; SET_TILE_INFO_MEMBER(0, code | (attr & 0x0f)<<8, (attr & 0x70) >> 4, 0); } TILE_GET_INFO_MEMBER(sanghopm_state::get_bg_tile_info) { int const code = m_bg_vidram[tile_index]; int const attr = m_bg_atrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0x70) >> 4, 0); } TILE_GET_INFO_MEMBER(sanghopm_state::get_reel1_tile_info) { int const code = m_reel1_ram[tile_index]; int const attr = m_reel1_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0x70) >> 4, 0); } TILE_GET_INFO_MEMBER(sanghopm_state::get_reel2_tile_info) { int const code = m_reel2_ram[tile_index]; int const attr = m_reel2_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0x70)>>4, 0); } TILE_GET_INFO_MEMBER(sanghopm_state::get_reel3_tile_info) { int const code = m_reel3_ram[tile_index]; int const attr = m_reel3_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0x70)>>4, 0); } VIDEO_START_MEMBER(sanghopm_state, sangho) { m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sanghopm_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8); m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sanghopm_state::get_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sanghopm_state::get_reel2_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sanghopm_state::get_reel3_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(64); m_reel2_tilemap->set_scroll_cols(64); m_reel3_tilemap->set_scroll_cols(64); m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sanghopm_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_fg_tilemap->set_transparent_pen(0); } uint32_t sanghopm_state::screen_update_sangho(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); m_bg_tilemap->set_scrolly(0, -16); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); /* enable reels (render all the five layers) */ if (!(m_enable_reg & 0x01)) { for (int i = 0; i < 64;i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i]); } // are these hardcoded, or registers? rectangle const visible1(0*8, (15+48)*8-1, 4*8, (4+7)*8-1); rectangle const visible2(0*8, (15+48)*8-1, 12*8, (12+7)*8-1); rectangle const visible3(0*8, (15+48)*8-1, 20*8, (20+7)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } WRITE8_MEMBER(unkch_state::reel1_attrram_w) { m_reel1_attrram[offset] = data; m_reel1_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(unkch_state::reel2_attrram_w) { m_reel2_attrram[offset] = data; m_reel2_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(unkch_state::reel3_attrram_w) { m_reel3_attrram[offset] = data; m_reel3_tilemap->mark_tile_dirty(offset); } TILE_GET_INFO_MEMBER(unkch_state::get_reel1_tile_info) { int const code = m_reel1_ram[tile_index]; int const attr = m_reel1_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0xf0) >> 4, 0); } TILE_GET_INFO_MEMBER(unkch_state::get_reel2_tile_info) { int const code = m_reel2_ram[tile_index]; int const attr = m_reel2_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0xf0) >> 4, 0); } TILE_GET_INFO_MEMBER(unkch_state::get_reel3_tile_info) { int const code = m_reel3_ram[tile_index]; int const attr = m_reel3_attrram[tile_index]; SET_TILE_INFO_MEMBER(1, code | (attr & 0x0f)<<8, (attr & 0xf0) >> 4, 0); } VIDEO_START_MEMBER(unkch_state, unkch) { m_reel1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unkch_state::get_reel1_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unkch_state::get_reel2_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unkch_state::get_reel3_tile_info)), TILEMAP_SCAN_ROWS, 8,32, 64, 8); m_reel1_tilemap->set_scroll_cols(32); m_reel2_tilemap->set_scroll_cols(32); m_reel3_tilemap->set_scroll_cols(32); m_cmaster_girl_num = 0; m_cmaster_girl_pal = 0; m_vidreg = 0x00; m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unkch_state::get_cherrym_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64, 32); m_fg_tilemap->set_transparent_pen(0); m_cm_enable_reg = 0x0b; } uint32_t unkch_state::screen_update_unkch(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(rgb_t::black(), cliprect); if (!(m_cm_enable_reg & 0x01)) return 0; if (m_cm_enable_reg & 0x08) { // guess, this could be something else completely!! // only draw the first 'reels' tilemap, but fullscreen, using alt registers? (or no scrolling at all? - doubtful, see girl) if (m_vidreg & 0x40) { for (int i = 0; i < 32; i++) { m_reel1_tilemap->set_scrolly(i, -0x08/*m_reel1_scroll[(i*2)+1]*/); // m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[(i*2)+1]); // m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[(i*2)+1]); } m_reel1_tilemap->draw(screen, bitmap, cliprect, 0, 0); } // or draw the reels normally? else { for (int i= 0; i < 32; i++) { m_reel1_tilemap->set_scrolly(i, m_reel1_scroll[i*2]); m_reel2_tilemap->set_scrolly(i, m_reel2_scroll[i*2]); m_reel3_tilemap->set_scrolly(i, m_reel3_scroll[i*2]); } const rectangle visible1(0*8, (14+48)*8-1, 3*8, (3+7)*8-1); const rectangle visible2(0*8, (14+48)*8-1, 10*8, (10+7)*8-1); const rectangle visible3(0*8, (14+48)*8-1, 17*8, (17+7)*8-1); m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0); } } if (m_cm_enable_reg & 0x02) m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; }