|  | 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
                   salvare in una Pagina alternativa
                  della  il 
    contenuto di  una finestra 
    (caratteri e attributi di colore) attualmente posta nella pagina video 
    corrente (Pagina 0). |  |  | Le
                   dimensioni (alto,
                  largo) del Box, in funzione dei 
    parametri passati alla procedura, sono calcolate in Pascal. |  |  | Anche il  salvataggio 
    dei bytes viene gestito 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
          SALVAbox(ri,co,ri1,co1,numPAG:byte) 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 
             SI           ;
 PUSH  CX           ;
 MOV   CL,numPAG    ;Costruisce
             il puntatore alle loca-
 MOV   CH,00H      
             ;zioni di destinazione in Ram Video
 MOV   AX,1000H    
             ;
 MUL   CX
 MOV   SI,AX
 ADD   SI,indirizzo
 MOV   AX,0B800H
             ;Punta la  locazione  desiderata in
 MOV   ES,AX       
             ;Ram  Video,   ES:DI = ES:indirizzo
 MOV   DI,indirizzo  ;
 MOV   CX,largo
 @@1:MOV   AX,ES:[DI]  
             
        ;
 MOV  
             ES:[SI],AX   ;
 INC   DI          
             ;
 INC   DI          
             ;
 INC   SI          
             ;Sposta Ascii/Attributo in Ram
 INC   SI          
             ;
 LOOP  @@1         
             ;
 POP   CX
 POP  
             SI           ;Recupero  dei  registri  coinvolti
 POP   DI          
             ;
 POP   ES          
              ;
 end;
 UNTIL
  n=alto;
 END;
 |  |