vinace/doc/vinace-fr.xml

1132 lines
96 KiB
XML
Raw Permalink Normal View History

2019-02-18 10:04:02 +00:00
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<book lang="fr">
<title>Documentation Vinace</title>
<chapter lang="fr"><title>Introduction</title>
<para>Vinace est pour VINtage Apple Computer Emulator. Pour l'instant ce n'est
qu'un <20>mulateur d'Apple //e 64Ko. Il devrait pouvoir facilement <20>voluer vers un
<20>mulateur d'Apple ][ tout mod<6F>le.</para>
<para>Ce document comporte deux parties. La partie <emphasis>Utiliser Vinace</emphasis>
explique comment utiliser Vinace et la partie <emphasis>A l'int<6E>rieur de Vinace</emphasis>
parle du fonctionnement de Vinace.</para>
<para>Ce document est encore en cours d'<27>criture, ce n'est pas une version finale.
Beaucoup d'informations peuvent manquer.</para>
</chapter>
<part><title>Utiliser Vinace</title>
<chapter lang="fr"><title>D<EFBFBD>marrage rapide</title>
<para>Si vous <20>tes press<73>, voici les instructions pour utiliser Vinace.</para>
<para>Pour d<>marrer Vinace, lancez simplement <emphasis>vinace</emphasis>
depuis l'int<6E>rieur de son r<>pertoire.</para>
<para>Pour que l'Apple arr<72>te de lire depuis le disque, pressez <emphasis>Ctrl
- Pause</emphasis>. Pour red<65>marrer l'Apple, pressez simultan<61>ment
<emphasis>Alt gauche - Ctrl - Pause</emphasis>.</para>
<para>Pour ins<6E>rer un disque, glissez un fichier d'image disque sur le lecteur
de disquette.</para>
</chapter>
<chapter lang="fr"><title>Clavier</title>
<para>Voici les touches du clavier original de l'Apple //e :</para>
<table>
<title>Touches du clavier de l'Apple //e</title>
<tgroup cols="2">
<thead>
<row><entry>Groupe</entry><entry>Touches</entry></row>
</thead>
<tbody>
<row><entry>Lettres</entry><entry>A <20> Z (majuscules, minuscules et contr<74>le)</entry></row>
<row><entry>Nombres</entry><entry>0 <20> 9</entry></row>
<row><entry>Symbols</entry><entry>! @ # $ % ^ & * ( ) - _ + = { } [ ] : ; " ' ~ `| \ &lt; &gt; , . ? /</entry></row>
<row><entry>Autres touches</entry><entry>Esc, Tab, Retour, Del, Fl<46>ches (gauche, droite, bas, haut)</entry></row>
<row><entry>Touches sp<73>ciales</entry><entry>Reset, Pomme ouverte, Pomme pleine</entry></row>
</tbody>
</tgroup>
</table>
<para>Le clavier virtuel de l'Apple est associ<63> au clavier de votre ordinateur.
Les lettres (majuscules, minuscules et contr<74>les), les nombres, les symboles et les
autres touches sont directement connect<63>s au touches correspondantes.</para>
<para>Les touches <emphasis>Pomme ouverte</emphasis> et <emphasis>
Pomme pleine</emphasis> sont connect<63>es aux touches <emphasis>Alt
gauche</emphasis> et <emphasis>Alt droite</emphasis>.</para>
<para>La combinaison de touches <emphasis>Ctrl - Reset</emphasis> est
connect<63>e <20> la combinaison <emphasis>Ctrl - Pause</emphasis> (la touche
<emphasis>Reset</emphasis> seule n'a aucun effet sur le clavier de l'Apple).</para>
<para>Ceci signifie que, si vous voulez red<65>marrer l'Apple //e, vous devez
presser <emphasis>Alt gauche - Ctrl - Pause</emphasis> l<> o<>, sur le clavier
original, vous pressiez <emphasis>Pomme ouverte - Ctrl - Reset</emphasis>.</para>
</chapter>
<chapter lang="fr"><title>Joystick</title>
<para>Dans Vinace, il y a une <20>mulation d'un joystick simple, utilisant le pav<61>
num<75>rique. En r<>alit<69>, le joystick de l'Apple est capable de d<>tecter 256 positions
sur chaque axe. Le joystick Vinace n'est capable de simuler que trois positions
sur chaque axe (0, 128 et 255). Ceci doit convenir pour la plupart des jeux mais
ne sera pas suffisant pour ceux faisant un usage pr<70>cis du joystick.</para>
<para>La touche "5" du pav<61> num<75>rique est la position centrale. La touche "8"
est pour le haut, la touche "2" pour le bas, la touche "4" pour la gauche et la "6"
pour la droite. Les touches en diagonale (7, 9, 1 et 3) fonctionnent aussi.</para>
<figure><title>Emulation du joystick par le pav<61> num<75>rique</title>
<mediaobject>
<imageobject>
<imagedata fileref="numpad-joystick.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>L'<27>mulation du joystick par le pav<61> num<75>rique : comment
les touches sont li<6C>es aux positions du joystick.</phrase>
</textobject>
</mediaobject>
</figure>
<para>Il n'y a pas encore d'<27>mulation des boutons, la touche <emphasis>Alt
gauche</emphasis> doit donc <20>tre utilis<69>e pour le bouton 0 et <emphasis>Alt
droite</emphasis> pour le bouton 1.</para>
</chapter>
<chapter lang="fr"><title>Disquettes et lecteurs</title>
<para>Les lecteurs de disquette dans Vinace sont faciles <20> utiliser.</para>
<para>Pour ouvrir ou fermer le lecteur, cliquez simplement sur le fermoir.</para>
<para>Pour ins<6E>rer une disquette dans un lecteur, glissez le fichier image disque
sur le lecteur. En cas de succ<63>s, le nom de la disquette va appara<72>tre sur le lecteur
et il se refermera automatiquement.</para>
<para>Seuls les fichiers <emphasis>.dsk</emphasis> (Images disque en ordre
DOS) sont support<72>s pour l'instant. D'autres formats (images disque en ordre ProDOS,
images nibbles) seront support<72>s plus tard.</para>
<para>L'<27>criture sur disque n'est pas encore impl<70>ment<6E>e.</para>
<para>Des images disque peuvent <20>tre trouv<75>es sur le d<>p<EFBFBD>t Asimov, dans la
section Images ici : </para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/images/">
ftp://ftp.apple.asimov.net/pub/apple_II/images/</ulink></para>
</chapter>
</part>
<part><title>A l'int<6E>rieur de Vinace</title>
<chapter lang="fr"><title>Principes g<>n<EFBFBD>raux</title>
<para>Avant d'aller plus profond dans Vinace, voici, en tant qu'introduction,
quelques principes g<>n<EFBFBD>raux.</para>
<section><title>Pourquoi un nouvel <20>mulateur ?</title>
<para>Les <20>mulateurs existant ont une interface graphiques vieille et peu pratique
(pas d'utilisation de la souris, ligne de commande pour changer de disquette).</para>
<para>Les <20>mulateurs existants sont <20>crits pour <20>tre performants et pas pour <20>tre
compr<70>hensibles ou modulaires.</para>
<para>Les <20>mulateurs existants sont monolithiques, pas assez proche du mat<61>riel original
et pas tr<74>s facile <20> faire <20>voluer.</para>
<para>Je souhaitais d<>velopper un projet pas trop difficile pour me remettre au C++.</para>
</section>
<section><title>Qu'est-ce qu'un ordinateur ?</title>
<para>Fondamentalement, un ordinateur c'est un processeur (CPU), de la m<>moire, et des p<>riph<70>riques.</para>
<para>Le processeur est le composant central de l'ordinateur. Il r<>cup<75>re des donn<6E>es depuis la m<>moire,
il les traite et remet le r<>sultat dans la m<>moire. </para>
<para>Le processeur peut recevoir des signaux, comme le signal de remise <20> z<>ro (reset) ou les interruptions.
Il re<72>oit aussi un signal p<>riodique de l'horloge lui indiquant quand un cycle doit <20>tre effectu<74> (une instruction
est "faite" de plusieurs cycles).</para>
<para>A part les signaux, la seule communication entre le processeur et le reste du monde s'effectue
via la m<>moire. Comme diff<66>rent types de m<>moire sont disponibles (RAM, ROM, etc.), un bus m<>moire est
charg<72> d'interfacer le processeur avec ces diff<66>rent types. Selon l'adresse demand<6E>e par le processeur,
le bus transfert la requ<71>te <20> la m<>moire correspondante.</para>
<para>Pour piloter les p<>riph<70>riques, le processeur utilise la m<>moire (une fois encore, c'est la seule
porte vers le monde ext<78>rieur). Un type de m<>moire sp<73>cifique, l'unit<69> d'entr<74>e sortie (IOU), est connect<63>e
au bus m<>moire. L'unit<69> d'entr<74>e sortie n'est pas r<>ellement une m<>moire puisqu'elle ne stocke pas
d'information. Quand une adresse est acc<63>d<EFBFBD>e dans l'IOU, cela active quelque chose dans un p<>riph<70>rique
ou lit une information en provenance de ce p<>riph<70>rique. Par exemple, l'acc<63>s <20> l'adresse 15 peut activer
une lumi<6D>re, ou bien l'acc<63>s <20> l'adresse 17 peut lire l'<27>tat d'un bouton. C'est en gros comme <20>a que le
processeur interagit avec les p<>riph<70>riques.</para>
<para>Si nous mettons tout cela ensemble, nous obtenons un sch<63>ma "simple" de ce qu'est un ordinateur :</para>
<figure><title>Un ordinateur simplifi<66></title>
<mediaobject>
<imageobject>
<imagedata fileref="simple.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Un ordinateur simplifi<66> : un processeur (CPU), un bus m<>moire, de la RAM, de la ROM et une unit<69> d'entr<74>e sortie (IOU).</phrase>
</textobject>
</mediaobject>
</figure>
<para>Le rectangle orage, contenant le processeur, la m<>moire et l'unit<69> d'entr<74>e sortie mais
ni les p<>riph<70>riques, ni l'horloge, repr<70>sente ce que j'ai appel<65> le "noyau" (core). Le noyau
est la partie minimale pour que l'ordinateur fonctionne. Les p<>riph<70>riques ne font que connecter
l'ordinateur au monde et, en particulier, <20> l'utilisateur, mais ils ne sont pas indispensables.
J'ai mis l'horloge en dehors car je consid<69>re l'horloge comme une interface entre l'ordinateur et
le temps r<>el. On peut modifier la fr<66>quence de l'horloge sans affecter le comportement de
l'ordinateur. On peut m<>me utiliser une horloge manuelle pour <20>tudier l'ordinateur pas <20> pas.</para>
</section>
<section><title>Le mod<6F>le d'<27>mulateur <20> trois couches</title>
<para>Je voulais avoir un <20>mulateur modulaire qui soit flexible pour lequel il
soit facile de d<>velopper de nouvelles fonctionnalit<69>s. Je voulais aussi quelque chose
qui soit tr<74>s pr<70>s de la r<>alit<69>. Par exemple, je voulais <20>tre capable de d<>velopper
un nouveau p<>riph<70>rique que je pourrais "brancher" dans mon <20>mulateur, de la m<>me fa<66>on
que l'on branche des p<>riph<70>riques dans une machine.</para>
<para>J'ai d<>cid<69> d'utiliser un mod<6F>le <20> trois couches. Voici ces trois couches dans un sch<63>ma :</para>
<figure><title>Le mod<6F>le <20> trois couches</title>
<mediaobject>
<imageobject>
<imagedata fileref="layers.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Le mod<6F>le <20> trois couches</phrase>
</textobject>
</mediaobject>
</figure>
<section><title>Couche noyau</title>
<para>La couche noyau (core) contient tous les composants, et seulement eux,
n<>cessaires pour avoir un ordinateur qui fonctionne. Cela signifie que l'on
peut instancier un noyau seul et jouer avec lui. C'est int<6E>ressant dans un
but d'<27>tude mais cela donne un ordinateur sourd et aveugle. Le noyau peut
<20>tre vu comme l'ordinateur vu depuis l'int<6E>rieur de lui m<>me (dans cette
couche, les programmes tournent comme s'ils <20>taient dans un ordinateur
r<>el).</para>
</section>
<section><title>Couche mat<61>riel</title>
<para>La couche mat<61>riel (hardware) est la repr<70>sentation logicielle
de l'ordinateur <20>mul<75>. Cette repr<70>sentation est ind<6E>pendante de l'interface
graphique. Par exemple, la sortie vid<69>o est repr<70>sent<6E>e par une matrice de
pixels et le bouton d'un joystick par un simple bool<6F>en.</para>
<para>Cette couche doit contenir la repr<70>sentation de tous les objets du
monde <20>mul<75>, comme les disquettes ou les cartouches. Elle doit aussi contenir
toute la logique de l'<27>mulateur de fa<66>on <20> ce que la couche suivante ne soit
en charge que de l'interface homme machine.</para>
</section>
<section><title>Couche IHM</title>
<para>La couche Interface Homme-Machine (GUI) est charg<72>e de repr<70>senter <20>
l'utilisateur la couche mat<61>riel.</para>
</section>
</section>
</chapter>
<chapter lang="fr"><title>Processeur</title>
<para>Le processeur est un dispositif capable d'ex<65>cuter une s<>quence d'instructions
stock<63>es en m<>moire. Ces instructions peuvent n<>cessiter l'usage de registres (petit
morceaux de m<>moire interne). Elles peuvent aussi n<>cessiter la lecture et l'<27>criture
en m<>moire.</para>
<para>La p<>riodicit<69> de l'ex<65>cution des instruction est controll<6C>e par une horloge
indiquant au processeur quand il doit effectuer un cycle. Un cycle est une partie
d'instruction : d<>codage de l'instruction, r<>cup<75>ration des donn<6E>es depuis la m<>moire,
<20>criture en m<>moire, etc. Le nombre de cycles pour une instruction d<>pend de sa
complexit<69>.</para>
<para>Le processeur peut aussi r<>agir <20> certains signaux externes comme le
signal de remise <20> z<>ro (reset) et les demandes d'interruption. Ces signaux sont
habituellement <20>mis par les p<>riph<70>riques.</para>
<para>Donc, un processeur a trois types d'interaction avec le monde ext<78>rieur :</para>
<itemizedlist>
<listitem><para>Lecture et <20>criture en m<>moire</para></listitem>
<listitem><para>Requ<EFBFBD>te de cycle par l'horloge</para></listitem>
<listitem><para>Signaux</para></listitem>
</itemizedlist>
<para>Dans Vinace, les processeur sont repr<70>sent<6E>s par des classes h<>ritant de
la classe <classname>CProcessor</classname>.</para>
<para>Pour cr<63>er un nouveau processeur, une classe enfant doit <20>tre cr<63><72>e et les
m<>thodes suivantes doivent <20>tre impl<70>ment<6E>es :</para>
<para><emphasis>Constructeur</emphasis>: le constructeur de
<classname>CProcessor</classname> prend deux param<61>tre : la m<>moire qui
doit <20>tre li<6C>e au processeur et un nombre de signaux. Le constructeur de la classe
enfant doit appeler celui de <classname>CProcessor</classname> avec un
nombre donn<6E>e de signaux. C'est le nombre de signaux possibles diff<66>rents. Par
exemple, pour un processeur n'ayant que le signal de remise <20> z<>ro, ce nombre
est 1.</para>
<para><methodname>reset()</methodname>: cette m<>thode est cens<6E>e
remettre l'<27>tat du processeur <20> z<>ro. Elle est appel<65>e une fois lorsque le processeur
est instanci<63>. C'est <20> la classe enfant de connecter le signal de remise <20> z<>ro <20> cette
m<>thode.</para>
<para><methodname>process_instruction()</methodname>: cette m<>thode
est cens<6E>e traiter l'instruction suivante. Elle est appel<65>e par
<methodname>cycle()</methodname> une fois les cycles de l'instruction
pr<70>c<EFBFBD>dente termin<69>s. <methodname>process_instruction()</methodname>
doit augmenter le membre <varname>cycles</varname> du bon nombre de
cycles correspondant <20> l'instruction.</para>
<para><methodname>process_signals()</methodname>: Cette m<>thode est
cens<6E>e traiter les signaux. Elle est appel<65>e par
<methodname>cycle()</methodname>. Elle doit renvoyer faux si un signal
a <20>t<EFBFBD> trait<69> et vrai s'il n'y avait pas de signal <20> traiter. Dans ce cas,
<methodname>cycle()</methodname> appelle alors
<methodname>process_instruction</methodname>.</para>
</chapter>
<chapter lang="fr"><title>M<EFBFBD>moire</title>
<para>Une m<>moire est un composant capable d'<27>tre lu et <20>crit.</para>
<para>Dans Vinace, la classe qui repr<70>sente la m<>moire est <classname>CMemory</classname>. Un objet
<classname>CMemory</classname> n'a pas <20> retenir quoi que ce soit en r<>alit<69>. Par exemple,
<classname>CDummyMemory</classname>, une classe enfant de <classname>CMemory</classname>, est une m<>moire qui
renvoie des valeurs bidon. Elle est utilis<69>e pour remplir les espaces m<>moire non connect<63>s.</para>
<para>La RAM et la ROM sont repr<70>sent<6E>es par les classes <classname>CRamMemory</classname> et
<classname>CRomMemory</classname>, enfants de <classname>CMemory</classname>.</para>
<section><title>Proxys m<>moire</title>
<para>Les proxys m<>moire, repr<70>sent<6E>s par la classe <classname>CMemoryProxy</classname>, sont des
proxys qui permettent d'adresser une partie d'un objet <classname>CMemory</classname>. En r<>alit<69>, ils ne font
que d<>caler l'adresse selon l'adresse de d<>part de la cible.</para>
</section>
<section><title>Bus m<>moire</title>
<para>Les bus m<>moire sont des enfants de <classname>CMemory</classname> qui dispatchent les requ<71>tes de lecture et d'<27>criture
vers des sous-m<>moire selon l'adresse de la requ<71>te ou selon des drapeaux d'un objet
<classname>CUnit</classname>. Il n'y a pas de classe commune pour les bus m<>moire car
ils n'ont rien de sp<73>cifique en commun, <20> part le fait qu'ils soient des m<>moires.</para>
</section>
<section><title>La m<>moire de l'Apple //e</title>
<para>Voici un sch<63>ma de la m<>moire d'un Apple //e 64Ko.</para>
<figure><title>Bus m<>moire de l'Apple //e</title>
<mediaobject>
<imageobject>
<imagedata fileref="memorybus.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Bus m<>moire de l'Apple //e</phrase>
</textobject>
</mediaobject>
</figure>
<para>Le processeur acc<63>de seulement au bus m<>moire principal (main memory bus). l'IOU est l'unit<69> d'entr<74>e/sortie.</para>
<para>Il y a un banc de 64Ko de RAM et plusieurs bancs de ROM :</para>
<itemizedlist>
<listitem><para>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.</para></listitem>
<listitem><para>La ROM interne contient des routines additionnelles pour le //e.</para></listitem>
<listitem><para>Les ROM des cartes p<>riph<70>riques (card ROM) sont les ROMs des cartes d'extension.</para></listitem>
</itemizedlist>
<para>Voici une explication de chacun des bus.</para>
<section id="BusMainMemory"><title>Bus m<>moire principal (Main memory bus)</title>
<para>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 :</para>
<itemizedlist>
<listitem><para>$0000-$BFFF est connect<63> <20> la RAM.</para></listitem>
<listitem><para>$C000-$C0FF est connect<63> <20> l'unit<69> d'entr<74>e sortie (IOU).</para></listitem>
<listitem><para>$C100-$CFFF est connect<63> au bus de la ROM E/S (peut <20>tre connect<63> <20> la ROM des
cartes p<>riph<70>riques ou bien <20> la ROM interne).</para></listitem>
<listitem><para>$D000-$FFFF est connect<63> au bus de la carte langage (habituellement, la ROM principale est visible ici).</para></listitem>
</itemizedlist>
</section>
<section id="BusLanguageCard"><title>Bus de la carte language (Language Card bus)</title>
<para>R<EFBFBD>f<EFBFBD>rence : <emphasis>Apple IIe Technical Reference Manual</emphasis> pages 79 to 83
(PDF pp113-117)</para>
<para>Le bus de la carte langage est en charge des 12Ko les plus hauts de la m<>moire. Cet espace <20>tait
originellement d<>di<64> <20> la ROM Basic et moniteur dans les Apple ][ 48Ko. Sur les Apples 64Ko,
une nouvelle possibilit<69> <20>tait d'adresser de la RAM dans cet espace. Cette fonctionnalit<69> est utilis<69> pour
charger des langages alternatifs en m<>moire (comme le basic Integer du ][+ sur un //e).</para>
<para>La lecture et l'<27>criture peuvent <20>tre modifi<66>s ind<6E>pendamment. Ceci permet d'<27>crire en
RAM pendant que la ROM est visible. C'est particuli<6C>rement pratique lorsque l'on pr<70>pare la RAM car
bien des routines bas niveau sont en ROM (affichage du texte, lecture du clavier...).</para>
<para>Comme 16Ko de RAM sont disponibles mais l'espace ne fait que 12Ko, les 4Ko inf<6E>rieurs
($D000-$FFFF) peuvent adresser deux bancs de RAM. Les 8Ko sup<75>rieurs sont toujours connect<63>s
<20> la m<>me RAM.</para>
<para>Ce bus est pilot<6F> par l'<link linkend="UnitLanguageCard">Unit<EFBFBD> de carte langage</link>
en utilisant les interrupteurs logiciels <emphasis>LCRAM</emphasis>, <emphasis>LCWRITE</emphasis> et
<emphasis>LCBNK2</emphasis>.</para>
<para>Par d<>faut (<emphasis>LCRAM</emphasis> et <emphasis>LCWRITE</emphasis> sur off),
la ROM est lisible et les <20>critures n'ont aucun effet.</para>
<para>Les requ<71>tes d'<27>criture sont transmises <20> la RAM si <emphasis>LCWRITE</emphasis> est actif. Sinon,
les requ<71>te d'<27>criture n'ont pas d'effet (comme pour une ROM).</para>
<para>Les requ<71>tes de lecture sont transmises <20> la RAM si <emphasis>LCRAM</emphasis> est actif et
<20> la ROM sinon.</para>
<para>Les 8Ko sup<75>rieurs ($E000-$FFFF) sont connect<63>s aux 8Ko sup<75>rieurs de la RAM
($E000-$FFFF).</para>
<para>Les 4Ko inf<6E>rieurs ($D000-$DFFF) sont connect<63>s <20> la RAM en $D000-$DFFF si
<emphasis>LCBNK2</emphasis> est actif ou <20> celle en $C000-$CFFF sinon.</para>
</section>
<section id="BusIoRom"><title>Bus de la ROM E/S (I/O Rom Bus)</title>
<para>L'Apple //e et les mod<6F>les suivants ont plus que 12Ko de ROM. Pour acc<63>der au reste de
la ROM, l'espace $C100-$CFFF, habituellement r<>server aux ROM des cartes p<>riph<70>riques peut
<20>tre utilis<69>. Une fen<65>tre, en $C300-$C3FF, correspondant <20> la carte 80 colonnes, peut <20>tre
s<>lectionn<6E>e sp<73>cifiquement.</para>
<para>Ce bus est pilot<6F> par l'<link linkend="UnitIoRom">unit<EFBFBD> de ROM E/S</link> en utilisant
les interrupteurs logiciels <emphasis>CXROM</emphasis> et <emphasis>C3ROM</emphasis>.</para>
<para>Si <emphasis>CXROM</emphasis> est actif, les requ<71>tes sont transmises au
<link linkend="BusSlotRom">bus des ROM p<>riph<70>riques</link>. Si
<emphasis>CXROM</emphasis> est actif, la ROM interne est visible.</para>
<para><emphasis>C3ROM</emphasis> permet de voir la ROM interne en $C300-$C3FF
quelque soit l'<27>tat de <emphasis>CXROM</emphasis>. Ceci est utilis<69> pour masquer
la ROM de la carte d'extension 80 colonnes et pour utiliser les routines internes <20> la place. </para>
</section>
<section id="BusSlotRom"><title>Bus des ROM p<>riph<70>riques (Slot ROM Bus)</title>
<para>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<75>ro du port.</para>
<para>Lorsque la ROM basique est lue, l'extension ROM (s'il y en a une)
est s<>lectionn<6E>e et devient visible en $C800-$CFFF. $CFFF est aussi un
interrupteur logiciel (nomm<6D>e CLRROM) qui d<>s<EFBFBD>lectionne la ROM.</para>
<para>Ceci est expliqu<71> dans le <emphasis>Apple IIe Technical Reference Manual</emphasis>
page 132.</para>
<para>Le bus des ROM p<>riph<70>riques est en charge de transf<73>rer les requ<71>tes
de lecture <20> la bonne ROM. Comme l'<link linkend="UnitSlots">unit<EFBFBD> des ports d'extension</link>,
il doit <20>tre inform<72> des insertions et retraits de cartes.</para>
<section><title>Ins<EFBFBD>rer et retirer des cartes</title>
<para>La m<>thode <methodname>insert_card</methodname> indique
au bus qu'une carte a <20>t<EFBFBD> ins<6E>r<EFBFBD>e :</para>
<programlisting>void CSlotRomBus::insert_card(int slot, CMemory *cardRom, CMemory *cardRomExt)</programlisting>
<para><varname>slot</varname> est le num<75>ro du port (1-7).
<varname>cardRom</varname> est la ROM basique de la carte et
<varname>cardRomExt</varname> est sont extension.</para>
<para>La m<>thode <methodname>remove_card</methodname> indique
au bus qu'une carde a <20>t<EFBFBD> retir<69>e :</para>
<programlisting>void CSlotRomBus::remove_card(int slot)</programlisting>
<para><varname>slot</varname> est le num<75>ro du port (1-7). </para>
</section>
</section>
</section>
<section><title>Fichiers de ROM</title>
<para>Les fichiers d'image des ROM sont n<>cessaire aux <20>mulateurs mais ils
sont sous copyright et ne peuvent <20>tre distribu<62>s librement. Un bon endroit
pour r<>cup<75>rer des images de ROM est la section <20>mulateurs du
<link linkend="Asimov">d<EFBFBD>p<EFBFBD>t Asimov</link>.</para>
<para>Vinace a besoin des ROM internes ainsi que de la ROM du Disk II
si un contr<74>leur Disk II est branch<63>. Voici une description des fichiers de ROM
utilis<69>s par Vinace.</para>
<section id="RomAppleIIe"><title>apple_iie_rom.zip</title>
<para>Emplacement : <ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_iie_rom.zip">ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_iie_rom.zip</ulink></para>
<para>Contient un seul fichier : APPLE2E.ROM</para>
<table><title>Carte du fichier APPLE2E.ROM</title>
<tgroup cols="3">
<thead>
<row><entry>De</entry><entry><EFBFBD></entry><entry>Description</entry></row>
</thead>
<tbody>
<row><entry>0x0000</entry><entry>0x01ff</entry><entry>Vide</entry></row>
<row><entry>0x0200</entry><entry>0x02ff</entry><entry>Inconnu, probablement la ROM d'un p<>riph<70>rique en port 2</entry></row>
<row><entry>0x0300</entry><entry>0x05ff</entry><entry>Vide</entry></row>
<row><entry>0x0600</entry><entry>0x06ff</entry><entry>ROM 16 secteurs du contr<74>leur Disk II</entry></row>
<row><entry>0x0700</entry><entry>0x0fff</entry><entry>Vide</entry></row>
<row><entry>0x1000</entry><entry>0x3fff</entry><entry>ROM de l'Integer Basic ?</entry></row>
<row><entry>0x4000</entry><entry>0x40ff</entry><entry>Vide</entry></row>
<row><entry>0x4100</entry><entry>0x4fff</entry><entry>ROM interne $C100-$CFFF</entry></row>
<row><entry>0x5000</entry><entry>0x7fff</entry><entry>ROM principale $D000-$FFFF ROM</entry></row>
</tbody>
</tgroup>
</table>
</section>
<section id="RomAppleII"><title>apple_ii_rom.zip</title>
<para>Emplacement : <ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_iie_rom.zip">ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_ii_rom.zip</ulink></para>
<para>Identique <20> <link linkend="RomAppleIIe">apple_iie_rom.zip</link>.</para>
</section>
<section id="RomAppleIIplus"><title>apple_ii+_rom.zip</title>
<para>Emplacement : <ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_ii+_rom.zip">ftp://ftp.apple.asimov.net/pub/apple_II/emulators/rom_images/apple_ii+_rom.zip</ulink></para>
<para>Contient un seul fichier : APPLE2.ROM</para>
<table><title>Carte du fichier APPLE2.ROM</title>
<tgroup cols="3">
<thead>
<row><entry>De</entry><entry><EFBFBD></entry><entry>Description</entry></row>
</thead>
<tbody>
<row><entry>0x0000</entry><entry>0x05ff</entry><entry>Vide</entry></row>
<row><entry>0x0600</entry><entry>0x06ff</entry><entry>ROM 16 secteurs du contr<74>leur Disk II</entry></row>
<row><entry>0x0700</entry><entry>0x0fff</entry><entry>Vide</entry></row>
<row><entry>0x1000</entry><entry>0x15ff</entry><entry>Vide</entry></row>
<row><entry>0x1600</entry><entry>0x16ff</entry><entry>ROM 16 secteurs du contr<74>leur Disk II</entry></row>
<row><entry>0x2000</entry><entry>0x4fff</entry><entry>ROM principale $D000-$FFFF ROM</entry></row>
</tbody>
</tgroup>
</table>
</section>
</section>
</chapter>
<chapter lang="fr"><title>Entr<EFBFBD>es / Sorties</title>
<section id="Iou2plus"><title>L'unit<69> d'entr<74>es/sorties du ][+</title>
<table>
<title>Adresses de l'unit<69> d'entr<74>es/sorties de l'Apple ][+</title>
<tgroup cols="5">
<thead>
<row><entry>Adr</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Description</entry><entry>Unit<EFBFBD></entry></row>
</thead>
<tbody>
<row><entry>C000</entry><entry>KBD</entry><entry>R</entry><entry>Derni<EFBFBD>re touche press<73>e</entry><entry><link linkend="UnitKeyboard">Clavier</link></entry></row>
<row><entry>C010</entry><entry>KBDSTRB</entry><entry>RW</entry><entry>Remise <20> z<>ro du clavier</entry><entry><link linkend="UnitKeyboard">Clavier</link></entry></row>
<row><entry>C020</entry><entry>TAPEOUT</entry><entry>R7</entry><entry>Bascule la sortie cassette</entry><entry><link linkend="UnitTape">Cassette</link></entry></row>
<row><entry>C030</entry><entry>SPKR</entry><entry>R</entry><entry>Bascule l'<27>tat du haut parleur</entry><entry><link linkend="UnitSpeaker">Haut parleur</link></entry></row>
<row><entry>C040</entry><entry>STROBE</entry><entry>R</entry><entry>Envoie une impulsion sur la sortie jeux</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C050</entry><entry>TXTCLR</entry><entry>WR</entry><entry>Mode graphique</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C051</entry><entry>TXTSET</entry><entry>WR</entry><entry>Mode texte</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C052</entry><entry>MIXCLR</entry><entry>WR</entry><entry>Mode plein <20>cran</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C053</entry><entry>MIXSET</entry><entry>WR</entry><entry>Mode mixte</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C054</entry><entry>TXTPAGE1</entry><entry>WR</entry><entry>Affiche la page 1</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C055</entry><entry>TXTPAGE2</entry><entry>WR</entry><entry>Affiche la page 2</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C056</entry><entry>LORES</entry><entry>WR</entry><entry>Graphiques basse r<>solution</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C057</entry><entry>HIRES</entry><entry>WR</entry><entry>Graphiques haute r<>solution</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C058</entry><entry>CLRAN0</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C059</entry><entry>SETAN0</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05A</entry><entry>CLRAN1</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05B</entry><entry>SETAN1</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05C</entry><entry>CLRAN2</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05D</entry><entry>SETAN2</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05E</entry><entry>CLRAN3</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05F</entry><entry>SETAN3</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C060</entry><entry>TAPEIN</entry><entry>R7</entry><entry>Lit l'<27>tat de l'entr<74>e cassette</entry><entry><link linkend="UnitTape">Cassette</link></entry></row>
<row><entry>C061</entry><entry>PB0</entry><entry>R7</entry><entry>Bouton poussoir 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C062</entry><entry>PB1</entry><entry>R7</entry><entry>Bouton poussoir 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C063</entry><entry>PB2</entry><entry>R7</entry><entry>Bouton poussoir 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C064</entry><entry>PADDL0</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C065</entry><entry>PADDL1</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C066</entry><entry>PADDL2</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C067</entry><entry>PADDL3</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C070</entry><entry>PTRIG</entry><entry>R</entry><entry>Remise <20> z<>ro des entr<74>es analogiques</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C080</entry><entry></entry><entry>R</entry><entry>Lecture de la RAM page 2, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C081</entry><entry></entry><entry>RR</entry><entry>Lecture de la ROM, <20>criture de la RAM page 2</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C082</entry><entry></entry><entry>R</entry><entry>Lecture de la ROM, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C083</entry><entry></entry><entry>RR</entry><entry>Lecture et <20>criture en RAM page 2</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C084-C087</entry><entry></entry><entry></entry><entry>Identique <20> C080-C083</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C088</entry><entry></entry><entry>R</entry><entry>Lecture de la RAM page 1, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C089</entry><entry></entry><entry>RR</entry><entry>Lecture de la ROM, <20>criture de la RAM page 1</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08A</entry><entry></entry><entry>R</entry><entry>Lecture de la ROM, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08B</entry><entry></entry><entry>RR</entry><entry>Lecture et <20>criture en RAM page 1</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08C-C08F</entry><entry></entry><entry>R</entry><entry>Identique <20> C088-C08B</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C090-C09F</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 1</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0A0-C0AF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 2</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0B0-C0BF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 3</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0C0-C0CF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 4</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0D0-C0DF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 5</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0E0-C0EF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 6</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0F0-C0FF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 7</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
</tbody>
</tgroup>
</table>
<para>R - Lire pour agir ou r<>cup<75>rer l'information, W - <20>crire pour agir, RR - Lire deux fois pour agir, R7 - Lire l'information dans le bit 7</para>
</section>
<section id="Iou2e"><title>L'unit<69> d'entr<74>es/sorties du //e</title>
<para>L'unit<69> d'entr<74>es/sorties de l'Apple //e est bas<61>e sur celle de l'Apple ][+, sauf pour les adresses TXTPAGE1
et TXTPAGE2 qui sont g<>r<EFBFBD>es par l'unit<69> AuxMemory (qui passe la requ<71>te <20> l'unit<69> GraphicMode).
L'unit<69> d'entr<74>es/sorties de l'Apple //e I/O poss<73>de quelques interrupteurs logiciels suppl<70>mentaires ainsi que
des acc<63>s <20> l'<27>tat des interrupteurs existants.</para>
<table>
<title>Adresses de l'unit<69> d'entr<74>es/sorties de l'Apple //e</title>
<tgroup cols="5">
<thead>
<row><entry>Adr</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Description</entry><entry>Unit<EFBFBD></entry></row>
</thead>
<tbody>
<row><entry>C000</entry><entry>KBD</entry><entry>R</entry><entry>Derni<EFBFBD>re touche press<73>e</entry><entry><link linkend="UnitKeyboard">Clavier</link></entry></row>
<row><entry>C000</entry><entry>80STOREOFF</entry><entry>W</entry><entry>Utilise $C002-$C005 pour la m<>moire auxiliaire</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C001</entry><entry>80STOREON</entry><entry>W</entry><entry>Utilise PAGE2 pour la m<>moire auxiliaire</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C002</entry><entry>RDMAINRAM</entry><entry>W</entry><entry>Si 80STORE est <20> 0: Lit la m<>moire principale en $0200-$BFFF</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C003</entry><entry>RDCARDRAM</entry><entry>W</entry><entry>Si 80STORE est <20> 0: Lit la m<>moire auxiliaire en $0200-$BFFF</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C004</entry><entry>WRMAINRAM</entry><entry>W</entry><entry>Si 80STORE est <20> 0: <20>crit la m<>moire principale en $0200-$BFFF</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C005</entry><entry>WRCARDRAM</entry><entry>W</entry><entry>Si 80STORE est <20> 0: <20>crit la m<>moire principale en $0200-$BFFF</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C006</entry><entry>SETSLOTCXROM</entry><entry>W</entry><entry>ROM des p<>riph<70>riques ($C100-$CFFF)</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C007</entry><entry>SETINTCXROM</entry><entry>W</entry><entry>ROM interne ($C100-$CFFF)</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C008</entry><entry>SETSTDZP</entry><entry>W</entry><entry>Pile et page z<>ro principales</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C009</entry><entry>SETALTZP</entry><entry>W</entry><entry>Pile et page z<>ro auxiliaires</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C00A</entry><entry>SETINTC3ROM</entry><entry>W</entry><entry>ROM interne en $C300-$C3FF</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C00B</entry><entry>SETSLOTC3ROM</entry><entry>W</entry><entry>ROM des p<>riph<70>riques $C300-$C3FF</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C00C</entry><entry>CLR80VID</entry><entry>W</entry><entry>40 Colonnes</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C00D</entry><entry>SET80VID</entry><entry>W</entry><entry>80 Colonnes</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C00E</entry><entry>CLRALTCHAR</entry><entry>W</entry><entry>S<EFBFBD>lectionne la police de caract<63>re primaire</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C00F</entry><entry>SETALTCHAR</entry><entry>W</entry><entry>S<EFBFBD>lectionne la police de caract<63>re alternative</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C010</entry><entry>KBDSTRB</entry><entry>RW</entry><entry>Remise <20> z<>ro du clavier</entry><entry><link linkend="UnitKeyboard">Clavier</link></entry></row>
<row><entry>C011</entry><entry>RDLCBNK2</entry><entry>R7</entry><entry><EFBFBD>tat de visibilit<69> de la page 1 (0) ou de la page 2 (1) de RAM en $D000-DFFF </entry><entry><link linkend="UnitLanguageCard">LanguageCard</link></entry></row>
<row><entry>C012</entry><entry>RDLCRAM</entry><entry>R7</entry><entry><EFBFBD>tat de visibilit<69> de la ROM (0) our de la RAM() en $D000-$FFFF</entry><entry><link linkend="UnitLanguageCard">LanguageCard</link></entry></row>
<row><entry>C013</entry><entry>RDRAMRD</entry><entry>R7</entry><entry><EFBFBD>tat de lecture de la RAM principale/auxiliaire</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C014</entry><entry>RDRAMWRT</entry><entry>R7</entry><entry><EFBFBD>tat d'<27>criture dans la RAM principale/auxiliaire</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C015</entry><entry>RDCXROM</entry><entry>R7</entry><entry><EFBFBD>tat de l'acc<63>s <20> la ROM des p<>riph<70>riques (0) ou interne (1)</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C016</entry><entry>RDALTZP</entry><entry>R7</entry><entry><EFBFBD>tat de la pile et de la page z<>ro principale ou auxiliaire</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C017</entry><entry>RDC3ROM</entry><entry>R7</entry><entry><EFBFBD>tat de la ROM visible en $C300-$C3FF : Port 3 (0) ou Port auxiliaire (1)</entry><entry><link linkend="UnitIoRom">Rom E/S</link></entry></row>
<row><entry>C018</entry><entry>RD80STORE</entry><entry>R7</entry><entry><EFBFBD>tat de 80STOREOFF</entry><entry><link linkend="UnitAuxMemory">M<EFBFBD>moire auxiliaire</link></entry></row>
<row><entry>C019</entry><entry>RDVBL</entry><entry>R7</entry><entry><EFBFBD>tat de l'effacement vertical (1=en cours d'affichage)</entry><entry></entry></row>
<row><entry>C01A</entry><entry>RDTEXT</entry><entry>R7</entry><entry><EFBFBD>tat du mode Texte (1) ou Graphique (0)</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C01B</entry><entry>RDMIXED</entry><entry>R7</entry><entry><EFBFBD>tat du mode plein <20>cran (0) ou mode mixte (1)</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C01C</entry><entry>RDPAGE2</entry><entry>R7</entry><entry><EFBFBD>tat de l'affichage de la page 1 (0) ou page 2 (1)</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C01D</entry><entry>RDHIRES</entry><entry>R7</entry><entry><EFBFBD>tat de la r<>solution basse (0) ou haute (1)</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C01E</entry><entry>RDALTCHAR</entry><entry>R7</entry><entry><EFBFBD>tat de la police de caract<63>re primaire ou alternative</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C01F</entry><entry>RD80VID</entry><entry>R7</entry><entry><EFBFBD>tat de l'affichage 40 ou 80 colonnes</entry><entry><link linkend="UnitTextMode">Mode texte</link></entry></row>
<row><entry>C020</entry><entry>TAPEOUT</entry><entry>R7</entry><entry>Bascule la sortie cassette</entry><entry><link linkend="UnitTape">Cassette</link></entry></row>
<row><entry>C030</entry><entry>SPKR</entry><entry>R</entry><entry>Bascule l'<27>tat du haut parleur</entry><entry><link linkend="UnitSpeaker">Speaker</link></entry></row>
<row><entry>C040</entry><entry>STROBE</entry><entry>R</entry><entry>Envoie une impulsion sur la sortie jeux</entry><entry><link linkend="UnitGame">Game</link></entry></row>
<row><entry>C050</entry><entry>TXTCLR</entry><entry>WR</entry><entry>Mode graphique</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C051</entry><entry>TXTSET</entry><entry>WR</entry><entry>Mode texte</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C052</entry><entry>MIXCLR</entry><entry>WR</entry><entry>Mode plein <20>cran</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C053</entry><entry>MIXSET</entry><entry>WR</entry><entry>Mode mixte</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C054</entry><entry>TXTPAGE1</entry><entry>WR</entry><entry>Affiche la page 1</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C055</entry><entry>TXTPAGE2</entry><entry>WR</entry><entry>Si 80STORE est <20> 0: Affiche la page 2, Si 80STORE est <20> un: <20>criture/Lecture de la m<>moire auxiliaire d'affichage</entry><entry><link linkend="UnitAuxMemory">AuxMemory</link>, <link linkend="UnitGraphicMode">GraphicMode</link></entry></row>
<row><entry>C056</entry><entry>LORES</entry><entry>WR</entry><entry>Graphiques basse r<>solution</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C057</entry><entry>HIRES</entry><entry>WR</entry><entry>Graphiques haute r<>solution</entry><entry><link linkend="UnitGraphicMode">Mode graphique</link></entry></row>
<row><entry>C058</entry><entry>CLRAN0</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C059</entry><entry>SETAN0</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05A</entry><entry>CLRAN1</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05B</entry><entry>SETAN1</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05C</entry><entry>CLRAN2</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05D</entry><entry>SETAN2</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05E</entry><entry>CLRAN3</entry><entry>WR</entry><entry>Mise <20> 0 de l'annonciateur 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C05F</entry><entry>SETAN3</entry><entry>WR</entry><entry>Mise <20> 1 de l'annonciateur 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C060</entry><entry>TAPEIN</entry><entry>R7</entry><entry>Lit l'<27>tat de l'entr<74>e cassette</entry><entry><link linkend="UnitTape">Cassette</link></entry></row>
<row><entry>C061</entry><entry>PB0</entry><entry>R7</entry><entry>Bouton poussoir 0 / Touche Pomme Ouverte</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C062</entry><entry>PB1</entry><entry>R7</entry><entry>Bouton poussoir 1 / Touche Pomme Pleine</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C063</entry><entry>PB2</entry><entry>R7</entry><entry>Bouton poussoir 2 / Touche Shift (sur certains mod<6F>les)</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C064</entry><entry>PADDL0</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 0</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C065</entry><entry>PADDL1</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 1</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C066</entry><entry>PADDL2</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 2</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C067</entry><entry>PADDL3</entry><entry>R7</entry><entry>Lit l'entr<74>e analogique 3</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C070</entry><entry>PTRIG</entry><entry>R</entry><entry>Remise <20> z<>ro des entr<74>es analogiques</entry><entry><link linkend="UnitGame">Jeu</link></entry></row>
<row><entry>C073</entry><entry>BANKSEL</entry><entry>W</entry><entry>S<EFBFBD>lection du banc de m<>moire si plus de 128K</entry><entry></entry></row>
<row><entry>C07F</entry><entry>RDDHIRES</entry><entry>R7</entry><entry><EFBFBD>tat du graphique en Double Haute R<>solution</entry><entry></entry></row>
<row><entry>C080</entry><entry></entry><entry>R</entry><entry>Lecture de la RAM page 2, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C081</entry><entry></entry><entry>RR</entry><entry>Lecture de la ROM, <20>criture de la RAM page 2</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C082</entry><entry></entry><entry>R</entry><entry>Lecture de la ROM, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C083</entry><entry></entry><entry>RR</entry><entry>Lecture et <20>criture en RAM page 2</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C084-C087</entry><entry></entry><entry></entry><entry>Identique <20> C080-C083</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C088</entry><entry></entry><entry>R</entry><entry>Lecture de la RAM page 1, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C089</entry><entry></entry><entry>RR</entry><entry>Lecture de la ROM, <20>criture de la RAM page 1</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08A</entry><entry></entry><entry>R</entry><entry>Lecture de la ROM, pas d'<27>criture</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08B</entry><entry></entry><entry>RR</entry><entry>Lecture et <20>criture en RAM page 1</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C08C-C08F</entry><entry></entry><entry>R</entry><entry>Identique <20> C088-C08B</entry><entry><link linkend="UnitLanguageCard">Carte langage</link></entry></row>
<row><entry>C090-C09F</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 1</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0A0-C0AF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 2</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0B0-C0BF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 3</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0C0-C0CF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 4</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0D0-C0DF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 5</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0E0-C0EF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 6</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
<row><entry>C0F0-C0FF</entry><entry></entry><entry></entry><entry>Adresses pour le port d'extension 7</entry><entry><link linkend="UnitSlots">Ports d'extension</link></entry></row>
</tbody>
</tgroup>
</table>
<para>R - Lire pour agir ou r<>cup<75>rer l'information, W - <20>crire pour agir, RR - Lire deux fois pour agir, R7 - Lire l'information dans le bit 7</para>
</section>
<section id="Units"><title>Unit<EFBFBD>s d'entr<74>es/sorties</title>
<para>Les unit<69>s d'E/S sont des interfaces entre la m<>moire de l'Apple et les p<>riph<70>riques.
Dans l'<27>mulateur, c'est une interface entre les couches noyau et mat<61>riel.</para>
<section><title>Classe unit<69></title>
<para>Les unit<69>s sont repr<70>sent<6E>s par des classes descendantes de la classe <classname>CUnit</classname>.</para>
<para>Du c<>t<EFBFBD> m<>moire de l'Apple, seules deux m<>thodes sont utilis<69>es : <methodname>read</methodname> (lecture) et <methodname>write</methodname> (ecriture).
C'est <20> peu pr<70>s la m<>me chose que pour une m<>moire except<70> que l'adressage est en 8 bits au lieu de 16.</para>
<para>Du c<>t<EFBFBD> p<>riph<70>rique, il n'y a pas de sp<73>cification. La plupart des
unit<69>s ne comportent que des interrupteurs logiciels. A chaque interrupteur
correspoind une m<>thode
<methodname>get_&lt;switch&gt;</methodname> et, si modifiable, une
m<>thode <methodname>set_&lt;switch&gt;</methodname>, o<>
<methodname>&lt;switch&gt;</methodname> est le nom de l'interrupteur
en minuscules.</para>
<para>Les unit<69>s ont une m<>thode <methodname>reset</methodname>
qui est cens<6E>e remettre <20> z<>ro l'unit<69>. Elle est appel<65>e <20> l'instanciation de
l'unit<69> mais aussi lorsque l'utilisateur appuie sur le bouton "reset" (<28>a c'est
dans la couche mat<61>riel).</para>
<para>Toutes les unit<69>s sont observables et doivent notifier de tout changement
pouvant subvenir. Les objets de la couche mat<61>riel doivent observer les unit<69>s pour
<20>tre inform<72>s de ce qu'il se produit.</para>
</section>
<section id="UnitKeyboard"><title>Clavier (Keyboard)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les.</para>
<para>Cette unit<69> est en charge du clavier. Sur les Apple II, il n'y avait
pas de tampon clavier. Cette unit<69> ne peut donc g<>rer qu'une touche <20> la fois.</para>
<section><title>M<EFBFBD>thodes</title>
<para><programlisting>void press_key(BYTE key);</programlisting></para>
<para>Indique <20> l'unit<69> quelle touche est en train d'<27>tre press<73>e. Notez que
si la touche pr<70>c<EFBFBD>dente n'a pas encore <20>t<EFBFBD> lue, elle sera oubli<6C>e. Les codes
de touche doivent <20>tre en code ASCII Apple.</para>
<para><programlisting>void release_key();</programlisting></para>
<para>Indique <20> l'unit<69> que la touche a <20>t<EFBFBD> rel<65>ch<63>e.</para>
<para><programlisting>bool key_waiting();</programlisting></para>
<para>Indique s'il y a une touche en attende de lecture par l'Apple. Cette
m<>thode peut <20>tre particuli<6C>rement utile pour d<>velopper un tampon clavier
ou un outil de copier coller.</para>
</section>
<section><title>Addresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x00</entry><entry>KBD</entry><entry>R</entry><entry>Bits 0-6 : Derni<6E>re touche press<73>e ou en train de l'<27>tre. Bit 7 : est <20> 1 si une touche a <20>t<EFBFBD> press<73>e depuis la derni<6E>re remise <20> z<>ro.</entry></row>
<row><entry>0x10</entry><entry>KBDSTROBE</entry><entry>RW</entry><entry>Remet <20> z<>ro le clavier. Bits 0-6 : Derni<6E>re touche press<73>e ou en train de l'<27>tre. Bit 7 : <20> 1 si une touche est enfonc<6E>e.</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitTape"><title>Cassette (Tape)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les.</para>
<para>Malheureusement cette unit<69> n'est pas encore impl<70>ment<6E>e.</para>
</section>
<section id="UnitSpeaker"><title>Haut parleur (Speaker)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les.</para>
<para>Le haut parleur de l'Apple est plut<75>t basique : il n'a que deux niveau.
Le niveau du haut parleur est invers<72> en acc<63>dant <20> l'interrupteur logiciel SPKR.
Du c<>t<EFBFBD> p<>riph<70>rique, le niveau du haut parleur peut <20>tre lu.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>SPKR</entry><entry>Haut parleur au niveau bas</entry><entry>Haut parleur au niveau haut</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x30</entry><entry>SPKR</entry><entry>RW</entry><entry>Change l'<27>tat de SPKR</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitGame"><title>Jeu (Game)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les (sauf peut <20>tre le //c).</para>
<para>L'unit<69> de jeu poss<73>de trois sortes de dispositif : Trois boutons poussoirs,
quatre annonciateurs et quatre entr<74>es analogiques.</para>
<para>Les boutons poussoirs sont connect<63>s <20> ceux du joystick ou des paddles.
A partir du //e, le bouton 0 est aussi connect<63> <20> la touche du clavier Pomme
Ouverte et le bouton 1 <20> la touche Pomme Pleine. Sur certains mod<6F>les de //e,
le bouton 2 <20>tait connect<63> <20> la touche Shift.</para>
<para>Les annonciateurs sont des sorties sur la prise jeu, capable de sortir <20>
deux niveaux (ils n'ont pas <20>t<EFBFBD> beaucoup utilis<69>, peut <20>tre pas du tout).</para>
<para>Les entr<74>es analogiques sont connect<63>es aux axes X et Y du joystick
(habituellement, les entr<74>es 0 et 1) ou aux paddles. Ces entr<74>es analogiques
fonctionnaient en mesurant le temps de d<>charge d'un condensateur dans le
potentiom<6F>tre du joystick ou de la paddle. L'unit<69> n'est capable que de d<>clencher
la charge du condensateur et de d<>tecter lorsqu'il est d<>charg<72>. La mesure de
temps est effectu<74>e par un programme en ROM.</para>
<para>Il est important de simuler ce m<>canisme car certains programmes
impl<70>mentent leur propre routine de mesure. La difficult<6C> est qu'il est important
de synchroniser le simulateur <20> l'horloge pour que le d<>compte de cycles, vu
depuis l'int<6E>rieur, soit correct.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>AN0</entry><entry>Annonciateur 0 au niveau bas</entry><entry>Annonciateur 0 au niveau haut</entry></row>
<row><entry>AN1</entry><entry>Annonciateur 1 au niveau bas</entry><entry>Annonciateur 1 au niveau haut</entry></row>
<row><entry>AN2</entry><entry>Annonciateur 2 au niveau bas</entry><entry>Annonciateur 2 au niveau haut</entry></row>
<row><entry>AN3</entry><entry>Annonciateur 3 au niveau bas</entry><entry>Annonciateur 3 au niveau haut</entry></row>
<row><entry>PB0</entry><entry>Bouton 0 rel<65>ch<63></entry><entry>Bouton 0 appuy<75></entry></row>
<row><entry>PB1</entry><entry>Bouton 1 rel<65>ch<63></entry><entry>Bouton 1 appuy<75></entry></row>
<row><entry>PB2</entry><entry>Bouton 2 rel<65>ch<63></entry><entry>Bouton 2 appuy<75></entry></row>
<row><entry>PADDL0</entry><entry>Condensateur de l'entr<74>e 0 d<>charg<72></entry><entry>Condensateur de l'entr<74>e 0 charg<72></entry></row>
<row><entry>PADDL1</entry><entry>Condensateur de l'entr<74>e 1 d<>charg<72></entry><entry>Condensateur de l'entr<74>e 1 charg<72></entry></row>
<row><entry>PADDL2</entry><entry>Condensateur de l'entr<74>e 2 d<>charg<72></entry><entry>Condensateur de l'entr<74>e 2 charg<72></entry></row>
<row><entry>PADDL3</entry><entry>Condensateur de l'entr<74>e 3 d<>charg<72></entry><entry>Condensateur de l'entr<74>e 3 charg<72></entry></row>
<row><entry>PTRIG</entry><entry>Les condensateurs sont en d<>charge</entry><entry>Les condensateurs sont en charge</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x58</entry><entry>CLRAN0</entry><entry>WR</entry><entry><EFBFBD>teint AN0</entry></row>
<row><entry>0x59</entry><entry>SETAN0</entry><entry>WR</entry><entry>Allume AN0</entry></row>
<row><entry>0x5A</entry><entry>CLRAN1</entry><entry>WR</entry><entry><EFBFBD>teint AN1</entry></row>
<row><entry>0x5B</entry><entry>SETAN1</entry><entry>WR</entry><entry>Allume AN1</entry></row>
<row><entry>0x5C</entry><entry>CLRAN2</entry><entry>WR</entry><entry><EFBFBD>teint AN2</entry></row>
<row><entry>0x5D</entry><entry>SETAN2</entry><entry>WR</entry><entry>Allume AN2</entry></row>
<row><entry>0x5E</entry><entry>CLRAN3</entry><entry>WR</entry><entry><EFBFBD>teint AN3</entry></row>
<row><entry>0x5F</entry><entry>SETAN3</entry><entry>WR</entry><entry>Allume AN3</entry></row>
<row><entry>0x61</entry><entry>PB0</entry><entry>R7</entry><entry>Lit l'<27>tat de PB0</entry></row>
<row><entry>0x62</entry><entry>PB1</entry><entry>R7</entry><entry>Lit l'<27>tat de PB1</entry></row>
<row><entry>0x63</entry><entry>PB2</entry><entry>R7</entry><entry>Lit l'<27>tat de PB2</entry></row>
<row><entry>0x64</entry><entry>PADDL0</entry><entry>R7</entry><entry>Lit l'<27>tat de PADDL0</entry></row>
<row><entry>0x65</entry><entry>PADDL1</entry><entry>R7</entry><entry>Lit l'<27>tat de PADDL1</entry></row>
<row><entry>0x66</entry><entry>PADDL2</entry><entry>R7</entry><entry>Lit l'<27>tat de PADDL2</entry></row>
<row><entry>0x67</entry><entry>PADDL3</entry><entry>R7</entry><entry>Lit l'<27>tat de PADDL3</entry></row>
<row><entry>0x70</entry><entry>PTRIG</entry><entry>R</entry><entry>D<EFBFBD>clenche la charge des condensateurs*</entry></row>
</tbody>
</tgroup>
</informaltable>
<para>* : Quand la charge est d<>clench<63>es, PTRIG passe <20> vrai, les
observateurs sont notifi<66>s, puis il repasse <20> faux (les observateurs sont de
nouveau notifi<66>s). Tout cela dans le m<>me cycle d'horloge (en r<>alit<69>,
pendant le m<>me appel de m<>thode). C'est la fa<66>on dont l'unit<69> de jeu
informe les observateurs qu'il doivent commencer la simulation de la d<>charge.</para>
</section>
</section>
<section id="UnitGraphicMode"><title>Mode graphique (GraphicMode)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les.</para>
<para>R<EFBFBD>ference: <emphasis>Apple IIe Technical Reference Manual</emphasis>
page 29 (PDF p63)</para>
<para>Cette unit<69> s'occupe du passage du mode texte aux modes graphiques,
except<70> le mode double haute r<>solution qui a <20>t<EFBFBD> impl<70>ment<6E> plus tard.
L'Apple ][ a un mode texte et deux modes graphiques (basse et haute r<>solution).
Un mode mixte permet de partager l'<27>cran en deux, en ayant 4 lignes de texte
en bas et le reste en graphique. Chaque mode poss<73>de deux pages correspondant
<20> deux espaces m<>moire diff<66>rents.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>TEXT</entry><entry>Mode graphique</entry><entry>Mode texte</entry></row>
<row><entry>MIXED</entry><entry>Mode plein <20>cran</entry><entry>Mode mixte</entry></row>
<row><entry>PAGE2</entry><entry>Page 1 affich<63>e</entry><entry>Page 2 affich<63>e</entry></row>
<row><entry>HIRES</entry><entry>Basse r<>solution </entry><entry>Haute r<>solution</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x50</entry><entry>TXTCLR</entry><entry>RW</entry><entry>Passe TEXT <20> 0</entry></row>
<row><entry>0x51</entry><entry>TXTSET</entry><entry>RW</entry><entry>Passe TEXT <20> 1</entry></row>
<row><entry>0x52</entry><entry>MIXCLR</entry><entry>RW</entry><entry>Passe MIXED <20> 0</entry></row>
<row><entry>0x53</entry><entry>MIXSET</entry><entry>RW</entry><entry>Passe MIXED <20> 1</entry></row>
<row><entry>0x54</entry><entry>TXTPAGE1</entry><entry>RW</entry><entry>Passe PAGE2 <20> 0</entry></row>
<row><entry>0x55</entry><entry>TXTPAGE2</entry><entry>RW</entry><entry>Passe PAGE2 <20> 1</entry></row>
<row><entry>0x56</entry><entry>LORES</entry><entry>RW</entry><entry>Passe HIRES <20> 0</entry></row>
<row><entry>0x57</entry><entry>HIRES</entry><entry>RW</entry><entry>Passe HIRES <20> 1</entry></row>
</tbody>
</tgroup>
</informaltable>
<para>Et, sur le //e et les mod<6F>les suivants, quelques adresses de lectures ont <20>t<EFBFBD> ajout<75>es :</para>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x1A</entry><entry>RDTEXT</entry><entry>R7</entry><entry>Lit l'<27>tat de TEXT</entry></row>
<row><entry>0x1B</entry><entry>RDMIXED</entry><entry>R7</entry><entry>Lit l'<27>tat de MIXED</entry></row>
<row><entry>0x1C</entry><entry>RDPAGE2</entry><entry>R7</entry><entry>Lit l'<27>tat de PAGE2</entry></row>
<row><entry>0x1D</entry><entry>RDHIRES</entry><entry>R7</entry><entry>Lit l'<27>tat de HIRES</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitSlots"><title>Ports d'extension (Slots)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les.</para>
<para>Cette unit<69> g<>re les ports d'extension de l'Apple. Elle ne fait que
transf<73>rer les requ<71>tes de lectures et d'<27>criture sur l'espace $C090-$C0FF vers
l'unit<69> d'entr<74>e/sortie de la carte correspondante.</para>
<para>Comme le <link linkend="BusSlotRom">Bus des ROM p<>riph<70>riques</link>,
cette unit<69> doit <20>tre inform<72>e quand une carte est ins<6E>r<EFBFBD>e ou retir<69>e.</para>
<section><title>M<EFBFBD>thodes</title>
<programlisting>void insert_card(int slot, CUnit *cardUnit);</programlisting>
<para>Indique <20> l'unit<69> qu'une carte a <20>t<EFBFBD> ins<6E>r<EFBFBD>e. <varname>slot</varname>
est le num<75>ro du port (1-7) et <varname>cardUnit</varname> est l'unit<69>
d'E/S de la carte d'extension.</para>
<programlisting>void remove_card(int slot);</programlisting>
<para>Indique <20> l'unit<69> qu'une carte a <20>t<EFBFBD> retir<69>e. <varname>slot</varname>
est le num<75>ro du port (1-7).</para>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x90-0x9F</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 1</entry></row>
<row><entry>0xA0-0xAF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 2</entry></row>
<row><entry>0xB0-0xBF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 3</entry></row>
<row><entry>0xC0-0xCF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 4</entry></row>
<row><entry>0xD0-0xDF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 5</entry></row>
<row><entry>0xE0-0xEF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 6</entry></row>
<row><entry>0xF0-0xFF</entry><entry></entry><entry>RW</entry><entry>Transf<EFBFBD>r<EFBFBD> aux adresses 0x00-0x0F de la carte du port 7</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitLanguageCard"><title>Carte langage (Language Card)</title>
<para>Compatibilit<EFBFBD> : Tous mod<6F>les (probablement sauf le ][).</para>
<para>R<EFBFBD>ference : <emphasis>Apple IIe Technical Reference Manual</emphasis>
pages 79 <20> 83 (PDF pp113-117)</para>
<para>Cette unit<69> pilote le <link linkend="BusLanguageCard">Bus de la carte
langage</link> en utilisant trois interrupteurs : LCRAM, LCBNK2 et LCWRITE.</para>
<para>Seuls LCRAM et LCBNK2 peuvent <20>tre lus depuis l'int<6E>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<75> d'autre nom dans la documentation).</para>
<para>Pour changer l'<27>tat de LCWRITE, deux requ<71>tes de lectures doivent
<20>tre effectu<74>es <20> l'adresse appropri<72>e. Un quatri<72>me interrupteur est utilis<69>
dans Vinace pour g<>rer cette double lecture. Il est appel<65> LCWCHG.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>LCBNK2</entry><entry>Page 2 RAM utilis<69>e en $D000-$DFFF</entry><entry>Page 1 RAM utilis<69>e en $D000-$DFFF</entry></row>
<row><entry>LCRAM</entry><entry>ROM lue en $D000-$FFFF</entry><entry>RAM lue en $D000-$DFFF</entry></row>
<row><entry>LCWRITE</entry><entry>Pas d'<27>criture en $D000-$FFFF</entry><entry><EFBFBD>criture en RAM en $D000-$FFFF (m<>me si elle n'est pas visible)</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x11</entry><entry>RDLCBNK2</entry><entry>R7</entry><entry>Lit l'<27>tat de LCBNK2</entry></row>
<row><entry>0x12</entry><entry>RDLCRAM</entry><entry>R7</entry><entry>Lit l'<27>tat de LCRAM</entry></row>
<row><entry>0x81</entry><entry></entry><entry>R</entry><entry>Passe LCBNK2 <20> 1, LCRAM <20> 1 et LCWRITE <20> 0</entry></row>
<row><entry>0x81</entry><entry></entry><entry>RR</entry><entry>Passe LCBNK2 <20> 1, LCRAM <20> 0 et LCWRITE <20> 1</entry></row>
<row><entry>0x82</entry><entry></entry><entry>R</entry><entry>Passe LCBNK2 <20> 1, LCRAM <20> 0 et LCWRITE <20> 0</entry></row>
<row><entry>0x83</entry><entry></entry><entry>RR</entry><entry>Passe LCBNK2 <20> 1, LCRAM <20> 1 et LCWRITE <20> 1</entry></row>
<row><entry>0x84-0x87</entry><entry></entry><entry></entry><entry>Identique <20> 0x80-0x83</entry></row>
<row><entry>0x88</entry><entry></entry><entry>R</entry><entry>PasseLCBNK2 <20> 0, LCRAM <20> 1 et LCWRITE <20> 0</entry></row>
<row><entry>0x89</entry><entry></entry><entry>RR</entry><entry>Passe LCBNK2 <20> 0, LCRAM <20> 0 et LCWRITE <20> 1</entry></row>
<row><entry>0x8A</entry><entry></entry><entry>R</entry><entry>Passe LCBNK2 <20> 0, LCRAM <20> 0 et LCWRITE <20> 0</entry></row>
<row><entry>0x8B</entry><entry></entry><entry>RR</entry><entry>Passe LCBNK2 <20> 0, LCRAM <20> 1 et LCWRITE <20> 1</entry></row>
<row><entry>0x8C-0x8F</entry><entry></entry><entry></entry><entry>Identique <20> 0x88-0x8B</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitAuxMemory"><title>M<EFBFBD>moire auxiliaire (Aux Memory)</title>
<para>Compatibilit<EFBFBD>: //e et suivants.</para>
<para>Malheureusement cette unit<69> n'est pas encore impl<70>ment<6E>e.</para>
</section>
<section id="UnitTextMode"><title>Mode texte (Text Mode)</title>
<para>Compatibilit<EFBFBD>: //e et suivants.</para>
<para>Cette unit<69> s'occupe du passage entre les modes 40 et 80 colonnes,
ainsi que du changement de police de caract<63>re.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>80VID</entry><entry>Affichage 40 colonnes</entry><entry>Affichage 80 colonnes</entry></row>
<row><entry>ALTCHAR</entry><entry>Utilisation de la police primaire</entry><entry>Utilisation de la police alternative</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x0C</entry><entry>CLR80VID</entry><entry>W</entry><entry>Passe 80VID <20> 0</entry></row>
<row><entry>0x0D</entry><entry>SET80VID</entry><entry>W</entry><entry>Passe 80VID <20> 1</entry></row>
<row><entry>0x0E</entry><entry>CLRALTCHAR</entry><entry>W</entry><entry>Passe ALTCHAR <20> 0</entry></row>
<row><entry>0x0F</entry><entry>SETALTCHAR</entry><entry>W</entry><entry>Passe ALTCHAR <20> 1</entry></row>
<row><entry>0x1E</entry><entry>RDALTCHAR</entry><entry>R7</entry><entry>Lit l'<27>tat de ALTCHAR</entry></row>
<row><entry>0x1F</entry><entry>RD80VID</entry><entry>R7</entry><entry>Lit l'<27>tat de 80VID</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section id="UnitIoRom"><title>Rom E/S (I/O Rom)</title>
<para>Compatibilit<EFBFBD> : //e, IIgs</para>
<para>Certains mod<6F>les d'Apple avaient plus de 12Ko de ROM. Pour acc<63>der
aux reste de la ROM, l'espace m<>moire $C100-$CFFF, habituellement r<>serv<72>
aux ROMs des p<>riph<70>riques, pouvait <20>tre utilis<69>. Une fen<65>tre en $C300-$C3FF,
correspondant <20> la carte 80 colonne, pouvait <20>tre s<>lectionn<6E>e sp<73>cifiquement.</para>
<para>Cette unit<69> pilote le <link linkend="BusIoRom">Bus de la ROM E/S</link>
qui s'occupe de la commutation entre la ROM interne et la ROM des p<>riph<70>riques
en $C100-$CFFF.</para>
<section><title>Interrupteurs</title>
<informaltable>
<tgroup cols="3">
<thead>
<row><entry>Interrupteur</entry><entry>Off</entry><entry>On</entry></row>
</thead>
<tbody>
<row><entry>CXROM</entry><entry>ROM p<>riph<70>riques en $C100-$CFFF</entry><entry>ROM interne en $C100-$CFFF</entry></row>
<row><entry>C3ROM</entry><entry>ROM s<>lectionn<6E>e par CXROM en $C300-$C3FF</entry><entry>ROM interne en $C300-$C3FF</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
<section><title>Adresses</title>
<informaltable>
<tgroup cols="4">
<thead>
<row><entry>Adresse</entry><entry>Nom</entry><entry>Acc<EFBFBD>s</entry><entry>Effet</entry></row>
</thead>
<tbody>
<row><entry>0x06</entry><entry>SETSLOTCXROM</entry><entry>W</entry><entry>Passe CXROM <20> 0</entry></row>
<row><entry>0x07</entry><entry>SETINTCXROM</entry><entry>W</entry><entry>Passe CXROM <20> 1</entry></row>
<row><entry>0x0A</entry><entry>SETINTC3ROM</entry><entry>W</entry><entry>Passe C3ROM <20> 0</entry></row>
<row><entry>0x0B</entry><entry>SETSLOTC3ROM</entry><entry>W</entry><entry>Passe C3ROM <20> 1</entry></row>
<row><entry>0x15</entry><entry>RDCXROM</entry><entry>R7</entry><entry>Lit l'<27>tat de CXROM</entry></row>
<row><entry>0x17</entry><entry>RDC3ROM</entry><entry>R7</entry><entry>Lit l'<27>tat de C3ROM</entry></row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
</section>
</chapter>
<chapter lang="fr"><title>Pas encore impl<70>ment<6E></title>
<para>Voici des fonctionnalit<69>s qui doivent <20>tre impl<70>ment<6E>es :</para>
<itemizedlist>
<listitem><para>Entr<EFBFBD>e et sortie cassette</para></listitem>
<listitem><para>128Ko de m<>moire (AuxMemory)</para></listitem>
<listitem><para>Signal d'effacement vertical</para></listitem>
<listitem><para>Lecture des images disques en format "ordre ProDOS" (.po) et en format "nibbles" (.nib)</para></listitem>
<listitem><para><EFBFBD>criture sur disquettes</para></listitem>
</itemizedlist>
<para>D'autres fonctionnalit<69>s peuvent aussi <20>tre impl<70>ment<6E>es mais elle sont moins importantes :</para>
<itemizedlist>
<listitem><para>Un clavier capable de faire du "coller"</para></listitem>
<listitem><para>Un lecteur de disquette faisant du bruit</para></listitem>
</itemizedlist>
</chapter>
<chapter lang="fr"><title>R<EFBFBD>f<EFBFBD>rences</title>
<section><title>Sur internet</title>
<section id="Asimov"><title>Asimov</title>
<para>Le d<>p<EFBFBD>t Asimov est <emphasis>le</emphasis> site internet o<> il faut
aller pour trouver des trucs sur l'Apple II. Il y a des images disque, la documentation
originale, des images des ROM, des <20>mulateurs, etc.</para>
<para>Le d<>p<EFBFBD>t Asimov est ici : <ulink url="ftp://ftp.apple.asimov.net/pub/apple_II">
ftp://ftp.apple.asimov.net/pub/apple_II</ulink></para>
</section>
<section><title>Jon Relay's Apple II Info Archives</title>
<para>Jon Relay's Apple II Info Archives contient des trucs tr<74>s utiles que
l'on peut aussi trouver dans les manuels de r<>f<EFBFBD>rence, except<70> la fabuleuse
page sur la m<>moire d'entr<74>e sortie qui r<>sume les entr<74>es/sorties de tous
les mod<6F>les d'Apple II en un seul grand tableau :</para>
<para><ulink url="http://www.kreativekorp.com/miscpages/a2info/iomemory.shtml">http://www.kreativekorp.com/miscpages/a2info/iomemory.shtml</ulink></para>
</section>
</section>
<section><title>Livres anglais</title>
<para>Voici les livres les plus int<6E>ressants. Ils peuvent tous <20>tre trouv<75>s dans
le <link linkend="Asimov">d<EFBFBD>p<EFBFBD>t Asimov</link>.</para>
<section><title>Apple IIe Technical Reference Manual</title>
<para>C'est la bible. Pratiquement tout y est expliqu<71>. Je poss<73>de la version
fran<61>aise. La version originale anglaise se trouve ici :</para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIe%20Technical%20Reference%20Manual.pdf">
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIe%20Technical%20Reference%20Manual.pdf</ulink>
</para>
</section>
<section><title>Apple II Reference Manual January 1978</title>
<para>C'est une bible plus ancienne. Aussi connu sous le nom du <emphasis>livre rouge</emphasis>.
Par chance, j'en ai r<>cup<75>r<EFBFBD> un exemplaire sur ebay. Une version PDF se trouve ici :</para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple_II_Redbook.pdf">
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple_II_Redbook.pdf</ulink></para>
</section>
<section><title>Understanding the Apple II</title>
<para>J'ai lu le chapitre 8, <20> propos du Disk II Controller car les manuels
Apple ne fournissaient aucune information <20> son propos. Je n'ai pas lu le
reste du livre (n'ayant pas de version papier) mais il semble vraiment
int<6E>ressant, allant en profondeur dans la description de l'Apple II. Une
version PDF se trouve ici :</para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/documentation/understanding%20the%20apple%20ii.pdf">
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/understanding the apple ii.pdf</ulink></para>
</section>
</section>
<section><title>Emulateurs existants</title>
<section><title>YAE - Yet Another Apple Emulator</title>
<para>Avant que je ne d<>cide d'<27>crire Vinace, j'ai utilis<69> YAE. Il a beaucoup
de limitation : pas de joystick simple, pas d'interface facile pour les disquettes.</para>
<para>J'ai tout d'abord essay<61> de l'am<61>liorer mais j'ai rapidement r<>alis<69>
que r<><72>crire un nouvel <20>mulateur ne serait pas plus compliqu<71>.</para>
<para>J'ai beaucoup <20>tudi<64> le code source de YAE pendant l'<27>criture de
Vinace. J'ai r<>cup<75>r<EFBFBD> les routines pour l'encodage et le d<>codage des nibbles,
utilis<69>es dans les lecteurs de disquettes. Les fichiers
<emphasis>gcr.h</emphasis> et <emphasis>gcr.cpp</emphasis>
sont quasiment identiques <20> ceus dans YAE.</para>
<para>Il semble que le site de YAE n'existe plus
(<ulink url="http://quark.netfront.net:6502/">http://quark.netfront.net:6502/</ulink>)
mais le code source peut toujours <20>tre trouv<75> sur le d<>p<EFBFBD>t Asimov ici :</para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/emulators/yae/yae-0.1.tar.gz">
ftp://ftp.apple.asimov.net/pub/apple_II/emulators/yae/yae-0.1.tar.gz</ulink></para>
</section>
</section>
<section><title>Appleblossom - Portable Open-Source Apple IIe Emulator</title>
<para>Quand je ne trouvais pas les r<>ponses ni dans la documentation
ni dans le code source de YAE, je cherchais dans le source de Apple Blossom.</para>
<para>J'ai pris le code pour la police de caract<63>re depuis Apple Blossom.
Il est maintenant dans le fichier <emphasis>CCharset.cpp</emphasis>.</para>
<para>Le code source de Apple Blossom est ici :</para>
<para><ulink url="ftp://ftp.apple.asimov.net/pub/apple_II/emulators/appleblossom/appleblossom.zip">
ftp://ftp.apple.asimov.net/pub/apple_II/emulators/appleblossom/appleblossom.zip</ulink></para>
</section>
</chapter>
</part>
</book>