diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-10-01 10:20:55 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-10-01 10:20:55 +0000 |
commit | 05042affc76ec42481bcddba4a3f94a7b77ec98d (patch) | |
tree | fc1f73129fbe09b3e2022828c717ba7eb9507603 /apps/plugins/lib/gray_draw.c | |
parent | f0fe3c94772ddf971810e5082dcfb9b0ac462ae4 (diff) | |
download | rockbox-05042affc76ec42481bcddba4a3f94a7b77ec98d.tar.gz rockbox-05042affc76ec42481bcddba4a3f94a7b77ec98d.zip |
Core: A graphics framework can now register a hook function to extend the core screendump routine. * Grayscale library: (1) Changed the screendump routine into a hook, and implemented it for H1x0. (2) The planar pixel setting routines now use one register less. Fixes build problem with developer builds (frame pointers enabled) on coldfire.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7574 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib/gray_draw.c')
-rw-r--r-- | apps/plugins/lib/gray_draw.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/apps/plugins/lib/gray_draw.c b/apps/plugins/lib/gray_draw.c index 4b2237197c..d03f450b5f 100644 --- a/apps/plugins/lib/gray_draw.c +++ b/apps/plugins/lib/gray_draw.c | |||
@@ -588,7 +588,7 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
588 | unsigned long *pat_ptr = &pat_stack[8]; | 588 | unsigned long *pat_ptr = &pat_stack[8]; |
589 | const unsigned char *_src; | 589 | const unsigned char *_src; |
590 | unsigned char *addr, *end; | 590 | unsigned char *addr, *end; |
591 | unsigned _mask; | 591 | unsigned _mask, trash; |
592 | 592 | ||
593 | _mask = mask; | 593 | _mask = mask; |
594 | _src = src; | 594 | _src = src; |
@@ -675,7 +675,7 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
675 | "mov.l @%[patp]+,r7\n" | 675 | "mov.l @%[patp]+,r7\n" |
676 | "mov.l @%[patp]+,r8\n" | 676 | "mov.l @%[patp]+,r8\n" |
677 | "mov.l @%[patp]+,r9\n" | 677 | "mov.l @%[patp]+,r9\n" |
678 | "mov.l @%[patp]+,r10 \n" | 678 | "mov.l @%[patp],%[rx] \n" |
679 | 679 | ||
680 | "not %[mask],%[mask] \n" /* "set" mask -> "keep" mask */ | 680 | "not %[mask],%[mask] \n" /* "set" mask -> "keep" mask */ |
681 | "extu.b %[mask],%[mask] \n" /* mask out high bits */ | 681 | "extu.b %[mask],%[mask] \n" /* mask out high bits */ |
@@ -697,7 +697,7 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
697 | "rotcl r0 \n" | 697 | "rotcl r0 \n" |
698 | "shlr r9 \n" | 698 | "shlr r9 \n" |
699 | "rotcl r0 \n" | 699 | "rotcl r0 \n" |
700 | "shlr r10 \n" | 700 | "shlr %[rx] \n" |
701 | "mov.b @%[addr],%[patp]\n" /* read old value */ | 701 | "mov.b @%[addr],%[patp]\n" /* read old value */ |
702 | "rotcl r0 \n" | 702 | "rotcl r0 \n" |
703 | "and %[mask],%[patp] \n" /* mask out unneeded bits */ | 703 | "and %[mask],%[patp] \n" /* mask out unneeded bits */ |
@@ -725,7 +725,7 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
725 | "rotcl r0 \n" | 725 | "rotcl r0 \n" |
726 | "shlr r9 \n" | 726 | "shlr r9 \n" |
727 | "rotcl r0 \n" | 727 | "rotcl r0 \n" |
728 | "shlr r10 \n" | 728 | "shlr %[rx] \n" |
729 | "rotcl r0 \n" | 729 | "rotcl r0 \n" |
730 | "mov.b r0,@%[addr] \n" /* store byte to bitplane */ | 730 | "mov.b r0,@%[addr] \n" /* store byte to bitplane */ |
731 | "add %[psiz],%[addr] \n" /* advance to next bitplane */ | 731 | "add %[psiz],%[addr] \n" /* advance to next bitplane */ |
@@ -734,21 +734,22 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
734 | 734 | ||
735 | ".wa_end: \n" | 735 | ".wa_end: \n" |
736 | : /* outputs */ | 736 | : /* outputs */ |
737 | [patp]"+r"(pat_ptr), | ||
738 | [addr]"+r"(addr), | 737 | [addr]"+r"(addr), |
739 | [mask]"+r"(_mask) | 738 | [mask]"+r"(_mask), |
739 | [rx] "=&r"(trash) | ||
740 | : /* inputs */ | 740 | : /* inputs */ |
741 | [psiz]"r"(_gray_info.plane_size), | ||
741 | [end] "r"(end), | 742 | [end] "r"(end), |
742 | [psiz]"r"(_gray_info.plane_size) | 743 | [patp]"[rx]"(pat_ptr) |
743 | : /* clobbers */ | 744 | : /* clobbers */ |
744 | "r0", "r1", "r2", "r3", "r6", "r7", "r8", "r9", "r10" | 745 | "r0", "r1", "r2", "r3", "r6", "r7", "r8", "r9" |
745 | ); | 746 | ); |
746 | #elif defined(CPU_COLDFIRE) && (LCD_DEPTH == 2) | 747 | #elif defined(CPU_COLDFIRE) && (LCD_DEPTH == 2) |
747 | unsigned long pat_stack[8]; | 748 | unsigned long pat_stack[8]; |
748 | unsigned long *pat_ptr = &pat_stack[8]; | 749 | unsigned long *pat_ptr = &pat_stack[8]; |
749 | const unsigned char *_src; | 750 | const unsigned char *_src; |
750 | unsigned char *addr, *end; | 751 | unsigned char *addr, *end; |
751 | unsigned _mask; | 752 | unsigned _mask, trash; |
752 | 753 | ||
753 | _mask = mask; | 754 | _mask = mask; |
754 | _src = src; | 755 | _src = src; |
@@ -819,8 +820,8 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
819 | /* set the bits for all 8 pixels in all bytes according to the | 820 | /* set the bits for all 8 pixels in all bytes according to the |
820 | * precalculated patterns on the pattern stack */ | 821 | * precalculated patterns on the pattern stack */ |
821 | asm volatile ( | 822 | asm volatile ( |
822 | "movem.l (%[patp]),%%d2-%%d6/%%a0-%%a2 \n" /* pop all 8 patterns */ | 823 | "movem.l (%[patp]),%%d2-%%d6/%%a0-%%a1/%[ax] \n" |
823 | 824 | /* pop all 8 patterns */ | |
824 | "not.l %[mask] \n" /* "set" mask -> "keep" mask */ | 825 | "not.l %[mask] \n" /* "set" mask -> "keep" mask */ |
825 | "and.l #0xFF,%[mask] \n" | 826 | "and.l #0xFF,%[mask] \n" |
826 | "beq.b .wa_sloop \n" /* yes: jump to short loop */ | 827 | "beq.b .wa_sloop \n" /* yes: jump to short loop */ |
@@ -845,10 +846,10 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
845 | "lsr.l #1,%%d1 \n" | 846 | "lsr.l #1,%%d1 \n" |
846 | "addx.l %%d0,%%d0 \n" | 847 | "addx.l %%d0,%%d0 \n" |
847 | "move.l %%d1,%%a1 \n" | 848 | "move.l %%d1,%%a1 \n" |
848 | "move.l %%a2,%%d1 \n" | 849 | "move.l %[ax],%%d1 \n" |
849 | "lsr.l #1,%%d1 \n" | 850 | "lsr.l #1,%%d1 \n" |
850 | "addx.l %%d0,%%d0 \n" | 851 | "addx.l %%d0,%%d0 \n" |
851 | "move.l %%d1,%%a2 \n" | 852 | "move.l %%d1,%[ax] \n" |
852 | 853 | ||
853 | "move.b (%[addr]),%%d1 \n" /* read old value */ | 854 | "move.b (%[addr]),%%d1 \n" /* read old value */ |
854 | "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ | 855 | "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ |
@@ -881,10 +882,10 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
881 | "lsr.l #1,%%d1 \n" | 882 | "lsr.l #1,%%d1 \n" |
882 | "addx.l %%d0,%%d0 \n" | 883 | "addx.l %%d0,%%d0 \n" |
883 | "move.l %%d1,%%a1 \n" | 884 | "move.l %%d1,%%a1 \n" |
884 | "move.l %%a2,%%d1 \n" | 885 | "move.l %[ax],%%d1 \n" |
885 | "lsr.l #1,%%d1 \n" | 886 | "lsr.l #1,%%d1 \n" |
886 | "addx.l %%d0,%%d0 \n" | 887 | "addx.l %%d0,%%d0 \n" |
887 | "move.l %%d1,%%a2 \n" | 888 | "move.l %%d1,%[ax] \n" |
888 | 889 | ||
889 | "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ | 890 | "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ |
890 | "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ | 891 | "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ |
@@ -894,13 +895,14 @@ static void _writearray(unsigned char *address, const unsigned char *src, | |||
894 | ".wa_end: \n" | 895 | ".wa_end: \n" |
895 | : /* outputs */ | 896 | : /* outputs */ |
896 | [addr]"+a"(addr), | 897 | [addr]"+a"(addr), |
897 | [mask]"+d"(_mask) | 898 | [mask]"+d"(_mask), |
899 | [ax] "=&a"(trash) | ||
898 | : /* inputs */ | 900 | : /* inputs */ |
899 | [psiz]"a"(_gray_info.plane_size), | 901 | [psiz]"a"(_gray_info.plane_size), |
900 | [end] "a"(end), | 902 | [end] "a"(end), |
901 | [patp]"a"(pat_ptr) | 903 | [patp]"[ax]"(pat_ptr) |
902 | : /* clobbers */ | 904 | : /* clobbers */ |
903 | "d0", "d1", "d2", "d3", "d4", "d5", "d6", "a0", "a1", "a2" | 905 | "d0", "d1", "d2", "d3", "d4", "d5", "d6", "a0", "a1" |
904 | ); | 906 | ); |
905 | #endif | 907 | #endif |
906 | } | 908 | } |