Syscalls

From Hackspire
Jump to navigation Jump to search

Syscalls are OS functions exposed by Ndless to C and assembly programs. This article describes the syscalls currently available with Ndless 3.1. You don't need to include the .h files in your program, only Ndless's standard os.h is required.

Your help is needed to make this list grow to a full-fledged library. Try to find new syscalls, test them and share them for integration in Ndless.

Functions marked with (*) are available only if the program is linked against Newlib, i.e. when the nspire-ld switch -nostdlib is not used.

Functions crossed-out are deprecated and shouldn't be used anymore.

C standard library

ctype.h

errno.h

stdarg.h

stdio.h

stdlib.h

string.h

C POSIX library

dirent.h

sys/stat.h

unistd.h

Nucleus

  • int TCT_Local_Control_Interrupts(int mask): sets the interrupt mask. Returns the previous mask.
  • int NU_Current_Dir(const char *drive, char *path): fills in path with the full path name of the current working directory. Use "A:" as drive. Returns 0 on success.
  • int NU_Get_First(struct dstat *statobj, const char * pattern): given a pattern which contains both a path specifier and a search pattern, fills in the structure at statobj with information about the file and sets up internal parts of statobj to supply appropriate information for calls to NU_Get_Next. Returns non-zero if a match was not found.
  • int NU_Get_Next(struct dstat *statobj): given a pointer to a DSTAT structure that has been set up by a call to NU_Get_First(), searches for the next match of the original pattern in the original path. Returns non-zero if found and updates statobj for subsequent calls to NU_Get_Next.
  • void NU_Done(struct dstat *statobj): given a pointer to a DSTAT structure that has been set up by a call to NU_Get_First(), frees internal elements used by the statobj.
  • NU_Set_Current_Dir(const char *name): Set the current working directory on the default drive.

TI-Nspire specific

UTF-16 String API

Since v3.1 r672.

  • String : The type of the dynamic-length strings encoded in utf-16 format
Details
 typedef struct {
   char * str;
   int len;
   int chunck_size;
   int unknown_field;
 } * String;
Init/Dispose functions
  • String string_new() : Returns a new String structure
  • void string_free(String) : Frees the String structure
Encoding functions
  • char * string_to_ascii(String) : Returns String converted to ascii
  • int string_set_ascii(String, char *) : Erases the content of the String with the given ascii string
  • int string_set_utf16(String, char *) : Erases the content of the String with the given utf16 string
String manipulation functions
  • void string_lower(String) : Lower all characters in the String
  • int string_concat_utf16(String, char *) : Concatenates to the String the given utf16 string
  • void string_erase(String, int n) : Erases characters in the String from beginning to n (equivalent to substring(n, len))
  • void string_truncate(String, int n) : Truncates the String to n chararacters (equivalent to substring(0, n))
  • int string_insert_replace_utf16(String, char *, int start, int end) : Inserts the given utf16 string between start and end in the String by erasing its content. If end is -1 it erases the end of the String
  • int string_insert_utf16(String, char *, int pos) : Inserts the given utf16 string at pos in the String.
  • int string_sprintf_utf16(String, char *, ...) : Fills the String using the utf16 string format and arguments (equivalent to sprintf but with utf16 everywhere)
Search functions
  • char string_charAt(String, int pos) : Returns the character at pos in the String
  • int string_indexOf_utf16(String, int start, char *pattern) : Returns the index of pattern in the String starting at start. Returns -1 if not found
  • int string_last_indexOf_utf16(String, int start, char *) : Returns the last index of pattern in the String starting at start. Returns -1 if not found
  • int string_compareTo_utf16(String, char *) : Returns 0 if the given utf16 string is equal to the String, -1 if it is superior, 1 if not
  • char * string_substring_utf16(String, char *pattern, int *ptr) : Returns the beginning of the String (in utf16) until pattern is met (excluded). ptr is modified so that it indicates the ending index of pattern or values -1 if the pattern doesn't exist. In such case the whole string is returned.
  • char * string_substring(String dst, String src, int start, int end) : Writes in the dst the resulting substring from start to end (excluded) of src. Also returns the utf16 pointer
Other UTF-16 functions
  • void ascii2utf16(void *buf, const char *str, int max_size): converts the ASCII string str to the UTF-8 string buf of size max_size.
  • void utf162ascii(void *buf, const char *str, int max_size): Since v3.1 r607. converts the UTF-16 string str to the ASCII string buf of size max_size.
  • size_t utf16_strlen(const char * s): Since v3.1 r607. Returns the length in characters of the UTF-16 string s.

Graphic Context API

Since v3.1 r-4294967295 (not yet commited).

The TI-Nspire Graphic Context (or "ngc") is an API created by TI, inspired by Java's Graphics2D and using Nucleus GRAFIX functions.

This API is intensively used by the OS internally and is directly exposed in the TI-Nspire Lua framework [1].


In order to use this API inside your program, use this line :

#include <ngc.h>
Global parameters
  • Gc * gui_gc_global_GC_ptr is the graphic context used (and already allocated/setup) by the OS. In fact, gui_gc_new has been removed from the syscall list because it made the TI-Nspire Clickpad/Touchpad crash, preferring the use of this graphic context. Furthermore, the OS seems to use the same gc from the beginning of its initialization, why not Ndless then ?.

Notice: It is recommended to save the value of gui_gc_global_GC_ptr in a local variable as such :

