Annotation of hatari/src/convert/macros.h, revision 1.1.1.6

1.1       root        1: /*
                      2:   Hatari - macros.h
                      3:   
                      4:   Lookup tables and macros for screen conversion routines.
                      5: 
                      6:   This file is distributed under the GNU Public License, version 2 or at your
                      7:   option any later version. Read the file gpl.txt for details.
                      8: */
                      9: 
                     10: #ifndef HATARI_CONVERTMACROS_H
                     11: #define HATARI_CONVERTMACROS_H
                     12: 
                     13: /* For palette we don't go from colour '0' as the whole background
                     14:  * would change, so go from this value
                     15:  */
                     16: #define  BASECOLOUR       0x0A
                     17: #define  BASECOLOUR_LONG  0x0A0A0A0A
                     18: 
                     19: /* Remap tables to convert from plane format to byte-per-pixel
                     20:  * (Upper is for 4-Planes so if shifted by 2)
                     21:  */
1.1.1.2   root       22: static const Uint32 Remap_2_Planes[256] = {
1.1       root       23:   0x00000000,  0x01000000,  0x00010000,  0x01010000,  0x00000100,  0x01000100,  0x00010100,  0x01010100,
                     24:   0x00000001,  0x01000001,  0x00010001,  0x01010001,  0x00000101,  0x01000101,  0x00010101,  0x01010101,
                     25:   0x02000000,  0x03000000,  0x02010000,  0x03010000,  0x02000100,  0x03000100,  0x02010100,  0x03010100,
                     26:   0x02000001,  0x03000001,  0x02010001,  0x03010001,  0x02000101,  0x03000101,  0x02010101,  0x03010101,
                     27:   0x00020000,  0x01020000,  0x00030000,  0x01030000,  0x00020100,  0x01020100,  0x00030100,  0x01030100,
                     28:   0x00020001,  0x01020001,  0x00030001,  0x01030001,  0x00020101,  0x01020101,  0x00030101,  0x01030101,
                     29:   0x02020000,  0x03020000,  0x02030000,  0x03030000,  0x02020100,  0x03020100,  0x02030100,  0x03030100,
                     30:   0x02020001,  0x03020001,  0x02030001,  0x03030001,  0x02020101,  0x03020101,  0x02030101,  0x03030101,
                     31:   0x00000200,  0x01000200,  0x00010200,  0x01010200,  0x00000300,  0x01000300,  0x00010300,  0x01010300,
                     32:   0x00000201,  0x01000201,  0x00010201,  0x01010201,  0x00000301,  0x01000301,  0x00010301,  0x01010301,
                     33:   0x02000200,  0x03000200,  0x02010200,  0x03010200,  0x02000300,  0x03000300,  0x02010300,  0x03010300,
                     34:   0x02000201,  0x03000201,  0x02010201,  0x03010201,  0x02000301,  0x03000301,  0x02010301,  0x03010301,
                     35:   0x00020200,  0x01020200,  0x00030200,  0x01030200,  0x00020300,  0x01020300,  0x00030300,  0x01030300,
                     36:   0x00020201,  0x01020201,  0x00030201,  0x01030201,  0x00020301,  0x01020301,  0x00030301,  0x01030301,
                     37:   0x02020200,  0x03020200,  0x02030200,  0x03030200,  0x02020300,  0x03020300,  0x02030300,  0x03030300,
                     38:   0x02020201,  0x03020201,  0x02030201,  0x03030201,  0x02020301,  0x03020301,  0x02030301,  0x03030301,
                     39:   0x00000002,  0x01000002,  0x00010002,  0x01010002,  0x00000102,  0x01000102,  0x00010102,  0x01010102,
                     40:   0x00000003,  0x01000003,  0x00010003,  0x01010003,  0x00000103,  0x01000103,  0x00010103,  0x01010103,
                     41:   0x02000002,  0x03000002,  0x02010002,  0x03010002,  0x02000102,  0x03000102,  0x02010102,  0x03010102,
                     42:   0x02000003,  0x03000003,  0x02010003,  0x03010003,  0x02000103,  0x03000103,  0x02010103,  0x03010103,
                     43:   0x00020002,  0x01020002,  0x00030002,  0x01030002,  0x00020102,  0x01020102,  0x00030102,  0x01030102,
                     44:   0x00020003,  0x01020003,  0x00030003,  0x01030003,  0x00020103,  0x01020103,  0x00030103,  0x01030103,
                     45:   0x02020002,  0x03020002,  0x02030002,  0x03030002,  0x02020102,  0x03020102,  0x02030102,  0x03030102,
                     46:   0x02020003,  0x03020003,  0x02030003,  0x03030003,  0x02020103,  0x03020103,  0x02030103,  0x03030103,
                     47:   0x00000202,  0x01000202,  0x00010202,  0x01010202,  0x00000302,  0x01000302,  0x00010302,  0x01010302,
                     48:   0x00000203,  0x01000203,  0x00010203,  0x01010203,  0x00000303,  0x01000303,  0x00010303,  0x01010303,
                     49:   0x02000202,  0x03000202,  0x02010202,  0x03010202,  0x02000302,  0x03000302,  0x02010302,  0x03010302,
                     50:   0x02000203,  0x03000203,  0x02010203,  0x03010203,  0x02000303,  0x03000303,  0x02010303,  0x03010303,
                     51:   0x00020202,  0x01020202,  0x00030202,  0x01030202,  0x00020302,  0x01020302,  0x00030302,  0x01030302,
                     52:   0x00020203,  0x01020203,  0x00030203,  0x01030203,  0x00020303,  0x01020303,  0x00030303,  0x01030303,
                     53:   0x02020202,  0x03020202,  0x02030202,  0x03030202,  0x02020302,  0x03020302,  0x02030302,  0x03030302,
                     54:   0x02020203,  0x03020203,  0x02030203,  0x03030203,  0x02020303,  0x03020303,  0x02030303,  0x03030303,
                     55: };
                     56: 
1.1.1.2   root       57: static const Uint32 Remap_2_Planes_Upper[256] = {
1.1       root       58:   0x00000000,  0x04000000,  0x00040000,  0x04040000,  0x00000400,  0x04000400,  0x00040400,  0x04040400,
                     59:   0x00000004,  0x04000004,  0x00040004,  0x04040004,  0x00000404,  0x04000404,  0x00040404,  0x04040404,
                     60:   0x08000000,  0x0C000000,  0x08040000,  0x0C040000,  0x08000400,  0x0C000400,  0x08040400,  0x0C040400,
                     61:   0x08000004,  0x0C000004,  0x08040004,  0x0C040004,  0x08000404,  0x0C000404,  0x08040404,  0x0C040404,
                     62:   0x00080000,  0x04080000,  0x000C0000,  0x040C0000,  0x00080400,  0x04080400,  0x000C0400,  0x040C0400,
                     63:   0x00080004,  0x04080004,  0x000C0004,  0x040C0004,  0x00080404,  0x04080404,  0x000C0404,  0x040C0404,
                     64:   0x08080000,  0x0C080000,  0x080C0000,  0x0C0C0000,  0x08080400,  0x0C080400,  0x080C0400,  0x0C0C0400,
                     65:   0x08080004,  0x0C080004,  0x080C0004,  0x0C0C0004,  0x08080404,  0x0C080404,  0x080C0404,  0x0C0C0404,
                     66:   0x00000800,  0x04000800,  0x00040800,  0x04040800,  0x00000C00,  0x04000C00,  0x00040C00,  0x04040C00,
                     67:   0x00000804,  0x04000804,  0x00040804,  0x04040804,  0x00000C04,  0x04000C04,  0x00040C04,  0x04040C04,
                     68:   0x08000800,  0x0C000800,  0x08040800,  0x0C040800,  0x08000C00,  0x0C000C00,  0x08040C00,  0x0C040C00,
                     69:   0x08000804,  0x0C000804,  0x08040804,  0x0C040804,  0x08000C04,  0x0C000C04,  0x08040C04,  0x0C040C04,
                     70:   0x00080800,  0x04080800,  0x000C0800,  0x040C0800,  0x00080C00,  0x04080C00,  0x000C0C00,  0x040C0C00,
                     71:   0x00080804,  0x04080804,  0x000C0804,  0x040C0804,  0x00080C04,  0x04080C04,  0x000C0C04,  0x040C0C04,
                     72:   0x08080800,  0x0C080800,  0x080C0800,  0x0C0C0800,  0x08080C00,  0x0C080C00,  0x080C0C00,  0x0C0C0C00,
                     73:   0x08080804,  0x0C080804,  0x080C0804,  0x0C0C0804,  0x08080C04,  0x0C080C04,  0x080C0C04,  0x0C0C0C04,
                     74:   0x00000008,  0x04000008,  0x00040008,  0x04040008,  0x00000408,  0x04000408,  0x00040408,  0x04040408,
                     75:   0x0000000C,  0x0400000C,  0x0004000C,  0x0404000C,  0x0000040C,  0x0400040C,  0x0004040C,  0x0404040C,
                     76:   0x08000008,  0x0C000008,  0x08040008,  0x0C040008,  0x08000408,  0x0C000408,  0x08040408,  0x0C040408,
                     77:   0x0800000C,  0x0C00000C,  0x0804000C,  0x0C04000C,  0x0800040C,  0x0C00040C,  0x0804040C,  0x0C04040C,
                     78:   0x00080008,  0x04080008,  0x000C0008,  0x040C0008,  0x00080408,  0x04080408,  0x000C0408,  0x040C0408,
                     79:   0x0008000C,  0x0408000C,  0x000C000C,  0x040C000C,  0x0008040C,  0x0408040C,  0x000C040C,  0x040C040C,
                     80:   0x08080008,  0x0C080008,  0x080C0008,  0x0C0C0008,  0x08080408,  0x0C080408,  0x080C0408,  0x0C0C0408,
                     81:   0x0808000C,  0x0C08000C,  0x080C000C,  0x0C0C000C,  0x0808040C,  0x0C08040C,  0x080C040C,  0x0C0C040C,
                     82:   0x00000808,  0x04000808,  0x00040808,  0x04040808,  0x00000C08,  0x04000C08,  0x00040C08,  0x04040C08,
                     83:   0x0000080C,  0x0400080C,  0x0004080C,  0x0404080C,  0x00000C0C,  0x04000C0C,  0x00040C0C,  0x04040C0C,
                     84:   0x08000808,  0x0C000808,  0x08040808,  0x0C040808,  0x08000C08,  0x0C000C08,  0x08040C08,  0x0C040C08,
                     85:   0x0800080C,  0x0C00080C,  0x0804080C,  0x0C04080C,  0x08000C0C,  0x0C000C0C,  0x08040C0C,  0x0C040C0C,
                     86:   0x00080808,  0x04080808,  0x000C0808,  0x040C0808,  0x00080C08,  0x04080C08,  0x000C0C08,  0x040C0C08,
                     87:   0x0008080C,  0x0408080C,  0x000C080C,  0x040C080C,  0x00080C0C,  0x04080C0C,  0x000C0C0C,  0x040C0C0C,
                     88:   0x08080808,  0x0C080808,  0x080C0808,  0x0C0C0808,  0x08080C08,  0x0C080C08,  0x080C0C08,  0x0C0C0C08,
                     89:   0x0808080C,  0x0C08080C,  0x080C080C,  0x0C0C080C,  0x08080C0C,  0x0C080C0C,  0x080C0C0C,  0x0C0C0C0C,
                     90: };
                     91: 
