diff options
Diffstat (limited to 'src/mame/video/leland.cpp')
-rw-r--r-- | src/mame/video/leland.cpp | 212 |
1 files changed, 97 insertions, 115 deletions
diff --git a/src/mame/video/leland.cpp b/src/mame/video/leland.cpp index 33f0d3590bd..5fe938c4590 100644 --- a/src/mame/video/leland.cpp +++ b/src/mame/video/leland.cpp @@ -14,16 +14,13 @@ /* constants */ -#define VRAM_SIZE (0x10000) -#define QRAM_SIZE (0x10000) - -#define VIDEO_WIDTH (320) +static constexpr int VRAM_SIZE = 0x10000; +static constexpr int QRAM_SIZE = 0x10000; /* debugging */ #define LOG_COMM 0 - /************************************* * * Scanline callback @@ -36,10 +33,10 @@ TIMER_CALLBACK_MEMBER(leland_state::scanline_callback) /* update the DACs */ if (!(m_dac_control & 0x01)) - m_dac0->write(m_video_ram[(m_last_scanline) * 256 + 160]); + m_dac[0]->write(m_video_ram[(m_last_scanline) * 256 + 160]); if (!(m_dac_control & 0x02)) - m_dac1->write(m_video_ram[(m_last_scanline) * 256 + 161]); + m_dac[1]->write(m_video_ram[(m_last_scanline) * 256 + 161]); m_last_scanline = scanline; @@ -52,12 +49,55 @@ TIMER_CALLBACK_MEMBER(leland_state::scanline_callback) /************************************* * + * ROM-based tilemap + * + *************************************/ + +TILEMAP_MAPPER_MEMBER(leland_state::leland_scan) +{ + /* logical (col,row) -> memory offset */ + return (col & 0xff) | ((row & 0x1f) << 8) | ((row & 0xe0) << 9); +} + +TILE_GET_INFO_MEMBER(leland_state::leland_get_tile_info) +{ + int char_bank = ((m_gfxbank >> 4) & 0x03) << 10; + int prom_bank = ((m_gfxbank >> 3) & 0x01) << 13; + int tile = m_bg_prom[prom_bank | tile_index] | ((tile_index >> 7) & 0x300) | char_bank; + SET_TILE_INFO_MEMBER(0, tile, m_bg_prom[prom_bank | tile_index] >> 5, 0); +} + + +/************************************* + * + * RAM-based tilemap + * + *************************************/ + +TILEMAP_MAPPER_MEMBER(leland_state::ataxx_scan) +{ + /* logical (col,row) -> memory offset */ + return (col & 0xff) | ((row & 0x3f) << 8) | ((row & 0x40) << 9); +} + +TILE_GET_INFO_MEMBER(leland_state::ataxx_get_tile_info) +{ + uint16_t tile = m_ataxx_qram[tile_index] | ((m_ataxx_qram[0x4000 | tile_index] & 0x7f) << 8); + SET_TILE_INFO_MEMBER(0, tile, 0, 0); +} + + +/************************************* + * * Start video hardware * *************************************/ VIDEO_START_MEMBER(leland_state,leland) { + /* tilemap */ + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(leland_state::leland_get_tile_info),this), tilemap_mapper_delegate(FUNC(leland_state::leland_scan),this), 8, 8, 256, 256); + /* allocate memory */ m_video_ram = make_unique_clear<uint8_t[]>(VRAM_SIZE); @@ -80,6 +120,9 @@ VIDEO_START_MEMBER(leland_state,leland) VIDEO_START_MEMBER(leland_state,ataxx) { + /* tilemap */ + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(leland_state::ataxx_get_tile_info),this), tilemap_mapper_delegate(FUNC(leland_state::ataxx_scan),this), 8, 8, 256, 128); + /* first do the standard stuff */ m_video_ram = make_unique_clear<uint8_t[]>(VRAM_SIZE); @@ -98,7 +141,6 @@ VIDEO_START_MEMBER(leland_state,ataxx) } - /************************************* * * Scrolling and banking @@ -142,11 +184,14 @@ WRITE8_MEMBER(leland_state::leland_gfx_port_w) if (scanline > 0) m_screen->update_partial(scanline - 1); - m_gfxbank = data; + if (m_gfxbank != data) + { + m_gfxbank = data; + m_tilemap->mark_all_dirty(); + } } - /************************************* * * Video address setting @@ -164,7 +209,6 @@ void leland_state::leland_video_addr_w(address_space &space, int offset, int dat } - /************************************* * * Common video RAM read @@ -211,7 +255,6 @@ int leland_state::leland_vram_port_r(address_space &space, int offset, int num) } - /************************************* * * Common video RAM write @@ -294,7 +337,6 @@ void leland_state::leland_vram_port_w(address_space &space, int offset, int data } - /************************************* * * Master video RAM read/write @@ -330,7 +372,6 @@ READ8_MEMBER(leland_state::leland_mvram_port_r) } - /************************************* * * Slave video RAM read/write @@ -355,7 +396,6 @@ READ8_MEMBER(leland_state::leland_svram_port_r) } - /************************************* * * Ataxx master video RAM read/write @@ -376,7 +416,6 @@ WRITE8_MEMBER(leland_state::ataxx_svram_port_w) } - /************************************* * * Ataxx slave video RAM read/write @@ -397,63 +436,40 @@ READ8_MEMBER(leland_state::ataxx_svram_port_r) } - /************************************* * - * ROM-based refresh routine + * Refresh routine * *************************************/ -uint32_t leland_state::screen_update_leland(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t leland_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - const uint8_t *bg_prom = memregion("user1")->base(); - const uint8_t *bg_gfx = memregion("gfx1")->base(); - offs_t bg_gfx_bank_page_size = memregion("gfx1")->bytes() / 3; - offs_t char_bank = (((m_gfxbank >> 4) & 0x03) * 0x2000) & (bg_gfx_bank_page_size - 1); - offs_t prom_bank = ((m_gfxbank >> 3) & 0x01) * 0x2000; + bitmap_ind16 &src = m_tilemap->pixmap(); + int height_mask = m_tilemap->height()-1; /* for each scanline in the visible region */ for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - uint8_t fg_data = 0; - uint16_t *dst = &bitmap.pix16(y); uint8_t *fg_src = &m_video_ram[y << 8]; /* for each pixel on the scanline */ - for (int x = 0; x < VIDEO_WIDTH; x++) + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { /* compute the effective scrolled pixel coordinates */ uint16_t sx = (x + m_xscroll) & 0x07ff; - uint16_t sy = (y + m_yscroll) & 0x07ff; - - /* get the byte address this background pixel comes from */ - offs_t bg_prom_offs = (sx >> 3) | - ((sy << 5) & 0x01f00) | - prom_bank | - ((sy << 6) & 0x1c000); - - offs_t bg_gfx_offs = (sy & 0x07) | - (bg_prom[bg_prom_offs] << 3) | - ((sy << 2) & 0x1800) | - char_bank; + uint16_t sy = (y + m_yscroll) & height_mask; /* build the pen, background is d0-d5 */ - pen_t pen = (((bg_gfx[bg_gfx_offs + (2 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 7) | /* d0 */ - (((bg_gfx[bg_gfx_offs + (1 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 6) | /* d1 */ - (((bg_gfx[bg_gfx_offs + (0 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 5) | /* d2 */ - ((bg_prom[bg_prom_offs] & 0xe0) >> 2); /* d3-d5 */ + pen_t pen = src.pix16(sy,sx) & 0x3f; /* foreground is d6-d9 */ if (x & 0x01) - pen = pen | ((fg_data & 0x0f) << 6); + pen = pen | ((fg_src[x >> 1] & 0x0f) << 6); else - { - fg_data = *fg_src++; - pen = pen | ((fg_data & 0xf0) << 2); - } + pen = pen | ((fg_src[x >> 1] & 0xf0) << 2); - *dst++ = pen; + dst[x] = pen; } } @@ -461,79 +477,47 @@ uint32_t leland_state::screen_update_leland(screen_device &screen, bitmap_ind16 } - /************************************* * - * RAM-based refresh routine + * Machine drivers * *************************************/ -uint32_t leland_state::screen_update_ataxx(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +static const gfx_layout leland_layout = { - const uint8_t *bg_gfx = memregion("gfx1")->base(); - offs_t bg_gfx_bank_page_size = memregion("gfx1")->bytes() / 6; - offs_t bg_gfx_offs_mask = bg_gfx_bank_page_size - 1; - - /* for each scanline in the visible region */ - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) - { - uint8_t fg_data = 0; - - uint16_t *dst = &bitmap.pix16(y); - uint8_t *fg_src = &m_video_ram[y << 8]; - - /* for each pixel on the scanline */ - for (int x = 0; x < VIDEO_WIDTH; x++) - { - /* compute the effective scrolled pixel coordinates */ - uint16_t sx = (x + m_xscroll) & 0x07ff; - uint16_t sy = (y + m_yscroll) & 0x07ff; - - /* get the byte address this background pixel comes from */ - offs_t qram_offs = (sx >> 3) | - ((sy << 5) & 0x3f00) | - ((sy << 6) & 0x8000); - - offs_t bg_gfx_offs = ((sy & 0x07) | - (m_ataxx_qram[qram_offs] << 3) | - ((m_ataxx_qram[0x4000 | qram_offs] & 0x7f) << 11)) & bg_gfx_offs_mask; - - /* build the pen, background is d0-d5 */ - pen_t pen = (((bg_gfx[bg_gfx_offs + (0 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 7) | /* d0 */ - (((bg_gfx[bg_gfx_offs + (1 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 6) | /* d1 */ - (((bg_gfx[bg_gfx_offs + (2 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 5) | /* d2 */ - (((bg_gfx[bg_gfx_offs + (3 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 4) | /* d3 */ - (((bg_gfx[bg_gfx_offs + (4 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 3) | /* d4 */ - (((bg_gfx[bg_gfx_offs + (5 * bg_gfx_bank_page_size)] << (sx & 0x07)) & 0x80) >> 2); /* d5 */ - - /* foreground is d6-d9 */ - if (x & 0x01) - pen = pen | ((fg_data & 0x0f) << 6); - else - { - fg_data = *fg_src++; - pen = pen | ((fg_data & 0xf0) << 2); - } - - *dst++ = pen; - } - } - - return 0; -} - - - -/************************************* - * - * Machine drivers - * - *************************************/ + 8,8, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, + { STEP8(0,1) }, + { STEP8(0,8) }, + 8*8 +}; + +static const gfx_layout ataxx_layout = +{ + 8,8, + RGN_FRAC(1,6), + 6, + { RGN_FRAC(5,6), RGN_FRAC(4,6), RGN_FRAC(3,6), RGN_FRAC(2,6), RGN_FRAC(1,6), RGN_FRAC(0,6) }, + { STEP8(0,1) }, + { STEP8(0,8) }, + 8*8 +}; + +static GFXDECODE_START( gfx_leland ) + GFXDECODE_ENTRY( "bg_gfx", 0, leland_layout, 0, 8*16) // *16 is foreground +GFXDECODE_END + +static GFXDECODE_START( gfx_ataxx ) + GFXDECODE_ENTRY( "bg_gfx", 0, ataxx_layout, 0, 16) // 16 is foreground +GFXDECODE_END MACHINE_CONFIG_START(leland_state::leland_video) MCFG_VIDEO_START_OVERRIDE(leland_state,leland) + MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_leland) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(BBGGGRRR) @@ -542,7 +526,7 @@ MACHINE_CONFIG_START(leland_state::leland_video) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE_DRIVER(leland_state, screen_update_leland) + MCFG_SCREEN_UPDATE_DRIVER(leland_state, screen_update) MCFG_SCREEN_PALETTE("palette") MACHINE_CONFIG_END @@ -550,9 +534,7 @@ MACHINE_CONFIG_START(leland_state::ataxx_video) leland_video(config); MCFG_VIDEO_START_OVERRIDE(leland_state,ataxx) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE_DRIVER(leland_state, screen_update_ataxx) - + MCFG_DEVICE_REPLACE("gfxdecode", GFXDECODE, "palette", gfx_ataxx) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_FORMAT(xxxxRRRRGGGGBBBB) MACHINE_CONFIG_END |