 | 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
salvare
i 2 bytes associati a ciascun carattere 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 in Pagina 0,
puntata da DS:DI, viene
prelevata la coppia Ascii/Colore. Dopo aver
creato il puntatore ES:SI
alla corrispondente locazione della Pagina alternativa della Ram del Video
provvede a trasferire i 2 bytes precedentemente estratti |
 | 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
SALVAchr(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 ;
MOV AX,0B800H ;Punta la locazione desiderata
nel-
MOV ES,AX
;la Pagina0 Ram Video, cioè
MOV DI,indirizzo
;
ES:DI = ES:indirizzo
MOV AX,ES:[DI] ;Preleva
la coppia di bytes (Ascii
PUSH AX
;e
colore) associati al carattere
MOV CL,numPAG ;
MOV CH,00H
;Calcola
il puntatore alla locazio-
MOV AX,1000H
;ne
di destinazione nella pagina
MUL CX
;alternativa
indicata da numPAG
MOV SI,AX
;
ADD SI,indirizzo ;
POP AX
MOV ES:[SI],AX
;Sposta la
coppia Carattere/Attri-
;buto
nella pagina alternativa
POP CX ;
POP SI
;
POP DI
;Recupero dei registri coinvolti
POP ES
;
end;
END; |
|