trunk/src/mame/drivers/coolridr.c
| r21407 | r21408 | |
| 386 | 386 | m_sound_dma(*this, "sound_dma"), |
| 387 | 387 | m_soundram(*this, "soundram"), |
| 388 | 388 | m_soundram2(*this, "soundram2") |
| 389 | | { } |
| 389 | { |
| 390 | m_work_queue[0] = osd_work_queue_alloc(WORK_QUEUE_FLAG_HIGH_FREQ); |
| 391 | m_work_queue[1] = osd_work_queue_alloc(WORK_QUEUE_FLAG_HIGH_FREQ); |
| 392 | } |
| 390 | 393 | |
| 391 | 394 | // Blitter state |
| 392 | 395 | UINT16 m_textBytesToWrite; |
| r21407 | r21408 | |
| 471 | 474 | UINT16 *m_h1_vram; |
| 472 | 475 | UINT16 *m_h1_pcg; |
| 473 | 476 | UINT16 *m_h1_pal; |
| 477 | |
| 478 | osd_work_queue * m_work_queue[2]; // work queue, one per screen |
| 479 | static void *draw_tile_row_threaded(void *param, int threadid); |
| 474 | 480 | }; |
| 475 | 481 | |
| 476 | 482 | #define PRINT_BLIT_STUFF \ |
| r21407 | r21408 | |
| 619 | 625 | } |
| 620 | 626 | #endif |
| 621 | 627 | |
| 628 | struct cool_render_object |
| 629 | { |
| 630 | UINT8* indirect_tiles; |
| 631 | UINT32* indirect_zoom; |
| 632 | UINT32 spriteblit[12]; |
| 633 | bitmap_rgb32* drawbitmap; |
| 634 | coolridr_state* state; |
| 635 | }; |
| 636 | |
| 622 | 637 | #define YLOOP_START \ |
| 623 | 638 | for (int y = 0; y < blockhigh; y++) \ |
| 624 | 639 | { \ |
| r21407 | r21408 | |
| 664 | 679 | } \ |
| 665 | 680 | |
| 666 | 681 | |
| 667 | | //m_rearranged_16bit_gfx |
| 668 | | //m_expanded_10bit_gfx |
| 682 | //object->rearranged_16bit_gfx |
| 683 | //object->expanded_10bit_gfx |
| 669 | 684 | |
| 670 | | /* This is a RLE-based sprite blitter (US Patent #6,141,122), very unusual from Sega... */ |
| 671 | | void coolridr_state::blit_current_sprite(address_space &space) |
| 672 | | { |
| 673 | | // const pen_t *clut = &machine().pens[0]; |
| 674 | 685 | |
| 675 | | // Serialized 32-bit words in order of appearance: |
| 676 | | // 0: 00000000 - unknown, 0x00000000 or 0x00000001, 0 seems to be regular sprite, 1 seems to change meaning of below, possible clip area? |
| 677 | | // 1: 00010000 - unknown, color mode? (7bpp select?) set on player bike object |
| 678 | | // 1: 00000xxx - "Color Number" (all bits or just lower 16/8?) |
| 679 | | // 2: 007f0000 - unknown, transpen? set to 0x7f whenever the 'color mode' bit in (1) is set, otherwise 0 |
| 680 | | // 2: 00000xxx - unknown, usually a copy of color number, leftover? |
| 681 | | // 3: 001fffff - offset to compressed data? (it's 0 on text objects tho, but maybe the ascii tiles are a special decode to go with the indirect mode) |
| 682 | | // 4: 07000000 - unknown (draw mode?) |
| 683 | | // 4: 00010000 - unknown (set on a few object) |
| 684 | | // 4: 00000100 - y-flip? |
| 685 | | // 4: 00000001 - x-flip? |
| 686 | | // 5: 00010000 - enable indirect text tile lookup |
| 687 | | // 5: 00000001 - enable line-zoom(?) lookup (road) |
| 688 | | // 6: vvvv---- - "Vertical Cell Count" |
| 689 | | // 6: ----hhhh - "Horizontal Cell Count" |
| 690 | | // 7: 00030003 - "Vertical|Horizontal Origin point" |
| 691 | | // 8: 00ff00ff - "Vertical|Horizontal Zoom Ratios" |
| 692 | | // 9: xxxx---- - "Display Vertical Position" |
| 693 | | // 9: ----yyyy - "Display Horizontal Position" |
| 694 | | // 10: 00000000 - unknown : always seems to be zero - NO, for some things (not text) it's also a reference to 3f40000 region like #11 |
| 695 | | // 11: ........ - indirect tile mode ram address (used for text) |
| 696 | 686 | |
| 697 | 687 | |
| 698 | | // first parse the bits |
| 699 | 688 | |
| 700 | | /************* m_spriteblit[0] *************/ |
| 689 | void *coolridr_state::draw_tile_row_threaded(void *param, int threadid) |
| 690 | { |
| 691 | cool_render_object *object = reinterpret_cast<cool_render_object *>(param); |
| 692 | bitmap_rgb32* drawbitmap = object->drawbitmap; |
| 693 | |
| 694 | UINT16* rearranged_16bit_gfx = object->state->m_rearranged_16bit_gfx; |
| 695 | UINT16* expanded_10bit_gfx = object->state->m_expanded_10bit_gfx; |
| 696 | |
| 701 | 697 | |
| 702 | | // set to 0x00000001 on some objects during the 'film strip' part of attract, otherwise 0 |
| 703 | | // those objects don't seem visible anyway so might have some special meaning |
| 704 | | // this is also set at times during the game |
| 705 | | // |
| 706 | | // the sprites with 1 set appear to have 0x00000000 in everything after the 4th write (blit4 and above) |
| 707 | | // so likely have some other meaning and are NOT regular sprite data |
| 708 | | UINT32 blit0 = m_spriteblit[0]; |
| 709 | 698 | |
| 710 | | if (blit0==0) |
| 711 | | { |
| 712 | | // normal |
| 713 | | } |
| 714 | | else if (blit0==1) |
| 715 | | { |
| 716 | | //printf("unknown sprite list type 1 - %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n", m_spriteblit[0], m_spriteblit[1],m_spriteblit[2],m_spriteblit[3],m_spriteblit[4],m_spriteblit[5],m_spriteblit[6],m_spriteblit[7],m_spriteblit[8],m_spriteblit[9],m_spriteblit[10],m_spriteblit[10]); |
| 699 | /************* object->spriteblit[1] *************/ |
| 717 | 700 | |
| 718 | | /* |
| 719 | | sample data from attract mode 'filmstrip' |
| 720 | | |
| 721 | | you can see it's screen regions at least, gets enabled in certain game situations too |
| 722 | | interestingly there is a bit to determine the screen number this applies to, even if that should already be implied from m_blitterMode |
| 723 | | |
| 724 | | screen 1 clipping(?) |
| 725 | | |
| 726 | | unknown sprite list type 1 - 00000001 003f00f0 027801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 727 | | unknown sprite list type 1 - 00000001 003f00f0 03e001f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 728 | | unknown sprite list type 1 - 00000001 003f00f0 000700e3 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 729 | | unknown sprite list type 1 - 00000001 003f00f0 010c01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 730 | | |
| 731 | | unknown sprite list type 1 - 00000001 003f00f0 027401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 732 | | unknown sprite list type 1 - 00000001 003f00f0 03dc01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 733 | | unknown sprite list type 1 - 00000001 003f00f0 000700df 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 734 | | unknown sprite list type 1 - 00000001 003f00f0 010801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 735 | | |
| 736 | | unknown sprite list type 1 - 00000001 003f00f0 027001f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 737 | | unknown sprite list type 1 - 00000001 003f00f0 03d801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 738 | | unknown sprite list type 1 - 00000001 003f00f0 000700db 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 739 | | unknown sprite list type 1 - 00000001 003f00f0 010401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 740 | | |
| 741 | | unknown sprite list type 1 - 00000001 003f00f0 019c01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 742 | | unknown sprite list type 1 - 00000001 003f00f0 030401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 743 | | unknown sprite list type 1 - 00000001 003f00f0 00070007 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 744 | | unknown sprite list type 1 - 00000001 003f00f0 0030016f 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 745 | | |
| 746 | | screen 2 clipping |
| 747 | | |
| 748 | | unknown sprite list type 1 - 00000001 003f00f0 039803f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 749 | | unknown sprite list type 1 - 00000001 003f00f0 050003f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 750 | | unknown sprite list type 1 - 00000001 003f00f0 02070203 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 751 | | unknown sprite list type 1 - 00000001 003f00f0 022c036b 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 752 | | |
| 753 | | unknown sprite list type 1 - 00000001 003f00f0 039403f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 754 | | unknown sprite list type 1 - 00000001 003f00f0 04fc03f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 755 | | unknown sprite list type 1 - 00000001 003f00f0 020701ff 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 756 | | unknown sprite list type 1 - 00000001 003f00f0 02280367 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 757 | | |
| 758 | | unknown sprite list type 1 - 00000001 003f00f0 039003f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 759 | | unknown sprite list type 1 - 00000001 003f00f0 04f803f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 760 | | unknown sprite list type 1 - 00000001 003f00f0 020701fb 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 761 | | unknown sprite list type 1 - 00000001 003f00f0 02240363 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 762 | | */ |
| 763 | | |
| 764 | | |
| 765 | | // abort early |
| 766 | | return; |
| 767 | | } |
| 768 | | else |
| 769 | | { |
| 770 | | printf("unknown blit0 value %08x\n", blit0); |
| 771 | | // abort early |
| 772 | | return; |
| 773 | | } |
| 774 | | |
| 775 | | |
| 776 | | |
| 777 | | |
| 778 | | /************* m_spriteblit[1] *************/ |
| 779 | | |
| 780 | 701 | // 000u0ccc - c = colour? u = 0/1 |
| 781 | | UINT32 blit1_unused = m_spriteblit[1] & 0xfffef800; |
| 782 | | UINT32 b1mode = (m_spriteblit[1] & 0x00010000)>>16; |
| 783 | | UINT32 b1colorNumber = (m_spriteblit[1] & 0x000007ff); // Probably more bits |
| 702 | UINT32 blit1_unused = object->spriteblit[1] & 0xfffef800; |
| 703 | UINT32 b1mode = (object->spriteblit[1] & 0x00010000)>>16; |
| 704 | UINT32 b1colorNumber = (object->spriteblit[1] & 0x000007ff); // Probably more bits |
| 784 | 705 | |
| 785 | | if (blit1_unused!=0) printf("blit1 unknown bits set %08x\n", m_spriteblit[1]); |
| 706 | if (blit1_unused!=0) printf("blit1 unknown bits set %08x\n", object->spriteblit[1]); |
| 786 | 707 | |
| 787 | | /************* m_spriteblit[3] *************/ |
| 708 | /************* object->spriteblit[3] *************/ |
| 788 | 709 | |
| 789 | 710 | // seems to be more complex than just transparency |
| 790 | | UINT32 blit2_unused = m_spriteblit[2]&0xff80f800; |
| 791 | | UINT32 b2tpen = (m_spriteblit[2] & 0x007f0000)>>16; |
| 792 | | UINT32 b2colorNumber = (m_spriteblit[2] & 0x000007ff); |
| 711 | UINT32 blit2_unused = object->spriteblit[2]&0xff80f800; |
| 712 | UINT32 b2tpen = (object->spriteblit[2] & 0x007f0000)>>16; |
| 713 | UINT32 b2colorNumber = (object->spriteblit[2] & 0x000007ff); |
| 793 | 714 | |
| 794 | 715 | if (b2colorNumber != b1colorNumber) |
| 795 | 716 | { |
| 796 | 717 | // b1colorNumber = space.machine().rand()&0xfff; |
| 797 | 718 | } |
| 719 | |
| 798 | 720 | |
| 799 | | |
| 800 | 721 | // if(b1colorNumber > 0x60 || b2colorNumber) |
| 801 | 722 | // printf("%08x %08x\n",b1colorNumber,b2colorNumber); |
| 802 | 723 | |
| 803 | 724 | |
| 804 | | if (blit2_unused!=0) printf("blit1 unknown bits set %08x\n", m_spriteblit[2]); |
| 725 | if (blit2_unused!=0) printf("blit1 unknown bits set %08x\n", object->spriteblit[2]); |
| 805 | 726 | if (b1mode) |
| 806 | 727 | { |
| 807 | 728 | if (b2tpen != 0x7f) printf("b1mode 1, b2tpen!=0x7f\n"); |
| r21407 | r21408 | |
| 815 | 736 | // ?? seems to be 00 or 7f, set depending on b1mode |
| 816 | 737 | // uuu, at least 11 bits used, maybe 12 usually the same as blit1_unused? leftover? |
| 817 | 738 | |
| 818 | | /************* m_spriteblit[3] *************/ |
| 739 | /************* object->spriteblit[3] *************/ |
| 819 | 740 | |
| 820 | | UINT32 blit3_unused = m_spriteblit[3] & 0xffe00000; |
| 821 | | UINT32 b3romoffset = (m_spriteblit[3] & 0x001fffff)*16; |
| 741 | UINT32 blit3_unused = object->spriteblit[3] & 0xffe00000; |
| 742 | UINT32 b3romoffset = (object->spriteblit[3] & 0x001fffff)*16; |
| 822 | 743 | |
| 823 | 744 | if (blit3_unused) printf("unknown bits in blit word %d - %08x\n", 3, blit3_unused); |
| 824 | 745 | |
| 825 | 746 | |
| 826 | | /************* m_spriteblit[4] *************/ |
| 747 | /************* object->spriteblit[4] *************/ |
| 827 | 748 | |
| 828 | | UINT32 blit4_unused = m_spriteblit[4] & 0xf8fefefe; |
| 829 | | //UINT32 blit4 = m_spriteblit[4] & 0x07000000; |
| 830 | | UINT32 blit_flipx = m_spriteblit[4] & 0x00000001; |
| 831 | | UINT32 blit_flipy = (m_spriteblit[4] & 0x00000100)>>8; |
| 832 | | UINT32 blit_rotate = (m_spriteblit[4] & 0x00010000)>>16; |
| 749 | UINT32 blit4_unused = object->spriteblit[4] & 0xf8fefefe; |
| 750 | //UINT32 blit4 = object->spriteblit[4] & 0x07000000; |
| 751 | UINT32 blit_flipx = object->spriteblit[4] & 0x00000001; |
| 752 | UINT32 blit_flipy = (object->spriteblit[4] & 0x00000100)>>8; |
| 753 | UINT32 blit_rotate = (object->spriteblit[4] & 0x00010000)>>16; |
| 833 | 754 | if (blit4_unused) printf("unknown bits in blit word %d - %08x\n", 4, blit4_unused); |
| 834 | 755 | |
| 835 | 756 | // ---- -111 ---- ---r ---- ---y ---- ---x |
| r21407 | r21408 | |
| 838 | 759 | // y = y-flip |
| 839 | 760 | // r = unknown, not used much, occasional object - rotate |
| 840 | 761 | |
| 841 | | /************* m_spriteblit[5] *************/ |
| 762 | /************* object->spriteblit[5] *************/ |
| 842 | 763 | |
| 843 | | UINT32 blit5_unused = m_spriteblit[5]&0xfffefffe; |
| 764 | UINT32 blit5_unused = object->spriteblit[5]&0xfffefffe; |
| 844 | 765 | // this might enable the text indirection thing? |
| 845 | | int indirect_tile_enable = (m_spriteblit[5] & 0x00010000)>>16; |
| 846 | | int indirect_zoom_enable = (m_spriteblit[5] & 0x00000001); |
| 766 | int indirect_tile_enable = (object->spriteblit[5] & 0x00010000)>>16; |
| 767 | int indirect_zoom_enable = (object->spriteblit[5] & 0x00000001); |
| 847 | 768 | |
| 848 | 769 | |
| 849 | 770 | if (blit5_unused) printf("unknown bits in blit word %d - %08x\n", 5, blit5_unused); |
| r21407 | r21408 | |
| 853 | 774 | |
| 854 | 775 | |
| 855 | 776 | |
| 856 | | /************* m_spriteblit[6] *************/ |
| 777 | /************* object->spriteblit[6] *************/ |
| 857 | 778 | |
| 858 | | UINT16 vCellCount = (m_spriteblit[6] & 0xffff0000) >> 16; |
| 859 | | UINT16 hCellCount = (m_spriteblit[6] & 0x0000ffff); |
| 779 | UINT16 vCellCount = (object->spriteblit[6] & 0x03ff0000) >> 16; |
| 780 | UINT16 hCellCount = (object->spriteblit[6] & 0x000003ff); |
| 860 | 781 | |
| 861 | | /************* m_spriteblit[7] *************/ |
| 782 | /************* object->spriteblit[7] *************/ |
| 862 | 783 | |
| 863 | | UINT16 vOrigin = (m_spriteblit[7] & 0x00030000) >> 16; |
| 864 | | UINT16 hOrigin = (m_spriteblit[7] & 0x00000003); |
| 865 | | UINT16 OriginUnused = (m_spriteblit[7] & 0xfffcfffc); |
| 784 | UINT16 vOrigin = (object->spriteblit[7] & 0x00030000) >> 16; |
| 785 | UINT16 hOrigin = (object->spriteblit[7] & 0x00000003); |
| 786 | UINT16 OriginUnused = (object->spriteblit[7] & 0xfffcfffc); |
| 866 | 787 | |
| 867 | 788 | if (blit5_unused) printf("unknown bits in blit word %d - %08x\n", 7, OriginUnused); |
| 868 | 789 | |
| 869 | 790 | //printf("%04x %04x\n", vOrigin, hOrigin); |
| 870 | 791 | |
| 871 | | /************* m_spriteblit[8] *************/ |
| 792 | /************* object->spriteblit[8] *************/ |
| 872 | 793 | |
| 873 | | UINT16 vZoom = (m_spriteblit[8] & 0xffff0000) >> 16; |
| 874 | | UINT16 hZoom = (m_spriteblit[8] & 0x0000ffff); |
| 794 | UINT16 vZoom = (object->spriteblit[8] & 0xffff0000) >> 16; |
| 795 | UINT16 hZoom = (object->spriteblit[8] & 0x0000ffff); |
| 875 | 796 | |
| 876 | | /************* m_spriteblit[9] *************/ |
| 797 | /************* object->spriteblit[9] *************/ |
| 877 | 798 | |
| 878 | | int vPosition = (m_spriteblit[9] & 0xffff0000) >> 16; |
| 879 | | int hPosition = (m_spriteblit[9] & 0x0000ffff); |
| 799 | int vPosition = (object->spriteblit[9] & 0xffff0000) >> 16; |
| 800 | int hPosition = (object->spriteblit[9] & 0x0000ffff); |
| 880 | 801 | |
| 881 | 802 | if (hPosition & 0x8000) hPosition -= 0x10000; |
| 882 | 803 | if (vPosition & 0x8000) vPosition -= 0x10000; |
| 883 | 804 | |
| 884 | | /************* m_spriteblit[10] *************/ |
| 805 | /************* object->spriteblit[10] *************/ |
| 885 | 806 | |
| 886 | 807 | // pointer to per-line zoom and scroll data for sprites |
| 887 | | UINT32 blit10 = m_spriteblit[10]; |
| 808 | UINT32 blit10 = 0; // we've cached the data here already |
| 888 | 809 | |
| 889 | | /************* m_spriteblit[11] *************/ |
| 810 | /************* object->spriteblit[11] *************/ |
| 890 | 811 | |
| 891 | | UINT32 textlookup = m_spriteblit[11]; |
| 812 | //UINT32 textlookup = 0; // we've cached the data here already |
| 892 | 813 | |
| 893 | 814 | |
| 894 | 815 | |
| r21407 | r21408 | |
| 919 | 840 | |
| 920 | 841 | |
| 921 | 842 | |
| 922 | | bitmap_rgb32* drawbitmap; |
| 923 | 843 | |
| 924 | | /* test code, not right 0x30 is always text, 0x40 hud, 0x50 99% of game objects and 0x60 some background objects, but it doesn't seem directly priority related*/ |
| 925 | | /* |
| 926 | | // 0x30 - 0x60 are definitely the left screen, 0x90 - 0xc0 are definitely the right screen.. the modes seem priority related |
| 927 | | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 928 | | drawbitmap = &m_temp_bitmap_sprites[(m_blitterMode-0x30)>>4]; |
| 929 | | else // 0x90, 0xa0, 0xb0, 0xc0 |
| 930 | | drawbitmap = &m_temp_bitmap_sprites2[(m_blitterMode-0x90)>>4]; |
| 931 | | */ |
| 932 | 844 | |
| 933 | | |
| 934 | | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 935 | | drawbitmap = &m_temp_bitmap_sprites[0]; |
| 936 | | else // 0x90, 0xa0, 0xb0, 0xc0 |
| 937 | | drawbitmap = &m_temp_bitmap_sprites2[0]; |
| 938 | | |
| 939 | | |
| 940 | 845 | int sizey = used_vCellCount * 16 * vZoom; |
| 941 | 846 | |
| 942 | 847 | vPosition *= 0x40; |
| r21407 | r21408 | |
| 961 | 866 | |
| 962 | 867 | |
| 963 | 868 | |
| 964 | | UINT32 lastSpriteNumber = 0xffffffff; |
| 965 | 869 | // Splat some sprites |
| 966 | 870 | for (int v = 0; v < used_vCellCount; v++) |
| 967 | 871 | { |
| 872 | |
| 873 | |
| 968 | 874 | const int pixelOffsetY = ((vPosition) + (v* 16 * vZoom)) / 0x40; |
| 969 | 875 | |
| 970 | 876 | if (pixelOffsetY>383) |
| r21407 | r21408 | |
| 974 | 880 | } |
| 975 | 881 | |
| 976 | 882 | |
| 977 | | |
| 978 | 883 | UINT16 hZoomTable[16]; |
| 979 | 884 | int hPositionTable[16]; |
| 980 | 885 | |
| 886 | |
| 981 | 887 | for (int idx=0;idx<16;idx++) |
| 982 | 888 | { |
| 983 | 889 | |
| 984 | 890 | if (indirect_zoom_enable) |
| 985 | 891 | { |
| 986 | | UINT32 dword = space.read_dword(blit10); |
| 892 | UINT32 dword = object->indirect_zoom[blit10]; |
| 987 | 893 | |
| 988 | 894 | hZoomTable[idx] = hZoom + (dword>>16); // add original value? |
| 989 | 895 | |
| r21407 | r21408 | |
| 992 | 898 | if (linescroll & 0x4000) linescroll -= 0x8000; |
| 993 | 899 | |
| 994 | 900 | hPositionTable[idx] = linescroll + hPosition; |
| 995 | | blit10+=4; |
| 901 | blit10++; |
| 996 | 902 | |
| 997 | 903 | |
| 998 | 904 | } |
| r21407 | r21408 | |
| 1026 | 932 | } |
| 1027 | 933 | |
| 1028 | 934 | } |
| 1029 | | // printf("%08x %08x %08x %04x %04x\n",textlookup,m_spriteblit[3],b3romoffset,b1colorNumber,b2colorNumber); |
| 1030 | | //PRINT_BLIT_STUFF |
| 1031 | 935 | |
| 936 | |
| 1032 | 937 | for (int h = 0; h < used_hCellCount; h++) |
| 1033 | 938 | { |
| 939 | |
| 1034 | 940 | |
| 941 | |
| 942 | UINT32 lastSpriteNumber = 0xffffffff; |
| 943 | |
| 1035 | 944 | int lookupnum; |
| 1036 | 945 | |
| 1037 | 946 | // with this bit enabled the tile numbers gets looked up using 'data' (which would be blit11) (eg 03f40000 for startup text) |
| 1038 | 947 | // this allows text strings to be written as 8-bit ascii in one area (using command 0x10), and drawn using multi-width sprites |
| 1039 | 948 | if (indirect_tile_enable) |
| 1040 | 949 | { |
| 1041 | | lookupnum = space.read_byte(textlookup + h + (v*used_hCellCount)); |
| 950 | // this doesn't handle the various flip modes.. |
| 951 | lookupnum = object->indirect_tiles[h + (v*used_hCellCount)]; |
| 1042 | 952 | } |
| 1043 | 953 | else |
| 1044 | 954 | { |
| r21407 | r21408 | |
| 1080 | 990 | } |
| 1081 | 991 | } |
| 1082 | 992 | |
| 1083 | | |
| 1084 | | |
| 1085 | 993 | // these should be 'cell numbers' (tile numbers) which look up RLE data? |
| 1086 | | UINT32 spriteNumber = (m_expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) + 1 ]); |
| 994 | UINT32 spriteNumber = (expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) +0 ] << 10) | (expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) + 1 ]); |
| 1087 | 995 | UINT16 tempshape[16*16]; |
| 1088 | | |
| 996 | |
| 1089 | 997 | int color_offs = (0x7b20 + (b1colorNumber & 0x7ff))*0x40 * 5; /* yes, * 5 */ |
| 1090 | 998 | |
| 1091 | 999 | // skip the decoding if it's the same tile as last time! |
| r21407 | r21408 | |
| 1099 | 1007 | while (data_written<256) |
| 1100 | 1008 | { |
| 1101 | 1009 | |
| 1102 | | UINT16 compdata = m_expanded_10bit_gfx[ (b3romoffset) + spriteNumber + i]; |
| 1010 | UINT16 compdata = expanded_10bit_gfx[ (b3romoffset) + spriteNumber + i]; |
| 1103 | 1011 | |
| 1104 | 1012 | if (((compdata & 0x300) == 0x000) || ((compdata & 0x300) == 0x100)) |
| 1105 | 1013 | { |
| r21407 | r21408 | |
| 1113 | 1021 | |
| 1114 | 1022 | while (data_written<256 && encodelength >=0) |
| 1115 | 1023 | { |
| 1116 | | tempshape[data_written] = m_rearranged_16bit_gfx[color_offs + rledata]; |
| 1024 | tempshape[data_written] = rearranged_16bit_gfx[color_offs + rledata]; |
| 1117 | 1025 | encodelength--; |
| 1118 | 1026 | data_written++; |
| 1119 | 1027 | } |
| r21407 | r21408 | |
| 1126 | 1034 | |
| 1127 | 1035 | while (data_written<256 && encodelength >=0) |
| 1128 | 1036 | { |
| 1129 | | tempshape[data_written] = m_rearranged_16bit_gfx[color_offs + rledata + 8]; // + 0x8 crt test, most of red, green, start of blue |
| 1037 | tempshape[data_written] = rearranged_16bit_gfx[color_offs + rledata + 8]; // + 0x8 crt test, most of red, green, start of blue |
| 1130 | 1038 | encodelength--; |
| 1131 | 1039 | data_written++; |
| 1132 | 1040 | } |
| r21407 | r21408 | |
| 1136 | 1044 | { |
| 1137 | 1045 | int rledata = (compdata & 0x0ff); |
| 1138 | 1046 | // mm cccc cccc |
| 1139 | | tempshape[data_written] = m_rearranged_16bit_gfx[color_offs + rledata + 0x48]; // +0x48 crt test end of blue, start of white |
| 1047 | tempshape[data_written] = rearranged_16bit_gfx[color_offs + rledata + 0x48]; // +0x48 crt test end of blue, start of white |
| 1140 | 1048 | data_written++; |
| 1141 | 1049 | } |
| 1142 | 1050 | |
| r21407 | r21408 | |
| 1147 | 1055 | |
| 1148 | 1056 | if (!vZoom) |
| 1149 | 1057 | { |
| 1150 | | m_blitterSerialCount++; |
| 1151 | | return; |
| 1058 | // abort, but make sure we clean up |
| 1059 | goto end; |
| 1152 | 1060 | } |
| 1153 | 1061 | |
| 1154 | 1062 | int blockhigh = ((16*vZoom)/0x40); |
| r21407 | r21408 | |
| 1162 | 1070 | |
| 1163 | 1071 | |
| 1164 | 1072 | |
| 1165 | | |
| 1166 | 1073 | if (blit_rotate) |
| 1167 | 1074 | { |
| 1168 | 1075 | if (used_flipy) |
| r21407 | r21408 | |
| 1257 | 1164 | } |
| 1258 | 1165 | } |
| 1259 | 1166 | } |
| 1167 | } |
| 1168 | } |
| 1169 | } |
| 1260 | 1170 | |
| 1261 | 1171 | |
| 1262 | | } |
| 1172 | end: |
| 1173 | |
| 1174 | if (object->indirect_tiles) |
| 1175 | free(object->indirect_tiles); |
| 1176 | |
| 1177 | if (object->indirect_zoom) |
| 1178 | free(object->indirect_zoom); |
| 1179 | |
| 1180 | free (object); |
| 1181 | |
| 1182 | return NULL; |
| 1183 | |
| 1184 | } |
| 1185 | |
| 1186 | |
| 1187 | |
| 1188 | /* This is a RLE-based sprite blitter (US Patent #6,141,122), very unusual from Sega... */ |
| 1189 | void coolridr_state::blit_current_sprite(address_space &space) |
| 1190 | { |
| 1191 | // const pen_t *clut = &machine().pens[0]; |
| 1192 | |
| 1193 | // Serialized 32-bit words in order of appearance: |
| 1194 | // 0: 00000000 - unknown, 0x00000000 or 0x00000001, 0 seems to be regular sprite, 1 seems to change meaning of below, possible clip area? |
| 1195 | // 1: 00010000 - unknown, color mode? (7bpp select?) set on player bike object |
| 1196 | // 1: 00000xxx - "Color Number" (all bits or just lower 16/8?) |
| 1197 | // 2: 007f0000 - unknown, transpen? set to 0x7f whenever the 'color mode' bit in (1) is set, otherwise 0 |
| 1198 | // 2: 00000xxx - unknown, usually a copy of color number, leftover? |
| 1199 | // 3: 001fffff - offset to compressed data? (it's 0 on text objects tho, but maybe the ascii tiles are a special decode to go with the indirect mode) |
| 1200 | // 4: 07000000 - unknown (draw mode?) |
| 1201 | // 4: 00010000 - unknown (set on a few object) |
| 1202 | // 4: 00000100 - y-flip? |
| 1203 | // 4: 00000001 - x-flip? |
| 1204 | // 5: 00010000 - enable indirect text tile lookup |
| 1205 | // 5: 00000001 - enable line-zoom(?) lookup (road) |
| 1206 | // 6: vvvv---- - "Vertical Cell Count" |
| 1207 | // 6: ----hhhh - "Horizontal Cell Count" |
| 1208 | // 7: 00030003 - "Vertical|Horizontal Origin point" |
| 1209 | // 8: 00ff00ff - "Vertical|Horizontal Zoom Ratios" |
| 1210 | // 9: xxxx---- - "Display Vertical Position" |
| 1211 | // 9: ----yyyy - "Display Horizontal Position" |
| 1212 | // 10: 00000000 - unknown : always seems to be zero - NO, for some things (not text) it's also a reference to 3f40000 region like #11 |
| 1213 | // 11: ........ - indirect tile mode ram address (used for text) |
| 1214 | |
| 1215 | |
| 1216 | // first parse the bits |
| 1217 | |
| 1218 | /************* m_spriteblit[0] *************/ |
| 1219 | |
| 1220 | // set to 0x00000001 on some objects during the 'film strip' part of attract, otherwise 0 |
| 1221 | // those objects don't seem visible anyway so might have some special meaning |
| 1222 | // this is also set at times during the game |
| 1223 | // |
| 1224 | // the sprites with 1 set appear to have 0x00000000 in everything after the 4th write (blit4 and above) |
| 1225 | // so likely have some other meaning and are NOT regular sprite data |
| 1226 | UINT32 blit0 = m_spriteblit[0]; |
| 1227 | |
| 1228 | if (blit0==0) |
| 1229 | { |
| 1230 | // normal |
| 1231 | } |
| 1232 | else if (blit0==1) |
| 1233 | { |
| 1234 | //printf("unknown sprite list type 1 - %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n", m_spriteblit[0], m_spriteblit[1],m_spriteblit[2],m_spriteblit[3],m_spriteblit[4],m_spriteblit[5],m_spriteblit[6],m_spriteblit[7],m_spriteblit[8],m_spriteblit[9],m_spriteblit[10],m_spriteblit[10]); |
| 1235 | |
| 1236 | /* |
| 1237 | sample data from attract mode 'filmstrip' |
| 1238 | |
| 1239 | you can see it's screen regions at least, gets enabled in certain game situations too |
| 1240 | interestingly there is a bit to determine the screen number this applies to, even if that should already be implied from m_blitterMode |
| 1241 | |
| 1242 | screen 1 clipping(?) |
| 1243 | |
| 1244 | unknown sprite list type 1 - 00000001 003f00f0 027801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1245 | unknown sprite list type 1 - 00000001 003f00f0 03e001f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1246 | unknown sprite list type 1 - 00000001 003f00f0 000700e3 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1247 | unknown sprite list type 1 - 00000001 003f00f0 010c01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1248 | |
| 1249 | unknown sprite list type 1 - 00000001 003f00f0 027401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1250 | unknown sprite list type 1 - 00000001 003f00f0 03dc01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1251 | unknown sprite list type 1 - 00000001 003f00f0 000700df 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1252 | unknown sprite list type 1 - 00000001 003f00f0 010801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1253 | |
| 1254 | unknown sprite list type 1 - 00000001 003f00f0 027001f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1255 | unknown sprite list type 1 - 00000001 003f00f0 03d801f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1256 | unknown sprite list type 1 - 00000001 003f00f0 000700db 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1257 | unknown sprite list type 1 - 00000001 003f00f0 010401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1258 | |
| 1259 | unknown sprite list type 1 - 00000001 003f00f0 019c01f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1260 | unknown sprite list type 1 - 00000001 003f00f0 030401f7 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1261 | unknown sprite list type 1 - 00000001 003f00f0 00070007 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1262 | unknown sprite list type 1 - 00000001 003f00f0 0030016f 00000007 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1263 | |
| 1264 | screen 2 clipping |
| 1265 | |
| 1266 | unknown sprite list type 1 - 00000001 003f00f0 039803f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1267 | unknown sprite list type 1 - 00000001 003f00f0 050003f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1268 | unknown sprite list type 1 - 00000001 003f00f0 02070203 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1269 | unknown sprite list type 1 - 00000001 003f00f0 022c036b 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1270 | |
| 1271 | unknown sprite list type 1 - 00000001 003f00f0 039403f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1272 | unknown sprite list type 1 - 00000001 003f00f0 04fc03f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1273 | unknown sprite list type 1 - 00000001 003f00f0 020701ff 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1274 | unknown sprite list type 1 - 00000001 003f00f0 02280367 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1275 | |
| 1276 | unknown sprite list type 1 - 00000001 003f00f0 039003f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1277 | unknown sprite list type 1 - 00000001 003f00f0 04f803f7 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1278 | unknown sprite list type 1 - 00000001 003f00f0 020701fb 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1279 | unknown sprite list type 1 - 00000001 003f00f0 02240363 00000207 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 |
| 1280 | */ |
| 1281 | |
| 1282 | |
| 1283 | // abort early |
| 1284 | return; |
| 1285 | } |
| 1286 | else |
| 1287 | { |
| 1288 | printf("unknown blit0 value %08x\n", blit0); |
| 1289 | // abort early |
| 1290 | return; |
| 1291 | } |
| 1292 | |
| 1293 | cool_render_object* testobject = (cool_render_object *)malloc(sizeof(cool_render_object)); |
| 1294 | |
| 1295 | testobject->state = this; |
| 1296 | |
| 1297 | for (int i=0;i<12;i++) |
| 1298 | testobject->spriteblit[i] = m_spriteblit[i]; |
| 1299 | |
| 1300 | // cache some values that are looked up from RAM to be safe.. alternatively we could stall the rendering if they get written to, but they're a direct memory pointer.. |
| 1301 | int test_indirect_tile_enable = (m_spriteblit[5] & 0x00010000)>>16; |
| 1302 | |
| 1303 | if (test_indirect_tile_enable) |
| 1304 | { |
| 1305 | UINT32 test_textlookup = m_spriteblit[11]; |
| 1306 | UINT16 test_hCellCount = (m_spriteblit[6] & 0x00003ff); |
| 1307 | UINT16 test_vCellCount = (m_spriteblit[6] & 0x03ff0000) >> 16; |
| 1308 | int bytes = test_vCellCount*test_hCellCount; |
| 1309 | testobject->indirect_tiles = (UINT8*)malloc(bytes); |
| 1310 | for (int i=0;i<bytes;i++) |
| 1311 | { |
| 1312 | testobject->indirect_tiles[i] = space.read_byte(test_textlookup + i); |
| 1263 | 1313 | } |
| 1264 | 1314 | } |
| 1315 | else |
| 1316 | { |
| 1317 | testobject->indirect_tiles = NULL; |
| 1318 | } |
| 1319 | |
| 1320 | int test_indirect_zoom_enable = (m_spriteblit[5] & 0x00000001); |
| 1321 | if (test_indirect_zoom_enable) |
| 1322 | { |
| 1323 | UINT32 test_blit10 = m_spriteblit[10]; |
| 1324 | UINT16 test_vCellCount = (m_spriteblit[6] & 0x03ff0000) >> 16; |
| 1325 | int bytes = test_vCellCount * 4 * 16; |
| 1326 | testobject->indirect_zoom = (UINT32*)malloc(bytes); |
| 1327 | for (int i=0;i<bytes/4;i++) |
| 1328 | { |
| 1329 | testobject->indirect_zoom[i] = space.read_dword(test_blit10 + i*4); |
| 1330 | } |
| 1331 | } |
| 1332 | else |
| 1333 | { |
| 1334 | testobject->indirect_zoom = NULL; |
| 1335 | } |
| 1336 | osd_work_queue *queue; |
| 1337 | // which queue, which bitmap |
| 1338 | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 1339 | { |
| 1340 | testobject->drawbitmap = &m_temp_bitmap_sprites[0]; |
| 1341 | queue = m_work_queue[0]; |
| 1342 | } |
| 1343 | else // 0x90, 0xa0, 0xb0, 0xc0 |
| 1344 | { |
| 1345 | testobject->drawbitmap = &m_temp_bitmap_sprites2[0]; |
| 1346 | queue = m_work_queue[1]; |
| 1347 | } |
| 1348 | |
| 1349 | osd_work_item_queue(queue, draw_tile_row_threaded, testobject, WORK_ITEM_FLAG_AUTO_RELEASE); |
| 1265 | 1350 | } |
| 1266 | 1351 | |
| 1352 | |
| 1267 | 1353 | WRITE32_MEMBER(coolridr_state::sysh1_blit_mode_w) |
| 1268 | 1354 | { |
| 1269 | 1355 | m_blitterMode = (data & 0x00ff0000) >> 16; |
| r21407 | r21408 | |
| 1451 | 1537 | |
| 1452 | 1538 | if(m_blitterClearMode == 0x8c200000) |
| 1453 | 1539 | { |
| 1540 | osd_work_queue_wait(m_work_queue[0], osd_ticks_per_second() * 100); |
| 1454 | 1541 | copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites[i], 0, 0, 0, 0, visarea); |
| 1455 | 1542 | m_temp_bitmap_sprites[i].fill(0, visarea); |
| 1456 | 1543 | } |
| 1457 | 1544 | |
| 1458 | 1545 | if(m_blitterClearMode == 0x8c800000) |
| 1459 | 1546 | { |
| 1547 | osd_work_queue_wait(m_work_queue[1], osd_ticks_per_second() * 100); |
| 1460 | 1548 | copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2[i], 0, 0, 0, 0, visarea); |
| 1461 | 1549 | m_temp_bitmap_sprites2[i].fill(0, visarea); |
| 1462 | 1550 | } |