Si vous codez en 6502, il serait bon que vous pensiez sérieusement à l'allocation des choses en mémoire
car cela à de sérieuses conséquences en terme d'optimisation !
Entre autre, cela permet ceci:
- Ne pas avoir de pénalités lors de l'utilisation de l'adressage indexé
- Ne pas avoir de pénalités lors des sauts conditionels
- Pouvoir utiliser de l'arithmétique sur 8 bits au lieu de 16
- Pouvoir faire du code automodifié plus performant
Par exemple, si vous utilisez le mode d'adressage indexé, vous devez savoir que si la valeur de l'index
vous fais changer de page vous serez alors pénalisé d'un cycle d'horloge. Si vous choisissez une adresse
de base qui est allignée sur un multiple de 256 octets vous serez sur de ne jamais avoir ce probleme.
Alors dès que possible essayez de faire en sorte d'utiliser des adresses qui finissent par $00...
Toujours pas persuadé ? Bon, en général le mode d'adressage le plus utilisé (après le mode immédiat et
le mode absolu) est l'adressage indexé (LDA $adress,x ou bien encore STA $adress,y). Si
vous la valeur de l'index vous fait sauter de page, ces instructions prendront 5 cycles pour s'exécuter
au lieu de 4. Statistiquement si vous ne faites pas attention, 50% des accès seront désalignés ce qui se
traduit par une perte sensible d'efficacité. Dans le pire des cas, si l'adresse de base se trouve 1 octet
avant la fin d'une page, cela veut dire que quasiment tous les acces seront pénalisés !
Pour alligner un bloc de données sur un multiple de 256 octets, il suffit de faire ceci:
.dsb 256-(*&255)
|
If you're coding in 6502 it's good for you to carefully think about memory allocation because it allows
a lot of speed optimisations !
Among those optimisation we can list the following:
- No cycle penalty when using indexed adressing
- No cycle penalty when using branch instructions
- Using 8bit arithmetic instead of 16bits
- Faster self modifying code
For instance, if you use indexed adressing, if you the index makes you cross a page boundary your are
penalized by one clock cycle. If you manage to make the base adress being on a page boundary, you are
sure to never cross a page. So try to allign your buffers on a adress that finishes by $00...
You're thinking it's not impressive ? Hum. In general, the most often used adressing mode (after immediate and absolute)
is the LDA $adress,x or STA $adress,y. If the lower byte of the adress is equal to 0, all indexations with
X and Y register will require 4 clock cycle. If it is not alligned, all access crossing the page boudary will take 5 clock cycle.
So, imagine you want to do a program that requires access to a table, your code will be considerably faster if you do
this simple optimisation. In that case, the good idea is too put all the n*256 bytes tables consecutively in memory.
Doing that, the waste of memory due to the alligment will be reduced.
To allign data on a 256 bytes boudary, this simple instruction will do the trick:
.dsb 256-(*&255)
|