trunk/src/mame/video/cave.c
| r24767 | r24768 | |
| 57 | 57 | |
| 58 | 58 | #define SWAP(X,Y) { int temp = X; X = Y; Y = temp; } |
| 59 | 59 | |
| 60 | | static void sprite_init_cave(running_machine &machine); |
| 61 | | static void sprite_draw_cave(running_machine &machine, int priority); |
| 62 | | static void sprite_draw_cave_zbuf(running_machine &machine, int priority); |
| 63 | | static void sprite_draw_donpachi(running_machine &machine, int priority); |
| 64 | | static void sprite_draw_donpachi_zbuf(running_machine &machine, int priority); |
| 65 | 60 | |
| 66 | 61 | /*************************************************************************** |
| 67 | 62 | |
| r24767 | r24768 | |
| 178 | 173 | } |
| 179 | 174 | |
| 180 | 175 | |
| 181 | | static void set_pens( running_machine &machine ) |
| 176 | void cave_state::set_pens() |
| 182 | 177 | { |
| 183 | | cave_state *state = machine.driver_data<cave_state>(); |
| 184 | 178 | int pen; |
| 185 | 179 | |
| 186 | | for (pen = 0; pen < machine.total_colors(); pen++) |
| 180 | for (pen = 0; pen < machine().total_colors(); pen++) |
| 187 | 181 | { |
| 188 | | UINT16 data = state->m_paletteram[state->m_palette_map[pen]]; |
| 182 | UINT16 data = m_paletteram[m_palette_map[pen]]; |
| 189 | 183 | |
| 190 | 184 | rgb_t color = MAKE_RGB(pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0)); |
| 191 | 185 | |
| 192 | | palette_set_color(machine, pen, color); |
| 186 | palette_set_color(machine(), pen, color); |
| 193 | 187 | } |
| 194 | 188 | } |
| 195 | 189 | |
| r24767 | r24768 | |
| 293 | 287 | } |
| 294 | 288 | |
| 295 | 289 | |
| 296 | | INLINE void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) |
| 290 | inline void cave_state::vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) |
| 297 | 291 | { |
| 298 | | cave_state *state = space.machine().driver_data<cave_state>(); |
| 299 | | UINT16 *VRAM = state->m_vram[GFX]; |
| 300 | | tilemap_t *TILEMAP = state->m_tilemap[GFX]; |
| 292 | UINT16 *VRAM = m_vram[GFX]; |
| 293 | tilemap_t *TILEMAP = m_tilemap[GFX]; |
| 301 | 294 | |
| 302 | 295 | if ((VRAM[offset] & mem_mask) == (data & mem_mask)) |
| 303 | 296 | return; |
| r24767 | r24768 | |
| 321 | 314 | and 408000-407fff both go to the 8x8 tilemap ram. Use this function |
| 322 | 315 | in this cases. Note that the get_tile_info function looks in the |
| 323 | 316 | 4000-7fff range for tiles, so we have to write the data there. */ |
| 324 | | INLINE void vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) |
| 317 | inline void cave_state::vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) |
| 325 | 318 | { |
| 326 | | cave_state *state = space.machine().driver_data<cave_state>(); |
| 327 | | UINT16 *VRAM = state->m_vram[GFX]; |
| 328 | | tilemap_t *TILEMAP = state->m_tilemap[GFX]; |
| 319 | UINT16 *VRAM = m_vram[GFX]; |
| 320 | tilemap_t *TILEMAP = m_tilemap[GFX]; |
| 329 | 321 | |
| 330 | 322 | offset %= 0x4000 / 2; |
| 331 | 323 | if ((VRAM[offset] & mem_mask) == (data & mem_mask)) |
| r24767 | r24768 | |
| 362 | 354 | |
| 363 | 355 | ***************************************************************************/ |
| 364 | 356 | |
| 365 | | static void cave_vh_start( running_machine &machine, int num ) |
| 357 | void cave_state::cave_vh_start( int num ) |
| 366 | 358 | { |
| 367 | | cave_state *state = machine.driver_data<cave_state>(); |
| 359 | assert(m_palette_map != NULL); |
| 368 | 360 | |
| 369 | | assert(state->m_palette_map != NULL); |
| 361 | m_tilemap[0] = 0; |
| 362 | m_tilemap[1] = 0; |
| 363 | m_tilemap[2] = 0; |
| 364 | m_tilemap[3] = 0; |
| 370 | 365 | |
| 371 | | state->m_tilemap[0] = 0; |
| 372 | | state->m_tilemap[1] = 0; |
| 373 | | state->m_tilemap[2] = 0; |
| 374 | | state->m_tilemap[3] = 0; |
| 366 | m_tiledim[0] = 0; |
| 367 | m_tiledim[1] = 0; |
| 368 | m_tiledim[2] = 0; |
| 369 | m_tiledim[3] = 0; |
| 375 | 370 | |
| 376 | | state->m_tiledim[0] = 0; |
| 377 | | state->m_tiledim[1] = 0; |
| 378 | | state->m_tiledim[2] = 0; |
| 379 | | state->m_tiledim[3] = 0; |
| 371 | m_old_tiledim[0] = 0; |
| 372 | m_old_tiledim[1] = 0; |
| 373 | m_old_tiledim[2] = 0; |
| 374 | m_old_tiledim[3] = 0; |
| 380 | 375 | |
| 381 | | state->m_old_tiledim[0] = 0; |
| 382 | | state->m_old_tiledim[1] = 0; |
| 383 | | state->m_old_tiledim[2] = 0; |
| 384 | | state->m_old_tiledim[3] = 0; |
| 385 | | |
| 386 | 376 | assert((num >= 1) && (num <= 4)); |
| 387 | 377 | |
| 388 | 378 | switch (num) |
| 389 | 379 | { |
| 390 | 380 | case 4: |
| 391 | | state->m_tilemap[3] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 392 | | state->m_tilemap[3]->set_transparent_pen(0); |
| 393 | | state->m_tilemap[3]->set_scroll_rows(1); |
| 394 | | state->m_tilemap[3]->set_scroll_cols(1); |
| 395 | | state->save_item(NAME(state->m_tiledim[3])); |
| 396 | | state->save_item(NAME(state->m_old_tiledim[3])); |
| 381 | m_tilemap[3] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 382 | m_tilemap[3]->set_transparent_pen(0); |
| 383 | m_tilemap[3]->set_scroll_rows(1); |
| 384 | m_tilemap[3]->set_scroll_cols(1); |
| 385 | save_item(NAME(m_tiledim[3])); |
| 386 | save_item(NAME(m_old_tiledim[3])); |
| 397 | 387 | |
| 398 | 388 | case 3: |
| 399 | | state->m_tilemap[2] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 400 | | state->m_tilemap[2]->set_transparent_pen(0); |
| 401 | | state->m_tilemap[2]->set_scroll_rows(1); |
| 402 | | state->m_tilemap[2]->set_scroll_cols(1); |
| 403 | | state->save_item(NAME(state->m_tiledim[2])); |
| 404 | | state->save_item(NAME(state->m_old_tiledim[2])); |
| 389 | m_tilemap[2] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 390 | m_tilemap[2]->set_transparent_pen(0); |
| 391 | m_tilemap[2]->set_scroll_rows(1); |
| 392 | m_tilemap[2]->set_scroll_cols(1); |
| 393 | save_item(NAME(m_tiledim[2])); |
| 394 | save_item(NAME(m_old_tiledim[2])); |
| 405 | 395 | |
| 406 | 396 | case 2: |
| 407 | | state->m_tilemap[1] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 408 | | state->m_tilemap[1]->set_transparent_pen(0); |
| 409 | | state->m_tilemap[1]->set_scroll_rows(1); |
| 410 | | state->m_tilemap[1]->set_scroll_cols(1); |
| 411 | | state->save_item(NAME(state->m_tiledim[1])); |
| 412 | | state->save_item(NAME(state->m_old_tiledim[1])); |
| 397 | m_tilemap[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 398 | m_tilemap[1]->set_transparent_pen(0); |
| 399 | m_tilemap[1]->set_scroll_rows(1); |
| 400 | m_tilemap[1]->set_scroll_cols(1); |
| 401 | save_item(NAME(m_tiledim[1])); |
| 402 | save_item(NAME(m_old_tiledim[1])); |
| 413 | 403 | |
| 414 | 404 | case 1: |
| 415 | | state->m_tilemap[0] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 416 | | state->m_tilemap[0]->set_transparent_pen(0); |
| 417 | | state->m_tilemap[0]->set_scroll_rows(1); |
| 418 | | state->m_tilemap[0]->set_scroll_cols(1); |
| 419 | | state->save_item(NAME(state->m_tiledim[0])); |
| 420 | | state->save_item(NAME(state->m_old_tiledim[0])); |
| 405 | m_tilemap[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); |
| 406 | m_tilemap[0]->set_transparent_pen(0); |
| 407 | m_tilemap[0]->set_scroll_rows(1); |
| 408 | m_tilemap[0]->set_scroll_cols(1); |
| 409 | save_item(NAME(m_tiledim[0])); |
| 410 | save_item(NAME(m_old_tiledim[0])); |
| 421 | 411 | |
| 422 | 412 | break; |
| 423 | 413 | } |
| 424 | 414 | |
| 425 | | sprite_init_cave(machine); |
| 415 | sprite_init_cave(); |
| 426 | 416 | |
| 427 | | state->m_layers_offs_x = 0x13; |
| 428 | | state->m_layers_offs_y = -0x12; |
| 417 | m_layers_offs_x = 0x13; |
| 418 | m_layers_offs_y = -0x12; |
| 429 | 419 | |
| 430 | | state->m_row_effect_offs_n = -1; |
| 431 | | state->m_row_effect_offs_f = 1; |
| 420 | m_row_effect_offs_n = -1; |
| 421 | m_row_effect_offs_f = 1; |
| 432 | 422 | |
| 433 | | state->m_background_color = machine.config().m_gfxdecodeinfo[0].color_codes_start + |
| 434 | | (machine.config().m_gfxdecodeinfo[0].total_color_codes - 1) * |
| 435 | | machine.gfx[0]->granularity(); |
| 423 | m_background_color = machine().config().m_gfxdecodeinfo[0].color_codes_start + |
| 424 | (machine().config().m_gfxdecodeinfo[0].total_color_codes - 1) * |
| 425 | machine().gfx[0]->granularity(); |
| 436 | 426 | |
| 437 | | switch (state->m_kludge) |
| 427 | switch (m_kludge) |
| 438 | 428 | { |
| 439 | 429 | case 1: /* sailormn */ |
| 440 | | state->m_row_effect_offs_n = -1; |
| 441 | | state->m_row_effect_offs_f = -1; |
| 430 | m_row_effect_offs_n = -1; |
| 431 | m_row_effect_offs_f = -1; |
| 442 | 432 | break; |
| 443 | 433 | case 2: /* uopoko dfeveron */ |
| 444 | | state->m_background_color = 0x3f00; |
| 434 | m_background_color = 0x3f00; |
| 445 | 435 | break; |
| 446 | 436 | case 4: /* pwrinst2 */ |
| 447 | | state->m_background_color = 0x7f00; |
| 448 | | state->m_layers_offs_y++; |
| 437 | m_background_color = 0x7f00; |
| 438 | m_layers_offs_y++; |
| 449 | 439 | break; |
| 450 | 440 | } |
| 451 | 441 | } |
| 452 | 442 | |
| 453 | | VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(machine(), 1); } |
| 454 | | VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(machine(), 2); } |
| 455 | | VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(machine(), 3); } |
| 456 | | VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(machine(), 4); } |
| 443 | VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(1); } |
| 444 | VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(2); } |
| 445 | VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(3); } |
| 446 | VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(4); } |
| 457 | 447 | |
| 458 | 448 | |
| 459 | 449 | VIDEO_START_MEMBER(cave_state,sailormn_3_layers) |
| 460 | 450 | { |
| 461 | | cave_vh_start(machine(), 2); |
| 451 | cave_vh_start(2); |
| 462 | 452 | |
| 463 | 453 | /* Layer 2 (8x8) needs to be handled differently */ |
| 464 | 454 | m_tilemap[2] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::sailormn_get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8 ); |
| r24767 | r24768 | |
| 500 | 490 | |
| 501 | 491 | ***************************************************************************/ |
| 502 | 492 | |
| 503 | | static void get_sprite_info_cave( running_machine &machine ) |
| 493 | void cave_state::get_sprite_info_cave() |
| 504 | 494 | { |
| 505 | | cave_state *state = machine.driver_data<cave_state>(); |
| 506 | 495 | pen_t base_pal = 0; |
| 507 | | const UINT8 *base_gfx = state->memregion("sprites")->base(); |
| 508 | | int code_max = state->memregion("sprites")->bytes() / (16*16); |
| 496 | const UINT8 *base_gfx = memregion("sprites")->base(); |
| 497 | int code_max = memregion("sprites")->bytes() / (16*16); |
| 509 | 498 | |
| 510 | 499 | UINT16 *source; |
| 511 | 500 | UINT16 *finish; |
| 512 | | struct sprite_cave *sprite = state->m_sprite; |
| 501 | struct sprite_cave *sprite = m_sprite; |
| 513 | 502 | |
| 514 | | int glob_flipx = state->m_videoregs[0] & 0x8000; |
| 515 | | int glob_flipy = state->m_videoregs[1] & 0x8000; |
| 503 | int glob_flipx = m_videoregs[0] & 0x8000; |
| 504 | int glob_flipy = m_videoregs[1] & 0x8000; |
| 516 | 505 | |
| 517 | | int max_x = machine.primary_screen->width(); |
| 518 | | int max_y = machine.primary_screen->height(); |
| 506 | int max_x = m_screen->width(); |
| 507 | int max_y = m_screen->height(); |
| 519 | 508 | |
| 520 | | source = state->m_spriteram + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; |
| 509 | source = m_spriteram + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank; |
| 521 | 510 | |
| 522 | | if (state->m_videoregs[4] & 0x02) |
| 523 | | if (state->m_spriteram_2) |
| 524 | | source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; |
| 511 | if (m_videoregs[4] & 0x02) |
| 512 | if (m_spriteram_2) |
| 513 | source = m_spriteram_2 + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank; |
| 525 | 514 | |
| 526 | | finish = source + ((state->m_spriteram.bytes() / 2) / 2); |
| 515 | finish = source + ((m_spriteram.bytes() / 2) / 2); |
| 527 | 516 | |
| 528 | 517 | |
| 529 | 518 | for (; source < finish; source += 8) |
| r24767 | r24768 | |
| 531 | 520 | int x, y, attr, code, zoomx, zoomy, size, flipx, flipy; |
| 532 | 521 | int total_width_f, total_height_f; |
| 533 | 522 | |
| 534 | | if (state->m_spritetype[0] == 2) /* Hot Dog Storm */ |
| 523 | if (m_spritetype[0] == 2) /* Hot Dog Storm */ |
| 535 | 524 | { |
| 536 | 525 | x = (source[0] & 0x3ff) << 8; |
| 537 | 526 | y = (source[1] & 0x3ff) << 8; |
| r24767 | r24768 | |
| 589 | 578 | sprite->ycount0 = sprite->zoomy_re - 1; |
| 590 | 579 | } |
| 591 | 580 | |
| 592 | | if (state->m_spritetype[0] == 2) |
| 581 | if (m_spritetype[0] == 2) |
| 593 | 582 | { |
| 594 | 583 | x >>= 8; |
| 595 | 584 | y >>= 8; |
| r24767 | r24768 | |
| 626 | 615 | |
| 627 | 616 | sprite++; |
| 628 | 617 | } |
| 629 | | state->m_num_sprites = sprite - state->m_sprite; |
| 618 | m_num_sprites = sprite - m_sprite; |
| 630 | 619 | } |
| 631 | 620 | |
| 632 | | static void get_sprite_info_donpachi( running_machine &machine ) |
| 621 | void cave_state::get_sprite_info_donpachi() |
| 633 | 622 | { |
| 634 | | cave_state *state = machine.driver_data<cave_state>(); |
| 635 | 623 | pen_t base_pal = 0; |
| 636 | | const UINT8 *base_gfx = state->memregion("sprites")->base(); |
| 637 | | int code_max = state->memregion("sprites")->bytes() / (16*16); |
| 624 | const UINT8 *base_gfx = memregion("sprites")->base(); |
| 625 | int code_max = memregion("sprites")->bytes() / (16*16); |
| 638 | 626 | |
| 639 | 627 | UINT16 *source; |
| 640 | 628 | UINT16 *finish; |
| 641 | 629 | |
| 642 | | struct sprite_cave *sprite = state->m_sprite; |
| 630 | struct sprite_cave *sprite = m_sprite; |
| 643 | 631 | |
| 644 | | int glob_flipx = state->m_videoregs[0] & 0x8000; |
| 645 | | int glob_flipy = state->m_videoregs[1] & 0x8000; |
| 632 | int glob_flipx = m_videoregs[0] & 0x8000; |
| 633 | int glob_flipy = m_videoregs[1] & 0x8000; |
| 646 | 634 | |
| 647 | | int max_x = machine.primary_screen->width(); |
| 648 | | int max_y = machine.primary_screen->height(); |
| 635 | int max_x = m_screen->width(); |
| 636 | int max_y = m_screen->height(); |
| 649 | 637 | |
| 650 | | source = state->m_spriteram + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; |
| 638 | source = m_spriteram + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank; |
| 651 | 639 | |
| 652 | | if (state->m_videoregs[4] & 0x02) |
| 653 | | if (state->m_spriteram_2) |
| 654 | | source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; |
| 640 | if (m_videoregs[4] & 0x02) |
| 641 | if (m_spriteram_2) |
| 642 | source = m_spriteram_2 + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank; |
| 655 | 643 | |
| 656 | | finish = source + ((state->m_spriteram.bytes() / 2) / 2); |
| 644 | finish = source + ((m_spriteram.bytes() / 2) / 2); |
| 657 | 645 | |
| 658 | 646 | for (; source < finish; source += 8) |
| 659 | 647 | { |
| r24767 | r24768 | |
| 663 | 651 | code = source[1] + ((attr & 3) << 16); |
| 664 | 652 | x = source[2] & 0x3ff; |
| 665 | 653 | |
| 666 | | if (state->m_spritetype[0] == 3) /* pwrinst2 */ |
| 654 | if (m_spritetype[0] == 3) /* pwrinst2 */ |
| 667 | 655 | y = (source[3] + 1) & 0x3ff; |
| 668 | 656 | else |
| 669 | 657 | y = source[3] & 0x3ff; |
| r24767 | r24768 | |
| 687 | 675 | flipx = attr & 0x0008; |
| 688 | 676 | flipy = attr & 0x0004; |
| 689 | 677 | |
| 690 | | if (state->m_spritetype[0] == 3) /* pwrinst2 */ |
| 678 | if (m_spritetype[0] == 3) /* pwrinst2 */ |
| 691 | 679 | { |
| 692 | 680 | sprite->priority = ((attr & 0x0010) >> 4) + 2; |
| 693 | 681 | sprite->base_pen = base_pal + (attr & 0x3f00) + 0x4000 * ((attr & 0x0020) >> 5); |
| r24767 | r24768 | |
| 712 | 700 | |
| 713 | 701 | sprite++; |
| 714 | 702 | } |
| 715 | | state->m_num_sprites = sprite - state->m_sprite; |
| 703 | m_num_sprites = sprite - m_sprite; |
| 716 | 704 | } |
| 717 | 705 | |
| 718 | 706 | |
| 719 | | static void sprite_init_cave( running_machine &machine ) |
| 707 | void cave_state::sprite_init_cave() |
| 720 | 708 | { |
| 721 | | cave_state *state = machine.driver_data<cave_state>(); |
| 722 | | |
| 723 | | if (state->m_spritetype[0] == 0 || state->m_spritetype[0] == 2) // most of the games |
| 709 | if (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games |
| 724 | 710 | { |
| 725 | | state->m_get_sprite_info = get_sprite_info_cave; |
| 726 | | state->m_spritetype[1] = CAVE_SPRITETYPE_ZOOM; |
| 711 | m_get_sprite_info = &cave_state::get_sprite_info_cave; |
| 712 | m_spritetype[1] = CAVE_SPRITETYPE_ZOOM; |
| 727 | 713 | } |
| 728 | 714 | else // donpachi ddonpach |
| 729 | 715 | { |
| 730 | | state->m_get_sprite_info = get_sprite_info_donpachi; |
| 731 | | state->m_spritetype[1] = 0; |
| 716 | m_get_sprite_info = &cave_state::get_sprite_info_donpachi; |
| 717 | m_spritetype[1] = 0; |
| 732 | 718 | } |
| 733 | 719 | |
| 734 | | state->m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; |
| 735 | | machine.primary_screen->register_screen_bitmap(state->m_sprite_zbuf); |
| 720 | m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; |
| 721 | m_screen->register_screen_bitmap(m_sprite_zbuf); |
| 736 | 722 | |
| 737 | | state->m_num_sprites = state->m_spriteram.bytes() / 0x10 / 2; |
| 738 | | state->m_sprite = auto_alloc_array_clear(machine, struct sprite_cave, state->m_num_sprites); |
| 723 | m_num_sprites = m_spriteram.bytes() / 0x10 / 2; |
| 724 | m_sprite = auto_alloc_array_clear(machine(), struct sprite_cave, m_num_sprites); |
| 739 | 725 | |
| 740 | | memset(state->m_sprite_table, 0, sizeof(state->m_sprite_table)); |
| 741 | | state->m_sprite_draw = sprite_draw_donpachi; |
| 726 | memset(m_sprite_table, 0, sizeof(m_sprite_table)); |
| 727 | m_sprite_draw = &cave_state::sprite_draw_donpachi; |
| 742 | 728 | |
| 743 | | state->save_item(NAME(state->m_sprite_zbuf)); |
| 744 | | state->save_item(NAME(state->m_sprite_zbuf_baseval)); |
| 745 | | state->save_item(NAME(state->m_num_sprites)); |
| 746 | | state->save_item(NAME(state->m_spriteram_bank)); |
| 747 | | state->save_item(NAME(state->m_spriteram_bank_delay)); |
| 729 | save_item(NAME(m_sprite_zbuf)); |
| 730 | save_item(NAME(m_sprite_zbuf_baseval)); |
| 731 | save_item(NAME(m_num_sprites)); |
| 732 | save_item(NAME(m_spriteram_bank)); |
| 733 | save_item(NAME(m_spriteram_bank_delay)); |
| 748 | 734 | |
| 749 | | state->save_item(NAME(state->m_blit.clip_left)); |
| 750 | | state->save_item(NAME(state->m_blit.clip_right)); |
| 751 | | state->save_item(NAME(state->m_blit.clip_top)); |
| 752 | | state->save_item(NAME(state->m_blit.clip_bottom)); |
| 735 | save_item(NAME(m_blit.clip_left)); |
| 736 | save_item(NAME(m_blit.clip_right)); |
| 737 | save_item(NAME(m_blit.clip_top)); |
| 738 | save_item(NAME(m_blit.clip_bottom)); |
| 753 | 739 | |
| 754 | | machine.save().register_postload(save_prepost_delegate(FUNC(cave_state::cave_get_sprite_info), state)); |
| 740 | machine().save().register_postload(save_prepost_delegate(FUNC(cave_state::cave_get_sprite_info), this)); |
| 755 | 741 | } |
| 756 | 742 | |
| 757 | | static void cave_sprite_check( screen_device &screen, const rectangle &clip ) |
| 743 | void cave_state::cave_sprite_check(screen_device &screen, const rectangle &clip) |
| 758 | 744 | { |
| 759 | | cave_state *state = screen.machine().driver_data<cave_state>(); |
| 760 | | |
| 761 | 745 | { /* set clip */ |
| 762 | 746 | int left = clip.min_x; |
| 763 | 747 | int top = clip.min_y; |
| 764 | 748 | int right = clip.max_x + 1; |
| 765 | 749 | int bottom = clip.max_y + 1; |
| 766 | 750 | |
| 767 | | state->m_blit.clip_left = left; |
| 768 | | state->m_blit.clip_top = top; |
| 769 | | state->m_blit.clip_right = right; |
| 770 | | state->m_blit.clip_bottom = bottom; |
| 751 | m_blit.clip_left = left; |
| 752 | m_blit.clip_top = top; |
| 753 | m_blit.clip_right = right; |
| 754 | m_blit.clip_bottom = bottom; |
| 771 | 755 | } |
| 772 | 756 | |
| 773 | 757 | { /* check priority & sprite type */ |
| 774 | | struct sprite_cave *sprite = state->m_sprite; |
| 775 | | const struct sprite_cave *finish = &sprite[state->m_num_sprites]; |
| 758 | struct sprite_cave *sprite = m_sprite; |
| 759 | const struct sprite_cave *finish = &sprite[m_num_sprites]; |
| 776 | 760 | int i[4] = {0,0,0,0}; |
| 777 | 761 | int priority_check = 0; |
| 778 | | int spritetype = state->m_spritetype[1]; |
| 762 | int spritetype = m_spritetype[1]; |
| 779 | 763 | const rectangle &visarea = screen.visible_area(); |
| 780 | 764 | |
| 781 | 765 | while (sprite < finish) |
| 782 | 766 | { |
| 783 | | if (sprite->x + sprite->total_width > state->m_blit.clip_left && sprite->x < state->m_blit.clip_right && |
| 784 | | sprite->y + sprite->total_height > state->m_blit.clip_top && sprite->y < state->m_blit.clip_bottom ) |
| 767 | if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right && |
| 768 | sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom ) |
| 785 | 769 | { |
| 786 | | state->m_sprite_table[sprite->priority][i[sprite->priority]++] = sprite; |
| 770 | m_sprite_table[sprite->priority][i[sprite->priority]++] = sprite; |
| 787 | 771 | |
| 788 | 772 | if(!(spritetype & CAVE_SPRITETYPE_ZBUF)) |
| 789 | 773 | { |
| r24767 | r24768 | |
| 796 | 780 | sprite++; |
| 797 | 781 | } |
| 798 | 782 | |
| 799 | | state->m_sprite_table[0][i[0]] = 0; |
| 800 | | state->m_sprite_table[1][i[1]] = 0; |
| 801 | | state->m_sprite_table[2][i[2]] = 0; |
| 802 | | state->m_sprite_table[3][i[3]] = 0; |
| 783 | m_sprite_table[0][i[0]] = 0; |
| 784 | m_sprite_table[1][i[1]] = 0; |
| 785 | m_sprite_table[2][i[2]] = 0; |
| 786 | m_sprite_table[3][i[3]] = 0; |
| 803 | 787 | |
| 804 | 788 | switch (spritetype) |
| 805 | 789 | { |
| 806 | 790 | case CAVE_SPRITETYPE_ZOOM: |
| 807 | | state->m_sprite_draw = sprite_draw_cave; |
| 791 | m_sprite_draw = &cave_state::sprite_draw_cave; |
| 808 | 792 | break; |
| 809 | 793 | |
| 810 | 794 | case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF: |
| 811 | | state->m_sprite_draw = sprite_draw_cave_zbuf; |
| 795 | m_sprite_draw = &cave_state::sprite_draw_cave_zbuf; |
| 812 | 796 | if (clip.min_y == visarea.min_y) |
| 813 | 797 | { |
| 814 | | if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) |
| 815 | | state->m_sprite_zbuf.fill(0, visarea); |
| 798 | if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) |
| 799 | m_sprite_zbuf.fill(0, visarea); |
| 816 | 800 | } |
| 817 | 801 | break; |
| 818 | 802 | |
| 819 | 803 | case CAVE_SPRITETYPE_ZBUF: |
| 820 | | state->m_sprite_draw = sprite_draw_donpachi_zbuf; |
| 804 | m_sprite_draw = &cave_state::sprite_draw_donpachi_zbuf; |
| 821 | 805 | if (clip.min_y == visarea.min_y) |
| 822 | 806 | { |
| 823 | | if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) |
| 824 | | state->m_sprite_zbuf.fill(0, visarea); |
| 807 | if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) |
| 808 | m_sprite_zbuf.fill(0, visarea); |
| 825 | 809 | } |
| 826 | 810 | break; |
| 827 | 811 | |
| 828 | 812 | default: |
| 829 | 813 | case 0: |
| 830 | | state->m_sprite_draw = sprite_draw_donpachi; |
| 814 | m_sprite_draw = &cave_state::sprite_draw_donpachi; |
| 831 | 815 | } |
| 832 | 816 | } |
| 833 | 817 | } |
| 834 | 818 | |
| 835 | | static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_cave *sprite ) |
| 819 | void cave_state::do_blit_zoom16_cave(const struct sprite_cave *sprite) |
| 836 | 820 | { |
| 837 | 821 | /* assumes SPRITE_LIST_RAW_DATA flag is set */ |
| 838 | | cave_state *state = machine.driver_data<cave_state>(); |
| 839 | 822 | int x1, x2, y1, y2, dx, dy; |
| 840 | 823 | int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; |
| 841 | 824 | |
| r24767 | r24768 | |
| 844 | 827 | x2 = sprite->x; |
| 845 | 828 | x1 = x2 + sprite->total_width; |
| 846 | 829 | dx = -1; |
| 847 | | if (x2 < state->m_blit.clip_left) |
| 848 | | x2 = state->m_blit.clip_left; |
| 830 | if (x2 < m_blit.clip_left) |
| 831 | x2 = m_blit.clip_left; |
| 849 | 832 | |
| 850 | | if (x1 > state->m_blit.clip_right) |
| 833 | if (x1 > m_blit.clip_right) |
| 851 | 834 | { |
| 852 | | xcount0 += (x1 - state->m_blit.clip_right) * sprite->zoomx_re; |
| 853 | | x1 = state->m_blit.clip_right; |
| 835 | xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; |
| 836 | x1 = m_blit.clip_right; |
| 854 | 837 | while ((xcount0 & 0xffff) >= sprite->zoomx_re) |
| 855 | 838 | { |
| 856 | 839 | xcount0 += sprite->zoomx_re; |
| r24767 | r24768 | |
| 867 | 850 | x1 = sprite->x; |
| 868 | 851 | x2 = x1 + sprite->total_width; |
| 869 | 852 | dx = 1; |
| 870 | | if (x1 < state->m_blit.clip_left) |
| 853 | if (x1 < m_blit.clip_left) |
| 871 | 854 | { |
| 872 | | xcount0 += (state->m_blit.clip_left - x1) * sprite->zoomx_re; |
| 873 | | x1 = state->m_blit.clip_left; |
| 855 | xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; |
| 856 | x1 = m_blit.clip_left; |
| 874 | 857 | while ((xcount0 & 0xffff) >= sprite->zoomx_re) |
| 875 | 858 | { |
| 876 | 859 | xcount0 += sprite->zoomx_re; |
| 877 | 860 | x1++; |
| 878 | 861 | } |
| 879 | 862 | } |
| 880 | | if (x2 > state->m_blit.clip_right) |
| 881 | | x2 = state->m_blit.clip_right; |
| 863 | if (x2 > m_blit.clip_right) |
| 864 | x2 = m_blit.clip_right; |
| 882 | 865 | if (x1 >= x2) |
| 883 | 866 | return; |
| 884 | 867 | } |
| r24767 | r24768 | |
| 888 | 871 | y2 = sprite->y; |
| 889 | 872 | y1 = y2 + sprite->total_height; |
| 890 | 873 | dy = -1; |
| 891 | | if (y2 < state->m_blit.clip_top) |
| 892 | | y2 = state->m_blit.clip_top; |
| 893 | | if (y1 > state->m_blit.clip_bottom) |
| 874 | if (y2 < m_blit.clip_top) |
| 875 | y2 = m_blit.clip_top; |
| 876 | if (y1 > m_blit.clip_bottom) |
| 894 | 877 | { |
| 895 | | ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re; |
| 896 | | y1 = state->m_blit.clip_bottom; |
| 878 | ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; |
| 879 | y1 = m_blit.clip_bottom; |
| 897 | 880 | while ((ycount0 & 0xffff) >= sprite->zoomy_re) |
| 898 | 881 | { |
| 899 | 882 | ycount0 += sprite->zoomy_re; |
| r24767 | r24768 | |
| 909 | 892 | y1 = sprite->y; |
| 910 | 893 | y2 = y1 + sprite->total_height; |
| 911 | 894 | dy = 1; |
| 912 | | if (y1 < state->m_blit.clip_top) |
| 895 | if (y1 < m_blit.clip_top) |
| 913 | 896 | { |
| 914 | | ycount0 += (state->m_blit.clip_top - y1) * sprite->zoomy_re; |
| 915 | | y1 = state->m_blit.clip_top; |
| 897 | ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; |
| 898 | y1 = m_blit.clip_top; |
| 916 | 899 | while ((ycount0 & 0xffff) >= sprite->zoomy_re) |
| 917 | 900 | { |
| 918 | 901 | ycount0 += sprite->zoomy_re; |
| 919 | 902 | y1++; |
| 920 | 903 | } |
| 921 | 904 | } |
| 922 | | if (y2 > state->m_blit.clip_bottom ) |
| 923 | | y2 = state->m_blit.clip_bottom; |
| 905 | if (y2 > m_blit.clip_bottom ) |
| 906 | y2 = m_blit.clip_bottom; |
| 924 | 907 | if (y1 >= y2) |
| 925 | 908 | return; |
| 926 | 909 | } |
| r24767 | r24768 | |
| 930 | 913 | pen_t base_pen = sprite->base_pen; |
| 931 | 914 | int x, y; |
| 932 | 915 | UINT8 pen; |
| 933 | | int pitch = state->m_blit.line_offset * dy / 2; |
| 934 | | UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); |
| 916 | int pitch = m_blit.line_offset * dy / 2; |
| 917 | UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1); |
| 935 | 918 | int ycount = ycount0; |
| 936 | 919 | |
| 937 | 920 | for (y = y1; y != y2; y += dy) |
| r24767 | r24768 | |
| 965 | 948 | } |
| 966 | 949 | |
| 967 | 950 | |
| 968 | | static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprite_cave *sprite ) |
| 951 | void cave_state::do_blit_zoom16_cave_zb( const struct sprite_cave *sprite ) |
| 969 | 952 | { |
| 970 | 953 | /* assumes SPRITE_LIST_RAW_DATA flag is set */ |
| 971 | | cave_state *state = machine.driver_data<cave_state>(); |
| 972 | 954 | int x1, x2, y1, y2, dx, dy; |
| 973 | 955 | int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; |
| 974 | 956 | |
| r24767 | r24768 | |
| 977 | 959 | x2 = sprite->x; |
| 978 | 960 | x1 = x2 + sprite->total_width; |
| 979 | 961 | dx = -1; |
| 980 | | if (x2 < state->m_blit.clip_left) |
| 981 | | x2 = state->m_blit.clip_left; |
| 982 | | if (x1 > state->m_blit.clip_right) |
| 962 | if (x2 < m_blit.clip_left) |
| 963 | x2 = m_blit.clip_left; |
| 964 | if (x1 > m_blit.clip_right) |
| 983 | 965 | { |
| 984 | | xcount0 += (x1 - state->m_blit.clip_right) * sprite->zoomx_re; |
| 985 | | x1 = state->m_blit.clip_right; |
| 966 | xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; |
| 967 | x1 = m_blit.clip_right; |
| 986 | 968 | while ((xcount0 & 0xffff) >= sprite->zoomx_re) |
| 987 | 969 | { |
| 988 | 970 | xcount0 += sprite->zoomx_re; |
| r24767 | r24768 | |
| 998 | 980 | x1 = sprite->x; |
| 999 | 981 | x2 = x1 + sprite->total_width; |
| 1000 | 982 | dx = 1; |
| 1001 | | if (x1 < state->m_blit.clip_left) |
| 983 | if (x1 < m_blit.clip_left) |
| 1002 | 984 | { |
| 1003 | | xcount0 += (state->m_blit.clip_left - x1) * sprite->zoomx_re; |
| 1004 | | x1 = state->m_blit.clip_left; |
| 985 | xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; |
| 986 | x1 = m_blit.clip_left; |
| 1005 | 987 | while ((xcount0 & 0xffff) >= sprite->zoomx_re) |
| 1006 | 988 | { |
| 1007 | 989 | xcount0 += sprite->zoomx_re; |
| 1008 | 990 | x1++; |
| 1009 | 991 | } |
| 1010 | 992 | } |
| 1011 | | if (x2 > state->m_blit.clip_right) |
| 1012 | | x2 = state->m_blit.clip_right; |
| 993 | if (x2 > m_blit.clip_right) |
| 994 | x2 = m_blit.clip_right; |
| 1013 | 995 | if (x1 >= x2) |
| 1014 | 996 | return; |
| 1015 | 997 | } |
| r24767 | r24768 | |
| 1018 | 1000 | y2 = sprite->y; |
| 1019 | 1001 | y1 = y2 + sprite->total_height; |
| 1020 | 1002 | dy = -1; |
| 1021 | | if (y2 < state->m_blit.clip_top) |
| 1022 | | y2 = state->m_blit.clip_top; |
| 1023 | | if (y1 > state->m_blit.clip_bottom) |
| 1003 | if (y2 < m_blit.clip_top) |
| 1004 | y2 = m_blit.clip_top; |
| 1005 | if (y1 > m_blit.clip_bottom) |
| 1024 | 1006 | { |
| 1025 | | ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re; |
| 1026 | | y1 = state->m_blit.clip_bottom; |
| 1007 | ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; |
| 1008 | y1 = m_blit.clip_bottom; |
| 1027 | 1009 | while ((ycount0 & 0xffff) >= sprite->zoomy_re) |
| 1028 | 1010 | { |
| 1029 | 1011 | ycount0 += sprite->zoomy_re; |
| r24767 | r24768 | |
| 1039 | 1021 | y1 = sprite->y; |
| 1040 | 1022 | y2 = y1 + sprite->total_height; |
| 1041 | 1023 | dy = 1; |
| 1042 | | if (y1 < state->m_blit.clip_top) |
| 1024 | if (y1 < m_blit.clip_top) |
| 1043 | 1025 | { |
| 1044 | | ycount0 += (state->m_blit.clip_top - y1) * sprite->zoomy_re; |
| 1045 | | y1 = state->m_blit.clip_top; |
| 1026 | ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; |
| 1027 | y1 = m_blit.clip_top; |
| 1046 | 1028 | while ((ycount0 & 0xffff) >= sprite->zoomy_re) |
| 1047 | 1029 | { |
| 1048 | 1030 | ycount0 += sprite->zoomy_re; |
| 1049 | 1031 | y1++; |
| 1050 | 1032 | } |
| 1051 | 1033 | } |
| 1052 | | if (y2 > state->m_blit.clip_bottom) |
| 1053 | | y2 = state->m_blit.clip_bottom; |
| 1034 | if (y2 > m_blit.clip_bottom) |
| 1035 | y2 = m_blit.clip_bottom; |
| 1054 | 1036 | if (y1 >= y2) |
| 1055 | 1037 | return; |
| 1056 | 1038 | } |
| r24767 | r24768 | |
| 1060 | 1042 | pen_t base_pen = sprite->base_pen; |
| 1061 | 1043 | int x, y; |
| 1062 | 1044 | UINT8 pen; |
| 1063 | | int pitch = state->m_blit.line_offset * dy / 2; |
| 1064 | | UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); |
| 1065 | | int pitchz = state->m_blit.line_offset_zbuf * dy / 2; |
| 1066 | | UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1); |
| 1067 | | UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval; |
| 1045 | int pitch = m_blit.line_offset * dy / 2; |
| 1046 | UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1); |
| 1047 | int pitchz = m_blit.line_offset_zbuf * dy / 2; |
| 1048 | UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); |
| 1049 | UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval; |
| 1068 | 1050 | int ycount = ycount0; |
| 1069 | 1051 | |
| 1070 | 1052 | for (y = y1; y != y2; y += dy) |
| r24767 | r24768 | |
| 1101 | 1083 | } |
| 1102 | 1084 | } |
| 1103 | 1085 | |
| 1104 | | static void do_blit_16_cave( running_machine &machine, const struct sprite_cave *sprite ) |
| 1086 | void cave_state::do_blit_16_cave( const struct sprite_cave *sprite ) |
| 1105 | 1087 | { |
| 1106 | 1088 | /* assumes SPRITE_LIST_RAW_DATA flag is set */ |
| 1107 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1108 | 1089 | int x1, x2, y1, y2, dx, dy; |
| 1109 | 1090 | int xcount0 = 0, ycount0 = 0; |
| 1110 | 1091 | |
| r24767 | r24768 | |
| 1113 | 1094 | x2 = sprite->x; |
| 1114 | 1095 | x1 = x2 + sprite->total_width; |
| 1115 | 1096 | dx = -1; |
| 1116 | | if (x2 < state->m_blit.clip_left) |
| 1117 | | x2 = state->m_blit.clip_left; |
| 1118 | | if (x1 > state->m_blit.clip_right) |
| 1097 | if (x2 < m_blit.clip_left) |
| 1098 | x2 = m_blit.clip_left; |
| 1099 | if (x1 > m_blit.clip_right) |
| 1119 | 1100 | { |
| 1120 | | xcount0 = x1 - state->m_blit.clip_right; |
| 1121 | | x1 = state->m_blit.clip_right; |
| 1101 | xcount0 = x1 - m_blit.clip_right; |
| 1102 | x1 = m_blit.clip_right; |
| 1122 | 1103 | } |
| 1123 | 1104 | if (x2 >= x1) |
| 1124 | 1105 | return; |
| r24767 | r24768 | |
| 1129 | 1110 | x1 = sprite->x; |
| 1130 | 1111 | x2 = x1 + sprite->total_width; |
| 1131 | 1112 | dx = 1; |
| 1132 | | if (x1 < state->m_blit.clip_left) |
| 1113 | if (x1 < m_blit.clip_left) |
| 1133 | 1114 | { |
| 1134 | | xcount0 = state->m_blit.clip_left - x1; |
| 1135 | | x1 = state->m_blit.clip_left; |
| 1115 | xcount0 = m_blit.clip_left - x1; |
| 1116 | x1 = m_blit.clip_left; |
| 1136 | 1117 | } |
| 1137 | | if (x2 > state->m_blit.clip_right) |
| 1138 | | x2 = state->m_blit.clip_right; |
| 1118 | if (x2 > m_blit.clip_right) |
| 1119 | x2 = m_blit.clip_right; |
| 1139 | 1120 | if (x1 >= x2) |
| 1140 | 1121 | return; |
| 1141 | 1122 | } |
| r24767 | r24768 | |
| 1144 | 1125 | y2 = sprite->y; |
| 1145 | 1126 | y1 = y2 + sprite->total_height; |
| 1146 | 1127 | dy = -1; |
| 1147 | | if (y2 < state->m_blit.clip_top) |
| 1148 | | y2 = state->m_blit.clip_top; |
| 1149 | | if (y1 > state->m_blit.clip_bottom) |
| 1128 | if (y2 < m_blit.clip_top) |
| 1129 | y2 = m_blit.clip_top; |
| 1130 | if (y1 > m_blit.clip_bottom) |
| 1150 | 1131 | { |
| 1151 | | ycount0 = y1 - state->m_blit.clip_bottom; |
| 1152 | | y1 = state->m_blit.clip_bottom; |
| 1132 | ycount0 = y1 - m_blit.clip_bottom; |
| 1133 | y1 = m_blit.clip_bottom; |
| 1153 | 1134 | } |
| 1154 | 1135 | if (y2 >= y1) |
| 1155 | 1136 | return; |
| r24767 | r24768 | |
| 1159 | 1140 | y1 = sprite->y; |
| 1160 | 1141 | y2 = y1 + sprite->total_height; |
| 1161 | 1142 | dy = 1; |
| 1162 | | if (y1 < state->m_blit.clip_top ) |
| 1143 | if (y1 < m_blit.clip_top ) |
| 1163 | 1144 | { |
| 1164 | | ycount0 = state->m_blit.clip_top - y1; |
| 1165 | | y1 = state->m_blit.clip_top; |
| 1145 | ycount0 = m_blit.clip_top - y1; |
| 1146 | y1 = m_blit.clip_top; |
| 1166 | 1147 | } |
| 1167 | | if (y2 > state->m_blit.clip_bottom) |
| 1168 | | y2 = state->m_blit.clip_bottom; |
| 1148 | if (y2 > m_blit.clip_bottom) |
| 1149 | y2 = m_blit.clip_bottom; |
| 1169 | 1150 | if (y1 >= y2) |
| 1170 | 1151 | return; |
| 1171 | 1152 | } |
| r24767 | r24768 | |
| 1175 | 1156 | pen_t base_pen = sprite->base_pen; |
| 1176 | 1157 | int x, y; |
| 1177 | 1158 | UINT8 pen; |
| 1178 | | int pitch = state->m_blit.line_offset * dy / 2; |
| 1179 | | UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); |
| 1159 | int pitch = m_blit.line_offset * dy / 2; |
| 1160 | UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1); |
| 1180 | 1161 | |
| 1181 | 1162 | pen_data += sprite->line_offset * ycount0 + xcount0; |
| 1182 | 1163 | for (y = y1; y != y2; y += dy) |
| r24767 | r24768 | |
| 1197 | 1178 | } |
| 1198 | 1179 | |
| 1199 | 1180 | |
| 1200 | | static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_cave *sprite ) |
| 1181 | void cave_state::do_blit_16_cave_zb( const struct sprite_cave *sprite ) |
| 1201 | 1182 | { |
| 1202 | 1183 | /* assumes SPRITE_LIST_RAW_DATA flag is set */ |
| 1203 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1204 | 1184 | int x1, x2, y1, y2, dx, dy; |
| 1205 | 1185 | int xcount0 = 0, ycount0 = 0; |
| 1206 | 1186 | |
| r24767 | r24768 | |
| 1209 | 1189 | x2 = sprite->x; |
| 1210 | 1190 | x1 = x2 + sprite->total_width; |
| 1211 | 1191 | dx = -1; |
| 1212 | | if (x2 < state->m_blit.clip_left) |
| 1213 | | x2 = state->m_blit.clip_left; |
| 1214 | | if (x1 > state->m_blit.clip_right) |
| 1192 | if (x2 < m_blit.clip_left) |
| 1193 | x2 = m_blit.clip_left; |
| 1194 | if (x1 > m_blit.clip_right) |
| 1215 | 1195 | { |
| 1216 | | xcount0 = x1 - state->m_blit.clip_right; |
| 1217 | | x1 = state->m_blit.clip_right; |
| 1196 | xcount0 = x1 - m_blit.clip_right; |
| 1197 | x1 = m_blit.clip_right; |
| 1218 | 1198 | } |
| 1219 | 1199 | if (x2 >= x1) |
| 1220 | 1200 | return; |
| r24767 | r24768 | |
| 1225 | 1205 | x1 = sprite->x; |
| 1226 | 1206 | x2 = x1 + sprite->total_width; |
| 1227 | 1207 | dx = 1; |
| 1228 | | if (x1 < state->m_blit.clip_left) |
| 1208 | if (x1 < m_blit.clip_left) |
| 1229 | 1209 | { |
| 1230 | | xcount0 = state->m_blit.clip_left - x1; |
| 1231 | | x1 = state->m_blit.clip_left; |
| 1210 | xcount0 = m_blit.clip_left - x1; |
| 1211 | x1 = m_blit.clip_left; |
| 1232 | 1212 | } |
| 1233 | | if (x2 > state->m_blit.clip_right) |
| 1234 | | x2 = state->m_blit.clip_right; |
| 1213 | if (x2 > m_blit.clip_right) |
| 1214 | x2 = m_blit.clip_right; |
| 1235 | 1215 | if (x1 >= x2) |
| 1236 | 1216 | return; |
| 1237 | 1217 | } |
| r24767 | r24768 | |
| 1240 | 1220 | y2 = sprite->y; |
| 1241 | 1221 | y1 = y2 + sprite->total_height; |
| 1242 | 1222 | dy = -1; |
| 1243 | | if (y2 < state->m_blit.clip_top) |
| 1244 | | y2 = state->m_blit.clip_top; |
| 1245 | | if (y1 > state->m_blit.clip_bottom) |
| 1223 | if (y2 < m_blit.clip_top) |
| 1224 | y2 = m_blit.clip_top; |
| 1225 | if (y1 > m_blit.clip_bottom) |
| 1246 | 1226 | { |
| 1247 | | ycount0 = y1 - state->m_blit.clip_bottom; |
| 1248 | | y1 = state->m_blit.clip_bottom; |
| 1227 | ycount0 = y1 - m_blit.clip_bottom; |
| 1228 | y1 = m_blit.clip_bottom; |
| 1249 | 1229 | } |
| 1250 | 1230 | if (y2 >= y1) |
| 1251 | 1231 | return; |
| r24767 | r24768 | |
| 1256 | 1236 | y1 = sprite->y; |
| 1257 | 1237 | y2 = y1 + sprite->total_height; |
| 1258 | 1238 | dy = 1; |
| 1259 | | if (y1 < state->m_blit.clip_top) |
| 1239 | if (y1 < m_blit.clip_top) |
| 1260 | 1240 | { |
| 1261 | | ycount0 = state->m_blit.clip_top - y1; |
| 1262 | | y1 = state->m_blit.clip_top; |
| 1241 | ycount0 = m_blit.clip_top - y1; |
| 1242 | y1 = m_blit.clip_top; |
| 1263 | 1243 | } |
| 1264 | | if (y2 > state->m_blit.clip_bottom) |
| 1265 | | y2 = state->m_blit.clip_bottom; |
| 1244 | if (y2 > m_blit.clip_bottom) |
| 1245 | y2 = m_blit.clip_bottom; |
| 1266 | 1246 | if (y1 >= y2) |
| 1267 | 1247 | return; |
| 1268 | 1248 | } |
| r24767 | r24768 | |
| 1272 | 1252 | pen_t base_pen = sprite->base_pen; |
| 1273 | 1253 | int x, y; |
| 1274 | 1254 | UINT8 pen; |
| 1275 | | int pitch = state->m_blit.line_offset * dy / 2; |
| 1276 | | UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); |
| 1277 | | int pitchz = state->m_blit.line_offset_zbuf * dy / 2; |
| 1278 | | UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1); |
| 1279 | | UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval; |
| 1255 | int pitch = m_blit.line_offset * dy / 2; |
| 1256 | UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1); |
| 1257 | int pitchz = m_blit.line_offset_zbuf * dy / 2; |
| 1258 | UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); |
| 1259 | UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval; |
| 1280 | 1260 | |
| 1281 | 1261 | pen_data += sprite->line_offset * ycount0 + xcount0; |
| 1282 | 1262 | for (y = y1; y != y2; y += dy) |
| r24767 | r24768 | |
| 1301 | 1281 | } |
| 1302 | 1282 | |
| 1303 | 1283 | |
| 1304 | | static void sprite_draw_cave( running_machine &machine, int priority ) |
| 1284 | void cave_state::sprite_draw_cave( int priority ) |
| 1305 | 1285 | { |
| 1306 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1307 | 1286 | int i = 0; |
| 1308 | | while (state->m_sprite_table[priority][i]) |
| 1287 | while (m_sprite_table[priority][i]) |
| 1309 | 1288 | { |
| 1310 | | const struct sprite_cave *sprite = state->m_sprite_table[priority][i++]; |
| 1289 | const struct sprite_cave *sprite = m_sprite_table[priority][i++]; |
| 1311 | 1290 | if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) |
| 1312 | | do_blit_16_cave(machine, sprite); |
| 1291 | do_blit_16_cave(sprite); |
| 1313 | 1292 | else |
| 1314 | | do_blit_zoom16_cave(machine, sprite); |
| 1293 | do_blit_zoom16_cave(sprite); |
| 1315 | 1294 | } |
| 1316 | 1295 | } |
| 1317 | 1296 | |
| 1318 | | static void sprite_draw_cave_zbuf( running_machine &machine, int priority ) |
| 1297 | void cave_state::sprite_draw_cave_zbuf( int priority ) |
| 1319 | 1298 | { |
| 1320 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1321 | 1299 | int i = 0; |
| 1322 | | while (state->m_sprite_table[priority][i]) |
| 1300 | while (m_sprite_table[priority][i]) |
| 1323 | 1301 | { |
| 1324 | | const struct sprite_cave *sprite = state->m_sprite_table[priority][i++]; |
| 1302 | const struct sprite_cave *sprite = m_sprite_table[priority][i++]; |
| 1325 | 1303 | if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) |
| 1326 | | do_blit_16_cave_zb(machine, sprite); |
| 1304 | do_blit_16_cave_zb(sprite); |
| 1327 | 1305 | else |
| 1328 | | do_blit_zoom16_cave_zb(machine, sprite); |
| 1306 | do_blit_zoom16_cave_zb(sprite); |
| 1329 | 1307 | } |
| 1330 | 1308 | } |
| 1331 | 1309 | |
| 1332 | | static void sprite_draw_donpachi( running_machine &machine, int priority ) |
| 1310 | void cave_state::sprite_draw_donpachi( int priority ) |
| 1333 | 1311 | { |
| 1334 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1335 | 1312 | int i = 0; |
| 1336 | | while (state->m_sprite_table[priority][i]) |
| 1337 | | do_blit_16_cave(machine, state->m_sprite_table[priority][i++]); |
| 1313 | while (m_sprite_table[priority][i]) |
| 1314 | do_blit_16_cave(m_sprite_table[priority][i++]); |
| 1338 | 1315 | } |
| 1339 | 1316 | |
| 1340 | | static void sprite_draw_donpachi_zbuf( running_machine &machine, int priority ) |
| 1317 | void cave_state::sprite_draw_donpachi_zbuf( int priority ) |
| 1341 | 1318 | { |
| 1342 | | cave_state *state = machine.driver_data<cave_state>(); |
| 1343 | 1319 | int i = 0; |
| 1344 | | while (state->m_sprite_table[priority][i]) |
| 1345 | | do_blit_16_cave_zb(machine, state->m_sprite_table[priority][i++]); |
| 1320 | while (m_sprite_table[priority][i]) |
| 1321 | do_blit_16_cave_zb(m_sprite_table[priority][i++]); |
| 1346 | 1322 | } |
| 1347 | 1323 | |
| 1348 | 1324 | |
| r24767 | r24768 | |
| 1529 | 1505 | int pri, pri2, GFX; |
| 1530 | 1506 | int layers_ctrl = -1; |
| 1531 | 1507 | |
| 1532 | | set_pens(machine()); |
| 1508 | set_pens(); |
| 1533 | 1509 | |
| 1534 | 1510 | m_blit.baseaddr = reinterpret_cast<UINT8 *>(bitmap.raw_pixptr(0)); |
| 1535 | 1511 | m_blit.line_offset = bitmap.rowbytes(); |
| r24767 | r24768 | |
| 1622 | 1598 | */ |
| 1623 | 1599 | for (pri = 0; pri <= 3; pri++) // tile / sprite priority |
| 1624 | 1600 | { |
| 1625 | | if (layers_ctrl & (1 << (pri + 16))) (*m_sprite_draw)(screen.machine(), pri); |
| 1601 | if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(pri); |
| 1626 | 1602 | |
| 1627 | 1603 | for (pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer |
| 1628 | 1604 | { |
| r24767 | r24768 | |
| 1646 | 1622 | if (machine().video().skip_this_frame() == 0) |
| 1647 | 1623 | { |
| 1648 | 1624 | m_spriteram_bank = m_spriteram_bank_delay; |
| 1649 | | (*m_get_sprite_info)(machine()); |
| 1625 | (this->*m_get_sprite_info)(); |
| 1650 | 1626 | } |
| 1651 | 1627 | m_spriteram_bank_delay = m_videoregs[4] & 1; |
| 1652 | 1628 | } |
| r24767 | r24768 | |
| 1655 | 1631 | if (machine().video().skip_this_frame() == 0) |
| 1656 | 1632 | { |
| 1657 | 1633 | m_spriteram_bank = m_videoregs[4] & 1; |
| 1658 | | (*m_get_sprite_info)(machine()); |
| 1634 | (this->*m_get_sprite_info)(); |
| 1659 | 1635 | } |
| 1660 | 1636 | } |
| 1661 | 1637 | } |