blit.s 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. @ vim:filetype=armasm
  2. @ some color conversion and blitting routines
  3. @ (c) Copyright 2006, notaz
  4. @ All Rights Reserved
  5. @ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
  6. @ to 00000000 rrr00000 ggg00000 bbb00000 ...
  7. @ lr = 0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin
  8. @ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)
  9. .macro convRGB32_2 rin sh=0
  10. and r2, lr, \rin, lsr #4 @ blue
  11. and r3, \rin, lr
  12. orr r2, r2, r3, lsl #8 @ g0b0g0b0
  13. mov r3, r2, lsl #16 @ g0b00000
  14. and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)
  15. orr r3, r3, \rin, lsr #16 @ g0b000r0
  16. .if \sh == 1
  17. mov r3, r3, ror #17 @ shadow mode
  18. .elseif \sh == 2
  19. adds r3, r3, #0x40000000 @ green
  20. orrcs r3, r3, #0xe0000000
  21. mov r3, r3, ror #8
  22. adds r3, r3, #0x40000000
  23. orrcs r3, r3, #0xe0000000
  24. mov r3, r3, ror #16
  25. adds r3, r3, #0x40000000
  26. orrcs r3, r3, #0xe0000000
  27. mov r3, r3, ror #24
  28. orr r3, r3, r3, lsr #3
  29. .else
  30. mov r3, r3, ror #16 @ r3=low
  31. orr r3, r3, r3, lsr #3
  32. .endif
  33. str r3, [r0], #4
  34. mov r2, r2, lsr #16
  35. orr r2, r2, \rin, lsl #16
  36. .if \sh == 1
  37. mov r2, r2, lsr #1
  38. .elseif \sh == 2
  39. mov r2, r2, ror #8
  40. adds r2, r2, #0x40000000 @ blue
  41. orrcs r2, r2, #0xe0000000
  42. mov r2, r2, ror #8
  43. adds r2, r2, #0x40000000
  44. orrcs r2, r2, #0xe0000000
  45. mov r2, r2, ror #8
  46. adds r2, r2, #0x40000000
  47. orrcs r2, r2, #0xe0000000
  48. mov r2, r2, ror #8
  49. orr r2, r2, r2, lsr #3
  50. .else
  51. orr r2, r2, r2, lsr #3
  52. .endif
  53. str r2, [r0], #4
  54. .endm
  55. .global vidConvCpyRGB32 @ void *to, void *from, int pixels
  56. vidConvCpyRGB32:
  57. stmfd sp!, {r4-r7,lr}
  58. mov r12, r2, lsr #3 @ repeats
  59. mov lr, #0x00e00000
  60. orr lr, lr, #0x00e0
  61. .loopRGB32:
  62. subs r12, r12, #1
  63. ldmia r1!, {r4-r7}
  64. convRGB32_2 r4
  65. convRGB32_2 r5
  66. convRGB32_2 r6
  67. convRGB32_2 r7
  68. bgt .loopRGB32
  69. ldmfd sp!, {r4-r7,lr}
  70. bx lr
  71. .global vidConvCpyRGB32sh @ void *to, void *from, int pixels
  72. vidConvCpyRGB32sh:
  73. stmfd sp!, {r4-r7,lr}
  74. mov r12, r2, lsr #3 @ repeats
  75. mov lr, #0x00e00000
  76. orr lr, lr, #0x00e0
  77. .loopRGB32sh:
  78. subs r12, r12, #1
  79. ldmia r1!, {r4-r7}
  80. convRGB32_2 r4, 1
  81. convRGB32_2 r5, 1
  82. convRGB32_2 r6, 1
  83. convRGB32_2 r7, 1
  84. bgt .loopRGB32sh
  85. ldmfd sp!, {r4-r7,lr}
  86. bx lr
  87. .global vidConvCpyRGB32hi @ void *to, void *from, int pixels
  88. vidConvCpyRGB32hi:
  89. stmfd sp!, {r4-r7,lr}
  90. mov r12, r2, lsr #3 @ repeats
  91. mov lr, #0x00e00000
  92. orr lr, lr, #0x00e0
  93. .loopRGB32hi:
  94. ldmia r1!, {r4-r7}
  95. convRGB32_2 r4, 2
  96. convRGB32_2 r5, 2
  97. convRGB32_2 r6, 2
  98. convRGB32_2 r7, 2
  99. subs r12, r12, #1
  100. bgt .loopRGB32hi
  101. ldmfd sp!, {r4-r7,lr}
  102. bx lr
  103. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  104. @ -------- M2 stuff ---------
  105. /*
  106. .global vidConvCpy_90 @ void *to, void *from, int width
  107. vidConvCpy_90:
  108. stmfd sp!, {r4-r10,lr}
  109. mov lr, #0x00F00000
  110. orr lr, lr, #0x00F0
  111. mov r12, #224/4 @ row counter
  112. mov r10, r2, lsl #2 @ we do 2 pixel wide copies
  113. add r8, r0, #256*4 @ parallel line
  114. add r1, r1, #0x23000
  115. add r1, r1, #0x00B80 @ r1+=328*223*2+8*2
  116. mov r9, r1
  117. mov r4, #0 @ fill bottom border
  118. mov r5, #0
  119. mov r6, #0
  120. mov r7, #0
  121. stmia r0!, {r4-r7}
  122. stmia r0!, {r4-r7}
  123. stmia r8!, {r4-r7}
  124. stmia r8!, {r4-r7}
  125. .loopM2RGB32_90:
  126. subs r12, r12, #1
  127. @ at first this loop was written differently: src pixels were fetched with ldm's and
  128. @ dest was not sequential. It ran nearly 2 times slower. It seems it is very important
  129. @ to do sequential memory access on those items, which we have more (to offload addressing bus?).
  130. ldr r4, [r1], #-328*2
  131. ldr r5, [r1], #-328*2
  132. ldr r6, [r1], #-328*2
  133. ldr r7, [r1], #-328*2
  134. convRGB32_2 r4, 1
  135. convRGB32_2 r5, 1
  136. convRGB32_2 r6, 1
  137. convRGB32_2 r7, 1
  138. str r4, [r8], #4
  139. str r5, [r8], #4
  140. str r6, [r8], #4
  141. str r7, [r8], #4
  142. bne .loopM2RGB32_90
  143. mov r4, #0 @ top border
  144. mov r5, #0
  145. mov r6, #0
  146. stmia r0!, {r4-r6,r12}
  147. stmia r0!, {r4-r6,r12}
  148. stmia r8!, {r4-r6,r12}
  149. stmia r8!, {r4-r6,r12}
  150. subs r10, r10, #1
  151. ldmeqfd sp!, {r4-r10,pc} @ return
  152. add r0, r8, #16*4 @ set new dst pointer
  153. add r8, r0, #256*4
  154. add r9, r9, #2*2 @ fix src pointer
  155. mov r1, r9
  156. stmia r0!, {r4-r6,r12} @ bottom border
  157. stmia r0!, {r4-r6,r12}
  158. stmia r8!, {r4-r6,r12}
  159. stmia r8!, {r4-r6,r12}
  160. mov r12, #224/4 @ restore row counter
  161. b .loopM2RGB32_90
  162. @ converter for vidConvCpy_270
  163. @ lr = 0x00F000F0, out: r3=lower_pix, r2=higher_pix; trashes rin
  164. .macro convRGB32_3 rin
  165. and r2, lr, \rin, lsr #4 @ blue
  166. and r3, \rin, lr
  167. orr r2, r2, r3, lsl #8 @ g0b0g0b0
  168. mov r3, r2, lsl #16 @ g0b00000
  169. and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)
  170. orr r3, r3, \rin, lsr #16 @ g0b000r0
  171. mov r2, r2, lsr #16
  172. orr r2, r2, \rin, lsl #16
  173. str r2, [r0], #4
  174. mov \rin,r3, ror #16 @ r3=low
  175. .endm
  176. */
  177. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  178. @ takes byte-sized pixels from r3-r6, fetches from pal and stores to r7,r8,r10,lr
  179. @ r2=pal
  180. .macro mode2_4pix shift
  181. and r7, r11, r3, lsr #\shift
  182. ldr r7, [r2, r7, lsl #2]
  183. and r8, r11, r4, lsr #\shift
  184. ldr r8, [r2, r8, lsl #2]
  185. and r10,r11, r5, lsr #\shift
  186. ldr r10,[r2, r10,lsl #2]
  187. and lr, r11, r6, lsr #\shift
  188. ldr lr, [r2, lr, lsl #2]
  189. .endm
  190. @ r2=pal, r11=0xff
  191. .macro mode2_4pix_getpix0 dreg sreg
  192. and \dreg, r11, \sreg
  193. ldr \dreg, [r2, \dreg, lsl #2]
  194. .endm
  195. .macro mode2_4pix_getpix1 dreg sreg
  196. and \dreg, r11, \sreg, lsr #8
  197. ldr \dreg, [r2, \dreg, lsl #2]
  198. .endm
  199. .macro mode2_4pix_getpix2 dreg sreg
  200. and \dreg, r11, \sreg, lsr #16
  201. ldr \dreg, [r2, \dreg, lsl #2]
  202. .endm
  203. .macro mode2_4pix_getpix3 dreg sreg
  204. and \dreg, r11, \sreg, lsr #24
  205. ldr \dreg, [r2, \dreg, lsl #2]
  206. .endm
  207. @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r6
  208. @ r11=0xFF, r2=pal
  209. .macro mode2_4pix2_0 reg
  210. mode2_4pix_getpix0 r3, \reg
  211. mode2_4pix_getpix1 r4, \reg
  212. mode2_4pix_getpix2 r5, \reg
  213. mode2_4pix_getpix3 r6, \reg
  214. .endm
  215. @ ...
  216. .macro mode2_4pix2_180 reg
  217. mode2_4pix_getpix3 r3, \reg
  218. mode2_4pix_getpix2 r4, \reg
  219. mode2_4pix_getpix1 r5, \reg
  220. mode2_4pix_getpix0 r6, \reg
  221. .endm
  222. @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r5
  223. @ r11=0xFF, r2=pal, r10=0xfcfcfc, r6=tmp
  224. .macro mode2_4pix_to3 reg is180
  225. .if \is180
  226. mode2_4pix_getpix3 r3, \reg
  227. mode2_4pix_getpix2 r4, \reg
  228. .else
  229. mode2_4pix_getpix0 r3, \reg @ gathering loads cause a weird-hang
  230. mode2_4pix_getpix1 r4, \reg
  231. .endif
  232. sub r3, r3, r3, lsr #2 @ r3 *= 0.75
  233. add r3, r3, r4, lsr #2 @ r3 += r4 * 0.25
  234. and r3, r3, r10
  235. .if \is180
  236. mode2_4pix_getpix1 r5, \reg
  237. mode2_4pix_getpix0 r6, \reg
  238. .else
  239. mode2_4pix_getpix2 r5, \reg
  240. mode2_4pix_getpix3 r6, \reg
  241. .endif
  242. mov r4, r4, lsr #1
  243. add r4, r4, r5, lsr #1 @ r4 = (r4 + r5) / 2;
  244. @ and r4, r4, r10
  245. sub r6, r6, r6, lsr #2 @ r6 *= 0.75
  246. add r5, r6, r5, lsr #2 @ r5 = r6 + r5 * 0.25
  247. and r5, r5, r10
  248. .endm
  249. @ void *to, void *from, void *pal, int width
  250. .macro vidConvCpyM2_landscape is270
  251. stmfd sp!, {r4-r11,lr}
  252. mov r11, #0xff
  253. mov r12, #(224/4-1)<<16 @ row counter
  254. orr r12, r12, r3, lsl #1 @ we do 4 pixel wide copies (right to left)
  255. .if \is270
  256. add r1, r1, #324
  257. .else
  258. add r1, r1, #0x11c00
  259. add r1, r1, #0x00308 @ 328*224+8
  260. .endif
  261. mov r9, r1
  262. mov r3, #0 @ fill top border
  263. mov r4, #0
  264. mov r5, #0
  265. mov r6, #0
  266. stmia r0!, {r3-r6}
  267. stmia r0!, {r3-r6}
  268. add r7, r0, #256*4-8*4
  269. stmia r7!, {r3-r6}
  270. stmia r7!, {r3-r6}
  271. add r7, r7, #256*4-8*4
  272. stmia r7!, {r3-r6}
  273. stmia r7!, {r3-r6}
  274. add r7, r7, #256*4-8*4
  275. stmia r7!, {r3-r6}
  276. stmia r7!, {r3-r6}
  277. 0: @ .loopM2RGB32_270:
  278. subs r12, r12, #1<<16
  279. .if \is270
  280. ldr r3, [r1], #328
  281. ldr r4, [r1], #328
  282. ldr r5, [r1], #328
  283. ldr r6, [r1], #328
  284. .else
  285. ldr r3, [r1, #-328]!
  286. ldr r4, [r1, #-328]!
  287. ldr r5, [r1, #-328]!
  288. ldr r6, [r1, #-328]!
  289. .endif
  290. .if \is270
  291. mode2_4pix 24
  292. .else
  293. mode2_4pix 0
  294. .endif
  295. stmia r0, {r7,r8,r10,lr}
  296. add r0, r0, #256*4
  297. .if \is270
  298. mode2_4pix 16
  299. .else
  300. mode2_4pix 8
  301. .endif
  302. stmia r0, {r7,r8,r10,lr}
  303. add r0, r0, #256*4
  304. .if \is270
  305. mode2_4pix 8
  306. .else
  307. mode2_4pix 16
  308. .endif
  309. stmia r0, {r7,r8,r10,lr}
  310. add r0, r0, #256*4
  311. .if \is270
  312. mode2_4pix 0
  313. .else
  314. mode2_4pix 24
  315. .endif
  316. stmia r0!,{r7,r8,r10,lr}
  317. sub r0, r0, #256*4*3
  318. bpl 0b @ .loopM2RGB32_270
  319. mov r3, #0 @ bottom border
  320. mov r4, #0
  321. mov r5, #0
  322. mov r6, #0
  323. stmia r0!, {r3-r6}
  324. stmia r0!, {r3-r6}
  325. add r0, r0, #256*4-8*4
  326. stmia r0!, {r3-r6}
  327. stmia r0!, {r3-r6}
  328. add r0, r0, #256*4-8*4
  329. stmia r0!, {r3-r6}
  330. stmia r0!, {r3-r6}
  331. add r0, r0, #256*4-8*4
  332. stmia r0!, {r3-r6}
  333. nop @ phone crashes if this is commented out. Do I stress it too much?
  334. stmia r0!, {r3-r6}
  335. add r12, r12, #1<<16
  336. subs r12, r12, #1
  337. ldmeqfd sp!, {r4-r11,pc} @ return
  338. add r0, r0, #16*4
  339. .if \is270
  340. sub r9, r9, #4 @ fix src pointer
  341. .else
  342. add r9, r9, #4
  343. .endif
  344. mov r1, r9
  345. stmia r0!, {r3-r6} @ top border
  346. stmia r0!, {r3-r6}
  347. add r7, r0, #256*4-8*4
  348. stmia r7!, {r3-r6}
  349. stmia r7!, {r3-r6}
  350. add r7, r7, #256*4-8*4
  351. stmia r7!, {r3-r6}
  352. stmia r7!, {r3-r6}
  353. add r7, r7, #256*4-8*4
  354. stmia r7!, {r3-r6}
  355. stmia r7!, {r3-r6}
  356. orr r12, r12, #(224/4-1)<<16 @ restore row counter
  357. b 0b @ .loopM2RGB32_270
  358. .endm
  359. .global vidConvCpy_90 @ void *to, void *from, void *pal, int width
  360. vidConvCpy_90:
  361. vidConvCpyM2_landscape 0
  362. .global vidConvCpy_270 @ void *to, void *from, void *pal, int width
  363. vidConvCpy_270:
  364. vidConvCpyM2_landscape 1
  365. .global vidConvCpy_center_0 @ void *to, void *from, void *pal
  366. vidConvCpy_center_0:
  367. stmfd sp!, {r4-r6,r11,lr}
  368. mov r11, #0xff
  369. add r1, r1, #8 @ not border (centering 32col here)
  370. mov r12, #(240/4-1)<<16
  371. orr r12, r12, #224
  372. .loopRGB32_c0:
  373. ldr lr, [r1], #4
  374. subs r12, r12, #1<<16
  375. mode2_4pix2_0 lr
  376. stmia r0!, {r3-r6}
  377. bpl .loopRGB32_c0
  378. sub r12, r12, #1
  379. adds r12, r12, #1<<16
  380. ldmeqfd sp!, {r4-r6,r11,pc} @ return
  381. add r0, r0, #16*4
  382. add r1, r1, #88
  383. orr r12, #(240/4-1)<<16
  384. b .loopRGB32_c0
  385. .global vidConvCpy_center_180 @ void *to, void *from, void *pal
  386. vidConvCpy_center_180:
  387. stmfd sp!, {r4-r6,r11,lr}
  388. mov r11, #0xff
  389. add r1, r1, #0x11c00
  390. add r1, r1, #0x002B8 @ #328*224-72
  391. mov r12, #(240/4-1)<<16
  392. orr r12, r12, #224
  393. .loopRGB32_c180:
  394. ldr lr, [r1, #-4]!
  395. subs r12, r12, #1<<16
  396. mode2_4pix2_180 lr
  397. stmia r0!, {r3-r6}
  398. bpl .loopRGB32_c180
  399. sub r12, r12, #1
  400. adds r12, r12, #1<<16
  401. ldmeqfd sp!, {r4-r6,r11,pc} @ return
  402. add r0, r0, #16*4
  403. sub r1, r1, #88
  404. orr r12, #(240/4-1)<<16
  405. b .loopRGB32_c180
  406. @ note: the following code assumes that (pal[x] & 0x030303) == 0
  407. .global vidConvCpy_center2_40c_0 @ void *to, void *from, void *pal, int lines
  408. vidConvCpy_center2_40c_0:
  409. stmfd sp!, {r4-r6,r10,r11,lr}
  410. mov r11, #0xff
  411. mov r10, #0xfc
  412. orr r10, r10, lsl #8
  413. orr r10, r10, lsl #8
  414. add r1, r1, #8 @ border
  415. mov r12, #(240/3-1)<<16
  416. orr r12, r12, r3
  417. .loopRGB32_c2_40c_0:
  418. ldr lr, [r1], #4
  419. subs r12, r12, #1<<16
  420. mode2_4pix_to3 lr, 0
  421. stmia r0!, {r3-r5}
  422. bpl .loopRGB32_c2_40c_0
  423. sub r12, r12, #1
  424. adds r12, r12, #1<<16
  425. ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return
  426. add r0, r0, #16*4
  427. add r1, r1, #8
  428. orr r12, #(240/3-1)<<16
  429. b .loopRGB32_c2_40c_0
  430. .global vidConvCpy_center2_40c_180 @ void *to, void *from, void *pal, int lines
  431. vidConvCpy_center2_40c_180:
  432. stmfd sp!, {r4-r6,r10,r11,lr}
  433. mov r11, #0xff
  434. mov r10, #0xfc
  435. orr r10, r10, lsl #8
  436. orr r10, r10, lsl #8
  437. mov r4, #328
  438. mla r1, r3, r4, r1
  439. @ add r1, r1, #0x11000
  440. @ add r1, r1, #0x00f00 @ #328*224
  441. mov r12, #(240/3-1)<<16
  442. orr r12, r12, r3
  443. .loop_c2_40c_180:
  444. ldr lr, [r1, #-4]!
  445. subs r12, r12, #1<<16
  446. mode2_4pix_to3 lr, 1
  447. stmia r0!, {r3-r5}
  448. bpl .loop_c2_40c_180
  449. sub r12, r12, #1
  450. adds r12, r12, #1<<16
  451. ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return
  452. add r0, r0, #16*4
  453. sub r1, r1, #8
  454. orr r12, #(240/3-1)<<16
  455. b .loop_c2_40c_180
  456. .global vidConvCpy_center2_32c_0 @ void *to, void *from, void *pal, int lines
  457. vidConvCpy_center2_32c_0:
  458. stmfd sp!, {r4-r11,lr}
  459. mov r10, #0xfc
  460. orr r10, r10, lsl #8
  461. orr r10, r10, lsl #8
  462. mov r11, #0xff
  463. add r1, r1, #8 @ border
  464. mov r12, #(240/15-1)<<16
  465. orr r12, r12, r3
  466. .loop_c2_32c_0:
  467. ldmia r1!, {r7-r9,lr}
  468. subs r12, r12, #1<<16
  469. mode2_4pix2_0 r7
  470. stmia r0!, {r3-r6}
  471. mode2_4pix2_0 r8
  472. stmia r0!, {r3-r6}
  473. mode2_4pix2_0 r9
  474. stmia r0!, {r3-r6}
  475. mode2_4pix_to3 lr, 0
  476. stmia r0!, {r3-r5}
  477. bpl .loop_c2_32c_0
  478. sub r12, r12, #1
  479. adds r12, r12, #1<<16
  480. ldmeqfd sp!, {r4-r11,pc} @ return
  481. add r0, r0, #16*4
  482. add r1, r1, #64+8
  483. orr r12, #(240/15-1)<<16
  484. b .loop_c2_32c_0
  485. .global vidConvCpy_center2_32c_180 @ void *to, void *from, void *pal, int lines
  486. vidConvCpy_center2_32c_180:
  487. stmfd sp!, {r4-r11,lr}
  488. mov r10, #0xfc
  489. orr r10, r10, lsl #8
  490. orr r10, r10, lsl #8
  491. mov r11, #0xff
  492. mov r4, #328
  493. mla r1, r3, r4, r1
  494. @ add r1, r1, #0x11000
  495. @ add r1, r1, #0x00f00 @ #328*224
  496. mov r12, #(240/15-1)<<16
  497. orr r12, r12, r3
  498. .loop_c2_32c_180:
  499. ldmdb r1!, {r7-r9,lr}
  500. subs r12, r12, #1<<16
  501. mode2_4pix2_180 lr
  502. stmia r0!, {r3-r6}
  503. mode2_4pix2_180 r9
  504. stmia r0!, {r3-r6}
  505. mode2_4pix2_180 r8
  506. stmia r0!, {r3-r6}
  507. mode2_4pix_to3 r7, 1
  508. stmia r0!, {r3-r5}
  509. bpl .loop_c2_32c_180
  510. sub r12, r12, #1
  511. adds r12, r12, #1<<16
  512. ldmeqfd sp!, {r4-r11,pc} @ return
  513. add r0, r0, #16*4
  514. sub r1, r1, #64+8
  515. orr r12, #(240/15-1)<<16
  516. b .loop_c2_32c_180
  517. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  518. .global vidClear @ void *to, int lines
  519. vidClear:
  520. stmfd sp!, {lr}
  521. mov r12, #240/16-1
  522. orr r12, r1, r12, lsl #16
  523. mov r1, #0
  524. mov r2, #0
  525. mov r3, #0
  526. mov lr, #0
  527. .loopVidClear:
  528. subs r12, r12, #1<<16
  529. stmia r0!, {r1-r3,lr}
  530. stmia r0!, {r1-r3,lr}
  531. stmia r0!, {r1-r3,lr}
  532. stmia r0!, {r1-r3,lr}
  533. bpl .loopVidClear
  534. sub r12, r12, #1
  535. adds r12, r12, #1<<16
  536. ldmeqfd sp!, {pc} @ return
  537. add r0, r0, #16*4
  538. orr r12, #(240/16-1)<<16
  539. b .loopVidClear
  540. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  541. .equ EExecSetExceptionHandler, (90)
  542. .global my_SetExceptionHandler
  543. my_SetExceptionHandler:
  544. mov ip, lr
  545. swi EExecSetExceptionHandler