Architecture

Decision : IDE agnostique machine

Toute specificite machine est decrite dans des fichiers de definition externes (JSON). Le code de l'IDE manipule exclusivement des abstractions generiques. Ajouter une machine = ajouter un fichier JSON.

  • Aucun nom de machine (Oric, ZX81, etc.) n'apparait dans le code source Go
  • Les interfaces et structures sont concues pour le cas general
  • Le validateur verifie la coherence des definitions au chargement

Choix de Go

  • Infrastructure de tests integree (go test)
  • Gestion native du JSON
  • Cross-compilation triviale (Linux, macOS, Windows)
  • Modules et dependances integres (go mod)

Structure des modules

OricForge/
├── cmd/oricforge/          Point d'entree CLI (17 fichiers par domaine)
├── internal/
│   ├── forgecore/          Abstractions generiques (CPU, memoire, video, son)
│   ├── forgemachine/       Chargeur et validateur de definitions JSON
│   ├── forgeasm/           Assembleur 6502/65C02 (lexer, parser, preprocesseur, segments)
│   ├── forgecompiler/      Compilateur BASIC → 6502
│   │   ├── lexer.go        Lexer BASIC → flux de tokens
│   │   ├── parser.go       Parser recursif descendant → AST (34+ noeuds)
│   │   ├── analyseur.go    Analyse semantique et inference de types
│   │   ├── ir.go           Representation intermediaire (40+ opcodes)
│   │   ├── codegen.go      Generation code 6502
│   │   ├── optimiseur_ir.go  Constant folding, reduction de force, hoisting
│   │   ├── peephole.go     Optimiseur peephole ASM
│   │   ├── linker.go       Dead code elimination, tri topologique
│   │   ├── allocateur.go   Allocateur page zero
│   │   ├── runtime.go      66 modules runtime (math, print, GC, float, graphique, son)
│   │   └── types.go        Systeme de types (u8, i16, f40, str, bool)
│   ├── forgedebug/         Debogueur (client/serveur TCP, 40 types messages)
│   ├── forgedasm/          Desassembleur 6502/65C02 + hex dump
│   ├── forgeimage/         Images (HIRES, LORES 0/1, sprites, conversion inter-modes)
│   ├── forgesound/         Audio PSG (effets, musique, MIDI, synthese WAV)
│   ├── forgeio/            Formats (TAP, DSK/SEDORIC, charset)
│   ├── forgelib/           Bibliotheques ASM reutilisables (manifest, CRUD)
│   ├── forgeref/           References integrees (CPU, BASIC, peripheriques, memoire)
│   ├── forgeweb/           Interface web (API REST, editeur, dashboard)
│   ├── forgetutorial/      5 tutoriels interactifs
│   └── ...                 forgeemu, forgeextasm, forgeproject, forgebasic
├── machines/               Definitions machine (JSON)
├── web/                    Assets web (HTML, CSS, JS embedded)
└── tests/e2e/              Tests end-to-end

Flux de donnees — Definitions machine

Fichier JSON (machines/oric1.json)
        │
        ▼
forgemachine.ChargerMachine()  ── lecture + parsing JSON
        │
        ▼
forgemachine.ValiderMachine()  ── verification coherence
        │
        ▼
forgecore.DefinitionMachine    ── structure Go instanciee
        │
        ├──▶ DefinitionCPU       (instructions, registres, flags)
        ├──▶ DefinitionMemoire   (zones, banking, permissions)
        ├──▶ DefinitionVideo     (modes, palette, charsets)
        ├──▶ DefinitionSon       (canaux, registres, enveloppes)
        ├──▶ DefinitionBASIC     (tokens, version)
        └──▶ DefinitionFormat    (TAP, DSK, etc.)

Flux de donnees — Compilateur BASIC

Source BASIC (.bas)
        │
        ▼
Lexer  ──────────── tokens (depuis definition machine)
        │
        ▼
Parser ──────────── AST (34+ types de noeuds)
        │
        ▼
Analyseur ───────── inference types (u8/i16/f40/str/bool)
        │
        ▼
IR Generator ────── 40+ opcodes intermediaires
        │
        ▼
Optimiseur IR ───── constant folding, hoisting, inlining
        │
        ▼
Codegen 6502 ────── instructions ASM
        │
        ▼
Peephole ────────── optimisations locales ASM
        │
        ▼
Linker (DCE) ────── 66 modules runtime, tri topologique
        │
        ▼
Sortie ──────────── .s, .lst, .sym, .map, .tap

Regles de developpement

  1. Zero valeur en dur : toute constante machine provient du JSON
  2. Code en francais : variables, fonctions, commentaires
  3. Tests systematiques : chaque module a ses tests unitaires
  4. Validation au chargement : les definitions sont verifiees a l'instanciation
  5. Chevauchement memoire : supporte via le champ chevauchable