rockbox/apps/plugins/lib/grey_coldfire.S

138 lines
3.5 KiB
ArmAsm
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* New greyscale framework
* Coldfire 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_PIXELFORMAT == VERTICAL_INTERLEAVED)
#if (LCD_DEPTH == 1) || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
#define GREY_BSIZE 8
#elif LCD_DEPTH == 2
#define GREY_BSIZE 4
#endif
/****************************************************************************
* void _grey_line1(int width,
* unsigned char *dst,
* const unsigned char *src,
* const unsigned char *lut);
*/
_grey_line1:
lea.l (-2*4, %sp), %sp
movem.l %d2/%a2, (%sp)
movem.l (2*4+4, %sp), %d2/%a0-%a2
clr.l %d0
move.l %a1, %d1
and.l #1, %d1
beq.s .p1_h_end
move.b (%a1)+, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
subq.l #1, %d2
.p1_h_end:
cmp.l #2, %d2
blo.s .p2_t_end
move.l %a1, %d1
and.l #2, %d1
beq.s .p2_h_end
move.w (%a1)+, %d1
move.w %d1, %d0
lsr.l #8, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
move.b %d1, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
subq.l #2, %d2
.p2_h_end:
subq.l #4, %d2
blo.s .p4_end
.p4_loop:
move.l (%a1)+, %d1
swap %d1
move.w %d1, %d0
lsr.l #8, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
move.b %d1, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
swap %d1
move.w %d1, %d0
lsr.l #8, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
move.b %d1, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
subq.l #4, %d2
bhs.s .p4_loop
/* No need to correct the count, we're only testing bits from now on. */
.p4_end:
btst.l #1, %d2
beq.s .p2_t_end
move.w (%a1)+, %d1
move.w %d1, %d0
lsr.l #8, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
move.b %d1, %d0
move.b (%d0.l, %a2), (%a0)
addq.l #GREY_BSIZE, %a0
.p2_t_end:
btst.l #0, %d2
beq.s .p1_t_end
move.b (%a1)+, %d0
move.b (%d0.l, %a2), (%a0)
.p1_t_end:
movem.l (%sp), %d2/%a2
lea.l (2*4, %sp), %sp
rts
.size _grey_line1, . - _grey_line1
#endif