Normally, the VDP works with 8x8 tiles. When double resolution is enabled, it works with 8x16 tiles instead. The pattern indices (the low 11 bits of a tile in a plane) are affected by this: instead of multiplying the index by $20 to find the tile's address, you multiply by $40 instead. In Sonic 2, when the block mappings are loaded into RAM, it shifts the pattern indices right by 1 bit to account for this; Adjust2PArtPointer and Adjust2PArtPointer2 do a similar job for the art_tile property of objects. Also, the sprite mappings all have the precomputed pattern indices to use in double resolution mode as well as the pattern indices to use in normal resolution mode. When rendering the blocks in double resolution mode, only the top row is effectively written, since a row isn't 8 pixels high but 16 pixels high. If you load a level that's designed for double resolution mode, you'll see that the pattern indices in the bottom row of every block is the pattern index of the tile above it + 1. This is necessary to be able to use the same tiles and block mappings in both normal resolution and double resolution modes. If this rule is not followed, you get garbled graphics.