Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed DmTftLibrary
src/escapetime.s@1:a1d80c69e1f0, 2018-12-06 (annotated)
- Committer:
- ofrasier
- Date:
- Thu Dec 06 23:15:21 2018 +0000
- Revision:
- 1:a1d80c69e1f0
- Child:
- 2:e8d2bde86ff9
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ofrasier | 1:a1d80c69e1f0 | 1 | AREA drawASM, CODE, READONLY |
| ofrasier | 1:a1d80c69e1f0 | 2 | EXPORT escapeTime |
| ofrasier | 1:a1d80c69e1f0 | 3 | |
| ofrasier | 1:a1d80c69e1f0 | 4 | ; ASM subroutine of escape time algorithm |
| ofrasier | 1:a1d80c69e1f0 | 5 | ; R0 contains cx |
| ofrasier | 1:a1d80c69e1f0 | 6 | ; R1 contains cy |
| ofrasier | 1:a1d80c69e1f0 | 7 | ; R2 contains maxiters |
| ofrasier | 1:a1d80c69e1f0 | 8 | ; R3 contains counter |
| ofrasier | 1:a1d80c69e1f0 | 9 | ; R4 contains zx |
| ofrasier | 1:a1d80c69e1f0 | 10 | ; R5 contains zy |
| ofrasier | 1:a1d80c69e1f0 | 11 | ; R6 contains 4 << 24 = 67108864 escape CMP |
| ofrasier | 1:a1d80c69e1f0 | 12 | ; R7 Lo |
| ofrasier | 1:a1d80c69e1f0 | 13 | ; R8 Hi registers for SMULL for zx^2 |
| ofrasier | 1:a1d80c69e1f0 | 14 | ; R9 Lo |
| ofrasier | 1:a1d80c69e1f0 | 15 | ; R10 Hi registers for SMULL for zy^2 |
| ofrasier | 1:a1d80c69e1f0 | 16 | ; R11 Lo |
| ofrasier | 1:a1d80c69e1f0 | 17 | ; R12 Hi are scratch registers |
| ofrasier | 1:a1d80c69e1f0 | 18 | escapeTime |
| ofrasier | 1:a1d80c69e1f0 | 19 | PUSH {R4, R5, R6, R7, R8, R9, R10, R11, R12} |
| ofrasier | 1:a1d80c69e1f0 | 20 | MOV R3, #0 |
| ofrasier | 1:a1d80c69e1f0 | 21 | MOV R4, R0 |
| ofrasier | 1:a1d80c69e1f0 | 22 | MOV R5, R1 |
| ofrasier | 1:a1d80c69e1f0 | 23 | MOV R6, #67108864 |
| ofrasier | 1:a1d80c69e1f0 | 24 | iterate_loop_start |
| ofrasier | 1:a1d80c69e1f0 | 25 | CMP R3, R2 ; Exit loop if counter >= maxiters |
| ofrasier | 1:a1d80c69e1f0 | 26 | BGE iterate_loop_end |
| ofrasier | 1:a1d80c69e1f0 | 27 | SMULL R7, R8, R4, R4 ; Compute zx^2 and zy^2 |
| ofrasier | 1:a1d80c69e1f0 | 28 | SMULL R9, R10, R5, R5 ; R7:R8 = zx^2 R9:R10 = zy^2 |
| ofrasier | 1:a1d80c69e1f0 | 29 | ADD R12, R8, R10 ; Only check zx^2 + zy^2 < 4 with high-order |
| ofrasier | 1:a1d80c69e1f0 | 30 | CMP R12, R6 ; bits. Okay to ignore low order sum and carry |
| ofrasier | 1:a1d80c69e1f0 | 31 | BGE iterate_loop_end ; Escape condition |
| ofrasier | 1:a1d80c69e1f0 | 32 | SMULL R11, R12, R4, R5 ; Compute zy = 2*zx*zy + cy |
| ofrasier | 1:a1d80c69e1f0 | 33 | LSL R12, #4 ; Perform right shift by 28 places on R11:R12 |
| ofrasier | 1:a1d80c69e1f0 | 34 | ASR R11, #28 |
| ofrasier | 1:a1d80c69e1f0 | 35 | BFI R12, R11, #0, #4 |
| ofrasier | 1:a1d80c69e1f0 | 36 | LSL R12, #1 ; Multiply by 2 |
| ofrasier | 1:a1d80c69e1f0 | 37 | ADD R5, R12, R1 ; Add cy and store in R5 |
| ofrasier | 1:a1d80c69e1f0 | 38 | SUBS R11, R7, R9 ; Compute zx = zx^2 - zy^2 + cx |
| ofrasier | 1:a1d80c69e1f0 | 39 | SBC R12, R8, R10 |
| ofrasier | 1:a1d80c69e1f0 | 40 | LSL R12, #4 ; Perform right shift by 28 places on R11:R12 |
| ofrasier | 1:a1d80c69e1f0 | 41 | ASR R11, #28 |
| ofrasier | 1:a1d80c69e1f0 | 42 | BFI R12, R11, #0, #4 |
| ofrasier | 1:a1d80c69e1f0 | 43 | ADD R4, R12, R0 ; Add cx and store in R4 |
| ofrasier | 1:a1d80c69e1f0 | 44 | ADD R3, #1 ; Increment counter and loop |
| ofrasier | 1:a1d80c69e1f0 | 45 | B iterate_loop_start |
| ofrasier | 1:a1d80c69e1f0 | 46 | iterate_loop_end |
| ofrasier | 1:a1d80c69e1f0 | 47 | ; Move counter to R0 as the ret value |
| ofrasier | 1:a1d80c69e1f0 | 48 | MOV R0, R3 |
| ofrasier | 1:a1d80c69e1f0 | 49 | POP {R4, R5, R6, R7, R8, R9, R10, R11, R12} |
| ofrasier | 1:a1d80c69e1f0 | 50 | BX LR |
| ofrasier | 1:a1d80c69e1f0 | 51 | END |