@ @ written by bla @ .arch armv7-a .fpu neon .syntax unified .global _start .set KMI0, 0x10006000 .set FRAMEBUFFER_BASE, 0x60020000 _start: bl stack .word 0x10020000 @ clcd pl111 base .word 0x3f1f3f9c .word 0x090b61df .word 0x067f1800 .word 0x0000082b .ltorg stack: mov sp, lr pop {r2-r6,r8,r9} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Display setup @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ str r3, [r2, $0x0] str r4, [r2, $0x4] str r5, [r2, $0x8] ldr r8, =$FRAMEBUFFER_BASE str r8, [r2, $0x10] str r6, [r2, $0x18] ldr r1, =0x40000000 @ VFPEnable FMXR FPEXC, r1 @VMSR FPEXC, r1 ldr r1,=floats VLDR.32 s0,[r1] @angle VLDR.32 s1,[r1, $4] @step VLDR.32 s13,[r1, $8] @3! VLDR.32 s15,[r1, $12] @5! VLDR.32 s17,[r1, $16] @7! VLDR.32 s11,[r1, $20] @1 VLDR.32 s20,[r1, $24] @radius VLDR.32 s21,[r1, $28] @origin.Y VLDR.32 s22,[r1, $32] @origin.X mov r2, $500 ldr r10, =$FRAMEBUFFER_BASE ldr r11, =$640 ldr r12, =$0xff points: vadd.f32 s0, s0, s1 vmov.f32 s2, s0 @ s2 = x vmov.f32 s3, s0 @ s3 = x vmul.f32 s3, s3, s0 @ s3 = x * x vmul.f32 s3, s3, s0 @ s3 = x * x * x vdiv.f32 s4, s3, s13 @ s4 = x * x * x / 3! vsub.f32 s2, s2, s4 @ s2 = x - x * x * x / 3! vmul.f32 s3, s3, s0 @ s3 = x * x * x * x vmul.f32 s3, s3, s0 @ s3 = x * x * x * x * x vdiv.f32 s4, s3, s15 @ s4 = x * x * x * x * x / 5! vadd.f32 s2, s2, s4 @ s2 = x - x * x * x / 3! + x * x * x * x * x / 5! vmul.f32 s3, s3, s0 @ s3 = x * x * x * x * x * x vmul.f32 s3, s3, s0 @ s3 = x * x * x * x * x * x * x vdiv.f32 s4, s3, s17 @ s4 = x * x * x * x * x * x / 7! vsub.f32 s2, s2, s4 @ s2 = x - x * x * x / 3! + x * x * x * x * x / 5! - x * x * x * x * x * x / 7! vmul.f32 s3, s2, s2 @ s3 = sin°(x) * sin°(x) vsub.f32 s3, s11, s3 @ s3 = 1 - sin°(x) * sin°(x) vsqrt.f32 s3, s3 @ abs(cos°(x)) = sqrt(1 - sin°(x) * sin°(x)) vmul.f32 s2, s2, s20 @ s2 = radius * sin°(x) vmul.f32 s3, s3, s20 @ s3 = radius * abs(cos°(x)) vneg.f32 s4, s3 @ s4 = - radius * abs(cos°(x)) vadd.f32 s2, s2, s21 @ y = orign.Y + radius * sin°(x) vadd.f32 s3, s3, s22 @ X1 = orign.X + radius * cos°(x) vadd.f32 s4, s4, s22 @ X2 = orign.X - radius * cos°(x) vcvt.s32.f32 s2, s2 @ convert to integer vcvt.s32.f32 s3, s3 vcvt.s32.f32 s4, s4 vmov r5, s2 vmov r6, s3 vmov r7, s4 mul r5, r5, r11 @ convert (x,y) into frame buffer offset add r8, r5, r6 add r9, r5, r7 add r9, r9, $2 @ cheating a bit str r12, [r10,r8,LSL $2] str r12, [r10,r9,LSL $2] sub r2, r2, $1 cmp r2, $0 bne points hcf: b hcf .ltorg floats: .float -1.57079632679 @angle .float 0.0062831853 @step .float 6 @ 3! .float 120 @ 5! .float 5040 @ 7! .float 1 @ 1 .float 100 @radius .float 200 @origin.Y .float 320 @origin.X