not worth mention: snes.c: improved sprite overlap, simplified oam address handling, fixed sprite blend exception

This commit is contained in:
Fabio Priuli 2010-03-16 08:19:23 +00:00
parent f86082b904
commit 9643ea2a44
2 changed files with 28 additions and 32 deletions

View File

@ -461,8 +461,7 @@ READ8_HANDLER( snes_r_io )
if (snes_ram[OAMDATA] == 0) if (snes_ram[OAMDATA] == 0)
{ {
snes_ppu.oam.address++; snes_ppu.oam.address++;
snes_ppu.oam.address_low = snes_ram[OAMADDL] = snes_ppu.oam.address & 0xff; snes_ppu.oam.address &= 0x1ff;
snes_ppu.oam.address_high = snes_ram[OAMADDH] = (snes_ppu.oam.address >> 8) & 0x1;
snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0;
} }
return snes_ppu.ppu1_open_bus; return snes_ppu.ppu1_open_bus;
@ -687,11 +686,7 @@ READ8_HANDLER( snes_r_io )
#ifndef MESS #ifndef MESS
case 0x4100: /* NSS Dip-Switches */ case 0x4100: /* NSS Dip-Switches */
#ifdef MAME_DEBUG
return input_port_read_safe(space->machine, "DEBUG1", 0);
#else
return input_port_read(space->machine, "DSW"); return input_port_read(space->machine, "DSW");
#endif /* MAME_DEBUG */
// case 0x4101: //PC: a104 - a10e - a12a //only nss_actr // case 0x4101: //PC: a104 - a10e - a12a //only nss_actr
// case 0x420c: //PC: 9c7d - 8fab //only nss_ssoc // case 0x420c: //PC: 9c7d - 8fab //only nss_ssoc
@ -705,7 +700,7 @@ READ8_HANDLER( snes_r_io )
/* Unsupported reads returns open bus */ /* Unsupported reads returns open bus */
// printf("%02x %02x\n",offset,snes_open_bus_r(space,0)); // printf("%02x %02x\n",offset,snes_open_bus_r(space,0));
return snes_open_bus_r(space,0); return snes_open_bus_r(space, 0);
} }
/* /*
@ -818,16 +813,14 @@ WRITE8_HANDLER( snes_w_io )
break; break;
} }
case OAMADDL: /* Address for accessing OAM (low) */ case OAMADDL: /* Address for accessing OAM (low) */
snes_ppu.oam.address_low = data;
snes_ppu.oam.saved_address_low = data; snes_ppu.oam.saved_address_low = data;
snes_ppu.oam.address = ((snes_ppu.oam.address_high & 0x1) << 8) + data; snes_ppu.oam.address = (snes_ppu.oam.address & 0xff00) + data;
snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0;
snes_ram[OAMDATA] = 0; snes_ram[OAMDATA] = 0;
break; break;
case OAMADDH: /* Address for accessing OAM (high) */ case OAMADDH: /* Address for accessing OAM (high) */
snes_ppu.oam.address_high = data & 0x1;
snes_ppu.oam.saved_address_high = data; snes_ppu.oam.saved_address_high = data;
snes_ppu.oam.address = ((data & 0x1) << 8) + snes_ppu.oam.address_low; snes_ppu.oam.address = (snes_ppu.oam.address & 0x00ff) | ((data & 0x01) << 8);
snes_ppu.oam.priority_rotation = BIT(data, 7); snes_ppu.oam.priority_rotation = BIT(data, 7);
snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0;
snes_ram[OAMDATA] = 0; snes_ram[OAMDATA] = 0;
@ -867,8 +860,7 @@ WRITE8_HANDLER( snes_w_io )
{ {
snes_ram[OAMDATA] = 0; snes_ram[OAMDATA] = 0;
snes_ppu.oam.address++; snes_ppu.oam.address++;
snes_ppu.oam.address_low = snes_ram[OAMADDL] = snes_ppu.oam.address & 0xff; snes_ppu.oam.address &= 0x1ff;
snes_ppu.oam.address_high = snes_ram[OAMADDH] = (snes_ppu.oam.address >> 8) & 0x1;
snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0;
} }
return; return;

View File

