diff options
Diffstat (limited to 'src/mame/video/taito_b.cpp')
-rw-r--r-- | src/mame/video/taito_b.cpp | 332 |
1 files changed, 9 insertions, 323 deletions
diff --git a/src/mame/video/taito_b.cpp b/src/mame/video/taito_b.cpp index caf0590af34..2383430f83f 100644 --- a/src/mame/video/taito_b.cpp +++ b/src/mame/video/taito_b.cpp @@ -39,50 +39,14 @@ WRITE16_MEMBER(taitob_state::realpunc_video_ctrl_w) VIDEO_START_MEMBER(taitob_state,taitob_core) { - m_framebuffer[0] = std::make_unique<bitmap_ind16>(512, 256); - m_framebuffer[1] = std::make_unique<bitmap_ind16>(512, 256); m_pixel_bitmap = nullptr; /* only hitice needs this */ save_item(NAME(m_pixel_scroll)); - - save_item(NAME(*m_framebuffer[0])); - save_item(NAME(*m_framebuffer[1])); } -VIDEO_START_MEMBER(taitob_state,taitob_color_order0) -{ - /*graphics are shared, only that they use different palette*/ - /*this is the basic layout used in: Nastar, Ashura Blaster, Hit the Ice, Rambo3, Tetris*/ - - /*Note that in both this and color order 1 pixel_color_base/color_granularity is equal to sprites color base. Pure coincidence? */ - - m_b_sp_color_base = 0x40 * 16; /*sprites */ - - /* bg, fg, tx color_base are set in the tc0180vcu interface */ - - VIDEO_START_CALL_MEMBER(taitob_core); -} - -VIDEO_START_MEMBER(taitob_state,taitob_color_order1) -{ - /* this is the reversed layout used in: Crime City, Puzzle Bobble */ - m_b_sp_color_base = 0x80 * 16; - - VIDEO_START_CALL_MEMBER(taitob_core); -} - -VIDEO_START_MEMBER(taitob_state,taitob_color_order2) -{ - /*this is used in: rambo3a, masterw, silentd, selfeena, ryujin */ - m_b_sp_color_base = 0x10 * 16; - - VIDEO_START_CALL_MEMBER(taitob_core); -} - - VIDEO_START_MEMBER(taitob_state,hitice) { - VIDEO_START_CALL_MEMBER(taitob_color_order0); + VIDEO_START_CALL_MEMBER(taitob_core); m_b_fg_color_base = 0x80; /* hitice also uses this for the pixel_bitmap */ @@ -102,267 +66,13 @@ VIDEO_START_MEMBER(taitob_state,realpunc) { m_realpunc_bitmap = std::make_unique<bitmap_ind16>(m_screen->width(), m_screen->height()); - VIDEO_START_CALL_MEMBER(taitob_color_order0); -} - - -READ16_MEMBER(taitob_state::tc0180vcu_framebuffer_word_r) -{ - int sy = offset >> 8; - int sx = 2 * (offset & 0xff); - - return (m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 0) << 8) | m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 1); -} - -WRITE16_MEMBER(taitob_state::tc0180vcu_framebuffer_word_w) -{ - int sy = offset >> 8; - int sx = 2 * (offset & 0xff); - - if (ACCESSING_BITS_8_15) - m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 0) = data >> 8; - if (ACCESSING_BITS_0_7) - m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 1) = data & 0xff; -} - - -void taitob_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) -{ -/* Sprite format: (16 bytes per sprite) - offs: bits: - 0000: 0xxxxxxxxxxxxxxx: tile code - 0x0000 to 0x7fff in qzshowby - 0002: 0000000000xxxxxx: color (0x00 - 0x3f) - x000000000000000: flipy - 0x00000000000000: flipx - 00????????000000: unused ? - 0004: xxxxxx0000000000: doesn't matter - some games (eg nastar) fill this with sign bit, some (eg ashura) do not - 000000xxxxxxxxxx: x-coordinate 10 bits signed (all zero for sprites forming up a big sprite, except for the first one) - 0006: xxxxxx0000000000: doesn't matter - same as x - 000000xxxxxxxxxx: y-coordinate 10 bits signed (same as x) - 0008: xxxxxxxx00000000: sprite x-zoom level - 00000000xxxxxxxx: sprite y-zoom level - 0x00 - non scaled = 100% - 0x80 - scaled to 50% - 0xc0 - scaled to 25% - 0xe0 - scaled to 12.5% - 0xff - scaled to zero pixels size (off) - Sprite zoom is used in Ashura Blaster just in the beginning - where you can see a big choplifter and a japanese title. - This japanese title is a scaled sprite. - It is used in Crime City also at the end of the third level (in the garage) - where there are four columns on the sides of the screen - Heaviest usage is in Rambo 3 - almost every sprite in game is scaled - 000a: xxxxxxxx00000000: x-sprites number (big sprite) decremented by one - 00000000xxxxxxxx: y-sprites number (big sprite) decremented by one - 000c - 000f: unused -*/ - - int x, y, xlatch = 0, ylatch = 0, x_no = 0, y_no = 0, x_num = 0, y_num = 0, big_sprite = 0; - int offs, code, color, flipx, flipy; - uint32_t data, zoomx, zoomy, zx, zy, zoomxlatch = 0, zoomylatch = 0; - - for (offs = (0x1980 - 16) / 2; offs >=0; offs -= 8) - { - code = m_spriteram[offs]; - - color = m_spriteram[offs + 1]; - flipx = color & 0x4000; - flipy = color & 0x8000; -#if 0 - /*check the unknown bits*/ - if (color & 0x3fc0) - { - logerror("sprite color (taitob)=%4x ofs=%4x\n", color, offs); - color = machine().rand() & 0x3f; - } -#endif - color = (color & 0x3f) * 16; - - x = m_spriteram[offs + 2] & 0x3ff; - y = m_spriteram[offs + 3] & 0x3ff; - if (x >= 0x200) x -= 0x400; - if (y >= 0x200) y -= 0x400; - - data = m_spriteram[offs + 5]; - if (data) - { - if (!big_sprite) - { - x_num = (data >> 8) & 0xff; - y_num = (data >> 0) & 0xff; - x_no = 0; - y_no = 0; - xlatch = x; - ylatch = y; - data = m_spriteram[offs + 4]; - zoomxlatch = (data >> 8) & 0xff; - zoomylatch = (data >> 0) & 0xff; - big_sprite = 1; - } - } - - data = m_spriteram[offs + 4]; - zoomx = (data >> 8) & 0xff; - zoomy = (data >> 0) & 0xff; - zx = (0x100 - zoomx) / 16; - zy = (0x100 - zoomy) / 16; - - if (big_sprite) - { - zoomx = zoomxlatch; - zoomy = zoomylatch; - - /* Note: like taito_f2.c, this zoom implementation is wrong, - chopped up into 16x16 sections instead of one sprite. This - is especially visible in rambo3. */ - - x = xlatch + (x_no * (0xff - zoomx) + 15) / 16; - y = ylatch + (y_no * (0xff - zoomy) + 15) / 16; - zx = xlatch + ((x_no + 1) * (0xff - zoomx) + 15) / 16 - x; - zy = ylatch + ((y_no + 1) * (0xff - zoomy) + 15) / 16 - y; - y_no++; - - if (y_no > y_num) - { - y_no = 0; - x_no++; - - if (x_no > x_num) - big_sprite = 0; - } - } - - if ( zoomx || zoomy ) - { - m_gfxdecode->gfx(1)->zoom_transpen_raw(bitmap,cliprect, - code, - color, - flipx,flipy, - x,y, - (zx << 16) / 16,(zy << 16) / 16,0); - } - else - { - m_gfxdecode->gfx(1)->transpen_raw(bitmap,cliprect, - code, - color, - flipx,flipy, - x,y, - 0); - } - } + VIDEO_START_CALL_MEMBER(taitob_core); } -void taitob_state::draw_framebuffer( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) -{ - rectangle myclip = cliprect; - int x, y; - address_space &space = machine().dummy_space(); - uint8_t video_control = m_tc0180vcu->get_videoctrl(space, 0); - uint8_t framebuffer_page = m_tc0180vcu->get_fb_page(space, 0); - -g_profiler.start(PROFILER_USER1); - - priority <<= 4; - - if (video_control & 0x08) - { - if (priority) - { - g_profiler.stop(); - return; - } - - if (video_control & 0x10) /*flip screen*/ - { - /*popmessage("1. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ - for (y = myclip.min_y; y <= myclip.max_y; y++) - { - uint16_t *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); - uint16_t *dst; - - dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); - - for (x = myclip.min_x; x <= myclip.max_x; x++) - { - uint16_t c = *src++; - - if (c != 0) - *dst = m_b_sp_color_base + c; - - dst--; - } - } - } - else - { - for (y = myclip.min_y; y <= myclip.max_y; y++) - { - uint16_t *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); - uint16_t *dst = &bitmap.pix16(y, myclip.min_x); - - for (x = myclip.min_x; x <= myclip.max_x; x++) - { - uint16_t c = *src++; - - if (c != 0) - *dst = m_b_sp_color_base + c; - - dst++; - } - } - } - } - else - { - if (video_control & 0x10) /*flip screen*/ - { - /*popmessage("3. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ - for (y = myclip.min_y ;y <= myclip.max_y; y++) - { - uint16_t *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); - uint16_t *dst; - - dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); - - for (x = myclip.min_x; x <= myclip.max_x; x++) - { - uint16_t c = *src++; - - if (c != 0 && (c & 0x10) == priority) - *dst = m_b_sp_color_base + c; - - dst--; - } - } - } - else - { - for (y = myclip.min_y; y <= myclip.max_y; y++) - { - uint16_t *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); - uint16_t *dst = &bitmap.pix16(y, myclip.min_x); - - for (x = myclip.min_x; x <= myclip.max_x; x++) - { - uint16_t c = *src++; - - if (c != 0 && (c & 0x10) == priority) - *dst = m_b_sp_color_base + c; - - dst++; - } - } - } - } -g_profiler.stop(); -} - uint32_t taitob_state::screen_update_taitob(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - address_space &space = machine().dummy_space(); - uint8_t video_control = m_tc0180vcu->get_videoctrl(space, 0); + uint8_t const video_control = m_tc0180vcu->get_videoctrl(); if ((video_control & 0x20) == 0) { @@ -373,7 +83,7 @@ uint32_t taitob_state::screen_update_taitob(screen_device &screen, bitmap_ind16 /* Draw playfields */ m_tc0180vcu->tilemap_draw(screen, bitmap, cliprect, 0, 1); - draw_framebuffer(bitmap, cliprect, 1); + m_tc0180vcu->draw_framebuffer(bitmap, cliprect, 1); m_tc0180vcu->tilemap_draw(screen, bitmap, cliprect, 1, 0); @@ -388,7 +98,7 @@ uint32_t taitob_state::screen_update_taitob(screen_device &screen, bitmap_ind16 copyscrollbitmap_trans(bitmap, *m_pixel_bitmap, 1, &scrollx, 1, &scrolly, cliprect, m_b_fg_color_base * 16); } - draw_framebuffer(bitmap, cliprect, 0); + m_tc0180vcu->draw_framebuffer(bitmap, cliprect, 0); m_tc0180vcu->tilemap_draw(screen, bitmap, cliprect, 2, 0); @@ -399,9 +109,8 @@ uint32_t taitob_state::screen_update_taitob(screen_device &screen, bitmap_ind16 uint32_t taitob_state::screen_update_realpunc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - address_space &space = machine().dummy_space(); const pen_t *palette = m_palette->pens(); - uint8_t video_control = m_tc0180vcu->get_videoctrl(space, 0); + uint8_t const video_control = m_tc0180vcu->get_videoctrl(); int x, y; /* Video blanked? */ @@ -414,12 +123,12 @@ uint32_t taitob_state::screen_update_realpunc(screen_device &screen, bitmap_rgb3 /* Draw the palettized playfields to an indexed bitmap */ m_tc0180vcu->tilemap_draw(screen, *m_realpunc_bitmap, cliprect, 0, 1); - draw_framebuffer(*m_realpunc_bitmap, cliprect, 1); + m_tc0180vcu->draw_framebuffer(*m_realpunc_bitmap, cliprect, 1); m_tc0180vcu->tilemap_draw(screen, *m_realpunc_bitmap, cliprect, 1, 0); if (m_realpunc_video_ctrl & 0x0001) - draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); + m_tc0180vcu->draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); /* Copy the intermediate bitmap to the output bitmap, applying the palette */ for (y = 0; y <= cliprect.max_y; y++) @@ -464,7 +173,7 @@ uint32_t taitob_state::screen_update_realpunc(screen_device &screen, bitmap_rgb3 m_realpunc_bitmap->fill(0, cliprect); if (!(m_realpunc_video_ctrl & 0x0001)) - draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); + m_tc0180vcu->draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); m_tc0180vcu->tilemap_draw(screen, *m_realpunc_bitmap, cliprect, 2, 0); @@ -481,26 +190,3 @@ uint32_t taitob_state::screen_update_realpunc(screen_device &screen, bitmap_rgb3 return 0; } - - -WRITE_LINE_MEMBER(taitob_state::screen_vblank_taitob) -{ - // rising edge - if (state) - { - address_space &space = machine().dummy_space(); - uint8_t video_control = m_tc0180vcu->get_videoctrl(space, 0); - uint8_t framebuffer_page = m_tc0180vcu->get_fb_page(space, 0); - - if (~video_control & 0x01) - m_framebuffer[framebuffer_page]->fill(0, m_screen->visible_area()); - - if (~video_control & 0x80) - { - framebuffer_page ^= 1; - m_tc0180vcu->set_fb_page(space, 0, framebuffer_page); - } - - draw_sprites(*m_framebuffer[framebuffer_page], m_screen->visible_area()); - } -} |