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