--- hatari/src/convert/spec640x16.c 2019/04/01 07:13:54 1.1.1.5 +++ hatari/src/convert/spec640x16.c 2019/04/09 08:48:56 1.1.1.8 @@ -13,9 +13,14 @@ static void ConvertSpec512_640x16Bit(voi Uint32 *edi, *ebp; Uint32 *esi; Uint32 eax, ebx, ecx, edx; - Uint32 pixelspace[4]; /* Workspace to store pixels to so can print in right order for Spec512 */ + Uint32 pixelspace[5]; /* Workspace to store pixels to so can print in right order for Spec512 */ int y, x, Screen4BytesPerLine; + /* on x86, unaligned access macro touches also + * next byte, zero it for code checkers + */ + pixelspace[4] = 0; + Spec512_StartFrame(); /* Start frame, track palettes */ Screen4BytesPerLine = PCScreenBytesPerLine / 4; edx = 0; /* Clear index for loop */ @@ -40,7 +45,6 @@ static void ConvertSpec512_640x16Bit(voi ecx = *(edi+1); #if SDL_BYTEORDER == SDL_LIL_ENDIAN - /* Convert planes to byte indices - as works in wrong order store to workspace so can read back in order! */ LOW_BUILD_PIXELS_0 ; /* Generate 'ecx' as pixels [4,5,6,7] */ pixelspace[1] = ecx; @@ -50,55 +54,7 @@ static void ConvertSpec512_640x16Bit(voi pixelspace[0] = ecx; LOW_BUILD_PIXELS_3 ; /* Generate 'ecx' as pixels [8,9,10,11] */ pixelspace[2] = ecx; - - /* And plot, the Spec512 is offset by 1 pixel and works on 'chunks' of 4 pixels */ - /* So, we plot 1_4_4_3 to give 16 pixels, changing palette between */ - /* (last one is used for first of next 16-pixels) */ - if (!bScrDoubleY) /* Double on Y? */ - { - ecx = pixelspace[0]; - PLOT_SPEC512_LEFT_LOW_640_16BIT(0) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 1); - PLOT_SPEC512_MID_640_16BIT(1) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 5); - PLOT_SPEC512_MID_640_16BIT(5) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 9); - PLOT_SPEC512_MID_640_16BIT(9) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 13); - PLOT_SPEC512_END_LOW_640_16BIT(13) ; - } - else - { - ecx = pixelspace[0]; - PLOT_SPEC512_LEFT_LOW_640_16BIT_DOUBLE_Y(0) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 1); - PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(1) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 5); - PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(5) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 9); - PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(9) ; - Spec512_UpdatePaletteSpan(); - - ecx = *(Uint32 *)(((Uint8 *)pixelspace) + 13); - PLOT_SPEC512_END_LOW_640_16BIT_DOUBLE_Y(13) ; - } - #else - LOW_BUILD_PIXELS_0 ; pixelspace[3] = ecx; LOW_BUILD_PIXELS_1 ; @@ -107,26 +63,29 @@ static void ConvertSpec512_640x16Bit(voi pixelspace[2] = ecx; LOW_BUILD_PIXELS_3 ; pixelspace[0] = ecx; - +#endif + /* And plot, the Spec512 is offset by 1 pixel and works on 'chunks' of 4 pixels */ + /* So, we plot 1_4_4_3 to give 16 pixels, changing palette between */ + /* (last one is used for first of next 16-pixels) */ if (!bScrDoubleY) /* Double on Y? */ { ecx = pixelspace[0]; PLOT_SPEC512_LEFT_LOW_640_16BIT(0); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[0] >> 8) | (((Uint8)pixelspace[1])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 1); PLOT_SPEC512_MID_640_16BIT(1); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[1] >> 8) | (((Uint8)pixelspace[2])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 5); PLOT_SPEC512_MID_640_16BIT(5); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[2] >> 8) | (((Uint8)pixelspace[3])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 9); PLOT_SPEC512_MID_640_16BIT(9); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[3] >> 8); + ecx = GET_SPEC512_OFFSET_FINAL_PIXELS(pixelspace); PLOT_SPEC512_END_LOW_640_16BIT(13); } else @@ -135,24 +94,22 @@ static void ConvertSpec512_640x16Bit(voi PLOT_SPEC512_LEFT_LOW_640_16BIT_DOUBLE_Y(0); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[0] >> 8) | (((Uint8)pixelspace[1])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 1); PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(1); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[1] >> 8) | (((Uint8)pixelspace[2])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 5); PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(5); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[2] >> 8) | (((Uint8)pixelspace[3])<<24); + ecx = GET_SPEC512_OFFSET_PIXELS(pixelspace, 9); PLOT_SPEC512_MID_640_16BIT_DOUBLE_Y(9); Spec512_UpdatePaletteSpan(); - ecx = (pixelspace[3] >> 8); + ecx = GET_SPEC512_OFFSET_FINAL_PIXELS(pixelspace); PLOT_SPEC512_END_LOW_640_16BIT_DOUBLE_Y(13); } -#endif - esi += 16; /* Next PC pixels */ edi += 2; /* Next ST pixels */ ebp += 2; /* Next ST copy pixels */ @@ -165,5 +122,5 @@ static void ConvertSpec512_640x16Bit(voi pPCScreenDest = (((Uint8 *)pPCScreenDest)+2*PCScreenBytesPerLine); } - bScreenContentsChanged = TRUE; + bScreenContentsChanged = true; }