⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.h

📁 ESS3890+SL原代码(1*16内存)
💻 H
📖 第 1 页 / 共 2 页
字号:
    /* Start of window in screen buffer */    P=PP+X1;    Z=ZBuf+(X1>>3)+1;  /* Start of window in Z-buffer        */    Offset=WY;                         /* Actual line number */    T=WndTab+((int)(Offset&0xF8)<<2);  /* Name Table address */    Offset=(Offset&0x07)<<1;           /* Offset inside tile */    /* Initialize Z-buffer */    X2=X1&0x07;    Z[0]|=0xFF>>X2;    /* Drawing tiles... */    for(X1>>=3;X1<(160>>3);X1++)    {      D0=*T;                          /* Tile number         */      C=T[0x2000];                    /* Attributes          */      if(!(LCDCONT&0x10)) D0=(D0+0x80)&0xff;   /* Correct tile number */      /* Tile pattern address is... */      R = ChrGen                            /* ChrGen addr-s */        + ((int)D0<<4)                      /* Tile number   */        + (C&BANK_ATTR?  0x2000:0)          /* Bank number   */        + (C&VFLIP_ATTR? 14-Offset:Offset); /* Off-t in tile */      /* Fetch pattern bytes */      if(C&HFLIP_ATTR) { D0=HFlip[R[0]];D2=HFlip[R[1]]; }      else             { D0=R[0];D2=R[1]; }      /* Modify Z-buffer */      if(C&PRIOR_ATTR) { Z[25]|=0xFF>>X2;Z[26]=~(0xFF>>X2); }      else Z[26]=0x00;      Z[1]=0xFF;      /* Compute CGB palette offset  */      C=((C&PAL_ATTR)<<2)&0xff;      /* Modify screen buffer */      D1=(int)D2<<1;      D1=(D1&0xAAA)|((D1&0x555)<<7)|(D0&0x55)|((int)(D0&0xAA)<<7);      P[0]=XPal[C|((D1&0xC000)>>14)];      P[1]=XPal[C|((D1&0x00C0)>>6 )];      P[2]=XPal[C|((D1&0x3000)>>12)];      P[3]=XPal[C|((D1&0x0030)>>4 )];      P[4]=XPal[C|((D1&0x0C00)>>10)];      P[5]=XPal[C|((D1&0x000C)>>2 )];      P[6]=XPal[C|((D1&0x0300)>>8 )];      P[7]=XPal[C|( D1&0x003      )];      /* Move pointers */      P+=8;Z++;T++;    }  }  /* Refresh sprites in this scanline */  if((LCDCONT&0x82)==0x82) CGBRefreshSprites(Y,PP,ZBuf+1);}/** RefreshSprites() *****************************************//** Refresh sprites in line Y [0-143]. Called from          **//** RefreshLine().                                          **//*************************************************************/void RefreshSprites(int Y,byte *PP,byte *ZBuf){  register byte *Z,*T,*S, *XPal;  register pixel *P;  register int D2,D1,D0,J,K,H;  pixel Pal[4];  XPal = gmby->XPal;  H=LCDCONT&0x04? 15:7;  Y+=16;  /* Scanning through all sprites... */  for(S=IO+0x09C,J=40;J;S-=4,J--)  {    /* D2=X+8,D0=Y+16 */    D0=S[0];D2=S[1];    /* If showing sprite... */    if((D2<168)&&(Y>=D0)&&(Y<=D0+H))    {      /* D2=X,D0=Y+16 */      D2-=8;      /* If V-flipped, count the offset from the end */      D0=S[3]&0x40? D0+H-Y:Y-D0;      /* Compute pattern address in RAM  */      T = VRAM        + ((int)(H>8? S[2]&0xFE:S[2])<<4)        + (D0<<1);      /* Read sprite pattern data H-flipping if needed */      if(S[3]&0x20) { D0=HFlip[T[0]];D1=HFlip[T[1]]; }      else          { D0=T[0];D1=T[1]; }      /* Find opaque pixels */      K=D0|D1;      /* Clip if under background */      if(S[3]&0x80)      {        Z=ZBuf+(D2>>3);        K&=~((((int)Z[0]<<8)+Z[1])>>(8-(D2&0x07)));      }      /* If there is anything to draw... */      if(K)      {        /* Compute drawing address in XBuf */        P=PP+D2;        /* Compute color palette */        T=S[3]&0x10? SPal1:SPal0;        Pal[0]=XPal[T[0]];        Pal[1]=XPal[T[1]];        Pal[2]=XPal[T[2]];        Pal[3]=XPal[T[3]];        /* Drawing a sprite... */             D1<<=1;        D1=(D1&0xAAA)|((D1&0x555)<<7)|(D0&0x55)|((D0&0xAA)<<7);        if(K&0x80) P[0]=Pal[(D1&0xC000)>>14];        if(K&0x40) P[1]=Pal[(D1&0x00C0)>>6 ];        if(K&0x20) P[2]=Pal[(D1&0x3000)>>12];        if(K&0x10) P[3]=Pal[(D1&0x0030)>>4 ];        if(K&0x08) P[4]=Pal[(D1&0x0C00)>>10];        if(K&0x04) P[5]=Pal[(D1&0x000C)>>2 ];        if(K&0x02) P[6]=Pal[(D1&0x0300)>>8 ];        if(K&0x01) P[7]=Pal[ D1&0x0003     ];      }    }  }}/** CGBRefreshSprites() **************************************//** Refresh sprites in line Y [0-143] on a ColorGB. Called  **//** from CGBRefreshLine().                                  **//*************************************************************/void CGBRefreshSprites(int Y,byte *PP,byte *ZBuf){  register byte *Z,*T,*S, *XPal;  register pixel *P;  register int D2,D1,D0, J, K, H;  pixel Pal[4];  XPal = gmby->XPal;  H=LCDCONT&0x04? 15:7;  Y+=16;  /* Scanning through all sprites... */  for(S=IO+0x09C,J=40;J;S-=4,J--)  {    /* D2=X+8,D0=Y+16 */    D0=S[0];D2=S[1];    /* If showing sprite... */    if((D2<168)&&(Y>=D0)&&(Y<=D0+H))    {      /* D2=X,D0=Y+16 */      D2-=8;      /* If V-flipped, count the offset from the end */      D0=S[3]&0x40? D0+H-Y:Y-D0;      /* Compute pattern address in RAM  */      T = VRAM        + (S[3]&0x08? 0x2000:0)        + ((int)(H>8? S[2]&0xFE:S[2])<<4)        + (D0<<1);      /* Read sprite pattern data H-flipping if needed */      if(S[3]&0x20) { D0=HFlip[T[0]];D1=HFlip[T[1]]; }      else          { D0=T[0];D1=T[1]; }      /* Find opaque pixels */      K=D0|D1;      /* Clip with high priority background */      Z=ZBuf+(D2>>3);      K&=~((((int)Z[25]<<8)+Z[26])>>(8-(D2&0x07)));            /* Clip if under background */      if(K&&(S[3]&0x80)) K&=~((((int)Z[0]<<8)+Z[1])>>(8-(D2&0x07)));      /* If there is anything to draw... */      if(K)      {        /* Compute drawing address in XBuf */        P=PP+D2;        /* Compute color palette for ColorGB */         D2=((S[3]&0x07)<<2)+32;        Pal[0]=XPal[D2];        Pal[1]=XPal[D2+1];        Pal[2]=XPal[D2+2];        Pal[3]=XPal[D2+3];        /* Drawing a sprite... */             D1<<=1;        D1=(D1&0xAAA)|((D1&0x555)<<7)|(D0&0x55)|((D0&0xAA)<<7);        if(K&0x80) P[0]=Pal[(D1&0xC000)>>14];        if(K&0x40) P[1]=Pal[(D1&0x00C0)>>6 ];        if(K&0x20) P[2]=Pal[(D1&0x3000)>>12];        if(K&0x10) P[3]=Pal[(D1&0x0030)>>4 ];        if(K&0x08) P[4]=Pal[(D1&0x0C00)>>10];        if(K&0x04) P[5]=Pal[(D1&0x000C)>>2 ];        if(K&0x02) P[6]=Pal[(D1&0x0300)>>8 ];        if(K&0x01) P[7]=Pal[ D1&0x0003     ];      }    }  }}/** SGBBackdrop() ********************************************//** Show SuperGB backdrop. Called by SuperGB extension.     **//*************************************************************/void SGBBackdrop(void){  register byte *T,*R, *XPal, *HFlip;  register unsigned int L;  register pixel *P,*C;  register int DY;  int X, Y, J, I, M;  HFlip = PHFlip;  XPal = gmby->XPal;  P=XBuf;  T=SGBChrTab;  for(Y=0;Y<28;Y++,P+=1792)    for(X=0;X<32;X++)    {      I=T[1];      R=SGBChrGen+((int)T[0]<<5);      if(I&0x80) { R+=14;DY=-2; } else DY=2;      C=XPal+((I&0x0C)<<2)+64;      I&=0x40;      for(J=0;J<8;J++)      {        M=I? HFlip[R[0]]:R[0];        L=((M&0x88)<<21)|((M&0x44)<<14)|((M&0x22)<<7)|(M&0x11);        M=I? HFlip[R[1]]:R[1];        L|=((M&0x88)<<22)|((M&0x44)<<15)|((M&0x22)<<8)|((M&0x11)<<1);        M=I? HFlip[R[16]]:R[16];        L|=((M&0x88)<<23)|((M&0x44)<<16)|((M&0x22)<<9)|((M&0x11)<<2);        M=I? HFlip[R[17]]:R[17];        L|=((M&0x88)<<24)|((M&0x44)<<17)|((M&0x22)<<10)|((M&0x11)<<3);        P[0]=C[(L>>28)&0x0F];        P[1]=C[(L>>20)&0x0F];        P[2]=C[(L>>12)&0x0F];        P[3]=C[(L>>4)&0x0F];        P[4]=C[(L>>24)&0x0F];        P[5]=C[(L>>16)&0x0F];        P[6]=C[(L>>8)&0x0F];        P[7]=C[L&0x0F];        P+=WIDTH;R+=DY;      }      P-=2040;T+=2;    }  VGAPutImage(&Img,0,0,256,224);}#endif/*VGB*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -