1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| // REFRESH THE LOCAL CELL ROW IF NEEDED ----------------------------
bool refreshCell = y == yStart ||( ( ( ( y+sY ) >> 3 ) & 63 ) != currentRow )||( ( ( sX >> 3 ) & 63 ) != currentColon );
if ( refreshCell ) {
currentRow = ( ( y+sY ) >> 3 ) & 63 ;
currentColon = ( sX >> 3 ) & 63 ;
unsigned const char * tileIndexMap = s_tileIndexMap , * tilePaletteOffsetMap = s_tilePaletteOffsetMap;
unsigned char * localRowPalOffset = s_localRowPalOffset;
unsigned char ** localRowTileAdress = s_localRowTileAdress , ** pVram = s_pVram;
unsigned char indexCell = 0, indexTile = 0, palOffset = 0 ;
long mapCell=0, row=currentRow, col=currentColon;
// RESOLVE ADRESSES AND PALETTE OFFSETS FOR ALL TILES OF THE ROW
for ( indexCell = 0; indexCell < S_SCRW / 8 + 2; indexCell ++ ) {
mapCell = ( ( indexCell + col ) & 63 ) + ( row << 6 ) ;
indexTile = tileIndexMap[ ( indexCell+(sX>>3) & 63 ) + ( row << 6 ) ];
localRowTileAdress[ indexCell ] = pVram[ indexTile >> 6 ] + ( ( indexTile & 63 ) << 3 ) ;
localRowPalOffset[ indexCell ] = tilePaletteOffsetMap[ mapCell ] ;
}
}
// copy backgrounds tiles
if ( true ) {
long step = 0 , numSteps = S_SCRW / 8 + 1 , localY = ( y+sY ) & 7 ; // steps of copy
unsigned char pixRow = 0, palOff = 0; // the compressed data on one row
unsigned char * writeHere = s_scanline - 1 + 8 - ( sX & 7 ) , * writeStop = writeHere, * localRowPal = s_localRowPalOffset;
unsigned char ** localRow = s_localRowTileAdress;
// uncompress each tile row - OPTIMIZE MAXIMUM HERE -----------------------
for ( step = 0; step < numSteps; step++ ) {
pixRow = localRow[ step ][ localY ] ; // read pix row in vram
palOff = localRowPal[ step ]; // read palette ofsset
// uncompress 1 bit pixels to 8 bit pixels
for ( writeStop=writeHere+8; writeHere<writeStop; pixRow >>= 1 ) {
*(++writeHere) = ( 1 & pixRow ) + palOff;
}
}
} |
Partager