diff options
Diffstat (limited to 'apps/plugins/lib/gray_draw.c')
-rw-r--r-- | apps/plugins/lib/gray_draw.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/apps/plugins/lib/gray_draw.c b/apps/plugins/lib/gray_draw.c index ab1b286137..4b2237197c 100644 --- a/apps/plugins/lib/gray_draw.c +++ b/apps/plugins/lib/gray_draw.c | |||
@@ -754,13 +754,13 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
754 | _src = src; | 754 | _src = src; |
755 | 755 | ||
756 | /* precalculate the bit patterns with random shifts | 756 | /* precalculate the bit patterns with random shifts |
757 | for all 4 pixels and put them on an extra "stack" */ | 757 | for all 8 pixels and put them on an extra "stack" */ |
758 | asm volatile ( | 758 | asm volatile ( |
759 | "moveq.l #4,%%d3 \n" /* loop count in d3: 4 pixels */ | 759 | "moveq.l #8,%%d3 \n" /* loop count in d3: 4 pixels */ |
760 | 760 | ||
761 | ".wa_loop: \n" /** load pattern for pixel **/ | 761 | ".wa_loop: \n" /** load pattern for pixel **/ |
762 | "clr.l %%d2 \n" /* pattern for skipped pixel must be 0 */ | 762 | "clr.l %%d2 \n" /* pattern for skipped pixel must be 0 */ |
763 | "lsr.l #2,%[mask] \n" /* shift out 2 lsbs of mask */ | 763 | "lsr.l #1,%[mask] \n" /* shift out 2 lsbs of mask */ |
764 | "bcc.b .wa_skip \n" /* skip this pixel */ | 764 | "bcc.b .wa_skip \n" /* skip this pixel */ |
765 | 765 | ||
766 | "clr.l %%d0 \n" | 766 | "clr.l %%d0 \n" |
@@ -816,10 +816,10 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
816 | end = addr + MULU16(_gray_info.depth, _gray_info.plane_size); | 816 | end = addr + MULU16(_gray_info.depth, _gray_info.plane_size); |
817 | _mask = mask; | 817 | _mask = mask; |
818 | 818 | ||
819 | /* set the bits for all 4 pixels in all bytes according to the | 819 | /* set the bits for all 8 pixels in all bytes according to the |
820 | * precalculated patterns on the pattern stack */ | 820 | * precalculated patterns on the pattern stack */ |
821 | asm volatile ( | 821 | asm volatile ( |
822 | "movem.l (%[patp]),%%d2-%%d5 \n" /* pop all 4 patterns */ | 822 | "movem.l (%[patp]),%%d2-%%d6/%%a0-%%a2 \n" /* pop all 8 patterns */ |
823 | 823 | ||
824 | "not.l %[mask] \n" /* "set" mask -> "keep" mask */ | 824 | "not.l %[mask] \n" /* "set" mask -> "keep" mask */ |
825 | "and.l #0xFF,%[mask] \n" | 825 | "and.l #0xFF,%[mask] \n" |
@@ -829,18 +829,26 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
829 | "clr.l %%d0 \n" | 829 | "clr.l %%d0 \n" |
830 | "lsr.l #1,%%d2 \n" /* shift out mask bit */ | 830 | "lsr.l #1,%%d2 \n" /* shift out mask bit */ |
831 | "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ | 831 | "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ |
832 | "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ | ||
833 | "lsr.l #1,%%d3 \n" | 832 | "lsr.l #1,%%d3 \n" |
834 | "addx.l %%d0,%%d0 \n" | 833 | "addx.l %%d0,%%d0 \n" |
835 | "lsl.l #1,%%d0 \n" | ||
836 | "lsr.l #1,%%d4 \n" | 834 | "lsr.l #1,%%d4 \n" |
837 | "addx.l %%d0,%%d0 \n" | 835 | "addx.l %%d0,%%d0 \n" |
838 | "lsl.l #1,%%d0 \n" | ||
839 | "lsr.l #1,%%d5 \n" | 836 | "lsr.l #1,%%d5 \n" |
840 | "addx.l %%d0,%%d0 \n" | 837 | "addx.l %%d0,%%d0 \n" |
841 | "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ | 838 | "lsr.l #1,%%d6 \n" |
842 | "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ | 839 | "addx.l %%d0,%%d0 \n" |
843 | "or.l %%d1,%%d0 \n" | 840 | "move.l %%a0,%%d1 \n" |
841 | "lsr.l #1,%%d1 \n" | ||
842 | "addx.l %%d0,%%d0 \n" | ||
843 | "move.l %%d1,%%a0 \n" | ||
844 | "move.l %%a1,%%d1 \n" | ||
845 | "lsr.l #1,%%d1 \n" | ||
846 | "addx.l %%d0,%%d0 \n" | ||
847 | "move.l %%d1,%%a1 \n" | ||
848 | "move.l %%a2,%%d1 \n" | ||
849 | "lsr.l #1,%%d1 \n" | ||
850 | "addx.l %%d0,%%d0 \n" | ||
851 | "move.l %%d1,%%a2 \n" | ||
844 | 852 | ||
845 | "move.b (%[addr]),%%d1 \n" /* read old value */ | 853 | "move.b (%[addr]),%%d1 \n" /* read old value */ |
846 | "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ | 854 | "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ |
@@ -857,18 +865,26 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
857 | "clr.l %%d0 \n" | 865 | "clr.l %%d0 \n" |
858 | "lsr.l #1,%%d2 \n" /* shift out mask bit */ | 866 | "lsr.l #1,%%d2 \n" /* shift out mask bit */ |
859 | "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ | 867 | "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ |
860 | "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ | ||
861 | "lsr.l #1,%%d3 \n" | 868 | "lsr.l #1,%%d3 \n" |
862 | "addx.l %%d0,%%d0 \n" | 869 | "addx.l %%d0,%%d0 \n" |
863 | "lsl.l #1,%%d0 \n" | ||
864 | "lsr.l #1,%%d4 \n" | 870 | "lsr.l #1,%%d4 \n" |
865 | "addx.l %%d0,%%d0 \n" | 871 | "addx.l %%d0,%%d0 \n" |
866 | "lsl.l #1,%%d0 \n" | ||
867 | "lsr.l #1,%%d5 \n" | 872 | "lsr.l #1,%%d5 \n" |
868 | "addx.l %%d0,%%d0 \n" | 873 | "addx.l %%d0,%%d0 \n" |
869 | "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ | 874 | "lsr.l #1,%%d6 \n" |
870 | "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ | 875 | "addx.l %%d0,%%d0 \n" |
871 | "or.l %%d1,%%d0 \n" | 876 | "move.l %%a0,%%d1 \n" |
877 | "lsr.l #1,%%d1 \n" | ||
878 | "addx.l %%d0,%%d0 \n" | ||
879 | "move.l %%d1,%%a0 \n" | ||
880 | "move.l %%a1,%%d1 \n" | ||
881 | "lsr.l #1,%%d1 \n" | ||
882 | "addx.l %%d0,%%d0 \n" | ||
883 | "move.l %%d1,%%a1 \n" | ||
884 | "move.l %%a2,%%d1 \n" | ||
885 | "lsr.l #1,%%d1 \n" | ||
886 | "addx.l %%d0,%%d0 \n" | ||
887 | "move.l %%d1,%%a2 \n" | ||
872 | 888 | ||
873 | "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ | 889 | "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ |
874 | "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ | 890 | "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ |
@@ -880,11 +896,11 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
880 | [addr]"+a"(addr), | 896 | [addr]"+a"(addr), |
881 | [mask]"+d"(_mask) | 897 | [mask]"+d"(_mask) |
882 | : /* inputs */ | 898 | : /* inputs */ |
883 | [psiz]"r"(_gray_info.plane_size), | 899 | [psiz]"a"(_gray_info.plane_size), |
884 | [end] "a"(end), | 900 | [end] "a"(end), |
885 | [patp]"a"(pat_ptr) | 901 | [patp]"a"(pat_ptr) |
886 | : /* clobbers */ | 902 | : /* clobbers */ |
887 | "d0", "d1", "d2", "d3", "d4", "d5" | 903 | "d0", "d1", "d2", "d3", "d4", "d5", "d6", "a0", "a1", "a2" |
888 | ); | 904 | ); |
889 | #endif | 905 | #endif |
890 | } | 906 | } |
@@ -938,8 +954,8 @@ void gray_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y, | |||
938 | + MULU16(_gray_info.width, y >> _PBLOCK_EXP); | 954 | + MULU16(_gray_info.width, y >> _PBLOCK_EXP); |
939 | ny = height - 1 + shift; | 955 | ny = height - 1 + shift; |
940 | 956 | ||
941 | mask = 0xFFu << (LCD_DEPTH * shift); | 957 | mask = 0xFFu << shift; |
942 | mask_bottom = 0xFFu >> (LCD_DEPTH * (~ny & (_PBLOCK-1))); | 958 | mask_bottom = 0xFFu >> (~ny & (_PBLOCK-1)); |
943 | 959 | ||
944 | for (; ny >= _PBLOCK; ny -= _PBLOCK) | 960 | for (; ny >= _PBLOCK; ny -= _PBLOCK) |
945 | { | 961 | { |