Arg! Faut que je vienne plus souvent ici :/
Ouais sinon les addresses $2xxx signifie qu'on a mappé la RAM sur le mpr #1. Comme indiqué dans les tg internals, les adresses physiques sont:
- 1F0200 - 1F1FFF => base scratch pad
- 1F0100 - 1F01FF => la pile
- 1F0000 - 1F00FF => zero page
Attention, on peut mapper cette zone sur n'importe quel mpr. Il n'y a pas de norme explicite. Généralement, tout ceci est fait dans le vecteur d'interruption de reset. De plus, c'est généralement mappé sur le mpr #1 (mais ca peut changer en cours de route

).
Mais qu'est ce donc que ces mprs? Eh ben c'est simple... Comme vous l'avez remarqué, les addresses physiques sont sur 21bits. Or en asm 6502 les addresses sont sur 16bits.
La technique consiste donc à découper les zones addressables en blocs de 8ko (les banks). L'addresse logique (sur 16 bits) contient le mpr à utiliser et l'offset dans le bloc de 8ko pointé par le mpr. On peut faire l'analogie entre les mprs et une table de "traduction" (ou une palette). Un petit exemple sera plus claire je pense.
Disons qu'on veuille stocker la valeur 32 dans le 10eme octet de la bss. L'addresse
physique de cet octet est :
addr=1F020A
On doit donc mapper le bloc de 8ko correspondant afin de pouvoir acceder à cette addresse. Alors 8ko c'est 8192 bits, ou 2^13. On obtient donc le bloc en décalant l'addresse de 13 bits vers la droite.
bank = addr >> 13 (ce qui donne F8 )
On va faire comme tout le monde et la mapper sur le mpr #1. On initialise un mpr en asm avec l'instruction tam qui transfere la valeur du registre A vers le mpr spécifié en argument. Or la syntaxe est un peu spéciale. On n'indique pas directement la valeur du mpr mais 1 << numMpr. On a donc en pseudo-asm:
lda #(addr >> 13)
tam #(1 << numMpr)
En vrai ça donne:
lda #$F8
tam #$02
C'est bien beau tout ça, mais on a toujours notre 10eme octet de la bss à initialiser.
La mpr 1 "pointe" donc vers le bloc (ou segment) de 8ko de la RAM contenant la zp, la pile, la bss (et le reste des 8ko). L'addresse logique est la concaténation du numéro de la mpr à utiliser et de l'offset dans le bloc de 8ko pointé.
logicAddr = (numMpr << 13) | (addr & 8191)
logicAddr = (1 << 13) | (1F020A & 1FFF)
logicAddr = 2000 | 020A = 220A
Et donc en asm:
lda #32
sta $22A0
Tadam!
Tiens un petite question:
Si on n'accède qu'à la zp et la pile, est-ce qu'on est obligé de mapper 1F0000 vu qu'on peut accéder directement à ces zones (pha,pla,etc pour la pile. et inst $XX pour la zp) ?
Et heu, ya pas moyen de chopper les msgs du forum par mail ou par flux rss?