chti23/soft/PjtKEIL_StepSon/Src/GestionSon.s

99 lines
No EOL
2 KiB
ArmAsm

PRESERVE8
THUMB
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly
;Section RAM (read write):
area maram,data,readwrite
SortieSon dcw 0
Index dcd 0x00000000
; ===============================================================================================
EXPORT CallbackSon
EXPORT SortieSon
EXPORT StartSon
EXPORT Index
EXTERN Son
EXTERN LongueurSon
INCLUDE ../Driver/DriverJeuLaser.inc
;Section ROM code (read only) :
area moncode,code,readonly
; écrire le code ici
CallbackSon proc
push {lr}
ldr r0, =SortieSon ; r0 = &SortieSon car SortieSon variable
ldr r1, =Son ; r1 = &Son
ldr r2, =Index ; r2 = &Index
ldr r3, =LongueurSon ; r3 = &LongueurSon
push {r4}
push {r5}
push {r6}
push {r7}
push {r8}
push {r9}
push {r10}
push {r11}
ldr r4, [r2] ; r4 = Index
ldr r10, [r2] ; r10 = Index
ldr r11, [r3] ; r11 = LongueurSon
cmp r10, r11
bne notEqual
push {r12}
mov r12, #-1
str r12, [r2]
pop {r12}
pop {r11}
pop {r10}
pop {r9}
pop {r8}
pop {r7}
pop {r6}
pop {r5}
pop {r4}
pop {lr}
bx lr
notEqual
mov r9, #2
mul r4, r9 ; r4 = 2*Index
ldrsh r5, [r1, r4] ; r5 = Son[(2*)Index] //ldrsh car 16 bits signés
ldr r6, [r0] ; r6 = SortieSon
mov r7, #360
mov r8, #32768
mul r5, r7
sdiv r5, r8
adds r5, #360 ; r5 = (r6*360)/32768 + 360 pour la mise à l'échelle entre 0 et 719 des valauers de SortieSon
strh r5, [r0] ;SortieSon chargée dans la mémoire //strh car 16 bits signe positif
mov r0, r5
adds r10, #1; r10 = Index++
str r10, [r2] ;Index chargée dans la mémoire //str car 32 bits
pop {r11}
pop {r10}
pop {r9}
pop {r8}
pop {r7}
pop {r6}
pop {r5}
pop {r4}
bl PWM_Set_Value_TIM3_Ch3
pop {pc}
ENDFUNC
StartSon proc
ldr r0, =Index; r0 = &Index
mov r1, #0 ; r1 = 0
str r1, [r0] ;Index chargée dans la mémoire //str car 32 bits
bx lr
ENDFUNC
END