forked from acco/chti23
61 lines
No EOL
1.7 KiB
ArmAsm
61 lines
No EOL
1.7 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
|
|
|
|
VarTime dcd 0
|
|
|
|
EXPORT VarTime
|
|
|
|
; ===============================================================================================
|
|
|
|
;constantes (équivalent du #define en C)
|
|
TimeValue equ 900000
|
|
|
|
|
|
EXPORT Delay_100ms ; la fonction Delay_100ms est rendue publique donc utilisable par d'autres modules.
|
|
|
|
|
|
;Section ROM code (read only) :
|
|
area moncode,code,readonly
|
|
|
|
|
|
|
|
; REMARQUE IMPORTANTE
|
|
; Cette manière de créer une temporisation n'est clairement pas la bonne manière de procéder :
|
|
; - elle est peu précise
|
|
; - la fonction prend tout le temps CPU pour... ne rien faire...
|
|
;
|
|
; Pour autant, la fonction montre :
|
|
; - les boucles en ASM
|
|
; - l'accés écr/lec de variable en RAM
|
|
; - le mécanisme d'appel / retour sous programme
|
|
;
|
|
; et donc possède un intérêt pour débuter en ASM pur
|
|
|
|
Delay_100ms proc
|
|
|
|
ldr r0,=VarTime ; r0 prend la valeur VarTime = 0 ici la premiere adresse est 0x20000000 en RAM dans simulation
|
|
|
|
ldr r1,=TimeValue ; r1 prend la valeur TimeValue = 900000
|
|
str r1,[r0] ; la valeur 32bits contenue dans r1 est copiée en RAM à l'adresse spécifiée dans r0
|
|
|
|
BoucleTempo
|
|
ldr r1,[r0] ; la valeur 32bits située à l'adresse spécifiée dans r0 est recopiée dans r1
|
|
|
|
subs r1,#1 ; r1 prend la valeur r1 - 1 = 899999
|
|
str r1,[r0] ; la valeur 32bits contenue dans r1 est copiée en RAM à l'adresse spécifiée dans r0
|
|
bne BoucleTempo ; if z = 0 faire BoucleTempo; Z: Set to 1 when r1 is zero, otherwise cleared to 0
|
|
|
|
bx lr ; indirect jump to [LR]
|
|
endp
|
|
|
|
|
|
END
|