Previous 199869 Revisions Next

r21408 Saturday 23rd February, 2013 at 18:56:19 UTC by David Haywood
put the object drawing on another thread, doesn't really help much, might revert later.
[src/mame/drivers]coolridr.c

trunk/src/mame/drivers/coolridr.c
r21407r21408
386386      m_sound_dma(*this, "sound_dma"),
387387      m_soundram(*this, "soundram"),
388388      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   }
390393
391394   // Blitter state
392395   UINT16 m_textBytesToWrite;
r21407r21408
471474   UINT16 *m_h1_vram;
472475   UINT16 *m_h1_pcg;
473476   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);
474480};
475481
476482#define PRINT_BLIT_STUFF \
r21407r21408
619625}
620626#endif
621627
628struct 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
622637#define YLOOP_START \
623638   for (int y = 0; y < blockhigh; y++) \
624639   { \
r21407r21408
664679   } \
665680
666681
667//m_rearranged_16bit_gfx
668//m_expanded_10bit_gfx
682//object->rearranged_16bit_gfx
683//object->expanded_10bit_gfx
669684
670/* This is a RLE-based sprite blitter (US Patent #6,141,122), very unusual from Sega... */
671void coolridr_state::blit_current_sprite(address_space &space)
672{
673//   const pen_t *clut = &machine().pens[0];
674685
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)
696686
697687
698   // first parse the bits
699688
700   /************* m_spriteblit[0] *************/
689void *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   
701697
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];
709698
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] *************/
717700
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
780701   // 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
784705
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]);
786707
787   /************* m_spriteblit[3] *************/
708   /************* object->spriteblit[3] *************/
788709
789710   // 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);
793714
794715   if (b2colorNumber != b1colorNumber)
795716   {
796717   //   b1colorNumber = space.machine().rand()&0xfff;
797718   }
719     
798720
799
800721//   if(b1colorNumber > 0x60 || b2colorNumber)
801722//      printf("%08x %08x\n",b1colorNumber,b2colorNumber);
802723
803724
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]);
805726   if (b1mode)
806727   {
807728      if (b2tpen != 0x7f) printf("b1mode 1, b2tpen!=0x7f\n");
r21407r21408
815736    // ?? seems to be 00 or 7f, set depending on b1mode
816737    // uuu, at least 11 bits used, maybe 12 usually the same as blit1_unused? leftover?
817738
818   /************* m_spriteblit[3] *************/
739   /************* object->spriteblit[3] *************/
819740
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;
822743
823744   if (blit3_unused) printf("unknown bits in blit word %d -  %08x\n", 3, blit3_unused);
824745
825746
826   /************* m_spriteblit[4] *************/
747   /************* object->spriteblit[4] *************/
827748
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;
833754   if (blit4_unused) printf("unknown bits in blit word %d -  %08x\n", 4, blit4_unused);
834755
835756   // ---- -111 ---- ---r ---- ---y ---- ---x
r21407r21408
838759   // y = y-flip
839760   // r = unknown, not used much, occasional object - rotate
840761
841   /************* m_spriteblit[5] *************/
762   /************* object->spriteblit[5] *************/
842763
843   UINT32 blit5_unused = m_spriteblit[5]&0xfffefffe;
764   UINT32 blit5_unused = object->spriteblit[5]&0xfffefffe;
844765   // 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);
847768
848769
849770   if (blit5_unused) printf("unknown bits in blit word %d -  %08x\n", 5, blit5_unused);
r21407r21408
853774
854775
855776
856   /************* m_spriteblit[6] *************/
777   /************* object->spriteblit[6] *************/
857778
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);
860781
861   /************* m_spriteblit[7] *************/
782   /************* object->spriteblit[7] *************/
862783
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);
866787
867788   if (blit5_unused) printf("unknown bits in blit word %d -  %08x\n", 7, OriginUnused);
868789
869790   //printf("%04x %04x\n", vOrigin, hOrigin);
870791
871   /************* m_spriteblit[8] *************/
792   /************* object->spriteblit[8] *************/
872793
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);
875796
876   /************* m_spriteblit[9] *************/
797   /************* object->spriteblit[9] *************/
877798
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);
880801
881802   if (hPosition & 0x8000) hPosition -= 0x10000;
882803   if (vPosition & 0x8000) vPosition -= 0x10000;
883804
884   /************* m_spriteblit[10] *************/
805   /************* object->spriteblit[10] *************/
885806
886807   // 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
888809
889   /************* m_spriteblit[11] *************/
810   /************* object->spriteblit[11] *************/
890811
891   UINT32 textlookup =  m_spriteblit[11];
812   //UINT32 textlookup = 0; // we've cached the data here already
892813
893814
894815
r21407r21408
919840
920841
921842
922   bitmap_rgb32* drawbitmap;
923843
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   */
932844
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
940845   int sizey = used_vCellCount * 16 * vZoom;
941846
942847   vPosition *= 0x40;
r21407r21408
961866
962867
963868
964   UINT32 lastSpriteNumber = 0xffffffff;
965869   // Splat some sprites
966870   for (int v = 0; v < used_vCellCount; v++)
967871   {
872
873
968874      const int pixelOffsetY = ((vPosition) + (v* 16 * vZoom)) / 0x40;
969875
970876      if (pixelOffsetY>383)
r21407r21408
974880      }
975881
976882
977
978883      UINT16 hZoomTable[16];
979884      int hPositionTable[16];
980885
886
981887      for (int idx=0;idx<16;idx++)
982888      {
983889
984890         if (indirect_zoom_enable)
985891         {
986            UINT32 dword = space.read_dword(blit10);
892            UINT32 dword = object->indirect_zoom[blit10];
987893
988894            hZoomTable[idx] = hZoom + (dword>>16); // add original value?
989895
r21407r21408
992898            if (linescroll & 0x4000) linescroll -= 0x8000;
993899
994900            hPositionTable[idx] = linescroll + hPosition;
995            blit10+=4;
901            blit10++;
996902
997903
998904         }
r21407r21408
1026932         }
1027933
1028934      }
1029//   printf("%08x %08x %08x %04x %04x\n",textlookup,m_spriteblit[3],b3romoffset,b1colorNumber,b2colorNumber);
1030      //PRINT_BLIT_STUFF
1031935
936
1032937      for (int h = 0; h < used_hCellCount; h++)
1033938      {
939         
1034940
941
942         UINT32 lastSpriteNumber = 0xffffffff;
943
1035944         int lookupnum;
1036945
1037946         // with this bit enabled the tile numbers gets looked up using 'data' (which would be blit11) (eg 03f40000 for startup text)
1038947         // this allows text strings to be written as 8-bit ascii in one area (using command 0x10), and drawn using multi-width sprites
1039948         if (indirect_tile_enable)
1040949         {
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)];
1042952         }
1043953         else
1044954         {
r21407r21408
1080990            }
1081991         }
1082992
1083
1084
1085993         // 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 ]);
1087995         UINT16 tempshape[16*16];
1088
996         
1089997         int color_offs = (0x7b20 + (b1colorNumber & 0x7ff))*0x40 * 5; /* yes, * 5 */
1090998
1091999         // skip the decoding if it's the same tile as last time!
r21407r21408
10991007            while (data_written<256)
11001008            {
11011009
1102               UINT16 compdata = m_expanded_10bit_gfx[ (b3romoffset) + spriteNumber + i];
1010               UINT16 compdata = expanded_10bit_gfx[ (b3romoffset) + spriteNumber + i];
11031011
11041012               if (((compdata & 0x300) == 0x000) || ((compdata & 0x300) == 0x100))
11051013               {
r21407r21408
11131021
11141022                  while (data_written<256 && encodelength >=0)
11151023                  {
1116                     tempshape[data_written] = m_rearranged_16bit_gfx[color_offs + rledata];
1024                     tempshape[data_written] = rearranged_16bit_gfx[color_offs + rledata];
11171025                     encodelength--;
11181026                     data_written++;
11191027                  }
r21407r21408
11261034
11271035                  while (data_written<256 && encodelength >=0)
11281036                  {
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
11301038                     encodelength--;
11311039                     data_written++;
11321040                  }
r21407r21408
11361044               {
11371045                  int rledata = (compdata & 0x0ff);
11381046                  // 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
11401048                  data_written++;
11411049               }
11421050
r21407r21408
11471055
11481056         if (!vZoom)
11491057         {
1150            m_blitterSerialCount++;
1151            return;
1058            // abort, but make sure we clean up
1059            goto end;
11521060         }
11531061
11541062         int blockhigh = ((16*vZoom)/0x40);
r21407r21408
11621070
11631071
11641072
1165
11661073         if (blit_rotate)
11671074         {
11681075            if (used_flipy)
r21407r21408
12571164                  }
12581165               }
12591166            }
1167         }
1168      }
1169   }
12601170
12611171
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... */
1189void 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);
12631313      }
12641314   }
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);
12651350}
12661351
1352
12671353WRITE32_MEMBER(coolridr_state::sysh1_blit_mode_w)
12681354{
12691355   m_blitterMode = (data & 0x00ff0000) >> 16;
r21407r21408
14511537
14521538         if(m_blitterClearMode == 0x8c200000)
14531539         {
1540            osd_work_queue_wait(m_work_queue[0], osd_ticks_per_second() * 100);
14541541            copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites[i], 0, 0, 0, 0, visarea);
14551542            m_temp_bitmap_sprites[i].fill(0, visarea);
14561543         }
14571544
14581545         if(m_blitterClearMode == 0x8c800000)
14591546         {
1547            osd_work_queue_wait(m_work_queue[1], osd_ticks_per_second() * 100);
14601548            copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2[i], 0, 0, 0, 0, visarea);
14611549            m_temp_bitmap_sprites2[i].fill(0, visarea);
14621550         }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team