diff --git a/VSLinux/Amiberry.vcxproj b/VSLinux/Amiberry.vcxproj index 19dfe62d..22f691b0 100644 --- a/VSLinux/Amiberry.vcxproj +++ b/VSLinux/Amiberry.vcxproj @@ -54,6 +54,7 @@ cd ~/projects/Amiberry; make cd ~/projects/Amiberry; make clean; make cd ~/projects/Amiberry; make clean + D:\midwa\Projects\GitHub\amiberry\src\guisan\include;D:\midwa\Projects\GitHub\amiberry\src\threaddep;D:\midwa\Projects\GitHub\amiberry\src\osdep;D:\midwa\Projects\GitHub\amiberry\src;D:\midwa\Projects\GitHub\amiberry\src\include;$(NMakeIncludeSearchPath) @@ -286,9 +287,6 @@ false - - false - false diff --git a/VSLinux/Amiberry.vcxproj.filters b/VSLinux/Amiberry.vcxproj.filters index 52f036d1..3987df5e 100644 --- a/VSLinux/Amiberry.vcxproj.filters +++ b/VSLinux/Amiberry.vcxproj.filters @@ -258,9 +258,6 @@ src - - src - src diff --git a/src/drawing.cpp b/src/drawing.cpp index 5c1013d8..d7953e52 100644 --- a/src/drawing.cpp +++ b/src/drawing.cpp @@ -280,7 +280,7 @@ static int src_pixel, ham_src_pixel; /* How many pixels in window coordinates which are to the left of the left border. */ static int unpainted; -#include "linetoscr.c" +#include "linetoscr.cpp" static void pfield_do_linetoscr_0_640(int start, int stop) { diff --git a/src/linetoscr.c b/src/linetoscr.cpp similarity index 97% rename from src/linetoscr.c rename to src/linetoscr.cpp index 2f6fc272..973e6aa2 100644 --- a/src/linetoscr.c +++ b/src/linetoscr.cpp @@ -1,806 +1,806 @@ -/* Note: - * xcolors[] contains 16-bit color information in both words - * colors_for_drawing.acolors (non AGA) contains 16-bit color information in both words - * colors_for_drawing.acolors (AGA) contains 16-bit color information in one word - */ - -STATIC_INLINE uae_u32 merge_words(uae_u32 val, uae_u32 val2) -{ - __asm__ ( - "pkhbt %[o], %[o], %[d], lsl #16 \n\t" - : [o] "+r" (val) : [d] "r" (val2) ); - return val; -} - -STATIC_INLINE uae_u32 double_word(uae_u32 val) -{ - __asm__ ( - "pkhbt %[o], %[o], %[o], lsl #16 \n\t" - : [o] "+r" (val) ); - return val; -} - -static int NOINLINE linetoscr_16 (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - - if (bplham) { - int rem; - if (((long)&buf[dpix]) & 2) { - buf[dpix++] = ham_linebuf[spix++]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 out_val; - - out_val = *((uae_u32 *)&ham_linebuf[spix]); - spix += 2; - *((uae_u32 *)&buf[dpix]) = out_val; - dpix += 2; - } - if (rem) { - buf[dpix++] = ham_linebuf[spix++]; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++]; - buf[dpix++] = colors_for_drawing.acolors[lookup[spix_val]]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++]; - out_val = colors_for_drawing.acolors[lookup[spix_val]]; - spix_val = pixdata.apixels[spix++]; - dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++]; - buf[dpix++] = colors_for_drawing.acolors[lookup[spix_val]]; - } - } else if (bplehb) { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix++]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++]; - if (spix_val <= 31) - out_val = colors_for_drawing.acolors[spix_val]; - else - out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - spix_val = pixdata.apixels[spix++]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix++]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - buf[dpix++] = dpix_val; - } - } else { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++]; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++]; - out_val = colors_for_drawing.acolors[spix_val]; - spix_val = pixdata.apixels[spix++]; - dpix_val = colors_for_drawing.acolors[spix_val]; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++]; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - } - - return spix; -} - -static int NOINLINE linetoscr_16_stretch1 (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - - if (bplham) { - while (dpix < dpix_end) { - uae_u32 out_val = ham_linebuf[spix++]; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; - while (dpix < dpix_end) { - uae_u32 spix_val; - - spix_val = pixdata.apixels[spix++]; - *((uae_u32 *)&buf[dpix]) = colors_for_drawing.acolors[lookup[spix_val]]; - dpix += 2; - } - } else if (bplehb) { - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++]; - if (spix_val <= 31) - out_val = colors_for_drawing.acolors[spix_val]; - else - out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x0777]; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } else { - while (dpix < dpix_end) { - uae_u32 spix_val; - - spix_val = pixdata.apixels[spix++]; - *((uae_u32 *)&buf[dpix]) = colors_for_drawing.acolors[spix_val]; - dpix += 2; - } - } - - return spix; -} - -static int NOINLINE linetoscr_16_shrink1 (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - - if (bplham) { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 dpix_val; - dpix_val = ham_linebuf[spix]; - spix += 2; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 dpix_val; - uae_u32 out_val; - - out_val = ham_linebuf[spix]; - spix += 2; - dpix_val = ham_linebuf[spix]; - spix += 2; - out_val = merge_words(out_val, dpix_val); - - *((uae_u32 *)&buf[dpix]) = out_val; - dpix += 2; - } - if (rem) { - uae_u32 dpix_val; - dpix_val = ham_linebuf[spix]; - spix += 2; - buf[dpix++] = dpix_val; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix]; - dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; - spix += 2; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix]; - out_val = colors_for_drawing.acolors[lookup[spix_val]]; - spix += 2; - spix_val = pixdata.apixels[spix]; - dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix]; - dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; - spix += 2; - buf[dpix++] = dpix_val; - } - } else if (bplehb) { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - spix += 2; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix]; - if (spix_val <= 31) - out_val = colors_for_drawing.acolors[spix_val]; - else - out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - spix += 2; - spix_val = pixdata.apixels[spix]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix]; - if (spix_val <= 31) - dpix_val = colors_for_drawing.acolors[spix_val]; - else - dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; - spix += 2; - buf[dpix++] = dpix_val; - } - } else { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix]; - spix += 2; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix]; - out_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - spix_val = pixdata.apixels[spix]; - dpix_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix]; - spix += 2; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - } - - return spix; -} - -#ifdef AGA - -static int NOINLINE linetoscr_16_aga (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - uae_u8 xor_val = bplxor; - - if (bplham) { - int rem; - if (((long)&buf[dpix]) & 2) { - buf[dpix++] = ham_linebuf[spix]; - spix++; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 out_val; - - out_val = *((uae_u32 *)&ham_linebuf[spix]); - spix += 2; - *((uae_u32 *)&buf[dpix]) = out_val; - dpix += 2; - } - if (rem) { - buf[dpix++] = ham_linebuf[spix]; - spix++; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; - int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix++; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - if (spritepixels[spix]) { - out_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - out_val = colors_for_drawing.acolors[val]; - } - spix++; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix++; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix++; - buf[dpix++] = dpix_val; - } - } else if (bplehb) { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix++] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - out_val = CONVERT_RGB (c); - } else - out_val = colors_for_drawing.acolors[spix_val]; - spix_val = pixdata.apixels[spix++] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix++] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - buf[dpix++] = dpix_val; - } - } else { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++] ^ xor_val; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++] ^ xor_val; - out_val = colors_for_drawing.acolors[spix_val]; - spix_val = pixdata.apixels[spix++] ^ xor_val; - dpix_val = colors_for_drawing.acolors[spix_val]; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix++] ^ xor_val; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - } - - return spix; -} -#endif - -#ifdef AGA -static int NOINLINE linetoscr_16_stretch1_aga (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - uae_u8 xor_val = bplxor; - - if (bplham) { - while (dpix < dpix_end) { - uae_u32 out_val; - out_val = ham_linebuf[spix++]; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; - int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 out_val; - - if (spritepixels[spix]) { - out_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - out_val = colors_for_drawing.acolors[val]; - } - spix++; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } else if (bplehb) { - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - out_val = CONVERT_RGB (c); - } else - out_val = colors_for_drawing.acolors[spix_val]; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } else { - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix++] ^ xor_val; - out_val = colors_for_drawing.acolors[spix_val]; - *((uae_u32 *)&buf[dpix]) = double_word(out_val); - dpix += 2; - } - } - - return spix; -} -#endif - -#ifdef AGA -static int NOINLINE linetoscr_16_shrink1_aga (int spix, int dpix, int dpix_end) -{ - uae_u16 *buf = (uae_u16 *) xlinebuffer; - uae_u8 xor_val = bplxor; - - if (bplham) { - int rem; - if (((long)&buf[dpix]) & 2) { - buf[dpix++] = ham_linebuf[spix]; - spix += 2; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 dpix_val; - uae_u32 out_val; - - out_val = ham_linebuf[spix]; - spix += 2; - dpix_val = ham_linebuf[spix]; - spix += 2; - out_val = merge_words(out_val, dpix_val); - *((uae_u32 *)&buf[dpix]) = out_val; - dpix += 2; - } - if (rem) { - buf[dpix++] = ham_linebuf[spix]; - spix += 2; - } - } else if (bpldualpf) { - int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; - int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix += 2; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - if (spritepixels[spix]) { - out_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - out_val = colors_for_drawing.acolors[val]; - } - spix += 2; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - if (spritepixels[spix]) { - dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; - } else { - spix_val = pixdata.apixels[spix]; - uae_u8 val = lookup[spix_val]; - if (lookup_no[spix_val] == 2) - val += dblpfofs[bpldualpf2of]; - val ^= xor_val; - dpix_val = colors_for_drawing.acolors[val]; - } - spix += 2; - buf[dpix++] = dpix_val; - } - } else if (bplehb) { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - buf[dpix++] = dpix_val; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - out_val = CONVERT_RGB (c); - } else - out_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - spix_val = pixdata.apixels[spix] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - uae_u32 dpix_val; - spix_val = pixdata.apixels[spix] ^ xor_val; - if (spix_val >= 32 && spix_val < 64) { - unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; - dpix_val = CONVERT_RGB (c); - } else - dpix_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - buf[dpix++] = dpix_val; - } - } else { - int rem; - if (((long)&buf[dpix]) & 2) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix] ^ xor_val; - spix += 2; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - if (dpix >= dpix_end) - return spix; - rem = (((long)&buf[dpix_end]) & 2); - if (rem) - dpix_end--; - while (dpix < dpix_end) { - uae_u32 spix_val; - uae_u32 dpix_val; - uae_u32 out_val; - - spix_val = pixdata.apixels[spix] ^ xor_val; - out_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - spix_val = pixdata.apixels[spix] ^ xor_val; - dpix_val = colors_for_drawing.acolors[spix_val]; - spix += 2; - *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); - dpix += 2; - } - if (rem) { - uae_u32 spix_val; - spix_val = pixdata.apixels[spix] ^ xor_val; - spix += 2; - buf[dpix++] = colors_for_drawing.acolors[spix_val]; - } - } - - return spix; -} -#endif +/* Note: + * xcolors[] contains 16-bit color information in both words + * colors_for_drawing.acolors (non AGA) contains 16-bit color information in both words + * colors_for_drawing.acolors (AGA) contains 16-bit color information in one word + */ + +STATIC_INLINE uae_u32 merge_words(uae_u32 val, uae_u32 val2) +{ + __asm__ ( + "pkhbt %[o], %[o], %[d], lsl #16 \n\t" + : [o] "+r" (val) : [d] "r" (val2) ); + return val; +} + +STATIC_INLINE uae_u32 double_word(uae_u32 val) +{ + __asm__ ( + "pkhbt %[o], %[o], %[o], lsl #16 \n\t" + : [o] "+r" (val) ); + return val; +} + +static int NOINLINE linetoscr_16 (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + + if (bplham) { + int rem; + if (((long)&buf[dpix]) & 2) { + buf[dpix++] = ham_linebuf[spix++]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 out_val; + + out_val = *((uae_u32 *)&ham_linebuf[spix]); + spix += 2; + *((uae_u32 *)&buf[dpix]) = out_val; + dpix += 2; + } + if (rem) { + buf[dpix++] = ham_linebuf[spix++]; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++]; + buf[dpix++] = colors_for_drawing.acolors[lookup[spix_val]]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++]; + out_val = colors_for_drawing.acolors[lookup[spix_val]]; + spix_val = pixdata.apixels[spix++]; + dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++]; + buf[dpix++] = colors_for_drawing.acolors[lookup[spix_val]]; + } + } else if (bplehb) { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix++]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++]; + if (spix_val <= 31) + out_val = colors_for_drawing.acolors[spix_val]; + else + out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + spix_val = pixdata.apixels[spix++]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix++]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + buf[dpix++] = dpix_val; + } + } else { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++]; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++]; + out_val = colors_for_drawing.acolors[spix_val]; + spix_val = pixdata.apixels[spix++]; + dpix_val = colors_for_drawing.acolors[spix_val]; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++]; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + } + + return spix; +} + +static int NOINLINE linetoscr_16_stretch1 (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + + if (bplham) { + while (dpix < dpix_end) { + uae_u32 out_val = ham_linebuf[spix++]; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; + while (dpix < dpix_end) { + uae_u32 spix_val; + + spix_val = pixdata.apixels[spix++]; + *((uae_u32 *)&buf[dpix]) = colors_for_drawing.acolors[lookup[spix_val]]; + dpix += 2; + } + } else if (bplehb) { + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++]; + if (spix_val <= 31) + out_val = colors_for_drawing.acolors[spix_val]; + else + out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x0777]; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } else { + while (dpix < dpix_end) { + uae_u32 spix_val; + + spix_val = pixdata.apixels[spix++]; + *((uae_u32 *)&buf[dpix]) = colors_for_drawing.acolors[spix_val]; + dpix += 2; + } + } + + return spix; +} + +static int NOINLINE linetoscr_16_shrink1 (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + + if (bplham) { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 dpix_val; + dpix_val = ham_linebuf[spix]; + spix += 2; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 dpix_val; + uae_u32 out_val; + + out_val = ham_linebuf[spix]; + spix += 2; + dpix_val = ham_linebuf[spix]; + spix += 2; + out_val = merge_words(out_val, dpix_val); + + *((uae_u32 *)&buf[dpix]) = out_val; + dpix += 2; + } + if (rem) { + uae_u32 dpix_val; + dpix_val = ham_linebuf[spix]; + spix += 2; + buf[dpix++] = dpix_val; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix]; + dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; + spix += 2; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix]; + out_val = colors_for_drawing.acolors[lookup[spix_val]]; + spix += 2; + spix_val = pixdata.apixels[spix]; + dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix]; + dpix_val = colors_for_drawing.acolors[lookup[spix_val]]; + spix += 2; + buf[dpix++] = dpix_val; + } + } else if (bplehb) { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + spix += 2; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix]; + if (spix_val <= 31) + out_val = colors_for_drawing.acolors[spix_val]; + else + out_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + spix += 2; + spix_val = pixdata.apixels[spix]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix]; + if (spix_val <= 31) + dpix_val = colors_for_drawing.acolors[spix_val]; + else + dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777]; + spix += 2; + buf[dpix++] = dpix_val; + } + } else { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix]; + spix += 2; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix]; + out_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + spix_val = pixdata.apixels[spix]; + dpix_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix]; + spix += 2; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + } + + return spix; +} + +#ifdef AGA + +static int NOINLINE linetoscr_16_aga (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + uae_u8 xor_val = bplxor; + + if (bplham) { + int rem; + if (((long)&buf[dpix]) & 2) { + buf[dpix++] = ham_linebuf[spix]; + spix++; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 out_val; + + out_val = *((uae_u32 *)&ham_linebuf[spix]); + spix += 2; + *((uae_u32 *)&buf[dpix]) = out_val; + dpix += 2; + } + if (rem) { + buf[dpix++] = ham_linebuf[spix]; + spix++; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; + int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix++; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + if (spritepixels[spix]) { + out_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + out_val = colors_for_drawing.acolors[val]; + } + spix++; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix++; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix++; + buf[dpix++] = dpix_val; + } + } else if (bplehb) { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix++] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + out_val = CONVERT_RGB (c); + } else + out_val = colors_for_drawing.acolors[spix_val]; + spix_val = pixdata.apixels[spix++] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix++] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + buf[dpix++] = dpix_val; + } + } else { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++] ^ xor_val; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++] ^ xor_val; + out_val = colors_for_drawing.acolors[spix_val]; + spix_val = pixdata.apixels[spix++] ^ xor_val; + dpix_val = colors_for_drawing.acolors[spix_val]; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix++] ^ xor_val; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + } + + return spix; +} +#endif + +#ifdef AGA +static int NOINLINE linetoscr_16_stretch1_aga (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + uae_u8 xor_val = bplxor; + + if (bplham) { + while (dpix < dpix_end) { + uae_u32 out_val; + out_val = ham_linebuf[spix++]; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; + int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 out_val; + + if (spritepixels[spix]) { + out_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + out_val = colors_for_drawing.acolors[val]; + } + spix++; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } else if (bplehb) { + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + out_val = CONVERT_RGB (c); + } else + out_val = colors_for_drawing.acolors[spix_val]; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } else { + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix++] ^ xor_val; + out_val = colors_for_drawing.acolors[spix_val]; + *((uae_u32 *)&buf[dpix]) = double_word(out_val); + dpix += 2; + } + } + + return spix; +} +#endif + +#ifdef AGA +static int NOINLINE linetoscr_16_shrink1_aga (int spix, int dpix, int dpix_end) +{ + uae_u16 *buf = (uae_u16 *) xlinebuffer; + uae_u8 xor_val = bplxor; + + if (bplham) { + int rem; + if (((long)&buf[dpix]) & 2) { + buf[dpix++] = ham_linebuf[spix]; + spix += 2; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 dpix_val; + uae_u32 out_val; + + out_val = ham_linebuf[spix]; + spix += 2; + dpix_val = ham_linebuf[spix]; + spix += 2; + out_val = merge_words(out_val, dpix_val); + *((uae_u32 *)&buf[dpix]) = out_val; + dpix += 2; + } + if (rem) { + buf[dpix++] = ham_linebuf[spix]; + spix += 2; + } + } else if (bpldualpf) { + int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; + int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix += 2; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + if (spritepixels[spix]) { + out_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + out_val = colors_for_drawing.acolors[val]; + } + spix += 2; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + if (spritepixels[spix]) { + dpix_val = colors_for_drawing.acolors[spritepixels[spix]]; + } else { + spix_val = pixdata.apixels[spix]; + uae_u8 val = lookup[spix_val]; + if (lookup_no[spix_val] == 2) + val += dblpfofs[bpldualpf2of]; + val ^= xor_val; + dpix_val = colors_for_drawing.acolors[val]; + } + spix += 2; + buf[dpix++] = dpix_val; + } + } else if (bplehb) { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + buf[dpix++] = dpix_val; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + out_val = CONVERT_RGB (c); + } else + out_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + spix_val = pixdata.apixels[spix] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + uae_u32 dpix_val; + spix_val = pixdata.apixels[spix] ^ xor_val; + if (spix_val >= 32 && spix_val < 64) { + unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F; + dpix_val = CONVERT_RGB (c); + } else + dpix_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + buf[dpix++] = dpix_val; + } + } else { + int rem; + if (((long)&buf[dpix]) & 2) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix] ^ xor_val; + spix += 2; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + if (dpix >= dpix_end) + return spix; + rem = (((long)&buf[dpix_end]) & 2); + if (rem) + dpix_end--; + while (dpix < dpix_end) { + uae_u32 spix_val; + uae_u32 dpix_val; + uae_u32 out_val; + + spix_val = pixdata.apixels[spix] ^ xor_val; + out_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + spix_val = pixdata.apixels[spix] ^ xor_val; + dpix_val = colors_for_drawing.acolors[spix_val]; + spix += 2; + *((uae_u32 *)&buf[dpix]) = merge_words(out_val, dpix_val); + dpix += 2; + } + if (rem) { + uae_u32 spix_val; + spix_val = pixdata.apixels[spix] ^ xor_val; + spix += 2; + buf[dpix++] = colors_for_drawing.acolors[spix_val]; + } + } + + return spix; +} +#endif diff --git a/src/newcpu.cpp b/src/newcpu.cpp index 10a565a8..f2838c79 100644 --- a/src/newcpu.cpp +++ b/src/newcpu.cpp @@ -50,6 +50,7 @@ #include "cia.h" #include "inputdevice.h" #include "audio.h" +#include #ifdef JIT #include "jit/compemu.h" #include @@ -1345,6 +1346,10 @@ static void exception2_handle (uaecptr addr, uaecptr fault) void m68k_go (int may_quit) { +#ifdef DEBUG + ProfilerStart("amiberry-sdl2.prof"); +#endif + int hardboot = 1; int startup = 1; @@ -1457,6 +1462,9 @@ void m68k_go (int may_quit) } protect_roms (false); in_m68k_go--; +#ifdef DEBUG + ProfilerStop(); +#endif } #ifdef SAVESTATE diff --git a/src/trace.c b/src/trace.c deleted file mode 100644 index b826f061..00000000 --- a/src/trace.c +++ /dev/null @@ -1,87 +0,0 @@ -#define _GNU_SOURCE - -#include -#include -#include -#include - - -#define MAX_TRACE 2000 - -static void* trc_func[MAX_TRACE]; -static void* trc_caller[MAX_TRACE]; -static int trc_enter[MAX_TRACE]; -static int trc_number[MAX_TRACE]; -static int trc_next_write = 0; -static int trc_counter = 0; - -static int do_trace = 0; - -static FILE *fd; - - -void trace_begin (void) -{ - if(do_trace) - return; - memset(trc_enter, 0, sizeof(int) * MAX_TRACE); - do_trace = 1; -} - -void trace_end (void) -{ - if(do_trace) - { - do_trace = 0; - - fd = fopen("trace.txt", "w"); - for(int i=0; i 0) - { - Dl_info dlinfo; - memset(&dlinfo, 0, sizeof(dlinfo)); - int func_found = dladdr(trc_func[trc_next_write], &dlinfo); - if(func_found && dlinfo.dli_sname != NULL) - { - fprintf(fd, "%8d - %s 0x%08X from 0x%08X (%s)\n", trc_number[trc_next_write], (trc_enter[trc_next_write] == 1 ? "enter" : "leave"), - trc_func[trc_next_write], trc_caller[trc_next_write], dlinfo.dli_sname); - } - } - ++trc_next_write; - if(trc_next_write >= MAX_TRACE) - trc_next_write = 0; - } - fclose(fd); - } -} - -void __cyg_profile_func_enter (void *func, void *caller) -{ - if(do_trace) - { - trc_enter[trc_next_write] = 1; - trc_func[trc_next_write] = func; - trc_caller[trc_next_write] = caller; - trc_number[trc_next_write] = trc_counter; - ++trc_counter; - ++trc_next_write; - if(trc_next_write >= MAX_TRACE) - trc_next_write = 0; - } -} - -void __cyg_profile_func_exit (void *func, void *caller) -{ - if(do_trace) - { - trc_enter[trc_next_write] = 2; - trc_func[trc_next_write] = func; - trc_caller[trc_next_write] = caller; - trc_number[trc_next_write] = trc_counter; - ++trc_counter; - ++trc_next_write; - if(trc_next_write >= MAX_TRACE) - trc_next_write = 0; - } -}