Memo-1
Architecture d’un ordinateur homebrew à base de 65C02
Vue d’ensemble
Le Memo-1 est un ordinateur construit intégralement à partir de composants discrets, autour d’un processeur 65C02 cadencé à 1 MHz. Pas de kit, pas de carte préassemblée : bus adresse, bus données, décodage mémoire et logique de contrôle sont câblés et debuggés à la main.
La machine embarque 32 Ko de RAM, 16 Ko de ROM, un VIA 65C22, et une ACIA 6551 (à ne pas confondre avec la W65C51, incompatible avec le Minitel utilisé comme terminal). Le système prévoit également 8 Ko de ROM disponibles en extension.
Carte mémoire
Le décodage d’adresses se fait sur le nibble haut du bus adresse (A15..A12) :
Plage | Fonction
-------------+------------------
0000 - 7FFF | RAM (32K)
8000 - 8FFF | VIA
9000 - 9FFF | ACIA
A000 - BFFF | Slot d'extension externe
C000 - FFFF | ROM (16K)
Le cœur : le 65C02
Le choix du 65C02 plutôt qu’un Z80 vient avant tout d’une affinité personnelle pour la famille 6502, nourrie par un attachement particulier à l’Apple 1, l’Apple 2 et au Commodore PET, à l’inverse du TRS-80 qui n’a jamais suscité le même intérêt. Le déclic du projet s’est fait en pleine lecture d’Assembly Lines, l’ouvrage de Roger Wagner sur la programmation assembleur de l’Apple 2.
Le choix s’est porté précisément sur le W65C02S plutôt qu’une autre variante, pour deux raisons pratiques : il est toujours produit aujourd’hui, et il s’agit d’une puce statique, ce qui permet d’arrêter complètement l’horloge pendant les sessions de debug sans perdre l’état du processeur.
Le slot d’extension
Le slot externe (connecteur J4, 32 broches) expose l’intégralité du bus CPU : bus adresse A0-A15, bus données D0-D7, ainsi que les signaux de contrôle (/Ext select, CLK, /IRQ, /NMI, /RES, R/W). Le signal /Ext select est activé (niveau bas) lorsque le CPU adresse la plage $A000–$BFFF.
Ce slot sert à deux usages :
exécuter du code depuis une ROM externe (le code doit être compilé pour tourner entre $A000 et $BFFF) ;
accueillir l’extension cassette KCS.
Entrées/sorties : le VIA
Le 65C22 est accessible aux adresses $8000-$8003 et ne peut pas déclencher d’interruptions. Il fournit deux ports pour joysticks Atari CX40 :
Port B RW ------------------ $8000
Port A RW ------------------ $8001
Data direction register B -- $8002
Data direction register A -- $8003
Timer 1 low byte ----------- $8004
Timer 1 high byte ---------- $8005
Auxiliary Control Register - $800B
Le joystick 0 est câblé sur le port A (bits 0 à 4 : haut, bas, gauche, droite, feu), le joystick 1 sur le port B. Une fonction BASIC dédiée, JOY(), expose directement l’état masqué du port correspondant.
Audio : voix unique via le VIA
Dans son état actuel, l’audio du Memo-1 repose sur une voix unique : une routine BASIC (TONE) génère une onde carrée sur le bit 7 du port B, en réglant la durée du timer du VIA selon une table de correspondance note/valeur (par exemple LA 440 Hz = 1136 à 1 MHz). TONE 0 coupe le son.
La modulation par densité d’impulsions (PDM) et la synthèse 1-bit multi-voix — à l’image de l’approche utilisée par p-tracker sur le Commodore PET 4032 — ont fait l’objet de recherches, mais ne sont pas encore implémentées sur le Memo-1. Il s’agit d’une piste d’évolution envisageable entièrement en logiciel, sans modification matérielle.
Stockage : l’extension cassette KCS
Pour la sauvegarde et le chargement de programmes, le Memo-1 dispose d’une extension au format KCS (Kansas City Standard), connectée via le slot d’extension externe. Elle permet de sauvegarder/charger du code BASIC ainsi que des dumps bruts de n’importe quelle zone de l’espace d’adressage.
Le point technique le plus délicat a été le chemin d’entrée audio. Une première approche autour d’un ampli LM386 a posé plusieurs problèmes successifs de découplage, de désadaptation d’impédance, et de mise en forme du signal avant décodage. La solution est finalement venue de l’étude de l’implémentation KCS des machines 8 bits Acorn : en s’inspirant de leurs choix, le montage a basculé sur un LM358, qui a permis de résoudre ces problèmes. [Précise ici, si tu veux, ce que le LM358 change concrètement dans le montage par rapport au LM386.]
Terminal : le Minitel 1B
Le Memo-1 utilise un Minitel 1B comme terminal, via un pilote maison (src/minitel.s) qui exploite l’ACIA 6551 comme UART. Au démarrage, le code d’initialisation configure l’ACIA et le VIA, envoie les commandes nécessaires au Minitel pour ajuster le débit et désactiver l’écho local, puis affiche un menu de démarrage :
1 : lance WOZMON (moniteur mémoire de Steve Wozniak) ;
2 : démarre MS-BASIC (interpréteur Microsoft BASIC) ;
3 : exécute le code présent dans le slot ROM externe (option qui n’apparaît que si une ROM est détectée à l’adresse $A000) ;
A : affiche un écran « à propos » (informations système, licence, crédits).
La détection de ROM externe se fait en lisant le premier opcode à $A000 : si la valeur lue est $A0, le menu considère qu’aucun matériel ne répond à cette adresse (comportement caractéristique du 6502 en l’absence de circuit connecté). Si une ROM est détectée, un nom personnalisé est lu dans les 8 premiers octets de son en-tête (A000−A007), et l’entrée de menu saute à $A008.
Le support des imprimantes Minitel est encore en cours de développement.
Outils de développement
Le code est assemblé avec ca65 et lié avec ld65 (suite cc65). Exemple de build pour MS-BASIC :
cd src
ca65 -D memo msbasic.s -o ../out/memo.o
ld65 -C memo.cfg ../out/memo.o -o ../out/memo.bin -Ln ../out/memo.lbl
Licence et crédits
Le projet est placé sous licence Creative Commons BY-NC-SA. Le code source s’appuie notamment sur WOZMON (Steve Wozniak), BASIC-M6502 (Microsoft) et la désassemblation MS-BASIC de Michael Steil, ainsi que sur les tutoriels de Ben Eater (CC-BY) pour la conception matérielle de base.
Ressources
Le schéma, la nomenclature (BOM), les instructions de montage et le code source du Memo-1 sont disponibles sur github.com/MemoireMorte/Memo-1.
Published @ 27/07/2026 17h00