1.1.1.2   root       92: static const Uint32 Remap_1_Plane[16] = {
1.1       root       93:   0x00000000+BASECOLOUR_LONG,  0x01000000+BASECOLOUR_LONG,  0x00010000+BASECOLOUR_LONG,  0x01010000+BASECOLOUR_LONG,  0x00000100+BASECOLOUR_LONG,  0x01000100+BASECOLOUR_LONG,  0x00010100+BASECOLOUR_LONG,  0x01010100+BASECOLOUR_LONG,
                     94:   0x00000001+BASECOLOUR_LONG,  0x01000001+BASECOLOUR_LONG,  0x00010001+BASECOLOUR_LONG,  0x01010001+BASECOLOUR_LONG,  0x00000101+BASECOLOUR_LONG,  0x01000101+BASECOLOUR_LONG,  0x00010101+BASECOLOUR_LONG,  0x01010101+BASECOLOUR_LONG,
                     95: };
                     96: 
                     97: 
1.1.1.6 ! root       98: 
        !            99: /*----------------------------------------------------------------------*/
        !           100: /* Macros to convert from Atari's planar mode to chunky mode
        !           101:  * (1 byte per pixel). Convert by blocks of 4 pixels.
        !           102:  * 16 low res pixels -> 4 planes of 16 bits
        !           103:  * 16 med res pixels -> 2 planes of 16 bits
        !           104:  * 16 hi  res pixels -> 1 plane of 16 bits
        !           105:  */
        !           106: 
