ll_char_wr.S 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  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. @ Regs: [] = corruptible
  16. @ {} = used
  17. @ () = do not use
  18. #include <linux/linkage.h>
  19. #include <asm/assembler.h>
  20. .text
  21. LC0: .word LC0
  22. .word bytes_per_char_h
  23. .word video_size_row
  24. .word acorndata_8x8
  25. .word con_charconvtable
  26. /*
  27. * r0 = ptr
  28. * r1 = char
  29. * r2 = white
  30. */
  31. ENTRY(ll_write_char)
  32. stmfd sp!, {r4 - r7, lr}
  33. @
  34. @ Smashable regs: {r0 - r3}, [r4 - r7], (r8 - fp), [ip], (sp), [lr], (pc)
  35. @
  36. /*
  37. * calculate offset into character table
  38. */
  39. mov r1, r1, lsl #3
  40. /*
  41. * calculate offset required for each row.
  42. */
  43. adr ip, LC0
  44. ldmia ip, {r3, r4, r5, r6, lr}
  45. sub ip, ip, r3
  46. add r6, r6, ip
  47. add lr, lr, ip
  48. ldr r4, [r4, ip]
  49. ldr r5, [r5, ip]
  50. /*
  51. * Go to resolution-dependent routine...
  52. */
  53. cmp r4, #4
  54. blt Lrow1bpp
  55. add r0, r0, r5, lsl #3 @ Move to bottom of character
  56. orr r1, r1, #7
  57. ldrb r7, [r6, r1]
  58. teq r4, #8
  59. beq Lrow8bpplp
  60. @
  61. @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
  62. @
  63. Lrow4bpplp:
  64. ldr r7, [lr, r7, lsl #2]
  65. mul r7, r2, r7
  66. sub r1, r1, #1 @ avoid using r7 directly after
  67. str r7, [r0, -r5]!
  68. ldrb r7, [r6, r1]
  69. ldr r7, [lr, r7, lsl #2]
  70. mul r7, r2, r7
  71. tst r1, #7 @ avoid using r7 directly after
  72. str r7, [r0, -r5]!
  73. subne r1, r1, #1
  74. ldrneb r7, [r6, r1]
  75. bne Lrow4bpplp
  76. ldmfd sp!, {r4 - r7, pc}
  77. @
  78. @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
  79. @
  80. Lrow8bpplp:
  81. mov ip, r7, lsr #4
  82. ldr ip, [lr, ip, lsl #2]
  83. mul r4, r2, ip
  84. and ip, r7, #15 @ avoid r4
  85. ldr ip, [lr, ip, lsl #2] @ avoid r4
  86. mul ip, r2, ip @ avoid r4
  87. sub r1, r1, #1 @ avoid ip
  88. sub r0, r0, r5 @ avoid ip
  89. stmia r0, {r4, ip}
  90. ldrb r7, [r6, r1]
  91. mov ip, r7, lsr #4
  92. ldr ip, [lr, ip, lsl #2]
  93. mul r4, r2, ip
  94. and ip, r7, #15 @ avoid r4
  95. ldr ip, [lr, ip, lsl #2] @ avoid r4
  96. mul ip, r2, ip @ avoid r4
  97. tst r1, #7 @ avoid ip
  98. sub r0, r0, r5 @ avoid ip
  99. stmia r0, {r4, ip}
  100. subne r1, r1, #1
  101. ldrneb r7, [r6, r1]
  102. bne Lrow8bpplp
  103. ldmfd sp!, {r4 - r7, pc}
  104. @
  105. @ Smashable regs: {r0 - r3}, [r4], {r5, r6}, [r7], (r8 - fp), [ip], (sp), [lr], (pc)
  106. @
  107. Lrow1bpp:
  108. add r6, r6, r1
  109. ldmia r6, {r4, r7}
  110. strb r4, [r0], r5
  111. mov r4, r4, lsr #8
  112. strb r4, [r0], r5
  113. mov r4, r4, lsr #8
  114. strb r4, [r0], r5
  115. mov r4, r4, lsr #8
  116. strb r4, [r0], r5
  117. strb r7, [r0], r5
  118. mov r7, r7, lsr #8
  119. strb r7, [r0], r5
  120. mov r7, r7, lsr #8
  121. strb r7, [r0], r5
  122. mov r7, r7, lsr #8
  123. strb r7, [r0], r5
  124. ldmfd sp!, {r4 - r7, pc}
  125. .bss
  126. ENTRY(con_charconvtable)
  127. .space 1024