Foenix Retro Systems A2560U
Présentation du système
Voir les images
Historique
La conceptrice Stefany Allaire s'est lancé comme projet de réaliser l'ordinateur de rêve de la fin des années 80, début 90. Ayant eu un Commodore 64 dans son enfance, elle a crée une machine de rêve inspirée du Commodore 64. Cette machine est à base de 65816, qui est un descendant compatible avec le processeur 6502 du C64, mais qui peut fonctionner en 16bits. Elle y a adjoint un système graphique puissant et des puces sonores de légende (SID sous forme de FPGA mais on peut installer un vrai, OPL, etc.). Le résultat est le C256 Fenix. Elle a crée une version avec encore plus de puces sonores, interface MIDI etc., le C256FMX. Puis une version allégée, le C256U.
Ces machines formidables ont, faute de marketing suffisant (on ne peut pas être partout à la fois) et de projets de clones de C64 concurrents, pas eu autant de succès qu'elles auraient du. Steffany a pensé que le 65816 était un processeur formidable, mais peut être trop mal connu et cantonné aux connaisseurs du 6502 ouverts à la modernité, et pour s'ouvrir à un public plus large, elle a décidé de faire un ordinateur qui aurait en plus un autre processeur, au choix. C'est ainsi que le C256 GenX est conçu: c'est un C256 mais qui a en plus une carte CPU avec un 68EC000, 68EC030, 68EC040, 486DX2, un FPGA plus puissant autorisant des résolutions graphiques améliorées, etc. Et bien sur encore plus de support matériel, et interfaces.
Pour valider l'adaptation du 68000 dans le système chipset Foenix, Steffany a créé une carte prototype, et s'est rendu compte qu'elle pourrait très bien servir de base pour un Foenix ayant un 68000 plutôt qu'un 65816. Le résultat est le A2560U. La gamme A2560 sera étendue avec le A2560X (qui est un GenX avec un processeur 68EC000 et sans le 65816) et le A2560K, avec un 68EC040 et avec un clavier et un boîtier type Amiga 600.
Le premier Foenix 68K à sortir est donc le A2560U. Il n'est plus actuellement commercialisé mais le A2560X et K, voire le GenX avec carte 68k sont ses successeurs.
Concept
Les ordinateurs de Stefany sont conçus pour être des ordinateur type "rétro", des années 80 et 90. Ils à cet effet équipés d'authentiques microprocesseurs et puces sonores. Le reste des sous-systèmes peut-être implémenté sous forme de FPGA. Les ordinateurs partagent une conception commune avec des sous-systèmes:
- Le microprocesseur est un vrai microprocesseur (pas une émulation FPGA)
- Le sous-système GAVIN est responsable de la gestion du système et des entrées/sorties générales
- Le sous-système BEATRIX fournit les fonctionnalités sonores
- Le sous-système VICKY qui fourni les fonctionnalités vidéo
- De la mémoire flash pour stocker un système d'exploitation ou tout autre chose de votre choix
- De la mémoire centrale
Pour des raisons d'intégration, au fil des versions, GAVIN et BEATRIX on été intégrés dans le même FPGA pour former "GABE" (contraction de GAvin et BEatrix). Plus tard, l'intégration supplémentaire de VICKY dans le même FPGA a donné FAT VICKY qui correspond donc à GAVIN, BEATRIX et VICKY dans la même boîte.
J'ai fait un petit document que je mets à disposition lors des convention Atari, et qui présente la machine et ses spécifications, il est ici.
GAVIN
GAVIN a plusieurs fonctions, notamment:
- Démarrage du système
- Contrôle du bus
- Contrôle de l'interface de déverminage (debug)
- Interfaçage avec les entrées/sorties (IDE, joysticks, carte SD)
- Sur les modèles "U", implémentation d'un contrôleur PS/2
- Sur les modèles "U", implémentation d'un port série compatible 16550 (16750 sur le A2560U)
- Générateur de nombre pseudo-aléatoire
- Coprocesseur arithmétique entière
- Coprocesseur arithmétique en virgule flottante
- Emulation ou interfaçage des/avec les puces sonores
- Retardateurs (timers)
Les interruptions sont gérées par GAVIN, il y a plusieurs sources d'interruptions, qui sont organisés en groupes. Par exemple il y a un groupe pour les interruptions générées par VICKY (le sous-système vidéo) qui correspond aux interruptions VBL/HBL, collision de sprites etc. , un autre groupe pour GAVIN et ses timers et entrées/sorties, etc.
Chaque groupe a les registres suivants, ou chaque bit du registre correspond à une source d'interruptions:
- "PENDING". Ce registre sert à signaler que la demande d'interruption a été faire. En examinant les différents bits de ce registre, on peut déterminer la source de l'interruption. Un bit à 1 signale que la source d'interruption correspondante à ce bit a demandé une interruption. Il faut aquitter l'interruption en écrivant dans ce registre PENDING les bits correspondants à l'interruption à acquiter. Par exemple, si le registre PENDING est à 0x0004L (l'interruption correspondant au bit 2 est levée), il faut acquiter en écrivant 0x0004L dans le registre pour acquiter l'interruption. Ne vous préoccupez pas des bits à 0 que vous pourriez écrire dans le registre PENDING par erreur, ils sont ignorés.
- "EDGE". Ce registre sert à indiquer si l'interruption est levée sur un front montant ou descendant de la condition d'entrée. Comme pour le registre pending, un bit correspond à une source d'interruption.
- "MASK". Ce registre sert à masquer des interruptions. Si une interruption est masquée, elle ne sera pas déclenchée même si le bit correspondant dans PENDING passe à 1. Pour qu'une source d'interruption puisse déclencher une interruption, il est impératif que l'interruption soit démasquée, c'est à dire que le bit correspondant dans le registre MASK soit à 0.
Le vecteur d'interruption utilisé peut être différent pour chaque source d'interruptions, ou être partagé. Ceci est définit pour la machine et ne peut être changé. Pour les interruptions les plus fréquentes, par exemple celles de GAVIN et BEATRIX qui nécessitent un temps de traitement court, un vecteur d'exception est directement appelé. Mais dans le cas de VICKY en revanche, c'est le même vecteur qui est appelé donc le gestionnaire d'interruption doit examiner le registre PENDING pour déterminer quelles sont les sources d'interruptions qui ont fait une demande, et appeler manuellement les gestionnaires correspondants.
Pour rappel, un gestionnaire d'exception doit sauver tous les registres qu'il modifie, et se terminer par l'instruction RTE.
Clavier et souris PS/2
Le Foenix dispose de deux port PS/2 fournis par la puce LPC47m10x SuperIO, sauf sur les modèles U où ils sont servis par un bloc FPGA dans GAVIN. Dans tous les cas, le système peut générer une interruption lorsqu'un des deux canaux PS/2 a reçu un octet. Il y a des interruptions séparées pour le premier canal (normalement un clavier) et le second (normalement une souris). Il est à noter que l'implémentation FPGA n'a pas (actuellement) de FIFO donc il faut vraiment récupérer les octets depuis le port de sortie PS/2 le plus rapidement possible pour éviter de les perdre. Comme les interruptions PS/2 ont la priorité la plus faible, elles peuvent être masquées par une interruption de plus haute priorité, ce qui peut compliquer la tâche.
L'implémentation FPGA du contrôlleur PS/2 peut être un peu capricieuse. Il faut attendre "un peu" (par exemple 20ms) entre chaque octet envoyé au contrôlleur sinon peut avoir des problèmes de communication. J'ai en outre noté les choses suivantes:
- Si l'interruption est activée dans le contrôlleur PS/2 mais désactivée dans GAVIN, la réception d'un octet PS/2 peut bloquer le système.
- Une saturation (overrun) PS/2 peut bloquer le système. Il faut donc lire l'octet reçu même si on n'en fait rien.
Le A2560K dispose d'un processeur clavier dédié appelé MAURICE ("Mo" pour les intimes) mais je n'ai pas plus d'info à son sujet. Il faut explorer les sources du noyau FoenixMCP pour en savoir plus.
De plus, VICKY est d'une grande aide pour la gestion de la souris: elle sait calculer la position de la souris à partir des données reçues via le port PS/2. Il faut juste récupérer les octets et les écrire dans des registres dédiées. Une fois le troisième et dernier octet écrit, VICKY calcule et met à jour automatiquement (ce n'est pas optionnel) la nouvelle position de la souris que l'on peut récupérer depuis des registres dédiés. A noter qu'il y a une machine à état pour gérer cela, mais qu'elle est tatillone, si les octets PS/2 ne sont pas écrit dans le bon index/ordre ça peut vraiment faire n'importe quoi (d'après Stefany, moi je n'ai pas essayé).
Tout comme la souris, sur les modèles U, le support est intégré à au sous-système GAVIN, voir ici.
Horloge
L'heure et la date sont gardées par un bq4802LY dont on peut accéder aux 16 registres. Cette puce permet de garder la date et l'heure avec une résolution de une seconde, et peut fournit aussi un retardateur avec plusieurs périodes.
Retardateurs
GAVIN fournit 4 retardateurs (timers), identifiées 0 à 3. Les retardateurs sont utilisables librement en compteur ou décompteur et peuvent être réarmés automatiquement. Ainsi, on les programme avec une valeur initiale (CHARGE), et une valeur finale (COMPARE). Evidemment, en mode compteur la valeur finale doit être supérieure ou égale?à la valeur initiale, et l'inverse en mode décompteur.
Les retardateurs 0 à 2 sont cadendencés par l'horloge du processeur, tandis que le retardateur 3 est déclenché par le signal "Start of frame" de VICKY.
Quand le compte/décompte est terminé, une interruption est levée sur le microprocesseur, et le gestionnaire d'interruption doit examiner les registres de contrôle d'interruption pour déterminer la source de l'interruption, et exécuter les actions requises.
Il est possible de lire à tout instant la valeur de "charge" des retardateurs alors qu'elle est incrémentée/décrémentée. Il est à noter que lorsqu'on écrit dans le registre de charge on écrit cette valeur, mais quand on la lit, en réalité on l'incrémente de la valeur écrite.
Documentation:
Configuration des retardateurs.
Registres de contrôle des interruptions
Coprocesseur mathématique
GAVIN fournit un coprocesseur mathématique qui permet de faire des opérations entières ne nécéssitant qu'un cycle d'horloge. Ceci est particulièrement utile sur les machines 8/16bits basée sur le 65816, moins il est vrai sur un 68000. Le coprocesseur fournit:
2 multiplicateurs 16bits (signé et non signé)
2 diviseurs (signé et non signé)
1 additionneur 32 bits.
L'utilisation du coprocesseur est des plus simples: on écrit les opérandes dans des registres on attend un cycle puis, le résultat est prêt à être lu !
Démarrage du système
Lors de l'initialisation ou de la remise à zéro du système, GAVIN copie les premiers 64Ko de la mémoire flash 0 (adresse 0xe00000) vers l'adresse 0 de la RAM. Ceci inclue évidemment le pointeur de pile superviseur et l'adresse où sauter. Pour mémoire, un 68000 va charger depuis l'adresse 0 un mot long comme étant la pile superviseur, puis va sauter à l'adresse spécifiée par le prochain mot long. Cette adresse peut se situer n'importe où dans l'espace d'adressage (en pratique, RAM ou flash) pour continuer la séquence de démarrage.
Interface de déverminage
Les Foenix disposent d'un port mini USB qui émulate un port série XR21B1411 à 6Mbps. Ce port fournit une interface de bas niveau avec GAVIN qui permet de faire des choses comme: interrompre le processeur, RESET du processeur, lire un bloc mémoire, écrire un bloc mémoire, programmer la mémoire flash.
L'utilisation de ce port série émulé nécessite un pilote spécial qu'on peut trouver à https://www.maxlinear.com/support/design-tools/software-drivers. Bien choisir XR21B1411 !
Les commandes sont les suivantes:
Code |
| Commande |
|
0x80 |
Stoppe le processeur. Ceci doit être fait avant tout autre opération. |
0x81 |
Reprend l'exécution du programme par le processeur. |
0x11 |
Efface toute la mémoire flash. |
0xFE |
Retourne la version de l'interface de déverminage. C256 Rev. B2 retourne 0 et Rev C4A retourne 1. |
0x10 |
Programme la mémoire flash. Les données à écrire doivent être en RAM. On spécifie comme argument l'adresse source dans la RAM. |
0x10 |
Ecrit les données fournis vers une adresse. On passe en argument l'adresse cible, puis un tableau d'octet représentant les données. |
0x00 |
Lit les données. On passe en argument l'adresse source, la 0 (sur 4octets) puis la longueur à lire sur 4 octets. |
Le protocole est le suivant (touts les champs font 1 octet):
0x55
Numéro de commande
Adresse
Longueur des données
Données (optionnel, dépend des commandes)
Somme de contrôle (OU exclusif de tous les octets composant la séquence ci-dessus)
Le Foenix exécute la commande et répond avec 0xAA puis un code sur 16 octets, puis les données requises. Il existe un ensemble de scripts Python, C256Mgr qui permettent d'exploiter cette interface très facilement.
Stockage
Le 2560U dispose de deux interfaces pour le stockage de masse:
- Carte SD. Il est possible d'utiliser le SPI directement, et GAVIN dispose aussi du support pour les transactions SD, mais pas avec les cartes les plus récentes. Les cartes Transcend 2Go fonctionnent bien.
- Port IDE (connecteur pour disque dur 2,5")
Port série
Le A2560U dispose d'un UART implémenté dans le sous-système GAVIN du FPGA FAT VICKY II. Cette implémentation est compatible UART 16750. Il est cadencé à la vitesse du processeur (20MHz) et permet des taux de transfert jusque 115200bps. Le connecteur est DB-9M RS-232. Il a les restrictions suivantes:
3 fils sont câblés: les broches CTS/RTS et de contrôle de modem ne sont pas supportées.
La FIFO fait 64 octets
Joysticks
- 2xDB-9M Atari
- Support SNES/NES avec adaptateur possible
BEATRIX
BEATRIX est le très puissant sous-système sonore ! Elle fournit l'interfaçage avec les différent synthétiseurs montés sur la carte mère, ou implantés sous forme de FPGA.
Les synthétiseurs sont connectés à BEATRIX, et leurs registres sont accessibles dans l'espace d'adressage du processeur. Les puces peuvent avoir besoin d'un certain nombre de cycles entre les écritures dans leurs registres. Heureusement, BEATRIX gère cela ! Elle dispose de files FIFO de 256 entrée et de machine à état interne pour chaque processeur. On n'a donc pas à se soucier de ces attentes, on écrit dans les registres et c'est tout, pas besoin de bloquer l'exécution du programme pour respecter les temps d'attente des synthés.
Modèle |
SID |
SN76489 |
OPM1 YM2151 |
OPN2 YM2612 |
OPL3 YMY262 |
Echantillonage |
Entrées audio |
Sorties audio |
A2560U/U+ |
3 |
Oui |
Non |
Non |
Oui |
8/16bits mono/stéreo 48kHz |
2x prises 3 broches sur carte mère |
RCA et casque |
A2560U et U+
A2560U: SN76489, OPL3, SID (sous forme FPGA).
Echantillonage 8/16 bits 48kHz (pas encore implémenté)
Synthétiseur SN76489
Ce processeur a équipé notamment la Coleco Vision, Sega Master System et Megadrive. Plus d'information ici.
Dans le Foenix, il est émulé par FPGA et a une horloge de 3.57MHz. Il dispose de 3 oscillateurs d'onde carrée et un générateur de bruit. Contrairement au 2149 de l'Atari ST, il n'a pas de générateur d'enveloppe.
Documentation:
ici
Explications intéressantes.
Synthétiseur OPM1 YM2151
Le son FM des années 80 ! La puce a été crée par Yamaha pour ses synthétiseurs semi-pro de la série DX et équipé le Sharp X68000.
Documentation:
Page Wikipedia
Datasheet
Synthétiseur OPN2 YM2612
Le synthétiseur FM de la Sega Megadrive, à 2 ou 4 opérateurs et formes d'ondes variées.
Documentation:
Synthétiseur FM OPL3 YM262
Le synthétiseur FM des cartes Adlib, compatible OPL2. Ce synthétiseur équipait les SoundBlaster SB16. Il a 18 voix de polyphonie maximum, avec 2 opérateurs par canal. On peut le configurer pour avoir moins de voies mais 4 opérateurs par voie. Un petit code de test pour cette puce se trouve ici.
Documentation:
Mixage et échantillonage
Le mixage et assuré par la puce WM8776 qui est capable de mixer 5 entrées analogiques, qui sont additionnées, (le niveau peut-être augmenté ou limité automatiquement). Il y a aussi un "noise gate", une dé-emphase, un filtre passe haut, puis le signal est reconverti en analogique pour être remixé avec des entrées auxiliaires, ou les entrées analogiques directement (pour contourner tout le traitement numérique).
Sur le A2560U, les entrées sont assignées comme suit:
Numéro d'entrée (1-5) |
Source audio |
L1 | PSG SN76489 |
L2 | YM2612 (OPN2) |
L3 | AUX0 (connecteur interne) |
L4 | AUX1 (connecteur interne) |
L5 | EXT (SID externe) |
AUX | FPGA (SID / SN76489) |
Pour les autres machines, Stefany a fourni des détails sur Discord.
La documentation est ici Puce de mixage / ADC / DAC 24 bits 192KHz
VICKY
VICKY gère la vidéo. Elle existe en différentes générations. Le A2560U a VICKY II alors que le GenX a VICKY III. Ces puces ont globalement les mêmes fonctionnalités mais peuvent fournir les fonctionnalités suivantes:
- Affichage bitmap (framebuffer)
- Affiche de "tuiles"
- Lutins
- Détection de collision
- Affichage de texte
- Transfert DMA
Documentation de VICKY II
Principe de fonctionnement de VICKY
VICKY dispose de sa propre mémoire, que l'on appelle la mémoire vidéo ou VRAM. Le système vidéo (VICKY et sa VRAM) a aussi sa propre horloge et est connecté au bus système. Les registres de configuration de VICKY et la VRAM sont accessibles dans l'espace d'adressage du CPU. Cependant, pour les transferts de données vers/depuis/entre la mémoire vidéo et la mémoire système, il est très recommandé d'utiliser les systèmes de DMA.
Il est très important de noter que comme VICKY a sa propre mémoire, les adresses qu'on lui indique doivent être exprimées dans son espace d'adressage, et non dans celui du CPU. C'est à dire que si la VRAM est en $B0:0000, le premier pixel est en $B00000 pour le CPU, mais en $000000 pour VICKY.
DMA
Le Foenix dispose de 2 DMA: le DMA système (SDMA), et le DMA de VICKY (VDMA). Ces DMA fonctionnent à la vitesse du bus source.
Donc pour transférer de la RAM à la VRAM, ça se fait à raison d'un mot processeur par cycle. Par exemple sur un C256: 1octet * 14MHz, c'est à dire 14Mo par seconde.
Je suppose que sur un 68000 ce sera 16bits*20MHz et sur un 68030 32bits*33MHz ?
Le transfert SDMA -> VDMA se fait à travers une file d'attente FIFO de 256 entrées. Il se peut que le SDMA ait l'air terminé du point de vue de l'expéditeur, mais le VDMA n'a pas forcément fini de vider la file donc tout n'est pas pour autant transféré. Donc avant de commencer un nouveau transfert vers la VRAM, il faut s'assurer que le VDMA a fini son travail de vidage de la FIFO. On peut pour cela attendre que le bit 7 du registre de contrôle du VDMA est à 0. On peut aussi demander au VDMA de lever une interruption lorsqu'il a terminé son travail.
Limitations / notes
- Sur les machines 68516, les transfers DMA impliquant la mémoire centrale interrompent le processeur (car il utilise le bus à 100%, pas de DMA possible). Pendant ce temps aucune interruption n'est traitée. Il est donc recommandé de tout charger en VRAM et de faire les transfers de VRAM à VRAM car ils sont également très rapides (pendant la VBL).
- Si un transfert VDMA est en cours, VICKY ne regarde pas la file d'attente des données à transférer depuis la mémoire centrale (par adressage de la VRAM depuis le CPU).
- Sur les machines 68516, après qu'on ait demandé un transfer SDMA, il peut se passer quelques cycles avant que le processeur ne soit interrompu.
- Lorsqu'on écrit dans la RAM vidéo, il faut le faire par octet (8 bits) ou par mot (16 bits). Il ne faut pas utiliser les mot longs (pour l'instant) car il y aura des problèmes d'ordre des octets car la logique système ne peut pas déterminer si le transfert est en 16 ou 32 bit et ne peut donc pas réordonner les octets en conséquence.
SDMA (DMA Système)
Le SDMA (DMA système) permet de copier , le processeur transfère 1 mot à la fois (1 octet sur le C256). Donc pour aller de la RAM à la VRAM, on a sur un C256 (8bits, 14MHz) 14Mo/s et sur un A2560 (16bits, 20MHz) 40Mo/s ?!
Transfer de RAM à VRAM sans DMA
Depuis le CPU, on peut écrire dans la VRAM à n'importe quel instant, mais ces écritures ne seront pas effectives immédiatement et si la FIFO est pleine, les données sont perdues. En réalité, l'écriture aux adresses de la VRAM sont interceptées par VICKY et mises en file d'attente. VICKY, quand elle n'est pas occupée à faire un rendu d'écran, les lit et les écrit en VRAM. Ceci n'est pas une priorité pour VICKY, qui préfère calculer le rendu de l'écran ou accomplir les transfers DMA. Pour cette raison, ces transfers de RAM à VRAM sont surtout effectués entre le moment ou VICKY a fini de rendre une trame d'écran, et le moment ou elle commence à rendre une autre trame. C'est à dire, c'est lors de l'interruption Start of Frame (SOF), aussi appelée VBL (Vertical BL) que les transfers DMA ou de CPU vers VRAM sont les plus rapides et il est donc fortement conseillé de les faire à ce moment là. La même chose est vraie dans l'autre sens (c'est à dire la lecture de la VRAM).
Résolutions graphiques
Video: VICKY II
Vicky 2 propose 6 résolutions. En réalité il y en a 2, mais bon peut doubler les pixels pour diviser la résolution par 2.
640x480/60Hz ou 320x240
800x600/60Hz ou 400x300
640x400/70Hz ou 320x200
Toutes les résolutions on le même format de pixel: 1 pixel = 1 octet, et cette octet est l'index d'une couleur dans une des palettes.
8 palettes de couleur (256 colors parmis 16 millions)
2 bitmap layers
4 tilemap layers
64 32x32 sprites
VDMA engine
Palettes (LUT)
VICKY supporte plusieurs palettes de 256 couleurs qu'on peut assigner aux plans de bitmap, texte etc. Chaque palette a 256 entrées de mot longs formattés comme suit. Majuscule signifie "de poids fort" et miniuscule "de poids faible". La composante alpha (Aa) n'a pas d'effet (pour l'instant ?) et doit être positionnée sur $FF.
0xGgBbAaRr
Il est important d'adresser le contenu de LUT en tant que mot (16bits).
Lutins (sprites)
Documentation VICKY II
A noter: il faut ajouter 32 aux coordonnées désirées d'un lutin, car leur références est à -32,-32 par rapport au coin supérieur gauche de l'écran.
Les lutins ne fonctionnent pas encore dans le A2560U.
Dalles (tiles)
Mode texte
VICKY dispose d'un mode texte qu'on peut activer via le registre de contrôle de VICKY. Dans ce mode, l'écran est décomposé en "cellules" et il y a des zones mémoires:
- Une mémoire stockant la police. VICKY II ne supporte pour (l'instant?) qu'un format de police 8x8 ou chaque caractères est codé sur 8 octet (8bits*8 lignes), mais dispose d'assez de mémoire de police pour stocker une police 8x16. La moitié de cette mémoire est donc inutilisée et inutilisable. VICKY III (A2560K, GenX) a un mode 8x16.
- Une mémoire de texte. En écrivant l'octet correspondant à un numéro de caractère dans l'adresse correspondant à une cellule, VICKY fait le rendu du caractère automatiquement.
Une mémoire de couleur de texte. Il y a un octet correspondant à chaque cellule, et 4 bits sont utilisés pour coder le numéro de la couleur du fond, et 4 bits pour la couleur du texte. Pour faire de la vidéo inverse, il suffit donc d'inverser ces deux.
Une palette de 16 couleurs dédiée au mode texte.
Mode bitmap
Quand le bitmap est activé, VICKY fait le rendu d'un ou deux framebuffers (on peut les activer séparément). A noter: il est possible qu'il faille d'abord activer le BITMAP ENGINE dans le registre de contrôle de VICKY avant de régler les registres des bitmap.
VICKY a un mode "overlay" dans lequel le texte est affiché par dessus le bitmap. La couleur de fond du texte est ignorée et considérée comme transparente. C'est pratique mais ça veut aussi dire que ce n'est pas possible d'utiliser de la video inverse dans ce mode.
Mémoire
Carte mémoire du A2560U/U+
-- MEMOIRE CENTRALE
$0000_0000 - $001F_FFFF - Mémoire RAM (2MBytes)
$0000_0000 - $003F_FFFF - Mémoire RAM (2MBytes, modèle U+ seulement)
$0040_0000 - $00AF_FFFF - Réservé (extension mémoire future SDRAM?). BUS ERROR si tentative d'accès.
-- GAVIN
$00B0_0000 - $00B1_FFFF - (SuperIO/Math Block/SDCard/IDE/Ethernet/SDMA)
$00B0_0400 - $00B0_040E - Contrôlleur IDE / PATA
$00B0_2804 - $00B0_2800 - Contrôlleur PS/2
$00B0_0300 - $00B0_0324 - Contrôlleur carte SD
-- BEATRIX
$00B2_0000 - $00B3_FFFF - Registres de BEATRIX (CODEC/ADC/DAC0/DAC1/PSG/SID)
$00B2_1000 - $00B2_101F - SID gauche
$00B2_1200 - $00B2_121F - SID droite
$00B2_1400 - $00B2_141F - SID centre
-- VICKY II
$00B4_0000 - $00B5_FFFF - Registres de VICKY
$00B6_0000 - $00B6_3FFF - Mémoire de texte
$00B6_4000 - $00B6_7FFF - Mémoire de palettes
$00BF_0000 - $00BF_FFFF - EXPANSION Chip Select
$00C0_0000 - $00DF_FFFF - Mémoire vidéo (VRAM)
-- MEMOIRE FLASH
$00E0_0000 - $00E0_FFFF - FLASH0 (code superviseur seulement)
$00F0_0000 - $00FF_FFFF - FLASH1 (code superviseur ou utilisateur)
Carte mère
J10 is a Switched 12V if for some crazy reasons one would want to install a full size HDD that would need +12V
Documentations de référence
68k Programmers Reference Manual
Real Time Clock bq4802ly
SN76489 Programmable Sound Generator
WM8776 Codec
Yamaha YM2151 OPM
Yamaha YMF252 OPL3
SID
PS/2 Mouse and Keyboard
Ce qui marche et ne marche pas (encore)
Problèmes et limitations
Le A2560U est un système jeune et en développement donc la version actuelle a les limitations et problèmes suivants, qui ne manqueront pas d'être corrigés:
- Le DMA (VDMA/SDMA) n'est pas implementé, ce qui rend l'utilisation d'un "shadow framebuffer" couteuse car c'est le CPU qui doit le recopier en VRAM.
- Le téléversement de mémoire flash ne permet pas de flasher la deuxième banque 0xF00000, ça empêche de mettre EmuTOS en flash car il exécute ses process (shell, bureau etc) en mode utilisateur, hors la banque FLASH 0xE00000 ne permet pas l'exécution de code utilisateur. La solution de contournement est de préparer une carte SD ou un disque dur avec le shell dans le dossier AUTO.
- Ecriture en RAM vidéo : on a des artifacts si on écrit trop vite.
- Toutes les instructions processeur de type "read-modify-write" ne fonctionnent pas encore car le 68EC000 n'expose pas le signal qui permet de détecter cela, et la logique de contrôle de bus du FPGA le gère donc mal. Il faut écrire du code spécial pour le faire marcher. TAS en particulier, qui permet la synchronisation, n'est donc pas possible.
- J'ai l'impression que l'horloge temps réel a l'air d'aller trop lentement. D'un jour à l'autre, elle prend du retard sur mon A2560U.
- Il semble que si il n'y a pas de bordure (car je n'ai pas observé cela avec MCP), le premier caractère d'une ligne texte ne soit parfois pas rendu, en particulier quand on écrit beaucoup en mémoire de texte. Par exemple, le premier caractère d'une ligne dans MicroEmacs (par exemple le # de #define dans un fichier C) n'est pas toujours rendu, surtout si on insère une ligne vide avant.
- VICKY ne se reset pas totalement en cas de changement de résolution si on a utilisé la 1024/768 et repasse en résolution plus basse, il faut éteindre/rallumer le Foenix.
- Le clipping de la souris ne fonctionne pas parfaitement. En X comme en Y, la souris peut sortir de l'écran (un pixel trop loin).
- Je n'ai pas réussi à acquitter les interruptions de l'UART16750 (mais on peut s'en sortir autrement facilement).
- Le registre "alternate status" du contrôleur IDE n'est pas raffraîchi à temps. On peut contourner cela en utilisant le registre "status" normal. Ceci acquitte l'interruption dans le contrôleur IDE mais si on utilise pas les interruptions on s'en moque.
- Il est probable qu'il y ait un autre problème dans le contrôleur IDE qui empêche le soft reset des périphériques IDE.
- Les sprites ne sont pas fonctionnels
- Les tuiles ne sont pas fonctionnelles
Fonctionnalités testées
La liste détaille les fonctionalités que l'auteur a spécifiquement utilisées et a pu faire marcher (modulo des limitations éventuelles, voir ci-dessus). La liste n'est évidemment pas exhaustive:
- Stabilité mémoire
- Stabilité processeur
- Port de débuggage et fonctionnalités associées
- Réception et envoi par UART16750
- OPL3 (YM2812)
- PSG SN76489
- Lecteur carte SD
- IDE (avec un seul périphérique)
- Mode texte
- SID
- WM8776: mixage, volume de sortie et sortie casque
- Mode texte de VICKY
- PS/2 (voir plus haut pour les limitations)
- Ports joysticks compatible Atari
- Lecture des dip switches documentés (boot, user)
- Téléversement en flash BANK0 (0xe00000)
- Ecriture de la ram vidéo en 8bits et 16 bits
Fonctionnalités non testées
- Coprocesseur mathématique pour les entiers
- Coprocesseur mathématique en virgule flottante
- WM8776: sortie cinch, entrées auxiliaires, effets (compression, noise gate etc.)
Suggestions d'améliorations
Par ordre de priorité, de mon point de vue.
- Ajouter une FIFO à l'implémentation PS/2 FPGA pour éviter de perdre des octets car l'interruption PS/2 a la plus faible priorité et des octets peuvent être perdus.
- Avoir un mode texte 8x16 (il y a a assez de mémoire de fonte pour cela).
- Avoir un moyen de réinitialiser le clignotement du curseur dans le mode texte pour forcer le curseur à s'afficher. Par exemple, on veut forcer le curseur à s'afficher quand on frappe une touche. Je pense qu'on pourrait avoir un des modes "flash rate" qui représente "always on".
- Pouvoir écrire dans les registres Mouse X et Mouse Y pour pouvoir positionner la souris comme on veut (par exemple si on veut la clipper par logiciel ou faire un accélérateur de souris).
- Avoir un "hot spot" qui spécifie le point de centrage et du curseur de la souris (par exemple pour avoir un
curseur en forme de croix). Actuellement c'est le point le plus en haut à gauche qui est le "hotspot".
- Avoir un moyen de réinitialiser la machine à état de VICKY pour l'analyse des packets souris PS/2 au cas où des octets PS/2 aient été ratés. Mais je n'ai pas vraiment recontré de problème avec ça.
- Permettre l'écriture de la VRAM en 32bits. Pour les fonctions raster ou scrolling ça pourrait être utile tant que le DMA n'est pas fonctionnel.
- Avoir un moyen de lire la mémoire vidéo : par exemple pour faire de la vidéo inverse, on fait un "NOT" de ce qui est affiché, pour afficher un rectangle de sélection on fait un XOR. Mais quand le DMA sera implémenté ce sera possible en utilisant de la RAM et en la copiant lors de la VBL.
- Permettre de régler les timers séparément par adressage individuel de leur registre de contrôle. Actuellement, les registres de contrôle des timers 0,1,2 sont à la même addresse à addresser en mot long, et donc on peut avoir des effets de bord sur les autres timers quand on veut en programmer un. Je n'ai pas vérifié cela mais bon.