1.1       root      107: #define LOW_BUILD_PIXELS_0 \
                    108: { \
                    109:  ebx &= 0x0f0f0f0f; \
                    110:  ecx &= 0x0f0f0f0f; \
                    111:  eax = (ebx >> 12) | ebx; \
                    112:  edx = (ecx >> 12) | ecx; \
                    113:  ecx = Remap_2_Planes_Upper[edx & 0x00ff]; \
                    114:  ecx +=      Remap_2_Planes[eax & 0x00ff]; \
                    115: }
                    116: 
                    117: #define LOW_BUILD_PIXELS_1 \
                    118: { \
                    119:  ecx = Remap_2_Planes_Upper[(edx >> 8) & 0x00ff]; \
                    120:  ecx +=      Remap_2_Planes[(eax >> 8) & 0x00ff]; \
                    121: }
                    122: 
                    123: #define LOW_BUILD_PIXELS_2 \
                    124: { \
                    125:  ebx = (*edi     & 0xf0f0f0f0) >> 4; \
                    126:  ecx = (*(edi+1) & 0xf0f0f0f0) >> 4; \
                    127:  eax = (ebx >> 12) | ebx; \
                    128:  edx = (ecx >> 12) | ecx; \
                    129:  ecx = Remap_2_Planes_Upper[edx & 0x00ff]; \
                    130:  ecx +=      Remap_2_Planes[eax & 0x00ff]; \
                    131: }
                    132: 
                    133: #define LOW_BUILD_PIXELS_3 \
                    134: { \
                    135:  ecx = Remap_2_Planes_Upper[(edx >> 8) & 0x00ff]; \
                    136:  ecx +=      Remap_2_Planes[(eax >> 8) & 0x00ff]; \
                    137: }
                    138: 
                    139: 
                    140: #define MED_BUILD_PIXELS_0 \
                    141: { \
                    142:  ebx &= 0x0f0f0f0f; \
                    143:  eax = (ebx >> 12) | ebx; \
                    144:  ecx = Remap_2_Planes[eax & 0x000000ff]; \
                    145: }
                    146: 
                    147: #define MED_BUILD_PIXELS_1 \
                    148: { \
                    149:  ecx = Remap_2_Planes[(eax >> 8) & 0x000000ff]; \
                    150: }
                    151: 
                    152: #define MED_BUILD_PIXELS_2 \
                    153: { \
                    154:  ebx = (*edi & 0xf0f0f0f0) >> 4; \
                    155:  eax = (ebx >> 12) | ebx; \
                    156:  ecx = Remap_2_Planes[eax & 0x000000ff]; \
                    157: }
                    158: 
                    159: #define MED_BUILD_PIXELS_3 \
                    160: { \
                    161:  ecx = Remap_2_Planes[(eax >> 8) & 0x000000ff]; \
                    162: }
                    163: 
                    164: 
                    165: /* Routines to create 'ecx' pixels - MUST be called in this order */
                    166: #define HIGH_BUILD_PIXELS_0 \
                    167: { \
                    168:  eax = (ebx & 0x0000000f); \
                    169: }
                    170: 
                    171: #define HIGH_BUILD_PIXELS_1 \
                    172: { \
                    173:  eax = (ebx >> 4) & 0x0000000f;\
                    174: }
                    175: 
                    176: #define HIGH_BUILD_PIXELS_2 \
                    177: { \
                    178:  eax = (ebx >> 8) & 0x0000000f;\
                    179: }
                    180: 
                    181: #define HIGH_BUILD_PIXELS_3 \
                    182: { \
                    183:  eax = (ebx >> 12) & 0x0000000f;\
                    184: }
                    185: 
                    186: 
1.1.1.6 ! root      187: 
        !           188: /*----------------------------------------------------------------------*/
        !           189: /* Macros to plot Atari's pixels in the emulator's buffer
        !           190:  * (the buffer can be 32, 16 or 8 bits per pixel)
        !           191:  */
        !           192: 
        !           193: /*
        !           194:  * 32 bit screen format
        !           195:  */
        !           196: 
1.1.1.3   root      197: /* Plot Low Resolution (320xH) 32-Bit pixels */
                    198: #define PLOT_LOW_320_32BIT(offset)  \
                    199: { \
                    200:        esi[offset]   = (Uint32)STRGBPalette[ecx & 0x00ff]; \
                    201:        esi[offset+1] = (Uint32)STRGBPalette[(ecx >> 8) & 0x00ff]; \
                    202:        esi[offset+2] = (Uint32)STRGBPalette[(ecx >> 16) & 0x00ff]; \
                    203:        esi[offset+3] = (Uint32)STRGBPalette[(ecx >> 24) & 0x00ff]; \
                    204: }
                    205: 
                    206: /* Plot Low Resolution (640xH) 32-Bit pixels */
                    207: #define PLOT_LOW_640_32BIT(offset) \
                    208: { \
                    209:        esi[offset+0] = esi[offset+1] = STRGBPalette[ecx & 0x000000ff]; \
                    210:        esi[offset+2] = esi[offset+3] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    211:        esi[offset+4] = esi[offset+5] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    212:        esi[offset+6] = esi[offset+7] = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    213: } 
                    214: 
                    215: /* Plot Low Resolution (640xH) 16-Bit pixels (Double on Y) */
                    216: #define PLOT_LOW_640_32BIT_DOUBLE_Y(offset) \
                    217: { \
                    218:        ebx = STRGBPalette[ecx & 0x000000ff]; \
                    219:        esi[offset+0] = esi[offset+1] = esi[offset+Screen4BytesPerLine+0] \
                    220:           = esi[offset+Screen4BytesPerLine+1] = ebx; \
                    221:        ebx = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    222:        esi[offset+2] = esi[offset+3] = esi[offset+Screen4BytesPerLine+2] \
                    223:           = esi[offset+Screen4BytesPerLine+3] = ebx; \
                    224:        ebx = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    225:        esi[offset+4] = esi[offset+5] = esi[offset+Screen4BytesPerLine+4] \
                    226:           = esi[offset+Screen4BytesPerLine+5] = ebx; \
                    227:        ebx = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    228:        esi[offset+6] = esi[offset+7] = esi[offset+Screen4BytesPerLine+6] \
                    229:           = esi[offset+Screen4BytesPerLine+7] = ebx; \
                    230: }
                    231: 
                    232: /* Plot Medium Resolution(640xH) 32-Bit pixels */
                    233: #define PLOT_MED_640_32BIT(offset) \
                    234: { \
                    235:        esi[offset+0] = STRGBPalette[ecx & 0x000000ff]; \
                    236:        esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    237:        esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    238:        esi[offset+3] = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    239: }
                    240: 
                    241: /* Plot Medium Resolution(640xH) 32-Bit pixels (Double on Y) */
                    242: #define PLOT_MED_640_32BIT_DOUBLE_Y(offset) \
                    243: { \
                    244:        esi[offset+0+Screen4BytesPerLine]   = \
                    245:        esi[offset+0] = STRGBPalette[ecx & 0x000000ff]; \
                    246:        esi[offset+1+Screen4BytesPerLine] = \
                    247:        esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    248:        esi[offset+2+Screen4BytesPerLine] = \
                    249:        esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    250:        esi[offset+3+Screen4BytesPerLine] = \
                    251:        esi[offset+3] = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    252: }
                    253: 
                    254: 
                    255: /* Plot Spectrum512 Resolution (320xH) 32-Bit pixels */
                    256: #define PLOT_SPEC512_LEFT_LOW_320_32BIT(offset)        \
                    257: { \
                    258:        esi[offset] = STRGBPalette[ecx & 0x000000ff]; \
                    259: }
                    260: 
                    261: /* Plot Spectrum512 Resolution (320xH) 32-Bit pixels */
1.1.1.6 ! root      262: #define PLOT_SPEC512_MID_320_32BIT PLOT_LOW_320_32BIT
1.1.1.3   root      263: 
                    264: /* Plot Spectrum512 Resolution(320xH) 32-Bit pixels */
                    265: #define PLOT_SPEC512_END_LOW_320_32BIT(offset) \
                    266: { \
                    267:        esi[offset]   = STRGBPalette[ecx & 0x000000ff]; \
                    268:        esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    269:        esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    270: }
                    271: 
                    272: 
                    273: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels */
                    274: #define PLOT_SPEC512_LEFT_LOW_640_32BIT(offset)        \
                    275: { \
                    276:        esi[offset] = esi[offset+1] = STRGBPalette[ecx & 0x000000ff]; \
                    277: }
                    278: 
                    279: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels */
                    280: #define PLOT_SPEC512_MID_640_32BIT PLOT_LOW_640_32BIT
                    281: 
                    282: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels */
                    283: #define PLOT_SPEC512_END_LOW_640_32BIT(offset) \
                    284: { \
                    285:        esi[offset+0] = esi[offset+1] = STRGBPalette[ecx & 0x000000ff]; \
                    286:        esi[offset+2] = esi[offset+3] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    287:        esi[offset+4] = esi[offset+5] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    288: }
                    289: 
                    290: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels (Double on Y) */
                    291: #define PLOT_SPEC512_LEFT_LOW_640_32BIT_DOUBLE_Y(offset)       \
                    292: { \
                    293:        esi[offset+Screen4BytesPerLine] = esi[offset+Screen4BytesPerLine+1] = \
                    294:        esi[offset] = esi[offset+1] = STRGBPalette[ecx & 0x000000ff]; \
                    295: }
                    296: 
1.1.1.6 ! root      297: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels (Double on Y) */
1.1.1.3   root      298: #define PLOT_SPEC512_MID_640_32BIT_DOUBLE_Y PLOT_LOW_640_32BIT_DOUBLE_Y
                    299: 
1.1.1.6 ! root      300: /* Plot Spectrum512 Resolution (640xH) 32-Bit pixels (Double on Y) */
1.1.1.3   root      301: #define PLOT_SPEC512_END_LOW_640_32BIT_DOUBLE_Y(offset)        \
                    302: { \
                    303:        ebx = STRGBPalette[ecx & 0x000000ff]; \
                    304:        esi[offset+Screen4BytesPerLine] = esi[offset+Screen4BytesPerLine+1] \
                    305:            = esi[offset] = esi[offset+1] = ebx; \
                    306:        ebx = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    307:        esi[offset+2+Screen4BytesPerLine] = esi[offset+3+Screen4BytesPerLine] \
                    308:            = esi[offset+2] = esi[offset+3] = ebx; \
                    309:        ebx = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    310:        esi[offset+4+Screen4BytesPerLine] = esi[offset+5+Screen4BytesPerLine] \
                    311:            = esi[offset+4] = esi[offset+5] = ebx; \
                    312: }
                    313: 
                    314: 
1.1.1.6 ! root      315: /* Plot Spectrum512 Medium Resolution (640xH) 32-Bit pixels */
        !           316: #define PLOT_SPEC512_LEFT_MED_640_32BIT        PLOT_SPEC512_LEFT_LOW_320_32BIT
        !           317: 
        !           318: #define PLOT_SPEC512_MID_MED_640_32BIT PLOT_SPEC512_MID_320_32BIT
        !           319: 
        !           320: #define PLOT_SPEC512_END_MED_640_32BIT PLOT_SPEC512_END_LOW_320_32BIT
        !           321: 
        !           322: 
        !           323: /* Plot Spectrum512 Medium Resolution (640xH) 32-Bit pixels (Double on Y) */
        !           324: #define PLOT_SPEC512_LEFT_MED_640_32BIT_DOUBLE_Y(offset) \
        !           325: { \
        !           326:        esi[offset+Screen4BytesPerLine] = esi[offset] = STRGBPalette[ecx & 0x000000ff]; \
        !           327: }
        !           328: 
        !           329: #define PLOT_SPEC512_MID_MED_640_32BIT_DOUBLE_Y(offset) \
        !           330: { \
        !           331:        esi[offset+0+Screen4BytesPerLine] = esi[offset+0] = STRGBPalette[ecx & 0x000000ff]; \
        !           332:        esi[offset+1+Screen4BytesPerLine] = esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
        !           333:        esi[offset+2+Screen4BytesPerLine] = esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
        !           334:        esi[offset+3+Screen4BytesPerLine] = esi[offset+3] = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
        !           335: }
        !           336: 
        !           337: #define PLOT_SPEC512_END_MED_640_32BIT_DOUBLE_Y(offset) \
        !           338: { \
        !           339:        esi[offset+0+Screen4BytesPerLine] = esi[offset+0] = STRGBPalette[ecx & 0x000000ff]; \
        !           340:        esi[offset+1+Screen4BytesPerLine] = esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
        !           341:        esi[offset+2+Screen4BytesPerLine] = esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
        !           342: }
        !           343: 
        !           344: 
        !           345: 
        !           346: /*
        !           347:  * 16 bit screen format
        !           348:  */
        !           349: 
1.1       root      350: /* Plot Low Resolution (320xH) 16-Bit pixels */
                    351: #define PLOT_LOW_320_16BIT(offset)  \
                    352: { \
                    353:  esi[offset]   = (Uint16)STRGBPalette[ecx & 0x00ff]; \
                    354:  esi[offset+1] = (Uint16)STRGBPalette[(ecx >> 8) & 0x00ff]; \
                    355:  esi[offset+2] = (Uint16)STRGBPalette[(ecx >> 16) & 0x00ff]; \
                    356:  esi[offset+3] = (Uint16)STRGBPalette[(ecx >> 24) & 0x00ff]; \
                    357: }
                    358: 
                    359: /* Plot Low Resolution (320xH) 8-Bit pixels */
                    360: #define PLOT_LOW_320_8BIT(offset) \
                    361: { \
                    362:   esi[offset] = SDL_SwapLE32(ecx + BASECOLOUR_LONG); \
                    363: }
                    364: 
                    365: /* Plot Low Resolution (640xH) 8-Bit pixels */
                    366: #define PLOT_LOW_640_8BIT(offset) \
                    367: { \
                    368:   ebpp = ecx + BASECOLOUR_LONG; \
                    369:   ecx = ((ebpp & 0x0000ff00) << 8) | (ebpp & 0x000000ff); \
                    370:   esi[offset]   = SDL_SwapLE32((ecx << 8) | ecx); \
                    371:   ecx = ((ebpp & 0x00ff0000) >> 8) | (ebpp & 0xff000000); \
                    372:   esi[offset+1] = SDL_SwapLE32((ecx >> 8) | ecx); \
                    373: }
                    374: 
                    375: /* Plot Low Resolution (640xH) 8-Bit pixels (double on Y) */
                    376: #define PLOT_LOW_640_8BIT_DOUBLE_Y(offset)     \
                    377: { \
                    378:   ebpp = ecx + BASECOLOUR_LONG; \
                    379:   ecx = ((ebpp & 0x0000ff00) << 8) | (ebpp & 0x000000ff); \
1.1.1.3   root      380:   esi[offset+Screen4BytesPerLine] = \
1.1       root      381:   esi[offset]   = SDL_SwapLE32((ecx << 8) | ecx); \
                    382:   ecx = ((ebpp & 0x00ff0000) >> 8) | (ebpp & 0xff000000); \
1.1.1.3   root      383:   esi[offset+1+Screen4BytesPerLine] = \
1.1       root      384:   esi[offset+1] = SDL_SwapLE32((ecx >> 8) | ecx); \
                    385: }
                    386: 
                    387: /* Plot Low Resolution (640xH) 16-Bit pixels */
                    388: #define PLOT_LOW_640_16BIT(offset) \
                    389: { \
                    390:  esi[offset]   = STRGBPalette[ecx & 0x000000ff]; \
                    391:  esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    392:  esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    393:  esi[offset+3] = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    394: } 
                    395: 
                    396: /* Plot Low Resolution (640xH) 16-Bit pixels (Double on Y) */
                    397: #define PLOT_LOW_640_16BIT_DOUBLE_Y(offset) \
                    398: { \
                    399:  ebx = STRGBPalette[ecx & 0x000000ff]; \
1.1.1.3   root      400:  esi[offset]   = esi[offset+Screen4BytesPerLine]   = ebx; \
1.1       root      401:  ebx = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
1.1.1.3   root      402:  esi[offset+1] = esi[offset+1+Screen4BytesPerLine] = ebx; \
1.1       root      403:  ebx = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
1.1.1.3   root      404:  esi[offset+2] = esi[offset+2+Screen4BytesPerLine] = ebx; \
1.1       root      405:  ebx = STRGBPalette[(ecx >> 24) & 0x000000ff]; \
1.1.1.3   root      406:  esi[offset+3] = esi[offset+3+Screen4BytesPerLine] = ebx; \
1.1       root      407: }
                    408: 
                    409: 
                    410: /* Plot Medium Resolution (640xH) 8-Bit pixels */
                    411: #define PLOT_MED_640_8BIT(offset) \
                    412: { \
                    413:   esi[offset] = SDL_SwapLE32(ecx + BASECOLOUR_LONG); \
                    414: }
                    415: 
                    416: /* Plot Medium Resolution (640xH) 8-Bit pixels (Double on Y) */
                    417: #define PLOT_MED_640_8BIT_DOUBLE_Y(offset) \
                    418: { \
1.1.1.3   root      419:   esi[offset] = esi[offset+Screen4BytesPerLine] =\
1.1       root      420:   SDL_SwapLE32(ecx + BASECOLOUR_LONG); \
                    421: }
                    422: 
                    423: /* Plot Medium Resolution(640xH) 16-Bit pixels */
                    424: #define PLOT_MED_640_16BIT(offset) \
                    425: { \
                    426:  esi[offset]   = (Uint16)STRGBPalette[ecx & 0x000000ff]; \
                    427:  esi[offset+1] = (Uint16)STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    428:  esi[offset+2] = (Uint16)STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    429:  esi[offset+3] = (Uint16)STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    430: }
                    431: 
                    432: /* Plot Medium Resolution(640xH) 16-Bit pixels (Double on Y) */
                    433: #define PLOT_MED_640_16BIT_DOUBLE_Y(offset) \
                    434: { \
1.1.1.3   root      435:  esi[offset+Screen2BytesPerLine]   =\
1.1       root      436:  esi[offset]   = (Uint16)STRGBPalette[ecx & 0x000000ff]; \
1.1.1.3   root      437:  esi[offset+1+Screen2BytesPerLine] =\
1.1       root      438:  esi[offset+1] = (Uint16)STRGBPalette[(ecx >> 8) & 0x000000ff]; \
1.1.1.3   root      439:  esi[offset+2+Screen2BytesPerLine] =\
1.1       root      440:  esi[offset+2] = (Uint16)STRGBPalette[(ecx >> 16) & 0x000000ff]; \
1.1.1.3   root      441:  esi[offset+3+Screen2BytesPerLine] =\
1.1       root      442:  esi[offset+3] = (Uint16)STRGBPalette[(ecx >> 24) & 0x000000ff]; \
                    443: }
                    444: 
                    445: 
                    446: /* Plot High Resolution (640xH) 8-Bit pixels */
                    447: #define PLOT_HIGH_640_8BIT(offset) \
                    448: { \
                    449:  esi[offset] = SDL_SwapLE32(Remap_1_Plane[eax]); \
                    450: }
                    451: 
                    452: 
                    453: /* Plot Spectrum512 Resolution(320xH) 16-Bit pixels */
                    454: #define PLOT_SPEC512_LEFT_LOW_320_16BIT(offset)        \
                    455: { \
                    456:  esi[offset] = (Uint16)STRGBPalette[ecx & 0x000000ff]; \
                    457: }
                    458: 
                    459: /* Plot Spectrum512 Resolution(320xH) 16-Bit pixels */
