Previous 199869 Revisions Next

r17401 Wednesday 22nd August, 2012 at 15:47:15 UTC by Angelo Salese
State-ized snes_vram too
[src/mame/includes]snes.h
[src/mame/video]snes.c

trunk/src/mame/video/snes.c
r17400r17401
130130   SNES_COLOR_DEPTH_8BPP
131131};
132132
133static UINT8  *snes_vram;      /* Video RAM (Should be 16-bit, but it's easier this way) */
134
135133/*****************************************
136134 * snes_get_bgcolor()
137135 *
r17400r17401
313311
314312   for (ii = 0; ii < planes / 2; ii++)
315313   {
316      plane[2 * ii + 0] = snes_vram[(tileaddr + 16 * ii + 0) % SNES_VRAM_SIZE];
317      plane[2 * ii + 1] = snes_vram[(tileaddr + 16 * ii + 1) % SNES_VRAM_SIZE];
314      plane[2 * ii + 0] = m_snes_vram[(tileaddr + 16 * ii + 0) % SNES_VRAM_SIZE];
315      plane[2 * ii + 1] = m_snes_vram[(tileaddr + 16 * ii + 1) % SNES_VRAM_SIZE];
318316   }
319317
320318   for (ii = x; ii < (x + 8); ii++)
r17400r17401
371369 * BG drawing theory of each scanline is quite easy: depending on the graphics Mode (0-7), there
372370 * are up to 4 background layers. Pixels for each BG layer can have two different priorities.
373371 * Depending on the line and on the BGHOFS and BGVOFS PPU registers, we first determine the tile
374 * address in snes_vram (by determining x,y coord and tile size and by calling snes_get_tmap_addr).
372 * address in m_snes_vram (by determining x,y coord and tile size and by calling snes_get_tmap_addr).
375373 * Then, we load the correspondent data and we determine the tile properties: which priority to
376374 * use, which palette etc. Finally, for each pixel of the tile appearing on screen, we check if
377375 * the tile priority is higher than the BG/OAM already stored in that pixel for that line. If so
r17400r17401
478476            case SNES_OPT_MODE6:
479477               haddr = snes_get_tmap_addr(SNES_BG3, snes_ppu.layer[SNES_BG3].tile_size, snes_ppu.layer[SNES_BG3].tilemap << 9, (opt_x - 8) + ((snes_ppu.layer[SNES_BG3].hoffs & 0x3ff) & ~7), (snes_ppu.layer[SNES_BG3].voffs & 0x3ff));
480478               vaddr = snes_get_tmap_addr(SNES_BG3, snes_ppu.layer[SNES_BG3].tile_size, snes_ppu.layer[SNES_BG3].tilemap << 9, (opt_x - 8) + ((snes_ppu.layer[SNES_BG3].hoffs & 0x3ff) & ~7), (snes_ppu.layer[SNES_BG3].voffs & 0x3ff) + 8);
481               hval = snes_vram[haddr % SNES_VRAM_SIZE] | (snes_vram[(haddr + 1) % SNES_VRAM_SIZE] << 8);
482               vval = snes_vram[vaddr % SNES_VRAM_SIZE] | (snes_vram[(vaddr + 1) % SNES_VRAM_SIZE] << 8);
479               hval = m_snes_vram[haddr % SNES_VRAM_SIZE] | (m_snes_vram[(haddr + 1) % SNES_VRAM_SIZE] << 8);
480               vval = m_snes_vram[vaddr % SNES_VRAM_SIZE] | (m_snes_vram[(vaddr + 1) % SNES_VRAM_SIZE] << 8);
483481               if (BIT(hval, opt_bit))
484482                  xpos = opt_x + (hval & ~7);
485483               if (BIT(vval, opt_bit))
r17400r17401
487485               break;
488486            case SNES_OPT_MODE4:
489487               haddr = snes_get_tmap_addr(SNES_BG3, snes_ppu.layer[SNES_BG3].tile_size, snes_ppu.layer[SNES_BG3].tilemap << 9, (opt_x - 8) + ((snes_ppu.layer[SNES_BG3].hoffs & 0x3ff) & ~7), (snes_ppu.layer[SNES_BG3].voffs & 0x3ff));
490               hval = snes_vram[haddr % SNES_VRAM_SIZE] | (snes_vram[(haddr + 1) % SNES_VRAM_SIZE] << 8);
488               hval = m_snes_vram[haddr % SNES_VRAM_SIZE] | (m_snes_vram[(haddr + 1) % SNES_VRAM_SIZE] << 8);
491489               if (BIT(hval, opt_bit))
492490               {
493491                  if (!BIT(hval, 15))
r17400r17401
511509          ppp  = Tile palette. The number of entries in the palette depends on the Mode and the BG.
512510          cccccccccc = Tile number.
513511        */
514      tilemap = snes_vram[addr % SNES_VRAM_SIZE] | (snes_vram[(addr + 1) % SNES_VRAM_SIZE] << 8);
512      tilemap = m_snes_vram[addr % SNES_VRAM_SIZE] | (m_snes_vram[(addr + 1) % SNES_VRAM_SIZE] << 8);
515513      vflip = BIT(tilemap, 15);
516514      hflip = BIT(tilemap, 14);
517515      priority = BIT(tilemap, 13) ? priority_a : priority_b;
r17400r17401
693691         case 0x01:   /* Repeat if outside screen area */
694692            tx &= 0x3ff;
695693            ty &= 0x3ff;
696            tiled = snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
697            colour = snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
694            tiled = m_snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
695            colour = m_snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
698696            break;
699697         case 0x02:   /* Single colour backdrop screen if outside screen area */
700698            if ((tx >= 0) && (tx < 1024) && (ty >= 0) && (ty < 1024))
701699            {
702               tiled = snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
703               colour = snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
700               tiled = m_snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
701               colour = m_snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
704702            }
705703            else
706704               colour = 0;
707705            break;
708706         case 0x03:   /* Character 0x00 repeat if outside screen area */
709707            if ((tx >= 0) && (tx < 1024) && (ty >= 0) && (ty < 1024))
710               tiled = snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
708               tiled = m_snes_vram[((((tx >> 3) & 0x7f) + (((ty >> 3) & 0x7f) * 128)) * 2) % SNES_VRAM_SIZE] << 7;
711709            else
712710               tiled = 0;
713711
714            colour = snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
712            colour = m_snes_vram[(tiled + ((tx & 0x07) * 2) + ((ty & 0x07) * 16) + 1) % SNES_VRAM_SIZE];
715713            break;
716714      }
717715
r17400r17401
16631661   memset(&debug_options, 0, sizeof(debug_options));
16641662#endif
16651663
1666   snes_vram = auto_alloc_array(machine, UINT8, SNES_VRAM_SIZE);
1664   state->m_snes_vram = auto_alloc_array(machine, UINT8, SNES_VRAM_SIZE);
16671665   state->m_snes_cgram = auto_alloc_array(machine, UINT16, SNES_CGRAM_SIZE/2);
16681666   state->m_snes_oam = auto_alloc_array(machine, UINT16, SNES_OAM_SIZE/2);
16691667
r17400r17401
16861684   }
16871685
16881686   /* Init VRAM */
1689   memset(snes_vram, 0, SNES_VRAM_SIZE);
1687   memset(state->m_snes_vram, 0, SNES_VRAM_SIZE);
16901688
1691   /* Init Character Graphics RAM */
1689   /* Init Palette RAM */
16921690   memset((UINT8 *)state->m_snes_cgram, 0, SNES_CGRAM_SIZE);
16931691
16941692   /* Init oam RAM */
1695   memset(state->m_snes_oam, 0xff, SNES_OAM_SIZE);
1693   memset((UINT8 *)state->m_snes_oam, 0xff, SNES_OAM_SIZE);
16961694
16971695   for (i = 0; i < 6; i++)
16981696   {
r17400r17401
17821780   state_save_register_global(machine, snes_ppu.color_modes);
17831781   state_save_register_global(machine, snes_ppu.stat77_flags);
17841782
1785   state_save_register_global_pointer(machine, snes_vram, SNES_VRAM_SIZE);
1783   state_save_register_global_pointer(machine, state->m_snes_vram, SNES_VRAM_SIZE);
17861784   state_save_register_global_pointer(machine, state->m_snes_cgram, SNES_CGRAM_SIZE/2);
17871785   state_save_register_global_pointer(machine, state->m_snes_oam, SNES_OAM_SIZE/2);
17881786}
r17400r17401
18811879   return addr;
18821880}
18831881
1884static READ8_HANDLER( snes_vram_read )
1882READ8_MEMBER( snes_state::snes_vram_read )
18851883{
18861884   UINT8 res = 0;
18871885   offset &= 0x1ffff;
18881886
18891887   if (snes_ppu.screen_disabled)
1890      res = snes_vram[offset];
1888      res = m_snes_vram[offset];
18911889   else
18921890   {
1893      UINT16 v = space->machine().primary_screen->vpos();
1894      UINT16 h = space->machine().primary_screen->hpos();
1891      UINT16 v = machine().primary_screen->vpos();
1892      UINT16 h = machine().primary_screen->hpos();
18951893      UINT16 ls = (((snes_ram[STAT78] & 0x10) == SNES_NTSC ? 525 : 625) >> 1) - 1;
18961894
18971895      if (snes_ppu.interlace == 2)
r17400r17401
19041902      else if (v == snes_ppu.beam.last_visible_line - 1)
19051903      {
19061904         if (h == 1362)
1907            res = snes_vram[offset];
1905            res = m_snes_vram[offset];
19081906         else
19091907            res = 0;
19101908      }
19111909      else
1912         res = snes_vram[offset];
1910         res = m_snes_vram[offset];
19131911   }
19141912   return res;
19151913}
19161914
1917static WRITE8_HANDLER( snes_vram_write )
1915WRITE8_MEMBER( snes_state::snes_vram_write )
19181916{
19191917   offset &= 0x1ffff;
19201918
19211919   if (snes_ppu.screen_disabled)
1922      snes_vram[offset] = data;
1920      m_snes_vram[offset] = data;
19231921   else
19241922   {
1925      UINT16 v = space->machine().primary_screen->vpos();
1926      UINT16 h = space->machine().primary_screen->hpos();
1923      UINT16 v = machine().primary_screen->vpos();
1924      UINT16 h = machine().primary_screen->hpos();
19271925      if (v == 0)
19281926      {
19291927         if (h <= 4)
1930            snes_vram[offset] = data;
1928            m_snes_vram[offset] = data;
19311929         else if (h == 6)
1932            snes_vram[offset] = snes_open_bus_r(space, 0);
1930            m_snes_vram[offset] = snes_open_bus_r(&space, 0);
19331931         else
19341932         {
19351933            //no write
r17400r17401
19461944            //no write
19471945         }
19481946         else
1949            snes_vram[offset] = data;
1947            m_snes_vram[offset] = data;
19501948      }
19511949      else
1952         snes_vram[offset] = data;
1950         m_snes_vram[offset] = data;
19531951   }
19541952}
19551953
r17400r17401
21562154
21572155            if (!state->m_vram_fgr_high)
21582156            {
2159               state->m_vram_read_buffer = snes_vram_read(space, addr);
2160               state->m_vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8);
2157               state->m_vram_read_buffer = state->snes_vram_read(*space, addr);
2158               state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8);
21612159
21622160               state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff;
21632161            }
r17400r17401
21712169
21722170            if (state->m_vram_fgr_high)
21732171            {
2174               state->m_vram_read_buffer = snes_vram_read(space, addr);
2175               state->m_vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8);
2172               state->m_vram_read_buffer = state->snes_vram_read(*space, addr);
2173               state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8);
21762174
21772175               state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff;
21782176            }
r17400r17401
24022400            UINT32 addr;
24032401            state->m_vmadd = (state->m_vmadd & 0xff00) | (data << 0);
24042402            addr = snes_get_vram_address(space->machine()) << 1;
2405            state->m_vram_read_buffer = snes_vram_read(space, addr);
2406            state->m_vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8);
2403            state->m_vram_read_buffer = state->snes_vram_read(*space, addr);
2404            state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8);
24072405         }
24082406         break;
24092407      case VMADDH:   /* Address for VRAM read/write (high) */
r17400r17401
24112409            UINT32 addr;
24122410            state->m_vmadd = (state->m_vmadd & 0x00ff) | (data << 8);
24132411            addr = snes_get_vram_address(space->machine()) << 1;
2414            state->m_vram_read_buffer = snes_vram_read(space, addr);
2415            state->m_vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8);
2412            state->m_vram_read_buffer = state->snes_vram_read(*space, addr);
2413            state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8);
24162414         }
24172415         break;
24182416      case VMDATAL:   /* 2118: Data for VRAM write (low) */
24192417         {
24202418            UINT32 addr = snes_get_vram_address(space->machine()) << 1;
2421            snes_vram_write(space, addr, data);
2419            state->snes_vram_write(*space, addr, data);
24222420
24232421            if (!state->m_vram_fgr_high)
24242422               state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff;
r17400r17401
24272425      case VMDATAH:   /* 2119: Data for VRAM write (high) */
24282426         {
24292427            UINT32 addr = snes_get_vram_address(space->machine()) << 1;
2430            snes_vram_write(space, addr + 1, data);
2428            state->snes_vram_write(*space, addr + 1, data);
24312429
24322430            if (state->m_vram_fgr_high)
24332431               state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff;
trunk/src/mame/includes/snes.h
r17400r17401
527527   DECLARE_WRITE8_MEMBER( snes_oam_write );
528528   DECLARE_READ8_MEMBER( snes_cgram_read );
529529   DECLARE_WRITE8_MEMBER( snes_cgram_write );
530   DECLARE_READ8_MEMBER( snes_vram_read );
531   DECLARE_WRITE8_MEMBER( snes_vram_write );
530532   UINT16 *m_snes_oam;      /* Object Attribute Memory */
531   UINT16 *m_snes_cgram;      /* Character Graphics RAM */
533   UINT16 *m_snes_cgram;   /* Palette RAM */
534   UINT8  *m_snes_vram;   /* Video RAM (TODO: Should be 16-bit, but it's easier this way) */
532535
533536};
534537

Previous 199869 Revisions Next


© 1997-2024 The MAME Team