| 1418 | |
| 1419 | static uint8 numsprites, SpriteBlurp; |
| 1420 | static void FetchSpriteData(void) { |
| 1421 | uint8 ns, sb; |
| 1422 | SPR *spr; |
| 1423 | uint8 H; |
| 1424 | int n; |
| 1425 | int vofs; |
| 1426 | uint8 P0 = PPU[0]; |
| 1427 | |
| 1428 | spr = (SPR*)SPRAM; |
| 1429 | H = 8; |
| 1430 | |
| 1431 | ns = sb = 0; |
| 1432 | |
| 1433 | vofs = (uint32)(P0 & 0x8 & (((P0 & 0x20) ^ 0x20) >> 2)) << 9; |
| 1434 | H += (P0 & 0x20) >> 2; |
| 1435 | |
| 1436 | if (!PPU_hook) |
| 1437 | for (n = 63; n >= 0; n--, spr++) { |
| 1438 | if ((uint32)(scanline - spr->y) >= H) continue; |
| 1439 | if (ns < maxsprites) { |
| 1440 | if (n == 63) sb = 1; |
| 1441 | |
| 1442 | { |
| 1443 | SPRB dst; |
| 1444 | uint8 *C; |
| 1445 | int t; |
| 1446 | uint32 vadr; |
| 1447 | |
| 1448 | t = (int)scanline - (spr->y); |
| 1449 | |
| 1450 | if (Sprite16) |
| 1451 | vadr = ((spr->no & 1) << 12) + ((spr->no & 0xFE) << 4); |
| 1452 | else |
| 1453 | vadr = (spr->no << 4) + vofs; |
| 1454 | |
| 1455 | if (spr->atr & V_FLIP) { |
| 1456 | vadr += 7; |
| 1457 | vadr -= t; |
| 1458 | vadr += (P0 & 0x20) >> 1; |
| 1459 | vadr -= t & 8; |
| 1460 | } else { |
| 1461 | vadr += t; |
| 1462 | vadr += t & 8; |
| 1463 | } |
| 1464 | |
| 1465 | /* Fix this geniestage hack */ |
| 1466 | if (MMC5Hack && geniestage != 1) |
| 1467 | C = MMC5SPRVRAMADR(vadr); |
| 1468 | else |
| 1469 | C = VRAMADR(vadr); |
| 1470 | |
| 1471 | if (SpriteON) |
| 1472 | RENDER_LOGP(C); |
| 1473 | dst.ca[0] = C[0]; |
| 1474 | if (SpriteON) |
| 1475 | RENDER_LOGP(C + 8); |
| 1476 | dst.ca[1] = C[8]; |
| 1477 | dst.x = spr->x; |