Salut
Est-ce que je peux savoir les étapes necessaires pour faire" horloge numérique en CMOS"
Je veux taper un programme DATE qui donne la date à 24h!:
J'ai 3 var : jours, mois, année
Salut
Est-ce que je peux savoir les étapes necessaires pour faire" horloge numérique en CMOS"
Je veux taper un programme DATE qui donne la date à 24h!:
J'ai 3 var : jours, mois, année
On commence par sauvegarder le contenu du port 70h.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 ;------------------------------------------------ ram16_CMOS_GetTime PROC ; Synopsis: Retourne l'heure en BCD ; Attend : rien ; Retourne : eax -> heure ; 0- 7 -> hours ; 8-15 -> minutes ; 16-23 -> seconds ;------------------------------------------------ push cx push edx xor edx,edx in al,70h mov cl,al ; seconds xor al,al out 70h,al in al,71h shl edx,8 mov dl,al ; minutes mov al,2 out 70h,al in al,71h shl edx,8 mov dl,al ; hours mov al,4 out 70h,al in al,71h shl edx,8 mov dl,al mov al,cl out 70h,al mov eax,edx pop edx pop cx ret ram16_CMOS_GetTime ENDP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ; sauvegarde in al,70h mov cl,al ; ... ; du code ici ; ... ; restauration mov al,cl out 70h,al
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 ;------------------------------------------------ ram16_CMOS_GetDate PROC ; Synopsis: Retourne la date en BCD ; Attend : rien ; Retourne : eax -> heure ; 0- 7 -> year ; 8-15 -> month ; 16-23 -> date of month ; 24_31 -> day of week ;------------------------------------------------ push cx push edx xor edx,edx in al,70h mov cl,al ; day of week mov al,6 out 70h,al in al,71h shl edx,8 mov dl,al ; date of month mov al,7 out 70h,al in al,71h shl edx,8 mov dl,al ; month mov al,8 out 70h,al in al,71h shl edx,8 mov dl,al ; year mov al,9 out 70h,al in al,71h shl edx,8 mov dl,al mov al,cl out 70h,al mov eax,edx pop edx pop cx ret ram16_CMOS_GetDate ENDP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 ;------------------------------------------------ ram16_CMOS_GetSecondsToday PROC ; Synopsis: Retourne le nombre de secondes écoulées ; depuis le début de la journée ; Retourne: eax -> nbr de secondes ;------------------------------------------------ push ebx push ecx push edx call ram16_CMOS_GetTime mov ecx,eax xor eax,eax mov al,cl shr al,4 mov ebx,10 mul ebx xor ebx,ebx mov bl,cl and bl,0Fh add eax,ebx mov ebx,6 mul ebx shr ecx,8 xor ebx,ebx mov bl,cl shr bl,4 add eax,ebx mov ebx,10 mul ebx xor ebx,ebx mov bl,cl and bl,0Fh add eax,ebx mov ebx,6 mul ebx shr ecx,8 xor ebx,ebx mov bl,cl shr bl,4 add eax,ebx mov ebx,10 mul ebx xor ebx,ebx mov bl,cl and bl,0Fh add eax,ebx pop edx pop ecx pop ebx ret ram16_CMOS_GetSecondsToday ENDP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 ;------------------------------------------------ ram16_CMOS_WriteTime PROC ; Synopsis: Affiche l'heure ; Attend : rien ;------------------------------------------------ push eax call ram16_CMOS_GetTime call ram16_WriteHex08 shr eax,8 push ax mov al,':' call ram16_WriteChar pop ax call ram16_WriteHex08 shr eax,8 push ax mov al,':' call ram16_WriteChar pop ax call ram16_WriteHex08 pop eax ret ram16_CMOS_WriteTime ENDP
CMOS RAM/RTC
PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK)
Note :
the real-time clock may be either a discrete MC146814, MC146818, or an emulation thereof built into the motherboard chipset
0070 -W CMOS RAM index register port (ISA, EISA)
bit 7 = 1 NMI disabled from reaching CPU
= 0 NMI enabled
bit 6-0 CMOS RAM index
(64 bytes in early systems, now usually 128 bytes)
Note: any write to PORT 0070h should be followed by an action to
PORT 0071h or the RTC wil be left in an unknown state.
0071 RW CMOS RAM data port (ISA, EISA)Organization of CMOS Memory - Clock
The format of the ten clock data registers (bytes 00h-09h) is:
----------R00--------------------------------
CMOS 00h - RTC - SECONDS
Desc: (BCD 00-59, Hex 00-3B)
Note: Bit 7 is read only
SeeAlso: CMOS 01h,CMOS 02h,CMOS 04h
----------R01--------------------------------
CMOS 01h - RTC - SECOND ALARM
Desc: (BCD 00-59, Hex 00-3B; "don't care" if C0-FF)
SeeAlso: CMOS 00h,CMOS 03h,CMOS 05h,CMOS 7Dh
----------R02--------------------------------
CMOS 02h - RTC - MINUTES
Desc: (BCD 00-59, Hex 00-3B)
SeeAlso: CMOS 00h,CMOS 03h,CMOS 04h
----------R03--------------------------------
CMOS 03h - RTC - MINUTE ALARM
Desc: (BCD 00-59, Hex 00-3B; "don't care" if C0-FF))
SeeAlso: CMOS 00h,CMOS 02h,CMOS 05h,CMOS 7Dh,CMOS 7Eh"AMD-645"
----------R04--------------------------------
CMOS 04h - RTC - HOURS
Desc: (BCD 00-23, Hex 00-17 if 24 hr mode)
(BCD 01-12, Hex 01-0C if 12 hr am)
(BCD 81-92. Hex 81-8C if 12 hr pm)
SeeAlso: CMOS 00h,CMOS 02h,CMOS 05h
----------R05--------------------------------
CMOS 05h - RTC - HOUR ALARM
Desc: (same as hours; "don't care" if C0-FF))
SeeAlso: CMOS 01h,CMOS 03h,CMOS 04h
----------R06--------------------------------
CMOS 06h - RTC - DAY OF WEEK
Desc: (01-07 Sunday=1)
SeeAlso: CMOS 07h,CMOS 08h,CMOS 09h
----------R07--------------------------------
CMOS 07h - RTC - DATE OF MONTH
Desc: (BCD 01-31, Hex 01-1F)
SeeAlso: CMOS 06h,CMOS 08h,CMOS 09h
----------R08--------------------------------
CMOS 08h - RTC - MONTH
Desc: (BCD 01-12, Hex 01-0C)
SeeAlso: CMOS 06h,CMOS 07h,CMOS 09h
----------R09--------------------------------
CMOS 09h - RTC - YEAR
Desc: (BCD 00-99, Hex 00-63)
Notes: BCD/Hex selection depends on Bit 2 of register B (0Bh)
12/24 Hr selection depends on Bit 1 of register B (0Bh)
Alarm will trigger when contents of all three Alarm byte registers
match their companions.
SeeAlso: CMOS 06h,CMOS 07h,CMOS 08h
merci pour votre réponse ,mais j'ai pas bien compris le code veuillez expliquer un petit peu
merci
Pour lire un élément de la RAM CMOS :
Tu trouvera le n° de chaque élément dans la table "Organization of CMOS Memory - Clock" du précédent message.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ;- tu tindique quel élément tu veux lire mov al,4 ; n° de l'élément (4 correspond à l'heure) out 70h,al ;- tu lit la valeur sur le port 71h in al,71h
Comme le port 70h ne sert pas qu'à indiquer le n° d'élément (il sert également à activer ou désactiver les NMIs), je sauvegarde le contenu du port 70h au début de chaque fonction pour restaurer la valeur à la fin de la fonction.
Pour sauvegarder, je lit le port et place le contenu dans CL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ; sauvegarde in al,70h mov cl,al ; valeur dans CL ; ... ; du code ici ; ... ; restauration mov al,cl ; valeur dans CL out 70h,al
Pour restaurer le contenu, j'utilise la valeur stockée dans CL lors de la sauvegarde.
exemple : Lire l'heure
Cette fonction lit plusieurs éléments (heures,minutes,secondes) et retourne ces éléments dans EAX.
Comme AL sert pour lire un élément, après chaque lecture, je place la valeur de AL dans DL en décalant le contenu de EDX d'1 octet à chaque fois.
A la fin de la procédure, je déplace le contenu de EDX vers EAX.
Pour utiliser cette fonction,faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 ;------------------------------------------------ ram16_CMOS_GetTime PROC ; Synopsis: Retourne l'heure en BCD ; Attend : rien ; Retourne : eax -> heure ; 0- 7 -> hours ; 8-15 -> minutes ; 16-23 -> seconds ;------------------------------------------------ ;--- ; la procédure préserve la valeurs des registres CX et EDX ; seul le registre EAX est modifié push cx push edx ;--- xor edx,edx ;* EDX=0|0|0|0 in al,70h ;** sauvegarde du port 70h mov cl,al ;** ; lecture des secondes xor al,al ; 0=seconds out 70h,al in al,71h shl edx,8 mov dl,al ;* EDX=0|0|0|seconds ; lecture des minutes mov al,2 ; 2=minutes out 70h,al in al,71h shl edx,8 mov dl,al ;* EDX=0|0|seconds|minutes ; lecture des heures mov al,4 ; 4=hours out 70h,al in al,71h shl edx,8 mov dl,al ;* EDX=0|seconds|minutes|hours mov al,cl ;** restauration du port 70h out 70h,al ;** mov eax,edx ;* EAX=0|seconds|minutes|hours ;--- ; la procédure préserve la valeurs des registres CX et EDX ; seul le registre EAX est modifié pop edx pop cx ;--- ret ram16_CMOS_GetTime ENDP
Je peux vous aider si vous avez des problèmes ou s'il y a des éléments que vous ne comprenez pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 call ram16_CMOS_GetTime ;l'heure courante est contenue dans EAX
Si vous avez besoin d'aide,dîtes simplement quels éléments vous ne comprenez pas. (ne dîtes pas "je n'ai rien compris", soyez plus précis).
Merci infiniment. Encore une fois, premiére chose je suis encore une débutante en assembleur, la deuxiéme chose on utilise pas les registres al, dl.. .ou les instructions push..., on utilise clr, bne (boucle), ld, cmp (comparaison) les registres A,B,D,X,PC...
Voilà un exemple : carré d'un nb se touvant à l'adresse $1000
c'est pas le même micropros n'est-ce pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LDA $1000 LDB $1000 MUL STD $1100
(soyez patient avec moi je suis encore débutante car peut-être je n'ai pas bien présenté le problème dès le début).
merciiiiiiii
Pourrait-tu me dire quel langage assembleur tu utilise et quel type de processeurs.
Cela peut m'aider à te fournir du code dans le même langage assembleur que toi tu utilise.
Pour info, le code que j'ai founi est écrit en assembleur x86 et fonctionne sur les processeurs x86 fonctionnant en mode réel 16 bits.
salut
le microprocesseur qu'on est en train d'étudier est le 6809 (ancien)
merci
voici un article qui peut t'interesser :
http://www-gtr.iutv.univ-paris13.fr/...2-01.Sujet.pdf
et la correction:
http://www-gtr.iutv.univ-paris13.fr/...correction.txt
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager