More work on PDBox by Wincent Balin. The PDBox plug-in is now working with the pdpod_...
[kugel-rb.git] / apps / plugins / pacbox / pacbox_arm.S
blob32cf2d447e142d48b493836bbe63b20cb39dca99
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (c) 2006 Dave Chapman
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18  * KIND, either express or implied.
19  *
20  ****************************************************************************/
22 #include "pacbox.h"
24     .section .icode,"ax",%progbits
25     .global blit_display
27 /* void blit_display(fb_data* lcd_framebuffer, unsigned char* vbuf)
29    next_dst=&lcd_framebuffer[YOFS*LCD_WIDTH+XOFS+ScreenHeight-1];
30    for( y=ScreenHeight; y>0; y-- ) {
31        dst = (next_dst--);
32        for( x=ScreenWidth; x>0; x-- ) {
33            *dst = palette[*(vbuf++)];
34            dst+=LCD_WIDTH;
35        }
36    }
37  */
39 #ifdef HAVE_LCD_COLOR
40 #if (LCD_WIDTH >= 288) && (LCD_HEIGHT >= 224)
42 blit_display:
43          stmdb   sp!, {r4-r11, lr}
45          add     r3, r0, #5696            
46          add     r3, r3, #24  @ 5720 = (2*(YOFS*LCD_WIDTH+XOFS+ScreenHeight-4))
47          ldr     r0, =palette
48          mov     lr, #288                 @ y = 288
50 loop_y:  mov     r2, r3                   @ r2 = next_dst
51          sub     r3, r3, #8               @ next_dst-=4
53          mov     ip, #224                 @ x = 224
55 /* store 2 input bytes from the next four lines in r7-r10 */
56 loop_x:  
57          ldrh    r8,  [r1, #224]          @ r8 = vbuf[224]
58          ldrh    r7,  [r1]                @ r7 = vbuf[0]
59          add     r1,  r1, #448
60          ldrh    r10,  [r1, #224]         @ r10 = vbuf[224*3]
61          ldrh    r9,  [r1], #2            @ r9 = vbuf[224*2] ; vbuf += 2;
62          sub     r1,  r1, #448
65 /* Convert high bytes of r7-r10 into palette entries in r5 and r6 */
66          mov     r6, r7, lsr #8
67          mov     r6, r6, lsl #1
68          ldrh    r6, [r6, r0]             @ r6 = palette[hi(r7]]
70          mov     r11, r8, lsr #8
71          mov     r11, r11, lsl #1
72          ldrh    r11, [r11, r0]           @ r11 = palette[hi(r8]]
74          orr     r6, r11, r6, lsl #16     @ r6 = palette[hi(r8]]
75                                           @ | (palette[hi(r7)] << 16)
77          mov     r5, r9, lsr #8
78          mov     r5, r5, lsl #1
79          ldrh    r5, [r5, r0]             @ r5 = palette[hi(r9]]
81          mov     r11, r10, lsr #8
82          mov     r11, r11, lsl #1
83          ldrh    r11, [r11, r0]           @ r11 = palette[hi(r10)]]
85          orr     r5, r11, r5, lsl #16     @ r5 = palette[hi(r10]]
86                                           @ | (palette[hi(r9)] << 16)
88 /* Convert low bytes of r7-r10 into palette entries in r7 and r8 */
89          and     r7, r7, #0xff
90          mov     r7, r7, lsl #1
91          ldrh    r7, [r7, r0]
93          and     r8, r8, #0xff
94          mov     r8, r8, lsl #1
95          ldrh    r8, [r8, r0]
97          orr     r8, r8, r7, lsl #16
99          and     r9, r9, #0xff
100          mov     r9, r9, lsl #1
101          ldrh    r9, [r9, r0]
103          and     r10, r10, #0xff
104          mov     r10, r10, lsl #1
105          ldrh    r10, [r10, r0]
107          orr     r7, r10, r9, lsl #16
109 /* Now write the 8 pixels to the screen */
110          stmia   r2!, {r7, r8}
111          add     r2, r2, #(LCD_WIDTH*2)-8 @ dst += LCD_WIDTH
113          stmia   r2!, {r5, r6}
114          add     r2, r2, #(LCD_WIDTH*2)-8 @ dst += LCD_WIDTH
116 /* end of x loop */
117          subs    ip, ip, #2               @ x-=2
118          bne     loop_x
120 /* end of y loop */
121          add     r1, r1, #224*3           @ vbuf += 224*3
122          subs    lr, lr, #4               @ y-=4
123          ldmeqia sp!, {r4-r11, pc}
124          b       loop_y
125 #endif
126 #endif