Libreria delle ProcedureGestione Cornici

Entra nella Libreria GIOBE.TPU

 Implosione 

CODICE SORGENTE [4 di 6]  

    
bulletLa 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).
bulletCome prima cosa viene stampato un box dello stesso colore e delle medesime dimensioni della cornice che si deve togliere dal video
bulletCiò 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.
bulletSi può capire come questa operazione sia .....
bulletIn realtà esso è costituito da 3 blocchi simili e alternativi; tutti e 3 portano a termine il compito richiesto, ma ciascuno in modo specializzato:
bulletil primo blocco (zona blu) risolve il problema quando il box si è ridotto ad una sola riga
bulletil secondo (zona verde) si occupa del problema quando il box si è ridotto a 2 righe, trattandole contemporaneamente
bulletl'ultimo blocco (zona azzurra) elimina lo strato esterno del box in tutti gli altri casi
bulletPer garantire il servizio si ricorre alla tecnica della RamVideo [per saperne di più consulta la Scheda nella Sezione Dentro il Computer].
bulletDa notare l'uso di una procedura di ritardo per rendere realistica l'implosione dell'area trattata
    
Codice Sorgente Es. n°1 Mostra Effetto Esegui il Programma Scarica l'Esempio d'Applicazione
Es. n°2 Mostra Effetto Esegui il Programma Scarica l'Esempio d'Applicazione
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;
    
bulletIl codice sviluppa le seguenti parti:
bulletstampa un box esattamente sopra la cornice da eliminare (zona nera)
bulletcalcolo dell'indirizzo corrente del primo carattere dello strato da trattare (in Pascal, zona marrone)
bulletelimina l'ultimo strato, se è costituito da una sola riga (zona blu)
bulletelimina l'ultimo strato, se è costituito da 2 sole righe (zona verde)
bulletelimina lo strato esterno corrente, se il box sotto servizio ha più di 2 righe (zona azzurra)
bulletprepara le coordinate e le dimensioni adatte a servire il prossimo strato (in Pascal, zona rosa)
    
Pagina Precedente Cornici Pagina Successiva   Implosione Lezioni - Vai al DownLoad dei files DOC Torna al Menu "Cornici"
Esempio1/Esempio2 Sorgente Mostra1/Mostra2
34 di 51

    

PASCAL  »

Libreria Giobe | Librerie Standard | Allegati | Applicazioni | Info | Download
PROCEDURE  »   Caratteri | Mouse | Tastiera | Tempo, Data & Ora
Box | Cornici | Cursore | Aree a Riga Intera | Aree a Schermo Totale
FUNZIONI  »   Caratteri | Mouse | Tastiera | Tempo, Data & Ora
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati