| 
    
   
   
  Il PCLATH nelle tabelle RETLW
  Parlando delle
  tabelle RETLW, abbiamo accennato al fatto che il PCL è un registro a
  8 bit e che un suo aumento oltre il valore limite FFh (o decremento sotto 00h)
  è effettivo solamente per il PCL steso; non c'è un meccanismo che aggiorni
  anche la parte alta (PCH) del Program Counter.
  Ne deriva che, nella classica tabella RETLW dei PIC Base-Mid: 
  
    
      
        Retlw_table 
               addwf   PCL,
          f 
           
              retlw "A" 
              retlw "B" 
              retlw "C" 
              retlw "D" 
              retlw "E" 
              retlw "F 
              retlw "G" 
              retlw "H" 
              .... | 
       
     
   
  Si deve prestare attenzione a che: 
  
    - la tabella non superi FFh locazioni
 
    - non sia a cavallo di due pagine
 
    - non sia in una pagina diversa da quella chiamante
 
   
  Si verifica la situazione che, se per  CALL o GOTO lo spazio
  indirizzabile è 800h instruzioni, l' ampiezza del PCL limita a sole 100h,
  così ogni tavola oltre i 256 valori "incrocia" una pagina seguente. 
  E, se non si apportano correzioni, il programma va in crash a causa dell'
  errato valore che viene a caricarsi nel PC. 
  MPASM non dispone di sistemi di avviso per queste situazioni, ma è
  semplice implementarli.  
  Ad esempio è possibile aggiungere un Warning in funzione della posizione
  della tabella, automaticamente calcolato dall' Assembler in base al valore
  dell' indirizzo di partenza e di fine della tabella stessa: 
  
    
      
        Retlw_table 
               addwf   PCL,
          f 
           
          tableR: 
              retlw "A" 
              retlw "B" 
              retlw "C" 
              retlw "D" 
              retlw "E" 
              retlw "F 
              retlw "G" 
              retlw "H" 
              ...
                IF
          ((HIGH ($)) != (HIGH (tableR))) 
                 ERROR
          "La tabella è a cavallo di due pagine !" 
             ENDIF  
         | 
       
     
   
  Per risolvere il caso di programmi complessi, dove il posizionamento delle
  tabelle in memoria dipende dalla compilazione, può essere utile inserire un
  meccanismo, sempre calcolato dall' Assembler, per adeguare il Program Counter: 
  
    
      
        ; Chiamata della
          tabella 
                 movlw 
          high (tableR:) 
             movwf  PCLATH 
             movf   offset,w 
             addlw  tableR: 
             btfsc  STATUS, C 
              incf  PCLATH,f 
             movwf  PCL 
           
          tableR: 
              retlw "A" 
              retlw "B" 
              retlw "C" 
              retlw "D" 
              retlw "E" 
              retlw "F 
              retlw "G" 
              retlw "H" 
              ...
                IF
          ((HIGH ($)) != (HIGH (tableR))) 
                 ERROR
          "La tabella è a cavallo di due pagine !" 
             ENDIF  
         | 
       
     
   
  Ovvero, inizialmente si opera l' aggiornamento di PCLATH se la somma di
  PCL+ l' offset supera FFh.
 
  Anche qui, va notato che non ci sono problemi per il ritorno dalle chiamate
  in quanto a seguito delle istruzioni RETURN, RETLW e RETFIE il Program Counter
  viene caricato con il contenuto del top dello stack.
  Essendo lo stack a  bit, esso conserva l' indirizzo di ritorno completo
  della parte bassa e alta.
 
  Analoga struttura si userà volendo riportare questo codice ai PIC18 (oltre
  al raddoppio dell' offset e al limite di capacità dela tabella dimezzato), ma non è la via
  migliore per accedere alle tabelle in memoria
  programma per questi processori,che dispongono nel set di istruzioni di potenti opcodes
  e registri dedicati alla
  scrittura/lettura di tabelle (TABLAT) e che permetto implementazioni molto più
  semplici di quelle dei PIC inferiori, più efficienti e più veloci.
 
   
   
  |