diff --git a/src/mame/includes/snes.h b/src/mame/includes/snes.h index 8fe6aa2566b..dd28ef3ec40 100644 --- a/src/mame/includes/snes.h +++ b/src/mame/includes/snes.h @@ -471,10 +471,6 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul { UINT16 horizontal; UINT16 vertical; - UINT16 tile_horz; - UINT8 shift_horz; - UINT16 tile_vert; - UINT16 shift_vert; } offset; } layer[6]; // this is for the BG1 - BG2 - BG3 - BG4 - OBJ - color layers diff --git a/src/mame/video/snes.c b/src/mame/video/snes.c index a73d44cc482..8361356d6ad 100644 --- a/src/mame/video/snes.c +++ b/src/mame/video/snes.c @@ -423,11 +423,11 @@ INLINE void snes_update_line( UINT8 screen, UINT8 color_depth, UINT8 hires, UINT { UINT32 tmap, tile; UINT16 ii, vflip, hflip, pal; - INT8 line, tile_line; + INT8 tile_line; UINT8 priority; /* scrolling */ UINT32 basevmap, charaddr; - UINT16 vscroll, hscroll, vtilescroll; + UINT16 vscroll, hscroll; // UINT16 offset_per_tile_valid; // UINT8 offset_per_tile_mode; UINT8 vshift, hshift, tile_size; @@ -454,36 +454,34 @@ INLINE void snes_update_line( UINT8 screen, UINT8 color_depth, UINT8 hires, UINT /* Find the size of the tiles (8x8 or 16x16) */ tile_size = snes_ppu.layer[layer].tile_size; - /* Find scroll info */ - vscroll = snes_ppu.layer[layer].offset.tile_vert; - vshift = snes_ppu.layer[layer].offset.shift_vert; - hscroll = snes_ppu.layer[layer].offset.tile_horz; - hshift = snes_ppu.layer[layer].offset.shift_horz; - /* Find vertical scroll amount */ - vtilescroll = vscroll + (curline >> (3 + tile_size)); + /* Find scroll info */ + hscroll = (snes_ppu.layer[layer].offset.horizontal & 0x3ff) >> (3 + tile_size); + hshift = snes_ppu.layer[layer].offset.horizontal & ((8 << tile_size) - 1); + vscroll = ((snes_ppu.layer[layer].offset.vertical & 0x3ff) + curline) >> (3 + tile_size); + vshift = ((snes_ppu.layer[layer].offset.vertical & 0x3ff) + curline) & ((8 << tile_size) - 1); + /* figure out which line to draw */ - line = (curline % (8 << tile_size)) + vshift; - if (line > ((8 << tile_size) - 1)) /* scrolled into the next tile */ + if (vshift > ((8 << tile_size) - 1)) /* scrolled into the next tile */ { - vtilescroll++; /* pretend we scrolled by 1 tile line */ - line -= (8 << tile_size); + vscroll++; /* pretend we scrolled by 1 tile line */ + vshift -= (8 << tile_size); } - if (vtilescroll >= 128) - vtilescroll -= 128; + if (vscroll >= 128) + vscroll -= 128; /* Jump to base map address */ tmap = snes_ppu.layer[layer].tilemap << 9; charaddr = snes_ppu.layer[layer].charmap << 13; /* Offset vertically */ - tmap += table_vscroll[snes_ppu.layer[layer].tilemap_size & 3][(vtilescroll >> 5) & 3]; + tmap += (snes_ppu.layer[layer].tilemap_size & 2) ? ((vscroll & 0x20) << ((snes_ppu.layer[layer].tilemap_size & 1) ? 7 : 6)) : 0; /* Scroll vertically */ - tmap += (vtilescroll & 0x1f) << 6; + tmap += (vscroll & 0x1f) << 6; /* Remember this position */ basevmap = tmap; /* Offset horizontally */ - tmap += table_hscroll[snes_ppu.layer[layer].tilemap_size & 3][(hscroll >> 5) & 3]; + tmap += (snes_ppu.layer[layer].tilemap_size & 1) ? ((hscroll & 0x20) << 6) : 0; /* Scroll horizontally */ tmap += (hscroll & 0x1f) << 1; @@ -543,12 +541,12 @@ INLINE void snes_update_line( UINT8 screen, UINT8 color_depth, UINT8 hires, UINT pal += (layer << 5); } - tile_line = line; + tile_line = vshift; if (vflip) { if (tile_size) { - if (line > 7) + if (tile_line > 7) { tile_line -= 8; } @@ -561,7 +559,7 @@ INLINE void snes_update_line( UINT8 screen, UINT8 color_depth, UINT8 hires, UINT } else { - if (line > 7) + if (tile_line > 7) { tile += 32 / tile_divider; tile_line -= 8; @@ -572,26 +570,7 @@ INLINE void snes_update_line( UINT8 screen, UINT8 color_depth, UINT8 hires, UINT /* below, only color_planes depends on color_depth */ if (tile_size) { - #if 0 - /* Bishoujo Janshi SuchiiPai and Desert Fighter sets this in hires, no noticeable difference apart that x must be doubled somehow... */ - if (hires) /* Hi-Res: 2bpp & 4bpp */ - { - if (hflip) - { - snes_draw_tile_x2(screen, color_planes, layer, charaddr + (tile * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << (tile_size + 1))) - (hshift << 1) + 16, priority, hflip, pal); - snes_draw_tile_x2(screen, color_planes, layer, charaddr + ((tile + 2) * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << (tile_size + 1))) - (hshift << 1), priority, hflip, pal); - } - else - { - snes_draw_tile_x2(screen, color_planes, layer, charaddr + (tile * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << (tile_size + 1))) - (hshift << 1), priority, hflip, pal); - snes_draw_tile_x2(screen, color_planes, layer, charaddr + ((tile + 2) * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << (tile_size + 1))) - (hshift << 1) + 16, priority, hflip, pal); - } - } - else /* No Hi-Res: 2bpp, 4bpp & 8bpp */ - #endif - { - snes_draw_tile_x2(screen, color_planes, layer, charaddr + (tile * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << tile_size)) - hshift, priority, hflip, pal, direct_colors); - } + snes_draw_tile_x2(screen, color_planes, layer, charaddr + (tile * 8 * color_planes) + tile_line, ((ii >> 1) * (8 << tile_size)) - hshift, priority, hflip, pal, direct_colors); } else /* tile_size = 0 */ { @@ -1099,23 +1078,7 @@ static void snes_update_offsets(void) int ii; for (ii = 0; ii < 4; ii++) { - snes_ppu.layer[ii].offset.tile_horz = (snes_ppu.layer[ii].offset.horizontal & 0x3ff) >> (3 + snes_ppu.layer[ii].tile_size); - snes_ppu.layer[ii].offset.shift_horz = snes_ppu.layer[ii].offset.horizontal & ((8 << snes_ppu.layer[ii].tile_size) - 1); - snes_ppu.layer[ii].offset.tile_vert = (snes_ppu.layer[ii].offset.vertical & 0x3ff) >> (3 + snes_ppu.layer[ii].tile_size); - snes_ppu.layer[ii].offset.shift_vert = snes_ppu.layer[ii].offset.vertical & ((8 << snes_ppu.layer[ii].tile_size) - 1); } - #if 0 - popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x", - snes_ppu.layer[SNES_BG1].offset.tile_horz, - snes_ppu.layer[SNES_BG1].offset.tile_vert, - snes_ppu.layer[SNES_BG2].offset.tile_horz, - snes_ppu.layer[SNES_BG2].offset.tile_vert, - snes_ppu.layer[SNES_BG3].offset.tile_horz, - snes_ppu.layer[SNES_BG3].offset.tile_vert, - snes_ppu.layer[SNES_BG4].offset.tile_horz, - snes_ppu.layer[SNES_BG4].offset.tile_vert - ); - #endif snes_ppu.update_offsets = 0; }