FS#11335 by me: make ARM assembly functions thumb-friendly
[kugel-rb.git] / apps / plugins / pacbox / pacbox_arm.S
blob87696ce6f722b482ce2d07fa4286a1f1b5dd0b23
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 "config.h"
23 #include "pacbox.h"
25     .section .icode,"ax",%progbits
26     .global blit_display
28 /* void blit_display(fb_data* lcd_framebuffer, unsigned char* vbuf)
30    next_dst=&lcd_framebuffer[YOFS*LCD_WIDTH+XOFS+ScreenHeight-1];
31    for( y=ScreenHeight; y>0; y-- ) {
32        dst = (next_dst--);
33        for( x=ScreenWidth; x>0; x-- ) {
34            *dst = palette[*(vbuf++)];
35            dst+=LCD_WIDTH;
36        }
37    }
38  */
40 #ifdef HAVE_LCD_COLOR
41 #if (LCD_WIDTH >= 288) && (LCD_HEIGHT >= 224)
43 blit_display:
44          stmdb   sp!, {r4-r11, lr}
46          add     r3, r0, #5696            
47          add     r3, r3, #24  @ 5720 = (2*(YOFS*LCD_WIDTH+XOFS+ScreenHeight-4))
48          ldr     r0, =palette
49          mov     lr, #288                 @ y = 288
51 loop_y:  mov     r2, r3                   @ r2 = next_dst
52          sub     r3, r3, #8               @ next_dst-=4
54          mov     ip, #224                 @ x = 224
56 /* store 2 input bytes from the next four lines in r7-r10 */
57 loop_x:  
58          ldrh    r8,  [r1, #224]          @ r8 = vbuf[224]
59          ldrh    r7,  [r1]                @ r7 = vbuf[0]
60          add     r1,  r1, #448
61          ldrh    r10,  [r1, #224]         @ r10 = vbuf[224*3]
62          ldrh    r9,  [r1], #2            @ r9 = vbuf[224*2] ; vbuf += 2;
63          sub     r1,  r1, #448
66 /* Convert high bytes of r7-r10 into palette entries in r5 and r6 */
67          mov     r6, r7, lsr #8
68          mov     r6, r6, lsl #1
69          ldrh    r6, [r6, r0]             @ r6 = palette[hi(r7]]
71          mov     r11, r8, lsr #8
72          mov     r11, r11, lsl #1
73          ldrh    r11, [r11, r0]           @ r11 = palette[hi(r8]]
75          orr     r6, r11, r6, lsl #16     @ r6 = palette[hi(r8]]
76                                           @ | (palette[hi(r7)] << 16)
78          mov     r5, r9, lsr #8
79          mov     r5, r5, lsl #1
80          ldrh    r5, [r5, r0]             @ r5 = palette[hi(r9]]
82          mov     r11, r10, lsr #8
83          mov     r11, r11, lsl #1
84          ldrh    r11, [r11, r0]           @ r11 = palette[hi(r10)]]
86          orr     r5, r11, r5, lsl #16     @ r5 = palette[hi(r10]]
87                                           @ | (palette[hi(r9)] << 16)
89 /* Convert low bytes of r7-r10 into palette entries in r7 and r8 */
90          and     r7, r7, #0xff
91          mov     r7, r7, lsl #1
92          ldrh    r7, [r7, r0]
94          and     r8, r8, #0xff
95          mov     r8, r8, lsl #1
96          ldrh    r8, [r8, r0]
98          orr     r8, r8, r7, lsl #16
100          and     r9, r9, #0xff
101          mov     r9, r9, lsl #1
102          ldrh    r9, [r9, r0]
104          and     r10, r10, #0xff
105          mov     r10, r10, lsl #1
106          ldrh    r10, [r10, r0]
108          orr     r7, r10, r9, lsl #16
110 /* Now write the 8 pixels to the screen */
111          stmia   r2!, {r7, r8}
112          add     r2, r2, #(LCD_WIDTH*2)-8 @ dst += LCD_WIDTH
114          stmia   r2!, {r5, r6}
115          add     r2, r2, #(LCD_WIDTH*2)-8 @ dst += LCD_WIDTH
117 /* end of x loop */
118          subs    ip, ip, #2               @ x-=2
119          bne     loop_x
121 /* end of y loop */
122          add     r1, r1, #224*3           @ vbuf += 224*3
123          subs    lr, lr, #4               @ y-=4
124          ldmpc   cond=eq, regs=r4-r11
125          b       loop_y
126 #endif
127 #endif