void tc0080vco_device::device_start() { /* Is this endian-correct ??? */ #define XOR(a) WORD_XOR_BE(a) gfx_layout tilelayout = { 16,16, /* 16x16 pixels */ 0, 4, { STEP4(0,1) }, { STEP16(15*4, -4) }, { STEP16(0, 16*4) }, 16*16*4 }; tilelayout.total = m_gfx_region->bytes() / ((16*16*4) / 8); static const gfx_layout charlayout = { 8, 8, /* 8x8 pixels */ 256, /* 256 chars */ 3, /* 3 bits per pixel */ { 0x10000*8 + XOR(2)*4, XOR(0)*4, XOR(2)*4 }, { STEP8(0,1) }, { STEP8(0,8*2) }, 16*8 }; m_tilemap[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(tc0080vco_device::get_bg0_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); m_tilemap[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(tc0080vco_device::get_bg1_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); m_tilemap[0]->set_transparent_pen(0); m_tilemap[1]->set_transparent_pen(0); m_tilemap[0]->set_scrolldx(m_bg_xoffs, 512); m_tilemap[1]->set_scrolldx(m_bg_xoffs, 512); m_tilemap[0]->set_scrolldy(m_bg_yoffs, m_bg_flip_yoffs); m_tilemap[1]->set_scrolldy(m_bg_yoffs, m_bg_flip_yoffs); /* bg0 tilemap scrollable per pixel row */ m_tilemap[0]->set_scroll_rows(512); /* Perform extra initialisations for text layer */ m_tilemap[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(tc0080vco_device::get_tx_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); m_tilemap[2]->set_scrolldx(0, 0); m_tilemap[2]->set_scrolldy(48, -448); m_tilemap[2]->set_transparent_pen(0); m_ram = make_unique_clear<u16[]>(TC0080VCO_RAM_SIZE / 2); m_char_ram = m_ram.get() + 0x00000 / 2; /* continues at +0x10000 */ m_tx_ram_0 = m_ram.get() + 0x01000 / 2; m_chain_ram_0 = m_ram.get() + 0x00000 / 2; /* only used from +0x2000 */ m_bg0_ram_0 = m_ram.get() + 0x0c000 / 2; m_bg1_ram_0 = m_ram.get() + 0x0e000 / 2; m_tx_ram_1 = m_ram.get() + 0x11000 / 2; m_chain_ram_1 = m_ram.get() + 0x10000 / 2; /* only used from +0x12000 */ m_bg0_ram_1 = m_ram.get() + 0x1c000 / 2; m_bg1_ram_1 = m_ram.get() + 0x1e000 / 2; m_bgscroll_ram = m_ram.get() + 0x20000 / 2; m_spriteram = m_ram.get() + 0x20400 / 2; m_scroll_ram = m_ram.get() + 0x20800 / 2; /* create the char set (gfx will then be updated dynamically from RAM) */ set_gfx(0, std::make_unique<gfx_element>(&palette(), tilelayout, m_gfx_region->base(), 0, 0x20, m_colbase)); set_gfx(1, std::make_unique<gfx_element>(&palette(), charlayout, (u8 *)m_char_ram, 0, 0x01, m_colbase + 512)); save_pointer(NAME(m_ram), TC0080VCO_RAM_SIZE / 2); }
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire")// Fire (normal or laser) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Missile")// Missile PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Cutter")// Cutter PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END static const gfx_layout flower_charlayout = { 8,8, RGN_FRAC(1,1), 2, { 0, 4 }, { STEP4(0,1), STEP4(8,1) }, { STEP8(0,16) }, 8*8*2 }; static const gfx_layout flower_tilelayout = { 16,16, RGN_FRAC(1,2), 4, { 0, 4, RGN_FRAC(1,2), RGN_FRAC(1,2)+4 }, { STEP4(0,1), STEP4(8,1), STEP4(8*8*2,1), STEP4(8*8*2+8,1) }, { STEP8(0,16), STEP8(8*8*4,16) }, 16*16*2 };
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" ) INPUT_PORTS_END /* 16x16x4 tiles (made of four 8x8 tiles) */ static const gfx_layout layout_16x16x4_2 = { 16,16, RGN_FRAC(1,1), 4, { STEP4(0,1) }, { STEP4(8*8*4*0 + 3*4, -4), STEP4(8*8*4*0 + 7*4, -4), STEP4(8*8*4*1 + 3*4, -4), STEP4(8*8*4*1 + 7*4, -4) }, { STEP8(8*8*4*0, 8*4), STEP8(8*8*4*2, 8*4) }, 16*16*4 }; static const gfx_layout layout_16x16x4 = { 16,16, RGN_FRAC(1,1), 4, { STEP4(0,1) }, { STEP8(8*8*4*0,4), STEP8(8*8*4*1,4) }, { STEP8(8*8*4*0,8*4), STEP8(8*8*4*2,8*4) }, 16*16*4
DECLARE_WRITE8_MEMBER(vram_w); DECLARE_READ32_MEMBER(cart_r); DECLARE_READ16_MEMBER(sh7021_r); DECLARE_WRITE16_MEMBER(sh7021_w); DECLARE_READ8_MEMBER(bitmap_r); DECLARE_WRITE8_MEMBER(bitmap_w); DECLARE_DEVICE_IMAGE_LOAD_MEMBER(loopy_cart); }; static const gfx_layout casloopy_4bpp_layout = { 8,8, 0x10000/32, 4, { STEP4(0, 1) }, { STEP8(0, 4) }, { STEP8(0, 4*8) }, 4*8*8 }; static const gfx_layout casloopy_8bpp_layout = { 8,8, 0x10000/64, 8, { STEP8(0, 1) }, { STEP8(0, 8) }, { STEP8(0, 8*8) }, 8*8*8 };
8,8, RGN_FRAC(1,2), 2, { RGN_FRAC(0,2), RGN_FRAC(1,2) }, { STEP8(7,-1) }, { STEP8(0,8) }, 8*8 }; static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,1), 2, { 4, 0 }, { STEP4(0*8+3,-1), STEP4(1*8+3,-1), STEP4(2*8+3,-1), STEP4(3*8+3,-1) }, { STEP16(0,32) }, 64*8 }; static GFXDECODE_START( mrdo ) GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) /* colors 0-255 directly mapped */ GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 64 ) GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 4*64, 16 ) GFXDECODE_END static MACHINE_CONFIG_START( mrdo, mrdo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/2) /* Verified */
INPUT_PORTS_END /*************************************************************************** Graphics Layouts ***************************************************************************/ static const gfx_layout layout_8x8x2 = { 8,8, RGN_FRAC(1,2), 2, { 0, 4 }, { STEP4(RGN_FRAC(1,2),1), STEP4(RGN_FRAC(0,2),1) }, { STEP8(0,8) }, 8*8 }; static const gfx_layout layout_16x16x4 = { 16,16, RGN_FRAC(1,4), 4, { RGN_FRAC(0,4),RGN_FRAC(1,4),RGN_FRAC(2,4),RGN_FRAC(3,4) }, { STEP8(8*8*2,1), STEP8(0,1) }, { STEP16(0,8) }, 16*16 };
/************************************* * * Graphics layouts * *************************************/ static const gfx_layout charlayout = { 8,8, RGN_FRAC(1,2), 4, { RGN_FRAC(1,2),RGN_FRAC(1,2)+4, 0,4 }, { STEP4(0,1), STEP4(8,1) }, { STEP8(0,16) }, 8*8*2 }; static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,3), 3, { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, { STEP8(0,1), STEP8(8*8,1) }, { STEP8(0,8), STEP8(8*8*2,8) }, 16*16 };
/************************************* * * Graphics definitions * *************************************/ static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,4), 1, { 0 }, { STEP4(3*0x100*8+4,1), STEP4(2*0x100*8+4,1), STEP4(1*0x100*8+4,1), STEP4(0*0x100*8+4,1) }, { STEP16(0,8) }, 16*8 }; static const gfx_layout goallayout = { 8,32, 1, 4, { 4, 5, 6, 7 }, { STEP8(0,8) }, { STEP8(192*8,8*8),
/** Do inverse transform on 8x4 part of block */ static void vc1_inv_trans_8x4_altivec(uint8_t *dest, int stride, int16_t *block) { vector signed short src0, src1, src2, src3, src4, src5, src6, src7; vector signed int s0, s1, s2, s3, s4, s5, s6, s7; vector signed int s8, s9, sA, sB, sC, sD, sE, sF; vector signed int t0, t1, t2, t3, t4, t5, t6, t7; const vector signed int vec_64 = vec_sl(vec_splat_s32(4), vec_splat_u32(4)); const vector unsigned int vec_7 = vec_splat_u32(7); const vector unsigned int vec_5 = vec_splat_u32(5); const vector unsigned int vec_4 = vec_splat_u32(4); const vector signed int vec_4s = vec_splat_s32(4); const vector unsigned int vec_3 = vec_splat_u32(3); const vector unsigned int vec_2 = vec_splat_u32(2); const vector unsigned int vec_1 = vec_splat_u32(1); vector unsigned char tmp; vector signed short tmp2, tmp3; vector unsigned char perm0, perm1, p0, p1, p; src0 = vec_ld( 0, block); src1 = vec_ld( 16, block); src2 = vec_ld( 32, block); src3 = vec_ld( 48, block); src4 = vec_ld( 64, block); src5 = vec_ld( 80, block); src6 = vec_ld( 96, block); src7 = vec_ld(112, block); TRANSPOSE8(src0, src1, src2, src3, src4, src5, src6, src7); s0 = vec_unpackl(src0); s1 = vec_unpackl(src1); s2 = vec_unpackl(src2); s3 = vec_unpackl(src3); s4 = vec_unpackl(src4); s5 = vec_unpackl(src5); s6 = vec_unpackl(src6); s7 = vec_unpackl(src7); s8 = vec_unpackh(src0); s9 = vec_unpackh(src1); sA = vec_unpackh(src2); sB = vec_unpackh(src3); sC = vec_unpackh(src4); sD = vec_unpackh(src5); sE = vec_unpackh(src6); sF = vec_unpackh(src7); STEP8(s0, s1, s2, s3, s4, s5, s6, s7, vec_4s); SHIFT_HOR8(s0, s1, s2, s3, s4, s5, s6, s7); STEP8(s8, s9, sA, sB, sC, sD, sE, sF, vec_4s); SHIFT_HOR8(s8, s9, sA, sB, sC, sD, sE, sF); src0 = vec_pack(s8, s0); src1 = vec_pack(s9, s1); src2 = vec_pack(sA, s2); src3 = vec_pack(sB, s3); src4 = vec_pack(sC, s4); src5 = vec_pack(sD, s5); src6 = vec_pack(sE, s6); src7 = vec_pack(sF, s7); TRANSPOSE8(src0, src1, src2, src3, src4, src5, src6, src7); s0 = vec_unpackh(src0); s1 = vec_unpackh(src1); s2 = vec_unpackh(src2); s3 = vec_unpackh(src3); s8 = vec_unpackl(src0); s9 = vec_unpackl(src1); sA = vec_unpackl(src2); sB = vec_unpackl(src3); STEP4(s0, s1, s2, s3, vec_64); SHIFT_VERT4(s0, s1, s2, s3); STEP4(s8, s9, sA, sB, vec_64); SHIFT_VERT4(s8, s9, sA, sB); src0 = vec_pack(s0, s8); src1 = vec_pack(s1, s9); src2 = vec_pack(s2, sA); src3 = vec_pack(s3, sB); p0 = vec_lvsl (0, dest); p1 = vec_lvsl (stride, dest); p = vec_splat_u8 (-1); perm0 = vec_mergeh (p, p0); perm1 = vec_mergeh (p, p1); #define ADD(dest,src,perm) \ /* *(uint64_t *)&tmp = *(uint64_t *)dest; */ \ tmp = vec_ld (0, dest); \ tmp2 = (vector signed short)vec_perm (tmp, vec_splat_u8(0), perm); \ tmp3 = vec_adds (tmp2, src); \ tmp = vec_packsu (tmp3, tmp3); \ vec_ste ((vector unsigned int)tmp, 0, (unsigned int *)dest); \ vec_ste ((vector unsigned int)tmp, 4, (unsigned int *)dest); ADD (dest, src0, perm0) dest += stride; ADD (dest, src1, perm1) dest += stride; ADD (dest, src2, perm0) dest += stride; ADD (dest, src3, perm1) }
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL INPUT_PORTS_END static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,2), 4, { 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 }, { STEP4(0*8,1), STEP4(8*8,1), STEP4(16*8,1), STEP4(24*8,1) }, { STEP8(0*8,8), STEP8(32*8,8) }, 64*8 }; static const gfx_layout charlayout = { 8,8, RGN_FRAC(1,1), 2, { 0, 4 }, { STEP4(8*8,1), STEP4(0*8,1) }, { STEP8(0*8,8) }, 16*8 };
PORT_START("TRACKX") PORT_BIT( 0x0fff, 0x0000, IPT_TRACKBALL_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) PORT_PLAYER(1) PORT_START("TRACKY") PORT_BIT( 0x0fff, 0x0000, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) PORT_PLAYER(1) INPUT_PORTS_END /* Graphics Layouts */ static const gfx_layout charlayout = { 8,8, /* 8*8 characters */ RGN_FRAC(1,2), 4, /* 4 bits per pixel */ { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0, 4 }, { STEP4(3,-1), STEP4(11,-1) }, { STEP8(0,16) }, 128 }; static const gfx_layout spritelayout = { 16,16, /* 16*16 tiles */ RGN_FRAC(1,1), 4, /* 4 bits per pixel */ { 8,12,0,4}, { STEP4(3,-1), STEP4(19,-1), STEP4(512+3,-1), STEP4(512+19,-1) }, { STEP16(0,32) }, 1024 };