Calendriers
Conversion entre calendriers
Mode d'emploi
Installation
Quels fichiers faut-il installer
Installation avec une carte SD
Première étape
Copie de subsg
Copie de cvtcar
Copie de calfr-xxx
Copie de frf
Les programmes
GRRD - Conversion de grégorien en Rata Die
RDGR - Conversion de Rata Die en grégorien.
JAN_2001
FRBIS - Nombre de jours bissextiles précédant l'année N du calendrier républicain.
FRRD - Conversion de républicain en Rata Die
RDFR - Conversion de Rata Die en républicain
GRFR - Conversion de grégorien en républicain
FRGR - Conversion de républicain en grégorien
Affichage d'une date du calendrier républicain
FRLONG - Date en format long
FRABR - Date en format abrégé
IP - Partie entière
MOD - Modulo
MAINTENANT - Date du jour
Heure décimale
H24H10 - Conversion H24 → H10
H10H24 - Conversion H10 → H24
PRH10 - Affichage de l'heure décimale
Outils annexes
N10R - Nombres romains
NR
JUSTIF - Justification de chaîne
SUBSG - Substitution globale
CVTCAR - Conversion de caractères
Licence

Calendriers

Conversion entre calendriers

Cette série de programmes s'applique à trois calendriers différents.

Mode d'emploi

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.

Installation

Quels fichiers faut-il installer

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.

Installation avec une carte SD

Première étape

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.

Copie de subsg

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.

Copie de cvtcar

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.

Copie de calfr-xxx

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.

Copie de frf

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.

Les programmes

GRRD - Conversion de grégorien en Rata Die

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
»

RDGR - Conversion de Rata Die en grégorien.

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
»

JAN_2001

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

FRBIS - Nombre de jours bissextiles précédant l'année N du calendrier républicain.

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
  »
»

FRRD - Conversion de républicain en Rata Die

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 +
  »
»

RDFR - Conversion de Rata Die en républicain

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
»

GRFR - Conversion de grégorien en républicain

Les deux conversions GR → RD → FR enchaînées

calfr-48, calfr-50
« GRRD RDFR »
calfr-dbg-48, calfr-dbg-50
« GRRD RDFR »

FRGR - Conversion de républicain en grégorien

Les deux conversions FR → RD → GR enchaînées

calfr-48, calfr-50
« FRRD RDGR »
calfr-dbg-48, calfr-dbg-50
« FRRD RDGR »

Affichage d'une date du calendrier républicain

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"
}

FRLONG - Date en format long

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
  »
»

FRABR - Date en format abrégé

« → 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 +
  »
»

IP - Partie entière

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

MOD - Modulo

Idem pour la fonction modulo.

calfr-50, calfr-dbg-50
MOD R→I
calfr-48, calfr-dbg-48
MOD

MAINTENANT - Date du jour

Routine qui affiche la date du jour et l'heure décimale.

« DATE GRFR FRLONG
" " + TIME H24H10 PRH10 + 21 JUSTIF »

Heure décimale

H24H10 - Conversion H24 → H10

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 /  »

H10H24 - Conversion H10 → H24

La fonction inverse de H24H10 ci-dessus.

« 2,4 * →HMS »

PRH10 - Affichage de l'heure décimale

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
  + +
»

Outils annexes

N10R - Nombres romains

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
  »
»

NR

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
»

JUSTIF - Justification de chaîne

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
  »
»

SUBSG - Substitution globale

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
  »
»

CVTCAR - Conversion de caractères

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
»

Licence

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.