Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
6057 lines (5412 sloc)
200 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "snes9x.h" | |
| #include "memmap.h" | |
| #include "ppu.h" | |
| #include "cpuexec.h" | |
| #include "display.h" | |
| #include "gfx.h" | |
| #include "apu.h" | |
| // psp optimized by ruka. original yoyo | |
| typedef union | |
| { | |
| struct { uint8 b0,b1,b2,b3; } B; | |
| uint32 W; | |
| } yo_uint32; | |
| uint8 __attribute__((aligned(64))) tmpCache[64]; | |
| __inline uint8 softConvertTile16New (uint8 *pCache,uint32 TileAddr,uint16 *ScreenColors) | |
| { | |
| register uint8 *tp = &VRAM[TileAddr]; | |
| uint8 *p = tmpCache; | |
| uint32 non_zero,tile_opaque; | |
| uint8 line; | |
| yo_uint32 p1; | |
| yo_uint32 p2; | |
| register uint8 pix; | |
| non_zero=0; | |
| switch (GPUPack.BG.BitShift) | |
| { | |
| case 8: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| p1.W = 0; | |
| p2.W = 0; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1.W |= odd_high[0][pix >> 4]; | |
| p2.W |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1.W |= even_high[0][pix >> 4]; | |
| p2.W |= even_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 16))) | |
| { | |
| p1.W |= odd_high[1][pix >> 4]; | |
| p2.W |= odd_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 17))) | |
| { | |
| p1.W |= even_high[1][pix >> 4]; | |
| p2.W |= even_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 32))) | |
| { | |
| p1.W |= odd_high[2][pix >> 4]; | |
| p2.W |= odd_low[2][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 33))) | |
| { | |
| p1.W |= even_high[2][pix >> 4]; | |
| p2.W |= even_low[2][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 48))) | |
| { | |
| p1.W |= odd_high[3][pix >> 4]; | |
| p2.W |= odd_low[3][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 49))) | |
| { | |
| p1.W |= even_high[3][pix >> 4]; | |
| p2.W |= even_low[3][pix & 0xf]; | |
| } | |
| p[0] = p1.B.b0; | |
| p[8] = p1.B.b1; | |
| p[16] = p1.B.b2; | |
| p[24] = p1.B.b3; | |
| p[32] = p2.B.b0; | |
| p[40] = p2.B.b1; | |
| p[48] = p2.B.b2; | |
| p[56] = p2.B.b3; | |
| p++; | |
| non_zero |= p1.W | p2.W; | |
| } | |
| break; | |
| case 4: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| p1.W = 0; | |
| p2.W = 0; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1.W |= odd_high[0][pix >> 4]; | |
| p2.W |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1.W |= even_high[0][pix >> 4]; | |
| p2.W |= even_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 16))) | |
| { | |
| p1.W |= odd_high[1][pix >> 4]; | |
| p2.W |= odd_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 17))) | |
| { | |
| p1.W |= even_high[1][pix >> 4]; | |
| p2.W |= even_low[1][pix & 0xf]; | |
| } | |
| p[0] = p1.B.b0; | |
| p[8] = p1.B.b1; | |
| p[16] = p1.B.b2; | |
| p[24] = p1.B.b3; | |
| p[32] = p2.B.b0; | |
| p[40] = p2.B.b1; | |
| p[48] = p2.B.b2; | |
| p[56] = p2.B.b3; | |
| p++; | |
| non_zero |= p1.W | p2.W; | |
| } | |
| break; | |
| case 2: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| p1.W = 0; | |
| p2.W = 0; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1.W |= odd_high[0][pix >> 4]; | |
| p2.W |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1.W |= even_high[0][pix >> 4]; | |
| p2.W |= even_low[0][pix & 0xf]; | |
| } | |
| p[0] = p1.B.b0; | |
| p[8] = p1.B.b1; | |
| p[16] = p1.B.b2; | |
| p[24] = p1.B.b3; | |
| p[32] = p2.B.b0; | |
| p[40] = p2.B.b1; | |
| p[48] = p2.B.b2; | |
| p[56] = p2.B.b3; | |
| p++; | |
| non_zero |= p1.W | p2.W; } | |
| break; | |
| } | |
| if (non_zero) | |
| { | |
| tile_opaque=1; | |
| p=tmpCache; | |
| uint8 *q = pCache; | |
| uint32 i; | |
| for (line = 8;line != 0; line--,q++,p+=8) | |
| { | |
| if (!p[0]) i=0x80; | |
| else i=0; | |
| if (!p[1]) i|=0x40; | |
| if (!p[2]) i|=0x20; | |
| if (!p[3]) i|=0x10; | |
| if (!p[4]) i|=0x08; | |
| if (!p[5]) i|=0x04; | |
| if (!p[6]) i|=0x02; | |
| if (!p[7]) i|=0x01; | |
| if (i) tile_opaque=0; | |
| *q=i; | |
| } | |
| uint16 *r = (uint16*)(pCache)+4; | |
| for (line = 0;line <64;line++) | |
| r[line]=ScreenColors[tmpCache[line]]; | |
| if (tile_opaque) return 2; //Tile is cached and opaque | |
| return 3; //Tile is cached and transp | |
| } | |
| else return 1; //Tile is totally transparent | |
| } | |
| /********************************/ | |
| __inline void NORMAL16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| /* | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) *Screen = *Pixels; \ | |
| Screen+=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)) Screen[ 0]=Pixels[0]; | |
| if (!(solid&0x40)) Screen[ 256]=Pixels[1]; | |
| if (!(solid&0x20)) Screen[ 512]=Pixels[2]; | |
| if (!(solid&0x10)) Screen[ 768]=Pixels[3]; | |
| if (!(solid&0x08)) Screen[1024]=Pixels[4]; | |
| if (!(solid&0x04)) Screen[1280]=Pixels[5]; | |
| if (!(solid&0x02)) Screen[1536]=Pixels[6]; | |
| if (!(solid&0x01)) Screen[1792]=Pixels[7]; | |
| } | |
| __inline void NORMAL16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| /* *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen+=256; Pixels++; | |
| *Screen=*Pixels; | |
| */ | |
| Screen[ 0]=Pixels[0]; | |
| Screen[ 256]=Pixels[1]; | |
| Screen[ 512]=Pixels[2]; | |
| Screen[ 768]=Pixels[3]; | |
| Screen[1024]=Pixels[4]; | |
| Screen[1280]=Pixels[5]; | |
| Screen[1536]=Pixels[6]; | |
| Screen[1792]=Pixels[7]; | |
| } | |
| __inline void FLIPPED16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| /* | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset + 7*256; | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) *Screen = *Pixels; \ | |
| Screen-=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| if (!(solid&0x80)) Screen[1792]=Pixels[0]; | |
| if (!(solid&0x40)) Screen[1536]=Pixels[1]; | |
| if (!(solid&0x20)) Screen[1280]=Pixels[2]; | |
| if (!(solid&0x10)) Screen[1024]=Pixels[3]; | |
| if (!(solid&0x08)) Screen[ 768]=Pixels[4]; | |
| if (!(solid&0x04)) Screen[ 512]=Pixels[5]; | |
| if (!(solid&0x02)) Screen[ 256]=Pixels[6]; | |
| if (!(solid&0x01)) Screen[ 0]=Pixels[7]; | |
| } | |
| __inline void FLIPPED16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset + 7*256; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| Screen-=256; Pixels++; | |
| *Screen=*Pixels; | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| Screen[1792]=Pixels[0]; | |
| Screen[1536]=Pixels[1]; | |
| Screen[1280]=Pixels[2]; | |
| Screen[1024]=Pixels[3]; | |
| Screen[ 768]=Pixels[4]; | |
| Screen[ 512]=Pixels[5]; | |
| Screen[ 256]=Pixels[6]; | |
| Screen[ 0]=Pixels[7]; | |
| } | |
| __inline void NORMAL16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { *Screen = *Pixels; *ZB=index_spr; } \ | |
| Screen+=256; Pixels++; ZB+=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if ((!(solid&0x80))&&(ZB[ 0]>index_spr)) { Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr; } | |
| if ((!(solid&0x40))&&(ZB[ 256]>index_spr)) { Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr; } | |
| if ((!(solid&0x20))&&(ZB[ 512]>index_spr)) { Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr; } | |
| if ((!(solid&0x10))&&(ZB[ 768]>index_spr)) { Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr; } | |
| if ((!(solid&0x08))&&(ZB[1024]>index_spr)) { Screen[1024] = Pixels[4]; ZB[1024]=index_spr; } | |
| if ((!(solid&0x04))&&(ZB[1280]>index_spr)) { Screen[1280] = Pixels[5]; ZB[1280]=index_spr; } | |
| if ((!(solid&0x02))&&(ZB[1536]>index_spr)) { Screen[1536] = Pixels[6]; ZB[1536]=index_spr; } | |
| if ((!(solid&0x01))&&(ZB[1792]>index_spr)) { Screen[1792] = Pixels[7]; ZB[1792]=index_spr; } | |
| } | |
| __inline void NORMAL16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN \ | |
| if (*ZB>index_spr) {*Screen=*Pixels; *ZB=index_spr;} \ | |
| Screen+=256; Pixels++; ZB+=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (ZB[ 0]>index_spr) { Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr; } | |
| if (ZB[ 256]>index_spr) { Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr; } | |
| if (ZB[ 512]>index_spr) { Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr; } | |
| if (ZB[ 768]>index_spr) { Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr; } | |
| if (ZB[1024]>index_spr) { Screen[1024] = Pixels[4]; ZB[1024]=index_spr; } | |
| if (ZB[1280]>index_spr) { Screen[1280] = Pixels[5]; ZB[1280]=index_spr; } | |
| if (ZB[1536]>index_spr) { Screen[1536] = Pixels[6]; ZB[1536]=index_spr; } | |
| if (ZB[1792]>index_spr) { Screen[1792] = Pixels[7]; ZB[1792]=index_spr; } | |
| } | |
| __inline void FLIPPED16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { *Screen = *Pixels; *ZB=index_spr; }\ | |
| Screen-=256; Pixels++; ZB-=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if ((!(solid&0x80))&&(ZB[1792]>index_spr)) { Screen[1792] = Pixels[0]; ZB[1792]=index_spr; } | |
| if ((!(solid&0x40))&&(ZB[1536]>index_spr)) { Screen[1536] = Pixels[1]; ZB[1536]=index_spr; } | |
| if ((!(solid&0x20))&&(ZB[1280]>index_spr)) { Screen[1280] = Pixels[2]; ZB[1280]=index_spr; } | |
| if ((!(solid&0x10))&&(ZB[1024]>index_spr)) { Screen[1024] = Pixels[3]; ZB[1024]=index_spr; } | |
| if ((!(solid&0x08))&&(ZB[ 768]>index_spr)) { Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr; } | |
| if ((!(solid&0x04))&&(ZB[ 512]>index_spr)) { Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr; } | |
| if ((!(solid&0x02))&&(ZB[ 256]>index_spr)) { Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr; } | |
| if ((!(solid&0x01))&&(ZB[ 0]>index_spr)) { Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr; } | |
| } | |
| __inline void FLIPPED16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN \ | |
| if (*ZB>index_spr) {*Screen=*Pixels; *ZB=index_spr;} \ | |
| Screen-=256; Pixels++; ZB-=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (ZB[1792]>index_spr) { Screen[1792] = Pixels[0]; ZB[1792]=index_spr; } | |
| if (ZB[1536]>index_spr) { Screen[1536] = Pixels[1]; ZB[1536]=index_spr; } | |
| if (ZB[1280]>index_spr) { Screen[1280] = Pixels[2]; ZB[1280]=index_spr; } | |
| if (ZB[1024]>index_spr) { Screen[1024] = Pixels[3]; ZB[1024]=index_spr; } | |
| if (ZB[ 768]>index_spr) { Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr; } | |
| if (ZB[ 512]>index_spr) { Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr; } | |
| if (ZB[ 256]>index_spr) { Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr; } | |
| if (ZB[ 0]>index_spr) { Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr; } | |
| } | |
| __inline void NORMAL_ADD_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0];} | |
| if (!(solid&0x40)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1];} | |
| if (!(solid&0x20)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2];} | |
| if (!(solid&0x10)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3];} | |
| if (!(solid&0x08)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4];} | |
| if (!(solid&0x04)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5];} | |
| if (!(solid&0x02)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6];} | |
| if (!(solid&0x01)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7];} | |
| } | |
| __inline void NORMAL_ADD_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* | |
| #define FN \ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; | |
| } | |
| __inline void FLIPPED_ADD_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (!(solid&0x80)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0];} | |
| if (!(solid&0x40)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1];} | |
| if (!(solid&0x20)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2];} | |
| if (!(solid&0x10)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3];} | |
| if (!(solid&0x08)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4];} | |
| if (!(solid&0x04)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5];} | |
| if (!(solid&0x02)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6];} | |
| if (!(solid&0x01)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7];} | |
| } | |
| __inline void FLIPPED_ADD_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| /* | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset +7*256; | |
| #define FN \ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; | |
| } | |
| __inline void NORMAL_ADD_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; \ | |
| } \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (!(solid&0x80)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void NORMAL_ADD_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void FLIPPED_ADD_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; }\ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (!(solid&0x80)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void FLIPPED_ADD_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| /* | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void NORMAL_ADD1_2_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0];} | |
| if (!(solid&0x40)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1];} | |
| if (!(solid&0x20)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2];} | |
| if (!(solid&0x10)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3];} | |
| if (!(solid&0x08)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4];} | |
| if (!(solid&0x04)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5];} | |
| if (!(solid&0x02)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6];} | |
| if (!(solid&0x01)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7];} | |
| } | |
| __inline void NORMAL_ADD1_2_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* #define FN \ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; | |
| } | |
| __inline void FLIPPED_ADD1_2_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (!(solid&0x80)) {if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0];} | |
| if (!(solid&0x40)) {if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1];} | |
| if (!(solid&0x20)) {if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2];} | |
| if (!(solid&0x10)) {if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3];} | |
| if (!(solid&0x08)) {if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4];} | |
| if (!(solid&0x04)) {if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5];} | |
| if (!(solid&0x02)) {if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6];} | |
| if (!(solid&0x01)) {if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7];} | |
| } | |
| __inline void FLIPPED_ADD1_2_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset +7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset +7*256; | |
| #define FN \ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; | |
| } | |
| __inline void NORMAL_ADD1_2_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; \ | |
| } \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void NORMAL_ADD1_2_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void FLIPPED_ADD1_2_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; }\ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (!(solid&0x80)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void FLIPPED_ADD1_2_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_ADD1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_ADD1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_ADD1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_ADD1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_ADD1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_ADD1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_ADD1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_ADD1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_ADD1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void NORMAL_SUB_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0];} | |
| if (!(solid&0x40)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1];} | |
| if (!(solid&0x20)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2];} | |
| if (!(solid&0x10)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3];} | |
| if (!(solid&0x08)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4];} | |
| if (!(solid&0x04)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5];} | |
| if (!(solid&0x02)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6];} | |
| if (!(solid&0x01)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7];} | |
| } | |
| __inline void NORMAL_SUB_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* #define FN \ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; | |
| } | |
| __inline void FLIPPED_SUB_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset +7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset+7*256; | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (!(solid&0x80)) {if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0];} | |
| if (!(solid&0x40)) {if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1];} | |
| if (!(solid&0x20)) {if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2];} | |
| if (!(solid&0x10)) {if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3];} | |
| if (!(solid&0x08)) {if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4];} | |
| if (!(solid&0x04)) {if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5];} | |
| if (!(solid&0x02)) {if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6];} | |
| if (!(solid&0x01)) {if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7];} | |
| } | |
| __inline void FLIPPED_SUB_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset+7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset+7*256; | |
| #define FN \ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; | |
| } | |
| __inline void NORMAL_SUB_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; \ | |
| } \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void NORMAL_SUB_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void FLIPPED_SUB_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; }\ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (!(solid&0x80)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void FLIPPED_SUB_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void NORMAL_SUB1_2_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0];} | |
| if (!(solid&0x40)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1];} | |
| if (!(solid&0x20)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2];} | |
| if (!(solid&0x10)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3];} | |
| if (!(solid&0x08)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4];} | |
| if (!(solid&0x04)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5];} | |
| if (!(solid&0x02)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6];} | |
| if (!(solid&0x01)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7];} | |
| } | |
| __inline void NORMAL_SUB1_2_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| /* #define FN \ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen+=256; SubScreen+=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; | |
| } | |
| __inline void FLIPPED_SUB1_2_16_T (uint32 Offset,uint16 *Pixels,uint32 solid) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset +7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset +7*256; | |
| #define FN(N) \ | |
| if (!(solid&(1<<(7-N)))) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen); \ | |
| else *Screen=*Pixels;}\ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (!(solid&0x80)) {if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0];} | |
| if (!(solid&0x40)) {if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1];} | |
| if (!(solid&0x20)) {if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2];} | |
| if (!(solid&0x10)) {if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3];} | |
| if (!(solid&0x08)) {if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4];} | |
| if (!(solid&0x04)) {if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5];} | |
| if (!(solid&0x02)) {if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6];} | |
| if (!(solid&0x01)) {if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7];} | |
| } | |
| __inline void FLIPPED_SUB1_2_16_O (uint32 Offset,uint16 *Pixels) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset+7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset+7*256; | |
| #define FN \ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels; \ | |
| Screen-=256; SubScreen-=256; Pixels++; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; | |
| if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; | |
| if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; | |
| if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; | |
| if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; | |
| if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; | |
| if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; | |
| if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; | |
| } | |
| __inline void NORMAL_SUB1_2_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; \ | |
| } \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| if (!(solid&0x80)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void NORMAL_SUB1_2_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| /* | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen+=256; SubScreen+=256; Pixels++; ZB+=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[0], SubScreen[ 0]); else Screen[ 0] = Pixels[0]; ZB[ 0]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[1], SubScreen[ 256]); else Screen[ 256] = Pixels[1]; ZB[ 256]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[2], SubScreen[ 512]); else Screen[ 512] = Pixels[2]; ZB[ 512]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[3], SubScreen[ 768]); else Screen[ 768] = Pixels[3]; ZB[ 768]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[4], SubScreen[1024]); else Screen[1024] = Pixels[4]; ZB[1024]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[5], SubScreen[1280]); else Screen[1280] = Pixels[5]; ZB[1280]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[6], SubScreen[1536]); else Screen[1536] = Pixels[6]; ZB[1536]=index_spr;} | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[7], SubScreen[1792]); else Screen[1792] = Pixels[7]; ZB[1792]=index_spr;} | |
| } | |
| __inline void FLIPPED_SUB1_2_16_SPR_T (uint32 Offset,uint16 *Pixels,uint32 solid,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN(N) \ | |
| if ((!(solid&(1<<(7-N))))&&(*ZB>index_spr)) { \ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr; }\ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| FN(4) | |
| FN(5) | |
| FN(6) | |
| FN(7) | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (!(solid&0x80)&&(ZB[1792]>index_spr)) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (!(solid&0x40)&&(ZB[1536]>index_spr)) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (!(solid&0x20)&&(ZB[1280]>index_spr)) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (!(solid&0x10)&&(ZB[1024]>index_spr)) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (!(solid&0x08)&&(ZB[ 768]>index_spr)) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (!(solid&0x04)&&(ZB[ 512]>index_spr)) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (!(solid&0x02)&&(ZB[ 256]>index_spr)) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (!(solid&0x01)&&(ZB[ 0]>index_spr)) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| __inline void FLIPPED_SUB1_2_16_SPR_O (uint32 Offset,uint16 *Pixels,uint32 index_spr) | |
| { | |
| /* uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset + 7*256; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset + 7*256; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset + 7*256; | |
| #define FN \ | |
| if (*ZB>index_spr) {\ | |
| if (*SubScreen) *Screen = COLOR_SUB1_2(*Pixels,*SubScreen);\ | |
| else *Screen=*Pixels;\ | |
| *ZB=index_spr;} \ | |
| Screen-=256; SubScreen-=256; Pixels++; ZB-=256; | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| FN | |
| #undef FN | |
| */ | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.Screen + Offset; | |
| uint16 *SubScreen = (uint16 *) GPUPack.GFX.SubScreen + Offset; | |
| uint8 *ZB = (uint8 *)GPUPack.GFX.ZBuffer + Offset; | |
| if (ZB[1792]>index_spr) { if (SubScreen[1792]) Screen[1792] = COLOR_SUB1_2(Pixels[0], SubScreen[1792]); else Screen[1792] = Pixels[0]; ZB[1792]=index_spr;} | |
| if (ZB[1536]>index_spr) { if (SubScreen[1536]) Screen[1536] = COLOR_SUB1_2(Pixels[1], SubScreen[1536]); else Screen[1536] = Pixels[1]; ZB[1536]=index_spr;} | |
| if (ZB[1280]>index_spr) { if (SubScreen[1280]) Screen[1280] = COLOR_SUB1_2(Pixels[2], SubScreen[1280]); else Screen[1280] = Pixels[2]; ZB[1280]=index_spr;} | |
| if (ZB[1024]>index_spr) { if (SubScreen[1024]) Screen[1024] = COLOR_SUB1_2(Pixels[3], SubScreen[1024]); else Screen[1024] = Pixels[3]; ZB[1024]=index_spr;} | |
| if (ZB[ 768]>index_spr) { if (SubScreen[ 768]) Screen[ 768] = COLOR_SUB1_2(Pixels[4], SubScreen[ 768]); else Screen[ 768] = Pixels[4]; ZB[ 768]=index_spr;} | |
| if (ZB[ 512]>index_spr) { if (SubScreen[ 512]) Screen[ 512] = COLOR_SUB1_2(Pixels[5], SubScreen[ 512]); else Screen[ 512] = Pixels[5]; ZB[ 512]=index_spr;} | |
| if (ZB[ 256]>index_spr) { if (SubScreen[ 256]) Screen[ 256] = COLOR_SUB1_2(Pixels[6], SubScreen[ 256]); else Screen[ 256] = Pixels[6]; ZB[ 256]=index_spr;} | |
| if (ZB[ 0]>index_spr) { if (SubScreen[ 0]) Screen[ 0] = COLOR_SUB1_2(Pixels[7], SubScreen[ 0]); else Screen[ 0] = Pixels[7]; ZB[ 0]=index_spr;} | |
| } | |
| /*********************************************************************/ | |
| void softDrawTile16New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16NewSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16NewSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawHiResTile16New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawHiResClippedTile16New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| /****************** ADD ***********************/ | |
| void softDrawTile16ADDNew (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16ADDNew (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16ADDNewSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16ADDNewSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawHiResTile16ADDNew (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawHiResClippedTile16ADDNew (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_ADD_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_ADD_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_ADD_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| /****************** ADD1_2 ***********************/ | |
| void softDrawTile16ADD1_2New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16ADD1_2New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16ADD1_2NewSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16ADD1_2NewSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_ADD1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_ADD1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_ADD1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_ADD1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_ADD1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawHiResTile16ADD1_2New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawHiResClippedTile16ADD1_2New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_ADD1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_ADD1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_ADD1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| /****************** SUB ***********************/ | |
| void softDrawTile16SUBNew (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16SUBNew (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16SUBNewSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16SUBNewSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawHiResTile16SUBNew (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawHiResClippedTile16SUBNew (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_SUB_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_SUB_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_SUB_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| /****************** SUB1_2 ***********************/ | |
| void softDrawTile16SUB1_2New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16SUB1_2New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16SUB1_2NewSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 7; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 8; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawClippedTile16SUB1_2NewSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| NORMAL_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| NORMAL_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset--) | |
| FLIPPED_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, Offset++) | |
| FLIPPED_SUB1_2_16_SPR_O (Offset, (uint16*)bp,index_spr); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| NORMAL_SUB1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| NORMAL_SUB1_2_16_SPR_T (Offset, (uint16*)bp,solid_lineclip|*headerbp,index_spr); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel+Width-1); | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset--) | |
| FLIPPED_SUB1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += StartPixel; | |
| for (l = Width; l != 0; l--, bp += 8*2, headerbp++, Offset++) | |
| FLIPPED_SUB1_2_16_SPR_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp,index_spr); | |
| } | |
| } | |
| } | |
| void softDrawHiResTile16SUB1_2New (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| Offset += 3; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache; | |
| bp = pCache+8; | |
| for (l = 4; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawHiResClippedTile16SUB1_2New (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| uint8 *pCache; | |
| uint32 Col; | |
| uint32 TileAddr = GPUPack.BG.TileAddress + ((Tile & 0x3ff) << GPUPack.BG.TileShift); | |
| if (Tile & 0x100) TileAddr += GPUPack.BG.NameSelect; | |
| TileAddr &= 0xffff; | |
| register uint32 l; | |
| if (GPUPack.BG.DirectColourMode) | |
| { | |
| //Did the palette changed ? | |
| if (IPPU.DirectColourMapsNeedRebuild) S9xBuildDirectColourMaps (); | |
| GPUPack.GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & GPUPack.BG.PaletteMask]; | |
| Col = 0; | |
| } | |
| else | |
| { | |
| GPUPack.GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette]; | |
| Col = (((Tile >> 10) & GPUPack.BG.PaletteMask) << GPUPack.BG.PaletteShift) + GPUPack.BG.StartPalette; | |
| } | |
| uint32 TileNumber; | |
| pCache = &GPUPack.BG.Buffer[(TileNumber = (TileAddr >> GPUPack.BG.TileShift)) *(128+8)]; | |
| if ((!GPUPack.BG.Buffered [TileNumber<<1])|(GPUPack.BG.Buffered [(TileNumber<<1)|1]!=Col)) | |
| { | |
| GPUPack.BG.Buffered[TileNumber<<1] = softConvertTile16New (pCache, TileAddr,GPUPack.GFX.ScreenColors); | |
| GPUPack.BG.Buffered[(TileNumber<<1)|1] = Col; | |
| } | |
| if (GPUPack.BG.Buffered [TileNumber<<1] == 1) //BLANK_TILE | |
| return; | |
| //Tile is not blank, 'have to draw it | |
| register uint8 *bp,*headerbp; | |
| uint32 solid_lineclip; | |
| switch (StartLine) | |
| { | |
| case 0:solid_lineclip=0x0000;break; | |
| case 1:solid_lineclip=0x0180;break; | |
| case 2:solid_lineclip=0x03C0;break; | |
| case 3:solid_lineclip=0x07E0;break; | |
| case 4:solid_lineclip=0x0FF0;break; | |
| case 5:solid_lineclip=0x1FF8;break; | |
| case 6:solid_lineclip=0x3FFC;break; | |
| default:solid_lineclip=0x7FFE;break; | |
| } | |
| switch (StartLine+LineCount) //EndLine | |
| { | |
| case 1:solid_lineclip|=0xFE7F;break; | |
| case 2:solid_lineclip|=0xFC3F;break; | |
| case 3:solid_lineclip|=0xF81F;break; | |
| case 4:solid_lineclip|=0xF00F;break; | |
| case 5:solid_lineclip|=0xE007;break; | |
| case 6:solid_lineclip|=0xC003;break; | |
| case 7:solid_lineclip|=0x8001;break; | |
| } | |
| if (solid_lineclip==0xFFFF) return; | |
| if ( (GPUPack.BG.Buffered [TileNumber<<1] == 2)&&(!solid_lineclip)) | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| NORMAL_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset--) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, Offset++) | |
| FLIPPED_SUB1_2_16_O (Offset, (uint16*)bp); | |
| } | |
| } | |
| else | |
| { | |
| Offset -= StartLine*256; //align to tile multiple | |
| if (!(Tile & (V_FLIP | H_FLIP))) | |
| { | |
| //NO FLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8 + StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (!(Tile & V_FLIP)) | |
| { | |
| //HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| NORMAL_SUB1_2_16_T (Offset, (uint16*)bp,solid_lineclip|*headerbp); | |
| } | |
| else | |
| if (Tile & H_FLIP) | |
| { | |
| //VFLIP & HFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += ((StartPixel+Width-1)>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset--) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| else | |
| { | |
| //VFLIP | |
| headerbp = pCache+StartPixel; | |
| bp = pCache+8+StartPixel*16; | |
| Offset += (StartPixel>>1); | |
| for (l = Width>>1; l != 0; l--, bp += 8*2*2, headerbp+=2, Offset++) | |
| FLIPPED_SUB1_2_16_T (Offset, (uint16*)bp,(solid_lineclip>>8)|*headerbp); | |
| } | |
| } | |
| } | |
| void softDrawTile16NewFastSprite (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| softDrawTile16New(Tile,Offset,StartLine,LineCount); | |
| } | |
| void softDrawClippedTile16NewFastSprite (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount, uint32 index_spr) | |
| { | |
| softDrawClippedTile16New (Tile,Offset,StartPixel,Width,StartLine,LineCount); | |
| } |