|
 |
Raccolta di Procedure ASM |
Delay 3/3 - Dettaglio sull'Algoritmo ASM
[30 di 54] |
1° dicembre
2003 |
| Procedure di ritardo -
Descrizione dell'algoritmo |
|
Come la procedura di
ritardo sfrutta le caratteristiche del Timer di Sistema |
 | Nella pagina precedente abbiamo imparato
che il
Timer di Sistema
controlla ogni evento temporale del nostro computer,
scandendone
la vita
a suon di
Tick di sistema,
con
frequenza di
18,2064819 Hz,
cioè
generando un fronte attivo ogni 54,925493 ms |
 | Il geniale progettista delle magiche
Procedure del Bios ha previsto un intero pacchetto di
Funzioni dedicate al
controllo dell'Orologio
in Tempo Reale, raccogliendole nella libreria INT 1AH
e destinando ad esso anche numerose locazioni di
sistema, nell'Area di comunicazione Bios. |
 | In particolare le 4
variabili di sistema da
0000:046CH a
0000:046FH contengono il numero corrente (a 32 bit) dei
Ticks prodotti nell'arco della giornata;
vediamo alcuni valori assunti da questa doubleword nell'arco della giornata:
 | alle 00:00:00
il numero vale 00000000H e, nel tempo
necessario per consumare un secondo, si incrementerà 18 volte |
 | alle 00:00:01
il numero vale dunque 00000012H (12H
=18 decimale, 18
Ticks) |
 | alle 00:59:59
il numero vale 0000FFF5H, corrispondente
a 65525
Ticks |
 | dopo un'ora (01:00:00)
il numero vale 00010007H, pari a 65548
Ticks, 18 più di
prima |
 | alle 23:00:00
il numero vale 001700A8H
= 1507496
Ticks |
 | alle 23:59:59
il numero vale 0018009DH
= 1573021
Ticks |
|
 | Dunque, al termine della giornata, poco prima delle
24:00:00, il valore
corrente dei Ticks di sistema
sarà
18 volte più grande, 001800AFH
=1573039 e, all'arrivo del Tick successivo
dovrebbe portarsi al valore , 001800B0H
=1573040, ma in realtà il contenuto delle variabili si riazzera e tutto
ricomincia da capo. |
 | La Procedura
Delay e
le sue derivate
Del_100,
Del_1000,
Del_1500 e
Del_2000
utilizzano questa risorsa per generare ritardi
svincolati dalla velocità del processore, precisi, affidabili
e portabili. |
 | La possibilità di consumare tempo (comunque
multiplo di circa 55 ms) è legata alla
lettura delle 4
variabili, affidata alla
Funzione 00H dell'INT 1AH
Bios:
 | la prima lettura assume il
numero a 32 bit corrispondente al
tempo del giorno consumato fino a questo
istante, al quale viene aggiunto il ritardo desiderato
(in Tick); al termine il
numero da raggiungere è lasciato in
AX,BX |
 | seguono ulteriori letture
del numero corrente, lasciate in
CX,DX,
fino al raggiungimento del numero
predisposto in
AX,BX |
 | la sequenza delle operazioni
è illustrata nel seguente diagramma di flusso: |
|
 | La parte iterativa del flow-chart è piuttosto intuitiva:
 | se la parte alta dei
2 numeri è uguale (AX=CX)
si controlla la parte bassa, ripetendo
la lettura fino al raggiungimento dell'uguaglianza anche di questa,
BX=DX
(percorso blu)
[esempio:
AX,BX
= 000F01A5H e
CX,DX
= 000F00A3H] |
 | quando i 2 numeri a 32 bit sono perfettamente uguali il
tempo del ritardo desiderato è stato consumato correttamente (percorso
marrone) |
 | se la parte alta dei
due numeri numeri non è uguale, la prima (quella
da raggiungere, AX)
sarà (quasi) sempre
più grande di 1 rispetto alla seconda (quella
corrente, CX);
per questo, finchè il valore di
CX
non raggiunge quello di
AX,
è inutile controllare la parte bassa e
la lettura viene ripetuta attraverso il percorso
verde [esempio:
AX,BX
= 000F01A5H e
CX,DX
= 000EFF1CH] |
 | ...con una eccezione... [**] |
|
 |
La
procedura
Delay è
particolarmente curata ed è in grado di prevedere anche un evento
piuttosto
improbabile ma
possibile,
data la sua natura, legata alla lettura del tempo corrente: il
suo utilizzo a cavallo di un giorno che muore e uno che
nasce... |
 | [**] Nella premessa ho
sottolineato che subito dopo la mezzanotte
il contatore passa dal valore 001800AFH
a 00000000H;
si rende indispensabile, quindi, un supplemento
d'indagine: in questo caso:
 | se la parte alta
dei 2 numeri numeri non è uguale, la prima (quella
da raggiungere, AX)
sarà più grande di 24 (18H) rispetto alla seconda (quella corrente, CX);
più precisamente la prima sarà
AX=0018H
e la seconda
CX=
0000H |
 | inoltre, poichè prima di azzerarsi la parte bassa del
numero corrente ha già consumato B0H
Ticks, per stabilire
quanti ne restano ancora da attendere bisognerà tenerne conto, sottraendone
il valore prima di operare il confronto con DX
(percorso rosso)
[esempio:
AX,BX
= 0018013AH e
CX,DX
= 00000A3H] |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|