summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/taito_b.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/taito_b.cpp')
-rw-r--r--src/mame/video/taito_b.cpp332
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());
- }
-}