Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  linux/arch/arm/lib/ll_char_wr.S
0004  *
0005  *  Copyright (C) 1995, 1996 Russell King.
0006  *
0007  *  Speedups & 1bpp code (C) 1996 Philip Blundell & Russell King.
0008  *
0009  *  10-04-96    RMK Various cleanups & reduced register usage.
0010  *  08-04-98    RMK Shifts re-ordered
0011  */
0012 
0013 @ Regs: [] = corruptible
0014 @       {} = used
0015 @       () = do not use
0016 
0017 #include <linux/linkage.h>
0018 #include <asm/assembler.h>
0019     .text
0020 
0021 LC0:    .word   LC0
0022     .word   bytes_per_char_h
0023     .word   video_size_row
0024     .word   acorndata_8x8
0025     .word   con_charconvtable
0026 
0027 /*
0028  * r0 = ptr
0029  * r1 = char
0030  * r2 = white
0031  */
0032 ENTRY(ll_write_char)
0033     stmfd   sp!, {r4 - r7, lr}
0034 @
0035 @ Smashable regs: {r0 - r3}, [r4 - r7], (r8 - fp), [ip], (sp), [lr], (pc)
0036 @
0037     /*
0038      * calculate offset into character table
0039      */
0040     mov r1, r1, lsl #3
0041     /*
0042      * calculate offset required for each row.
0043      */
0044     adr ip, LC0
0045     ldmia   ip, {r3, r4, r5, r6, lr}
0046     sub ip, ip, r3
0047     add r6, r6, ip
0048     add lr, lr, ip
0049     ldr r4, [r4, ip]
0050     ldr r5, [r5, ip]
0051     /*
0052      * Go to resolution-dependent routine...
0053      */
0054     cmp r4, #4
0055     blt Lrow1bpp
0056     add r0, r0, r5, lsl #3      @ Move to bottom of character
0057     orr r1, r1, #7
0058     ldrb    r7, [r6, r1]
0059     teq r4, #8
0060     beq Lrow8bpplp
0061 @
0062 @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
0063 @
0064 Lrow4bpplp:
0065     ldr r7, [lr, r7, lsl #2]
0066     mul r7, r2, r7
0067     sub r1, r1, #1          @ avoid using r7 directly after
0068     str r7, [r0, -r5]!
0069     ldrb    r7, [r6, r1]
0070     ldr r7, [lr, r7, lsl #2]
0071     mul r7, r2, r7
0072     tst r1, #7              @ avoid using r7 directly after
0073     str r7, [r0, -r5]!
0074     subne   r1, r1, #1
0075     ldrbne  r7, [r6, r1]
0076     bne Lrow4bpplp
0077     ldmfd   sp!, {r4 - r7, pc}
0078 
0079 @
0080 @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
0081 @
0082 Lrow8bpplp:
0083     mov ip, r7, lsr #4
0084     ldr ip, [lr, ip, lsl #2]
0085     mul r4, r2, ip
0086     and ip, r7, #15         @ avoid r4
0087     ldr ip, [lr, ip, lsl #2]        @ avoid r4
0088     mul ip, r2, ip          @ avoid r4
0089     sub r1, r1, #1          @ avoid ip
0090     sub r0, r0, r5          @ avoid ip
0091     stmia   r0, {r4, ip}
0092     ldrb    r7, [r6, r1]
0093     mov ip, r7, lsr #4
0094     ldr ip, [lr, ip, lsl #2]
0095     mul r4, r2, ip
0096     and ip, r7, #15         @ avoid r4
0097     ldr ip, [lr, ip, lsl #2]        @ avoid r4
0098     mul ip, r2, ip          @ avoid r4
0099     tst r1, #7              @ avoid ip
0100     sub r0, r0, r5          @ avoid ip
0101     stmia   r0, {r4, ip}
0102     subne   r1, r1, #1
0103     ldrbne  r7, [r6, r1]
0104     bne Lrow8bpplp
0105     ldmfd   sp!, {r4 - r7, pc}
0106 
0107 @
0108 @ Smashable regs: {r0 - r3}, [r4], {r5, r6}, [r7], (r8 - fp), [ip], (sp), [lr], (pc)
0109 @
0110 Lrow1bpp:
0111     add r6, r6, r1
0112     ldmia   r6, {r4, r7}
0113     strb    r4, [r0], r5
0114     mov r4, r4, lsr #8
0115     strb    r4, [r0], r5
0116     mov r4, r4, lsr #8
0117     strb    r4, [r0], r5
0118     mov r4, r4, lsr #8
0119     strb    r4, [r0], r5
0120     strb    r7, [r0], r5
0121     mov r7, r7, lsr #8
0122     strb    r7, [r0], r5
0123     mov r7, r7, lsr #8
0124     strb    r7, [r0], r5
0125     mov r7, r7, lsr #8
0126     strb    r7, [r0], r5
0127     ldmfd   sp!, {r4 - r7, pc}
0128 
0129     .bss
0130 ENTRY(con_charconvtable)
0131     .space  1024