09/08/2021

Un micro-ordinateur FLEX/6809 DIY - Partie 1

 Cet article est le premier d'une série qui va présenter un petit ordinateur mono-carte que j'ai réalisé.


 

Voyons tout de suite ses caractéristiques :

  • Processeur 6809
  • 58Ko de RAM
  • 4Ko de ROM
  • 2Ko de NVRAM
  • Horloge RTC
  • Terminal série jusqu'à 9600 bauds
  • Port Imprimante Centronic
  • Contrôleur pour 2 lecteurs de disquette double densité
  • Système d'exploitation FLEX09

 Je me suis inspiré du Tavernier 6809 (ordinateur décrit dans la revue le Haut-Parleur à partir de 1983) qui est aussi un système Flex09. Je n'en ai pas fait un clone (ça pourrait faire l'objet d'un autre projet !), mais je suis parti des mêmes ingrédients, notamment le moniteur Assist09 (renommé TAVBUG dans le Tavernier) et le système d'exploitation Flex09. Disons qu'il y a un cousinage !

Au moment où j'écris cet article l'ordinateur est réalisé sur une plaque à pastilles (12x18cm), et tout n'est pas encore figé à 100%

Dans ce premier article on va s'intéresser au système minimal (CPU/RAM/ROM/Port série), et lancer un premier programme.

 Cet ordinateur étant destiné à faire tourner le système d'exploitation Flex09, il va respecter les prérequis indiqués dans le "6809 Flex Adaptation Guide" :

1.3 System Requirements 

In order to perform the adaptations and to run FLEX, there are certain hardware and software or firmware requirements. Specifically they are: 

1) Computer system with 8K of RAM at $C000 and at least 12K of RAM beginning at location $0000. 

2) A system console or terminal such as a CRT terminal or printer terminal. 

3) A single 8 or 5 1/4 inch disk drive with controller capable of running soft-sectored format with 256 byte sectors. 

4) A monitor ROM or some program affording the ability to begin execution at any desired point and to enter code into the system. This coding may be done by hand, but some sort of storage method such as cassette or paper tape would be helpful. Additionally, since the user is required to write several routines, an editor/assembler package will make the adaptation much easier.

 

 Le plan d'adressage est donc le suivant :

  • 0000-E7FF : RAM (58Ko)
  • E800-E807 : PTM
  • E808-E80F : ACIA
  • E810-E817 : PIA
  • E818-E81F : FLOPPY
  • E820-E839 : Libre
  • E840-EFF7 : NVRAM (1976 octets)
  • EFF8-EFFF : RTC
  • F000-FFFF : ROM (4Ko)

 Le schéma


Le décodage d'adresse est réalisé avec une GAL à laquelle est associé un décodeur 3-vers-8 74LS138. Ce dernier définit 8 blocs de 8 adresses pour les périphériques, sur le bloc E800-E840.

La GAL génère également les signaux \WR et \RD (en combinant les signaux R\W et E) qui sont nécessaires pour les 3 mémoires (ROM/RAM/NVRAM).

 Le CPU est cadencé à la fréquence de 3.6864Mhz, car cela permet de générer simplement l'horloge pour le port série.

Un TL7705 gère le signale RESET, qui est activé sur pression du bouton correspondant ou bien si la tension d'alimentation est insuffisante.

 

La RAM fait 128Ko, mais on utilise que la première moitié (vu que curieusement on trouve facilement des RAMs de 32 et 128Ko, mais pas de 64Ko !). De même on utilise que la moitié de l'EPROM 27C64, soit 4Ko sur 8Ko. 

Le circuit de NVRAM MK48T12B intègre le circuit d'horloge pour le RTC et la batterie de sauvegarde, il est vu comme une simple RAM par le CPU.

 



 

Le port série est composé d'un timer (PTM) 6840 pour générer l'horloge du port série et d'un ACIA 6850. Un MAX202 convertit les signaux TTL en signaux compatibles RS232 (+/-12V). Bien sûr rien n'empêche de brancher derrière un convertisseur série-USB !

