- Corrigé bogue #1 avec mot \. En fait le bogue était dans l'entête _HEADER COMMA,1,^/","/. Il y avait un \ avant la virgule dans la chaîne de caractères.
- Corrigé bogue #2 en modifiant SCALETOMAX du fichier float.asm pour tenir compte d'une mantisse nulle.
- Découvert 2 bogues
- les commentaires \ gèlent sur la ligne de commande.
- la saisie d'un mot non définie ne génère pas d'erreur mais laisse un entier double sur la pile.
-
commit 22:23
-
Continué travail d'optimisation de float.asm.
performance test
283 msec for 1000 F*
763 msec for 1000 F/
112 msec for 1000 F+
117 msec for 1000 F-
-
commit 16:13
-
Optimisation de F/.
performance test
242 msec for 1000 F*
508 msec for 1000 F/
176 msec for 1000 F+
226 msec for 1000 F-
- Débute révision de float.asm.
performance test
325 msec for 1000 F*
593 msec for 1000 F/
259 msec for 1000 F+
310 msec for 1000 F-
-
commit 13:35
-
Modifié routine parse_digits dans double.asm.
-
Commit 22:32
-
Amélioration de la performance de la routine UD/MOD.
performance
******** Performance test ******
9msec for 1000 double additions.
9msec for 1000 double substactions.
83msec for 1000 double muliplications.
227msec for 1000 double divisions.
-
Modifié le comportement de la division, maintenant le reste est simplement tronqué vers 0.
-
Travail sur module double.asm pour améliorer la performance. Actuel:
******** Performance test ******
9msec for 1000 double additions.
9msec for 1000 double substactions.
82msec for 1000 double muliplications.
340msec for 1000 double divisions.
-
commit 15:54 hre
-
Amélioration de double-test.f.
performance
******** Performance test ******
9msec for 1000 double additions.
9msec for 1000 double substactions.
82msec for 1000 double muliplications.
340msec for 1000 double divisions.
ok
-
commit 11:04
-
Travail d'optimisation de float.asm à faire. Performance actuelle:
performance test
325 msec for 1000 F*
754 msec for 1000 F/
258 msec for 1000 F+
309 msec for 1000 F-
ok
-
Modifié float24-test.f pour vérifier l'égalité entre le résultat obtenu et celui attendu. Indique un échec si différent.
-
Modifié F. dans float24.asm pour affichier un 'E' à la fin du nombre lorsqu'il n'y a pas d'exposant.
-
Modifié D. dans double.asm pour afficher '.' à la fin du nombre.
-
Modifié F. dans float.asm pour afficher 'E' à la fin du nombre même lorsqu'il n'y a pas d'exposant.
-
Amélioration de float-test.f
-
Débuté travail sur module float.asm.
-
commit 21:21 hre
-
Mise à jour référence_eforth.md.
-
Après consultation du standard Forth les mots F>S tronque la fraction sans arrondie. Modification faite dans float24.asm.
-
commit 12:10 hre
-
Travail sur référence_eforth.md.
-
Débogué et modifié F..
-
Retravaillé float24-test.f.
-
commit 22:15
-
bogue: Corrigé.
-32767. 2dup f- f. -3.2767E-32765
- bogue: le zéro ne devrait pas être là. Bogue corrigé.
2e23 F>S .S
0 -32768 <sp ok
- bogue, seulement après un démarrage. Problème corrigé.
stm8eForth version 4.00
float24 library, version 1.00
LICENSE GPL V3
Copyright Jacques Deschenes, 2021, 2022
on NUCLEO-8S207K8
32767. .S F.
32767 0 <sp 3.27670E4 ok
�
stm8eForth version 4.00
float24 library, version 1.00
LICENSE GPL V3
Copyright Jacques Deschenes, 2021, 2022
on NUCLEO-8S207K8
232767. f. 2.32771.00E5 ok
-
commit 12:02 hre
-
Supprimer E. et modifié F. pour imprimer les débordements comme -INF ou +INF.
-
Modifié routine SET_FPSW, maintenant modifié le float en cas de débordement pour -INF ou +INF.
-
Modifié F/ afin d'avorter lorsqu'une division par 0 est tentée.
performance test
104 msec 3.1416 2.51 f*, 1000 times.
105 msec 32.767 327.67 f*, 1000 times.
94 msec 3.1416 2.51 f/, 1000 times.
73 msec 3.1416 414.2 f+, 1000 times.
79 msec 3.1416 51.43 f-, 1000 times.
- Retour sur float24.asm, enccore une idée pour améliorer la performance de F*.
performance test
106 msec 3.1416 2.51 f*, 1000 times.
105 msec 32.767 327.67 f*, 1000 times.
93 msec 3.1416 2.51 f/, 1000 times.
75 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
- bogue dans NUMBER? du fichier stm8ef.asm
-9 -9?
-8 -8?
-7 -7?
-6 -6?
-5 -5?
-4 -4?
-3 -3?
-2 -2?
-1 ok
-10 ok
-11 ok
Bogue corrigé le problème était dans la routine NSIGN. La vérification pour cnt==0 au début référençait la mauvaise cellule sur la pile.
-
débuté travail sur float.asm
-
commit 20:53
-
Retravaillé F* pour améliorer la performance. Gain de 7 msec sur la version précédente.
performance test
108 msec 3.1416 2.51 f*, 1000 times.
108 msec 32.767 327.67 f*, 1000 times.
94 msec 3.1416 2.51 f/, 1000 times.
74 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
-
Écriture de la section float du fichier référence_eforth.md.
-
bogue dans FLOAT? exposant incorrect. Corrigée, était causé par NUMBER? accumulant les digits au delà de 32767, résultant en un entier négatif passé à FLOAT?. Cependant la correction est faite au début de FLOAT? car il est accepté que NUMBER? déborde dans le négatif.
32768. e. 3.277E3 ok
32768. .s
3277 0 <sp ok
32768e0 .s
3277 0 <sp ok
f. 3277. ok
-
commit 14:44 hre
-
Encore amélioré la performance de F/.
performance test
115 msec 3.1416 2.51 f*, 1000 times.
115 msec 32.767 327.67 f*, 1000 times.
93 msec 3.1416 2.51 f/, 1000 times.
74 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
ok
-
commit 11:33 hre
-
Modification à F/ pour améliorer la performance.
performance test
114 msec 3.1416 2.51 f*, 1000 times.
114 msec 32.767 327.67 f*, 1000 times.
205 msec 3.1416 2.51 f/, 1000 times.
74 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
ok
- commit 20:55 hre correction de plusieurs bogues dans float24.asm.
performance test
114 msec 3.1416 2.51 f*, 1000 times.
115 msec 32.767 327.67 f*, 1000 times.
321 msec 3.1416 2.51 f/, 1000 times.
74 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
ok
-
Corrigé bogue dans S>F et F>S
-
commit 16:07 hre
-
Corrigé routine LOG10 et F* test float24-test.f passé avec succès. Améliorationde la vitesse d'exécution de F*.
performance test
114 msec 3.1416 2.51 f*, 1000 times.
115 msec 32.767 327.67 f*, 1000 times.
180 msec 3.1416 2.51 f/, 1000 times.
74 msec 3.1416 414.2 f+, 1000 times.
80 msec 3.1416 51.43 f-, 1000 times.
-
commit 22:03 hre
-
Retravaillé SCALETOM dans float24.asm. Encore place à l'amélioration.
-
Modifier et déboguer F! et F@ dans float24.asm.
-
Renommé F@ FAR@ et FC@ FARC@ dans flash.asm
-
commit 16:49 hre
-
Réécriture de FLOAT?_ dans float24.asm.
-
commit 22:26 hre.
-
Modification à F* pour améliorer la performance.
-
À faire: Améliorer performance de F* et F/.
-
commit 21:43
-
bogue précédent corrigé.
-
bogue dans FLOAT? de float24.asm:
3276722. .s
130 32767 2 <sp ok
-
Modifié onHandledInterrupt dans le fichier stm8ef.asm. Maintenant ne fait qu'un IRET au lieu de réinitialiser le MCU.
-
Ajouter un gestionnaire d'interruption sur réception UART. Ajout de 2 variables système.
- RX_CHAR où est déposé le caractère reçu.
- CHAR_RDY Indicateur booléen pour indiquer qu'un caractère est en attente.
- CTRL+X Réinitialise le MCU
-
Retravaillé F*, F/ et F>S.
-
Déboguer float24.asm.
-
commit 22:02
-
bogues:
9e6 9e0 f+ f. 9000000. ok
9e5 9e0 f+ f. 900000. ok
9e4 9. f+ f. 90000. ok ??? devrait-être 90001.
9e3 9. f+ f. 9009. ok
9e4 90. f+ f. 90090. ok
9e4 9. f+ f. 90000. ok
9e4 9. f- f. -90000. ok ????
-
Ajouter et déboguer routine max_mantissa dans float24-test.f. FLOAT? appel cette routine pour maximisé la valeur de la mantisse.
-
commit 16:50
-
float24-test.f passé avec succès.
-
Débogage de NUMBER? et FLOAT?.
- Travail sur NUMBER? du fichier stm8ef.asm. Après réflexion j'ai décidé de modifier la stratégie de conversion de chaîne en entier simple, Sîtôt qu'il y a débordement, parse_digits met le bit OVF la variable UFPSW à 1 et cesse d'accmuler les digits. Mais NUMBER? va continuer à compter les digits. Si float24.asm est installé le cumul et le nombre de digits sont transmis à FLOAT?.
-
Travail sur float24.asm, bogues à corriger.
-
commit 16:00 hre
-
Mise à jour des readme.md
-
Travail sur float24.asm
-
commit 11:50 hre
-
test float-test.f passé avec succès.
-
Déboguer double.asm et float.asm.
-
Bogue dans CHECK_BASE_SIGN
-
Travail sur FLOAT? du fichier float.asm
-
commit
-
Corrigé bogue dans NUMBER? du fichier double.asm.
-
Réécriture de NUMBER? dans stm8ef.asm et double.asm.
-
Création des sous-routines CHECK_BASE_SIGN, ACCEPT_CHAR et NEXT_CHAR dans stm8ef.asm.
-
Réécriture de NUMBER? dans fichier double.asm.
-
Ajout de sous-routine UDU8* dans double.asm plus rapide que UDS*. Cette routine est 2 fois plus rapide. Cette routine est appellée par NUMBER? au lieu de UDS*.
: t1 msec 1000 for 232.32 10 udu8* 2drop next msec swap - . ; ok
t1 11 ok
t1 11 ok
t1 11 ok
t1 11 ok
t1 11 ok
: t2 msec 1000 for 232.32 10 uds* 2drop next msec swap - . ; ok
t2 24 ok
t2 24 ok
t2 24 ok
t2 24 ok
t2 24 ok
-
Nouvelle perspective: NUMBER? devrait analyser tous les nombres comme des entiers doubles mais ne conserver les bits 32..16 que s'il y a un point dans la chaîne. S'il y a une librairie float d'installée et que la chaîne n'est pas terminée au dernier digit rencontré appeller FLOAT? pour compléter l'analyse.
-
Réécriture de FLOAT? dans float24.asm.
-
bogues:
- écrire en mémoire flash|eeprom gèle.
- problème avec ABORT lorsque mot pas trouvé, seulement si le mot n'est pas le premier sur la ligne. Ne se produit que si la librairie float24.asm est incluse.
d. D.? eeprom d. �I���?
-
commit 13:42
-
Modification motS HI, PRINT_VERSION, COPYRIGHT, FVER.
-
Corrigé bogue dans COLD réglant l'issue #1
-
Travail sur float.asm et float24.asm
-
Gestion de la variable FPSW dans float.asm et float24.asm à retraivaller.
-
commit tag V4.0R1D2
-
Mise à jour de référence_eforth.pdf
-
Ajout du flag COMPO aux mots $" et ." .
commit et tag.
-
Création du readme_en.md
-
commit
-
Création des documents docs/référence_eforth.pdf et tutoriel.pdf
-
Réécriture du readme.md.
-
Compilation de toutes les cibles.
-
Modifié fihciers inc/config.inc et inc/stm8s_disco.inc.
-
Modifié fichier .gitignore
-
Construit le projet pour la carte NUCLEO_8S207K8 avec succès et flasher la carte.
-
Modifié configuration pour ajouter carte NUCLEO-8S207K8.
- Ajout du fichier inc/stm8s207.inc
- Ajout du fichier inc/nucleo_8s207.inc
- Modifié fichier inc/config.inc
- Ajout du fichier nucleo_8s207.mk
-
Ajout du mot COMIPE-ONLY.
-
Application de l'indicateur COMPO à tous les mots contrôle de flux, i.e. IF,THEN,ELSE,WHILE,UNTIL, etc.
-
Travail sur float24.asm.
-
Réorganaisation du code, transfert de la routine parse_digits dans stm8ef.asm pour réduire le dédboublement de code.
-
Changement à FLOAT?. Un saisie de float dont la mantisse est trop grande ne génère plus un ABAORT" mais float fait simplement appel à SCALE>M pour réajuster la mantisse dans les limites. Un exposant hors limite ne génère plus un ABORT" mais l'erreur est signalée dans FPSW par l'overflow flag.
- Corrigé bogue dans SET-FPSW du fichier float24.asm.
-
Travail sur float24-test.f.
-
Travail sur F/ dans float24.asm
3.1416 5.13 f/ f. 0.6123 ok
L'arrondi à la décimale la plus proche devrait donné 0.6124. Ajout de l'arrondie vers la décimale la plus proche pour corriger cette erreur.
-
Corrigé bogue dans dof24lit runtime subroutine.
-
Corrigé bogue dans F. point décimal manquant lorsque exposant positif.
- Travail sur les comparateurs dans float24.asm
- Ajout de MPLUS dans float24.asm. Compensation des débordements de mantisse lors de l'addition.
-
Travail sur float24.asm.
-
Modification à E. dans float.asm pour supprimer l'espace entre le E et l'exposant.
-
Ajout de SET-FPSW.
-
Recodé NUMBER? dans fichier stm8ef.asm.
-
Corrigé bogue dans $COMPILE fichier stm8ef.asm.
-
Corrigé bogue dans 2LITERAL fichier double.asm.
-
Débute travrail sur une nouvelle lilbrarie float24.asm. Celle-ci de dépendera pas de double.asm. Le système sera donc plus compacte et les calculs sur en virgules flotttantes plus rapide. L'écart dynamique sera le même que pour les float32 mais avec une perte de précision sur la mantisse. qui sera de 4.5 i.e log(32767) décimales au lieu de 6.9, i.e. log(8388608).
-
double.asm et float.asm passe les tests double-test.f et float-test.f.
- Optimisation de F/ par factorisation d'un UMUL10 spécialisé.
-
Corrigé bogue et travail d'optimisation de F/.
-
ajout de performance à float-test.f
-
Corrigé bogue dans /MOD et D/MOD qui ne donnait pas la bonne réponse lorsque le reste était nul.
-
Optimisation supplémentaire de UD/MOD.
-
Corrigé bogue dans parse_digits, fichier double.asm.
-
Optimisation de UD/MOD.
-
Optimisation du code D* et D/MOD.
-
Débogué D/MOD.
-
Optimisation dans stm8ef.asm.
- La compilation des **CALL BRAN address ** a été remplacée par la compilation d'un JP address, gain de 8 cycles machines.
-
Revenue au code original du 2021-02-22 pour UM/MOD. Puis modifié pour utilisé USLMOD lorsque udh==0.
-
Recodé +!, CMOVE, FILL.
-
Optimization au niveau du compilateur dans le mot CALL, , une vérification est faite pour l'adresse cible du CALL si l'adresse cible est DROP ou 2DROP au lieu de compiler CALL DROP ou CALL 2DROP l'instruction ADDW X,#2 ou ADDW X,#4 est compilée. Cette optimization sauve 8 cycles machines sur 10 par appel. Ces 2 mots étants utilisés souvent cette optimisation est significative et ne requière pas plus d'octets mémoire qu'un CALL.
-
Travail d'optimisation dans stm8ef.asm.
-
Remplacer CALL DROP par la macro _DROP et CALL DDROP par la macro _DDROP. Sauve 8 cycles par appel.
-
Ajout de l'entête dictionnaire à FALSE et recodage.
-
Recodé S>D.
-
Recodé -.
-
Recodé =, U< ,<, U>, >, MAX, MIN
-
Ajout de U/MOD dans stm8ef.asm et recodé UM/MOD, /MOD.
-
Travail d'optimisation dans double.asm.
- Recodé routine interne nsign.
- Recodé DABS.
- Recodé D0=.
-
Ajout de DBL-VER dans double.asm.
-
Ajout de FLOAT-VER dans float.asm.
-
Travail sur F-ALIGN.
-
Corrigé bogue dans UD/MOD
-
Corrigé bogue dans F/
-
Corrigé bogue dans F+
-
Travail sur F-ALIGN.
-
Ajout des constante booléennes TRUE et FALSE dans stm8ef.asm.
-
Modifié DS* pour factoriser UDS*.
-
Retravaillé F-ALIGN pour réduire le risque de débordement en répartissant l'alignement entre les 2 mantisses. La mantisse dont l'exposant est le plus grand est d'abord augmentée jusqu'à ce que l'écart des exposants soit comblé ou que le maximum supporté par un entier double positif soit atteint avant qu'une autre multiplication par 10 produise un débordement. Cette valeur en hexadécmal est 0xCCCCCCCD. Si ce n'est pas suffisant pour combler l'écart entre les 2 exposants. La plus petite mantissse est divisée par 10 jusqu'à ce que l'écart soit comblé ou que la mantisse atteigne zéro. L'algorithme est donc le suivant:
-
Travail sur float-test.f
-
Ajour du mot FNEGATE et FABS dans float.asm
-
Modifié FZE, FNE et FOV pour qu'ils retourne 0||-1.
-
Corrigé SFZ et SFN, ME>F.
-
Corrigé bogue dans E..
-
Corrigé bogue dans F+ et F-.
-
Travail sur double-test.f
-
Corrigé bogue dans D>.
-
Suppression du mot DCMP
-
Déboguer F0=.
-
Remplacé les LITERAL 0|1 par des CALL ZERO|ONE .
-
Modifié F/ dans float.asm pour tiré avantage des mots NR@ et NR!.
-
Déboguer F/.
-
Factorité DD/MOD pour extraire UD/MOD.
-
Ajout de D/.
-
Ajout de F>, F<, F=, F0= , F0<
-
Modifié format des floats.
-
Modifié SFN, SFZ , SFV , F>ME, ME>F.
-
Renommé 2<ROT <2ROT dans double.asm.
-
Supprimé 2NEGATE du fichier double.asm était en doublon avec DNEGATE du fichier stm8ef.asm.
-
Ajout des mots suivant pour l'accès aux variables locales sur rstack.
-
LOCAL pour réservé de l'espace pour les variables locales.
-
NRDROP Pour libérer de l'espace occupé par les variables locales sur rstack.
-
NR! pour déposer une valeur dans une variable locale.
-
NR@ pour lire la valeur d'une variable locale.
-
-
Enlevé du dictionnaire les mots $,n, $,"
-
Continué travail de réédition de stm8ef.asm. (complété).
-
Ajout du mot J
-
Modifié code de !.
-
Modifié code de R>.
-
Modifié code de SWAP.
-
Modifié code de 2!.
-
Modifié code de 2@.
-
Enlevé DO$. $"|, ."| du dictionnaire, utilisé seulement par le compilateur.
-
Éditer le fichier stm8_ef.asm pour utiliser la macro _HEADER en remplacement des champs détaillés.
-
Renommé @EXPONENT en F>ME.
-
Renommé !EXPONENT en ME>F.
-
révision et test.
-
Travail sur F/.
-
Travail sur F*.
- Travail sur F*.
-
Ajout de SCALE>, D>F, F>D.
-
Test et débogage.
- Modifié Makefile.
-
Ajout de D/.
-
Travail sur double.asm.
-
Ajout de 2R@,2LITERAL,2VARIABLE,
-
Renommé DCONST au standard Forth 2012 -> 2CONSTANT.
-
Supprimé du dictionnaire les runtime DOLIT, DOCONST et DO-DCONST.
-
Changer le caractère identifiant les litéraux double de '!' à '#'.
- Ajout de vocabulaire à double.asm. D>, D<, D0=, D0<, 2>R, 2R>, 2SWAP, 2ROT.
-
Création du fichier double.asm pour séparer le vocabulaire de traitement des entiers doubles (32 bits) du vocabulaire de traitement des nombres à virgules flottantes. Ajouter option WANT_DOUBLE dans config.inc.
-
Continuer travail sur le vocabulaire des entiers doubles.
-
Ajout de H. pour afficher un entier en hexadécimal dans stm8ef.asm.
-
Déplacé <ROT de float.asm vers stm8eforth.asm
- Travail sur float.asm
Ajout de <ROT, DABS, DSIGN, D#S, F., E., 2SWAP, LSCALE, RSCALE, DD*, F*
-
Ajout du mot > dans stm8ef.asm.
-
Rendre le vocabulaire insensible à la casse. Ajouté option CASE_SENSE dans config.inc.
-
Librairie float.asm créée. Ajout de l'option WANT_FLOAT dans config.inc.
-
Modification du fichier Makefile pour construite le projet et flash il faut maintenant faire la commande
picatout:~/github/stm8_eforth$ make -fnucleo.mk
- Début du travail pour ajouter une librairie en virgule flottante de 32 bits.
- Corrigé bogue autre bogue dans UM/MOD . Le test de débordement de la division acceptait un dividende dont la partie haute était égale au diviseur. hors une telle situation conduit à la perte du bit le plus significatif du quotient. Par exempel 0x20000 2 UM/MOD donnait 0 0 au lieu de 0 0x10000.
-
Modification au readme
-
Modification aux makefile. clear_eevars n'était pas appliqué avant de flasher une nouvelle version . .PHONY: clear_eevars ajouté. Ajouté aussi la règle erase et FLASH_SIZE dans tous les fichiers *.mk.
-
Testé (umod.txt)(https://github.com/TG9541/stm8ef/files/5926192/umMod.txt) correction pour UM/MOD mais ce n'est pas OK. test HEX 2400 F4 A2C3 UM/MOD .S un rest erronné, rapporte 2243 alors que ça devrait-être A243.
stm8eForth v3.0 on NUCLEO-8S208RB
HEX 2400 F4 A2C3 UM/MOD .S PRESET
2243 17F <sp ok
Le bogue est maintenant corrigé. J'ai remplacé l'instruction SRAW X par l'instruction RRCW X à la suite de l'étiquette MSMMb de la patch fournie par TG9541 ci-haut.
- Modification à config.inc et à stm8ef.asm.
-
Ajout du sous module SendFile
-
Modifié referencde.md pour ajouter documention pour FC-XON et FC-XOFF
-
Ajout des mots FC-XON et FC-XOFF. Envoie les caractères XON/XOFF au terminal pour le contrôle de flux logiciel. Pendant la programmation de la mémoire FLASH|EEPROM le MCU est stoppé donc si le terminal envoie des caractères à ce moment ils seront perdus. Donc Un signal XOFF est envoyé au terminal avant le début de l'opération d'écriture et un caractère XON est envoyé lorsque l'opération est terminée.
-
Ajout d'une file de réception pour les carctères reçu du terminal. Il s'agit d'une file circulaire de 8 caractères. Donc si le terminal transmet plus de 8 caractères consécutifs avant que le MCU lise ces acractères il y a perte de caractères en réception. En conjonction avec FC-XON et FC-XOFF cette file réduit les risque de perte de données en réception lors de la transmission d'un fichier source Forth au MCU.
- Révision tutoriel.md
- Réorganiser le système make pour tenir compte des 2 plateformes. Dans le fichier config.inc il ajouter les variables NUCLEO et DISCOVERY en fonction de la cible choisie.
-
Réorganisation du manuel de référence en sections séparées pour chaque module et création d'un index de sections.
-
Travail sur le module ctable.asm complété.
-
Ajout de CALLOT dans le module ctable.asm. pour réserver de l'espace dans l'espace code pour une table de constantes.
-
j'ai changé d'idée, maintenir 2 versions séparée de stm8_eForth l'une pour la carte NUCLEO et l'autre pour la discovery complique les choses. à l'exception du UART choisi pour la communication avec le terminal et la quantité de mémoire disponible on peut utiliser le même système. L'idée de séparer les 2 versions étaient de réduire la taille de la version DISCOVERY. Mais le gain n'est pas considérable. Le fichier config.inc var permettre de sélectionner les options et la cible désirée.
-
Ajout de WR-WORD dans flash.asm
-
Ajout de CTINIT, WTINIT dans ctable.asm.
-
Ajout de [N]? Comme outil d'initialisation d'une table de contantes. Utilisé par CTINIT et WTINIT.
Session 2
-
Ajout de DCONST et sa partie runtime DO_DCONST pour créer des constantes en entier double.
-
Ajout de PTR+ ( u -- ) dans flash.asm pour incrémenter FPTR d'une valeur arbitraire u.
-
Ajout de EE-READ et EE-CREAD. Pour la lecture du mot et d'un octet pointé par FPTR avec incrémentation du pointer.
-
Débuter travail sur module ctable.asm pour faciliter la création de tables de constantes dans la mémoire FLASH ou EEPROM.
Session 1
- Modification du mot hi qui maintenant identifie la carte sur laquelle est installé le système.
hi
stm8eForth v3.0 for NUCLEO-8S208RB
ok
\ après connection du terminal à l'autre carte.
hi
stm8eForth v3.0 for STM8S-DISCOVERY
ok
-
Élimination du mot EXIT devenu inutile. Suite à la modification du compilateur qui cmpile directement une instruction machine RET.
-
Mise à jour du manuel de référence
-
Réécriture de ROW>BUF dans flash_disco.asm.
-
Renommé les mots suivants dans les 2 versions pour être plus conforme au style de nomenclature Forth.
-
RAM2EE renommé RAM>EE
-
ROW2BUF renommé ROW>BUF
-
BUF2ROW renommé BUF>ROW
-
-
Version Discovery Suprimer les mots FADR, F@ et FC@ qui ne sont plus nécessaire car le stm8s105c6 n'a pas de mémoire étendue
-
Version Discovery Modifier tous les mots qui utilisait des adresses double pour utilisation d'adresses simple.
-
Création du dossier discovery et copie des fichiers stm8ef.asm flash.asm math_const.asm dans le nouveau dossier.
Objet: Débuter adaptation de stm8ef pour la carte discovery. Étant donnée que la version 3.0 est très étendue par rapport à la version discovery 2.1 originale. Une réadaptation en sens inverse de NUCLEO vers DISOVERY est pertinante. -
Renommé le fichier stm8ef.asm stm8ef-disco.asm pour éviter toute confusion entre les 2 versions.
Session 2
-
Élimination du mot EXIT. ; compile le code machine RET au lieu de compiler un CALL EXIT. Plus compacte et plus rapide.
Session 1
Session 2
- Nettoyage du fichier stm8ef.asm pour supprimer les directives .if PICATOUT_MOD.
Session 1
-
Ajout de SEED ( u1 -- ) Pour initialiser le générateur pseudo aléatoire.
-
Ajout de RANDOM ( u1 -- u2 ) Fourni un entier positif aliéatoire compris dans l'intervalle {0..u1-1}. L'Algorithme utilisé est celui décris sur ce lien.
-
Renommé LN2 LN2S puisque cette division ne résulte pas en la valeur du log naturel de 2 mais à sa valeur divisée par 1.6384 (i.e. 2¹⁴/10000). S pour scaling.
-
Renommé LOG2 LOG2S puisque cette division ne résulte pas en la valeur du log base 10 de 2 mais à sa valeur divisée par 16.384 (i.e. 2¹⁴/1000). S pour scaling.
-
Travail sur le manuel de référence.
-
Continuer rédaction du tutoriel.
- Continuer rédaction du tutoriel.
-
Continuer rédaction du tutoriel.
-
Problème avec la compilation en mémoire FLASH réglé. Était du au fait que j'avais inclus le fichier const_ratio.asm après flash.asm. Hors l'étiquette app_space étant à la fin du fichier flash.asm n'était plus à la fin de la section code. J'ai déplacé cette étiquette dans le ficher principal stm8ef.asm pour m'assurer qu'elle sera toujours à la fin quel que soit l'ordre des .include.
-
Découvert bogue, la compilation en mémoire FLASH ne fonctionne plus les pointeurs ne semble pas être mis à jour correcte. À voir.
-
Travail sur tutoriel.
-
Corrigé information concernant les mots LN2 et LOG2 dans const_ratio.asm
-
Continuer rédaction de tutoriel.md
-
Débogué DNEGATE incw y n'affecte pas le carry flag.
-
Ajout de S>D ( n -- d ) conversion d'un entier simple en entier double.
-
Renommé la double constante SQRT12 en 12RT2. Il ne s'agit pas de la racine carré de 12 mais plutôt de la 12ième racine de 2.
Session 2
-
Corrigé bogue dans UM/MOD.
-
Ajout du fichier const_ratio.asm qui définie des constantes arithmétiques par un rapport de 2 entiers. Ces constantes sont définies pour êtres utilisées avec les opérateurs */ et */MOD.
exemple d'utilisation d'une constante. Génère les notes de la gamme tempéré pour l'octave 4.
: TEMPERED 11 FOR CR DUP . SQRT12 DUP >R */MOD SWAP R> 2/ / + NEXT DROP ; ok
523 TEMPERED
523
554
587
622
659
698
740
784
831
880
932
987 ok
Session 1
-
Corrigé bogue dans VARIABLE
-
Corrigé bogue dans FORGET
-
Ajouté PI ( -- 355 113 ) Empile les 2 constante 355 et 113 qui peuvent être utilisées avec */ pour les calculs trigonométriques sur fractions à décimales fixes.
-
Découvert bogue. Lorsqu'on compile dans la RAM pour ensuite passé dans la compilation en mémoire flash les variables systèmes relié à la compilation ne sont plus valide.
-
Corrigé bogue dans ALLOT
-
Travail sur le manule de référence.
-
Modifié PICK dont le comportement n'était pas conforme au standard Forth 201x.
-
Modifié .S nécessaire suite à la modification de PICK.
-
Écriture du manuel de référence de stm8_eForth version 3.0
SESSION 2
-
Alors que ce matin je pensais en avoir terminé avec cette version 3.0 je me suis mis à réfléchir à la possibilité de pouvoir choisir entre la mémoire FLASH et la mémoire RAM pour la compilation des mots. Ça peut en effet être intéressant pour faire de simple test de compiler dans la mémoire RAM. En réfléchissant à cette question je me suis rendu compte qu'il s'agissait d'une modification simple qui peut tenir en une variable système supplémentaire et 2 mots.
-
NOTE: Les mots qui sont compilés en mode TO-RAM ne peuvent pas être transférés en mémoire FLASH ultérieurement. A moins de faire un REBOOT suivit de TO-FLASH et de copier chaque mot individuellement en utilisant un copier-coller à partir du texte dans le terminal. Puisqu'il n'y a pas d'éditeur il peut être utile d'activer le log to file dans le terminal.
-
TFLASH Variable système qui lorsqu'elle a la valeur -1 dirige la compilation vers la mémoire FLASH. Si elle est à zéro les définitions sont gardées en mémoire RAM.
-
TO-FLASH ( -- ) Sélectionne la mémoire FLASH comme destination de la compilation .
-
TO-RAM ( -- ) Sélectionne la mémoire RAM comme destination de la compilation.
SESSION 1
À FAIRE
- Écrire le manuel de référence
FAIT
-
Mis à jour le numéro de version a 3.0.
-
Ajout de AUTORUN <string> ( -- ) pour sélectionner l'application qui s'exécute au démarrage.
-
Ajout du mot SET-ISP ( n1 n2 -- ) Ajustement de la priorité d'interruption. n1 est le niveau {1..3} et n2 est le vecteur {0..29}
-
Ajout de LSHIFT ( n1 n2 -- n1<<n2 )
-
Ajout de RSHIFT ( n1 n2 -- n1>>n2 )
-
Modifié priotiré d'interruption du TIM4 à niveau 3.
-
Ajout du mot EI ( -- ) Pour activer les interruptions.
-
Ajout du mot DI ( -- ) Pour désactiver les interruptions.
-
Ajout de BYE ( -- ) Place me MCU en mode HALT. le MCU redémarre par un reset ou une interruption externe.
-
Ajout du mot FORGET ( -- <string> ) Réinitialise les pointeurs au mot qui précède le mot passé en argument. Si des routines d'interruptions ont étées définies après ce mot les vecteurs sont réinitialisés à la valeur par défaut. Si des variables ont étées définies après ce mot l'espace RAM doit-être aussi libérée.
À FAIRE
-
Test interruptions
-
Ajouter mot FORGET
-
Ajouter mot AUOTRUN
FAIT
-
Ajout du mot I: pour débuter la compilation d'une routine d'interruption.
-
Ajout du mot I; pour conclure la défintion d'une routine d'interruption.
-
Ajout du mot IFMOVE pour tenir compte de la différence entre le transfert d'une interruption et d'un mot dans le dictionnaire.
À FAIRE
-
Support pour les interruptions. Puisque les mots colon sont des listes d'appel de sous-routine une routine de service d'interruption peut-être écrite en Forth. Cependant ces définitions ne doivent pas appaître dans le dictionnaire et doivent se terminer par une instruction machine IRET. Donc il faut créer des mots spéciaux pour la compilation des routines de service d'interruption. le mot I: servira à introduire une telle définition et le mot I; servira à la conclure. Aucun nom ne devra être donner à la routine. Son adresse d'exécution sera simplement retournée sur la pile. le mot SET-IVEC servira à initialiser un vecteur d'interruption avec cette adresse.
-
Créer le mot AUTORUN pour définir l'application qui s'exécutera automatiquement à la mise sous tension de la carte NUCLEO. Cette adresse est inscrite dans la variable EEPROM APP_RUN. Par défaut c'est l'adresse d'exécution du mot hi qui est dans cette variable.
FAIT
-
Modifié code du mot COMPI et de tous les mots qui faisait un appel à COMPI. Cette modfiication était nécessaire pour régler le bogue FOR-AFT-THEN-NEXT.
-
Ajout du mot I ( -- n ) Ce mot empile la valeur du compteur de boucle FOR-NEXT.
-
test des boucles de contrôle OK.
-
Séparer mot FMOVE en 2 partie. FMOVE fait seulement la copie et le nouveau mot UPDAT-PTR ajuste les pointers. Modification en prévision du support aux interruption.
À faire
* réparer FOR AFT THEN NEXT
* tester les autres structures de contrôles et déboguer au besoin.
-
Pour que les mots puissent être copiés de la RAM à la FLASH il faut que les branchements soient ajustés à la valeur de la destation finale dans la mémoire FLASH. Dans ce but j'ai créé une variable système appellée OFFSET qui est la différence entre CP et VP calculé au début de la compilation. À chaque adresse de saut on ajoute la valeur de cet OFFSET. Ceci requiert une modfication de toutes les structures de contrôles.
-
les motes , et C, compilent dans l'espace des variables. Pour compiler dans l'espace code il faut utiliser les mots EE, et EEC,.
-
Le mot VP ( -- a) retourne le pointeur des variables libres (mémoire RAM).
-
le mot CP ( -- a ) retourne le pointeur du code libre (mémoire flash).
-
le mot HERE ( -- a ) retourne l'adresse des variables en RAM. et non la valeur de CP.
-
Modifié le mot ALLOT ( n -- ) réserve de la mémoire RAM et met à jour VP et APP_VP.
-
Changer le nom de plusieurs variables
-
Modifier le code des mots COLD et VARIABLE
-
créer des mots qui retournes les adresses double des variables EEPROM
- EEP-LAST ( -- ud ) Retourne le pointeur APP_LAST, last word in dictionary
- EEP-RUN ( -- ud ) Retourne le pointeur APP_RUN, autorun entry point.
- EEP-CP ( -- ud ) Retourne le pointeur APP_CP , code pointer free space
- EEP-VP ( -- ud ) Retourne le pointeur APP_VP , variable free space
-
Ajout de mots pour mettre à jour les variables système en EEPROM
- UPDAT-LAST ( -- ) met à jour APP_LAST à partir de LAST
- UPDAT-RUN ( a -- ) met à jour APP_RUN avec la valeur a
- UPDAT-CP ( -- ) met à jour APP_CP avec la valeur de CP
- UPDAT-VP ( -- ) met à jour la valeur de APP_VP avec la valeurde VP
-
Ajout de RAM2EE ( ud a u -- ) pour écrire u octets dans la mémoire flash|eeprom.
-
Ajout de FADDR ( a -- ud ) étant a à 32 bits par 0.
-
Ajout de RFREE ( a -- u ) retourne le nombre d'octets libre en supposant que a est une adresse flash i.e. u=a%128
-
Continue travail sur FMOVE.
-
Travail sur FMOVE ( -- ) transfert la dernière définition vers la mémoire flash.
-
Ajout de BUF2ROW ( a ud -- ) To write ROWBUFF to FLASH.
-
Ajout de FCP ( -- a ) Retourne le pointeur de la variable système UFCP qui est le pointeur vers le début de la mémoire flash libre. CP retourne le pointer vers la RAM libre.
-
Ajout de EE, ( w -- ) pour compiler un entier dans la mémoire flash pointée par FCP.
-
Ajout de EEC, ( c -- ) pour compiler un octet dans la mémoire flash pointée par FCP.
-
Ajout du tampon ROWBUFF de 128 octets pour les transactions entre la mémoire FLASH et RAM.
-
Ajout de ROW2BUF ( ud -- ) Copie un bloc FLASH ou EEPROM dans le tampon ROWBUFF.
-
Modification de VARIABLE pour que l'adresse de la variable soit un pointeur. Cette indirection est nécessaire pour permettre de compiler le code des variables dans la mémoire FLASH tout en gardant le data en RAM.
-
Modification de COLD pour initialiser APP_RUN avec le ca de hi. Lorsqu'une application sera compilée en FLASH son ca de démarrage remplacera celui de hi dans APP_RUN.
À faire
- compléter les modifications pour transférer les définitions compilées vers la mémoire flash. La compilation se fera d'abord en RAM pour ensuite copier le code dans la FLASH et finalement mettre à jour les variables CNTXT,APP_HERE, APP_LAST, UCP et CP s'il s'agit d'une variable.
Session 2
-
Ajout de la variable EEPROM VAR_HERE pour conserver la valeur de CP qui maintenant ne servira que comme pointeur de données variables.
-
Modification de COLD pour synchroniser CP avec VAR_HERE.
-
Ajout de SET-OPT ( c n -- ) Modifie la valeur d'un registre OPT c nouvelle valeur et n numéro de l'option {1..7}.
-
Ajout du mot REBOOT ( -- ) pour réinitialiser le MCU.
Session 1
-
NOTE:
-
SET-IVEC et RST-IVEC ne sont pas prêt pour utilisation il faut d'abord ajouter les mots pour compiler les interruptions. Quelque chose comme :I au lieu de : et I; au lieu de ;. Ceci est nécessaire car les routines d'interruptions se termine par instruction machine iret au lieu de ret et elles ne doivent pas apparaître dans le dictionnaire. Le compilateur devra retourné le ca de la routine et SET-IVEC devra être appellée avec cette valeur.
-
J'ai décidé que le compilateur compilerait dans la mémoire FLASH et que la RAM serait réservée seulement pour les variables. Il faudra donc maintenir un pointer VAR_HERE et un pointer FLASH_HERE.
-
le mot MARKER sera ajouter.
-
-
Ajout de SET-IVEC ( ud n -- ) Initialize le vecteur d'interruption n avec l'adresse de l'ISR ud. Le vecteur 0 est TLI. Le vecteur 24 est FLASH.
-
Ajout de RST-IVEC ( n -- ) Réinitialise un vecteur d'interruption à sa valeur par défault. Le gestionnaire par défaut est NonHandledInterrupt qui a pour effet de réinitialiser le MCU.
-
Ajout du mot PRISTINE ( -- ) Ce mot ramène le système à son état initial avant toute modification par l'utilisateur.
-
Ajout de CONSTANT (n -- ; <string>) curieusement absent du vocabulaire original.
USAGE: n CONSTANT nom -
Ajout de WR-ROW ( a ud -- ) copie 128 octets de la mémoire RAM vers la mémoire FLASH ou EEPROM.
USAGE: addr_buffer addr_row WR-ROW. -
Je viens de réaliser qu'il y a un problème pour le transfert des définitions vers la mémoire FLASH en ce qui conserne les variables. Tel que le système a été conçu au départ ce n'est tout simplement pas possible car le champ paramètre est à la suite du champ code. Il faudrait modifier le système pour que le champ paramètre demeure en RAM, Ayayaya! Une autre solution est de créer l'application en RAM, de la sauvegarder en FLASH mais avant de l'exécuter de la recopier en RAM. Ayayaya! Encore une autre solution est de modifier le compilateur pour que le dictionnaire ainsi que le code soit en FLASH et les données variables en RAM. Ça demande réflexion! je ne veux pas avoir à recréer le système au complet.
-
Lorsque les mots composés par l'utilisateur seront sauvegardés en mémoire FLASH il faudra que la variable système LAST soit mise à jour. La nouvelle valeur de LAST sera sauvegardée dans l'EEPROM à adresse 0x4000. J'ai modifié le mot COLD pour qu'il compare la valeur de la variable LAST avec la valeur dans l'EEPROM appellée APP_LAST. La plus grande valeur est celle qui est utilisée et copiée dans la variable système LAST.
-
Ajout des variables systèmes suivantes dans l'EEPROM:
- APP_LAST LIEN du dernier mot de l'application utilisateur
- APP_RUN adresse de démarrage de l'application utilisateur
- APP_HERE adresse du pointeur HERE pour l'application en mémoire FLASH.
-
Lorsqu'un nouveau mot sera ajouté par l'utilisateur dans la mémoire FLASH il faudra mettre à jour la valeur de APP_LAST et APP_HERE dans l'EEPROM.
-
Il faut que je réfléchisse à la meilleure manière de procéder pour la compilation des mots en mémoire FLASH.
- toujours compiler en RAM et transférer ensuite en FLASH. Dans ce cas il faudra ajuster les liens lors de la copie.
- Compiler directement en FLASH évite l'ajustement des liens met rends plus complexe la compilation qui devra utiliser des opérations d'écritures différente selon la destination.
-
Ajout de PAUSE ( u -- ) suspend l'exécution pour u millisecondes.
-
Ajout de TIMER ( u -- ) minuterire à rebours non bloquante. u millisecondes.
-
Ajout de TIMEOUT? ( -- 0|-1 ) vérifie l'état de la minuterie à rebours.
-
mots ajouter à date:
-
ROW-ERASE ( ud -- ) \ Efface un bloc de 128 octets dans la mémoire FLASH ou EEPROM. ud entier double addresse à l'intérieur du bloc.
-
UNLKFL ( -- ) \ déverrouille l'écriture dans la mémoire flash.
-
UNLKEE ( -- ) \ déverrouille l'écriture dans la mémoire EEPROM
-
EEC! ( c ud -- ) \ écriture d'un octet dans la mémoire FLASH ou EEPROM.
-
EE! ( n ud -- ) \ écriture d'un entier dans la mémoire FLASH ou EEPROM.
-
EEPROM ( -- ud ) \ retourne l'adresse de début de l'EEPROM en entier double.
-
FP! ( ud -- ) \ initialise le pointeur long utilisé par l'écriture FLASH avec l'adresse entier double ud.
-
FC@ ( ud -- ) \ lecture d'un octet dans la mémoire étendue.
-
F@ ( ud -- ) \ lecture d'un entier dans la mémoire étendue.
-
UNLOCK ( -- ) \ déverrouille FLASH or EEPROM selon l'adresse dans farptr
-
LOCK ( -- ) \ verrouille l'accès en écriture au mémoires FLASH et EEPROM
-
INC-FPTR ( -- ) \ incremente farptr à l'adresse de l'octet suivant.
-
WR-BYTE ( c - ) \ écris 1 octet *farptr et incremente farptr.
-
ROW-ERASE ( ud -- ) Efface le bloc de 128 octets contentant l'adresse ud.
-
* **TO-FLASH** Pour compiler dans la mémoire flash.
* **TO-RAM** Pour compiler dans la mémoire RAM. (par defaut)
* **WR-BLK** Pour écrire un bloc de 128 octets dans la mémoire FLASH ou EEPROM.
* **UPDATE** pour mettre à jour la variable LAST dans l'EEPROM.
* **AUTORUN** Pour définir une applicaction qui s'exécute automatiquement au démarrage.
- Ajout des mots EEC! UNLKFL UNLKEE FC@ F@ EEPROM FP! pour écriture/lecture des mémoires EEPROM/OPTION/FLASH.
-
Quelque mots définis comme 'colon definition' était simple a réécrire en assembleur.
-
Modification d'autre routines déjà en assembleurs.
-
découvert bogue: après l'invocation du mot "\" erreur 'underflow' . Cause: pour SDAS le le backslash ne doit pas être escapé dans les chaînes. i.e le nom entre guillemet devait-être "\" et non "\\". SDAS inscrivait une chaîne de 2 caractères. Comme le code ASCII de ce caractère est 0x5C et qu'en assembleur ça correspond à l'instruction INCW X le pointeur du data stack n'était plus aligné. Difficile à déboguer.
-
Il y avait un 'DECW Y' dans DEPTH qui n'était pas justifié.
-
découvert bogue dans RP! l'adresse sur le data stack n'était pas jetée.
-
Remplacé source clock HSE 8Mhz par HSI 16Mhz . À cette fréquence eForth exécute 1 000 000 de boucles FOR NEXT vides en 1.7 seconde.
-
La majorité des mots dans le dictionnaires sont en MAJUSCULES, certains sont en minuscules et d'autres un mélange des deux. Je préfèrerais qu'ils soient tous dans la même forme.
-
Certains mots sont identiques sauf que l'un est en majuscules et l'autre en minuscules. Exemple; next et NEXT ainsi que abort" et ABORT". Ça peut porter à confusion!