Syscall

De Casio Universal Wiki
Aller à : navigation, rechercher

Les syscalls (abréviation en anglais de system call, traduit en français par appel système) sont des fonctions inscrites dans le noyau du système de la calculatrice. Pour pouvoir lancer un syscall, on a besoin de son numéro. Malheureusement, Casio n'a jamais donné ces informations, il faut donc les trouver en tâtonnant. Nous connaissons le point d'entrée de la fonction (0x80010070), mais la liste des numéros de fonctions (et surtout de leurs paramètres) est loin d'être complète. Simon Lothar et Andreas Bertheussen ont fait une documentation(en anglais) sur les syscalls disponible sur Planète Casio

Intérêts

Les avantages de ces syscalls sont nombreux, grâce à eux on peut :

  • Utiliser des fonctions utilisables juste en C, comme le système RTC (Real-Time Clock ou Horloge temps réel) qui permet d'avoir l'heure sur sa calculatrice (heure qui continue à tourner lorsque cette dernière est éteinte).
  • Utiliser des fonctions beaucoup plus rapides que celles fournies par Casio dans la bilbiothèque fxlib.h. Lorsque les syscalls sont bien utilisés, on peut obtenir des fonctions beaucoup plus rapides, comme celles de Monochrome Lib par exemple.

Liste des sycalls connus

Voici quelques exemples de ce que permettent les syscalls.

Contrôle du curseur

int  Cursor_SetPosition   (char column, char row);
int  Cursor_GetFlashStyle (void);
void Cursor_EnableFlash   (void);
void Cursor_DisableFlash  (void);

Pour déplacer le curseur et utiliser le clignotement (champs de saisie).

Affichage de texte

void Print_Generic    (int mode, char *string, int maxcol);
void Print_AtCursor   (char *string, int type);
void Print_AtLocation (char *string, int column, int row);

Des fonctions de texte utilisées par les fonctions habituelles du SDK mais ne faisant pas partie de fxlib.

Gestion du clavier

int Kbd_GetKeyWait (int *col, int *row, int waittype, int timeout, int menu, ushort *keycode);

Un GetKeyWait fonctionnel, contrairement à celui de fxlib.

Gestion de l'affichage

char *Disp_GetVRAMPtr (void);
char *Disp_Manage     (int pageID, int action);

Permettent d'utiliser directement la VRAM et les buffers de sauvegarde de SaveDisp() et RestoreDisp().

Applications intégrées

void App_CONICS  (int isAppli, unsigned short optionNum);
void App_DYNA    (int isAppli, unsigned short optionNum);
void App_EACT    (int isAppli, unsigned short optionNum);
void App_EQUA    (int isAppli, unsigned short optionNum);
void App_PRGM    (int isAppli, unsigned short optionNum);
void App_FINANCE (int isAppli, unsigned short optionNum);
void App_GRAPH   (int isAppli, unsigned short optionNum);
void App_LINK    (int isAppli, unsigned short optionNum);
void App_MEMORY  (int isAppli, unsigned short optionNum);
void App_RECUR   (int isAppli, unsigned short optionNum);
void App_RUNMAT  (int isAppli, unsigned short optionNum);
void App_STAT    (int isAppli, unsigned short optionNum);
void App_SYSTEM  (int isAppli, unsigned short optionNum);

Ces syscalls permettent de lancer n'importe quelle application déjà existante de l'OS.

int App_RefreshAddInTable  (void);
int App_GetIntegratedCount (void);
int App_Run                (int R4, int R4, int index, int allow_recursion);

Ces derniers donnent la possibilité de lancer également des application ajoutées par l'utilisateur.

Utilisation de l'interface Serial

int Serial_ReadByte                (unsigned char *dest);
int Serial_ReadBytes               (unsigned char *dest, int max, short *size);
int Serial_WriteByte               (unsigned char byte);
int Serial_WriteBytes              (unsigned char *src, int size);
int Serial_GetRxBufferSize         (void);
int Serial_GetTxBufferFreeCapacity (void);
int Serial_ClearReceiveBuffer      (void);
int Serial_ClearTransmitBuffer     (void);
int Serial_Open                    (unsigned char *conf);
int Serial_Close                   (int mode);
int Serial_Peek                    (int index, unsigned char *dest);
int Serial_IsOpen                  (void);

[1]

En cours...

Notes et références

  1. , Dans la documentation du syscall Serial_ReadBytes, dest n'est pas un pointeur, mais cela reste invraisemblable. Le même phénomène se retrouve pour le paramètre src du syscall Serial_WriteBytes.