blob: d7bbd9da2fca699767227b1cf64d2befbd7ef3c8 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/arch/arm/lib/ll_char_wr.S
3 *
4 * Copyright (C) 1995, 1996 Russell King.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * Speedups & 1bpp code (C) 1996 Philip Blundell & Russell King.
11 *
12 * 10-04-96 RMK Various cleanups & reduced register usage.
13 * 08-04-98 RMK Shifts re-ordered
14 */
15
16@ Regs: [] = corruptible
17@ {} = used
18@ () = do not use
19
20#include <linux/linkage.h>
21#include <asm/assembler.h>
22 .text
23
24LC0: .word LC0
25 .word bytes_per_char_h
26 .word video_size_row
27 .word acorndata_8x8
28 .word con_charconvtable
29
30/*
31 * r0 = ptr
32 * r1 = char
33 * r2 = white
34 */
35ENTRY(ll_write_char)
36 stmfd sp!, {r4 - r7, lr}
37@
38@ Smashable regs: {r0 - r3}, [r4 - r7], (r8 - fp), [ip], (sp), [lr], (pc)
39@
40 /*
41 * calculate offset into character table
42 */
43 mov r1, r1, lsl #3
44 /*
45 * calculate offset required for each row.
46 */
47 adr ip, LC0
48 ldmia ip, {r3, r4, r5, r6, lr}
49 sub ip, ip, r3
50 add r6, r6, ip
51 add lr, lr, ip
52 ldr r4, [r4, ip]
53 ldr r5, [r5, ip]
54 /*
55 * Go to resolution-dependent routine...
56 */
57 cmp r4, #4
58 blt Lrow1bpp
59 add r0, r0, r5, lsl #3 @ Move to bottom of character
60 orr r1, r1, #7
61 ldrb r7, [r6, r1]
62 teq r4, #8
63 beq Lrow8bpplp
64@
65@ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
66@
67Lrow4bpplp:
68 ldr r7, [lr, r7, lsl #2]
69 mul r7, r2, r7
70 sub r1, r1, #1 @ avoid using r7 directly after
71 str r7, [r0, -r5]!
72 ldrb r7, [r6, r1]
73 ldr r7, [lr, r7, lsl #2]
74 mul r7, r2, r7
75 tst r1, #7 @ avoid using r7 directly after
76 str r7, [r0, -r5]!
77 subne r1, r1, #1
78 ldrneb r7, [r6, r1]
79 bne Lrow4bpplp
80 LOADREGS(fd, sp!, {r4 - r7, pc})
81
82@
83@ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
84@
85Lrow8bpplp:
86 mov ip, r7, lsr #4
87 ldr ip, [lr, ip, lsl #2]
88 mul r4, r2, ip
89 and ip, r7, #15 @ avoid r4
90 ldr ip, [lr, ip, lsl #2] @ avoid r4
91 mul ip, r2, ip @ avoid r4
92 sub r1, r1, #1 @ avoid ip
93 sub r0, r0, r5 @ avoid ip
94 stmia r0, {r4, ip}
95 ldrb r7, [r6, r1]
96 mov ip, r7, lsr #4
97 ldr ip, [lr, ip, lsl #2]
98 mul r4, r2, ip
99 and ip, r7, #15 @ avoid r4
100 ldr ip, [lr, ip, lsl #2] @ avoid r4
101 mul ip, r2, ip @ avoid r4
102 tst r1, #7 @ avoid ip
103 sub r0, r0, r5 @ avoid ip
104 stmia r0, {r4, ip}
105 subne r1, r1, #1
106 ldrneb r7, [r6, r1]
107 bne Lrow8bpplp
108 LOADREGS(fd, sp!, {r4 - r7, pc})
109
110@
111@ Smashable regs: {r0 - r3}, [r4], {r5, r6}, [r7], (r8 - fp), [ip], (sp), [lr], (pc)
112@
113Lrow1bpp:
114 add r6, r6, r1
115 ldmia r6, {r4, r7}
116 strb r4, [r0], r5
117 mov r4, r4, lsr #8
118 strb r4, [r0], r5
119 mov r4, r4, lsr #8
120 strb r4, [r0], r5
121 mov r4, r4, lsr #8
122 strb r4, [r0], r5
123 strb r7, [r0], r5
124 mov r7, r7, lsr #8
125 strb r7, [r0], r5
126 mov r7, r7, lsr #8
127 strb r7, [r0], r5
128 mov r7, r7, lsr #8
129 strb r7, [r0], r5
130 LOADREGS(fd, sp!, {r4 - r7, pc})
131
132 .bss
133ENTRY(con_charconvtable)
134 .space 1024