// license:BSD-3-Clause // copyright-holders:Ryan Holtz /************************************************************************* DMA-Blitter Viewer for Midway T-unit, W-unit, and X-unit games. **************************************************************************/ #if DEBUG_MIDTUNIT_BLITTER void midtunit_video_device::device_reset() { m_dma_debug = false; m_doing_debug_dma = false; memset(&m_debug_dma_state, 0, sizeof(dma_state)); m_debug_dma_state.gfxrom = m_gfxrom->base(); m_debug_dma_state.offset = 0; m_debug_dma_state.rowbits = 0; m_debug_dma_state.width = 256; m_debug_dma_state.height = 256; m_debug_dma_state.palette = 0x0100; m_debug_dma_state.color = 0x0001; m_debug_dma_state.yflip = 0; m_debug_dma_state.xpos = 0; m_debug_dma_state.ypos = 0; m_debug_dma_state.preskip = 0; m_debug_dma_state.postskip = 0; m_debug_dma_state.topclip = 0; m_debug_dma_state.botclip = 0xffff; m_debug_dma_state.leftclip = 0; m_debug_dma_state.rightclip = 0xffff; m_debug_dma_state.startskip = 0; m_debug_dma_state.endskip = 0; m_debug_dma_state.xstep = 0x100; m_debug_dma_state.ystep = 0x100; m_debug_dma_bpp = 0; m_debug_dma_mode = 1; m_debug_dma_command = 0; } void midtunit_video_device::device_add_mconfig(machine_config &config) { screen_device &debugscreen(SCREEN(config, "debugscreen", SCREEN_TYPE_RASTER)); debugscreen.set_raw(8000000 * 2, 506, 100, 500, 289, 20, 274); debugscreen.set_screen_update(FUNC(midtunit_video_device::debug_screen_update)); PALETTE(config, m_debug_palette).set_format(palette_device::xRGB_555, 32768); } void midwunit_video_device::device_add_mconfig(machine_config &config) { screen_device &debugscreen(SCREEN(config, "debugscreen", SCREEN_TYPE_RASTER)); debugscreen.set_raw(8000000, 506, 101, 501, 289, 20, 274); debugscreen.set_screen_update(FUNC(midwunit_video_device::debug_screen_update)); PALETTE(config, m_debug_palette).set_format(palette_device::xRGB_555, 32768); } void midtunit_video_device::do_debug_blit() { m_dma_state = m_debug_dma_state; m_debug_dma_command = m_debug_dma_mode * 8 + m_debug_dma_bpp; m_doing_debug_dma = true; memset(&m_debug_videoram[0], 0, 0x100000); ((this)->*(m_dma_draw_noskip_noscale[m_debug_dma_command]))(); m_doing_debug_dma = false; } void midtunit_video_device::do_dma_debug_inputs() { static const char* const mode_strs[0x20] = { "None", "P0", "P1", "P0P1", "C0", "C0", "C0P1", "C0P1", "C1", "P0C1", "C1", "P0C1", "C0C1", "C0C1", "C0C1", "C0C1", "None", "P0F", "P1F", "P0P1F", "C0F", "C0F", "C0P1F", "C0P1F", "C1F", "P0C1F", "C1F", "P0C1F", "C0C1F", "C0C1F", "C0C1F", "C0C1F" }; bool do_blit = false; if (machine().input().code_pressed_once(KEYCODE_M)) { m_dma_debug = !m_dma_debug; if (m_dma_debug) { for (pen_t i = 0; i < 32768; i++) { m_debug_palette->set_pen_color(i, m_palette->pen_color(i)); } do_blit = true; } } else if (machine().input().code_pressed_once(KEYCODE_O)) { m_debug_dma_state.rowbits++; do_blit = true; popmessage("DMA RowBits: %d", m_debug_dma_state.rowbits); } else if (machine().input().code_pressed_once(KEYCODE_U)) { m_debug_dma_state.rowbits--; if (m_debug_dma_state.rowbits < 0) m_debug_dma_state.rowbits = 0; else do_blit = true; popmessage("DMA RowBits: %d", m_debug_dma_state.rowbits); } else if (machine().input().code_pressed_once(KEYCODE_PGDN)) { m_debug_dma_state.offset += 0x10000; do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_PGUP)) { uint32_t old_offset = m_debug_dma_state.offset; m_debug_dma_state.offset -= 0x10000; if (old_offset < m_debug_dma_state.offset) m_debug_dma_state.offset = 0; else do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_END)) { m_debug_dma_state.offset += 0x100; do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_HOME)) { uint32_t old_offset = m_debug_dma_state.offset; m_debug_dma_state.offset -= 0x100; if (old_offset < m_debug_dma_state.offset) m_debug_dma_state.offset = 0; else do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_DEL)) { m_debug_dma_state.offset++; do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_INSERT)) { uint32_t old_offset = m_debug_dma_state.offset; m_debug_dma_state.offset--; if (old_offset < m_debug_dma_state.offset) m_debug_dma_state.offset = 0; else do_blit = true; popmessage("DMA Offset: %08x", m_debug_dma_state.offset); } else if (machine().input().code_pressed_once(KEYCODE_RIGHT)) { m_debug_dma_state.width += machine().input().code_pressed(KEYCODE_LCONTROL) ? 16 : 1; if (m_debug_dma_state.width > 512) m_debug_dma_state.width = 512; else do_blit = true; popmessage("DMA Width: %d", m_debug_dma_state.width); } else if (machine().input().code_pressed_once(KEYCODE_LEFT)) { m_debug_dma_state.width -= machine().input().code_pressed(KEYCODE_LCONTROL) ? 16 : 1; if (m_debug_dma_state.width < 0) m_debug_dma_state.width = 0; else do_blit = true; popmessage("DMA Width: %d", m_debug_dma_state.width); } else if (machine().input().code_pressed_once(KEYCODE_UP)) { m_debug_dma_state.height += machine().input().code_pressed(KEYCODE_LCONTROL) ? 16 : 1; if (m_debug_dma_state.height > 512) m_debug_dma_state.height = 512; else do_blit = true; popmessage("DMA Height: %d", m_debug_dma_state.height); } else if (machine().input().code_pressed_once(KEYCODE_DOWN)) { m_debug_dma_state.height -= machine().input().code_pressed(KEYCODE_LCONTROL) ? 16 : 1; if (m_debug_dma_state.height < 0) m_debug_dma_state.height = 0; else do_blit = true; popmessage("DMA Height: %d", m_debug_dma_state.height); } else if (machine().input().code_pressed_once(KEYCODE_I)) { m_debug_dma_state.palette += 0x0100; do_blit = true; popmessage("DMA Palette: %04x", m_debug_dma_state.palette); } else if (machine().input().code_pressed_once(KEYCODE_K)) { m_debug_dma_state.palette -= 0x0100; do_blit = true; popmessage("DMA Palette: %04x", m_debug_dma_state.palette); } else if (machine().input().code_pressed_once(KEYCODE_L)) { m_debug_dma_state.color++; if (m_debug_dma_state.color == 0x0100) m_debug_dma_state.color = 0; do_blit = true; popmessage("DMA Color: %02x", m_debug_dma_state.color); } else if (machine().input().code_pressed_once(KEYCODE_J)) { m_debug_dma_state.color--; if (m_debug_dma_state.color == 0xffff) m_debug_dma_state.color = 0x00ff; do_blit = true; popmessage("DMA Color: %02x", m_debug_dma_state.color); } else if (machine().input().code_pressed_once(KEYCODE_H)) { m_debug_dma_bpp++; if (m_debug_dma_bpp > 7) m_debug_dma_bpp = 7; else do_blit = true; popmessage("DMA BitsPerPixel: %d", m_debug_dma_bpp ? m_debug_dma_bpp : 8); } else if (machine().input().code_pressed_once(KEYCODE_G)) { m_debug_dma_bpp--; if (m_debug_dma_bpp < 0) m_debug_dma_bpp = 0; else do_blit = true; popmessage("DMA BitsPerPixel: %d", m_debug_dma_bpp ? m_debug_dma_bpp : 8); } else if (machine().input().code_pressed_once(KEYCODE_Y)) { m_debug_dma_mode++; if (m_debug_dma_mode > 0x1f) m_debug_dma_mode = 0x1f; else do_blit = true; popmessage("DMA Mode: %s (%02x)", mode_strs[m_debug_dma_mode], m_debug_dma_mode); } else if (machine().input().code_pressed_once(KEYCODE_T)) { m_debug_dma_mode--; if (m_debug_dma_mode < 0) m_debug_dma_mode = 0; else do_blit = true; popmessage("DMA Mode: %s (%02x)", mode_strs[m_debug_dma_mode], m_debug_dma_mode); } else if (machine().input().code_pressed_once(KEYCODE_F)) { m_debug_dma_state.yflip = 1 - m_debug_dma_state.yflip; do_blit = true; } if (do_blit) do_debug_blit(); } uint32_t midtunit_video_device::debug_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { do_dma_debug_inputs(); const pen_t *pens = m_debug_palette->pens(); for (int y = 0; y <= cliprect.max_y; y++) { uint32_t *dest = &bitmap.pix32(y); uint16_t *src = &m_debug_videoram[y * 512]; for (int x = 0; x < cliprect.max_x; x++) { *dest = pens[*src & 0x7fff]; src++; dest++; } } return 0; } #endif