1

Bonjour à tous !

Je cherche comment, en C, obtenir la date, sur une TI89 HW2 (ou trois, si ça marche), OS 209 ou plus.

La librairie time.h, utilisable en C "normal" ne semble pas exister;
La fonction Basic getDTStr() n'est pas accessible, que ce soit via bascmd.h,basfunc.h ou basop.h.
La doc de TIGCC mentionne l'existence d'une constante nommée GETDATE, mais je ne comprends pas son usage dans un programme.

Mes recherches n'ont rien donné de plus.

Merci d'avance

Kamiakzee

2

Il semble que la doc de TIGCC n'est pas très à jour de ce côté là.
Essaie de trouver le [google]"AMS 2.07 programmer's kit" de Extended[/google].
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Il y a une macro pour obtenir la date sous forme de string dans TIGCC, regarde de plus près la doc tongue

__DATE__

This macro expands to a string constant that describes the date on which the preprocessor is being run. The string constant contains eleven characters and looks like "Feb 12 1996". If the day of the month is less than 10, it is padded with a space on the left.
Julien C.
Débutant :P

4

Non, il s'agit de la date de compilation.regarde de plus près la doc :p
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

Oops c'est vrai preprocessor j'avais mal lu roll

J'avais lu "processor" en pensant au CPU.
Julien C.
Débutant :P

6


Documentation sur les nouvelles ROM Calls de l'AMS 2.07  v0.1
-------------------------------------------------------

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Documentation créée par Olivier Armand (ExtendeD) - <ola.e-ml@wanadoo.fr>
Je ne peux garantir l'exactitude des informations rassemblées ici.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


DateAndTime_SetDlg	Function (ROM Call 0x5F1)
==================

void DateAndTime_SetDlg (void);

Affiche la fenêtre de setup de l'horloge, et laisse l'utilisateur modifier les réglages.
Ne fait rien sur HW1.

---------------------------------------------------------------------------------------------


DateAndTime_Set		Function (ROM Call 0x5F2)
===============

void DateAndTime_Set (USHORT year, USHORT month, USHORT day, USHORT hour, USHORT minute, \
			    USHORT second);

