X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=ppu.c;h=0fedcac6939f4d77000a9d53d38e1de940158b55;hp=1616f60af79f034b7271eb4d3e623e166f8c72d0;hb=e328100eecae3adfce1c3b57364bee5d166217ef;hpb=f12b1f316ca070bda860108b4e3901628d1a8398 diff --git a/ppu.c b/ppu.c index 1616f60..0fedcac 100644 --- a/ppu.c +++ b/ppu.c @@ -36,12 +36,21 @@ uint8 SPRAM[0x100]; static uint8 SPRBUF[0x100]; -static uint8 sprlinebuf[256+8]; +uint8 sprlinebuf[256+8]; + +int32 sphitx; +uint8 sphitdata; +int spork=0; /* spork the world. Any sprites on this line? + Then this will be set to 1. Needed for zapper + emulation and *gasp* sprite emulation. + */ + + extern void BGRender(uint8 *target); -extern int tosprite; static int maxsprites=8; +static int sprlinebuf_empty=0; void FCEUI_DisableSpriteLimitation(int a) @@ -215,11 +224,12 @@ void FetchSpriteData(void) extern int FSkip; #endif -void RefreshSprite(uint8 *target) +void RefreshSprites(void) { - int n, minx=256; + int n; SPRB *spr; + spork=0; if(!nosprites) return; #ifdef FRAMESKIP if(FSkip) @@ -237,6 +247,12 @@ void RefreshSprite(uint8 *target) nosprites--; spr = (SPRB*)SPRBUF+nosprites; + if (!sprlinebuf_empty) + { + FCEU_dwmemset(sprlinebuf,0x80808080,256); + sprlinebuf_empty = 1; + } + for(n=nosprites;n>=0;n--,spr--) { register uint32 J; @@ -251,47 +267,22 @@ void RefreshSprite(uint8 *target) int x=spr->x; atr=spr->atr; - if (x < minx) - { - if (minx == 256) FCEU_dwmemset(sprlinebuf,0x80808080,256); // only clear sprite buff when we encounter first sprite - minx = x; - } - if(n==0 && SpriteBlurp && !(PPU_status&0x40)) + if(n==0 && SpriteBlurp && !(PPU_status&0x40)) { - int z,ze=x+8; - if(ze>256) {ze=256;} - if(ScreenON && (scanlineFSettings.LastSLine - #ifdef FRAMESKIP - || FSkip - #endif - )) - BGRender(target); - - if(!(atr&H_FLIP)) - { - for(z=x;z>(z-x))) - { - if(!(target[z]&64)) - tosprite=z; - } - } - } - else - { - for(z=x;z>1)&0x08) | + ((J>>3)&0x04) | + ((J>>5)&0x02) | + ((J>>7)&0x01); } + c1=((spr->ca[0]>>1)&0x55)|(spr->ca[1]&0xAA); c2=(spr->ca[0]&0x55)|((spr->ca[1]<<1)&0xAA); @@ -328,18 +319,19 @@ void RefreshSprite(uint8 *target) if (J&0x40) C[1]=VB[c2]|(J>>8); } } + sprlinebuf_empty = 0; } } nosprites=0; - #ifdef FRAMESKIP - if(FSkip) return; - #endif - if (minx == 256) return; // no visible sprites + spork=1; +} + - { +void CopySprites(uint8 *target) +{ uint8 n=((PPU[1]&4)^4)<<1; - if ((int)n < minx) n = minx & 0xfc; + //if ((int)n < minx) n = minx & 0xfc; loopskie: { uint32 t=*(uint32 *)(sprlinebuf+n); @@ -364,419 +356,12 @@ void RefreshSprite(uint8 *target) } *(uint32 *)(target+n)=tb; #else - if(!(t&0x80000000)) - { - if(!(t&0x40)) // Normal sprite - P[n]=sprlinebuf[n]; - else if(P[n]&64) // behind bg sprite - P[n]=sprlinebuf[n]; - } - - if(!(t&0x800000)) - { - if(!(t&0x4000)) // Normal sprite - P[n+1]=(sprlinebuf+1)[n]; - else if(P[n+1]&64) // behind bg sprite - P[n+1]=(sprlinebuf+1)[n]; - } - - if(!(t&0x8000)) - { - if(!(t&0x400000)) // Normal sprite - P[n+2]=(sprlinebuf+2)[n]; - else if(P[n+2]&64) // behind bg sprite - P[n+2]=(sprlinebuf+2)[n]; - } - - if(!(t&0x80)) - { - if(!(t&0x40000000)) // Normal sprite - P[n+3]=(sprlinebuf+3)[n]; - else if(P[n+3]&64) // behind bg sprite - P[n+3]=(sprlinebuf+3)[n]; - } + #error not implemented #endif } } n+=4; if(n) goto loopskie; - } -} - - - - - -/* -void FetchSpriteData(void) -{ - uint8 ns,sb; - SPR *spr; - uint8 H; - int n; - int vofs; - uint8 P0=PPU[0]; - - - spr=(SPR *)SPRAM; - H=8; - - ns=sb=0; - - vofs=(unsigned int)(P0&0x8&(((P0&0x20)^0x20)>>2))<<9; - H+=(P0&0x20)>>2; - - if(!PPU_hook) - for(n=63;n>=0;n--,spr++) - { - if((unsigned int)(scanline-spr->y)>=H) continue; - //printf("%d, %u\n",scanline,(unsigned int)(scanline-spr->y)); - if(nsy); - - 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+=(P0&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[ns<<2]=*(uint32 *)&dst; - } - - ns++; - } - else - { - PPU_status|=0x20; - break; - } - } - else - for(n=63;n>=0;n--,spr++) - { - if((unsigned int)(scanline-spr->y)>=H) continue; - - if(nsy); - - 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+=(P0&0x20)>>1; - vadr-=t&8; - } - else - { - vadr+=t; - vadr+=t&8; - } - - if(MMC5Hack) C = MMC5SPRVRAMADR(vadr); - else C = VRAMADR(vadr); - dst.ca[0]=C[0]; - if(ns<8) - { - PPU_hook(0x2000); - PPU_hook(vadr); - } - dst.ca[1]=C[8]; - dst.x=spr->x; - dst.atr=spr->atr; - - - *(uint32 *)&SPRBUF[ns<<2]=*(uint32 *)&dst; - } - - ns++; - } - else - { - PPU_status|=0x20; - break; - } - } - //if(ns>=7) - //printf("%d %d\n",scanline,ns); - if(ns>8) PPU_status|=0x20; // Handle case when >8 sprites per -// scanline option is enabled. - else if(PPU_hook) - { - for(n=0;n<(8-ns);n++) - { - PPU_hook(0x2000); - PPU_hook(vofs); - } - } - numsprites=ns; - SpriteBlurp=sb; -} - - - -void RefreshSprite(uint8 *target) -{ - - int n,sprindex; - SPRB *spr; - uint8 *P=target; - - //if (printed) { printf("SPRB: %d SPR: %d\n", sizeof(SPRB), sizeof(SPR)); printed=0; } - if(!numsprites) return; - - FCEU_dwmemset(sprlinebuf,0x80808080,256); - - numsprites--; - sprindex=numsprites; - spr = (SPRB*)SPRBUF; - - // for(n=nosprites;n>=0;n--,spr--) - for(n=numsprites;n>=0;n--,sprindex--) - { - uint8 J,atr,c1,c2; - int x=spr[sprindex].x; - uint8 *C; - uint8 *VB; - - P+=x; - - c1=((spr[sprindex].ca[0]>>1)&0x55)|(spr[sprindex].ca[1]&0xAA); - c2=(spr[sprindex].ca[0]&0x55)|((spr[sprindex].ca[1]<<1)&0xAA); - - J=spr[sprindex].ca[0]|spr[sprindex].ca[1]; - atr=spr[sprindex].atr; - - if(J) - { - if(n==0 && SpriteBlurp && !(PPU_status&0x40)) - { - int z,ze=x+8; - if(ze>256) {ze=256;} - if(ScreenON && (scanlineFSettings.LastSLine - #ifdef FRAMESKIP - || FSkip - #endif - )) - // nothing wrong with this - BGRender(target); - - if(!(atr&H_FLIP)) - { - for(z=x;z>(z-x))) - { - if(!(target[z]&64)) - tosprite=z; - } - } - } - else - { - for(z=x;z>=2;c2>>=2; - if (J&0x08) C[3]=VB[c1&3]|0x40; - if (J&0x04) C[2]=VB[c2&3]|0x40; - c1>>=2;c2>>=2; - if (J&0x20) C[5]=VB[c1&3]|0x40; - if (J&0x10) C[4]=VB[c2&3]|0x40; - c1>>=2;c2>>=2; - if (J&0x80) C[7]=VB[c1]|0x40; - if (J&0x40) C[6]=VB[c2]|0x40; - } else { - if (J&0x02) C[6]=VB[c1&3]|0x40; - if (J&0x01) C[7]=VB[c2&3]|0x40; - c1>>=2;c2>>=2; - if (J&0x08) C[4]=VB[c1&3]|0x40; - if (J&0x04) C[5]=VB[c2&3]|0x40; - c1>>=2;c2>>=2; - if (J&0x20) C[2]=VB[c1&3]|0x40; - if (J&0x10) C[3]=VB[c2&3]|0x40; - c1>>=2;c2>>=2; - if (J&0x80) *C=VB[c1]|0x40; - if (J&0x40) C[1]=VB[c2]|0x40; - } - } else { - if (atr&H_FLIP) - { - if (J&0x02) C[1]=VB[(c1&3)]; - if (J&0x01) *C=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x08) C[3]=VB[(c1&3)]; - if (J&0x04) C[2]=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x20) C[5]=VB[(c1&3)]; - if (J&0x10) C[4]=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x80) C[7]=VB[c1]; - if (J&0x40) C[6]=VB[c2]; - }else{ - if (J&0x02) C[6]=VB[(c1&3)]; - if (J&0x01) C[7]=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x08) C[4]=VB[(c1&3)]; - if (J&0x04) C[5]=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x20) C[2]=VB[(c1&3)]; - if (J&0x10) C[3]=VB[(c2&3)]; - c1>>=2;c2>>=2; - if (J&0x80) *C=VB[c1]; - if (J&0x40) C[1]=VB[c2]; - } - } - } - P-=x; - } - - numsprites=0; - #ifdef FRAMESKIP - if(FSkip) return; - #endif - - { - uint8 n=((PPU[1]&4)^4)<<1; - loopskie: - { - uint32 t=*((uint32 *)(&(sprlinebuf[n]))); - if(t!=0x80808080) - { - #ifdef LSB_FIRST - if(!(t&0x80)) - { - if(!(t&0x40)) // Normal sprite - P[n]=sprlinebuf[n]; - else if(P[n]&64) // behind bg sprite - P[n]=sprlinebuf[n]; - } - - if(!(t&0x8000)) - { - if(!(t&0x4000)) // Normal sprite - P[n+1]=(sprlinebuf+1)[n]; - else if(P[n+1]&64) // behind bg sprite - P[n+1]=(sprlinebuf+1)[n]; - } - - if(!(t&0x800000)) - { - if(!(t&0x400000)) // Normal sprite - P[n+2]=(sprlinebuf+2)[n]; - else if(P[n+2]&64) // behind bg sprite - P[n+2]=(sprlinebuf+2)[n]; - } - - if(!(t&0x80000000)) - { - if(!(t&0x40000000)) // Normal sprite - P[n+3]=(sprlinebuf+3)[n]; - else if(P[n+3]&64) // behind bg sprite - P[n+3]=(sprlinebuf+3)[n]; - } - #else - if(!(t&0x80000000)) - { - if(!(t&0x40)) // Normal sprite - P[n]=sprlinebuf[n]; - else if(P[n]&64) // behind bg sprite - P[n]=sprlinebuf[n]; - } - - if(!(t&0x800000)) - { - if(!(t&0x4000)) // Normal sprite - P[n+1]=(sprlinebuf+1)[n]; - else if(P[n+1]&64) // behind bg sprite - P[n+1]=(sprlinebuf+1)[n]; - } - - if(!(t&0x8000)) - { - if(!(t&0x400000)) // Normal sprite - P[n+2]=(sprlinebuf+2)[n]; - else if(P[n+2]&64) // behind bg sprite - P[n+2]=(sprlinebuf+2)[n]; - } - - if(!(t&0x80)) - { - if(!(t&0x40000000)) // Normal sprite - P[n+3]=(sprlinebuf+3)[n]; - else if(P[n+3]&64) // behind bg sprite - P[n+3]=(sprlinebuf+3)[n]; - } - #endif - } - } - n+=4; - if(n) goto loopskie; - } } -*/