trunk/src/mame/drivers/supduck.c
| r242050 | r242051 | |
| 23 | 23 | m_maincpu(*this, "maincpu"), |
| 24 | 24 | m_audiocpu(*this, "audiocpu"), |
| 25 | 25 | m_spriteram(*this, "spriteram") , |
| 26 | | m_tx_videoram(*this, "txvideoram"), |
| 27 | | m_bg_videoram(*this, "bgvideoram"), |
| 28 | | m_fg_videoram(*this, "fgvideoram"), |
| 26 | m_text_videoram(*this, "textvideoram"), |
| 27 | m_fore_videoram(*this, "forevideoram"), |
| 28 | m_back_videoram(*this, "backvideoram"), |
| 29 | 29 | m_gfxdecode(*this, "gfxdecode"), |
| 30 | 30 | m_palette(*this, "palette") |
| 31 | 31 | { } |
| r242050 | r242051 | |
| 36 | 36 | |
| 37 | 37 | // shared pointers |
| 38 | 38 | required_device<buffered_spriteram16_device> m_spriteram; |
| 39 | | required_shared_ptr<UINT16> m_tx_videoram; |
| 40 | | required_shared_ptr<UINT16> m_bg_videoram; |
| 41 | | required_shared_ptr<UINT16> m_fg_videoram; |
| 39 | required_shared_ptr<UINT16> m_text_videoram; |
| 40 | required_shared_ptr<UINT16> m_fore_videoram; |
| 41 | required_shared_ptr<UINT16> m_back_videoram; |
| 42 | 42 | |
| 43 | 43 | required_device<gfxdecode_device> m_gfxdecode; |
| 44 | 44 | required_device<palette_device> m_palette; |
| 45 | 45 | |
| 46 | | tilemap_t *m_tx_tilemap; |
| 47 | | tilemap_t *m_bg_tilemap; |
| 48 | | tilemap_t *m_fg_tilemap; |
| 46 | tilemap_t *m_text_tilemap; |
| 47 | tilemap_t *m_fore_tilemap; |
| 48 | tilemap_t *m_back_tilemap; |
| 49 | 49 | |
| 50 | 50 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 51 | 51 | |
| 52 | | DECLARE_WRITE16_MEMBER(tx_videoram_w); |
| 53 | | DECLARE_WRITE16_MEMBER(bg_videoram_w); |
| 54 | | DECLARE_WRITE16_MEMBER(fg_videoram_w); |
| 52 | DECLARE_WRITE16_MEMBER(text_videoram_w); |
| 53 | DECLARE_WRITE16_MEMBER(fore_videoram_w); |
| 54 | DECLARE_WRITE16_MEMBER(back_videoram_w); |
| 55 | 55 | DECLARE_WRITE16_MEMBER(supduck_scroll_w); |
| 56 | 56 | |
| 57 | 57 | DECLARE_WRITE16_MEMBER(supduck_4000_w); |
| 58 | 58 | DECLARE_WRITE16_MEMBER(supduck_4002_w); |
| 59 | 59 | |
| 60 | | TILEMAP_MAPPER_MEMBER(tigeroad_tilemap_scan); |
| 60 | TILEMAP_MAPPER_MEMBER(supduk_tilemap_scan); |
| 61 | 61 | |
| 62 | 62 | |
| 63 | 63 | protected: |
| r242050 | r242051 | |
| 69 | 69 | virtual void video_start(); |
| 70 | 70 | |
| 71 | 71 | void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority); |
| 72 | | TILE_GET_INFO_MEMBER(get_tx_tile_info); |
| 73 | | TILE_GET_INFO_MEMBER(get_bg_tile_info); |
| 74 | | TILE_GET_INFO_MEMBER(get_fg_tile_info); |
| 72 | TILE_GET_INFO_MEMBER(get_text_tile_info); |
| 73 | TILE_GET_INFO_MEMBER(get_fore_tile_info); |
| 74 | TILE_GET_INFO_MEMBER(get_back_tile_info); |
| 75 | 75 | |
| 76 | 76 | }; |
| 77 | 77 | |
| 78 | | TILEMAP_MAPPER_MEMBER(supduck_state::tigeroad_tilemap_scan) |
| 78 | |
| 79 | |
| 80 | TILEMAP_MAPPER_MEMBER(supduck_state::supduk_tilemap_scan) |
| 79 | 81 | { |
| 80 | | /* logical (col,row) -> memory offset */ |
| 81 | | return (num_rows - 1 - row) * num_cols + col; |
| 82 | // where does each page start? |
| 83 | int pagesize = 0x8 * 0x8; |
| 84 | |
| 85 | int offset = ((col & ~0x7) / 0x8) * (pagesize); |
| 86 | offset += ((row^0x3f) & 0x7)*0x8; |
| 87 | offset += col & 0x7; |
| 88 | |
| 89 | offset &= 0x3ff; |
| 90 | |
| 91 | offset += (((row^0x3f) & ~0x7) / 0x8) * 0x400; |
| 92 | |
| 93 | |
| 94 | return offset; |
| 82 | 95 | } |
| 83 | 96 | |
| 84 | 97 | void supduck_state::video_start() |
| 85 | 98 | { |
| 86 | | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_tx_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); |
| 99 | m_text_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_text_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); |
| 87 | 100 | |
| 88 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::tigeroad_tilemap_scan),this), 32, 32, 8, 256); |
| 89 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::tigeroad_tilemap_scan),this), 32, 32, 8, 256); |
| 101 | m_fore_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_fore_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::supduk_tilemap_scan),this), 32, 32, 128,64); |
| 102 | m_back_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_back_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::supduk_tilemap_scan),this), 32, 32, 128,64); |
| 90 | 103 | |
| 91 | | m_tx_tilemap->set_transparent_pen(3); |
| 104 | m_text_tilemap->set_transparent_pen(0x3); |
| 105 | m_fore_tilemap->set_transparent_pen(0xf); |
| 92 | 106 | |
| 93 | 107 | } |
| 94 | 108 | |
| r242050 | r242051 | |
| 96 | 110 | { |
| 97 | 111 | bitmap.fill(m_palette->black_pen(), cliprect); |
| 98 | 112 | |
| 113 | m_back_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 114 | m_fore_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 115 | |
| 116 | |
| 99 | 117 | draw_sprites(bitmap, cliprect, 0); |
| 100 | 118 | draw_sprites(bitmap, cliprect, 1); //draw priority sprites? |
| 101 | 119 | |
| 102 | | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 120 | m_text_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 103 | 121 | return 0; |
| 104 | 122 | } |
| 105 | 123 | |
| 106 | 124 | |
| 107 | | WRITE16_MEMBER(supduck_state::tx_videoram_w) |
| 125 | WRITE16_MEMBER(supduck_state::text_videoram_w) |
| 108 | 126 | { |
| 109 | | COMBINE_DATA(&m_tx_videoram[offset]); |
| 110 | | m_tx_tilemap->mark_tile_dirty(offset); |
| 127 | COMBINE_DATA(&m_text_videoram[offset]); |
| 128 | m_text_tilemap->mark_tile_dirty(offset); |
| 111 | 129 | } |
| 112 | 130 | |
| 113 | | WRITE16_MEMBER(supduck_state::bg_videoram_w) |
| 131 | WRITE16_MEMBER(supduck_state::fore_videoram_w) |
| 114 | 132 | { |
| 115 | | COMBINE_DATA(&m_bg_videoram[offset]); |
| 116 | | m_bg_tilemap->mark_tile_dirty(offset); |
| 133 | COMBINE_DATA(&m_fore_videoram[offset]); |
| 134 | m_fore_tilemap->mark_tile_dirty(offset); |
| 117 | 135 | } |
| 118 | 136 | |
| 119 | | WRITE16_MEMBER(supduck_state::fg_videoram_w) |
| 137 | WRITE16_MEMBER(supduck_state::back_videoram_w) |
| 120 | 138 | { |
| 121 | | COMBINE_DATA(&m_fg_videoram[offset]); |
| 122 | | m_fg_tilemap->mark_tile_dirty(offset); |
| 139 | COMBINE_DATA(&m_back_videoram[offset]); |
| 140 | m_back_tilemap->mark_tile_dirty(offset); |
| 123 | 141 | } |
| 124 | 142 | |
| 125 | 143 | |
| 126 | | TILE_GET_INFO_MEMBER(supduck_state::get_tx_tile_info) // same as tigeroad.c |
| 144 | TILE_GET_INFO_MEMBER(supduck_state::get_text_tile_info) // same as tigeroad.c |
| 127 | 145 | { |
| 128 | | UINT16 *videoram = m_tx_videoram; |
| 146 | UINT16 *videoram = m_text_videoram; |
| 129 | 147 | int data = videoram[tile_index]; |
| 130 | 148 | int attr = data >> 8; |
| 131 | 149 | int code = (data & 0xff) + ((attr & 0xc0) << 2) + ((attr & 0x20) << 5); |
| r242050 | r242051 | |
| 135 | 153 | SET_TILE_INFO_MEMBER(0, code, color, flags); |
| 136 | 154 | } |
| 137 | 155 | |
| 138 | | TILE_GET_INFO_MEMBER(supduck_state::get_bg_tile_info) |
| 156 | TILE_GET_INFO_MEMBER(supduck_state::get_fore_tile_info) |
| 139 | 157 | { |
| 140 | | UINT16 *videoram = m_bg_videoram; |
| 158 | UINT16 *videoram = m_fore_videoram; |
| 141 | 159 | int data = videoram[tile_index]; |
| 142 | 160 | int code = data & 0xff; |
| 143 | 161 | if (data & 0x4000) code |= 0x100; |
| r242050 | r242051 | |
| 149 | 167 | SET_TILE_INFO_MEMBER(1, code, color, flags); |
| 150 | 168 | } |
| 151 | 169 | |
| 152 | | TILE_GET_INFO_MEMBER(supduck_state::get_fg_tile_info) |
| 170 | TILE_GET_INFO_MEMBER(supduck_state::get_back_tile_info) |
| 153 | 171 | { |
| 154 | 172 | |
| 155 | | UINT16 *videoram = m_fg_videoram; |
| 173 | UINT16 *videoram = m_back_videoram; |
| 156 | 174 | int data = videoram[tile_index]; |
| 157 | 175 | |
| 158 | 176 | int code = data & 0xff; |
| r242050 | r242051 | |
| 226 | 244 | switch (offset) |
| 227 | 245 | { |
| 228 | 246 | case 0: |
| 229 | | m_bg_tilemap->set_scrollx(0, data); |
| 230 | | printf("bg x scroll %04x\n", data); |
| 231 | | |
| 247 | m_back_tilemap->set_scrollx(0, data); |
| 248 | // printf("fore x scroll %04x\n", data); |
| 249 | |
| 232 | 250 | break; |
| 233 | 251 | case 1: |
| 234 | | m_bg_tilemap->set_scrolly(0, -data - 32 * 8); |
| 235 | | printf("bg y scroll %04x\n", data); |
| 252 | m_back_tilemap->set_scrolly(0, -data - 32 * 8); |
| 253 | // printf("fore y scroll %04x\n", data); |
| 236 | 254 | |
| 237 | 255 | break; |
| 238 | 256 | case 2: |
| 239 | | m_fg_tilemap->set_scrollx(0, data); |
| 257 | m_fore_tilemap->set_scrollx(0, data); |
| 258 | // printf("back x scroll %04x\n", data); |
| 259 | |
| 240 | 260 | break; |
| 241 | 261 | case 3: |
| 242 | | m_fg_tilemap->set_scrolly(0, -data - 32 * 8); |
| 262 | m_fore_tilemap->set_scrolly(0, -data - 32 * 8); |
| 263 | // printf("back y scroll %04x\n", data); |
| 264 | |
| 243 | 265 | break; |
| 244 | 266 | } |
| 245 | 267 | } |
| r242050 | r242051 | |
| 249 | 271 | static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, supduck_state ) |
| 250 | 272 | AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_WRITENOP |
| 251 | 273 | AM_RANGE(0xfe0000, 0xfe1fff) AM_RAM AM_SHARE("spriteram") |
| 252 | | // AM_RANGE(0xfe0000, 0xfe07ff) AM_RAM /* RAM? */ |
| 253 | | // AM_RANGE(0xfe0800, 0xfe0cff) AM_RAM AM_SHARE("spriteram") |
| 254 | | // AM_RANGE(0xfe0d00, 0xfe3fff) AM_RAM /* RAM? */ |
| 255 | | // AM_RANGE(0xfe4000, 0xfe4001) AM_WRITE(bionicc_gfxctrl_w) /* + coin counters */ |
| 256 | | // AM_RANGE(0xfe4000, 0xfe4001) AM_READ_PORT("SYSTEM") |
| 257 | | // AM_RANGE(0xfe4002, 0xfe4003) AM_READ(supduck_random_r) |
| 274 | |
| 258 | 275 | AM_RANGE(0xfe4000, 0xfe4001) AM_READ_PORT("P1_P2") AM_WRITE( supduck_4000_w ) |
| 259 | 276 | AM_RANGE(0xfe4002, 0xfe4003) AM_READ_PORT("SYSTEM") AM_WRITE( supduck_4002_w ) |
| 260 | 277 | AM_RANGE(0xfe4004, 0xfe4005) AM_READ_PORT("DSW") |
| 261 | 278 | |
| 262 | 279 | AM_RANGE(0xfe8000, 0xfe8007) AM_WRITE(supduck_scroll_w) |
| 263 | 280 | AM_RANGE(0xfe800e, 0xfe800f) AM_WRITENOP // watchdog or irqack |
| 264 | | |
| 265 | 281 | |
| 266 | | // AM_RANGE(0xfe8010, 0xfe8017) AM_WRITE(bionicc_scroll_w) |
| 267 | | // AM_RANGE(0xfe801a, 0xfe801b) AM_WRITE(bionicc_mpu_trigger_w) /* ??? not sure, but looks like it */ |
| 268 | | AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(tx_videoram_w) AM_SHARE("txvideoram") |
| 269 | | AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram") |
| 270 | | AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bgvideoram") |
| 282 | AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(text_videoram_w) AM_SHARE("textvideoram") |
| 283 | AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(back_videoram_w) AM_SHARE("backvideoram") |
| 284 | AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(fore_videoram_w) AM_SHARE("forevideoram") |
| 271 | 285 | AM_RANGE(0xff8000, 0xff87ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") |
| 272 | 286 | AM_RANGE(0xffc000, 0xffffff) AM_RAM /* working RAM */ |
| 273 | 287 | ADDRESS_MAP_END |
| r242050 | r242051 | |
| 459 | 473 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) |
| 460 | 474 | MCFG_SCREEN_UPDATE_DRIVER(supduck_state, screen_update) |
| 461 | 475 | MCFG_SCREEN_SIZE(32*8, 32*8) |
| 462 | | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) |
| 476 | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) |
| 463 | 477 | MCFG_SCREEN_PALETTE("palette") |
| 464 | 478 | MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram16_device, vblank_copy_rising) |
| 465 | 479 | |