WARNING Document de travail / notes.
Présentation
L'édieur est la partie qui permet la saisie, la sauvegarde et le chargement du code machine. Il doit interagir, en permanence, avec le module d'assemblage et ce à des fins fonctionnelles:
- valider la ligne saisie.
- vérifier la déclaration d'un label.
- indentation et formatage de la ligne.
- Validation du mnémonique.
- etc…
Inspiré à la fois de DAMS et de certaines fonctionnalités de VI.
Il faut aussi permettre de basculer vers d'autres outils (moniteur…).
TODO : définir comment. (ESC pour revenir à un menu principal ?)
L'éditeur est la partie qui gère la saisie et l'affichage du texte. Le codec interprète chaque ligne saisie, se charge de la stocker et de la regénérer à la demande.
Exemple de codec :
- null codec. Il stocke les lignes telles quelles. S'occupe simplement de la gestion mémoire.
- assembleur/désassembleur. Il vérifie la validité de la ligne au moment de la saisie, et stocke la version assemblée.
Aussi, l'éditeur n'a aucun texte à stocker. Typiquement, il ne gardera en mémoire que le texte actuellement affiché, pour des raisons de performance.
Implications
Il est possible les conversions du codec ne soit pas réversibles. Par exemple, en stockant uniquement l'opcode, l'assembleur est incapable de retrouver la casse d'origine. De même, il ne stocke pas l'espacement ("tabulation") utilisé.
Lors de la génération de la ligne, un choix arbitraire doit donc se voir appliqué (eg, tabulation 10 et opcode en majuscule).
Ce n'est pas une limitation mais au contraire une fonctionnalité :
- assure une totale cohérence de présentation
- auto-formatage à la volée (et de manière plus ingénieuse qu'en insérant naïvement des espaces)
- réduit le stockage : on se stocke pas les espaces !
Voir aussi le chapitre 'tabulation'.
Que faire si le codec est incapable d'encoder du texte (eg: un opcode invalide) ?
Pour ce cas de figure, chaque codec devra être capable de stocker la version littérale, tout en indiquant l'échec de l'encodage.
Notion de LIGNE
L'unité principale est la ligne de texte "complète", par opposition à une ligne à l'écran (une longue ligne complète peut se voir /wrappée/ sur plusieurs lignes à l'écran).
Sans précision, par "ligne" on entendra toujours la ligne complète.
La longueur d'une ligne de code se limite à 71 caractères.
V1: On limite le nombre de lignes supportées à 2^16-1 = 65535.
Numérotation des lignes
Il serait avantageux de réserver 6 caractères, dont 5 pour les numéros de lignes (en les justifiant à droite). Le caractère restant servira d'affichage sur le statut de la ligne (error, warning, etc…) (From madram: J'ai déjà une routine de conversion 16 bits->valeur décimale en ASCII. Rappelle-moi de te l'envoyer !)
Pas d'affichage en V1 !
voir Notes
Tabulations
Dans l'exemple de l'assembleur, on souhaite que des éléments de même type (eg : label, opcodes, commentaires) soient verticalement alignés.
Or, il est ridicule d'avoir soi-même à mettre en page à l'aide de la touche espace.
Mais en creusant plus loin, il est tout aussi ridicule de conserver les espaces générés par l'éditeur. TODO : expliquer pourquoi !
V1 : Alignement fixe décidé par codec. Le défaut précédant est évité dans la sauvegardé de la version encodée.
V2 : Le codec renvoi un charactère pour signifier la tabulation.
!!! A définir : concept d'indentation (incrément et décrement) plutôt que de tabulation !!!
Cf Python : quand on bout de code est déplacé, il faut recalculer les tabulations en fonction du niveau d'indentation. Pas fameux !
En C, ce sont les accolades qui délimitent les niveaux de hierarchies.
Le concept évoqué plus haut coïnciderait donc à des marqueurs ouvrants/fermants non visibles.
Ainsi la stucture
toto
plop
cafloutis
isegoria
dada
Serait codé :
toto
>plop
cafloutis
>isegoria
<<dada
L'absence de code devant 'cafloutis' signifiant qu'il est au même niveau que la ligne précédente. Simple commme coucou !
V2 : Alignement d'autres éléments.
Exemple1 : données
defb 1, 2, 3, 4, 5
defb 2, 5, 15, 9, -1
Autocomplétion
Repenser l'autocomplétion !
Automatique, non intrusive, réversible, exhaustive.
Automatique :
- La fonctionnalité est tellement pratique (même en programmation assembleur) qu'il semble curieux d'avoir à l'invoquer explicitement. Nous choisissons donc de proposer systématiquement les complétions possible. Couplé à la qualité "non-intrusive", nous obtenons le meilleur des deux mondes. On gagne en passant une touche : sans besoin d'appuyer sur "TAB" pour déclencher l'auto-complétion, la touche peut servir à un autre but (eg, valider l'auto-complétion).
Non intrusive :
Réversible
- Rien de plus chiant que d'avoir à effacer une floppée de caractère
Sélection automatique du premier choix et démocratie.
Sauvegarde
On propose deux types de sauvegardes :
- Sauvegarde du fichier encodé (eg, source précompilé. Cf Concepts:Codec).
- Un dump du texte ASCII (itérer sur toutes les lignes, mais sortir sur fichier plutôt qu'à l'écran).
Avantages respectifs (avec l'exemple du codec assembleur/désassembleur) :
- Taille réduite du fichier (jusqu'à 1/10 de l'équivalent texte)
- Compilation immédiate (car le gros de la compilation a été effectué lors de la saisie !)
- Format texte classique lisible par d'autres outils.
- Plus robuste en tant que back-up
Séparation
Une isolation totale n'est pas toujours souhaitable.
Exemple recherche token plutôt que texte. TODO : développer !
Dans le même ordre d'idée : le couper-coller se ferait idéalement de manière générique. Mais cela n'est pas efficace en pratique :
- cela implique de convertir en texte la partie coupée, et de la réinjecter en tant que texte (convertion opposée).
- si l'opération est faite en bloc, la partie texte peut dépasser la mémoire disponible, rendant l'opération impossible.
- si l'opération est faite itérativement (déplacement des lignes une à une par cette double conversion), on perd encore en efficacité (car il est plus rapide d'insérer un bloc de 100 lignes que 100 fois une ligne seule).
Visuel
L'éditeur sera découpé en plusieurs zones (numéros de ligne/labels/informations divers/saisi du code).
- Laisser plusieurs colonnes libres pour les signes (warning, error, program counter, …) et la numérotation des lignes.
Vue multiples
Si certaines fonctionnalités (édition multiple, écran d'aide) peuvent se contenter d'écrans distincts, on souhaite en revanche pouvoir afficher des informations supplémentaires sur un même écran, soit dans une fenêtre séparée, soit en incrustation.
Exemples :
- Status généraux (nom du fichier éditer, taux de satisfaction…)
- Canevas.
- Suggestions autocomplétion.
- Aperçu d'une routine appelée.
- Messages d'erreur de l'assembleur.
- Fenêtre pour débuggeur.
- Diff.
Scrolling
Tout déplacement hors de la page courante devrait être matérialisé par un scrolling dans le sens du déplacement, et idéalement de vitesse proportionnelle à la distance couverte. Cela fourni un indice très intuitif sur la nouvelle position dans le fichier par rapport à l'ancienne, aidant ainsi à mieux appréhender un gros fichier.
Cela ne signifie absolument pas qu'il faille afficher toutes les lignes séparant le point de départ de celui d'arrivé. Sur un exemple (écran de 7 lignes de haut), le passage de la ligne 1 à la ligne 100 pourra se faire de la manière suivante :
1 4 7 100
2 5 ---- 101
3 6 100 102
4 7 101 103
5 ---- 102 104
6 100 103 105
7 101 104 106
Où "----" symbolise une ligne spéciale (eg "********" sur toute la longueur) signifiant la discontinuité entre les deux parties de texte.
Pour le passage de la ligne 100 à la ligne 1 : rejouer le schéma à l'envers !
Commandes
Navigation/édition
Un seul mode de prévu : l'insertion !
- Si RETURN en milieu de ligne, on découpe la ligne (ie : ce qui est à droite du curseur passe à la ligne suivante).
Justification : on est en mode insertion, donc "Return" revient naturellement à insérer un "retour chariot".
C'est le comportement attendu d'un éditeur moderne.
TurboAssembler le permet également, mais via CONTROL-RETURN, ce qui est moins intuitif.
Du reste c'est fort pratique (permet de détacher un commentaire, ou de découper une série DEFB qui devient un peu trop longue).
Commande inverse : CONTROL-J (comme join).
Copier/Couper/Coller
Voir la section GestionBloc
Table des raccourcis clavier
Les raccourcis doivent être configurables :
- Satisfait les goûts et habitudes de chacun.
- Plus simple à programmer : stocker les correspondances "touche <-> nom de l'opération <-> adresse routine" dans une table plutôt que coder cela en dur.
- Bonus : la table pourra être affiché en guise d'aide.
Les raccourcis seront stockés dans une table avec leurs codes et leurs descriptifs. L'idée est donc de chercher la combinaison saisie dans une table telle que :
defb #f8
defw PageUp
defb #f9
defw PageDown
defb 0
defb "G"+#80 ;Marqueur debut chaine
defm o page up
PageUp
ld hl,topLine
ld a,(hl)
sub pgShift ; typiquement 23
jr nc,okpageup
xor a
okpageup
ld (hl),a
jp pgDisp ;reaffichage page à partir de nouvelle position (pas de gestion de scrolling ici).
defb "G"+#80 ;Marqueur debut chaine
defm o page down
PageDown
ld hl,bottomLine
ld a,(hl)
sub pgShift ; typiquement 23
jr nc,okpagedown
xor a
okpagedown
ld (hl),a
jp pgDisp ;reaffichage page à partir de nouvelle position (pas de gestion de scrolling ici).
Avant de tester si la combinaison saisie est dans la table, tester s'il s'agit d'un caractère normal, ie : compris entre 32 inclus (espace) et 126 (tilde).
Editeur - To Do(s)
[à compléter]