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:

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:

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:

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:

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:

    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

    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
    L1PSG SN76489
    L2YM2612 (OPN2)
    L3AUX0 (connecteur interne)
    L4AUX1 (connecteur interne)
    L5EXT (SID externe)
    AUXFPGA (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:

    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

    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 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:

    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:

    Fonctionnalités non testées

    Suggestions d'améliorations

    Par ordre de priorité, de mon point de vue.