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
- Zero valeur en dur : toute constante machine provient du JSON
- Code en francais : variables, fonctions, commentaires
- Tests systematiques : chaque module a ses tests unitaires
- Validation au chargement : les definitions sont verifiees a l'instanciation
- Chevauchement memoire : supporte via le champ
chevauchable