
typedef union { WIN_RECT; short x0,y0,x1,y1; } WINRECT;
struct Misc { short CursX0; short CursY0; short CursX1; short CursY1; ...
struct Misc { WINRECT ...
SCR_RECT Rect; Rect.xy.x0 = (char)Data->CursX0; Rect.xy.y0 = (char)Data->CursY0; Rect.xy.x1 = (char)Data->CursX1; Rect.xy.y1 = (char)Data->CursY1; PortSetPlane(Planes); ScrRectFill(&Rect,&Data->Clip,Data->FrameModePlane0);
typedef union { struct { unsigned char x0, y0, x1, y1; } xy; unsigned long l; } SCR_RECT;
typedef union { WIN_RECT; struct {short x0,y0,x1,y1;}; } WINRECT;
struct Misc { WINRECT Curs; short CursModePlane0; short CursModePlane1; ...
Sally (./175) :
je suppose que c'est un ROM call, il te donne juste son adresse...
Folco (./176) :
Ok, j'avais pas pensé à caster, chsuikon ! Je déclare pas ça en WIN_RECT, parce que ces données (4 shorts) me servent tantôt à afficher un point (là faut des shorts), une ligne (idem), ou des rectangles (et là, on est sur du WIN_RECT)...
Folco (./177) :
Et voilà, ça, ça marche :
DrawClipRect((WIN_RECT*)&(Data->CursX0),&(Data->Clip),Data->RectangleModePlane0);
Folco (./185) :
Donc j'ai pas nommé l'union.
Kevin Kofler (./189) :
Comme je l'ai déjà dit plus haut, il est beaucoup plus propre de se limiter à passer les variables que la fonction utilise réellement.
Folco (./191) :
Passer un pointeur j'imagine ?
Et puis ça doit pas être efficace pour deux sous ton truc, ça nécessite une première copie en RAM de la valeur, ou un pea de l'adresse de l'élément choisi si on passe un pointeur, et ensuite une relecture en RAM pour, par exemple, reconstituer une pile de paramètres en vu d'appeler un ROM call. Ca fait beaucoup d'accès mémoire alors qu'on en fait un au maximum avec un passage de pointeur de structure.
J'ai essayé les variables globales, elles étaient mises en BSS (ou alors j'ai vraiment raté un truc)
// Progress bar example for TIGCC // Optimized version, the old version is left commented after this one. // Compilation options: -O3 -Wall -W -Wwrite-strings -Wa,-l // (-Os generates bigger code !) // // We could even replace the calls to the system timer functions by // waiting loops in plain assembly. That would reduce the size, while // not being a problem, since we don't need accuracy here... #define USE_TI89 // Compile for TI-89 #define USE_TI92PLUS // Compile for TI-92 Plus #define USE_V200 // Compile for V200 #define MIN_AMS 200 // Compile for AMS 2.00 or higher #define NO_CALC_DETECT #define NO_EXIT_SUPPORT #define OPTIMIZE_ROM_CALLS #include <tigcclib.h> // Include All Header Files ST_PROGRESS_BAR spb = {NULL, {0, 0, 0, 0}, 0, 0, 100, 100, 0}; // Using that trick, we can reduce size. register ST_PROGRESS_BAR * spbptr asm("%a2"); // Main Function void _main(void) { short j; spbptr = &spb; // Initialize the global register variable. WINDOW w; WINDOW * wptr = &w; // WIN_RECT is 8 bytes... WIN_RECT * winrect = ScrToWin (ScrRect); *(unsigned long *)((unsigned char *)spbptr+OFFSETOF(ST_PROGRESS_BAR,rect)) = *(unsigned long *)winrect; *(unsigned long *)((unsigned char *)spbptr+OFFSETOF(ST_PROGRESS_BAR,rect)+4) = *(unsigned long *)((unsigned char *)winrect+4); spbptr->physwidth = spbptr->rect.x1 - spbptr->rect.x0 + 1; WinOpen (wptr, (WIN_RECT*)((unsigned char *)spbptr+OFFSETOF(ST_PROGRESS_BAR,rect)), WF_SAVE_SCR | WF_NOBORDER); spbptr->w = wptr; spbptr->value = 0; for (j = 0; j < 20; j++) { // The function is so slow if the progress bar is huge, that no waiting loop // is necessary ! OSFreeTimer (USER_TIMER); OSRegisterTimer (USER_TIMER, 2); while (!OSTimerExpired (USER_TIMER)); // Wait a little... ST_progressIncrement (spbptr, 1); // Increment the progress bar by 1/100. } ST_progressUpdate (spbptr, 50); // Increment the progress bar up to 50/100. OSFreeTimer (USER_TIMER); OSRegisterTimer (USER_TIMER, 20); while (!OSTimerExpired (USER_TIMER)); // Wait for about 1 second... OSFreeTimer (USER_TIMER); ST_progressUpdate (spbptr, 100); // Fill the progress bar entirely. GKeyIn (NULL, 0); // ST_progressDismiss does nothing if the progress bar is in a window. ST_progressDismiss (spbptr); // Remove the progress bar, redraw status line. WinClose (wptr); }
Lionel Debroux (./195) :J'ai aussi donné un exemple dans l'autre topic
Je vais essayer de te retrouver un exemple d'utilisation d'une global register variable. J'ai moins utilisé les global register variables que -freg-relative-an.
struct Misc { WIN_RECT Curs; short CursModePlane0; short CursModePlane1; short LineModePlane0; short LineModePlane1; short CircleModePlane0; short CircleModePlane1; short EllipseModePlane0; short EllipseModePlane1; short RectangleModePlane0; short RectangleModePlane1; short FrameModePlane0; short FrameModePlane1; short Tool; short Cursor; short Flags; short CircleRadius; short EllipseAxe1; short EllipseAxe2; SCR_RECT Clip; } DrawingData; extern struct Misc DrawingData;