trunk/src/mame/includes/tail2nos.h
| r30820 | r30821 | |
| 13 | 13 | : driver_device(mconfig, type, tag), |
| 14 | 14 | m_bgvideoram(*this, "bgvideoram"), |
| 15 | 15 | m_spriteram(*this, "spriteram"), |
| 16 | m_zoomram(*this, "k051316"), |
| 16 | 17 | m_maincpu(*this, "maincpu"), |
| 17 | 18 | m_audiocpu(*this, "audiocpu"), |
| 18 | 19 | m_k051316(*this, "k051316"), |
| r30820 | r30821 | |
| 22 | 23 | /* memory pointers */ |
| 23 | 24 | required_shared_ptr<UINT16> m_bgvideoram; |
| 24 | 25 | required_shared_ptr<UINT16> m_spriteram; |
| 25 | | UINT16 * m_zoomdata; |
| 26 | | // UINT16 * m_paletteram; // currently this uses generic palette handling |
| 26 | required_shared_ptr<UINT16> m_zoomram; |
| 27 | 27 | |
| 28 | 28 | /* video-related */ |
| 29 | 29 | tilemap_t *m_bg_tilemap; |
| r30820 | r30821 | |
| 40 | 40 | |
| 41 | 41 | DECLARE_WRITE16_MEMBER(sound_command_w); |
| 42 | 42 | DECLARE_WRITE16_MEMBER(tail2nos_bgvideoram_w); |
| 43 | | DECLARE_READ16_MEMBER(tail2nos_zoomdata_r); |
| 44 | 43 | DECLARE_WRITE16_MEMBER(tail2nos_zoomdata_w); |
| 45 | 44 | DECLARE_WRITE16_MEMBER(tail2nos_gfxbank_w); |
| 46 | 45 | DECLARE_WRITE8_MEMBER(sound_bankswitch_w); |
trunk/src/mame/video/k051316.c
| r30820 | r30821 | |
| 1 | 1 | /* |
| 2 | | Konami 051316 |
| 2 | Konami 051316 PSAC |
| 3 | 3 | ------ |
| 4 | 4 | Manages a 32x32 tilemap (16x16 tiles, 512x512 pixels) which can be zoomed, |
| 5 | 5 | distorted and rotated. |
| r30820 | r30821 | |
| 83 | 83 | 256*8 |
| 84 | 84 | }; |
| 85 | 85 | |
| 86 | | const gfx_layout k051316_device::charlayout_tail2nos = |
| 87 | | { |
| 88 | | 16,16, |
| 89 | | RGN_FRAC(1,1), |
| 90 | | 4, |
| 91 | | { 0, 1, 2, 3 }, |
| 92 | | { WORD_XOR_BE(0)*4, WORD_XOR_BE(1)*4, WORD_XOR_BE(2)*4, WORD_XOR_BE(3)*4, |
| 93 | | WORD_XOR_BE(4)*4, WORD_XOR_BE(5)*4, WORD_XOR_BE(6)*4, WORD_XOR_BE(7)*4, |
| 94 | | WORD_XOR_BE(8)*4, WORD_XOR_BE(9)*4, WORD_XOR_BE(10)*4, WORD_XOR_BE(11)*4, |
| 95 | | WORD_XOR_BE(12)*4, WORD_XOR_BE(13)*4, WORD_XOR_BE(14)*4, WORD_XOR_BE(15)*4 }, |
| 96 | | { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, |
| 97 | | 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, |
| 98 | | 128*8 |
| 99 | | }; |
| 100 | 86 | |
| 101 | | |
| 102 | 87 | GFXDECODE_MEMBER( k051316_device::gfxinfo ) |
| 103 | 88 | GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout4, 0, 1) |
| 104 | 89 | GFXDECODE_END |
| r30820 | r30821 | |
| 111 | 96 | GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout8, 0, 1) |
| 112 | 97 | GFXDECODE_END |
| 113 | 98 | |
| 114 | | GFXDECODE_MEMBER( k051316_device::gfxinfo4_tail2nos ) |
| 115 | | GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout_tail2nos, 0, 1) |
| 99 | GFXDECODE_MEMBER( k051316_device::gfxinfo4_ram ) |
| 100 | GFXDECODE_DEVICE_RAM(DEVICE_SELF, 0, charlayout4, 0, 1) |
| 116 | 101 | GFXDECODE_END |
| 117 | 102 | |
| 118 | 103 | |
| 119 | 104 | k051316_device::k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 120 | | : device_t(mconfig, K051316, "K051316 Video Controller", tag, owner, clock, "k051316", __FILE__), |
| 105 | : device_t(mconfig, K051316, "K051316 PSAC", tag, owner, clock, "k051316", __FILE__), |
| 121 | 106 | device_gfx_interface(mconfig, *this, gfxinfo), |
| 122 | | m_ram(NULL), |
| 123 | 107 | m_zoom_rom(NULL), |
| 124 | 108 | m_zoom_size(0), |
| 125 | 109 | m_dx(0), |
| 126 | 110 | m_dy(0), |
| 127 | 111 | m_wrap(0), |
| 128 | | m_pen_is_mask(false), |
| 129 | | m_bpp(0), |
| 112 | m_pen_is_mask(false), |
| 113 | m_pixels_per_byte(2), // 4bpp layout is default |
| 130 | 114 | m_transparent_pen(0) |
| 131 | 115 | { |
| 132 | 116 | } |
| r30820 | r30821 | |
| 134 | 118 | void k051316_device::set_bpp(device_t &device, int bpp) |
| 135 | 119 | { |
| 136 | 120 | k051316_device &dev = downcast<k051316_device &>(device); |
| 137 | | dev.m_bpp = bpp; |
| 138 | 121 | |
| 139 | 122 | switch(bpp) |
| 140 | 123 | { |
| 141 | 124 | case 4: |
| 142 | 125 | device_gfx_interface::static_set_info(dev, gfxinfo); |
| 126 | dev.m_pixels_per_byte = 2; |
| 143 | 127 | break; |
| 144 | 128 | case 7: |
| 145 | 129 | device_gfx_interface::static_set_info(dev, gfxinfo7); |
| 130 | dev.m_pixels_per_byte = 1; |
| 146 | 131 | break; |
| 147 | 132 | case 8: |
| 148 | 133 | device_gfx_interface::static_set_info(dev, gfxinfo8); |
| 134 | dev.m_pixels_per_byte = 1; |
| 149 | 135 | break; |
| 150 | 136 | case -4: |
| 151 | | device_gfx_interface::static_set_info(dev, gfxinfo4_tail2nos); |
| 152 | | dev.m_bpp = 4; |
| 137 | device_gfx_interface::static_set_info(dev, gfxinfo4_ram); |
| 138 | dev.m_pixels_per_byte = 2; |
| 153 | 139 | break; |
| 154 | 140 | default: |
| 155 | 141 | fatalerror("Unsupported bpp\n"); |
| r30820 | r30821 | |
| 164 | 150 | |
| 165 | 151 | void k051316_device::device_start() |
| 166 | 152 | { |
| 167 | | m_zoom_rom = region()->base(); |
| 168 | | m_zoom_size = region()->bytes(); |
| 153 | memory_region *ROM = region(); |
| 154 | if (ROM != NULL) |
| 155 | { |
| 156 | m_zoom_rom = ROM->base(); |
| 157 | m_zoom_size = ROM->bytes(); |
| 158 | } |
| 169 | 159 | |
| 170 | 160 | decode_gfx(); |
| 171 | 161 | gfx(0)->set_colors(palette()->entries() / gfx(0)->depth()); |
| 172 | | if (m_bpp == 4) |
| 173 | | gfx(0)->set_source_and_total(m_zoom_rom, m_zoom_size / 128); |
| 174 | | else |
| 175 | | gfx(0)->set_source_and_total(m_zoom_rom, m_zoom_size / 256); |
| 176 | 162 | |
| 177 | 163 | m_tmap = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(k051316_device::get_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); |
| 178 | | m_ram = auto_alloc_array_clear(machine(), UINT8, 0x800); |
| 164 | m_ram.resize_and_clear(0x800); |
| 179 | 165 | |
| 180 | 166 | if (!m_pen_is_mask) |
| 181 | 167 | m_tmap->set_transparent_pen(m_transparent_pen); |
| r30820 | r30821 | |
| 188 | 174 | // bind callbacks |
| 189 | 175 | m_k051316_cb.bind_relative_to(*owner()); |
| 190 | 176 | |
| 191 | | save_pointer(NAME(m_ram), 0x800); |
| 177 | save_item(NAME(m_ram)); |
| 192 | 178 | save_item(NAME(m_ctrlram)); |
| 193 | 179 | save_item(NAME(m_wrap)); |
| 194 | 180 | |
| r30820 | r30821 | |
| 221 | 207 | |
| 222 | 208 | READ8_MEMBER( k051316_device::rom_r ) |
| 223 | 209 | { |
| 210 | assert (m_zoom_size != 0); |
| 211 | |
| 224 | 212 | if ((m_ctrlram[0x0e] & 0x01) == 0) |
| 225 | 213 | { |
| 226 | 214 | int addr = offset + (m_ctrlram[0x0c] << 11) + (m_ctrlram[0x0d] << 19); |
| 227 | | if (m_bpp <= 4) |
| 228 | | addr /= 2; |
| 215 | addr /= m_pixels_per_byte; |
| 229 | 216 | addr &= m_zoom_size - 1; |
| 230 | 217 | |
| 231 | 218 | // popmessage("%s: offset %04x addr %04x", space.machine().describe_context(), offset, addr); |
| r30820 | r30821 | |
| 245 | 232 | //if (offset >= 0x0c) logerror("%s: write %02x to 051316 reg %x\n", space.machine().describe_context(), data, offset); |
| 246 | 233 | } |
| 247 | 234 | |
| 248 | | // a few games (ajax, rollerg, ultraman, etc.) can enable and disable wraparound after start |
| 235 | // some games (ajax, rollerg, ultraman, etc.) have external logic that can enable or disable wraparound dynamically |
| 249 | 236 | void k051316_device::wraparound_enable( int status ) |
| 250 | 237 | { |
| 251 | 238 | m_wrap = status; |
trunk/src/mame/video/k051316.h
| r30820 | r30821 | |
| 32 | 32 | static const gfx_layout charlayout4; |
| 33 | 33 | static const gfx_layout charlayout7; |
| 34 | 34 | static const gfx_layout charlayout8; |
| 35 | | static const gfx_layout charlayout_tail2nos; |
| 36 | 35 | DECLARE_GFXDECODE_MEMBER(gfxinfo); |
| 37 | 36 | DECLARE_GFXDECODE_MEMBER(gfxinfo7); |
| 38 | 37 | DECLARE_GFXDECODE_MEMBER(gfxinfo8); |
| 39 | | DECLARE_GFXDECODE_MEMBER(gfxinfo4_tail2nos); |
| 38 | DECLARE_GFXDECODE_MEMBER(gfxinfo4_ram); |
| 40 | 39 | |
| 41 | 40 | // static configuration |
| 42 | 41 | static void set_k051316_callback(device_t &device, k051316_cb_delegate callback) { downcast<k051316_device &>(device).m_k051316_cb = callback; } |
| r30820 | r30821 | |
| 74 | 73 | void zoom_draw(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,UINT32 priority); |
| 75 | 74 | void wraparound_enable(int status); |
| 76 | 75 | |
| 77 | | void zoomram_updated(UINT32 offs) { gfx(0)->mark_dirty(offs); } |
| 76 | void mark_gfx_dirty(offs_t byteoffset) { gfx(0)->mark_dirty(byteoffset * m_pixels_per_byte / (16 * 16)); } |
| 78 | 77 | |
| 79 | 78 | protected: |
| 80 | 79 | // device-level overrides |
| r30820 | r30821 | |
| 83 | 82 | |
| 84 | 83 | private: |
| 85 | 84 | // internal state |
| 86 | | UINT8 *m_ram; |
| 85 | dynamic_array<UINT8> m_ram; |
| 87 | 86 | UINT8 m_ctrlram[16]; |
| 88 | 87 | tilemap_t *m_tmap; |
| 89 | 88 | |
| r30820 | r30821 | |
| 93 | 92 | int m_dx, m_dy; |
| 94 | 93 | int m_wrap; |
| 95 | 94 | bool m_pen_is_mask; |
| 96 | | int m_bpp, m_transparent_pen; |
| 95 | int m_pixels_per_byte; |
| 96 | int m_transparent_pen; |
| 97 | 97 | k051316_cb_delegate m_k051316_cb; |
| 98 | 98 | |
| 99 | 99 | TILE_GET_INFO_MEMBER(get_tile_info); |
trunk/src/mame/video/tail2nos.c
| r30820 | r30821 | |
| 44 | 44 | |
| 45 | 45 | m_bg_tilemap->mark_all_dirty(); |
| 46 | 46 | |
| 47 | | for (i = 0; i < 0x20000; i += 64) |
| 48 | | { |
| 49 | | m_gfxdecode->gfx(2)->mark_dirty(i / 64); |
| 50 | | } |
| 47 | m_k051316->gfx(0)->mark_all_dirty(); |
| 51 | 48 | } |
| 52 | 49 | |
| 53 | 50 | void tail2nos_state::video_start() |
| r30820 | r30821 | |
| 56 | 53 | |
| 57 | 54 | m_bg_tilemap->set_transparent_pen(15); |
| 58 | 55 | |
| 59 | | m_zoomdata = (UINT16 *)memregion("k051316")->base(); |
| 60 | | |
| 61 | | save_pointer(NAME(m_zoomdata), 0x20000 / 2); |
| 62 | 56 | machine().save().register_postload(save_prepost_delegate(FUNC(tail2nos_state::tail2nos_postload), this)); |
| 63 | 57 | } |
| 64 | 58 | |
| r30820 | r30821 | |
| 76 | 70 | m_bg_tilemap->mark_tile_dirty(offset); |
| 77 | 71 | } |
| 78 | 72 | |
| 79 | | READ16_MEMBER(tail2nos_state::tail2nos_zoomdata_r) |
| 80 | | { |
| 81 | | return m_zoomdata[offset]; |
| 82 | | } |
| 83 | | |
| 84 | 73 | WRITE16_MEMBER(tail2nos_state::tail2nos_zoomdata_w) |
| 85 | 74 | { |
| 86 | | int oldword = m_zoomdata[offset]; |
| 87 | | |
| 88 | | COMBINE_DATA(&m_zoomdata[offset]); |
| 89 | | // mark dirty the tilemap inside K051316 device |
| 90 | | if (oldword != m_zoomdata[offset]) |
| 91 | | m_k051316->zoomram_updated(offset / 64); |
| 75 | int oldword = m_zoomram[offset]; |
| 76 | COMBINE_DATA(&m_zoomram[offset]); |
| 77 | // tell the K051316 device the data changed |
| 78 | if (oldword != m_zoomram[offset]) |
| 79 | m_k051316->mark_gfx_dirty(offset * 2); |
| 92 | 80 | } |
| 93 | 81 | |
| 94 | 82 | WRITE16_MEMBER(tail2nos_state::tail2nos_gfxbank_w) |
trunk/src/mame/drivers/wecleman.c
| r30820 | r30821 | |
| 1373 | 1373 | ROM_REGION( 0x20000, "k051316_1", 0 ) /* bg */ |
| 1374 | 1374 | ROM_LOAD( "763e14", 0x000000, 0x020000, CRC(60392aa1) SHA1(8499eb40a246587e24f6fd00af2eaa6d75ee6363) ) |
| 1375 | 1375 | |
| 1376 | | ROM_REGION( 0x10000, "k051316_2", 0 ) /* fg (patched) */ |
| 1377 | | ROM_LOAD( "763a13", 0x000000, 0x010000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) ) |
| 1376 | ROM_REGION( 0x08000, "k051316_2", 0 ) /* fg */ |
| 1377 | /* first half empty - PCB silkscreen reads "27256/27512" */ |
| 1378 | ROM_LOAD( "763a13", 0x000000, 0x008000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) ) |
| 1379 | ROM_CONTINUE( 0x000000, 0x008000 ) |
| 1378 | 1380 | |
| 1379 | 1381 | ROM_REGION( 0x20000, "gfx4", 0 ) /* road */ |
| 1380 | 1382 | ROM_LOAD( "763e15", 0x000000, 0x020000, CRC(7110aa43) SHA1(639dc002cc1580f0530bb5bb17f574e2258d5954) ) |
| r30820 | r30821 | |
| 1449 | 1451 | // UINT16 *RAM1 = (UINT16) memregion("maincpu")->base(); /* Main CPU patches */ |
| 1450 | 1452 | // RAM[0x1140/2] = 0x0015; RAM[0x195c/2] = 0x601A; // faster self test |
| 1451 | 1453 | |
| 1452 | | UINT8 *RAM; |
| 1453 | | |
| 1454 | | /* Decode GFX Roms */ |
| 1455 | | |
| 1456 | | /* Let's swap even and odd bytes of the sprites gfx roms */ |
| 1457 | | RAM = memregion("gfx1")->base(); |
| 1458 | | |
| 1459 | 1454 | /* Now we can unpack each nibble of the sprites into a pixel (one byte) */ |
| 1460 | 1455 | hotchase_sprite_decode(3,0x80000*2); // num banks, bank len |
| 1461 | 1456 | |
| 1462 | | /* Let's copy the second half of the fg layer gfx (charset) over the first */ |
| 1463 | | RAM = memregion("k051316_2")->base(); |
| 1464 | | memcpy(&RAM[0], &RAM[0x10000/2], 0x10000/2); |
| 1465 | | |
| 1466 | 1457 | m_spr_color_offs = 0; |
| 1467 | 1458 | } |
| 1468 | 1459 | |
trunk/src/mame/drivers/tail2nos.c
| r30820 | r30821 | |
| 32 | 32 | |
| 33 | 33 | static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, tail2nos_state ) |
| 34 | 34 | AM_RANGE(0x000000, 0x03ffff) AM_ROM |
| 35 | | AM_RANGE(0x200000, 0x27ffff) AM_ROMBANK("bank1") /* extra ROM */ |
| 36 | | AM_RANGE(0x2c0000, 0x2dffff) AM_ROMBANK("bank2") |
| 37 | | AM_RANGE(0x400000, 0x41ffff) AM_READWRITE(tail2nos_zoomdata_r, tail2nos_zoomdata_w) |
| 35 | AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("user1", 0) /* extra ROM */ |
| 36 | AM_RANGE(0x2c0000, 0x2dffff) AM_ROM AM_REGION("user2", 0) |
| 37 | AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(tail2nos_zoomdata_w) AM_SHARE("k051316") |
| 38 | 38 | AM_RANGE(0x500000, 0x500fff) AM_DEVREADWRITE8("k051316", k051316_device, read, write, 0x00ff) |
| 39 | 39 | AM_RANGE(0x510000, 0x51001f) AM_DEVWRITE8("k051316", k051316_device, ctrl_w, 0x00ff) |
| 40 | 40 | AM_RANGE(0xff8000, 0xffbfff) AM_RAM /* work RAM */ |
| r30820 | r30821 | |
| 194 | 194 | |
| 195 | 195 | void tail2nos_state::machine_reset() |
| 196 | 196 | { |
| 197 | | /* point to the extra ROMs */ |
| 198 | | membank("bank1")->set_base(memregion("user1")->base()); |
| 199 | | membank("bank2")->set_base(memregion("user2")->base()); |
| 200 | | |
| 201 | 197 | m_charbank = 0; |
| 202 | 198 | m_charpalette = 0; |
| 203 | 199 | m_video_enable = 0; |
| r30820 | r30821 | |
| 278 | 274 | ROM_LOAD( "oj1", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) ) |
| 279 | 275 | ROM_LOAD( "oj2", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) ) |
| 280 | 276 | |
| 281 | | ROM_REGION( 0x20000, "k051316", ROMREGION_ERASE00 ) |
| 282 | | /* RAM, not ROM - handled at run time */ |
| 283 | | |
| 284 | 277 | ROM_REGION( 0x20000, "ymsnd", 0 ) /* sound samples */ |
| 285 | 278 | ROM_LOAD( "osb", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) ) |
| 286 | 279 | ROM_END |
| r30820 | r30821 | |
| 313 | 306 | ROM_LOAD( "oj1", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) ) |
| 314 | 307 | ROM_LOAD( "oj2", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) ) |
| 315 | 308 | |
| 316 | | ROM_REGION( 0x20000, "k051316", ROMREGION_ERASE00 ) |
| 317 | | /* RAM, not ROM - handled at run time */ |
| 318 | | |
| 319 | 309 | ROM_REGION( 0x20000, "ymsnd", 0 ) /* sound samples */ |
| 320 | 310 | ROM_LOAD( "osb", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) ) |
| 321 | 311 | ROM_END |