Les unités d'E/S sont des interfaces entre la mémoire de l'Apple et les périphériques. Dans l'émulateur, c'est une interface entre les couches noyau et matériel.
Les unités sont représentés par des classes descendantes de la classe CUnit
.
Du côté mémoire de l'Apple, seules deux méthodes sont utilisées : read
(lecture) et write
(ecriture).
C'est à peu près la même chose que pour une mémoire excepté que l'adressage est en 8 bits au lieu de 16.
Du côté périphérique, il n'y a pas de spécification. La plupart des
unités ne comportent que des interrupteurs logiciels. A chaque interrupteur
correspoind une méthode
get_<switch>
et, si modifiable, une
méthode set_<switch>
, où
<switch>
est le nom de l'interrupteur
en minuscules.
Les unités ont une méthode reset
qui est censée remettre à zéro l'unité. Elle est appelée à l'instanciation de
l'unité mais aussi lorsque l'utilisateur appuie sur le bouton "reset" (ça c'est
dans la couche matériel).
Toutes les unités sont observables et doivent notifier de tout changement pouvant subvenir. Les objets de la couche matériel doivent observer les unités pour être informés de ce qu'il se produit.
Compatibilité : Tous modèles.
Cette unité est en charge du clavier. Sur les Apple II, il n'y avait pas de tampon clavier. Cette unité ne peut donc gérer qu'une touche à la fois.
void press_key(BYTE key);
Indique à l'unité quelle touche est en train d'être pressée. Notez que si la touche précédente n'a pas encore été lue, elle sera oubliée. Les codes de touche doivent être en code ASCII Apple.
void release_key();
Indique à l'unité que la touche a été relâchée.
bool key_waiting();
Indique s'il y a une touche en attende de lecture par l'Apple. Cette méthode peut être particulièrement utile pour développer un tampon clavier ou un outil de copier coller.
Adresse | Nom | Accès | Effet |
---|---|---|---|
0x00 | KBD | R | Bits 0-6 : Dernière touche pressée ou en train de l'être. Bit 7 : est à 1 si une touche a été pressée depuis la dernière remise à zéro. |
0x10 | KBDSTROBE | RW | Remet à zéro le clavier. Bits 0-6 : Dernière touche pressée ou en train de l'être. Bit 7 : à 1 si une touche est enfoncée. |
Compatibilité : Tous modèles.
Malheureusement cette unité n'est pas encore implémentée.
Compatibilité : Tous modèles.
Le haut parleur de l'Apple est plutôt basique : il n'a que deux niveau. Le niveau du haut parleur est inversé en accédant à l'interrupteur logiciel SPKR. Du côté périphérique, le niveau du haut parleur peut être lu.
Compatibilité : Tous modèles (sauf peut être le //c).
L'unité de jeu possède trois sortes de dispositif : Trois boutons poussoirs, quatre annonciateurs et quatre entrées analogiques.
Les boutons poussoirs sont connectés à ceux du joystick ou des paddles. A partir du //e, le bouton 0 est aussi connecté à la touche du clavier Pomme Ouverte et le bouton 1 à la touche Pomme Pleine. Sur certains modèles de //e, le bouton 2 était connecté à la touche Shift.
Les annonciateurs sont des sorties sur la prise jeu, capable de sortir à deux niveaux (ils n'ont pas été beaucoup utilisé, peut être pas du tout).
Les entrées analogiques sont connectées aux axes X et Y du joystick (habituellement, les entrées 0 et 1) ou aux paddles. Ces entrées analogiques fonctionnaient en mesurant le temps de décharge d'un condensateur dans le potentiomètre du joystick ou de la paddle. L'unité n'est capable que de déclencher la charge du condensateur et de détecter lorsqu'il est déchargé. La mesure de temps est effectuée par un programme en ROM.
Il est important de simuler ce mécanisme car certains programmes implémentent leur propre routine de mesure. La difficulté est qu'il est important de synchroniser le simulateur à l'horloge pour que le décompte de cycles, vu depuis l'intérieur, soit correct.
Interrupteur | Off | On |
---|---|---|
AN0 | Annonciateur 0 au niveau bas | Annonciateur 0 au niveau haut |
AN1 | Annonciateur 1 au niveau bas | Annonciateur 1 au niveau haut |
AN2 | Annonciateur 2 au niveau bas | Annonciateur 2 au niveau haut |
AN3 | Annonciateur 3 au niveau bas | Annonciateur 3 au niveau haut |
PB0 | Bouton 0 relâché | Bouton 0 appuyé |
PB1 | Bouton 1 relâché | Bouton 1 appuyé |
PB2 | Bouton 2 relâché | Bouton 2 appuyé |
PADDL0 | Condensateur de l'entrée 0 déchargé | Condensateur de l'entrée 0 chargé |
PADDL1 | Condensateur de l'entrée 1 déchargé | Condensateur de l'entrée 1 chargé |
PADDL2 | Condensateur de l'entrée 2 déchargé | Condensateur de l'entrée 2 chargé |
PADDL3 | Condensateur de l'entrée 3 déchargé | Condensateur de l'entrée 3 chargé |
PTRIG | Les condensateurs sont en décharge | Les condensateurs sont en charge |
Adresse | Nom | Accès | Effet |
---|---|---|---|
0x58 | CLRAN0 | WR | Éteint AN0 |
0x59 | SETAN0 | WR | Allume AN0 |
0x5A | CLRAN1 | WR | Éteint AN1 |
0x5B | SETAN1 | WR | Allume AN1 |
0x5C | CLRAN2 | WR | Éteint AN2 |
0x5D | SETAN2 | WR | Allume AN2 |
0x5E | CLRAN3 | WR | Éteint AN3 |
0x5F | SETAN3 | WR | Allume AN3 |
0x61 | PB0 | R7 | Lit l'état de PB0 |
0x62 | PB1 | R7 | Lit l'état de PB1 |
0x63 | PB2 | R7 | Lit l'état de PB2 |
0x64 | PADDL0 | R7 | Lit l'état de PADDL0 |
0x65 | PADDL1 | R7 | Lit l'état de PADDL1 |
0x66 | PADDL2 | R7 | Lit l'état de PADDL2 |
0x67 | PADDL3 | R7 | Lit l'état de PADDL3 |
0x70 | PTRIG | R | Déclenche la charge des condensateurs* |
* : Quand la charge est déclenchées, PTRIG passe à vrai, les observateurs sont notifiés, puis il repasse à faux (les observateurs sont de nouveau notifiés). Tout cela dans le même cycle d'horloge (en réalité, pendant le même appel de méthode). C'est la façon dont l'unité de jeu informe les observateurs qu'il doivent commencer la simulation de la décharge.
Compatibilité : Tous modèles.
Réference: Apple IIe Technical Reference Manual page 29 (PDF p63)
Cette unité s'occupe du passage du mode texte aux modes graphiques, excepté le mode double haute résolution qui a été implémenté plus tard. L'Apple ][ a un mode texte et deux modes graphiques (basse et haute résolution). Un mode mixte permet de partager l'écran en deux, en ayant 4 lignes de texte en bas et le reste en graphique. Chaque mode possède deux pages correspondant à deux espaces mémoire différents.
Adresse | Nom | Accès | Effet |
---|---|---|---|
0x50 | TXTCLR | RW | Passe TEXT à 0 |
0x51 | TXTSET | RW | Passe TEXT à 1 |
0x52 | MIXCLR | RW | Passe MIXED à 0 |
0x53 | MIXSET | RW | Passe MIXED à 1 |
0x54 | TXTPAGE1 | RW | Passe PAGE2 à 0 |
0x55 | TXTPAGE2 | RW | Passe PAGE2 à 1 |
0x56 | LORES | RW | Passe HIRES à 0 |
0x57 | HIRES | RW | Passe HIRES à 1 |
Et, sur le //e et les modèles suivants, quelques adresses de lectures ont été ajoutées :
Compatibilité : Tous modèles.
Cette unité gère les ports d'extension de l'Apple. Elle ne fait que transférer les requêtes de lectures et d'écriture sur l'espace $C090-$C0FF vers l'unité d'entrée/sortie de la carte correspondante.
Comme le Bus des ROM périphériques, cette unité doit être informée quand une carte est insérée ou retirée.
void insert_card(int slot, CUnit *cardUnit);
Indique à l'unité qu'une carte a été insérée. slot
est le numéro du port (1-7) et cardUnit
est l'unité
d'E/S de la carte d'extension.
void remove_card(int slot);
Indique à l'unité qu'une carte a été retirée. slot
est le numéro du port (1-7).
Adresse | Nom | Accès | Effet |
---|---|---|---|
0x90-0x9F | RW | Transféré aux adresses 0x00-0x0F de la carte du port 1 | |
0xA0-0xAF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 2 | |
0xB0-0xBF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 3 | |
0xC0-0xCF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 4 | |
0xD0-0xDF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 5 | |
0xE0-0xEF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 6 | |
0xF0-0xFF | RW | Transféré aux adresses 0x00-0x0F de la carte du port 7 |
Compatibilité : Tous modèles (probablement sauf le ][).
Réference : Apple IIe Technical Reference Manual pages 79 à 83 (PDF pp113-117)
Cette unité pilote le Bus de la carte langage en utilisant trois interrupteurs : LCRAM, LCBNK2 et LCWRITE.
Seuls LCRAM et LCBNK2 peuvent être lus depuis l'intérieur de l'Apple. LCWRITE n'est pas le nom officiel pour cet interrupteur (j'ai choisis celui là car je n'ai pas trouvé d'autre nom dans la documentation).
Pour changer l'état de LCWRITE, deux requêtes de lectures doivent être effectuées à l'adresse appropriée. Un quatrième interrupteur est utilisé dans Vinace pour gérer cette double lecture. Il est appelé LCWCHG.
Adresse | Nom | Accès | Effet |
---|---|---|---|
0x11 | RDLCBNK2 | R7 | Lit l'état de LCBNK2 |
0x12 | RDLCRAM | R7 | Lit l'état de LCRAM |
0x81 | R | Passe LCBNK2 à 1, LCRAM à 1 et LCWRITE à 0 | |
0x81 | RR | Passe LCBNK2 à 1, LCRAM à 0 et LCWRITE à 1 | |
0x82 | R | Passe LCBNK2 à 1, LCRAM à 0 et LCWRITE à 0 | |
0x83 | RR | Passe LCBNK2 à 1, LCRAM à 1 et LCWRITE à 1 | |
0x84-0x87 | Identique à 0x80-0x83 | ||
0x88 | R | PasseLCBNK2 à 0, LCRAM à 1 et LCWRITE à 0 | |
0x89 | RR | Passe LCBNK2 à 0, LCRAM à 0 et LCWRITE à 1 | |
0x8A | R | Passe LCBNK2 à 0, LCRAM à 0 et LCWRITE à 0 | |
0x8B | RR | Passe LCBNK2 à 0, LCRAM à 1 et LCWRITE à 1 | |
0x8C-0x8F | Identique à 0x88-0x8B |
Compatibilité: //e et suivants.
Malheureusement cette unité n'est pas encore implémentée.
Compatibilité: //e et suivants.
Cette unité s'occupe du passage entre les modes 40 et 80 colonnes, ainsi que du changement de police de caractère.
Compatibilité : //e, IIgs
Certains modèles d'Apple avaient plus de 12Ko de ROM. Pour accéder aux reste de la ROM, l'espace mémoire $C100-$CFFF, habituellement réservé aux ROMs des périphériques, pouvait être utilisé. Une fenêtre en $C300-$C3FF, correspondant à la carte 80 colonne, pouvait être sélectionnée spécifiquement.
Cette unité pilote le Bus de la ROM E/S qui s'occupe de la commutation entre la ROM interne et la ROM des périphériques en $C100-$CFFF.
Précédent | Sommaire | Suivant |
L'unité d'entrées/sorties du //e | Niveau supérieur | Pas encore implémenté |