uint8 * MMC5BGVRAMADR(uint32 V) { if (!Sprite16) { extern uint8 mmc5ABMode; /* A=0, B=1 */ if (mmc5ABMode == 0) return MMC5SPRVRAMADR(V); else return &MMC5BGVPage[(V) >> 10][(V)]; } else return &MMC5BGVPage[(V) >> 10][(V)];
void FetchSpriteData(void) { SPR *spr; uint8 H; int n,vofs; spr=(SPR *)SPRAM; H=8; nosprites=SpriteBlurp=0; vofs=(unsigned int)(PPU[0]&0x8&(((PPU[0]&0x20)^0x20)>>2))<<9; H+=(PPU[0]&0x20)>>2; if(!PPU_hook) for(n=63;n>=0;n--,spr++) { if((unsigned int)(scanline-spr->y)>=H) continue; if(nosprites<maxsprites) { if(n==63) SpriteBlurp=1; { SPRB dst; uint8 *C; int t; unsigned int vadr; t = (int)scanline-(spr->y); if (Sprite16) vadr = ((spr->no&1)<<12) + ((spr->no&0xFE)<<4); else vadr = (spr->no<<4)+vofs; if (spr->atr&V_FLIP) { vadr+=7; vadr-=t; vadr+=(PPU[0]&0x20)>>1; vadr-=t&8; } else { vadr+=t; vadr+=t&8; } /* Fix this geniestage hack */ if(MMC5Hack && geniestage!=1) C = MMC5SPRVRAMADR(vadr); else C = VRAMADR(vadr); dst.ca[0]=C[0]; dst.ca[1]=C[8]; dst.x=spr->x; dst.atr=spr->atr; *(uint32 *)&SPRBUF[nosprites<<2]=*(uint32 *)&dst; } nosprites++; }