| 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).
| Il compito della procedura è quello di
recuperare
in Pagina 0 i 2 bytes associati
a ciascun carattere
precedentemente salvati in
una pagina
alternativa in
Ram Video |
| Per
calcolare l’indirizzo fisico del
carattere desiderato viene usato un algoritmo
in Pascal: poiché ciascuna colonna
porta il contributo di 2 bytes e
ciascuna riga, essendo composta da
80 colonne, contribuisce con 160 bytes,
il valore desiderato è così facilmente ottenibile a partire
dai parametri ‘rig’ e ‘col’ |
| Dalla locazione sorgente nella Pagina
alternativa, dopo aver calcolato il corrispondente
puntatore DS:SI, viene
prelevata la coppia Ascii/Colore associata al carattere
precedentemente salvato. I 2 bytes vengono quindi riportati in Pagina
0 con l'aiuto del puntatore ES:DI |
| L’indirizzo fisico di ciascuna Pagina Video alternativa è logicamente distante 4096 bytes (4k) dal precedente, in esadecimale
1000H; è per questa ragione
che, per localizzare la Pagina alternativa che ci interessa basta
moltiplicare questo offset per il numero espresso dal
parametro "numPAG") |
| Se la Pagina 0 è localizzata all’indirizzo B800:0000H,
la Pagina 1 comincerà a B800:1000H,
la Pagina 2 a B800:2000H, e
così via |
Codice Sorgente |
|
|
|
|
PROCEDURE
RECUPchr (rig,col,numPAG:byte);
VAR
indirizzo:word;
BEGIN
indirizzo:=(col-1)*2+(rig-1)*160;
asm
PUSH ES
PUSH DI ;Salvataggio dei registri coinvolti
PUSH
SI ;
PUSH CX ;
PUSH AX
MOV AX,0B800H ;Prepara
il Segmento ES per coprire
MOV ES,AX
;le locazioni della Ram Video
MOV CL,numPAG
;
MOV CH,00H
;Calcola
il puntatore alla locazio-
MOV AX,1000H
;ne sorgente
nella pagina a lterna-
MUL CX
;tiva,
indicata da numPAG
MOV SI,AX
;
ADD SI,indirizzo ;
MOV AX,ES:[SI] ;Preleva
la
coppia Carattere/Attri-
;buto dalla pagina alternativa
MOV DI,indirizzo ;Punta
la medesima posizione in Pa-
MOV ES:[DI],AX ;gina0
e vi copia il carattere
POP AX ;
POP CX ;
POP SI
;
POP DI
;Recupero dei registri coinvolti
POP ES
;
end;
END; |
|