trunk/src/mame/video/dooyong.c
| r241912 | r241913 | |
| 18 | 18 | break; |
| 19 | 19 | case 3: /* Low byte of y scroll */ |
| 20 | 20 | case 4: /* High byte of y scroll */ |
| 21 | | map->set_scrolly(0, (int)scroll[3] | ((int)scroll[4] << 8)); |
| 21 | map->set_scrolly(0, (unsigned)scroll[3] | ((unsigned)scroll[4] << 8)); |
| 22 | 22 | break; |
| 23 | 23 | case 6: /* Tilemap enable and mode control */ |
| 24 | 24 | map->enable(!(data & 0x10)); |
| r241912 | r241913 | |
| 43 | 43 | } |
| 44 | 44 | |
| 45 | 45 | |
| 46 | | /* These handle writes to the tilemap scroll registers in 8-bit machines. |
| 46 | /* These handle writes to the tilemap scroll registers. |
| 47 | 47 | There is one per tilemap, wrapping the above function that does the work. */ |
| 48 | 48 | |
| 49 | | WRITE8_MEMBER(dooyong_z80_state::bgscroll_w) |
| 49 | WRITE8_MEMBER(dooyong_state::bgscroll_w) |
| 50 | 50 | { |
| 51 | 51 | scroll8_w(offset, data, m_bgscroll8, m_bg_tilemap); |
| 52 | 52 | } |
| 53 | 53 | |
| 54 | | WRITE8_MEMBER(dooyong_z80_state::bg2scroll_w) |
| 54 | WRITE8_MEMBER(dooyong_state::bg2scroll_w) |
| 55 | 55 | { |
| 56 | 56 | scroll8_w(offset, data, m_bg2scroll8, m_bg2_tilemap); |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | | WRITE8_MEMBER(dooyong_z80_state::fgscroll_w) |
| 59 | WRITE8_MEMBER(dooyong_state::fgscroll_w) |
| 60 | 60 | { |
| 61 | 61 | scroll8_w(offset, data, m_fgscroll8, m_fg_tilemap); |
| 62 | 62 | } |
| 63 | 63 | |
| 64 | | WRITE8_MEMBER(dooyong_z80_state::fg2scroll_w) |
| 64 | WRITE8_MEMBER(dooyong_state::fg2scroll_w) |
| 65 | 65 | { |
| 66 | 66 | scroll8_w(offset, data, m_fg2scroll8, m_fg2_tilemap); |
| 67 | 67 | } |
| r241912 | r241913 | |
| 164 | 164 | when the x scroll moves out of range (trying to decode the whole lot |
| 165 | 165 | at once uses hundreds of megabytes of RAM). */ |
| 166 | 166 | |
| 167 | | inline void dooyong_state::lastday_get_tile_info(tile_data &tileinfo, int tile_index, |
| 168 | | const UINT8 *tilerom, UINT8 *scroll, int graphics) |
| 167 | inline void dooyong_state::get_tile_info(tile_data &tileinfo, int tile_index, |
| 168 | UINT8 const *tilerom, UINT8 const *scroll, int graphics) |
| 169 | 169 | { |
| 170 | 170 | int const offs = (tile_index + ((int)scroll[1] << 6)) * 2; |
| 171 | 171 | int const attr = tilerom[offs]; |
| r241912 | r241913 | |
| 185 | 185 | flags = TILE_FLIPYX((attr & 0x06) >> 1); |
| 186 | 186 | } |
| 187 | 187 | else |
| 188 | | { |
| 189 | | /* primella */ |
| 188 | { /* primella/popbingo */ |
| 190 | 189 | /* Tiles take two bytes in ROM: |
| 191 | 190 | MSB LSB |
| 192 | 191 | [offs + 0x00] YXCC CCcc (Y flip, X flip, bits 3-0 of color code, bits 9-8 of gfx code) |
| r241912 | r241913 | |
| 212 | 211 | tileinfo.set(graphics, code, color, flags); |
| 213 | 212 | } |
| 214 | 213 | |
| 215 | | TILE_GET_INFO_MEMBER(dooyong_z80_state::get_bg_tile_info) |
| 214 | TILE_GET_INFO_MEMBER(dooyong_state::get_bg_tile_info) |
| 216 | 215 | { |
| 217 | | lastday_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bgscroll8, m_bg_gfx); |
| 216 | get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bgscroll8, m_bg_gfx); |
| 218 | 217 | } |
| 219 | 218 | |
| 220 | | TILE_GET_INFO_MEMBER(dooyong_z80_state::get_bg2_tile_info) |
| 219 | TILE_GET_INFO_MEMBER(dooyong_state::get_bg2_tile_info) |
| 221 | 220 | { |
| 222 | | lastday_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2scroll8, m_bg2_gfx); |
| 221 | get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2scroll8, m_bg2_gfx); |
| 223 | 222 | } |
| 224 | 223 | |
| 225 | | TILE_GET_INFO_MEMBER(dooyong_z80_state::get_fg_tile_info) |
| 224 | TILE_GET_INFO_MEMBER(dooyong_state::get_fg_tile_info) |
| 226 | 225 | { |
| 227 | | lastday_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fgscroll8, m_fg_gfx); |
| 226 | get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fgscroll8, m_fg_gfx); |
| 228 | 227 | } |
| 229 | 228 | |
| 230 | | TILE_GET_INFO_MEMBER(dooyong_z80_state::get_fg2_tile_info) |
| 229 | TILE_GET_INFO_MEMBER(dooyong_state::get_fg2_tile_info) |
| 231 | 230 | { |
| 232 | | lastday_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2scroll8, m_fg2_gfx); |
| 231 | get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2scroll8, m_fg2_gfx); |
| 233 | 232 | } |
| 234 | 233 | |
| 235 | 234 | TILE_GET_INFO_MEMBER(dooyong_z80_state::get_tx_tile_info) |
| r241912 | r241913 | |
| 240 | 239 | [offs + 0x01] CCCC cccc (bits 3-0 of color code, bits 11-8 of gfx code) |
| 241 | 240 | c = gfx code |
| 242 | 241 | C = color code */ |
| 243 | | int offs, attr; |
| 242 | unsigned offs, attr; |
| 244 | 243 | if (m_tx_tilemap_mode == 0) |
| 245 | 244 | { /* lastday/gulfstrm/pollux/flytiger */ |
| 246 | 245 | offs = tile_index; |
| r241912 | r241913 | |
| 258 | 257 | } |
| 259 | 258 | |
| 260 | 259 | |
| 261 | | void dooyong_z80_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pollux_extensions) |
| 260 | void dooyong_z80_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, unsigned extensions) |
| 262 | 261 | { |
| 263 | 262 | /* Sprites take 32 bytes each in memory: |
| 264 | 263 | MSB LSB |
| r241912 | r241913 | |
| 278 | 277 | w = width |
| 279 | 278 | X = x flip |
| 280 | 279 | Y = y flip |
| 281 | | * = alters y position in pollux and flytiger - see code below |
| 280 | * = alters y position in bluehawk and flytiger - see code below |
| 282 | 281 | bit 11 of gfx code only used by gulfstrm, pollux, bluehawk and flytiger |
| 283 | 282 | height only used by pollux, bluehawk and flytiger |
| 284 | 283 | x flip and y flip only used by pollux and flytiger */ |
| 285 | 284 | |
| 286 | | UINT8 *buffered_spriteram = m_spriteram->buffer(); |
| 287 | | int offs; |
| 288 | | |
| 289 | | for (offs = 0; offs < m_spriteram->bytes(); offs += 32) |
| 285 | UINT8 const *const buffered_spriteram = m_spriteram->buffer(); |
| 286 | for (int offs = 0; offs < m_spriteram->bytes(); offs += 32) |
| 290 | 287 | { |
| 291 | | int sx, sy, code, color, pri; |
| 292 | | int flipx = 0, flipy = 0, height = 0, y; |
| 293 | | |
| 294 | | sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4); |
| 295 | | sy = buffered_spriteram[offs+2]; |
| 296 | | code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3); |
| 297 | | color = buffered_spriteram[offs+1] & 0x0f; |
| 288 | int sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4); |
| 289 | int sy = buffered_spriteram[offs+2]; |
| 290 | int code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3); |
| 291 | int const color = buffered_spriteram[offs+1] & 0x0f; |
| 298 | 292 | //TODO: This priority mechanism works for known games, but seems a bit strange. |
| 299 | 293 | //Are we missing something? (The obvious spare palette bit isn't it.) |
| 300 | | pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); |
| 294 | int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); |
| 301 | 295 | |
| 302 | | if (pollux_extensions) |
| 296 | bool flipx = false, flipy = false; |
| 297 | int height = 0; |
| 298 | if (extensions) |
| 303 | 299 | { |
| 304 | | /* gulfstrm, pollux, bluehawk, flytiger */ |
| 305 | | code |= ((buffered_spriteram[offs+0x1c] & 0x01) << 11); |
| 300 | UINT8 const ext = buffered_spriteram[offs+0x1c]; |
| 306 | 301 | |
| 307 | | if (pollux_extensions >= 2) |
| 302 | if (extensions & SPRITE_12BIT) |
| 303 | code |= ((ext & 0x01) << 11); |
| 304 | |
| 305 | if (extensions & SPRITE_HEIGHT) |
| 308 | 306 | { |
| 309 | | /* pollux, bluehawk, flytiger */ |
| 310 | | height = (buffered_spriteram[offs+0x1c] & 0x70) >> 4; |
| 307 | height = (ext & 0x70) >> 4; |
| 311 | 308 | code &= ~height; |
| 312 | 309 | |
| 313 | | flipx = buffered_spriteram[offs+0x1c] & 0x08; |
| 314 | | flipy = buffered_spriteram[offs+0x1c] & 0x04; |
| 310 | flipx = ext & 0x08; |
| 311 | flipy = ext & 0x04; |
| 312 | } |
| 315 | 313 | |
| 316 | | if (pollux_extensions == 3) |
| 317 | | { |
| 318 | | /* bluehawk */ |
| 319 | | sy += 6 - ((~buffered_spriteram[offs+0x1c] & 0x02) << 7); |
| 320 | | } |
| 314 | if (extensions & SPRITE_YSHIFT_BLUEHAWK) |
| 315 | sy += 6 - ((~ext & 0x02) << 7); |
| 321 | 316 | |
| 322 | | if (pollux_extensions == 4) |
| 323 | | { |
| 324 | | /* flytiger */ |
| 325 | | sy -=(buffered_spriteram[offs+0x1c] & 0x02) << 7; |
| 326 | | } |
| 327 | | } |
| 317 | if (extensions & SPRITE_YSHIFT_FLYTIGER) |
| 318 | sy -=(ext & 0x02) << 7; |
| 328 | 319 | } |
| 329 | 320 | |
| 330 | 321 | if (flip_screen()) |
| r241912 | r241913 | |
| 335 | 326 | flipy = !flipy; |
| 336 | 327 | } |
| 337 | 328 | |
| 338 | | for (y = 0; y <= height; y++) |
| 329 | for (int y = 0; y <= height; y++) |
| 339 | 330 | { |
| 340 | 331 | m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect, |
| 341 | 332 | code + y, |
| r241912 | r241913 | |
| 359 | 350 | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 360 | 351 | |
| 361 | 352 | if (!m_sprites_disabled) |
| 362 | | draw_sprites(screen, bitmap, cliprect, 0); |
| 353 | draw_sprites(screen, bitmap, cliprect); |
| 354 | |
| 363 | 355 | return 0; |
| 364 | 356 | } |
| 365 | 357 | |
| r241912 | r241913 | |
| 372 | 364 | m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2); |
| 373 | 365 | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 374 | 366 | |
| 375 | | draw_sprites(screen, bitmap, cliprect, 1); |
| 367 | draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT); |
| 368 | |
| 376 | 369 | return 0; |
| 377 | 370 | } |
| 378 | 371 | |
| r241912 | r241913 | |
| 385 | 378 | m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2); |
| 386 | 379 | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 387 | 380 | |
| 388 | | draw_sprites(screen, bitmap, cliprect, 2); |
| 381 | draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT); |
| 382 | |
| 389 | 383 | return 0; |
| 390 | 384 | } |
| 391 | 385 | |
| r241912 | r241913 | |
| 406 | 400 | } |
| 407 | 401 | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 408 | 402 | |
| 409 | | draw_sprites(screen, bitmap, cliprect, 4); |
| 403 | draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT | SPRITE_YSHIFT_FLYTIGER); |
| 404 | |
| 410 | 405 | return 0; |
| 411 | 406 | } |
| 412 | 407 | |
| r241912 | r241913 | |
| 421 | 416 | m_fg2_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 422 | 417 | m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4); |
| 423 | 418 | |
| 424 | | draw_sprites(screen, bitmap, cliprect, 3); |
| 419 | draw_sprites(screen, bitmap, cliprect, SPRITE_12BIT | SPRITE_HEIGHT | SPRITE_YSHIFT_BLUEHAWK); |
| 420 | |
| 425 | 421 | return 0; |
| 426 | 422 | } |
| 427 | 423 | |
| r241912 | r241913 | |
| 433 | 429 | if (m_tx_pri) m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 434 | 430 | m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 435 | 431 | if (!m_tx_pri) m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 432 | |
| 436 | 433 | return 0; |
| 437 | 434 | } |
| 438 | 435 | |
| r241912 | r241913 | |
| 446 | 443 | m_tx_tilemap_mode = 0; |
| 447 | 444 | |
| 448 | 445 | /* Create tilemaps */ |
| 449 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 446 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 450 | 447 | 32, 32, 32, 8); |
| 451 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 448 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 452 | 449 | 32, 32, 32, 8); |
| 453 | 450 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 454 | 451 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 483 | 480 | m_tx_tilemap_mode = 0; |
| 484 | 481 | |
| 485 | 482 | /* Create tilemaps */ |
| 486 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 483 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 487 | 484 | 32, 32, 32, 8); |
| 488 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 485 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 489 | 486 | 32, 32, 32, 8); |
| 490 | 487 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 491 | 488 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 519 | 516 | m_tx_tilemap_mode = 0; |
| 520 | 517 | |
| 521 | 518 | /* Create tilemaps */ |
| 522 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 519 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 523 | 520 | 32, 32, 32, 8); |
| 524 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 521 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 525 | 522 | 32, 32, 32, 8); |
| 526 | 523 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 527 | 524 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 542 | 539 | save_item(NAME(m_interrupt_line_2)); |
| 543 | 540 | } |
| 544 | 541 | |
| 545 | | VIDEO_START_MEMBER(dooyong_z80_state,bluehawk) |
| 542 | VIDEO_START_MEMBER(dooyong_z80_state, bluehawk) |
| 546 | 543 | { |
| 547 | 544 | /* Configure tilemap callbacks */ |
| 548 | 545 | m_bg_tilerom = memregion("gfx3")->base() + 0x78000; |
| r241912 | r241913 | |
| 554 | 551 | m_tx_tilemap_mode = 1; |
| 555 | 552 | |
| 556 | 553 | /* Create tilemaps */ |
| 557 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 554 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 558 | 555 | 32, 32, 32, 8); |
| 559 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 556 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 560 | 557 | 32, 32, 32, 8); |
| 561 | | m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 558 | m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 562 | 559 | 32, 32, 32, 8); |
| 563 | 560 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 564 | 561 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 579 | 576 | save_item(NAME(m_fg2scroll8)); |
| 580 | 577 | } |
| 581 | 578 | |
| 582 | | VIDEO_START_MEMBER(dooyong_z80_state,flytiger) |
| 579 | VIDEO_START_MEMBER(dooyong_z80_state, flytiger) |
| 583 | 580 | { |
| 584 | 581 | /* Configure tilemap callbacks */ |
| 585 | 582 | m_bg_tilerom = memregion("gfx3")->base() + 0x78000; |
| r241912 | r241913 | |
| 589 | 586 | m_tx_tilemap_mode = 0; |
| 590 | 587 | |
| 591 | 588 | /* Create tilemaps */ |
| 592 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 589 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 593 | 590 | 32, 32, 32, 8); |
| 594 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 591 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 595 | 592 | 32, 32, 32, 8); |
| 596 | 593 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 597 | 594 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 612 | 609 | save_item(NAME(m_flytiger_pri)); |
| 613 | 610 | } |
| 614 | 611 | |
| 615 | | VIDEO_START_MEMBER(dooyong_z80_state,primella) |
| 612 | VIDEO_START_MEMBER(dooyong_z80_state, primella) |
| 616 | 613 | { |
| 617 | 614 | /* Configure tilemap callbacks */ |
| 618 | 615 | m_bg_tilerom = memregion("gfx2")->base() + memregion("gfx2")->bytes() - 0x8000; |
| r241912 | r241913 | |
| 622 | 619 | m_tx_tilemap_mode = 1; |
| 623 | 620 | |
| 624 | 621 | /* Create tilemaps */ |
| 625 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 622 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 626 | 623 | 32, 32, 32, 8); |
| 627 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 624 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 628 | 625 | 32, 32, 32, 8); |
| 629 | 626 | m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_z80_state::get_tx_tile_info),this), TILEMAP_SCAN_COLS, |
| 630 | 627 | 8, 8, 64, 32); |
| r241912 | r241913 | |
| 645 | 642 | } |
| 646 | 643 | |
| 647 | 644 | |
| 648 | | /* These handle writes to the tilemap scroll registers in 16-bit machines. |
| 649 | | This is just an 8-bit peripheral in a 16-bit machine. */ |
| 650 | | |
| 651 | | WRITE16_MEMBER(dooyong_68k_state::bgscroll_w) |
| 652 | | { |
| 653 | | if (ACCESSING_BITS_0_7) scroll8_w(offset, data & 0x00ff, m_bgscroll8, m_bg_tilemap); |
| 654 | | } |
| 655 | | |
| 656 | | WRITE16_MEMBER(dooyong_68k_state::bg2scroll_w) |
| 657 | | { |
| 658 | | if (ACCESSING_BITS_0_7) scroll8_w(offset, data & 0x00ff, m_bg2scroll8, m_bg2_tilemap); |
| 659 | | } |
| 660 | | |
| 661 | | WRITE16_MEMBER(dooyong_68k_state::fgscroll_w) |
| 662 | | { |
| 663 | | if (ACCESSING_BITS_0_7) scroll8_w(offset, data & 0x00ff, m_fgscroll8, m_fg_tilemap); |
| 664 | | } |
| 665 | | |
| 666 | | WRITE16_MEMBER(dooyong_68k_state::fg2scroll_w) |
| 667 | | { |
| 668 | | if (ACCESSING_BITS_0_7) scroll8_w(offset, data & 0x00ff, m_fg2scroll8, m_fg2_tilemap); |
| 669 | | } |
| 670 | | |
| 671 | 645 | WRITE16_MEMBER(dooyong_68k_state::ctrl_w) |
| 672 | | |
| 673 | 646 | { |
| 674 | 647 | if (ACCESSING_BITS_0_7) |
| 675 | 648 | { |
| r241912 | r241913 | |
| 685 | 658 | |
| 686 | 659 | |
| 687 | 660 | inline void dooyong_68k_state::rshark_get_tile_info(tile_data &tileinfo, int tile_index, |
| 688 | | const UINT8 *tilerom1, const UINT8 *tilerom2, UINT8 *scroll, int graphics) |
| 661 | UINT8 const *tilerom1, UINT8 const *tilerom2, UINT8 const *scroll, int graphics) |
| 689 | 662 | { |
| 690 | 663 | /* Tiles take two bytes in tile ROM 1: |
| 691 | 664 | MSB LSB |
| r241912 | r241913 | |
| 704 | 677 | tileinfo.set(graphics, code, color, flags); |
| 705 | 678 | } |
| 706 | 679 | |
| 707 | | TILE_GET_INFO_MEMBER(dooyong_68k_state::get_bg_tile_info) |
| 680 | TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_bg_tile_info) |
| 708 | 681 | { |
| 709 | | if (m_bg_tilerom2 != NULL) |
| 710 | | rshark_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bg_tilerom2, m_bgscroll8, m_bg_gfx); |
| 711 | | else |
| 712 | | lastday_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bgscroll8, m_bg_gfx); |
| 682 | rshark_get_tile_info(tileinfo, tile_index, m_bg_tilerom, m_bg_tilerom2, m_bgscroll8, m_bg_gfx); |
| 713 | 683 | } |
| 714 | 684 | |
| 715 | | TILE_GET_INFO_MEMBER(dooyong_68k_state::get_bg2_tile_info) |
| 685 | TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_bg2_tile_info) |
| 716 | 686 | { |
| 717 | | if (m_bg2_tilerom2 != NULL) |
| 718 | | rshark_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2_tilerom2, m_bg2scroll8, m_bg2_gfx); |
| 719 | | else |
| 720 | | lastday_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2scroll8, m_bg2_gfx); |
| 687 | rshark_get_tile_info(tileinfo, tile_index, m_bg2_tilerom, m_bg2_tilerom2, m_bg2scroll8, m_bg2_gfx); |
| 721 | 688 | } |
| 722 | 689 | |
| 723 | | TILE_GET_INFO_MEMBER(dooyong_68k_state::get_fg_tile_info) |
| 690 | TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_fg_tile_info) |
| 724 | 691 | { |
| 725 | | if (m_fg_tilerom2 != NULL) |
| 726 | | rshark_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fg_tilerom2, m_fgscroll8, m_fg_gfx); |
| 727 | | else |
| 728 | | lastday_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fgscroll8, m_fg_gfx); |
| 692 | rshark_get_tile_info(tileinfo, tile_index, m_fg_tilerom, m_fg_tilerom2, m_fgscroll8, m_fg_gfx); |
| 729 | 693 | } |
| 730 | 694 | |
| 731 | | TILE_GET_INFO_MEMBER(dooyong_68k_state::get_fg2_tile_info) |
| 695 | TILE_GET_INFO_MEMBER(dooyong_68k_state::rshark_get_fg2_tile_info) |
| 732 | 696 | { |
| 733 | | if (m_fg2_tilerom2 != NULL) |
| 734 | | rshark_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2_tilerom2, m_fg2scroll8, m_fg2_gfx); |
| 735 | | else |
| 736 | | lastday_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2scroll8, m_fg2_gfx); |
| 697 | rshark_get_tile_info(tileinfo, tile_index, m_fg2_tilerom, m_fg2_tilerom2, m_fg2scroll8, m_fg2_gfx); |
| 737 | 698 | } |
| 738 | 699 | |
| 739 | 700 | |
| 740 | 701 | void dooyong_68k_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 741 | 702 | { |
| 742 | | UINT16 *buffered_spriteram = m_spriteram->buffer(); |
| 743 | | |
| 744 | 703 | /* Sprites take 8 16-bit words each in memory: |
| 745 | 704 | MSB LSB |
| 746 | 705 | [offs + 0] ???? ???? ???? ???E |
| r241912 | r241913 | |
| 760 | 719 | w = width |
| 761 | 720 | h = height */ |
| 762 | 721 | |
| 763 | | int offs; |
| 764 | | |
| 765 | | for (offs = (m_spriteram->bytes() / 2) - 8; offs >= 0; offs -= 8) |
| 722 | UINT16 const *const buffered_spriteram = m_spriteram->buffer(); |
| 723 | for (int offs = (m_spriteram->bytes() / 2) - 8; offs >= 0; offs -= 8) |
| 766 | 724 | { |
| 767 | 725 | if (buffered_spriteram[offs] & 0x0001) /* enable */ |
| 768 | 726 | { |
| 769 | | int sx, sy, code, color, pri; |
| 770 | | int flipx = 0, flipy = 0, width, height, x, y; |
| 771 | | |
| 772 | | sx = buffered_spriteram[offs+4] & 0x01ff; |
| 773 | | sy = (INT16)buffered_spriteram[offs+6] & 0x01ff; |
| 774 | | if (sy & 0x0100) sy |= ~(int)0x01ff; // Correctly sign-extend 9-bit number |
| 775 | | code = buffered_spriteram[offs+3]; |
| 776 | | color = buffered_spriteram[offs+7] & 0x000f; |
| 727 | int code = buffered_spriteram[offs+3]; |
| 728 | int const color = buffered_spriteram[offs+7] & 0x000f; |
| 777 | 729 | //TODO: This priority mechanism works for known games, but seems a bit strange. |
| 778 | 730 | //Are we missing something? (The obvious spare palette bit isn't it.) |
| 779 | | pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); |
| 780 | | width = buffered_spriteram[offs+1] & 0x000f; |
| 781 | | height = (buffered_spriteram[offs+1] & 0x00f0) >> 4; |
| 731 | int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); |
| 732 | int const width = buffered_spriteram[offs+1] & 0x000f; |
| 733 | int const height = (buffered_spriteram[offs+1] & 0x00f0) >> 4; |
| 782 | 734 | |
| 783 | | if (flip_screen()) |
| 735 | bool const flip = flip_screen(); |
| 736 | int sx = buffered_spriteram[offs+4] & 0x01ff; |
| 737 | int sy = (INT16)buffered_spriteram[offs+6] & 0x01ff; |
| 738 | if (sy & 0x0100) sy |= ~(int)0x01ff; // Correctly sign-extend 9-bit number |
| 739 | if (flip) |
| 784 | 740 | { |
| 785 | 741 | sx = 498 - (16 * width) - sx; |
| 786 | 742 | sy = 240 - (16 * height) - sy; |
| 787 | | flipx = !flipx; |
| 788 | | flipy = !flipy; |
| 789 | 743 | } |
| 790 | 744 | |
| 791 | | for (y = 0; y <= height; y++) |
| 745 | for (int y = 0; y <= height; y++) |
| 792 | 746 | { |
| 793 | | int _y = sy + (16 * (flipy ? (height - y) : y)); |
| 794 | | for (x = 0; x <= width; x++) |
| 747 | int const _y = sy + (16 * (flip ? (height - y) : y)); |
| 748 | for (int x = 0; x <= width; x++) |
| 795 | 749 | { |
| 796 | | int _x = sx + (16 * (flipx ? (width - x) : x)); |
| 750 | int const _x = sx + (16 * (flip ? (width - x) : x)); |
| 797 | 751 | m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, |
| 798 | 752 | code, |
| 799 | 753 | color, |
| 800 | | flipx, flipy, |
| 754 | flip, flip, |
| 801 | 755 | _x, _y, |
| 802 | 756 | screen.priority(), |
| 803 | 757 | pri, 15); |
| r241912 | r241913 | |
| 819 | 773 | m_fg2_tilemap->draw(screen, bitmap, cliprect, 0, 2); |
| 820 | 774 | |
| 821 | 775 | draw_sprites(screen, bitmap, cliprect); |
| 776 | |
| 822 | 777 | return 0; |
| 823 | 778 | } |
| 824 | 779 | |
| r241912 | r241913 | |
| 830 | 785 | m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1); |
| 831 | 786 | |
| 832 | 787 | draw_sprites(screen, bitmap, cliprect); |
| 788 | |
| 833 | 789 | return 0; |
| 834 | 790 | } |
| 835 | 791 | |
| r241912 | r241913 | |
| 851 | 807 | m_fg2_gfx = 1; |
| 852 | 808 | |
| 853 | 809 | /* Create tilemaps */ |
| 854 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 810 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 855 | 811 | 16, 16, 64, 32); |
| 856 | | m_bg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::get_bg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 812 | m_bg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_bg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 857 | 813 | 16, 16, 64, 32); |
| 858 | | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 814 | m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_fg_tile_info),this), TILEMAP_SCAN_COLS, |
| 859 | 815 | 16, 16, 64, 32); |
| 860 | | m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::get_fg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 816 | m_fg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::rshark_get_fg2_tile_info),this), TILEMAP_SCAN_COLS, |
| 861 | 817 | 16, 16, 64, 32); |
| 862 | 818 | |
| 863 | 819 | /* Configure tilemap transparency */ |
| r241912 | r241913 | |
| 882 | 838 | { |
| 883 | 839 | /* Configure tilemap callbacks */ |
| 884 | 840 | m_bg_tilerom = memregion("gfx2")->base(); |
| 885 | | m_bg_tilerom2 = NULL; |
| 886 | 841 | m_bg_gfx = 1; |
| 887 | 842 | |
| 888 | 843 | /* Create tilemaps */ |
| 889 | | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_68k_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 844 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dooyong_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, |
| 890 | 845 | 32, 32, 32, 8); |
| 891 | 846 | m_bg2_tilemap = m_fg_tilemap = m_fg2_tilemap = NULL; /* Stop scroll handler from crashing on these */ |
| 892 | 847 | |