La sortie du timer 1 du 6840 est également connectée sur l'interruption \NMI du 6809, afin de permettre au moniteur de générer des points d'arrêt pour  debugger les programmes.

La réalisation

J'ai réalisé le circuit sur une plaque d'essai 12x18cm (double face, trous métallisés). A titre indicatif je vous donne ma méthode de câblage,  mais chacun est libre de faire comme il le souhaite !

Je soude les fils côté piste, il s'agit de fil à wrapper 30 AWG. Au fil des réalisations j'ai essayé d'utiliser toujours les mêmes couleurs (même si je varie un peu de temps en temps), voici donc "mon" code de couleurs :
  • noir : masse
  • rouge : +5V
  • vert : bus de données
  • bleu : bus d'adresse
  • jaune : bus de contrôle
  • orange : chip select
  • blanc: horloges
  • violet et marron : interfaces 


 


Tout d'abord je soude 4 grands fils dénudés, deux le long de chaque grand bord du circuit (un point de soudure toutes les 10 pastilles environ). A l'extérieur le "-", à l'intérieur le "+". Il faudra relier ces 2 paires de pistes le long des petits bords du circuits, soit avec des grands fils, soit en profitant du câblage des alimentations des circuits intégrés.

Ensuite je positionne les supports (tulipe) des circuits intégrés avec 2 points de soudure en diagonale + le condensateur de découplage associé, puis je câble toutes les alimentations, en allant à chaque fois vers la grande piste de "+" ou de "-" la plus proche.

Enfin, je fais le reste, en général couleur par couleur. Les fils ne sont pas tendus, et j'essaie de ne pas en mettre plus de 2 par pastille. Si il y a des très grandes longueurs de fil je les retient par un "U" en fil dénudé (queue de résistance ...) soudé de part et d'autre.

Pour le port série et le port parallèle, j'utilise des connecteurs DB "à fils" sur lesquels j'ajoute 2 équerres pour les fixer sur le circuit. J'ammène ensuite les fils à wrapper du dessous du circuit vers le dessus puis je soude les fils directement sur le connecteur.

Programmation de la GAL22V10

J'utilise Atmel WinCupl (sous Windows) pour générer le fichier JED. Le logiciel est téléchargeable à cette adresse https://www.microchip.com/en-us/products/fpgas-and-plds/spld-cplds/pld-design-resources

Pour la programmation, j'utilise un programmeur Minipro TL866 II. J'ai inclus le fichier JED dans le projet github, du coup il n'est pas indispensable d'utiliser WinCupl, sauf si on veut le recompiler soi-même ou y faire des modifications

Mise en route et test

Mettre le circuit sous tension avec une alim de labo, sans les circuits intégrés. Vérifier qu'il n'y a pas de court-circuit et que le "+" et le "-" sont partout où il faut.

Installer les circuits intégrés et mettre sous tension. Le circuit doit consommer entre 300 et 400mA.

Vérifier avec un oscilloscope que le signal "E" (broche 34) oscille bien  (à 1/4 de 3.6864Mhz).

Récupérer sur le projet Github l'assembleur AS9 et le programme hello.asm. Voici les commandes permettant de générer l'image ROM :

as9 hello.asm -l c s cre s19
objcopy --input-target=srec --output-target=binary hello.s19 hello.bin

 Objcopy est dans le package "binutils" sur Debian/Ubuntu

AS9 est l'assembleur "officiel" de Motorola, je l'ai utilisé pour tous les logiciels

 Mettre sur une EPROM 27C64  ou une EEPROM 28C64 le fichier hello.bin obtenu (j'utilise un programmeur MiniPro TL866-II) et l'insérer sur le circuit.

Il faut connecter le port série à un terminal avec un cable croisé DB9 femelle-femelle (DTE-DTE). Le terminal est paramétré à 9600 bauds, 8 bits, 1 bit de parité.

A la mise en route de l'ordinateur, un message "Hello World" apparait, suivi d'un point d'interrogation. Si vous tapez un caractère, il devrait s'afficher à l'écran.

Documentation et liens

Le projet github est disponible ici : https://github.com/laurent-fr/LFlex21