Previous 199869 Revisions Next

r22069 Monday 25th March, 2013 at 09:34:10 UTC by Fabio Priuli
megadriv.c: small steps to keep a few 32x operations inside 32x. nw.
[src/mame/includes]megadriv.h
[src/mame/machine]mega32x.c mega32x.h megavdp.c
[src/mess/machine]md_slot.c

trunk/src/mame/machine/megavdp.c
r22068r22069
24982498void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running_machine &machine, int scanline)
24992499{
25002500   sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
2501   UINT16 *lineptr;
25012502
2502
2503   UINT16*lineptr;
2504   int x;
2505
25062503   if (!m_use_alt_timing)
2507   {
25082504      lineptr = &m_render_bitmap->pix16(scanline);
2509   }
25102505   else
2511   {
25122506      lineptr = m_render_line;
2513   }
25142507
2515
25162508   if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(scanline);
25172509
2518
2519
2520   if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
2510   for (int x = 0; x < 320; x++)
25212511   {
2522      for (x=0;x<320;x++)
2523      {
2524         UINT32 dat;
2525         dat = m_video_renderline[x];
2526         int drawn = 0;
2512      UINT32 dat = m_video_renderline[x];
2513      int drawn = 0;
25272514
2528         // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
2529         if (_32xdev)
2530         {
2531            if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
2532            {
2533               if (!_32xdev->m_32x_videopriority)
2534               {
2535                  if (!(_32xdev->m_32x_linerender[x]&0x8000))
2536                  {
2537                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2538                     drawn = 1;
2539                  }
2540               }
2541               else
2542               {
2543                  if ((_32xdev->m_32x_linerender[x]&0x8000))
2544                  {
2545                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2546                     drawn = 1;
2547                  }
2548               }
2549            }
2550         }
2515      // low priority 32x - if it's the bg pen, we have a 32x, and its display is enabled...
2516      if (_32xdev && dat & 0x20000)
2517         drawn = _32xdev->_32x_render_videobuffer_to_screenbuffer_lopri(x, lineptr[x]);
25512518
2552         if (!(dat&0x20000))
2553            m_render_line_raw[x] = 0x100;
2554         else
2555            m_render_line_raw[x] = 0x000;
2519      if (!(dat & 0x20000))
2520         m_render_line_raw[x] = 0x100;
2521      else
2522         m_render_line_raw[x] = 0x000;
25562523
25572524
2558         if (drawn==0)
2525      if (!drawn)
2526      {
2527         if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
25592528         {
2560            if (dat&0x10000)
2529            if (dat & 0x10000)
25612530            {
2562               lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
2531               lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat & 0x3f)];
25632532               m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
25642533            }
25652534            else
25662535            {
2567               lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
2536               lineptr[x] = megadrive_vdp_palette_lookup[(dat & 0x3f)];
25682537               m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
25692538            }
2570         }
25712539
2572
2573
2574      }
2575   }
2576   else
2577   {
2578      for (x=0;x<320;x++)
2579      {
2580         UINT32 dat;
2581         dat = m_video_renderline[x];
2582
2583         int drawn = 0;
2584
2585         // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
2586         if (_32xdev)
2587         {
2588            if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
2589            {
2590               if (!_32xdev->m_32x_videopriority)
2591               {
2592                  if (!(_32xdev->m_32x_linerender[x]&0x8000))
2593                  {
2594                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2595                     drawn = 1;
2596                  }
2597               }
2598               else
2599               {
2600                  if ((_32xdev->m_32x_linerender[x]&0x8000))
2601                  {
2602                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2603                     drawn = 1;
2604                  }
2605               }
2606            }
26072540         }
2608
2609         if (!(dat&0x20000))
2610            m_render_line_raw[x] = 0x100;
26112541         else
2612            m_render_line_raw[x] = 0x000;
2613
2614
2615         if (drawn==0)
26162542         {
26172543            /* Verify my handling.. I'm not sure all cases are correct */
2618            switch (dat&0x1e000)
2544            switch (dat & 0x1e000)
26192545            {
26202546               case 0x00000: // low priority, no shadow sprite, no highlight = shadow
26212547               case 0x02000: // low priority, shadow sprite, no highlight = shadow
r22068r22069
26232549               case 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow
26242550               case 0x12000: // (sprite) low priority, shadow sprite, no highlight = shadow
26252551               case 0x16000: // (sprite) normal pri,   shadow sprite, no highlight = shadow?
2626                  lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x3f)];
2552                  lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat & 0x3f)];
26272553                  m_render_line_raw[x] |= (dat & 0x3f) | 0x000;
26282554                  break;
26292555
26302556               case 0x4000: // normal pri, no shadow sprite, no highlight = normal;
26312557               case 0x8000: // low pri, highlight sprite = normal;
2632                  lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
2558                  lineptr[x] = megadrive_vdp_palette_lookup[(dat & 0x3f)];
26332559                  m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
26342560                  break;
26352561
26362562               case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal;
26372563               case 0x18000: // (sprite) low pri, highlight sprite = normal;
2638                  lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
2564                  lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat & 0x3f)];
26392565                  m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
26402566                  break;
26412567
26422568
26432569               case 0x0c000: // normal pri, highlight set = highlight?
26442570               case 0x1c000: // (sprite) normal pri, highlight set = highlight?
2645                  lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x3f)];
2571                  lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat & 0x3f)];
26462572                  m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0;
26472573                  break;
26482574
r22068r22069
26512577               case 0x1a000: // (sprite)shadow set, highlight set - not possible
26522578               case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible
26532579               default:
2654                  lineptr[x] = m_render_line_raw[x] |= (machine.rand()&0x3f);
2655               break;
2580                  lineptr[x] = m_render_line_raw[x] |= (machine.rand() & 0x3f);
2581                  break;
26562582            }
2657
26582583         }
2659
2660
2661
26622584      }
26632585
2586      // high priority 32x
2587      if (_32xdev)
2588         _32xdev->_32x_render_videobuffer_to_screenbuffer_hipri(x, lineptr[x]);
26642589   }
2665
2666
2667   // high priority 32x
2668   if (_32xdev)
2669   {
2670      if (_32xdev->m_32x_displaymode != 0)
2671      {
2672         for (x=0;x<320;x++)
2673         {
2674            if (!_32xdev->m_32x_videopriority)
2675            {
2676               if ((_32xdev->m_32x_linerender[x]&0x8000))
2677                  lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2678            }
2679            else
2680            {
2681               if (!(_32xdev->m_32x_linerender[x]&0x8000))
2682                  lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2683            }
2684         }
2685      }
2686   }
26872590}
26882591
26892592void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine)
26902593{
26912594   int scanline = genesis_get_scanline_counter(machine);
2595
26922596   if (scanline >= 0 && scanline < m_visible_scanlines)
26932597   {
26942598      //if (MEGADRIVE_REG01_DMA_ENABLE==0) mame_printf_debug("off\n");
trunk/src/mame/machine/mega32x.c
r22068r22069
16021602
16031603
16041604
1605UINT32* sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline)
1605void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline)
16061606{
16071607   int x;
16081608
r22068r22069
17071707         }
17081708      }
17091709   }
1710}
17101711
1711   return m_32x_linerender;
1712int sega_32x_device::_32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr)
1713{
1714   int drawn = 0;
1715
1716   if (m_32x_displaymode != 0)
1717   {
1718      if (!m_32x_videopriority)
1719      {
1720         if (!(m_32x_linerender[x] & 0x8000))
1721         {
1722            lineptr = m_32x_linerender[x] & 0x7fff;
1723            drawn = 1;
1724         }
1725      }
1726      else
1727      {
1728         if (m_32x_linerender[x] & 0x8000)
1729         {
1730            lineptr = m_32x_linerender[x] & 0x7fff;
1731            drawn = 1;
1732         }
1733      }
1734   }
1735
1736   return drawn;
17121737}
17131738
1739void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr)
1740{
1741   if (m_32x_displaymode != 0)
1742   {
1743      if (!m_32x_videopriority)
1744      {
1745         if (m_32x_linerender[x] & 0x8000)
1746            lineptr = m_32x_linerender[x] & 0x7fff;
1747      }
1748      else
1749      {
1750         if (!(m_32x_linerender[x] & 0x8000))
1751            lineptr = m_32x_linerender[x] & 0x7fff;
1752      }
1753   }
1754}
1755
17141756static const sh2_cpu_core sh2_conf_master = { 0, NULL, _32x_fifo_available_callback };
17151757static const sh2_cpu_core sh2_conf_slave  = { 1, NULL, _32x_fifo_available_callback };
17161758
trunk/src/mame/machine/mega32x.h
r22068r22069
3333   required_device<dac_device> m_rch_pwm;
3434
3535   void pause_cpu();
36   
36
3737   // set some variables at start, depending on region (shall be moved to a device interface?)
3838   void set_framerate(int rate) { m_framerate = rate; }
3939   void set_32x_pal(bool pal) { m_32x_pal = pal ? 1 : 0; }
4040
41   
41
4242   DECLARE_READ32_MEMBER( _32x_sh2_master_4000_common_4002_r );
4343   DECLARE_READ32_MEMBER( _32x_sh2_slave_4000_common_4002_r );
4444   DECLARE_READ32_MEMBER( _32x_sh2_common_4004_common_4006_r );
r22068r22069
104104   DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w );
105105   DECLARE_WRITE16_MEMBER( _32x_sh2_slave_401e_w );
106106
107   UINT32* _32x_render_videobuffer_to_screenbuffer_helper(int scanline);
107   void _32x_render_videobuffer_to_screenbuffer_helper(int scanline);
108   int _32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr);
109   void _32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr);
108110   int sh2_master_pwmint_enable, sh2_slave_pwmint_enable;
109111
110112   void _32x_check_framebuffer_swap(bool enabled);
r22068r22069
112114   void _32x_scanline_cb0();
113115   void _32x_scanline_cb1(int scanline);
114116
115   /* our current main rendering code needs to know this for mixing in */
116   int m_32x_displaymode;
117   int m_32x_videopriority;
118117   /* our main vblank handler resets this */
119118   int m_32x_hcount_compare_val;
120119   int m_sh2_are_running;
121120   int m_32x_240mode;
122121   UINT16 m_32x_a1518a_reg;
123122
124
125   UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
126
127
128123   void handle_pwm_callback();
129124   void calculate_pwm_timer();
130125   UINT16 m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg;
r22068r22069
138133   UINT16 get_hposition(void);
139134
140135   emu_timer *m_32x_pwm_timer;
136
141137protected:
142138   virtual void device_start();
143139   virtual void device_reset();
r22068r22069
145141   // optional information overrides
146142//  virtual const rom_entry *device_rom_region() const;
147143   virtual machine_config_constructor device_mconfig_additions() const;
144
148145private:
146
147   int m_32x_displaymode;
148   int m_32x_videopriority;
149   UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
150
149151//  virtual void device_config_complete();
150152   int m_32x_adapter_enabled;
151153   int m_32x_access_auth;
trunk/src/mame/includes/megadriv.h
r22068r22069
9797      m_segacd(*this,"segacd"),
9898      m_megadrive_ram(*this,"megadrive_ram")
9999   { }
100   optional_device<cpu_device> m_maincpu;
100   required_device<cpu_device> m_maincpu;
101101   optional_device<cpu_device> m_z80snd;
102102   required_device<sega_genesis_vdp_device> m_vdp;
103103   optional_device<sega_32x_device> m_32x;
trunk/src/mess/machine/md_slot.c
r22068r22069
886886      }
887887      else
888888      {
889         logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n");
890
889891         // Unfortunately, there are ROMs without correct info in the header,
890892         // Hence, when loading from fullpath we do the SRAM mapping anyway...
891893         // but treat it in a custom way

Previous 199869 Revisions Next


© 1997-2024 The MAME Team