Previous 199869 Revisions Next

r21280 Thursday 21st February, 2013 at 20:29:39 UTC by Angelo Salese
No more migraine inducting flickering
[src/mame/drivers]coolridr.c

trunk/src/mame/drivers/coolridr.c
r21279r21280
400400   UINT16 m_textOffset;
401401   UINT16 m_vCellCount;
402402   UINT16 m_hCellCount;
403   UINT32 m_blitterClearMode;
404   INT16 m_blitterClearCount;
403405   int m_vPosition;
404406   int m_hPosition;
405407
r21279r21280
446448   required_shared_ptr<UINT16> m_soundram2;
447449   bitmap_rgb32 m_temp_bitmap_sprites;
448450   bitmap_rgb32 m_temp_bitmap_sprites2;
451   bitmap_rgb32 m_screen1_bitmap;
452   bitmap_rgb32 m_screen2_bitmap;
449453   int m_color;
450454   UINT8 m_vblank;
451455   int m_scsp_last_line;
r21279r21280
488492   INTERRUPT_GEN_MEMBER(system_h1);
489493   TIMER_DEVICE_CALLBACK_MEMBER(system_h1_main);
490494   TIMER_DEVICE_CALLBACK_MEMBER(system_h1_sub);
495
496   void sysh1_dma_transfer( address_space &space, UINT16 dma_index );
497
491498};
492499
493500#define PRINT_BLIT_STUFF \
r21279r21280
500507{
501508   machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites);
502509   machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2);
510   machine().primary_screen->register_screen_bitmap(m_screen1_bitmap);
511   machine().primary_screen->register_screen_bitmap(m_screen2_bitmap);
503512}
504513
505514// might be a page 'map / base' setup somewhere, but it's just used for ingame backgrounds
r21279r21280
571580
572581   if (which==0)
573582   {
574      copybitmap_trans(bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, cliprect, 0);
575      m_temp_bitmap_sprites.fill(0, cliprect);
583      copybitmap_trans(bitmap, m_screen1_bitmap, 0, 0, 0, 0, cliprect, 0);
576584   }
577585   else
578586   {
579      copybitmap_trans(bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, cliprect, 0);
580      m_temp_bitmap_sprites2.fill(0, cliprect);
587      copybitmap_trans(bitmap, m_screen2_bitmap, 0, 0, 0, 0, cliprect, 0);
581588   }
582589
583590   return 0;
r21279r21280
624631
625632
626633
634/*
635         if(type == 4)
627636
628637
638*/
639
629640/* This is a RLE-based sprite blitter (US Patent #6,141,122), very unusual from Sega... */
630641WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
631642{
r21279r21280
634645
635646   switch(offset)
636647   {
648      /*
649      This does the fb display/clear phases of blitter data processed in the previous frame.
650      And yes, game effectively runs at 30 Hz (because data processing happens on even frames, actual display transfer happens on odd frames).
651      screen 1
652      8c200000 06
653      00000001 07
654      0000017f 07 Y range (upper start, lower end)
655      000701f7 07 X range (upper start, lower end)
656      00000007 07 enable?
657      screen 2
658      8c800000 06
659      00000001 07
660      0000017f 07
661      020703f7 07
662      00000207 07 enable plus clear?
663      */
664      case 0x06:
665         m_blitterClearMode = m_sysh1_txt_blit[offset];
666
667         if(m_blitterClearMode != 0x8c200000 && m_blitterClearMode != 0x8c800000)
668            printf("Blitter Clear used with param %08x\n",m_blitterClearMode);
669
670         m_blitterClearCount = 0;
671         break;
672
673      case 0x07:
674         if(m_blitterClearCount == 0)
675         {
676            if(m_sysh1_txt_blit[offset] != 1)
677               printf("Blitter Clear Count == 0 used with param %08x\n",m_sysh1_txt_blit[offset]);
678         }
679         else if(m_blitterClearCount == 1)
680         {
681            if(m_sysh1_txt_blit[offset] != 0x17f)
682               printf("Blitter Clear Count == 1 used with param %08x\n",m_sysh1_txt_blit[offset]);
683         }
684         else if(m_blitterClearCount == 2)
685         {
686            if(m_sysh1_txt_blit[offset] != 0x000701f7 && m_sysh1_txt_blit[offset] != 0x020703f7)
687               printf("Blitter Clear Count == 2 used with param %08x\n",m_sysh1_txt_blit[offset]);
688         }
689         else if(m_blitterClearCount == 3)
690         {
691            if(m_sysh1_txt_blit[offset] != 0x00000007 && m_sysh1_txt_blit[offset] != 0x00000207)
692               printf("Blitter Clear Count == 3 used with param %08x\n",m_sysh1_txt_blit[offset]);
693
694            {
695               const rectangle& visarea = machine().primary_screen->visible_area();
696
697               if(m_blitterClearMode == 0x8c200000)
698               {
699                  copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, visarea);
700                  m_temp_bitmap_sprites.fill(0, visarea);
701               }
702
703               if(m_blitterClearMode == 0x8c800000)
704               {
705                  copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea);
706                  m_temp_bitmap_sprites2.fill(0, visarea);
707               }
708            }
709         }
710         else
711         {
712            printf("Blitter Clear Count == %02x used with param %08x\n",m_blitterClearCount,m_sysh1_txt_blit[offset]);
713         }
714
715
716         m_blitterClearCount++;
717         break;
718
637719      // The mode register
638720      case 0x04:
639721      {
r21279r21280
12551337                           }
12561338                        }
12571339
1258                       
1340
12591341                        // these should be 'cell numbers' (tile numbers) which look up RLE data?
12601342                        UINT32 spriteNumber = (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) + 1 ]);
12611343
r21279r21280
13271409                        // DEBUG: Draw 16x16 block
13281410                        UINT32* line;
13291411                        if (m_b4flipy)
1330                        {                 
1412                        {
13311413                           for (int y = 0; y < 16; y++)
13321414                           {
13331415                              const int drawy = pixelOffsetY+y;
r21279r21280
14731555
14741556
14751557/* FIXME: this seems to do a hell lot of stuff, it's not ST-V SCU but still somewhat complex :/ */
1476static void sysh1_dma_transfer( address_space &space, UINT16 dma_index )
1558void coolridr_state::sysh1_dma_transfer( address_space &space, UINT16 dma_index )
14771559{
1478   coolridr_state *state = space.machine().driver_data<coolridr_state>();
14791560   UINT32 src,dst,size,type,s_i;
14801561   UINT8 end_dma_mark;
14811562
14821563   end_dma_mark = 0;
14831564
14841565   do{
1485      src = (state->m_framebuffer_vram[(0+dma_index)/4] & 0x0fffffff);
1486      dst = (state->m_framebuffer_vram[(4+dma_index)/4]);
1487      size = state->m_framebuffer_vram[(8+dma_index)/4];
1488      type = (state->m_framebuffer_vram[(0+dma_index)/4] & 0xf0000000) >> 28;
1566      src = (m_framebuffer_vram[(0+dma_index)/4] & 0x0fffffff);
1567      dst = (m_framebuffer_vram[(4+dma_index)/4]);
1568      size = m_framebuffer_vram[(8+dma_index)/4];
1569      type = (m_framebuffer_vram[(0+dma_index)/4] & 0xf0000000) >> 28;
14891570
14901571      #if 0
14911572      if(type == 0xc || type == 0xd || type == 0xe)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team