Gc gc = *gui_gc_global_GC_ptr;
Init/Dispose functions
  • Gc gui_gc_copy(Gc, int w, int h) - Allocates a new Gc from an existing one copying its parameters, replacing port's width & height with the given ones. Does not copy the screen buffer.
  • int gui_gc_begin(Gc) - Initializes graphic port (seems to allocate 2 memory areas), may be used before any graphic manipulation.

Notice: gui_gc_setRegion may be used before gui_gc_begin in order to make gui_gc_clipRect work with proper coordinates.

  • void gui_gc_finish(Gc) - Resets the graphic port parameters (seems to free 2 memory areas).
  • void gui_gc_free(Gc) - Frees the given gc.
Set/Get Attributes functions
  • void gui_gc_clipRect(Gc, int x, int y, int w, int h, gui_gc_ClipRectOp op) - Contrains the given gc to draw only in a certain area. If op is GC_CRO_RESET, the other parameters are ignored.
  • void gui_gc_setColorRGB(Gc, int r, int g, int b) - Changes the pen color of the given gc
  • void gui_gc_setColor(Gc, int color) - same as gui_gc_setColorRGB but using 0xRRGGBB color format
  • void gui_gc_setAlpha(Gc, gui_gc_Alpha) - Changes the pen alpha mode of the given gc to non-transparent or semi-transparent.
  • void gui_gc_setFont(Gc, gui_gc_Font) - Changes the font of the given gc
  • gui_gc_Font gui_gc_getFont(Gc) - Returns the current font of the given gc
  • void gui_gc_setPen(Gc, gui_gc_PenSize, gui_gc_PenMode) - Changes the pen size and mode of the given gc
  • void gui_gc_setRegion(Gc, int xs, int ys, int ws, int hs, int x, int y, int w, int h) - Changes the region (or viewport) of the given gc. The region <x,y,w,h> is based on screen coordinates <xs,ys,ws,hs>. gui_gc_setRegion will offset all the drawings and coordinates you are using : It can be useful to use this function instead of creating a separate gc to draw an inner window.

Notice: gui_gc_clipRect will work with old coordinates as long as you don't reset the region to the entire screen, for example, using main :

int main(void)
{
  /* Get the gc */
  Gc gc = *gui_gc_global_GC_ptr;

  /* Initialization */
  gui_gc_setRegion(gc, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
  gui_gc_begin(gc);

  /* Draw */
  gui_gc_clipRect(gc, 10, 10, 10, 10, GC_CRO_SET);
  gui_gc_fillRect(gc, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); /* Will only draw a 10x10 rectangle */

  /* Blit & finish */
  gui_gc_blit_to_screen(gc);
  gui_gc_finish(gc);

  return 0;
}
Draw functions
  • void gui_gc_fillArc(Gc, int x, int y, int w, int h, int start, int end) -
  • void gui_gc_fillPoly(Gc, int * points, int count) -
  • void gui_gc_fillRect(Gc, int x, int y, int w, int h) -
  • void gui_gc_fillGradient(Gc, int x, int y1, int w, int y2, int start_color, int end_color, int vertical) -
  • void gui_gc_drawArc(Gc, int x, int y, int w, int h, int start, int end) -
  • void gui_gc_drawLine(Gc, int x1, int y1, int x2, int y2) -
  • void gui_gc_drawRect(Gc, int x, int y, int w, int h) -
  • void gui_gc_drawString(Gc, char * utf16, int x, int y, gui_gc_StringMode) -
  • void gui_gc_drawPoly(Gc, int * points, int count) -
  • void gui_gc_drawIcon(Gc, int ressource, int icon, int x, int y) -
  • void gui_gc_drawSprite(Gc, gui_gc_Sprite *, int x, int y) -
  • void gui_gc_drawImage(Gc, char * TI_Image, int x, int y) -
Metric functions
  • int gui_gc_getStringWidth(Gc, gui_gc_Font, char * utf16, int start, int length) -
  • int gui_gc_getCharWidth(Gc, gui_gc_Font, short utf16 char) -
  • int gui_gc_getStringSmallHeight(Gc, gui_gc_Font, char * utf16, int start, int length) -
  • int gui_gc_getCharHeight(Gc, gui_gc_Font, short utf16 char) -
  • int gui_gc_getStringHeight(Gc, gui_gc_Font, char * utf16, int start, int length) -
  • int gui_gc_getFontHeight(Gc, gui_gc_Font) -
  • int gui_gc_getIconSize(Gc, int ressource, int icon, int * w, int * h) -
Blit functions
  • void gui_gc_blit_gc(Gc source, int xs, int ys, int ws, int hs, Gc dest, int xd, int yd, int wd, int hd) -
  • void gui_gc_blit_buffer(Gc, char * buffer, int x, int y, int w, int h) -
  • void gui_gc_blit_to_screen(Gc) -
  • void gui_gc_blit_to_screen_region(Gc, int x, int y, int w, int h) -

Others

  • void show_dialog_box2(int winid, const char *utf8_title, const char *utf8_msg): displays a dialog box of title utf8_title containing utf8_msg. utf8_title and utf8_msg are C strings converted with ascii2utf16(). winid must be 0 (deprecated since Ndless 2.0 and replaced with libndls's show_msgbox).
  • int read_unaligned_longword(void *ptr)
  • int read_unaligned_word(void *ptr)