| 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 viene stampato un
box dello stesso colore e delle medesime
dimensioni della cornice che si deve togliere dal video |
| Ciò fatto si elimina, uno alla
volta, lo strato (dello spessore di un carattere) più esterno di
questo box, lasciando al suo posto lo strato corrispondente di
caratteri precedentemente salvati. |
| Si può capire come questa
operazione sia ..... |
| In realtà esso è costituito da 3
blocchi simili e alternativi; tutti e 3 portano a termine il
compito richiesto, ma ciascuno in modo specializzato:
| il primo blocco (zona blu) risolve il
problema quando il box si è ridotto ad una sola riga |
| il secondo (zona verde) si
occupa del problema quando il box si è ridotto a 2 righe,
trattandole contemporaneamente |
| l'ultimo blocco (zona azzurra)
elimina lo strato esterno del box in tutti gli altri casi |
|
| Per garantire il servizio si ricorre
alla tecnica della RamVideo
[per saperne di più consulta
la
Scheda nella Sezione
Dentro il Computer]. |
| Da notare l'uso di una procedura di
ritardo per rendere realistica l'implosione dell'area trattata |
Codice Sorgente |
Es.
n°1 |
|
|
|
Es.
n°2 |
|
|
|
PROCEDURE
Implosione(ritardo,rig,col,lar,alt,
sfo,tipo:integer);
VAR
indirizzo:word;
finito:boolean;
BEGIN
finito:=false;
Box1 (rig,col,rig+alt-1,col+lar-1,7,sfo,' ');
REPEAT
indirizzo:=(col-1)*2+(rig-1)*160;
IF alt=1 THEN">IF
alt=1 THEN
begin
finito:=true;
asm
MOV DI,indirizzo
MOV CX,lar
INC CX
@@4:MOV AX,ES:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
INC SI
LOOP @@4
POP DX
POP CX
POP SI
POP DI
POP ES
end;
end;
ELSE IF alt=2 THEN
begin
;Elimina le eventuali
finito:=true;
;ultime 2 righe
asm
;centrali del box
PUSH ES
PUSH DI
PUSH SI
PUSH CX
PUSH DX
MOV AX,0B800H
MOV ES,AX
MOV CL,numPAG
MOV CH,00H
MOV AX,1000H
MUL CX
MOV SI,AX
ADD SI,indirizzo
MOV DI,indirizzo
MOV CX,lar
INC CX
PUSH DI
PUSH SI
PUSH CX
@@5:MOV AX,ES:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
INC SI
LOOP @@5
POP CX
POP SI
POP DI
MOV AX,00A0H
ADD SI,AX
ADD DI,AX
@@6:MOV AX,ES:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
INC SI
LOOP @@6
POP DX
POP CX
POP SI
POP DI
POP ES
end;
end
ELSE
asm
PUSH ES
; Elimina lo strato
PUSH DI
; esterno di ciascun
PUSH SI
; box precedentemente
PUSH BX
; posto a video
PUSH CX
PUSH DX
MOV AX,0B800H
MOV ES,AX
MOV CL,numPAG
MOV CH,00H
MOV AX,1000H
MUL CX
MOV SI,AX
ADD SI,indirizzo
PUSH SI
MOV DI,indirizzo
MOV CX,lar
@@1:MOV AX,ES:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
INC SI
LOOP @@1
MOV BX,0001H
MOV CX,alt
SUB CX,0002H
@@2:MOV DI,indirizzo
POP SI
PUSH SI
MOV AX,00A0H
MUL BX
ADD SI,AX
ADD DI,AX
MOV AX,ES:[SI]
MOV ES:[DI],AX
PUSH CX
MOV AX,0002H
MOV CX,lar
SUB CX,0001H
MUL CX
ADD SI,AX
ADD DI,AX
POP CX
MOV AX,ES:[SI]
MOV ES:[DI],AX
INC BX
LOOP @@2
MOV DI,indirizzo
POP SI
MOV BX,alt
SUB BX,0001H
MOV AX,00A0H
MUL BX
ADD SI,AX
ADD DI,AX
MOV CX,lar
@@3:MOV AX,ES:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
INC SI
LOOP @@3
POP DX
POP CX
POP BX
POP SI
POP DI
POP ES
end;
rig:=rig+1;
col:=col+1;
lar:=lar-2; IF lar<1 THEN lar:= 1;
alt:=alt-2; IF alt<1 THEN alt:= 1;
delay2 (ritardo);
UNTIL
finito;
END;
|
|