@ -514,10 +514,11 @@ INLINE void snes_draw_tile_x2( UINT8 planes, UINT8 layer, UINT16 tileaddr, INT16
* that it takes a blend parameter. * that it takes a blend parameter.
*****************************************/ *****************************************/
INLINE void snes_draw_tile_object( UINT16 tileaddr, INT16 x, UINT8 priority, UINT8 flip, UINT16 pal, UINT8 blend ) INLINE void snes_draw_tile_object( UINT16 tileaddr, INT16 x, UINT8 priority, UINT8 flip, UINT16 pal )
{ {
UINT8 mask, plane[4]; UINT8 mask, plane[4];
UINT16 c; UINT16 c;
int blend;
INT16 ii, jj; INT16 ii, jj;
plane[0] = snes_vram[tileaddr]; plane[0] = snes_vram[tileaddr];
@ -548,9 +549,11 @@ INLINE void snes_draw_tile_object( UINT16 tileaddr, INT16 x, UINT8 priority, UIN
mask >>= 1; mask >>= 1;
} }
if (ii >= 0 && ii < SNES_SCR_WIDTH && scanlines[SNES_MAINSCREEN].enable) INT16 pos = ii & 0x1ff;
if (pos >= 0 && pos < SNES_SCR_WIDTH && scanlines[SNES_MAINSCREEN].enable)
{ {
if (scanlines[SNES_MAINSCREEN].priority[ii] <= priority) if (scanlines[SNES_MAINSCREEN].priority[pos] <= priority)
{ {
UINT8 clr = colour; UINT8 clr = colour;
@ -559,24 +562,25 @@ INLINE void snes_draw_tile_object( UINT16 tileaddr, INT16 x, UINT8 priority, UIN
#endif /* SNES_LAYER_DEBUG */ #endif /* SNES_LAYER_DEBUG */
/* Clip to windows */ /* Clip to windows */
if (scanlines[SNES_MAINSCREEN].clip) if (scanlines[SNES_MAINSCREEN].clip)
clr &= snes_ppu.clipmasks[SNES_OAM][ii]; clr &= snes_ppu.clipmasks[SNES_OAM][pos];
/* Only draw if we have a colour (0 == transparent) */ /* Only draw if we have a colour (0 == transparent) */
if (clr) if (clr)
{ {
c = snes_cgram[(pal + clr) % FIXED_COLOUR]; c = snes_cgram[(pal + clr) % FIXED_COLOUR];
blend = (pal + clr < 192) ? 1 : 0;
scanlines[SNES_MAINSCREEN].buffer[ii] = c; scanlines[SNES_MAINSCREEN].buffer[pos] = c;
scanlines[SNES_MAINSCREEN].priority[ii] = priority; scanlines[SNES_MAINSCREEN].priority[pos] = priority;
scanlines[SNES_MAINSCREEN].layer[ii] = SNES_OAM; scanlines[SNES_MAINSCREEN].layer[pos] = SNES_OAM;
scanlines[SNES_MAINSCREEN].blend_exception[ii] = blend; scanlines[SNES_MAINSCREEN].blend_exception[pos] = blend;
} }
} }
} }
if (ii >= 0 && ii < SNES_SCR_WIDTH && scanlines[SNES_SUBSCREEN].enable) if (pos >= 0 && pos < SNES_SCR_WIDTH && scanlines[SNES_SUBSCREEN].enable)
{ {
if (scanlines[SNES_SUBSCREEN].priority[ii] <= priority) if (scanlines[SNES_SUBSCREEN].priority[pos] <= priority)
{ {
UINT8 clr = colour; UINT8 clr = colour;
@ -585,17 +589,18 @@ INLINE void snes_draw_tile_object( UINT16 tileaddr, INT16 x, UINT8 priority, UIN
#endif /* SNES_LAYER_DEBUG */ #endif /* SNES_LAYER_DEBUG */
/* Clip to windows */ /* Clip to windows */
if (scanlines[SNES_SUBSCREEN].clip) if (scanlines[SNES_SUBSCREEN].clip)
clr &= snes_ppu.clipmasks[SNES_OAM][ii]; clr &= snes_ppu.clipmasks[SNES_OAM][pos];
/* Only draw if we have a colour (0 == transparent) */ /* Only draw if we have a colour (0 == transparent) */
if (clr) if (clr)
{ {
c = snes_cgram[(pal + clr) % FIXED_COLOUR]; c = snes_cgram[(pal + clr) % FIXED_COLOUR];
blend = (pal + clr < 192) ? 1 : 0;
scanlines[SNES_SUBSCREEN].buffer[ii] = c; scanlines[SNES_SUBSCREEN].buffer[pos] = c;
scanlines[SNES_SUBSCREEN].priority[ii] = priority; scanlines[SNES_SUBSCREEN].priority[pos] = priority;
scanlines[SNES_SUBSCREEN].layer[ii] = SNES_OAM; scanlines[SNES_SUBSCREEN].layer[pos] = SNES_OAM;
scanlines[SNES_SUBSCREEN].blend_exception[ii] = blend; scanlines[SNES_SUBSCREEN].blend_exception[pos] = blend;
} }
} }
} }
@ -1226,7 +1231,7 @@ static void snes_update_objects_rto( UINT16 curline )
static void snes_update_objects( UINT8 priority_tbl ) static void snes_update_objects( UINT8 priority_tbl )
{ {
UINT8 blend, priority; UINT8 priority;
UINT32 charaddr; UINT32 charaddr;
int i; int i;
static const UINT8 table_obj_priority[10][4] = { static const UINT8 table_obj_priority[10][4] = {
@ -1263,9 +1268,8 @@ static void snes_update_objects( UINT8 priority_tbl )
if (oam_tilelist[i].tileaddr == 0xffff) if (oam_tilelist[i].tileaddr == 0xffff)
continue; continue;
blend = (oam_tilelist[i].pal < 192) ? 1 : 0;
priority = table_obj_priority[priority_tbl][oam_tilelist[i].priority]; priority = table_obj_priority[priority_tbl][oam_tilelist[i].priority];
snes_draw_tile_object(charaddr + oam_tilelist[i].tileaddr, oam_tilelist[i].x, priority, oam_tilelist[i].hflip, oam_tilelist[i].pal, blend); snes_draw_tile_object(charaddr + oam_tilelist[i].tileaddr, oam_tilelist[i].x, priority, oam_tilelist[i].hflip, oam_tilelist[i].pal);
} }
} }
@ -1356,8 +1360,8 @@ static void snes_update_mode_5( UINT16 curline )
return; return;
#endif /* SNES_LAYER_DEBUG */ #endif /* SNES_LAYER_DEBUG */
snes_update_line(SNES_COLOR_DEPTH_4BPP, 1, 2, 6, SNES_BG1, curline, SNES_OPT_NONE, 0);
snes_update_line(SNES_COLOR_DEPTH_2BPP, 1, 0, 4, SNES_BG2, curline, SNES_OPT_NONE, 0); snes_update_line(SNES_COLOR_DEPTH_2BPP, 1, 0, 4, SNES_BG2, curline, SNES_OPT_NONE, 0);
snes_update_line(SNES_COLOR_DEPTH_4BPP, 1, 2, 6, SNES_BG1, curline, SNES_OPT_NONE, 0);
snes_update_objects(5); snes_update_objects(5);
} }