415f579bf3
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30945 a1c6a512-1295-4272-9138-f99709370657
137 lines
3.3 KiB
ArmAsm
137 lines
3.3 KiB
ArmAsm
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* New greyscale framework
|
|
* SH1 assembler routines
|
|
*
|
|
* This is a generic framework to display 129 shades of grey on low-depth
|
|
* bitmap LCDs (Archos b&w, Iriver & Ipod 4-grey) within plugins.
|
|
*
|
|
* Copyright (C) 2008 Jens Arnold
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "config.h"
|
|
/* Plugins should not normally do this, but we need to check a macro, and
|
|
* plugin.h would confuse the assembler. */
|
|
|
|
.text
|
|
.global __grey_line1
|
|
.type __grey_line1, @function
|
|
|
|
#if (LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 1)
|
|
|
|
/****************************************************************************
|
|
* void _grey_line1(int width, r4
|
|
* unsigned char *dst, r5
|
|
* const unsigned char *src, r6
|
|
* const unsigned char *lut); r7
|
|
*/
|
|
|
|
__grey_line1:
|
|
mov #1, r0
|
|
tst r0, r6
|
|
bt .p1_h_end
|
|
|
|
mov.b @r6+, r0
|
|
extu.b r0, r0
|
|
mov.b @(r0, r7), r0
|
|
add #-1, r4
|
|
mov.b r0, @r5
|
|
add #8, r5
|
|
.p1_h_end:
|
|
|
|
mov #2, r0
|
|
cmp/hs r0, r4
|
|
bf .p2_t_end
|
|
tst r0, r6
|
|
bt .p2_h_end
|
|
|
|
mov.w @r6+, r1
|
|
extu.b r1, r0
|
|
mov.b @(r0, r7), r0
|
|
shlr8 r1
|
|
mov.b r0, @(8, r5)
|
|
extu.b r1, r0
|
|
mov.b @(r0, r7), r0
|
|
add #-2, r4
|
|
mov.b r0, @r5
|
|
add #16, r5
|
|
.p2_h_end:
|
|
|
|
add #-4, r4
|
|
cmp/pz r4
|
|
bf .p4_end
|
|
|
|
add r6, r4
|
|
|
|
.p4_loop:
|
|
mov.l @r6+, r1
|
|
swap.w r1, r2
|
|
extu.b r2, r0
|
|
mov.b @(r0, r7), r0
|
|
shlr8 r2
|
|
mov.b r0, @(8, r5)
|
|
extu.b r2, r0
|
|
mov.b @(r0, r7), r2
|
|
extu.b r1, r0
|
|
mov.b r2, @r5
|
|
add #16, r5
|
|
mov.b @(r0, r7), r0
|
|
shlr8 r1
|
|
mov.b r0, @(8, r5)
|
|
extu.b r1, r0
|
|
mov.b @(r0, r7), r0
|
|
cmp/hs r6, r4
|
|
mov.b r0, @r5
|
|
add #16, r5
|
|
bt .p4_loop
|
|
|
|
/* No need to correct the count, we're only testing bits from now on. */
|
|
|
|
.p4_end:
|
|
mov #2, r0
|
|
tst r0, r4
|
|
bt .p2_t_end
|
|
|
|
mov.w @r6+, r1
|
|
extu.b r1, r0
|
|
mov.b @(r0, r7), r0
|
|
shlr8 r1
|
|
mov.b r0, @(8, r5)
|
|
extu.b r1, r0
|
|
mov.b @(r0, r7), r0
|
|
mov.b r0, @r5
|
|
add #16, r5
|
|
.p2_t_end:
|
|
|
|
mov #1, r0
|
|
tst r0, r4
|
|
bt .p1_t_end
|
|
|
|
mov.b @r6+, r0
|
|
extu.b r0, r0
|
|
mov.b @(r0, r7), r0
|
|
rts
|
|
mov.b r0, @r5
|
|
.p1_t_end:
|
|
|
|
rts
|
|
nop
|
|
.size __grey_line1, . - __grey_line1
|
|
|
|
#endif
|