 |
La procedura
è scritta in linguaggio Assembly.
è
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).
 |
La procedura accede direttamente
alla Ram Video [per saperne di più consulta
la
Scheda nella Sezione
Dentro il Computer]. |
 |
La procedura stampa
almeno 80 caratteri ‘carat’
saltando ogni intermediario software,
direttamente in Ram Video. |
 |
Per
calcolare l’indirizzo fisico del
primo carattere di ciascun gruppo di 80*n
viene usato un algoritmo
in Pascal: poiché ciascuna di essi porta il contributo di 2 bytes
sono necessari160 bytes. |
 |
Anche
per calcolare il numero di
caratteri da stampare (appunto 80*n) viene usato un algoritmo
in Pascal: il moltiplicatore “n” è dato dalla differenza numerica tra
“rigF” e “rigI".
|
Codice Sorgente |
|
 |
 |
|
PROCEDURE Riempi3(rigI,rigF,txt,sfo:byte;
carat:char);
VAR
indirizzo,quanti:word;
BEGIN
indirizzo:=(rigI-1)*160;
quanti:=(rigF-rigI+1)*80;
asm
PUSH ES ;Salvataggio dei registri coinvolti
PUSH
DI ;
PUSH BX ;
PUSH CX
MOV AX,0B800H ;Punta la locazione desiderata in
MOV ES,AX ;Ram Video, ES:DI = ES:indirizzo
MOV DI,indirizzo;
MOV AL,carat
MOV BH,sfo
SHL BH,1 ;
SHL BH,1 ;
SHL BH,1 ;Converte
i valori dei parametri
SHL BH,1 ;nel
byte esadecimale corrisponden-
MOV BL,txt ;te,
lasciato in AH
OR BH,BL ;
MOV AH,BH ;
MOV CX,quanti
;
@@1:MOV ES:[DI],AX ;Sposta le
80xN coppie di bytes
INC DI ;Carattere/Attributo direttamente
INC DI
;in Ram Video
LOOP @@1 ;
POP CX ;
POP BX
;Recupero dei registri coinvolti
POP DI ;
POP ES ;
end;
END; |
|