Revenir au plan du site
Utilisation avancée de la mémoire RAM/ROM sur la gamme Plus/GX
Introduction au mapping
Pour cet article, nous utiliserons les macros définies dans
[ l'annexe sur les connexions RAM/ROM ]
Elles sont au nombre de quatre :
-
MMR (spécifique 6128 et 6128+)
-
RMR (tous modèles)
-
UPPER_SELECT (tous modèles)
-
RMR2 (spécifique Plus)
Je vous conseille fortement de les utiliser plutôt que d'écrire directement les valeurs binaires ou hexa correspondantes, votre code sera LISIBLE.
Le petit graphique de
[ l'article précédent ] est toujours d'actualité, si vous voulez utiliser ROM basses, ROM hautes et l'Asic en même temps, il faudra positionner pile et code dans la zone #8000-#BFFF. Si vous voulez exécuter du code depuis les ROM, c'est possible mais il faudra toujours conserver la pile dans la zone #8000-#BFFF ou alors ne pas l'utiliser!
Pour configurer l'espace mémoire à sa guise, il faut jongler avec plusieurs macros (ou fonctionnalités de l'ASIC) qui travaillent de concert. Voici un résumé en image.
Le remapping du Plus et la confusion des indexes
Le UPPER_SELECT permet de sélectionner les banks 0 à 31 de la cartouche avec les indexes 128 à 159 (bit 7 indique qu'on utilise la cartouche).
Connecter une ROM haute dont le nombre est inférieur à 128 va passer par un remapping de l'ASIC.
- La ROM haute zéro (typiquement le BASIC) est en fait la bank 1 de la cartouche BASIC (ou 129).
- La ROM haute 7 (typiquement l'AMSDOS) est en fait la bank 3 de la cartouche BASIC (ou 131) sauf sur GX4000 et 464+.
MAIS! Car il y a un mais. Si une carte d'extension ROM est connectée sur le port d'extension, la ROM a priorité et son numéro n'est pas remappé vers la cartouche. Ouf!
Le RMR2 permet de sélectionner la ROM basse DE LA CARTOUCHE (une ROM d'extension n'aura pas priorité sur cette valeur) à mapper en tant que ROM basse. Les indexes 0 à 7 sont en réalité équivalent aux indexes 128 à 135 (banks de la cartouche indexées de 128 à 159).
Dans RASM, la création de cartouche se fait en numérotant les BANK (avec la directive BANK) de 0 à 31. Elles se connectent avec le bit 7 donc utilisez un UPPER_SELECT spécial cartouche LD BC,#DF80|{banknum}.
Dans RASM, la création de snapshot se fait avec des ROM
d'extension en utilisant la directive ROMBANK. Si vous voulez faire comme sur cartouche, utilisez les indexes 128 à 159 avec la directive ROMBANK.
Quelles sont les bonnes pratiques à adopter pour configurer la mémoire?
On le voit, le RMR active/désactive les ROM et le RMR2/UPPER_SELECT permet de choisir quelle ROM utiliser. Je vous conseille de systématiquement choisir quelle ROM mapper AVANT de l'activer! Cela vous évitera des
surprises si vous êtes en train d'exécuter du code depuis une ROM, ce que vous ne manquerez pas de faire un jour. Je le sais.
Si vous voulez être compatible avec des extensions mémoires qui ne tiennent pas compte de l'ASIC, il est indispensable de remettre la mémoire par défaut avant tout usage de la page ASIC.
Si vous ne faites pas ça, chaque écriture dans l'ASIC se fera aussi dans l'extension incompatible. Oui, une compatibilité avec ces extensions empêche d'utiliser le mode ALLSLOT (le fameux #C2, #CA, #D2, ...).
MMR 0,DISABLE ; équivalent à ld bc,#7FC0 : out (c),c
RMR2 ASICON|ROM0
|
Si vous avez besoin de connecter/déconnecter l'ASIC régulièrement ET d'avoir une ROM basse particulière, n'oubliez pas qu'il faut systématiquement la repréciser avec le RMR2. En conséquenc de quoi la macro par
défaut n'est pas toujours utilisable, on pourrait la faire évoluer de cette façon pour tenir compte d'un paramètre de ROM basse.
; paramètre A=ROM basse
macro RMR2_LOW tags
and 7 ; instruction optionnelle pour sécurité!!!
or {tags}+%10100000
ld b,#7F
out (c),a
mend
|
Charge à vous de précharger A avec votre ROM basse courante que vous conservez dans une variable.
ld a,(rom_basse_courante)
RMR2_LOW ASICON
|
Cas d'usage avec la ROM basse 3, l'ASIC, la ROM haute 5 et mode 1
RMR2 ASICON|ROM3
UPPER_SELECT 5
RMR ROM_BOTH|MODE_1
|
Il ne faudra pas oublier non plus le mode graphique que vous utilisez (c'est rarament un cas variable, mais qui sait?).
Changer la ROM basse de place (Warning!)
Il est possible avec RMR2 de placer la ROM basse ailleurs que dans la zone #0000-#3FFF.
Il peut-être intéressant de vouloir placer la ROM en #8000-#BFFF pour conserver ses sauts d'interruption en #38 dans le début de la mémoire.
Cependant, chaque connexion à l'ASIC va forcer le retour de la ROM basse en #0000-#3FFF.
Aussi ce genre de configuration doit être utilisé en désactivant d'abord la ROM basse (ou se préparer à se retrouver éventuellement dedans).
RMR ROM_UP|MODE_1 ; désactiver la ROM basse
RMR2 ASICON|ROM0 ; activer l'ASIC
... ; faire sa tambouille
RMR2 ASICOFF|ROM8000|ROM0 ; désactiver l'ASIC et remettre la ROM basse ailleurs
RMR ROM_BOTH|MODE_1 ; activer à nouveau la ROM basse
|
Ce n'est pas spécialement performant, ça dépend encore une fois des cas d'usage mais surtout il devient impossible d'utiliser la ROM basse ailleurs qu'en #0000-#3FFF si vous voulez vous en servir comme source de données pour l'ASIC (typiquement des sprites).