Cette série de programmes s'applique à trois calendriers différents.
Pour déterminer à quelle date du calendrier républicain correspond le 6 juin 1944, voici comment procéder. Tapez au choix :
6,061944 GRFR 6,061944 GRFR FRABR 6,061944 GRFR FRLONG
et vous apprenez qu'il s'agit d'octidi, 18 prairial CLII. Selon le cas, vous obtenez le résultat sous forme numérique 1520918, sous forme abrégée « 18 PRA 152 » ou sous forme longue, « Octidi 18 Prairial CLII ».
La conversion dans l'autre sens nécessite que vous connaissiez l'ordre des mois et que vous fassiez de tête la conversion en nombre. Ainsi, pour convertir le décadi 20 brumaire CXXVII, vous convertissez de tête « brumaire » en « 2 » puis vous tapez :
1270220 FRGR
et vous obtenez 11,111918, c'est-à-dire le 11 novembre 1918.
Il avait été question de décimaliser l'heure, avec 10 heures par jour, 100 minutes par heure et 100 secondes par minute. Cette partie de la réforme n'a jamais été mise en application. Néanmoins, quelques programmes vous permettent d'utiliser une heure décimale.
Les heures décimales sont exprimées comme les heures normales en H,MMSS. Pour convertir 19 h 45 en décimal, tapez au choix :
19,45 H24H10 PRH10 19,45 H24H10
et vous obtenez le nombre 8,2292 ou la chaîne "8:22:92".
Une dernière commande utile est MAINTENANT, qui donne à la fois le jour et l'heure courants, en utilisant le format long.
Si vous utilisez une carte SD, ou bien dans le cas d'un glisser-déposer sur un émulateur comme « emu48 », alors vous aurez besoin de SUBSG et de CVTCAR. Si vous utilisez le logiciel de connexion « conn4x », ces deux programmes sont inutiles, le logiciel de connexion prenant à sa charge les transformations.
Pour les fichiers en « 48 » et en « 50 », essayez d'abord ces quelques commandes. Tapez un nombre avec une partie décimale, comme « 1,5 ». Prenez la partie entière (IP) puis convertissez en chaîne (→STR). Si vous obtenez une chaîne sans virgule, ("1" dans l'exemple), utilisez les fichiers en 48. Si vous obtenez une chaîne avec une virgule ("1,") alors vous devrez utiliser les fichiers en « 50 ».
Les fichiers calfr-dbg-48 et calfr-dbg-50 comportent 16 entrées de menu, ce qui vous permet de consulter et d'exécuter séparément chaque programme. À l'inverse, les fichiers calfr-48 et calfr-50 ne comportent que les 10 entrées de menu indispensables, les autres programmes étant stockés dans des variables locales des 10 premiers programmes. Avec ces deux fichiers, le menu VAR est moins encombré.
Vous pouvez charger le fichier frf ou le laisser de côté. Si vous n'utilisez pas ce fichier, le répertoire contenant les programmes de conversion occupera moins de 2800 octets. Si vous incluez le fichier frf, cela ajoutera 4758 octets. Tout dépend de la place disponible sur votre calculatrice.
Tout d'abord, il faut positionner le drapeau -51, pour que le délimiteur de la partie décimale d'un nombre soit la virgule et non pas le point.
Chargez le fichier subsg sur la calculatrice, ce qui donne une chaîne dans la pile.
Passez en mode édition sur cette chaîne. Sur la deuxième ligne, remplacez la chaîne "\->" par une flèche → (shift-droit zéro). Quittez l'édition en sauvegardant votre modification.
Puis convertissez la chaîne en programme (PRG TYPE OBJ→ ou bien shift-gauche N E A sur la HP-50, ou H C A sur la HP-48).
Stockez le résultat dans SUBSG.
Chargez le fichier cvtcar sur la calculatrice, ce qui donne une chaîne dans la pile.
Puis convertissez la chaîne en programme (PRG TYPE OBJ→).
Stockez le résultat dans CVTCAR. Il n'y a pas besoin d'éditer la chaîne avant la conversion en programme.
Copiez le fichier calfr-xxx adapté à votre cas. Comme précédemment, cela donne une chaîne dans la pile.
Lancez CVTCAR pour modifier les trigrammes tels que "\->" en caractères spéciaux.
Puis convertissez la chaîne en objet (PRG TYPE OBJ→), cette fois un objet de type répertoire (DIR).
Stockez le résultat avec un nom à votre convenance.
Essayez la fonction MAINTENANT. Si vous obtenez un message « DDAYS Error: Invalid Date », c'est que vous avez oublié de sélectionner la virgule décimale. Supprimez le contenu du répertoire, puis le répertoire lui-même, sélectionnez la virgule décimale et recommencez la copie du fichier calfr-xxx.
Si vous voulez utiliser la variable FRF, chargez le fichier frf dans la pile, appliquez-lui CVTCAR, convertissez en objet (cette fois-ci, c'est un tableau) et stockez le résultat dans le nom FRF. Déplacez cette variable FRF dans le répertoire où se trouvent les programmes de conversion.
La conversion grégorien → RD s'effectue en deux ou trois étapes. Prenons par exemple une date au 13 septembre 1515 grégorien (une dizaine de jours avant la bataille de Marignan, qui a eu lieu les 13 et 14 septembre 1515 exprimés dans le calendrier julien). On se ramène à une date postérieure à 1600, par pas de 400 ans. Dans ce cas, cela donne 13 septembre 1915. Les trois étapes sont donc
À noter que l'un des avantages du 1er janvier 2001 est qu'il s'écrit de façon indépendante du flag -42. C'est 1,012001 aussi bien en JJ,MMAAAA qu'en MM,JJAAAA.
Cette fonction est une fonction indépendante dans le cas des fichiers calfr-dbg-nn, mais elle est intégrée à GRFR dans le cas des fichiers calfr-nn.
calfr-dbg-48, calfr-dbg-50
«
0 → GR RD « WHILE GR 100 * FP 10000 * 1600 < REPEAT ,0004 'GR' STO+ 146097 'RD' STO+ END 1,012001 GR DDAYS RD - JAN_2001 + »
calfr-dbg-48, calfr-dbg-50
»
C'est le même principe en trois étapes, sauf que l'on se ramène à une date en 2001 ou postérieure, on ne se contente pas de 1600. Cela pourrait être modifié. Il suffit de calculer le RD de la date seuil.
calfr-dbg-48, calfr-dbg-50
«
→ J « 0 WHILE J JAN_2001 ≤ REPEAT ,0004 + 146097 'J' STO+ END J JAN_2001 - 1,012001 SWAP DATE+ SWAP - »
calfr-dbg-48, calfr-dbg-50
»
C'est la valeur Rata Die du 1er janvier 2001. Elle est facile à calculer. Le Rata Die du 1er janvier 1 est 1. À cela, il faut ajouter 2000 ans, soit 2000 x 365 = 730000 jours, plus les 29 février. Il y a 500 années divisibles par 4, dont 15 ne sont pas bissextiles. Le nombre de 29 février est donc 485, d'où un total de 730486.
730486
Jusqu'en l'an 20, les années bissextiles sont calculées pour que le jour de l'an coïncide avec l'équinoxe d'automne. Les années bissextiles sont donc les années 3, 7, 11 et 15. À partir de l'an 20, on adopte la règle de Romme, purement arithmétique. C'est la même règle modulo 4, 100 et 400 que pour le calendrier grégorien.
En réalité, la fonction utilise le calcul de Romme avec les modulos pour toute la période, puis corrige le résultat pour les quelques cas où la règle de l'équinoxe donne un résultat différent.
« → A « 'A' DECR 4 / IP A 100 / IP - A 400 / IP + A 4000 / IP - IF { 3 7 11 15 } A IP POS 0 ≠ THEN 1 + END » »
Cette fonction est indépendante, y compris dans le cas des fichiers calfr-nn, car elle est appelée par RDFR (ou RDGR).
calfr-dbg-48, calfr-dbg-50
« → F
calfr-48, calfr-50
« FRBIS → F FRBIS
« F 100 MOD F 100 / IP 100 MOD 30 * + F 10000 / IP 'F' STO F 365 * + F FRBIS + 654019 + » »
On commence par se ramener au ``zéro" Vendémiaire de l'an I. Puis on calcule une estimation de l'année, en se basant sur une durée de 365 jours, ce qui donne donc une valeur plus élevée que la valeur réelle. Ensuite, on compare le 1er Vendémiaire de l'année calculée avec la date à traduire. Si la valeur calculée de l'année est trop forte, c'est-à-dire si le 1er Vendémiaire calculé est postérieur à la date à traduire, on recule d'un an. Ce test et ce recul sont dans une boucle, dans l'éventualité où l'estimation de l'année dépasserait la valeur véritable de 2, 3, voire plus (cela se produit au bout de 1 500 ans et des poussières, lorsque 365 jours bissextiles se sont accumulés et que l'on demande la conversion d'une date de la fin de l'année). Une fois le bon 1er Vendémiaire obtenu, on calcule le nombre de jours entre lui et la date à convertir, ce qui donne le nombre de mois et le nombre de jours dans le dernier mois.
calfr-dbg-48, calfr-dbg-50
«
0 → J D « J 10100 FRRD - 365 / IP 10000 * 10101 + 'D' STO WHILE D FRRD J > REPEAT D 10000 - 'D' STO END J D FRRD - DUP 30 / IP 100 * SWAP 30 MOD + D + »
calfr-dbg-48, calfr-dbg-50
»
Les deux conversions GR → RD → FR enchaînées
calfr-48, calfr-50
« GRRD RDFR »
calfr-dbg-48, calfr-dbg-50
« GRRD RDFR »
Les deux conversions FR → RD → GR enchaînées
calfr-48, calfr-50
« FRRD RDGR »
calfr-dbg-48, calfr-dbg-50
« FRRD RDGR »
Compte tenu de la taille, la variable FRF est facultative et l'affichage de la date tient compte du fait que FRF peut exister ou ne pas exister.
Chaque élément de la liste FRF est composé d'un chiffre puis d'un texte. Le chiffre permet de savoir si le texte commence par une voyelle ou une consonne et dans le second cas s'il est masculin ou féminin. Avec le cas spécial du pluriel pour le "jour des récompenses". Ce chiffre est traduit en un préfixe "jour du", "jour de la" etc.
{ "0raisin" "0safran" "1châtaigne" "1colchique" ... "1vertu" "0génie" "0travail" "2opinion" "3récompenses" "1révolution" }
calfr-dbg-48, calfr-dbg-50
« → D
calfr-48, calfr-50
« N10R → D N10R
« { "Primi" "Duo" "Tri" "Quarti" "Quinti" "Sexti" "Septi" "Octi" "Noni" "Déca" } D 1 - 10 MOD 1 + GET "di " + D 100 MOD + " " + { "Vendémiaire" "Brumaire" "Frimaire" "Nivôse" "Pluviôse" "Ventôse" "Germinal" "Floréal" "Prairial" "Messidor" "Thermidor" "Fructidor" "jour complémentaire" } D 100 / IP 100 MOD GET + " " + D 10000 / IP N10R + IF 'FRF' VTYPE 0 ≥ THEN FRF D 100 MOD D 100 / IP 100 MOD 1 - 30 * + GET DUP 1 1 SUB { " jour du " " jour de la " " jour de l'" " jour des " } SWAP NUM 47 - GET SWAP 2 30 SUB + + END » »
« → D « D 100 MOD " " + { "VND" "BRU" "FRI" "NIV" "PLU" "VNT" "GER" "FLO" "PRA" "MES" "THE" "FRU" "S-C" } D 100 / IP 100 MOD GET + " " + D 10000 / IP + » »
Sur les HP-50, lorsque l'on prend la partie entière d'un nombre réel, on n'obtient pas un nombre entier, on obtient un nombre réel avec une partie décimale nulle. Converti en chaîne, il conserve la virgule décimale. Pour éviter cela, il faut utiliser la fonction R→I. En revanche, sur les HP-48, la partie entière donne un nombre entier, qui n'a pas de virgule lorsqu'on le convertit en chaîne. Et sur les HP-48, la fonction R→I n'existe pas.
calfr-50, calfr-dbg-50
IP R→I
calfr-48, calfr-dbg-48
IP
Idem pour la fonction modulo.
calfr-50, calfr-dbg-50
MOD R→I
calfr-48, calfr-dbg-48
MOD
Routine qui affiche la date du jour et l'heure décimale.
« DATE GRFR FRLONG " " + TIME H24H10 PRH10 + 21 JUSTIF »
La décimalisation des minutes et secondes en fractions d'heures est une fonction standard du RPL. La décimalisation des heures-minutes-secondes s'en déduit ensuite avec une simple division.
« HMS→ 2,4 / »
La fonction inverse de H24H10 ci-dessus.
« 2,4 * →HMS »
Affichage de l'heure décimale, sachant que le nombre 8,0317 doit donner "8:03:17", pas "8:3:17" Cela peut servir également pour les heures habituelles, si vous acceptez d'avoir des heures à un seul chiffre jusqu'à "9:59:59", au lieu de "09:59:59".
« DUP IP ":" + SWAP FP 100 * DUP IP IF DUP 9 ≤ THEN "0" SWAP + END ":" + SWAP FP 100 * IP IF DUP 9 ≤ THEN "0" SWAP + END + + »
L'affichage traditionnel des années du calendrier républicain utilise les chiffres romains. Voici la routine de conversion.
calfr-48, calfr-50
«
NR → ←N NR
calfr-dbg-48, calfr-dbg-50
« → ←N
« IF ←N 4000 < THEN "" 1 3 START "M" 1000 NR NEXT "CM" 900 NR "D" 500 NR "CD" 400 NR 1 3 START "C" 100 NR NEXT "XC" 90 NR "L" 50 NR "XL" 40 NR 1 3 START "X" 10 NR NEXT "IX" 9 NR "V" 5 NR "IV" 4 NR 1 3 START "I" 1 NR NEXT ELSE ←N IP →STR END » »
Le sous-programme NR a pour but de transvaser une valeur du nombre indo-arabe ←N vers le nombre romain (niveau 3 de la pile), après s'être assuré toutefois que c'était justifié. Au niveau 2, on a la valeur à transvaser en romain, au niveau 1 la même valeur en indo-arabe.
« DUP IF ←N ≤ THEN '←N' SWAP STO- + ELSE DROP2 END »
Cette routine n'a rien à voir intrinsèquement avec le calendrier républicain. Elle permet d'assurer l'affichage d'une chaîne pour une largeur d'écran donnée, en remplaçant des espaces bien choisis par des sauts de ligne. Au niveau 2, mettre la chaîne, au niveau 1, renseigner la largeur de l'affichage.
I est l'indice du caractère courant, I10 l'indice du dernier saut de ligne rencontré et I32 l'indice du dernier espace rencontré. La condition pour remplacer un blanc par un saut de ligne s'interprête de la façon suivante :
1er cas, il y a au moins un espace parmi les LG premiers caractères de la ligne. En d'autres termes, l'expression I32 I10 > est vraie. La substitution s'effectue dès que I dépasse I10 LG +, c'est-à-dire dès que I I10 - LG > devient vraie.
2me cas, il y a plus de LG caractères d'affilée sans espace. Ce qui signifie que I I10 - LG > est vraie depuis un certain temps. On effectue alors le remplacement dès que l'on trouve un espace, c'est-à-dire lorsque I I32 == est vraie.
Et en factorisant, on obtient la condition apparaissant dans le programme. Lorsque l'on remplace un espace par un saut de ligne, ne pas oublier de mettre à jour I10. La valeur de I32 n'est plus tout-à-fait correcte, mais ce n'est pas très grave.
« 0 0 10 CHR → CH LG I10 I32 NL « 1 CH SIZE FOR I CH I I SUB CASE DUP " " == THEN I 'I32' STO DROP END NL == THEN I 'I10' STO END END IF I I10 - LG > I32 I10 > I I32 == OR AND THEN CH I32 NL REPL 'CH' STO I32 'I10' STO END NEXT CH » »
Cette fonction permet d'effectuer une substitution globale sur une chaîne pour remplacer une séquence avec un backslash "\->" par exemple, par le caractère correspondant →. En entrée, la chaîne traitée au niveau 3, la séquence sans le backslash au niveau 2 ("->" dans l'exemple ci-dessus) et le code ASCII au niveau 1 (141 dans l'exemple).
« 92 CHR ROT + SWAP CHR → ch av ap « WHILE ch av POS REPEAT ch 1 OVER av POS 1 - SUB ap + ch DUP av POS av SIZE + OVER SIZE SUB + 'ch' STO END ch » »
Cette fonction remplace la conversion automatique effectuée par Conn4x, en remplaçant les séquences avec un backslash par les caractères correspondants. De plus, elle enlève la première ligne %HPHP qui a l'air de déranger la calculatrice.
« "<)" 128 SUBSG "<-" 142 SUBSG "PI" 156 SUBSG "x-" 129 SUBSG "|v" 143 SUBSG "GW" 157 SUBSG ".V" 130 SUBSG "|^" 144 SUBSG "[]" 158 SUBSG "v/" 131 SUBSG "Gg" 145 SUBSG "oo" 159 SUBSG ".S" 132 SUBSG "Gd" 146 SUBSG "<<" 171 SUBSG "GS" 133 SUBSG "Ge" 147 SUBSG "^o" 176 SUBSG "|>" 134 SUBSG "Gn" 148 SUBSG "Gm" 181 SUBSG "pi" 135 SUBSG "Gh" 149 SUBSG ">>" 187 SUBSG ".d" 136 SUBSG "Gl" 150 SUBSG ".x" 215 SUBSG "<=" 137 SUBSG "Gr" 151 SUBSG "O/" 216 SUBSG ">=" 138 SUBSG "Gs" 152 SUBSG "Gb" 223 SUBSG "=/" 139 SUBSG "Gt" 153 SUBSG ":-" 247 SUBSG "Ga" 140 SUBSG "Gw" 154 SUBSG "->" 141 SUBSG "GD" 155 SUBSG IF DUP "%%HP" POS THEN DUP 10 CHR POS 1 + OVER SIZE SUB END »
Ce code est diffusé sous les mêmes termes que Perl, la licence GPL et la licence artistique. Voir le fichier LICENSE (en anglais) fourni dans le paquetage.