Modifie la date de la calc, celle qui est affichée dans le Desktop (la rom call modifie
en fait la variable interne OneSecondTimer, voir la documentation de Timer_Start() et ClockOn
pour plus d'informations).

Les arguments doivent se trouver dans ces zones :
1997 <= year <= 2132
1 <= month <= 12
1 <= day <= 28,29,30 ou 31, en fonction du mois (et de l'année pour le mois de février)
0 <= hour <= 23
0 <= minute <= 59
0 <= second <= 59

Si l'un des arguments ne se trouve pas dans la bonne zone, une 'Argument error' est lancée
par ER_throwVar (erreur numéro 0x28).

La date et l'heure donnés en arguments correspondent à la date DANS LE FUSEAU HORAIRE CHOISI.
(voir TimeZone_Set() )

Comme la variable interne OneSecondTimer représente l'heure et la date dans le fuseau horaire
GMT + 0, la variable interne TimeZone est prise en compte avant la modification de 
OneSecondTimer. Voici les opérations effectuées, c'est purement technique, ne les lisez pas si
ça ne vous intéresse pas.

Args représente le temps donné par les arguments et converti en secondes.
Si TimeZone*60 <= 0 : OneSecondTimer devient Args-(TimeZone*60)
Si TimeZone*60 > 0  :
	Si TimeZone*60<=Args : OneSecondTimer devient Args-(TimeZone*60)
	Si TimeZone*60>Args  : OneSecondTimer devient 0

---------------------------------------------------------------------------------------------

DateAndTime_Get		Function (ROM Call 0x5F3)
===============

void DateAndTime_Get (USHORT* year, USHORT* month, USHORT* day, USHORT* hour, USHORT* minute, \
			    USHORT* second);

Retourne la date correspondant à celle affichée dans le Desktop.
Effectue l'opération inverse de DateAndTime_Set : OneSecondTimer est lu, TimeZone est pris
en compte, et les modifications inverses de celles de DateAndTime_Get sont effectuées avec
TimeZone, puis toutes les variables données par référence en arguments sont remplies.

La date et l'heure renvoyés sont celles DANS LE FUSEAU HORAIRE CHOISI.

Exemple :
 unsigned short year, month, day, hour, minute, second;
 DateAndTime_Get (&year, &month, &day, &hour, &minute, &second);

---------------------------------------------------------------------------------------------

DayOfTheWeek		Function (ROM Call 0x5F4)
============

USHORT DayOfTheWeek (USHORT year, USHORT month, USHORT day);

Retourne le numéro du jour de la semaine (Lundi, Mardi, etc.) correspondant à la date
dont les éléments sont donnés en argument.
Attention, 1 représente Dimanche, 2 représente Lundi, 3 représente Mardi, etc.

---------------------------------------------------------------------------------------------

ClockOn			Function (ROM Call 0x5F5)
======= 

void ClockOn (void);

Active l'horloge sur HW2. L'heure s'affichera dans le Desktop.
Le bit 2 du port 0x600015 est armé, et l'auto-int 3 est appelée toutes les secondes. Elle
incrémentera à chaque appel la variable interne OneSecondTimer.
Lorsque la calc est éteinte, elle est réveillée toutes les secondes par l'AI3, et est
rééteinte si ON n'a pas été appuyé et si rien n'a été câblé sur le port I/O.

Ne fait rien sur HW1 (l'horloge n'a pas été implémentée sur HW1 car l'AI3 n'a pas une fréquence
de 1Hz).

L'horloge est activée par l'AMS au reset.

---------------------------------------------------------------------------------------------

ClockOff		Function (ROM Call 0x5F6)
========

void ClockOff (void);

Désactive l'horloge. Il y aura un blanc au niveau de l'horloge sur le Desktop.
Le bit 2 du port 0x600015 est désarmé.
Lorsque la calc sera éteinte, elle ne sera pas rallumée toutes les secondes par l'AI3,
qui n'est maintenant plus du tout appelé.

---------------------------------------------------------------------------------------------

IsClockOn		Function (ROM Call 0x5F7)
=========

BOOL IsClockOn (void);

Retourne TRUE si l'horloge est activée, FALSE si elle ne l'est pas.

avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

7

---------------------------------------------------------------------------------------------

Timer_Start 		Function (ROM Call 0x5F8)
===========

unsigned long Timer_Start (void);

Retourne la variable interne OneSecondTimer. (située à 0x5C0E sur V200 AMS 2.07).
Cette variable est incrémentée toutes les secondes par l'AI3 si l'horloge a été activée par
ClockOn().

OneSecondTimer représente le nombre de secondes qui se sont écoulées depuis le premier
janvier 1997 à 0 heures 0 min 0 s, heure GMT.
Cette variable est utilisée par les rom calls pour calculer ou modifier l'heure affichée
dans le Desktop.

Remarque sur l'initialisation de cette variable au reset : cette initialisation n'est pas
toujours effectuée, pour que l'AMS puisse récupérer la date et l'heure après un reset.
Reportez vous aux remarques dans la documentation de DateFormat_Get(), c'est exactement
le même principe. La seule différence est que la variable TimerStart est initialisée à 0 au
lieu de 1, lorsque cette initialisation est effectuée.

---------------------------------------------------------------------------------------------

Timer_Value 		Function (ROM Call 0x5F9)
===========

unsigned long Timer_Value (unsigned long TimerStartingValue);

Retourne OneSecondTimer-TimerStartingValue (voir la documentation de Timer_Start() et
ClockOn() pour plus d'informations sur la variable interne OneSecondTimer).

Le couplage des rom calls Timer_Start et Timer_Value permet de compter combien de secondes
se sont écoulées entre deux instants. Par exemple :

 unsigned long ini_timer = TimerStart();
 ngetchx();
 clrscr();
 printf ("Vous avez attendu %li secondes", Timer_Value(ini_timer));

---------------------------------------------------------------------------------------------

TimeZone_Get 		Function (ROM Call 0x5FA)
============

signed short TimeZone_Get (void);

Retourne la variable interne TimeZone, située à 0x5C12 sur V200 AMS 2.07.
Voir la documentation de TimeZone_Set() pour plus d'informations sur cette variable.

---------------------------------------------------------------------------------------------

TimeZone_Set 		Function (ROM Call 0x5FB)
============

void TimeZone_set (signed short NewTimeZone);

Remplace le contenu de la variable interne TimeZone par la nouvelle valeur.

TimeZone_Set() et Time_Zone_Get() permettent d'utiliser l'ensemble des rom calls liées à
l'horloge dans un autre fuseau horaire.
Cette possibilité ne semble pas encore être utilisée par le Desktop de l'AMS 2.07.

TimeZone représente un temps compté en minutes.
Pour passer au fuseau horaire GMT +01:00, il suffit de faire TimeZone_Set (60).
La rom call DateAndTime_Get() retournera maintenant l'heure dans le nouveau fuseau horaire.
NewTimeZone est une valeur signée, pour que l'on puisse utiliser des fuseaux horaires
négatifs.

La variable interne TimeZone a donc uniquement pour rôle d'effectuer un décalage de l'
heure donnée en arguments ou renvoyée par les différentes ROM calls.

Remarque sur l'initialisation de cette variable au reset : cette initialisation n'est pas
toujours effectuée, pour que l'AMS puisse récupérer le décalage horaire qui avait été
réglé avant le reset.
Reportez vous aux remarques dans la documentation de  DateFormat_Get() c'est exactement
le même principe. La seule différence est que la variable TimeZone est initialisée à 0 au
lieu de 1, lorsque cette initialisation est effectuée.

---------------------------------------------------------------------------------------------

DateFormat_Get		Function (ROM Call 0x5FC)
==============

unsigned char DateFormat_Get (void);

Retourne la variable interne DateFormat, située à 0x5C15 sur V200 AMS 2.07. Cette
variable peut prendre toutes les valeurs comprises entre 1 et 8.

DateFormat_Get() permet d'obtenir le format d'affichage de la date utilisé par l'AMS dans
le Desktop. C'est le format qui a été choisi dans le fenêtre de configuration de
l'horloge.

Voici la liste des différents formats possibles (D pour day, M pour month, Y pour year) :

# Format  /  Affichage
   1         MM/DD/YY
   2         DD/MM/YY
   3         MM.DD.YY
   4         DD.MM.YY
   5         YY.MM.DD
   6         MM-DD-YY
   7         DD-MM-YY
   8         YY-MM-DD

Au reset, l'AMS vérifie si une variable interne (un long mot) proche de la variable
TimeFormat contient toujours un certain magic number (0x2AAAAAAA pour la V200 AMS 2.07).
Si c'est le cas, alors l'AMS considère que la variable DateFormat n'a pas été corrompue,
et qu'il peut utiliser la valeur qu'elle contient sans avoir besoin de l'initialiser.
Ceci permet à l'AMS de retrouver le format de date utilisé avant le reset, pour que
l'utilisateur n'ait pas à re-régler ce format.
Si le contenu de la variable de vérification ne correspond pas au magic number,
DateFormat est initialisée à 1.

Si à un moment ou un autre la variable DateFormat se trouve corrompue (par un programme
ASM par exemple), et contient alors une valeur qui ne se trouve pas dans la zone 1-8,
l'ensemble des routines qui utilisent cette variable (DateAndTime_SetDlg() et la fonction
interne d'affichage de la date sur le Desktop par exemple) considèrent que cette variable
contient 1 (mais elles laissent DateFormat avec son contenu corrompu).

---------------------------------------------------------------------------------------------

DateFormat_Set		Function (ROM Call 0x5FD)
==============

void DateFormat_Set (unsigned char NewDateFormat);

Remplace la variable interne DateFormat par NewDateFormat.

DateFormat_Set() permet de choisir le format d'affichage de la date utilisé par l'AMS
dans le Desktop. Voir DateFormat_Get() pour obtenir la liste des différents formats de
date possibles.
Le nouveau format sera bien sûr le format sélectionné dans la fenêtre de configuration
de l'horloge la prochaine fois qu'elle sera affichée.

Si NewDateFormat n'est pas compris entre 1 et 8 inclus, une erreur 'Argument error'
est lancée avec ER_throwVar() (erreur numéro 0x28).

---------------------------------------------------------------------------------------------

DateStr			Function (ROM Call 0x5FE)
=======

void DateStr (USHORT year, USHORT month, USHORT day, unsigned char DateFormat, char *str);

Copie au bout de la chaîne 'str' une chaîne de caractères représentant la date dont
les éléments sont donnés en argument. Le format DateFormat est utilisé pour créer
cette chaîne (voir DateFormat_Set() pour obtenir les formats possibles).

Il est important de lire la documentation sur la fonction TimeStr() (qui effectue
le même travail mais sur l'heure et non la date) pour avoir des information sur le
fonctionnement de la copie, sur la taille du buffer de destination, et pour obtenir un
exemple d'utilisation.
(notez simplement que la taille minimale du buffer qui suit la chaîne donnée en
argument est ici de 9 octets au lieu de 12, lorsque les arguments sont valables).

---------------------------------------------------------------------------------------------

TimeFormat_Get		Function (ROM Call 0x5FF)
==============

unsigned char TimeFormat_Get (void);

Retourne la variable interne TimeFormat, située à 0x5C14 sur V200 AMS 2.07. Cette
variable peut prendre soit la valeur 12, soit la valeur 24.

TimeFormat_Get() permet d'obtenir le format d'affichage de l'heure utilisé par l'AMS
dans le Desktop. C'est le format qui a été choisi dans le fenêtre de configuration de
l'horloge.

Si TimeFormat = 24, l'affichage de l'heure dans le Desktop s'effectue au format 24 heures,
si TimeFormat = 12, au format 12 heures, suivi de AM ou PM.

Au reset, l'AMS vérifie si une variable interne (un long mot) proche de la variable
TimeFormat contient toujours un certain magic number (0x2AAAAAAA pour la V200 AMS 2.07).
Si c'est le cas, alors l'AMS considère que la variable TimeFormat n'a pas été corrompue,
et qu'il peut utiliser la valeur qu'elle contient sans avoir besoin de l'initialiser.
Ceci permet à l'AMS de retrouver le format d'heure utilisé avant le reset, pour que
l'utilisateur n'ait pas à re-régler ce format.
Si le contenu de la variable de vérification ne correspond pas au magic number,
TimeFormat est initialisée à 12.

Si à un moment ou un autre la variable TimeFormat se trouve corrompue (par un programme
ASM par exemple), et contient alors une valeur qui n'est ni 12 ni 24, l'ensemble des
routines qui utilisent cette variable (DateAndTime_SetDlg() et la fonction interne d'
affichage de l'heure sur le Desktop par exemple) considèrent que cette variable contient
12 (mais elles laissent TimeFormat avec son contenu corrompu).

---------------------------------------------------------------------------------------------

TimeFormat_Set		Function (ROM Call 0x600)
==============

void TimeFormat_Set (unsigned char NewTimeFormat);

Remplace la variable interne TimeFormat par NewTimeFormat.

TimeFormat_Set() permet de choisir le format d'affichage de l'heure utilisé par l'AMS
dans le Desktop. Voir TimeFormat_Get() pour obtenir la liste des différents formats
d'heure possibles.
Le nouveau format sera bien sûr le format sélectionné dans la fenêtre de configuration
de l'horloge la prochaine fois qu'elle sera affichée.

Si TimeFormat n'est ni 12, ni 24, une erreur 'Argument error' est lancée avec
ER_throwVar() (erreur numéro 0x28).

---------------------------------------------------------------------------------------------

TimeStr 		Function (ROM Call 0x601)
=======

void TimeStr (USHORT hour, USHORT minute, USHORT second, BOOL PrintSecond, \
              unsigned char TimeFormat, char* str);

Copie au bout de la chaîne 'str' une chaîne de caractères représentant le temps dont
les éléments sont donnés en argument. Le format TimeFormat est utilisé pour créer
cette chaîne (voir TimeFormat_Set() pour obtenir les formats possibles).
Si PrintSecond = FALSE, l'argument 'second' est ignoré est la chaîne créée ne contient
pas les secondes. Si PrintSecond = TRUE, les secondes sont écrites.

'str' est un pointeur sur une chaîne, suivie d'un buffer pouvant recevoir jusqu'à 12
caractères en comptant le zéro final de la chaîne existant déjà (cette limite minimale
peut être plus petite en fonction du format d'affichage utilisé et de 'PrintSecond').
Le zéro final de la chaîne obtenue est écrit par la rom call, la chaîne générée est
donc directement utilisable.

En fait, la rom call effectue un strcat() avec la chaîne existant déjà et la chaîne
générée contenant l'heure. Si on ne veut pas placer de chaîne avant la chaîne
contenant l'heure, il suffit que le premier caractère du buffer (celui pointé par
'str') soit un caractère nul. Ce caractère nul est INDISPENSABLE.

Attention, la fonction n'effectue pas les tests de validité des arguments (pour
savoir si ce sont des valeurs possibles). Il est très bien possible de passer 101
secondes en argument, (ou même -40), la chaîne créée contiendra alors ":101".
La taille minimale du buffer donnée plus haut n'est valable que si les arguments
sont dans les zones légales du système international de mesure du temps :P


Exemple :

char String[7+12]="Il est "; // 7 est la longueur de la chaîne sans le zero final
_main() {
 String[7] = 0; //on remet le 0 final, si le programme est appelé plus d'une fois
 TimeStr (10, 20, 0, FALSE, 12, String);
 clrscr();
 printf ("%s", String);
 ngetchx();
}


---------------------------------------------------------------------------------------------

Olivier Armand - Le 30/06/02

avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

8

attention Attention, la seule version à jour et maintenue est disponible ici : http://www.ticalc.org/archives/files/fileinfo/283/28363.html

9

Je vous remercie pour vos rapides réponses.

Le ROM_Call qui m'interresse est celui là :

[Quote]
--------------------------------------------------------------------------------------------

DateAndTime_Get Function (ROM Call 0x5F3)
===============

void DateAndTime_Get (USHORT* year, USHORT* month, USHORT* day, USHORT* hour, USHORT* minute, \
USHORT* second);

Retourne la date correspondant à celle affichée dans le Desktop.
Effectue l'opération inverse de DateAndTime_Set : OneSecondTimer est lu, TimeZone est pris
en compte, et les modifications inverses de celles de DateAndTime_Get sont effectuées avec
TimeZone, puis toutes les variables données par référence en arguments sont remplies.

La date et l'heure renvoyés sont celles DANS LE FUSEAU HORAIRE CHOISI.

Exemple :
unsigned short year, month, day, hour, minute, second;
DateAndTime_Get (&year, &month, &day, &hour, &minute, &second);

---------------------------------------------------------------------------------------------

[/Quote]


La description qui en est faite dans la doc de l'ASM 2.08 est la même.
Lors de la compilation, TIGCC me renvoie l'erreur suivante :
[Quote]
Error: Unresolved reference to `DateAndTime_Get'.
[/Quote]
Même sans lui préciser que je compile pour la ROM 2.09, ou en lui précisant que je compile pour la 2.07 ou la 2.08, ça ne marche pas.
Je n'ai pas essayé d'appeler la ROM via une routine en assembleur, vu que je ne connais pas ce langage.

Voici le code du programme :

[Quote]
// C Source File


#define USE_TI89 //Compile pour TI89

#define OPTIMIZE_ROM_CALLS // Optimisation des ROM calls

#define SAVE_SCREEN // sauve puis restore l'écran LCD

#define MIN_AMS 207 //Définit l'ASM minimum

#include <tigcclib.h> // Inclut tous les headers.




// Fonction Main

void _main(void)
{
unsigned short annee, mois, jour, heure, minute, seconde;
DateAndTime_Get(&annee, &mois, &jour, &heure, &minute, &seconde);
printf("%u %u %u %u %u %u",annee,mois,jour,heure,minute,seconde);
return;
}

[/Quote]

Mes recherches sur le web à propos des Rom_calls ne m'ont rien donné de mieux.

TIGCC génère un fichier "TiCal.s" ,"TiCal" est le nom de mon programme, qui semble être de l'assembleur :

[Quote]
.file "TiCal.c"
#NO_APP
.text
tigcc_compiled.:
#APP
.xdef _ti89
.xdef __ref_all___startup_code
.xdef __ref_all___detect_calc
.xdef __ref_all___test_for_specific_calc
.xdef __ref_all___test_for_89
.xdef __ref_all___MIN_AMS_required
.xdef __ref_all___MIN_AMS_2_07
.set _A_LINE,0xA000
.xdef __ref_all___kernel_format_data_var
.xdef _tigcc_native
.xdef __ref_all___nostub
.xdef __ref_all___optimize_rom_calls
.xdef __ref_all___save_screen
.xdef __ref_all___kernel_format_bss
.xdef __ref_all___kernel_format_rom_calls
.set MT_TEXT,0x8000
.set MT_XREF,0x9000
.set MT_ICON,0xA000
.set MT_CASCADE,0x4000
#NO_APP
.text
.LC0:
.ascii "%u %u %u %u %u %u\0"
.text
.even
.globl __main
__main:
link.w %a6,#-12
lea (-12,%a6),%a0
move.l %a0,-(%sp)
lea (-10,%a6),%a0
move.l %a0,-(%sp)
move.l %a6,%d0
subq.l #8,%d0
move.l %d0,-(%sp)
move.l %a6,%d0
subq.l #6,%d0
move.l %d0,-(%sp)
move.l %a6,%d0
subq.l #4,%d0
move.l %d0,-(%sp)
move.l %a6,%d0
subq.l #2,%d0
move.l %d0,-(%sp)
jbsr DateAndTime_Get
lea (24,%sp),%sp
move.w -12(%a6),-(%sp)
move.w -10(%a6),-(%sp)
move.w -8(%a6),-(%sp)
move.w -6(%a6),-(%sp)
move.w -4(%a6),-(%sp)
move.w -2(%a6),-(%sp)
pea .LC0
jbsr printf
lea (16,%sp),%sp
unlk %a6
rts


[/Quote]

Merci encore

Kami

10

Ce romcall n'est pas disponible via tigcc directement.
Essaie d'ajouter ça au début de ton programme, juste après tigcclib.h :

#define DateAndTime_Get _rom_call(void,(unsigned short*,unsigned short*,unsigned short*,unsigned short*,unsigned short*,unsigned short*),5F3)

11

Cela marche parfaitement, merci beaucoup. smile

12