 | 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 pụ 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 consente di
stampare un’area quadrangolare riempita con il medesimo carattere e con lo stesso attributo di colore, sostituendo in
Ram Video i bytes relativi ai caratteri originali,
che sono dunque perduti. |
 | Le
dimensioni (alto,
largo) del Box, in funzione dei parametri passati alla
procedura, sono calcolate in Pascal. |
 | Anche
la stampa dei bytes viene gestita in Pascal da un ciclo Repeat
.. Until, all'interno del quale l’indirizzo fisico
corrente è calcolato a partire
dai parametri ‘ri’ e ‘co’.sulla
base del fatto che ciascuna colonna
porta il contributo di 2 bytes e
ciascuna riga, essendo composta da
80 colonne, contribuisce con 160 bytes. |
Codice Sorgente |
|
 |
 |
 |
PROCEDURE
Box1(ri,co,ri1,co1,txt,sfo:byte;carat:char);
VAR
indirizzo,n,alto,largo:word;
BEGIN
n:=0;
alto:=ri1-ri+1;
largo:=co1-co+1;
REPEAT
indirizzo:=(co-1)*2+(ri-1+n)*160;
n:=n+1;
asm
PUSH ES
PUSH DI ;Salvataggio dei registri coinvolti
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,largo
@@1:MOV ES:[DI],AX
;Sposta
Ascii/Attributo in Ram
INC DI
;
LOOP @@1
;
POP CX
POP BX ;Recupero dei registri coinvolti
POP DI
;
POP ES
;
end;
UNTIL
n=alto;
END; |
|