summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2022-10-13 11:03:53 -0400
committerSolomon Peachy <pizza@shaftnet.org>2022-10-13 11:08:06 -0400
commit418169aff8faf2cf90124cd95dba0af821cea73d (patch)
tree4fc206af57c9a07fba6cbcb3517fa946a7b84668 /firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S
parentf9ea1fc79d6aaff9949a5b11ae011b4e04e0e9d9 (diff)
downloadrockbox-418169aff8.tar.gz
rockbox-418169aff8.zip
Revert "Remove YUV blitting functions and LCD modes"
This reverts commit fe6aa21e9eb88f49005863efd2003d0982920048. Change-Id: I8bb1e5d6c52ed1478002d2140ef494ec5d62b8e3
Diffstat (limited to 'firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S')
-rw-r--r--firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S140
1 files changed, 140 insertions, 0 deletions
diff --git a/firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S b/firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S
new file mode 100644
index 0000000000..c3a7992a2e
--- /dev/null
+++ b/firmware/target/arm/philips/hdd6330/lcd-as-hdd6330.S
@@ -0,0 +1,140 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id:$
+ *
+ * Copyright (C) 2010 by Szymon Dziok
+ *
+ * Philips Gogear HDD6330 LCD assembly routine
+ *
+ * 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"
+#include "cpu.h"
+
+/****************************************************************************
+ void lcd_yuv_write_inner_loop(unsigned char const * const ysrc,
+ unsigned char const * const usrc,
+ unsigned char const * const vsrc,
+ int width);
+*/
+ .section .icode, "ax", %progbits
+ .align 2
+ .global lcd_yuv_write_inner_loop
+ .type lcd_yuv_write_inner_loop, %function
+lcd_yuv_write_inner_loop:
+ @ r0 = ysrc
+ @ r1 = usrc
+ @ r2 = vsrc
+ @ r3 = width
+ stmfd sp!, { r4-r11, lr } @ save regs
+ mov r4, #0x70000000 @ r4 = LCD2_BLOCK_CTRL - 0x20
+ add r4, r4, #0x8a00 @
+ add r5, r4, #0x100 @ r5 = LCD2_BLOCK_DATA
+10: @ loop
+
+ ldrb r7, [r1], #1 @ *usrc++
+ ldrb r8, [r2], #1 @ *vsrc++
+
+ sub r7, r7, #128 @ Cb -= 128
+ sub r8, r8, #128 @ Cr -= 128
+
+ add r10, r8, r8, asl #2 @ Cr*101
+ add r10, r10, r8, asl #5
+ add r10, r10, r8, asl #6
+
+ add r11, r8, r8, asl #1 @ Cr*51 + Cb*24
+ add r11, r11, r11, asl #4
+ add r11, r11, r7, asl #3
+ add r11, r11, r7, asl #4
+
+ add r12, r7, #2 @ r12 = bu = (Cb*128 + 256) >> 9
+ mov r12, r12, asr #2
+ add r10, r10, #256 @ r10 = rv = (Cr*101 + 256) >> 9
+ mov r10, r10, asr #9
+ rsb r11, r11, #128 @ r11 = guv = (-r11 + 128) >> 8
+ mov r11, r11, asr #8
+
+@ pixel_1
+ ldrb r7, [r0], #1 @ *ysrc++
+ sub r7, r7, #16 @ Y = (Y' - 16) * 37
+ add r8, r7, r7, asl #2
+ add r7, r8, r7, asl #5
+
+ add r9, r10, r7, asr #8 @ R = (Y >> 8) + rv
+ add r8, r11, r7, asr #7 @ G = (Y >> 7) + guv
+ add r7, r12, r7, asr #8 @ B = (Y >> 8) + bu
+
+ cmp r9, #31 @ clamp R
+ mvnhi r9, r9, asr #31
+ andhi r9, r9, #31
+
+ cmp r8, #63 @ clamp G
+ mvnhi r8, r8, asr #31
+ andhi r8, r8, #63
+
+ cmp r7, #31 @ clamp B
+ mvnhi r7, r7, asr #31
+ andhi r7, r7, #31
+
+ orr r6, r7, r8, lsl #5 @ pack pixel
+ orr r6, r6, r9, lsl #11
+
+ mov r7, r6, lsl #8 @ swap bytes
+ and r7, r7, #0xff00
+ add r6, r7, r6, lsr #8
+
+@ pixel_2
+ ldrb r7, [r0], #1 @ *ysrc++
+ sub r7, r7, #16 @ Y = (Y' - 16) * 37
+ add r8, r7, r7, asl #2
+ add r7, r8, r7, asl #5
+
+ add r9, r10, r7, asr #8 @ R = (Y >> 8) + rv
+ add r8, r11, r7, asr #7 @ G = (Y >> 7) + guv
+ add r7, r12, r7, asr #8 @ B = (Y >> 8) + bu
+
+ cmp r9, #31 @ clamp R
+ mvnhi r9, r9, asr #31
+ andhi r9, r9, #31
+
+ cmp r8, #63 @ clamp G
+ mvnhi r8, r8, asr #31
+ andhi r8, r8, #63
+
+ cmp r7, #31 @ clamp B
+ mvnhi r7, r7, asr #31
+ andhi r7, r7, #31
+
+ orr r7, r7, r8, lsl #5 @ pack pixel
+ orr r7, r7, r9, lsl #11
+
+ orr r6, r6, r7, lsl #24 @ swap bytes and add pixels simultaneously
+ mov r7, r7, lsr #8
+ orr r6, r6, r7, lsl #16
+
+11: @ while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK));
+ ldr r11, [r4, #0x20] @
+ tst r11, #0x1000000 @
+ beq 11b @
+
+ str r6, [r5] @ send two pixels
+
+ subs r3, r3, #2 @ decrease width
+ bgt 10b @ loop
+
+ ldmpc regs=r4-r11 @ restore regs
+ .ltorg @ dump constant pool
+ .size lcd_yuv_write_inner_loop, .-lcd_yuv_write_inner_loop