Pages : [01] [02] [03] [04] [05] [06] [07] [08] [09] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21]


A la place, nous allons nous servir de A pour brancher directement vers la bonne routine en une seule commande. La technique consiste a considérer nos labels AFFBALL0...AFFBALL7 comme un tableau :

AFFTABLE      
  FDB AFFBALL0  
  FDB AFFBALL1  
  FDB AFFBALL2  
  FDB AFFBALL3  
  FDB AFFBALL4  
  FDB AFFBALL5  
  FDB AFFBALL6  
  FDB AFFBALL7  

Il ne reste alors plus qu'à charger un registre 16 bits (X ou Y) pour pointer au debut de notre tableau, et faire un JSR relatif au tableau et au numéro de ball (registre A)

  LDY #AFFTABLE  
  JSR [A,Y]  

Un dernier problème réside ici. Le branchement ne sera pas correct car nos valeurs possibles pour A sont 0,1,2,3,4,5,6 ou 7 alors que les adresses contenu dans le tableau sont aux positions 0,2,4,6,8,10,12, ou 14 (un label/adresse est codé sur 2 octets). Notre valeur dans A a donc la moitié de ce qu'elle devrait avoir. Il faudra donc modifier la routine calculant A de facon à avoir les bonnes valeurs. Nous ne ferons donc que 4 décalages à droite (au lieu de 5) et nous adapterons notre masque. Rappelons nous qu'un decalage logique à droite divise un nombre par 2 (ne garde que la partie entière bien entendu). De la meme facon, un décalage logique a gauche multiplie ce nombre par 2. En supprimant un décalage à droite, notre nombre est donc par conséquent 2 fois plus grand qu'auparavant.

Routine originale

  * D contient une information offset+num ball
  PSHS A  
  ANDA #$1F  
  TFR D,Y * Y contient l'offset uniquement
  PULS A  
  ASRA    
  ASRA    
  ASRA    
  ASRA    
  ASRA   * A est decale a droite de 5 bits
  ANDA #$07 * A contient le numero de ball
Routine modifiee

  * D contient une information offset+num ball
  PSHS A  
  ANDA #$1F  
  TFR D,Y * Y contient l'offset uniquement
  PULS A  
  ASRA    
  ASRA    
  ASRA    
  ASRA    
      * A est decale a droite de 4 bits
  ANDA #$0E * A = numero de ball * 2

© PULS 2004-2019