Previous 15994 Revisions Next

r7480 Monday 1st March, 2010 at 22:57:52 UTC by Fabio Priuli
[SNES] minor refactorization, part 3
[src/mame/includes]snes.h
[src/mame/machine]snes.c
[src/mame/video]snes.c

src/mame/machine/snes.c
r7479r7480
296296}
297297
298298/* FIXME: multiplication should take 8 CPU cycles & division 16 CPU cycles, but
299using these timers breaks e.g. Chrono Trigger intro and Super Tennis gameplay. */
299using these timers breaks e.g. Chrono Trigger intro and Super Tennis gameplay.
300On the other hand, timers are needed for the translation of Breath of Fire 2
301to work. More weirdness: we might need to leave 8 CPU cycles for division at
302first, since using 16 produces bugs (see e.g. Triforce pieces in Zelda 3 intro) */
300303
301304static TIMER_CALLBACK(snes_div_callback)
302305{
r7479r7480
949952      // Anomie says "H Current = (Byte<<8) | (Prev&~7) | ((Current>>8)&7); V Current = (Current<<8) | Prev;" and Prev is shared by all scrolls but in Mode 7!
950953      case BG1HOFS:   /* BG1 - horizontal scroll (DW) */
951954         /* In Mode 0->6 we use ppu_last_scroll as Prev */
952         snes_ppu.layer[SNES_BG1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].offset.horizontal >> 8) & 7);
955         snes_ppu.layer[SNES_BG1].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].hoffs >> 8) & 7);
953956         snes_ppu.ppu_last_scroll = data;
954957         /* In Mode 7 we use mode7_last_scroll as Prev */
955958         snes_ppu.mode7.hor_offset = (data << 8) | (snes_ppu.mode7_last_scroll & ~7) | ((snes_ppu.mode7.hor_offset >> 8) & 7);
r7479r7480
958961         return;
959962      case BG1VOFS:   /* BG1 - vertical scroll (DW) */
960963         /* In Mode 0->6 we use ppu_last_scroll as Prev */
961         snes_ppu.layer[SNES_BG1].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll;
964         snes_ppu.layer[SNES_BG1].voffs = (data << 8) | snes_ppu.ppu_last_scroll;
962965         snes_ppu.ppu_last_scroll = data;
963966         /* In Mode 7 we use mode7_last_scroll as Prev */
964967         snes_ppu.mode7.ver_offset = (data << 8) | snes_ppu.mode7_last_scroll;
r7479r7480
966969         snes_ppu.update_offsets = 1;
967970         return;
968971      case BG2HOFS:   /* BG2 - horizontal scroll (DW) */
969         snes_ppu.layer[SNES_BG2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].offset.horizontal >> 8) & 7);
972         snes_ppu.layer[SNES_BG2].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].hoffs >> 8) & 7);
970973         snes_ppu.ppu_last_scroll = data;
971974         snes_ppu.update_offsets = 1;
972975         return;
973976      case BG2VOFS:   /* BG2 - vertical scroll (DW) */
974         snes_ppu.layer[SNES_BG2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
977         snes_ppu.layer[SNES_BG2].voffs = (data << 8) | (snes_ppu.ppu_last_scroll);
975978         snes_ppu.ppu_last_scroll = data;
976979         snes_ppu.update_offsets = 1;
977980         return;
978981      case BG3HOFS:   /* BG3 - horizontal scroll (DW) */
979         snes_ppu.layer[SNES_BG3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].offset.horizontal >> 8) & 7);
982         snes_ppu.layer[SNES_BG3].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].hoffs >> 8) & 7);
980983         snes_ppu.ppu_last_scroll = data;
981984         snes_ppu.update_offsets = 1;
982985         return;
983986      case BG3VOFS:   /* BG3 - vertical scroll (DW) */
984         snes_ppu.layer[SNES_BG3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
987         snes_ppu.layer[SNES_BG3].voffs = (data << 8) | (snes_ppu.ppu_last_scroll);
985988         snes_ppu.ppu_last_scroll = data;
986989         snes_ppu.update_offsets = 1;
987990         return;
988991      case BG4HOFS:   /* BG4 - horizontal scroll (DW) */
989         snes_ppu.layer[SNES_BG4].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].offset.horizontal >> 8) & 7);
992         snes_ppu.layer[SNES_BG4].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].hoffs >> 8) & 7);
990993         snes_ppu.ppu_last_scroll = data;
991994         snes_ppu.update_offsets = 1;
992995         return;
993996      case BG4VOFS:   /* BG4 - vertical scroll (DW) */
994         snes_ppu.layer[SNES_BG4].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
997         snes_ppu.layer[SNES_BG4].voffs = (data << 8) | (snes_ppu.ppu_last_scroll);
995998         snes_ppu.ppu_last_scroll = data;
996999         snes_ppu.update_offsets = 1;
9971000         return;
r7479r7480
10261029               UINT32 rem = addr & vram_fgr_mask;
10271030               UINT32 faddr = (addr & ~vram_fgr_mask) + (rem >> vram_fgr_shift) + ((rem & (vram_fgr_count - 1)) << 3);
10281031
1029               vram_read_buffer = snes_vram[(faddr<<1)&0x1ffff] | snes_vram[((faddr<<1)+1) & 0x1ffff]<<8;
1032               vram_read_buffer = snes_vram[(faddr << 1) & 0x1ffff] | snes_vram[((faddr << 1) + 1) & 0x1ffff] << 8;
10301033            }
10311034            else
10321035            {
src/mame/includes/snes.h
r7479r7480
467467      UINT8 mosaic_enabled;   // actually used only for layers 0->3!
468468      UINT8 main_window_enabled;
469469      UINT8 sub_window_enabled;
470      struct
471      {
472         UINT16 horizontal;
473         UINT16 vertical;
474      } offset;
470
471      UINT16 hoffs;
472      UINT16 voffs;
475473   } layer[6];   // this is for the BG1 - BG2 - BG3 - BG4 - OBJ - color layers
476474
477475   struct
src/mame/video/snes.c
r7479r7480
456456   tile_size = snes_ppu.layer[layer].tile_size;
457457
458458   /* Find scroll info */
459   hscroll = (snes_ppu.layer[layer].offset.horizontal & 0x3ff) >> (3 + tile_size);
460   hshift = snes_ppu.layer[layer].offset.horizontal & ((8 << tile_size) - 1);
461   vscroll = ((snes_ppu.layer[layer].offset.vertical & 0x3ff) + curline) >> (3 + tile_size);
462   vshift = ((snes_ppu.layer[layer].offset.vertical & 0x3ff) + curline) & ((8 << tile_size) - 1);
459   hscroll = (snes_ppu.layer[layer].hoffs & 0x3ff) >> (3 + tile_size);
460   hshift = snes_ppu.layer[layer].hoffs & ((8 << tile_size) - 1);
461   vscroll = ((snes_ppu.layer[layer].voffs & 0x3ff) + curline) >> (3 + tile_size);
462   vshift = ((snes_ppu.layer[layer].voffs & 0x3ff) + curline) & ((8 << tile_size) - 1);
463463
464464   /* figure out which line to draw */
465465   if (vshift > ((8 << tile_size) - 1))   /* scrolled into the next tile */

Previous 15994 Revisions Next


© 1998-2018 The MESS Team