Voici un schéma de la mémoire d'un Apple //e 64Ko.
Le processeur accède seulement au bus mémoire principal (main memory bus). l'IOU est l'unité d'entrée/sortie.
Il y a un banc de 64Ko de RAM et plusieurs bancs de ROM :
La ROM de la carte language (LC ROM) contient les routines moniteur et celles du basic (Applesoft sur le //e, Integer sur le ][+). Elle est visible dans l'espace $D000-$FFFF.
La ROM interne contient des routines additionnelles pour le //e.
Les ROM des cartes périphériques (card ROM) sont les ROMs des cartes d'extension.
Voici une explication de chacun des bus.
Ce bus est la partie visible de la mémoire (depuis le point de vue du processeur). Ce bus divise la mémoire en quatre parties :
$0000-$BFFF est connecté à la RAM.
$C000-$C0FF est connecté à l'unité d'entrée sortie (IOU).
$C100-$CFFF est connecté au bus de la ROM E/S (peut être connecté à la ROM des cartes périphériques ou bien à la ROM interne).
$D000-$FFFF est connecté au bus de la carte langage (habituellement, la ROM principale est visible ici).
Référence : Apple IIe Technical Reference Manual pages 79 to 83 (PDF pp113-117)
Le bus de la carte langage est en charge des 12Ko les plus hauts de la mémoire. Cet espace était originellement dédié à la ROM Basic et moniteur dans les Apple ][ 48Ko. Sur les Apples 64Ko, une nouvelle possibilité était d'adresser de la RAM dans cet espace. Cette fonctionnalité est utilisé pour charger des langages alternatifs en mémoire (comme le basic Integer du ][+ sur un //e).
La lecture et l'écriture peuvent être modifiés indépendamment. Ceci permet d'écrire en RAM pendant que la ROM est visible. C'est particulièrement pratique lorsque l'on prépare la RAM car bien des routines bas niveau sont en ROM (affichage du texte, lecture du clavier...).
Comme 16Ko de RAM sont disponibles mais l'espace ne fait que 12Ko, les 4Ko inférieurs ($D000-$FFFF) peuvent adresser deux bancs de RAM. Les 8Ko supérieurs sont toujours connectés à la même RAM.
Ce bus est piloté par l'Unité de carte langage en utilisant les interrupteurs logiciels LCRAM, LCWRITE et LCBNK2.
Par défaut (LCRAM et LCWRITE sur off), la ROM est lisible et les écritures n'ont aucun effet.
Les requêtes d'écriture sont transmises à la RAM si LCWRITE est actif. Sinon, les requête d'écriture n'ont pas d'effet (comme pour une ROM).
Les requêtes de lecture sont transmises à la RAM si LCRAM est actif et à la ROM sinon.
Les 8Ko supérieurs ($E000-$FFFF) sont connectés aux 8Ko supérieurs de la RAM ($E000-$FFFF).
Les 4Ko inférieurs ($D000-$DFFF) sont connectés à la RAM en $D000-$DFFF si LCBNK2 est actif ou à celle en $C000-$CFFF sinon.
L'Apple //e et les modèles suivants ont plus que 12Ko de ROM. Pour accéder au reste de la ROM, l'espace $C100-$CFFF, habituellement réserver aux ROM des cartes périphériques peut être utilisé. Une fenêtre, en $C300-$C3FF, correspondant à la carte 80 colonnes, peut être sélectionnée spécifiquement.
Ce bus est piloté par l'unité de ROM E/S en utilisant les interrupteurs logiciels CXROM et C3ROM.
Si CXROM est actif, les requêtes sont transmises au bus des ROM périphériques. Si CXROM est actif, la ROM interne est visible.
C3ROM permet de voir la ROM interne en $C300-$C3FF quelque soit l'état de CXROM. Ceci est utilisé pour masquer la ROM de la carte d'extension 80 colonnes et pour utiliser les routines internes à la place.
Chaque carte d'extension peut avoir 256 octets de ROM basique plus une extension ROM de 4Ko. La ROM basique est visible en $Cn00-$CnFF, où n est le numéro du port.
Lorsque la ROM basique est lue, l'extension ROM (s'il y en a une) est sélectionnée et devient visible en $C800-$CFFF. $CFFF est aussi un interrupteur logiciel (nommée CLRROM) qui désélectionne la ROM.
Ceci est expliqué dans le Apple IIe Technical Reference Manual page 132.
Le bus des ROM périphériques est en charge de transférer les requêtes de lecture à la bonne ROM. Comme l'unité des ports d'extension, il doit être informé des insertions et retraits de cartes.
La méthode insert_card
indique
au bus qu'une carte a été insérée :
void CSlotRomBus::insert_card(int slot, CMemory *cardRom, CMemory *cardRomExt)
slot
est le numéro du port (1-7).
cardRom
est la ROM basique de la carte et
cardRomExt
est sont extension.
La méthode remove_card
indique
au bus qu'une carde a été retirée :
void CSlotRomBus::remove_card(int slot)
slot
est le numéro du port (1-7).
Précédent | Sommaire | Suivant |
Bus mémoire | Niveau supérieur | Fichiers de ROM |