| La procedura
è parzialmente scritta in linguaggio
Assembly. E' probabile che il lettore, in questo momento, non sia in possesso delle
conoscenze di base della programmazione a basso
livello, per cui questa pagina può risultare
incomprensibile; desidero fornirtela comunque, come stimolo per approfondire questa potente tecnica di programmazione
(vedi Sezione
Tutorial Assembly).
| Come prima cosa si occupa di leggere il contenuto delle 4 locazioni di sistema da
0000:046CH a 0000:046FH, contenenti il numero corrente (a 32 bit) dei TICK prodotti nell'arco della
giornata |
| Ne
controlla poi il valore fino al momento in cui viene raggiunto
il nuovo valore, che tiene conto del ritardo desiderato.
Da notare che, al raggiungimento della mezzanotte, tale numero viene azzerato. |
| Per saperne di più
consulta la Scheda
dedicata al Timer
di Sistema
Sezione
Dentro il Computer. |
Codice Sorgente |
|
|
|
|
PROCEDURE
Delay0 (ritardo:word);
BEGIN
asm
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,ritardo
;Copia in BX il numero corrispondente
PUSH CX
;al RITARDO desiderato passato in in-
POP BX
;resso in "ritardo"
;Restituisce in CX,DX il tempo reale
;corrente del giorno assumendolo dal
MOV
AH,00H ;contenuto
delle locazioni di sistema
INT 1AH
;da 0000:046C a 0000:046F cioè il nu-
;mero a 32 bit dei TICK prodotti nel-
;l'arco della giornata
;Aggiorna con il numero corrisponden-
ADD DX,BX ;te al Ritardo
desiderato il valore
JNC @@0
;CX:DX dei TICK relativi alla prima
INC CX
;lettura delle variabili di sistema
;da 0000:046C a 0000:046F
@@0:PUSH CX
;Copia in AX,BX il numero dei TICK
PUSH DX
;relativi alla prima lettura delle
POP BX
;variabili di sistema da 0000:046C a
POP AX
;0000:046F, AGGIORNATA con il numero
;corrispondente al RITARDO desiderato
@@1:PUSH AX
;In uscita AX,BX conservano il numero
PUSH BX
;di TICK relativi alla prima lettura
MOV
AH,00H ;delle
variabili di sistema da
INT
1AH
;0000:046C a 0000:046F; e in CX,DX
POP BX
;quello del tempo reale corrente
POP AX
;{*****************************************}
;{Controlla se
il valore corrente dei TICKs}
;{è quello
previsto dal desiderato RITARDO}
;{*****************************************}
;Se la parte alta dei 2 numeri è la
;stessa, cioè se AX=CX, si controlla
CMP AX,CX ;la
parte bassa (a livello @@2)...
JZ @@2
;altrimenti AX è quasi sempre maggiore
;di 1 rispetto a CX; in questo caso si
;aspetta che le 2 parti alte si equi-
;valgano (a livello @@1, più sotto...)
PUSH AX
;Solo se nel frattempo è passata la
SUB AX,CX
;mezzanotte la differenza tra AX e CX
CMP AX,18H ;è diversa
da 1;in questo caso infatti
POP AX
;vale 18H, per cui la procedura va
JNZ @@1
;adattata alla nuova situazione (nella
;parte di codice ASM qui sotto...)
PUSH BX
;Se nel frattempo è passata la mezza-
SUB BX,00B0H;notte la
differenza tra AX e CX è
CMP BX,DX ;pari a
18H; in questo caso CX,DX è
POP BX
;passato da 001800AFH a 00000000H, per
JG @@1
;cui anche la parte bassa va adattata
JMP @@3
;alla nuova situazione, visto che una
;parte del conto è già stata consumata
@@2:CMP BX,DX ;Se la parte alta
dei 2 numeri è la
JG @@1
;stessa e la parte bassa del tempo
;corrente è minore, BX>DX , continua
;l'attesa
@@3:POP DX ;
POP CX
;
POP BX
;Il ritardo è stato consumato
POP AX
end
END; |
|