src/mess/drivers/supracan.c
| r9120 | r9121 | |
| 470 | 470 | // zzzz ---- ---- ---- X scale |
| 471 | 471 | // ---- ---x xxxx xxxx X position |
| 472 | 472 | // [3] |
| 473 | | // oooo oooo oooo oooo Sprite address |
| 473 | // d--- ---- ---- ---- Direct Sprite (use details from here, not looked up in vram) |
| 474 | // -ooo oooo oooo oooo Sprite address |
| 474 | 475 | |
| 475 | 476 | UINT32 skip_count = 0; |
| 476 | 477 | UINT32 start_word = (state->sprite_base_addr >> 1) + skip_count * 4; |
| r9120 | r9121 | |
| 480 | 481 | // printf("frame\n"); |
| 481 | 482 | #define VRAM_MASK (0xffff) |
| 482 | 483 | |
| 484 | |
| 483 | 485 | for(int i = start_word; i < end_word; i += 4) |
| 484 | 486 | { |
| 485 | 487 | int x = supracan_vram[i+2] & 0x01ff; |
| r9120 | r9121 | |
| 487 | 489 | |
| 488 | 490 | int sprite_offset = (supracan_vram[i+3])<< 1; |
| 489 | 491 | |
| 490 | | sprite_offset &= VRAM_MASK; // there are only 0xffff words of vram? sango is specifying tiles outside of this, why, I'm sure it didn't used to, timing? DMA? |
| 492 | //sprite_offset &= VRAM_MASK; // there are only 0xffff words of vram? sango is specifying tiles outside of this, why, I'm sure it didn't used to, timing? DMA? |
| 491 | 493 | |
| 492 | 494 | |
| 493 | 495 | int bank = (supracan_vram[i+1] & 0xf000) >> 12; |
| 494 | 496 | //int mask = (supracan_vram[i+1] & 0x0300) >> 8; |
| 495 | | bool hflip = (supracan_vram[i+1] & 0x0800) ? true : false; |
| 496 | | bool vflip = (supracan_vram[i+1] & 0x0400) ? true : false; |
| 497 | bool sprite_xflip = (supracan_vram[i+1] & 0x0800) ? true : false; |
| 498 | bool sprite_yflip = (supracan_vram[i+1] & 0x0400) ? true : false; |
| 497 | 499 | //int xscale = (supracan_vram[i+2] & 0xf000) >> 12; |
| 498 | 500 | const gfx_element *gfx = machine->gfx[region]; |
| 499 | 501 | |
| r9120 | r9121 | |
| 513 | 515 | */ |
| 514 | 516 | |
| 515 | 517 | |
| 516 | | |
| 517 | | |
| 518 | 518 | // wraparound |
| 519 | 519 | if (y>=0x180) y-=0x200; |
| 520 | 520 | if (x>=0x180) x-=0x200; |
| 521 | 521 | |
| 522 | 522 | if(supracan_vram[i+3] != 0) |
| 523 | 523 | { |
| 524 | | int xsize = 1 << (supracan_vram[i+1] & 7); |
| 525 | | int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9) + 1; |
| 524 | if (supracan_vram[i+3] &0x8000) |
| 525 | { |
| 526 | UINT16 data = supracan_vram[i+3]; |
| 527 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 528 | |
| 529 | int palette = (data & 0xf000) >> 12; // this might not be correct, due to the &0x8000 condition above this would force all single tile sprites to be using palette >=0x8 only |
| 530 | |
| 531 | //printf("sprite data %04x %04x %04x %04x\n", supracan_vram[i+0] , supracan_vram[i+1] , supracan_vram[i+2] ,supracan_vram[i+3] ); |
| 526 | 532 | |
| 527 | | if(vflip) |
| 533 | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,sprite_xflip,sprite_yflip, |
| 534 | x, |
| 535 | y, |
| 536 | 0); |
| 537 | |
| 538 | } |
| 539 | else |
| 528 | 540 | { |
| 529 | | for(int ytile = (ysize - 1); ytile >= 0; ytile--) |
| 541 | int xsize = 1 << (supracan_vram[i+1] & 7); |
| 542 | int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9) + 1; |
| 543 | |
| 544 | if(sprite_yflip) |
| 530 | 545 | { |
| 531 | | if(hflip) |
| 546 | for(int ytile = (ysize - 1); ytile >= 0; ytile--) |
| 532 | 547 | { |
| 533 | | for(int xtile = (xsize - 1); xtile >= 0; xtile--) |
| 548 | if(sprite_xflip) |
| 534 | 549 | { |
| 535 | | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 536 | | int tile = (bank * 0x200) + (data & 0x03ff); |
| 537 | | bool xflip = (data & 0x0800) ? false : true; |
| 538 | | bool yflip = (data & 0x0400) ? false : true; |
| 539 | | int palette = (data & 0xf000) >> 12; |
| 540 | | int xpos = x + ((xsize - 1) - xtile)*8; |
| 541 | | int ypos = y + ((ysize - 1) - ytile)*8; |
| 550 | for(int xtile = (xsize - 1); xtile >= 0; xtile--) |
| 551 | { |
| 552 | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 553 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 554 | int tile_xflip = (data & 0x0800) ? false : true; |
| 555 | int tile_yflip = (data & 0x0400) ? false : true; |
| 556 | int palette = (data & 0xf000) >> 12; |
| 557 | int xpos = x + ((xsize - 1) - xtile)*8; |
| 558 | int ypos = y + ((ysize - 1) - ytile)*8; |
| 542 | 559 | |
| 543 | | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip, |
| 544 | | xpos, |
| 545 | | ypos, |
| 546 | | 0); |
| 560 | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip, |
| 561 | xpos, |
| 562 | ypos, |
| 563 | 0); |
| 547 | 564 | |
| 565 | } |
| 548 | 566 | } |
| 549 | | } |
| 550 | | else |
| 551 | | { |
| 552 | | for(int xtile = 0; xtile < xsize; xtile++) |
| 567 | else |
| 553 | 568 | { |
| 554 | | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 555 | | int tile = (bank * 0x200) + (data & 0x03ff); |
| 556 | | bool xflip = (data & 0x0800) ? true : false; |
| 557 | | bool yflip = (data & 0x0400) ? false : true; |
| 558 | | int palette = (data & 0xf000) >> 12; |
| 569 | for(int xtile = 0; xtile < xsize; xtile++) |
| 570 | { |
| 571 | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 572 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 573 | int tile_xflip = (data & 0x0800) ? true : false; |
| 574 | int tile_yflip = (data & 0x0400) ? false : true; |
| 575 | int palette = (data & 0xf000) >> 12; |
| 559 | 576 | |
| 560 | | int xpos = x + xtile*8; |
| 561 | | int ypos = y + ((ysize - 1) - ytile)*8; |
| 577 | int xpos = x + xtile*8; |
| 578 | int ypos = y + ((ysize - 1) - ytile)*8; |
| 562 | 579 | |
| 563 | | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip, |
| 564 | | xpos, |
| 565 | | ypos, |
| 566 | | 0); |
| 580 | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip, |
| 581 | xpos, |
| 582 | ypos, |
| 583 | 0); |
| 584 | } |
| 567 | 585 | } |
| 568 | 586 | } |
| 569 | 587 | } |
| 570 | | } |
| 571 | | else |
| 572 | | { |
| 573 | | for(int ytile = 0; ytile < ysize; ytile++) |
| 588 | else |
| 574 | 589 | { |
| 575 | | if(hflip) |
| 590 | for(int ytile = 0; ytile < ysize; ytile++) |
| 576 | 591 | { |
| 577 | | for(int xtile = (xsize - 1); xtile >= 0; xtile--) |
| 592 | if(sprite_xflip) |
| 578 | 593 | { |
| 579 | | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 580 | | int tile = (bank * 0x200) + (data & 0x03ff); |
| 581 | | bool xflip = (data & 0x0800) ? false : true; |
| 582 | | bool yflip = (data & 0x0400) ? true : false; |
| 583 | | int palette = (data & 0xf000) >> 12; |
| 594 | for(int xtile = (xsize - 1); xtile >= 0; xtile--) |
| 595 | { |
| 596 | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 597 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 598 | int tile_xflip = (data & 0x0800) ? false : true; |
| 599 | int tile_yflip = (data & 0x0400) ? true : false; |
| 600 | int palette = (data & 0xf000) >> 12; |
| 584 | 601 | |
| 585 | | int xpos = x + ((xsize - 1) - xtile)*8; |
| 586 | | int ypos = y + ytile*8; |
| 602 | int xpos = x + ((xsize - 1) - xtile)*8; |
| 603 | int ypos = y + ytile*8; |
| 587 | 604 | |
| 588 | | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip, |
| 589 | | xpos, |
| 590 | | ypos, |
| 591 | | 0); |
| 605 | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip, |
| 606 | xpos, |
| 607 | ypos, |
| 608 | 0); |
| 609 | } |
| 592 | 610 | } |
| 593 | | } |
| 594 | | else |
| 595 | | { |
| 596 | | for(int xtile = 0; xtile < xsize; xtile++) |
| 611 | else |
| 597 | 612 | { |
| 598 | | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 599 | | int tile = (bank * 0x200) + (data & 0x03ff); |
| 600 | | bool xflip = (data & 0x0800) ? true : false; |
| 601 | | bool yflip = (data & 0x0400) ? true : false; |
| 602 | | int palette = (data & 0xf000) >> 12; |
| 613 | for(int xtile = 0; xtile < xsize; xtile++) |
| 614 | { |
| 615 | UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK]; |
| 616 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 617 | int tile_xflip = (data & 0x0800) ? true : false; |
| 618 | int tile_yflip = (data & 0x0400) ? true : false; |
| 619 | int palette = (data & 0xf000) >> 12; |
| 603 | 620 | |
| 604 | | int xpos = x + xtile*8; |
| 605 | | int ypos = y + ytile*8; |
| 621 | int xpos = x + xtile*8; |
| 622 | int ypos = y + ytile*8; |
| 606 | 623 | |
| 607 | | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip, |
| 608 | | xpos, |
| 609 | | ypos, |
| 610 | | 0); |
| 624 | drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip, |
| 625 | xpos, |
| 626 | ypos, |
| 627 | 0); |
| 611 | 628 | |
| 629 | } |
| 612 | 630 | } |
| 613 | 631 | } |
| 614 | 632 | } |
| 615 | 633 | } |
| 616 | | |
| 617 | 634 | #if 0 |
| 618 | 635 | if(xscale == 0) continue; |
| 619 | 636 | UINT32 delta = (1 << 17) / xscale; |