Previous 199869 Revisions Next

r17396 Wednesday 22nd August, 2012 at 15:09:51 UTC by Angelo Salese
State-ized CG RAM, nw
[src/mame/includes]snes.h
[src/mame/video]snes.c

trunk/src/mame/video/snes.c
r17395r17396
131131};
132132
133133static UINT8  *snes_vram;      /* Video RAM (Should be 16-bit, but it's easier this way) */
134static UINT16 *snes_cgram;      /* Colour RAM */
135134
136135/*****************************************
137136 * snes_get_bgcolor()
r17395r17396
150149      c |= ((palette & 0x04) >> 1) | ((palette & 0x08) << 3) | ((palette & 0x10) << 8);
151150   }
152151   else
153      c = snes_cgram[(palette + color) % FIXED_COLOUR];
152      c = m_snes_cgram[(palette + color) % FIXED_COLOUR];
154153
155154   return c;
156155}
r17395r17396
289288         /* Only draw if we have a colour (0 == transparent) */
290289         if (clr)
291290         {
292            c = snes_cgram[(pal + clr) % FIXED_COLOUR];
291            c = m_snes_cgram[(pal + clr) % FIXED_COLOUR];
293292            blend = (pal + clr < 192) ? 1 : 0;
294293            snes_set_scanline_pixel(screen, pos, c, priority, SNES_OAM, blend);
295294         }
r17395r17396
14291428            if (b > 0x1f) b = 0;
14301429         }
14311430         /* only halve if the color is not the back colour */
1432         if (BIT(snes_ppu.color_modes, 6) && (subscreen->buffer[offset] != snes_cgram[FIXED_COLOUR]))
1431         if (BIT(snes_ppu.color_modes, 6) && (subscreen->buffer[offset] != m_snes_cgram[FIXED_COLOUR]))
14331432         {
14341433            r >>= 1;
14351434            g >>= 1;
r17395r17396
14411440         if (!BIT(snes_ppu.color_modes, 7))
14421441         {
14431442            /* 0x00 add */
1444            r = (*colour & 0x1f) + (snes_cgram[FIXED_COLOUR] & 0x1f);
1445            g = ((*colour & 0x3e0) >> 5) + ((snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5);
1446            b = ((*colour & 0x7c00) >> 10) + ((snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
1443            r = (*colour & 0x1f) + (m_snes_cgram[FIXED_COLOUR] & 0x1f);
1444            g = ((*colour & 0x3e0) >> 5) + ((m_snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5);
1445            b = ((*colour & 0x7c00) >> 10) + ((m_snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
14471446            clip_max = 1;
14481447         }
14491448         else
14501449         {
14511450            /* 0x80: sub */
1452            r = (*colour & 0x1f) - (snes_cgram[FIXED_COLOUR] & 0x1f);
1453            g = ((*colour & 0x3e0) >> 5) - ((snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5);
1454            b = ((*colour & 0x7c00) >> 10) - ((snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
1451            r = (*colour & 0x1f) - (m_snes_cgram[FIXED_COLOUR] & 0x1f);
1452            g = ((*colour & 0x3e0) >> 5) - ((m_snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5);
1453            b = ((*colour & 0x7c00) >> 10) - ((m_snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
14551454            if (r > 0x1f) r = 0;
14561455            if (g > 0x1f) g = 0;
14571456            if (b > 0x1f) b = 0;
r17395r17396
15361535      for (ii = 0; ii < SNES_SCR_WIDTH; ii++)
15371536      {
15381537         if (snes_ppu.mode == 5 || snes_ppu.mode == 6 || snes_ppu.pseudo_hires)
1539            scanlines[SNES_SUBSCREEN].buffer[ii] = snes_cgram[0];
1538            scanlines[SNES_SUBSCREEN].buffer[ii] = m_snes_cgram[0];
15401539         else
1541            scanlines[SNES_SUBSCREEN].buffer[ii] = snes_cgram[FIXED_COLOUR];
1540            scanlines[SNES_SUBSCREEN].buffer[ii] = m_snes_cgram[FIXED_COLOUR];
15421541
1543         scanlines[SNES_MAINSCREEN].buffer[ii] = snes_cgram[0];
1542         scanlines[SNES_MAINSCREEN].buffer[ii] = m_snes_cgram[0];
15441543      }
15451544
15461545      /* Prepare OAM for this scanline */
r17395r17396
16651664#endif
16661665
16671666   snes_vram = auto_alloc_array(machine, UINT8, SNES_VRAM_SIZE);
1668   snes_cgram = auto_alloc_array(machine, UINT16, SNES_CGRAM_SIZE/2);
1667   state->m_snes_cgram = auto_alloc_array(machine, UINT16, SNES_CGRAM_SIZE/2);
16691668   state->m_snes_oam = auto_alloc_array(machine, UINT16, SNES_OAM_SIZE/2);
16701669
16711670   /* Inititialize registers/variables */
r17395r17396
16891688   /* Init VRAM */
16901689   memset(snes_vram, 0, SNES_VRAM_SIZE);
16911690
1692   /* Init Colour RAM */
1693   memset((UINT8 *)snes_cgram, 0, SNES_CGRAM_SIZE);
1691   /* Init Character Graphics RAM */
1692   memset((UINT8 *)state->m_snes_cgram, 0, SNES_CGRAM_SIZE);
16941693
16951694   /* Init oam RAM */
16961695   memset(state->m_snes_oam, 0xff, SNES_OAM_SIZE);
r17395r17396
17841783   state_save_register_global(machine, snes_ppu.stat77_flags);
17851784
17861785   state_save_register_global_pointer(machine, snes_vram, SNES_VRAM_SIZE);
1787   state_save_register_global_pointer(machine, snes_cgram, SNES_CGRAM_SIZE/2);
1786   state_save_register_global_pointer(machine, state->m_snes_cgram, SNES_CGRAM_SIZE/2);
17881787   state_save_register_global_pointer(machine, state->m_snes_oam, SNES_OAM_SIZE/2);
17891788}
17901789
r17395r17396
20372036 solution adopted by BSNES without enabling it.
20382037*************************************************/
20392038
2040static READ8_HANDLER( snes_cgram_read )
2039READ8_MEMBER( snes_state::snes_cgram_read )
20412040{
20422041   UINT8 res = 0;
20432042   offset &= 0x1ff;
r17395r17396
20532052   }
20542053#endif
20552054
2056   res = ((UINT8 *)snes_cgram)[offset];
2055   res = ((UINT8 *)m_snes_cgram)[offset];
20572056
20582057   // CGRAM palette data format is 15-bits (0,bbbbb,ggggg,rrrrr).
20592058   // Highest bit is simply ignored.
r17395r17396
20632062   return res;
20642063}
20652064
2066static WRITE8_HANDLER( snes_cgram_write )
2065WRITE8_MEMBER( snes_state::snes_cgram_write )
20672066{
20682067   offset &= 0x1ff;
20692068
r17395r17396
20862085   if (offset & 0x01)
20872086      data &= 0x7f;
20882087
2089   ((UINT8 *)snes_cgram)[offset] = data;
2088   ((UINT8 *)m_snes_cgram)[offset] = data;
20902089}
20912090
20922091READ8_HANDLER( snes_ppu_read )
r17395r17396
21822181         }
21832182      case RCGDATA:   /* Read data from CGRAM */
21842183         if (!(state->m_cgram_address & 0x01))
2185            snes_ppu.ppu2_open_bus = snes_cgram_read(space, state->m_cgram_address);
2184            snes_ppu.ppu2_open_bus = state->snes_cgram_read(*space, state->m_cgram_address);
21862185         else
21872186         {
21882187            snes_ppu.ppu2_open_bus &= 0x80;
2189            snes_ppu.ppu2_open_bus |= snes_cgram_read(space, state->m_cgram_address) & 0x7f;
2188            snes_ppu.ppu2_open_bus |= state->snes_cgram_read(*space, state->m_cgram_address) & 0x7f;
21902189         }
21912190
21922191         state->m_cgram_address = (state->m_cgram_address + 1) % (SNES_CGRAM_SIZE - 2);
r17395r17396
24692468         state->m_cgram_address = data << 1;
24702469         break;
24712470      case CGDATA:   /* Data for colour RAM */
2472         snes_cgram_write(space, state->m_cgram_address, data);
2471         state->snes_cgram_write(*space, state->m_cgram_address, data);
24732472         state->m_cgram_address = (state->m_cgram_address + 1) % (SNES_CGRAM_SIZE - 2);
24742473         break;
24752474      case W12SEL:   /* Window mask settings for BG1-2 */
r17395r17396
26132612            UINT8 r, g, b;
26142613
26152614            /* Get existing value. */
2616            r = snes_cgram[FIXED_COLOUR] & 0x1f;
2617            g = (snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5;
2618            b = (snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10;
2615            r = state->m_snes_cgram[FIXED_COLOUR] & 0x1f;
2616            g = (state->m_snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5;
2617            b = (state->m_snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10;
26192618            /* Set new value */
26202619            if (data & 0x20)
26212620               r = data & 0x1f;
r17395r17396
26232622               g = data & 0x1f;
26242623            if (data & 0x80)
26252624               b = data & 0x1f;
2626            snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10));
2625            state->m_snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10));
26272626         } break;
26282627      case SETINI:   /* Screen mode/video select */
26292628         snes_ppu.interlace = (data & 0x01) ? 2 : 1;
trunk/src/mame/includes/snes.h
r17395r17396
525525
526526   DECLARE_READ8_MEMBER( snes_oam_read );
527527   DECLARE_WRITE8_MEMBER( snes_oam_write );
528   DECLARE_READ8_MEMBER( snes_cgram_read );
529   DECLARE_WRITE8_MEMBER( snes_cgram_write );
528530   UINT16 *m_snes_oam;      /* Object Attribute Memory */
531   UINT16 *m_snes_cgram;      /* Character Graphics RAM */
529532
530533};
531534

Previous 199869 Revisions Next


© 1997-2024 The MAME Team