| 1 | @ ScummVM Scumm Interpreter |
| 2 | @ Copyright (C) 2007 The ScummVM project |
| 3 | @ |
| 4 | @ This program is free software@ you can redistribute it and/or |
| 5 | @ modify it under the terms of the GNU General Public License |
| 6 | @ as published by the Free Software Foundation@ either version 2 |
| 7 | @ of the License, or (at your option) any later version. |
| 8 | @ |
| 9 | @ This program is distributed in the hope that it will be useful, |
| 10 | @ but WITHOUT ANY WARRANTY@ without even the implied warranty of |
| 11 | @ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | @ GNU General Public License for more details. |
| 13 | @ |
| 14 | @ You should have received a copy of the GNU General Public License |
| 15 | @ along with this program@ if not, write to the Free Software |
| 16 | @ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 17 | @ |
| 18 | @ $URL: $ |
| 19 | @ $Id: $ |
| 20 | @ |
| 21 | @ @author Robin Watts (robin@wss.co.uk) |
| 22 | |
| 23 | .text |
| 24 | |
| 25 | .global ARM_CopyRate_M |
| 26 | .global ARM_CopyRate_S |
| 27 | .global ARM_CopyRate_R |
| 28 | .global ARM_SimpleRate_M |
| 29 | .global ARM_SimpleRate_S |
| 30 | .global ARM_SimpleRate_R |
| 31 | .global ARM_LinearRate_M |
| 32 | .global ARM_LinearRate_S |
| 33 | .global ARM_LinearRate_R |
| 34 | |
| 35 | ARM_CopyRate_M: |
| 36 | @ r0 = len |
| 37 | @ r1 = obuf |
| 38 | @ r2 = vol_l |
| 39 | @ r3 = vol_r |
| 40 | @ <> = ptr |
| 41 | LDR r12,[r13] |
| 42 | STMFD r13!,{r4-r7,r14} |
| 43 | |
| 44 | MOV r14,#0 @ r14= 0 |
| 45 | MOV r2,r2,LSL #8 |
| 46 | MOV r3,r3,LSL #8 |
| 47 | CopyRate_M_loop: |
| 48 | LDRSH r5, [r12], #2 @ r5 = tmp0 = tmp1 = *ptr++ |
| 49 | LDRSH r6, [r1] @ r6 = obuf[0] |
| 50 | LDRSH r7, [r1, #2] @ r7 = obuf[1] |
| 51 | MUL r4, r2, r5 @ r4 = tmp0*vol_l |
| 52 | MUL r5, r3, r5 @ r5 = tmp1*vol_r |
| 53 | |
| 54 | ADDS r6, r4, r6, LSL #16 |
| 55 | RSCVS r6, r14,#1<<31 |
| 56 | ADDS r7, r5, r7, LSL #16 |
| 57 | RSCVS r7, r14,#1<<31 |
| 58 | |
| 59 | MOV r6, r6, LSR #16 |
| 60 | MOV r7, r7, LSR #16 |
| 61 | |
| 62 | STRH r6, [r1], #2 |
| 63 | STRH r7, [r1], #2 |
| 64 | |
| 65 | SUBS r0,r0,#1 |
| 66 | BGT CopyRate_M_loop |
| 67 | |
| 68 | LDMFD r13!,{r4-r7,PC} |
| 69 | |
| 70 | ARM_CopyRate_S: |
| 71 | @ r0 = len |
| 72 | @ r1 = obuf |
| 73 | @ r2 = vol_l |
| 74 | @ r3 = vol_r |
| 75 | @ <> = ptr |
| 76 | LDR r12,[r13] |
| 77 | STMFD r13!,{r4-r7,r14} |
| 78 | |
| 79 | MOV r14,#0 @ r14= 0 |
| 80 | MOV r2,r2,LSL #8 |
| 81 | MOV r3,r3,LSL #8 |
| 82 | CopyRate_S_loop: |
| 83 | LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ |
| 84 | LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ |
| 85 | LDRSH r6, [r1] @ r6 = obuf[0] |
| 86 | LDRSH r7, [r1,#2] @ r7 = obuf[1] |
| 87 | MUL r4, r2, r4 @ r5 = tmp0*vol_l |
| 88 | MUL r5, r3, r5 @ r6 = tmp1*vol_r |
| 89 | |
| 90 | ADDS r6, r4, r6, LSL #16 |
| 91 | RSCVS r6, r14,#1<<31 |
| 92 | ADDS r7, r5, r7, LSL #16 |
| 93 | RSCVS r7, r14,#1<<31 |
| 94 | |
| 95 | MOV r6, r6, LSR #16 |
| 96 | MOV r7, r7, LSR #16 |
| 97 | |
| 98 | STRH r6, [r1],#2 |
| 99 | STRH r7, [r1],#2 |
| 100 | |
| 101 | SUBS r0,r0,#2 |
| 102 | BGT CopyRate_S_loop |
| 103 | |
| 104 | LDMFD r13!,{r4-r7,PC} |
| 105 | |
| 106 | ARM_CopyRate_R: |
| 107 | @ r0 = len |
| 108 | @ r1 = obuf |
| 109 | @ r2 = vol_l |
| 110 | @ r3 = vol_r |
| 111 | @ <> = ptr |
| 112 | LDR r12,[r13] |
| 113 | STMFD r13!,{r4-r7,r14} |
| 114 | |
| 115 | MOV r14,#0 @ r14= 0 |
| 116 | MOV r2,r2,LSL #8 |
| 117 | MOV r3,r3,LSL #8 |
| 118 | CopyRate_R_loop: |
| 119 | LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ |
| 120 | LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ |
| 121 | LDRSH r6, [r1] @ r6 = obuf[0] |
| 122 | LDRSH r7, [r1,#2] @ r7 = obuf[1] |
| 123 | MUL r4, r2, r4 @ r4 = tmp0*vol_l |
| 124 | MUL r5, r3, r5 @ r5 = tmp1*vol_r |
| 125 | |
| 126 | ADDS r6, r4, r6, LSL #16 |
| 127 | RSCVS r6, r14,#1<<31 |
| 128 | ADDS r7, r5, r7, LSL #16 |
| 129 | RSCVS r7, r14,#1<<31 |
| 130 | |
| 131 | MOV r6, r6, LSR #16 |
| 132 | MOV r7, r7, LSR #16 |
| 133 | |
| 134 | STRH r6, [r1],#2 |
| 135 | STRH r7, [r1],#2 |
| 136 | |
| 137 | SUBS r0,r0,#2 |
| 138 | BGT CopyRate_R_loop |
| 139 | |
| 140 | LDMFD r13!,{r4-r7,PC} |
| 141 | |
| 142 | ARM_SimpleRate_M: |
| 143 | @ r0 = AudioStream &input |
| 144 | @ r1 = input.readBuffer |
| 145 | @ r2 = input->sr |
| 146 | @ r3 = obuf |
| 147 | @ <> = osamp |
| 148 | @ <> = vol_l |
| 149 | @ <> = vol_r |
| 150 | MOV r12,r13 |
| 151 | STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} |
| 152 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 153 | @ r12= vol_l |
| 154 | @ r14= vol_r |
| 155 | LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr |
| 156 | @ r1 = inLen |
| 157 | @ r2 = opos |
| 158 | @ r8 = opos_inc |
| 159 | CMP r11,#0 @ if (osamp <= 0) |
| 160 | BLE SimpleRate_M_end @ bale |
| 161 | MOV r10,#0 |
| 162 | MOV r12,r12,LSL #8 |
| 163 | MOV r14,r14,LSL #8 |
| 164 | SimpleRate_M_loop: |
| 165 | SUBS r1, r1, #1 @ r1 = inLen -= 1 |
| 166 | BLT SimpleRate_M_read |
| 167 | SUBS r2, r2, #1 @ r2 = opos-- |
| 168 | ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ and loop } |
| 169 | BGE SimpleRate_M_loop |
| 170 | SimpleRate_M_read_return: |
| 171 | LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ |
| 172 | LDRSH r6, [r3] @ r6 = obuf[0] |
| 173 | LDRSH r7, [r3,#2] @ r7 = obuf[1] |
| 174 | ADD r2, r2, r8 @ r2 = opos += opos_inc |
| 175 | MUL r4, r12,r5 @ r4 = tmp0*vol_l |
| 176 | MUL r5, r14,r5 @ r5 = tmp1*vol_r |
| 177 | |
| 178 | ADDS r6, r4, r6, LSL #16 |
| 179 | RSCVS r6, r10,#1<<31 |
| 180 | ADDS r7, r5, r7, LSL #16 |
| 181 | RSCVS r7, r10,#1<<31 |
| 182 | |
| 183 | MOV r6, r6, LSR #16 |
| 184 | MOV r7, r7, LSR #16 |
| 185 | |
| 186 | STRH r6, [r3],#2 |
| 187 | STRH r7, [r3],#2 |
| 188 | |
| 189 | SUBS r11,r11,#1 |
| 190 | BGT SimpleRate_M_loop |
| 191 | SimpleRate_M_end: |
| 192 | LDR r14,[r13,#8] @ r14 = sr |
| 193 | ADD r13,r13,#12 |
| 194 | STMIA r14,{r0,r1,r2} |
| 195 | LDMFD r13!,{r4-r8,r10-r11,PC} |
| 196 | SimpleRate_M_read: |
| 197 | LDR r0, [r13,#4*2] @ r0 = sr |
| 198 | ADD r0, r0, #16 @ r0 = inPtr = inBuf |
| 199 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 200 | |
| 201 | MOV r1, r0 @ r1 = inBuf |
| 202 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 203 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 204 | |
| 205 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 206 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 207 | @ we have 3+8+5 = 16 things on the stack (an even number). |
| 208 | MOV r14,PC |
| 209 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 210 | SUBS r1, r0, #1 @ r1 = inLen-1 |
| 211 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 212 | BLT SimpleRate_M_end |
| 213 | SUBS r2, r2, #1 @ r2 = opos-- |
| 214 | ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ and loop } |
| 215 | BGE SimpleRate_M_loop |
| 216 | B SimpleRate_M_read_return |
| 217 | |
| 218 | |
| 219 | ARM_SimpleRate_S: |
| 220 | @ r0 = AudioStream &input |
| 221 | @ r1 = input.readBuffer |
| 222 | @ r2 = input->sr |
| 223 | @ r3 = obuf |
| 224 | @ <> = osamp |
| 225 | @ <> = vol_l |
| 226 | @ <> = vol_r |
| 227 | MOV r12,r13 |
| 228 | STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} |
| 229 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 230 | @ r12= vol_l |
| 231 | @ r14= vol_r |
| 232 | LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr |
| 233 | @ r1 = inLen |
| 234 | @ r2 = opos |
| 235 | @ r8 = opos_inc |
| 236 | CMP r11,#0 @ if (osamp <= 0) |
| 237 | BLE SimpleRate_S_end @ bale |
| 238 | MOV r10,#0 |
| 239 | MOV r12,r12,LSL #8 |
| 240 | MOV r14,r14,LSL #8 |
| 241 | SimpleRate_S_loop: |
| 242 | SUBS r1, r1, #2 @ r1 = inLen -= 2 |
| 243 | BLT SimpleRate_S_read |
| 244 | SUBS r2, r2, #1 @ r2 = opos-- |
| 245 | ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 and loop } |
| 246 | BGE SimpleRate_S_loop |
| 247 | SimpleRate_S_read_return: |
| 248 | LDRSH r4, [r0],#2 @ r4 = tmp0 = *inPtr++ |
| 249 | LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ |
| 250 | LDRSH r6, [r3] @ r6 = obuf[0] |
| 251 | LDRSH r7, [r3,#2] @ r7 = obuf[1] |
| 252 | ADD r2, r2, r8 @ r2 = opos += opos_inc |
| 253 | MUL r4, r12,r4 @ r5 = tmp0*vol_l |
| 254 | MUL r5, r14,r5 @ r6 = tmp1*vol_r |
| 255 | |
| 256 | ADDS r6, r4, r6, LSL #16 |
| 257 | RSCVS r6, r10,#1<<31 |
| 258 | ADDS r7, r5, r7, LSL #16 |
| 259 | RSCVS r7, r10,#1<<31 |
| 260 | |
| 261 | MOV r6, r6, LSR #16 |
| 262 | MOV r7, r7, LSR #16 |
| 263 | |
| 264 | STRH r6, [r3],#2 |
| 265 | STRH r7, [r3],#2 |
| 266 | |
| 267 | SUBS r11,r11,#1 |
| 268 | BGT SimpleRate_S_loop |
| 269 | SimpleRate_S_end: |
| 270 | LDR r14,[r13,#8] @ r14 = sr |
| 271 | ADD r13,r13,#12 |
| 272 | STMIA r14,{r0,r1,r2} |
| 273 | LDMFD r13!,{r4-r8,r10-r11,PC} |
| 274 | SimpleRate_S_read: |
| 275 | LDR r0, [r13,#4*2] @ r0 = sr |
| 276 | ADD r0, r0, #16 @ r0 = inPtr = inBuf |
| 277 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 278 | |
| 279 | MOV r1, r0 @ r1 = inBuf |
| 280 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 281 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 282 | |
| 283 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 284 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 285 | @ we have 3+8+5 = 16 things on the stack (an even number). |
| 286 | MOV r14,PC |
| 287 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 288 | SUBS r1, r0, #2 @ r1 = inLen-2 |
| 289 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 290 | BLT SimpleRate_S_end |
| 291 | SUBS r2, r2, #1 @ r2 = opos-- |
| 292 | ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 and loop } |
| 293 | BGE SimpleRate_S_loop |
| 294 | B SimpleRate_S_read_return |
| 295 | |
| 296 | |
| 297 | |
| 298 | ARM_SimpleRate_R: |
| 299 | @ r0 = AudioStream &input |
| 300 | @ r1 = input.readBuffer |
| 301 | @ r2 = input->sr |
| 302 | @ r3 = obuf |
| 303 | @ <> = osamp |
| 304 | @ <> = vol_l |
| 305 | @ <> = vol_r |
| 306 | MOV r12,r13 |
| 307 | STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} |
| 308 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 309 | @ r12= vol_l |
| 310 | @ r14= vol_r |
| 311 | LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr |
| 312 | @ r1 = inLen |
| 313 | @ r2 = opos |
| 314 | @ r8 = opos_inc |
| 315 | CMP r11,#0 @ if (osamp <= 0) |
| 316 | BLE SimpleRate_R_end @ bale |
| 317 | MOV r10,#0 |
| 318 | MOV r12,r12,LSL #8 |
| 319 | MOV r14,r14,LSL #8 |
| 320 | SimpleRate_R_loop: |
| 321 | SUBS r1, r1, #2 @ r1 = inLen -= 2 |
| 322 | BLT SimpleRate_R_read |
| 323 | SUBS r2, r2, #1 @ r2 = opos-- |
| 324 | ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 and loop } |
| 325 | BGE SimpleRate_R_loop |
| 326 | SimpleRate_R_read_return: |
| 327 | LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ |
| 328 | LDRSH r4, [r0],#2 @ r4 = tmp1 = *inPtr++ |
| 329 | LDRSH r6, [r3] @ r6 = obuf[0] |
| 330 | LDRSH r7, [r3,#2] @ r7 = obuf[1] |
| 331 | ADD r2, r2, r8 @ r2 = opos += opos_inc |
| 332 | MUL r4, r12,r4 @ r5 = tmp0*vol_l |
| 333 | MUL r5, r14,r5 @ r6 = tmp1*vol_r |
| 334 | |
| 335 | ADDS r6, r4, r6, LSL #16 |
| 336 | RSCVS r6, r10,#1<<31 |
| 337 | ADDS r7, r5, r7, LSL #16 |
| 338 | RSCVS r7, r10,#1<<31 |
| 339 | |
| 340 | MOV r6, r6, LSR #16 |
| 341 | MOV r7, r7, LSR #16 |
| 342 | |
| 343 | STRH r6, [r3],#2 |
| 344 | STRH r7, [r3],#2 |
| 345 | |
| 346 | SUBS r11,r11,#1 |
| 347 | BGT SimpleRate_R_loop |
| 348 | SimpleRate_R_end: |
| 349 | LDR r14,[r13,#8] @ r14 = sr |
| 350 | ADD r13,r13,#12 |
| 351 | STMIA r14,{r0,r1,r2} |
| 352 | LDMFD r13!,{r4-r8,r10-r11,PC} |
| 353 | SimpleRate_R_read: |
| 354 | LDR r0, [r13,#4*2] @ r0 = sr |
| 355 | ADD r0, r0, #16 @ r0 = inPtr = inBuf |
| 356 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 357 | |
| 358 | MOV r1, r0 @ r1 = inBuf |
| 359 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 360 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 361 | |
| 362 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 363 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 364 | @ we have 3+8+5 = 16 things on the stack (an even number). |
| 365 | MOV r14,PC |
| 366 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 367 | SUBS r1, r0, #2 @ r1 = inLen-2 |
| 368 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 369 | BLT SimpleRate_R_end |
| 370 | SUBS r2, r2, #1 @ r2 = opos-- |
| 371 | ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 and loop } |
| 372 | BGE SimpleRate_R_loop |
| 373 | B SimpleRate_R_read_return |
| 374 | |
| 375 | |
| 376 | ARM_LinearRate_M: |
| 377 | @ r0 = AudioStream &input |
| 378 | @ r1 = input.readBuffer |
| 379 | @ r2 = input->sr |
| 380 | @ r3 = obuf |
| 381 | @ <> = osamp |
| 382 | @ <> = vol_l |
| 383 | @ <> = vol_r |
| 384 | MOV r12,r13 |
| 385 | STMFD r13!,{r0-r1,r4-r11,r14} |
| 386 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 387 | @ r12= vol_l |
| 388 | @ r14= vol_r |
| 389 | LDMIA r2,{r0,r1,r8} @ r0 = inPtr |
| 390 | @ r1 = inLen |
| 391 | @ r8 = opos |
| 392 | CMP r11,#0 @ if (osamp <= 0) |
| 393 | BLE LinearRate_M_end @ bale |
| 394 | MOV r12,r12,LSL #8 |
| 395 | MOV r14,r14,LSL #8 |
| 396 | CMP r1,#0 |
| 397 | BGT LinearRate_M_part2 |
| 398 | |
| 399 | @ part1 - read input samples |
| 400 | LinearRate_M_loop: |
| 401 | SUBS r1, r1, #1 @ r1 = inLen -= 1 |
| 402 | BLT LinearRate_M_read |
| 403 | LinearRate_M_read_return: |
| 404 | LDR r10,[r2, #16] @ r10= icur[0,1] |
| 405 | LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ |
| 406 | SUBS r8, r8, #1 @ r8 = opos-- |
| 407 | STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] |
| 408 | STRH r5, [r2,#16] @ icur[0] = tmp1 |
| 409 | BGE LinearRate_M_loop |
| 410 | |
| 411 | @ part2 - form output samples |
| 412 | LinearRate_M_part2: |
| 413 | @ We are guaranteed that opos < 0 here |
| 414 | LDRSH r6, [r2,#20] @ r6 = ilast[0] |
| 415 | LDRSH r5, [r2,#16] @ r5 = icur[0] |
| 416 | LDRH r4, [r2,#24] @ r4 = opos_frac |
| 417 | LDR r10,[r2,#28] @ r10= opos_frac_inc |
| 418 | MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 |
| 419 | SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] |
| 420 | ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) |
| 421 | MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] |
| 422 | |
| 423 | ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac |
| 424 | STRH r4,[r2,#24] @ opos_frac &= 65535 |
| 425 | ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) |
| 426 | |
| 427 | LDRSH r4, [r3] @ r4 = obuf[0] |
| 428 | LDRSH r5, [r3,#2] @ r5 = obuf[1] |
| 429 | MOV r6, r6, ASR #16 |
| 430 | MUL r7, r12,r6 @ r7 = tmp0*vol_l |
| 431 | MUL r6, r14,r6 @ r6 = tmp1*vol_r |
| 432 | |
| 433 | ADDS r7, r7, r4, LSL #16 |
| 434 | MOV r4, #0 |
| 435 | RSCVS r7, r4, #1<<31 |
| 436 | ADDS r6, r6, r5, LSL #16 |
| 437 | RSCVS r6, r4, #1<<31 |
| 438 | |
| 439 | MOV r7, r7, LSR #16 |
| 440 | MOV r6, r6, LSR #16 |
| 441 | |
| 442 | LDR r5, [r2,#12] @ r5 = opos_inc |
| 443 | STRH r7, [r3],#2 |
| 444 | STRH r6, [r3],#2 |
| 445 | SUBS r11, r11,#1 |
| 446 | BLE LinearRate_M_end |
| 447 | |
| 448 | ADDS r8, r8, r5 @ r8 = opos += opos_inc |
| 449 | BLT LinearRate_M_part2 |
| 450 | B LinearRate_M_loop |
| 451 | LinearRate_M_end: |
| 452 | ADD r13,r13,#8 |
| 453 | STMIA r2,{r0,r1,r8} |
| 454 | LDMFD r13!,{r4-r11,PC} |
| 455 | LinearRate_M_read: |
| 456 | ADD r0, r2, #32 @ r0 = inPtr = inBuf |
| 457 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 458 | |
| 459 | MOV r1, r0 @ r1 = inBuf |
| 460 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 461 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 462 | |
| 463 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 464 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 465 | @ we have 2+9+5 = 16 things on the stack (an even number). |
| 466 | MOV r14,PC |
| 467 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 468 | SUBS r1, r0, #1 @ r1 = inLen-1 |
| 469 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 470 | BLT LinearRate_M_end |
| 471 | B LinearRate_M_read_return |
| 472 | |
| 473 | ARM_LinearRate_S: |
| 474 | @ r0 = AudioStream &input |
| 475 | @ r1 = input.readBuffer |
| 476 | @ r2 = input->sr |
| 477 | @ r3 = obuf |
| 478 | @ <> = osamp |
| 479 | @ <> = vol_l |
| 480 | @ <> = vol_r |
| 481 | MOV r12,r13 |
| 482 | STMFD r13!,{r0-r1,r4-r11,r14} |
| 483 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 484 | @ r12= vol_l |
| 485 | @ r14= vol_r |
| 486 | LDMIA r2,{r0,r1,r8} @ r0 = inPtr |
| 487 | @ r1 = inLen |
| 488 | @ r8 = opos |
| 489 | CMP r11,#0 @ if (osamp <= 0) |
| 490 | BLE LinearRate_S_end @ bale |
| 491 | MOV r12,r12,LSL #8 |
| 492 | MOV r14,r14,LSL #8 |
| 493 | CMP r1,#0 |
| 494 | BGT LinearRate_S_part2 |
| 495 | |
| 496 | @ part1 - read input samples |
| 497 | LinearRate_S_loop: |
| 498 | SUBS r1, r1, #2 @ r1 = inLen -= 2 |
| 499 | BLT LinearRate_S_read |
| 500 | LinearRate_S_read_return: |
| 501 | LDR r10,[r2, #16] @ r10= icur[0,1] |
| 502 | LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ |
| 503 | LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ |
| 504 | SUBS r8, r8, #1 @ r8 = opos-- |
| 505 | STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] |
| 506 | STRH r5, [r2,#16] @ icur[0] = tmp0 |
| 507 | STRH r6, [r2,#16] @ icur[1] = tmp1 |
| 508 | BGE LinearRate_S_loop |
| 509 | |
| 510 | @ part2 - form output samples |
| 511 | LinearRate_S_part2: |
| 512 | @ We are guaranteed that opos < 0 here |
| 513 | LDRSH r6, [r2,#20] @ r6 = ilast[0] |
| 514 | LDRSH r5, [r2,#16] @ r5 = icur[0] |
| 515 | LDRH r4, [r2,#24] @ r4 = opos_frac |
| 516 | MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 |
| 517 | SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] |
| 518 | ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) |
| 519 | MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] |
| 520 | |
| 521 | LDRSH r7, [r2,#22] @ r6 = ilast[1] |
| 522 | LDRSH r5, [r2,#18] @ r5 = icur[1] |
| 523 | LDR r10,[r2,#28] @ r10= opos_frac_inc |
| 524 | MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 |
| 525 | SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] |
| 526 | ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) |
| 527 | MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] |
| 528 | |
| 529 | ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac |
| 530 | STRH r4,[r2,#24] @ opos_frac &= 65535 |
| 531 | ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) |
| 532 | |
| 533 | LDRSH r4, [r3] @ r4 = obuf[0] |
| 534 | LDRSH r5, [r3,#2] @ r5 = obuf[1] |
| 535 | MOV r6, r6, ASR #16 |
| 536 | MOV r7, r7, ASR #16 |
| 537 | MUL r7, r12,r7 @ r7 = tmp0*vol_l |
| 538 | MUL r6, r14,r6 @ r6 = tmp1*vol_r |
| 539 | |
| 540 | ADDS r7, r7, r4, LSL #16 |
| 541 | MOV r4, #0 |
| 542 | RSCVS r7, r4, #1<<31 |
| 543 | ADDS r6, r6, r5, LSL #16 |
| 544 | RSCVS r6, r4, #1<<31 |
| 545 | |
| 546 | MOV r7, r7, LSR #16 |
| 547 | MOV r6, r6, LSR #16 |
| 548 | |
| 549 | LDR r5, [r2,#12] @ r5 = opos_inc |
| 550 | STRH r7, [r3],#2 |
| 551 | STRH r6, [r3],#2 |
| 552 | SUBS r11, r11,#1 |
| 553 | BLE LinearRate_S_end |
| 554 | |
| 555 | ADDS r8, r8, r5 @ r8 = opos += opos_inc |
| 556 | BLT LinearRate_S_part2 |
| 557 | B LinearRate_S_loop |
| 558 | LinearRate_S_end: |
| 559 | ADD r13,r13,#8 |
| 560 | STMIA r2,{r0,r1,r8} |
| 561 | LDMFD r13!,{r4-r11,PC} |
| 562 | LinearRate_S_read: |
| 563 | ADD r0, r2, #32 @ r0 = inPtr = inBuf |
| 564 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 565 | |
| 566 | MOV r1, r0 @ r1 = inBuf |
| 567 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 568 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 569 | |
| 570 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 571 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 572 | @ we have 2+9+5 = 16 things on the stack (an even number). |
| 573 | MOV r14,PC |
| 574 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 575 | SUBS r1, r0, #2 @ r1 = inLen-2 |
| 576 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 577 | BLT LinearRate_S_end |
| 578 | B LinearRate_S_read_return |
| 579 | |
| 580 | ARM_LinearRate_R: |
| 581 | @ r0 = AudioStream &input |
| 582 | @ r1 = input.readBuffer |
| 583 | @ r2 = input->sr |
| 584 | @ r3 = obuf |
| 585 | @ <> = osamp |
| 586 | @ <> = vol_l |
| 587 | @ <> = vol_r |
| 588 | MOV r12,r13 |
| 589 | STMFD r13!,{r0-r1,r4-r11,r14} |
| 590 | LDMFD r12,{r11,r12,r14} @ r11= osamp |
| 591 | @ r12= vol_l |
| 592 | @ r14= vol_r |
| 593 | LDMIA r2,{r0,r1,r8} @ r0 = inPtr |
| 594 | @ r1 = inLen |
| 595 | @ r8 = opos |
| 596 | CMP r11,#0 @ if (osamp <= 0) |
| 597 | BLE LinearRate_R_end @ bale |
| 598 | MOV r12,r12,LSL #8 |
| 599 | MOV r14,r14,LSL #8 |
| 600 | CMP r1,#0 |
| 601 | BGT LinearRate_R_part2 |
| 602 | |
| 603 | @ part1 - read input samples |
| 604 | LinearRate_R_loop: |
| 605 | SUBS r1, r1, #2 @ r1 = inLen -= 2 |
| 606 | BLT LinearRate_R_read |
| 607 | LinearRate_R_read_return: |
| 608 | LDR r10,[r2, #16] @ r10= icur[0,1] |
| 609 | LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ |
| 610 | LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ |
| 611 | SUBS r8, r8, #1 @ r8 = opos-- |
| 612 | STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] |
| 613 | STRH r5, [r2,#16] @ icur[0] = tmp0 |
| 614 | STRH r6, [r2,#16] @ icur[1] = tmp1 |
| 615 | BGE LinearRate_R_loop |
| 616 | |
| 617 | @ part2 - form output samples |
| 618 | LinearRate_R_part2: |
| 619 | @ We are guaranteed that opos < 0 here |
| 620 | LDRSH r6, [r2,#20] @ r6 = ilast[0] |
| 621 | LDRSH r5, [r2,#16] @ r5 = icur[0] |
| 622 | LDRH r4, [r2,#24] @ r4 = opos_frac |
| 623 | MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 |
| 624 | SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] |
| 625 | ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) |
| 626 | MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] |
| 627 | |
| 628 | LDRSH r7, [r2,#22] @ r6 = ilast[1] |
| 629 | LDRSH r5, [r2,#18] @ r5 = icur[1] |
| 630 | LDR r10,[r2,#28] @ r10= opos_frac_inc |
| 631 | MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 |
| 632 | SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] |
| 633 | ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) |
| 634 | MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] |
| 635 | |
| 636 | ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac |
| 637 | STRH r4,[r2,#24] @ opos_frac &= 65535 |
| 638 | ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) |
| 639 | |
| 640 | LDRSH r4, [r3] @ r4 = obuf[0] |
| 641 | LDRSH r5, [r3,#2] @ r5 = obuf[1] |
| 642 | MOV r6, r6, ASR #16 |
| 643 | MOV r7, r7, ASR #16 |
| 644 | MUL r7, r12,r7 @ r7 = tmp0*vol_l |
| 645 | MUL r6, r14,r6 @ r6 = tmp1*vol_r |
| 646 | |
| 647 | ADDS r7, r7, r4, LSL #16 |
| 648 | MOV r4, #0 |
| 649 | RSCVS r7, r4, #1<<31 |
| 650 | ADDS r6, r6, r5, LSL #16 |
| 651 | RSCVS r6, r4, #1<<31 |
| 652 | |
| 653 | MOV r7, r7, LSR #16 |
| 654 | MOV r6, r6, LSR #16 |
| 655 | |
| 656 | LDR r5, [r2,#12] @ r5 = opos_inc |
| 657 | STRH r6, [r3],#2 |
| 658 | STRH r7, [r3],#2 |
| 659 | SUBS r11, r11,#1 |
| 660 | BLE LinearRate_R_end |
| 661 | |
| 662 | ADDS r8, r8, r5 @ r8 = opos += opos_inc |
| 663 | BLT LinearRate_R_part2 |
| 664 | B LinearRate_R_loop |
| 665 | LinearRate_R_end: |
| 666 | ADD r13,r13,#8 |
| 667 | STMIA r2,{r0,r1,r8} |
| 668 | LDMFD r13!,{r4-r11,PC} |
| 669 | LinearRate_R_read: |
| 670 | ADD r0, r2, #32 @ r0 = inPtr = inBuf |
| 671 | STMFD r13!,{r0,r2-r3,r12,r14} |
| 672 | |
| 673 | MOV r1, r0 @ r1 = inBuf |
| 674 | LDR r0, [r13,#4*5] @ r0 = AudioStream & input |
| 675 | MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) |
| 676 | |
| 677 | @ Calling back into C++ here. WinCE is fairly easy about such things |
| 678 | @ but other OS are more awkward. r9 is preserved for Symbian, and |
| 679 | @ we have 2+9+5 = 16 things on the stack (an even number). |
| 680 | MOV r14,PC |
| 681 | LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf, 512) |
| 682 | SUBS r1, r0, #2 @ r1 = inLen-2 |
| 683 | LDMFD r13!,{r0,r2-r3,r12,r14} |
| 684 | BLT LinearRate_R_end |
| 685 | B LinearRate_R_read_return |