1.1.1.6 ! root      460: #define PLOT_SPEC512_MID_320_16BIT PLOT_LOW_640_16BIT
1.1       root      461: 
                    462: /* Plot Spectrum512 Resolution(320xH) 16-Bit pixels */
                    463: #define PLOT_SPEC512_END_LOW_320_16BIT(offset) \
                    464: { \
                    465:  esi[offset]   = (Uint16)STRGBPalette[ecx & 0x000000ff]; \
                    466:  esi[offset+1] = (Uint16)STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    467:  esi[offset+2] = (Uint16)STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    468: }
                    469: 
                    470: 
                    471: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels */
                    472: #define PLOT_SPEC512_LEFT_LOW_640_16BIT(offset)        \
                    473: { \
                    474:   esi[offset] = STRGBPalette[ecx & 0x000000ff]; \
                    475: }
                    476: 
                    477: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels */
                    478: #define PLOT_SPEC512_MID_640_16BIT PLOT_LOW_640_16BIT
                    479: 
                    480: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels */
                    481: #define PLOT_SPEC512_END_LOW_640_16BIT(offset) \
                    482: { \
                    483:   esi[offset]   = STRGBPalette[ecx & 0x000000ff]; \
                    484:   esi[offset+1] = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
                    485:   esi[offset+2] = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
                    486: }
                    487: 
                    488: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels (Double on Y) */
                    489: #define PLOT_SPEC512_LEFT_LOW_640_16BIT_DOUBLE_Y(offset)       \
                    490: { \
1.1.1.3   root      491:   esi[offset+Screen4BytesPerLine] = \
1.1       root      492:   esi[offset] = STRGBPalette[ecx & 0x000000ff]; \
                    493: }
                    494: 
                    495: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels (Double on Y) */
                    496: #define PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y PLOT_LOW_640_16BIT_DOUBLE_Y
                    497: 
                    498: /* Plot Spectrum512 Resolution (640xH) 16-Bit pixels (Double on Y) */
                    499: #define PLOT_SPEC512_END_LOW_640_16BIT_DOUBLE_Y(offset)        \
                    500: { \
                    501:   ebx = STRGBPalette[ecx & 0x000000ff]; \
1.1.1.3   root      502:   esi[offset]   = esi[offset+Screen4BytesPerLine]   = ebx; \
1.1       root      503:   ebx = STRGBPalette[(ecx >> 8) & 0x000000ff]; \
1.1.1.3   root      504:   esi[offset+1] = esi[offset+1+Screen4BytesPerLine] = ebx; \
1.1       root      505:   ebx = STRGBPalette[(ecx >> 16) & 0x000000ff]; \
1.1.1.3   root      506:   esi[offset+2] = esi[offset+2+Screen4BytesPerLine] = ebx; \
1.1       root      507: }
                    508: 
1.1.1.6 ! root      509: 
        !           510: /* Plot Spectrum512 Medium Resolution (640xH) 16-Bit pixels */
        !           511: #define PLOT_SPEC512_LEFT_MED_640_16BIT        PLOT_SPEC512_LEFT_LOW_320_16BIT
        !           512: 
        !           513: #define PLOT_SPEC512_MID_MED_640_16BIT PLOT_SPEC512_MID_320_16BIT
        !           514: 
        !           515: #define PLOT_SPEC512_END_MED_640_16BIT PLOT_SPEC512_END_LOW_320_16BIT
        !           516: 
        !           517: 
        !           518: /* Plot Spectrum512 Medium Resolution (640xH) 16-Bit pixels (Double on Y) */
        !           519: #define PLOT_SPEC512_LEFT_MED_640_16BIT_DOUBLE_Y PLOT_SPEC512_LEFT_MED_640_32BIT_DOUBLE_Y
        !           520: 
        !           521: #define PLOT_SPEC512_MID_MED_640_16BIT_DOUBLE_Y PLOT_SPEC512_MID_MED_640_32BIT_DOUBLE_Y
        !           522: 
        !           523: #define PLOT_SPEC512_END_MED_640_16BIT_DOUBLE_Y PLOT_SPEC512_END_MED_640_32BIT_DOUBLE_Y
        !           524: 
        !           525: 
        !           526: 
1.1.1.4   root      527: /* Get Spec512 pixels which are offset by 1 pixel */
                    528: #if defined(__i386__)    // Unaligned direct access is only supported on i86 platforms
                    529: 
1.1.1.5   root      530: /* on AMD XP, first one is 1/3 faster than aligned access, and
                    531:  * final pixels access ~15% faster than aligned operation below
                    532:  */
1.1.1.4   root      533: # define GET_SPEC512_OFFSET_PIXELS(pixels, x)  \
                    534:             (*(Uint32 *)(((Uint8 *)pixels) + x))
                    535: # define GET_SPEC512_OFFSET_FINAL_PIXELS(pixels) \
                    536:             (*(Uint32 *)(((Uint8 *)pixels) + 13))
                    537: 
                    538: #else
                    539: 
                    540: # define GET_SPEC512_OFFSET_PIXELS(pixels, x)  \
                    541:             (((*(Uint32 *)(((Uint8 *)pixels) + x-1)) >> 8) \
                    542:             | ((*(Uint32 *)(((Uint8 *)pixels) + x+3)) << 24))
                    543: # define GET_SPEC512_OFFSET_FINAL_PIXELS(pixels)  \
                    544:             ((*(Uint32 *)(((Uint8 *)pixels) + 12)) >> 8)
                    545: 
                    546: #endif /* __i386__ */
                    547: 
                    548: 
1.1       root      549: #endif /* HATARI_CONVERTMACROS_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.