// C Source File // Created 11/01/2004; 17:26:31 #define USE_TI89 // Compile for TI-89 #define USE_TI92PLUS // Compile for TI-92 Plus #define USE_V200 // Compile for V200 // #define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization #define MIN_AMS 200 // Compile for AMS 1.01 or higher //#define SAVE_SCREEN // Save/Restore LCD Contents #include // Include All Header Files #include "Qbasic_asmheader.h" //#include "preproc.h" #define getuc ((*(fonc[*(argptr)]))()).uc #define getui ((*(fonc[*(argptr)]))()).ui #define getul ((*(fonc[*(argptr)]))()).ul #define getsc ((*(fonc[*(argptr)]))()).sc #define getsi ((*(fonc[*(argptr)]))()).si #define getsl ((*(fonc[*(argptr)]))()).sl #define getpuc ((*(fonc[*(argptr)]))()).puc #define getpui ((*(fonc[*(argptr)]))()).pui #define getpul ((*(fonc[*(argptr)]))()).pul #define getpsc ((*(fonc[*(argptr)]))()).psc #define getpsi ((*(fonc[*(argptr)]))()).psi #define getpsl ((*(fonc[*(argptr)]))()).psl #define geth ((*(fonc[*(argptr)]))()).h #define getpfile ((*(fonc[*(argptr)]))()).pfile #define getpfiles ((*(fonc[*(argptr)]))()).pfiles #define rul return (ans)(unsigned long) #define rsl return (ans)(signed long) #define rui return (ans)(unsigned int) #define rsi return (ans)(signed int) #define ruc return (ans)(unsigned char) #define rsc return (ans)(signed char) #define rpul return (ans)(unsigned long*) #define rpsl return (ans)(signed long*) #define rpui return (ans)(unsigned int*) #define rpsi return (ans)(signed int*) #define rpuc return (ans)(unsigned char*) #define rpsc return (ans)(signed char*) #define resi return (ans)(ESI) #define rh return (ans)(h) #define rpfile return (ans)(FILE*) #define rpfiles return (ans)(Files*) //#define rpans return (ans)(ans*) #define PASS_BLOCK argptr=argyblock[*(argptr+2)] //permet de passer un block x y quand on pointe sur le x #define NB_FOR 100 //be sure to have the same value in the compilator #define NB_WHILE 30 //be sure to have the same value in the compilator INT_HANDLER OldInt5 = NULL; INT_HANDLER save_int_1,save_int_5; WINDOW wind; volatile int Counter = 0; unsigned int srcsize,nintr,sintr,iintr,byte_width_ilist[256],iiii; unsigned char *srcptr,/**ptr,*/int5_allowed,sv_scr_on,*screen_buffer,nbvar_main,*GLOBAL_data,disp_err,disp_err_old; long /*rtnf[255],*/argin[200]; //retour des fonctions inlines : imbrication max de 200 appels . Entrée fonction inline unsigned char /*i_rtnf,*/i_intr,varnfor[50],user_func_nb_arg[256]; unsigned long inc,speedintr[21],rtn_value; //ESI argptr,argdep,tmpesi,argintr[21],intrdeb,argfunc[255],argendfunc[255],arglbl[256],argwhile[NB_WHILE],argendwhile[NB_WHILE],argfor[NB_FOR],argendfor[NB_FOR],argelse[257],argendif[257],argyblock[50]; ESI argptr,argdep,tmpesi,argintr[21],intrdeb,*argfunc/*[255]*/,*argendfunc/*[255]*/,*arglbl/*[256]*/,argwhile[NB_WHILE],argendwhile[NB_WHILE],*argfor/*[NB_FOR]*/,*argendfor/*[NB_FOR]*/,*argelse/*[257]*/,*argendif/*[257]*/,argyblock[50]; /* Tous non pas été mis sous cette forme pour le moment. Cela permet d'économiser de la place sur le stack (limité à 16ko). argendif=GLOBAL_data+0; //260 argelse=GLOBAL_data+260*4*1; //260 arglbl=GLOBAL_data+260*4*2; //260 argfunc=GLOBAL_data+260*4*3; //260 argendfunc=GLOBAL_data+260*4*4; //260 argendfor=GLOBAL_data+260*4*5; //NB_FOR argfor=GLOBAL_data+260*4*5+4*NB_FOR*1; //NB_FOR */ void *kbq; //For the function gkey() unsigned int sprt2_return[2]; typedef struct { unsigned char f_name[20]; //is usefull just for opening an existing file (in aim to replace it later) unsigned char *fptr; //pointer that is used just for closening the file unsigned char *cptr; //pointer on the first byte of the used memory block unsigned int i; //index : position on the file for loading unsigned char iw; //index position for writing unsigned short plen; //length in byte of the memory blok of the file ; plen=*(unsigned int*)fptr unsigned char *last_byte; //Points to the ESI = fptr+plen+1; HANDLE h; //handle à déreférencer si il y a eu compression du Heap (HeapDeref) pour obtenir fptr unsigned char oc; //if oc=1 so the filed has been open with OpenFile, if oc=0 so the file has been created with CreateFile_Files ; Made by me unsigned char ftype; // =*(last_byte) c'est la valeur décimale du type du fichier (ESI) STR_TAG etc ; made by me unsigned char is_archived; //=1 if archived else 0 unsigned char is_modified; //=1 if the user has used writing functions like fputc, =0 if not } Files ; void print_Files(Files *f) { printf("fptr=%ld\n cptr=%ld\nindex=%d\n plen=%d\n last_byte=%ld\n Handle=%ld\n",f->fptr,f->cptr,f->i,f->plen,f->last_byte,f->h); printf("oc=%x\n ftype=%x",f->oc,f->ftype); ngetchx(); } //0 1 2 3 4 5 6 7 8 9 unsigned char *foncs[]={ "" ,"GUCHAR" , "GSLVAR", "" , "FLBL", "FGOTO" ,"keywait", "isz" , "dsz" , "iff" , //0 "freeh" , "basich", "exech" , "" , "INDIR" ,"printf1","printf2","newline","prints", "elsee" , //1 "svscroff","fedwhil", "finish", "when" ,"strlen" , "printc","sprintf", "char" , "strcat","atol" , //2 "execnpp" ,"GUINT" , "GINT" , "gsprt8","gsprt16","printld","printxy", "GLONG" ,"GULONG" , "inter" , //3 "dline" ,"dmline" , "gmode" ,"sprt8" ,"sprt16" , "" , "ord" ,"sprt82" ,"sprt162","sprt322", //4 "setlcd", "dpix" ,"gpix" ,"sprt32","fillrect","clrlcd" ,"keytest","keyclear","keydisp","ifthen", //5 "getlcd", "fwhile", "off" ,"gsprt32","realloc","isover16","strcat2","next" , "break" , "elsee" , //6 "grayon" ,"grayoff","light" , "dark" , "" ,"drawstr","setfont","freet" ,"settimer","endiff", //7 "gotopos" , "pos" , "jsr" , "rts" ,"pause" ,"unsigb" , "unsigw","timerexp","timerval", "" , //8 "lscroll" ,"rscroll","uscroll","bscroll", "lrol", "rrol" , "" , "idle" , "memcpy", "" , //9 "clrscr", "rand" , "gsprt" ,"lscroll2","rscroll2","uscroll2","bscroll2","" ,"memmove", "" , //10 "fopen" , "" , "fcreate", "" , "files" , "reps", "" , "gets" , "" , "" , //11 "nott", "orb" , "neg" , "notb" ,"dcircle","fillcirc", "" , "" , "sto" , "" , //12 "xorr", "orl" , "andl", "inf" , "infeq" , "eq" , "supeq" , "sup" , "noteq" , "add", //13 "" , "sub" , "andb" , "mul" , "" , "div" , "eqs" , "esc" , "up" , "second", //14 "def" , "enddef", "" , "fc" ,"sprt8x" , "rtn" , "group" , "" , "down", "shiftt", //15 "repeat", "" ,"savescr","loadscr", "mod" , "lb" , "lw" , "ll" , "leftt" ,"diamond", //16 "moveto", "os" , "toos", "newstr","gsprt8x", "wb" , "ww" , "wl" , "rightt", "alpha" , //17 "strcmp","strcpy" , "gkey","keydelay" ,"keyspeed","FFORR" ,"ENDFFOR", "" , "" , "" , //18 "pokeb" , "pokew" , "pokel" ,"lscroll4","archi","unarchi" , "i" , "b" , "w" , "l" , //19 "peekb" , "peekw" , "peekl" ,"isarchi","loadasm", "" , "x" , "y" , "" , "" , //20 "newstr" , "expr", "string", "" ,"execasm", "" ,"nilist" , "mklist", "" , "" , //21 "map" , "multi" , "two" , "" ,"closeasm", "" ,"catalog", "open" , "" ,"ENDTAG" , //22 "" , "" ,"settype", "finish", "seqb" , "lcdup" ,"lcddown","drawpic","getpic" , "" , //23 "debugon" ,"debugoff", "seqs", "seqe" , "seqw" ,"prettyxy","getwbt", "cwidth", "" , "" , //24 "nop" , "malloc", "free","memset" , "seql" ,"asmcall", "enddef", "" , "" , "enddef"}; //25 typedef union { unsigned char uc; unsigned int ui; unsigned long ul; signed char sc; signed int si; signed long sl; unsigned char *puc; unsigned int *pui; unsigned long *pul; signed char *psc; signed int *psi; signed long *psl; HANDLE h; ESI esi; FILE *pfile; Files *pfiles; //ans *pans; } ans; typedef struct { char *fptr, *cptr; unsigned short plen; HANDLE h; } File ; SCR_RECT scr_rect; char gmode/*,gmode2*/,nswitch; //gmode = mode graphique & or xor pour fonction sprt8,16,32 ; gmode2 pour les autres char strchars[2]; void *lcdad; ans /*varlist[256],*/*varlist,varlist_array[256]; long var_user_func_backup[200]; unsigned char var_user_func_varnum_backup[200],nsubfonc; unsigned int i_var_user_func_backup; ESI lbl[256]; ESI subfonc[255]; ans (*fonc[])(void); long *scr_copy[4]; index_in_c_str=0; unsigned char *ptr_execbas; //init_bkm unsigned int dim_max; //init_bkm unsigned char mod_uchar(unsigned char a, unsigned char b) { if(b==0) return a; else return a%b; } DEFINE_INT_HANDLER(MyInt5) { unsigned char i; unsigned long tempp; inc++; //printf(" inc=%d",inc); intrdeb=argptr; for(i=0;i<20;i++) { tempp=speedintr[i]; if(speedintr[i]==0) tempp=inc; else tempp=(inc%tempp); if(/*(inc%tempp)==0 && tempp!=0*//*tempp==0*/!tempp && speedintr[i]) { //printf("speed=%ld inc=%ld\n",speedintr[i],inc); argptr=argintr[i]; //on pointe maintenant sur le tag de la nilist a exécuter if(*argptr==216) //nilist {} { //printf(" inc=%d",inc); argptr++; sintr=getsl; nintr=getsl; for(iintr=0;iintrType == CM_STRING) ptr = ev->extra.pasteText; else if (ev->Type == CM_HSTRING) handle = ev->extra.hPasteText; ER_throw (1); } ans finish(void) { int ii; SetIntVec (AUTO_INT_5, OldInt5); OSInitKeyInitDelay(336); OSInitBetweenKeyDelay (48); if(sv_scr_on==1) {memcpy (LCD_MEM, screen_buffer, LCD_SIZE); free(screen_buffer);} if(GLOBAL_data) free(GLOBAL_data); for(ii=0;ii<4;ii++) //free the saved screen { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } if(argdep) free(argdep); if(handle_execbas) HeapFree (handle_execbas); WinClose (&wind); //for prettyxy function exit(4); } void exec_none_stop_secured(void) //fonction avoiding to exiting from the prgm { unsigned char *arg_enddd; arg_enddd=argdep+srcsize; while(argptr=385 ? { if((!((unsigned long)(srcc)%2) && (!((unsigned long)(destt)%2)))) //Are they both even address ? { //Yes Fastmemcpy(srcc,destt,quotient-1); //Fast copy assembly routine if(lenn%2) *(destt+lenn-1)=*(srcc+lenn-1); return destt; } //printf("Here memcpy"); ngetchx(); } return memcpy(destt,srcc,lenn); } void msgg(char *str) { printf(str); ngetchx(); } void skip_str(void) //argptr doit pointé sur le prem char de la string { while(*(argptr)!=0) argptr++; argptr++; } ESI foundarg(unsigned char val) { ESI argptrori,argptrf;; argptrori=argptr; while(*argptr!=val) { if(*argptr==0xE9) { return NULL; } skip_arg(); /*if(*argptr==STR_TAG) skip_str(); else { if(*argptr==1 || *argptr==POSINT_TAG || *argptr==NEGINT_TAG || *argptr==IM_TAG || *argptr==2) getsl; else { if(*argptr==0xE9) { argptr=argptrori; return argptrori; } argptr++; } }*/ } argptrf=argptr; argptr=argptrori; return argptrf; } ans gstr(void) { unsigned int dim; unsigned char *p; argptr++; dim=getul; p=argptr; argptr+=dim+1; rpuc(p); } void skip_arg(void) { if(*argptr==STR_TAG) /*skip_str();*/ gstr(); else { if(*argptr==1 || *argptr==POSINT_TAG || *argptr==NEGINT_TAG || *argptr==IM_TAG || *argptr==2) getsl; else { if(*argptr==0xE9) { return; } argptr++; } } } void init_bkm(void) { ESI argptrori; char has_worked; //Cette variable permet d'éviter de passer une fonction avec skip_arg si l'on vient de repérer une fonction inclue dans le switch int cmd,var,i; unsigned int nbelemm,dim; for(i=0;i<=256;i++) argelse[i]=NULL; //Initialise les else (utile car ils ne sont pas obligatoires) dim_max=0; handle_execbas=H_NULL; argptrori=argptr; cmd=*argptr; while(cmd!=0xE9) { has_worked=0; switch(cmd) { case OTH_TAG: //basic endbasic execbas() argptr++; dim=((*argptr)*256+*(argptr+1)); if(dim>dim_max) dim_max=dim; //pour créér l'handle pour les basic:endbasic, il ne sera pas recréér à chaque instruction Tibasic, on gagnera ainsi en vitesse d'exécution argptr+=dim; has_worked=1; break; case 11: //basich() endbasic argptr+=2; dim=((*argptr)*256+*(argptr+1)); if(dim>dim_max) dim_max=dim; argptr+=dim; has_worked=1; break; case 150: //def(func_id,nbarg) . Keep the number of args of the user functions. argptr++; var=*(argptr+1); argptr+=2; //pointe maintenant sur le nombre d'arguments user_func_nb_arg[var]=*(argptr+1); argptr+=2; //pointe sur le premier argument (si il y a) argfunc[var]=argptr; has_worked=1; break; case 151: //enddef argptr++; argendfunc[*(argptr+1)]=argptr+2; has_worked=1; break; case 196: //i test condition, is assume to be a x y block case 206: //x start block argptr++; has_worked=1; //printf("X num=%d",*(argptr+1)); break; case 207: //y end block argptr++; var=*(argptr+1); //printf("Y num=%d",var); argptr+=2; argyblock[var]=argptr; //pointe juste après la fonction y et son identifiant has_worked=1; break; case 24: //LOOP argptr++; has_worked=1; /*var=*(argptr+1); argloop[var]=argptr+2;*/ break; case 34: //ENDLOOP argptr++; has_worked=1; break; case 0x04: //label argptr++; //printf("LBL num=%d",*(argptr+1)); ngetchx(); var=*(argptr+1); arglbl[var]=argptr+2; has_worked=1; break; case 0x3D: //while argptr++; var=*(argptr+1); argwhile[var]=argptr-1; //pointe sur le début de while pour tester la condition has_worked=1; break; case 0x15: //endwhile argptr++; var=*(argptr+1); argendwhile[var]=argptr+2; has_worked=1; break; case 185: // FOR "for varna,strt,end,step" En tag : 185,value_tag,identifiant_boucle,... argptr++; var=*(argptr+1); //identifiant de la boucle //printf("Y num=%d",var); //argptr+=2; argptr+=2; //passe le numéro de for varnfor[var]=*(argptr+1); //enregistre la variable à faire évoluer //printf("Numéro de la fonction à faire évoluer %d", varnfor[var]); argptr+=2; //passe la variable à faire évoluée if(*argptr!=213 && *argptr!=165 && *argptr!=166 && *argptr!=167 && *argptr!=200 && *argptr!=201 && *argptr!=202) getsl; //il y a un risque ici si la valeur de départ est une fonction mémoire (en écriture ou lecture si sur adresse nulle //skip_arg(); //passe la valeur de départ else exit2("In for : start value shall not be [],lb,lw,ll,peek"); argfor[var]=argptr; //pointe à la borne limite à ne pas dépasser //printf("pointeur valeur limite %lp",argfor[var]); ngetchx(); has_worked=1; //var=*(argptr+1); EST initialisé directement dans la fonction //argfor[var]=argptr-1; break; case 186: //ENDFOR argptr++; var=*(argptr+1); argptr+=2; argendfor[var]=argptr; //printf("pointeur valeur limite %lp",argfor[var]); ngetchx(); has_worked=1; break; case 0x45: //else argptr++; var=*(argptr+1); has_worked=1; //printf("var else=%d",var); /*if(*(argptr+2)==0x4F && *(argptr+4)==var) //Si il est suivi de son endif, alors on passe le endif(optimisation) { argelse[var]=argptr+5; }*/ /*else*/ argelse[var]=argptr+2; break; case 0x4F: //endif argptr++; var=*(argptr+1); //if(argelse[var]==NULL) argelse[var]=argptr+2-3; //printf("var endif=%d",var); if(argelse[var]==NULL) argelse[var]=argptr+2; argendif[var]=argptr+2; // if(var==8) {printf("var=8 argptr=%ld,\nargendif[8]=%ld",argptr,argendif[var]); ngetchx();} // if(var==9) {printf("var=9 argptr=%ld,\nargendif[9]=%ld",argptr,argendif[var]); ngetchx();} has_worked=1; break; case 89: //IF cond:i_true argptr+=2; //passe le tag et la taille de l'instruction à sauter éventuellement has_worked=1; break; case 197: //b block argptr++; var=*(argptr+1); //printf("\nvarn=%d\n%ld",var,var); ngetchx(); argptr+=2; nbelemm=getsl; if(((unsigned long)argptr%2)==1) argptr++; //in the case of an not even adress varlist[var].sl=argptr; byte_width_ilist[var]=1; argptr+=nbelemm*1; //skip the y has_worked=1; break; case 198: //w argptr++; var=*(argptr+1); argptr+=2; nbelemm=getsl; if(((unsigned long)argptr%2)==1) argptr++; //in the case of an not even adress varlist[var].sl=argptr; byte_width_ilist[var]=2; argptr+=nbelemm*2; //skip the y has_worked=1; break; case 199: //l argptr++; var=*(argptr+1); argptr+=2; nbelemm=getsl; if(((unsigned long)argptr%2)==1) argptr++; //in the case of an not even adress //printf("argptr=%ld",argptr); ngetchx(); varlist[var].sl=argptr; byte_width_ilist[var]=4; argptr+=nbelemm*4; //skip the y has_worked=1; break; } if(has_worked==0) skip_arg(); //ce test permet d'éviter de sauter des fonctions à repérer si elles se suivent. cmd=*argptr; //printf(" %x",cmd); } if(!(handle_execbas=HeapAllocHigh (dim_max+2+4+1))) exit2("Not enough memory"); //+4 pour le stockage du pointeur (unique) +2 pour la taille du handle +1 pour placer un 0xE9 car les instructions Tibasic devront s'arrêter avant d'avoir d'avoir atteint la fin du HANDLE, servant d'identifiant ptr_execbas=HeapDeref(handle_execbas); // ptr_execbas=malloc(dim_max+2+4+1); //handle_execbas=*(unsigned int*)(ptr_execbas-2); //HeapLock(handle_execbas); *(unsigned int*)ptr_execbas=dim_max+4+1; //inscrit la taille de l'espace mémoire - 2, pour compatibilité avec NG_execute() argptr=argptrori; } HANDLE CreateFile (const char *FileName) // Returns a handle, H_NULL in case of error { HANDLE h; SYM_ENTRY *sym_entry; char str[30], *sptr = str; *sptr = 0; while ((*++sptr = *FileName++)); if (!(h = HeapAlloc (HeapMax ()))) return H_NULL; if (!(sym_entry = DerefSym (SymAdd (sptr)))) { HeapFree (h); //printf("nom non valid dan create file"); ngetchx(); return H_NULL; } *(long*) HeapDeref (sym_entry->handle = h) = 0x00010000; return h; } HANDLE CreateFile_with_specified_size (const char *FileName, unsigned int size) // Returns a handle, H_NULL in case of error { HANDLE h; SYM_ENTRY *sym_entry; char str[30], *sptr = str; *sptr = 0; while ((*++sptr = *FileName++)); if(size>HeapMax ()) return H_NULL; if (!(h = HeapAlloc (size))) return H_NULL; if (!(sym_entry = DerefSym (SymAdd (sptr)))) { HeapFree (h); //printf("nom non valid dan create file"); ngetchx(); return H_NULL; } *(long*) HeapDeref (sym_entry->handle = h) = 0x00010000; return h; } unsigned char* OpenFile(const char *FileName) { char *fptr, *cptr; unsigned char *filecontent; unsigned short plen; SYM_ENTRY *SymPtr; HANDLE h; //if(!(filecontent=malloc((unsigned long)32000))) exit2("Memory error in fopen."); SymPtr = DerefSym (SymFind (SYMSTR (FileName))); if (!SymPtr) {return 0;} h = SymPtr->handle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } plen = *(short*)(cptr) + 3; if(!(filecontent=malloc(plen))) exit2("Memory error in fopen."); //Malloc a pu modifier le pointeur sur le fichier, alors récupère à nouveau le pointeur sur le block mémoire SymPtr = DerefSym (SymFind (SYMSTR (FileName))); if (!SymPtr) {return 0;} h = SymPtr->handle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } memcpy(filecontent,fptr,plen); //if(plen<32000) memcpy(filecontent,fptr,plen); //else exit2("The file to open is too big"); //if(!(filecontent=realloc(filecontent,(unsigned long)plen))) exit2("Can't realloc memory in fopen."); //Close the file if (h) HeapUnlock (h); return filecontent; } void AppendCharToFile (HANDLE h, unsigned char c) { char *base = HeapDeref(h); unsigned short len = *(unsigned short*)base; if (len > HeapSize(h) - 10) return; *(unsigned short*)base = len + 1; base[len+2] = c; } unsigned char AppendCharToFile2 (HANDLE h, unsigned char c) { char *base = HeapDeref(h); unsigned short len = *(unsigned short*)base; if (len > HeapSize(h)-10) {/*printf("AppendChartofile2 %ld",HeapSize(h)); ngetchx();*/ return 0;} *(unsigned short*)base = len + 1; base[len+1] = c; return 1; } void AppendBlockToFile (HANDLE h, void *addr, unsigned short len) { unsigned short i; for (i = len; i; i--) {AppendCharToFile (h, *((char*)addr)++); /*printf("c=%c ",*(char*)addr);*/} } unsigned char AppendBlockToFile2 (HANDLE h, void *addr, unsigned short len) { unsigned char rr; unsigned short i; rr=1; for (i = len; i; i--) {rr*=AppendCharToFile2 (h, *((char*)addr)++); /*printf("c=%c ",*(char*)addr);*/} return rr; //if rr=1, ok else if rr=0 an error occured (memroy error) } /* void CloseOpenedFile(Files *fileptr) { if (fileptr->h) HeapUnlock (fileptr->h); if (fileptr->cptr != fileptr->fptr) free (fileptr->cptr); if(fileptr) free(fileptr); } */ void CloseFile (HANDLE h) { AppendCharToFile (h,0); AppendCharToFile (h,0x2D); HeapUnlock (h); HeapRealloc (h, *(unsigned short*)HeapDeref(h) + 3); } void CloseFile_type (HANDLE h,int type) { //if(type==STR_TAG) AppendCharToFile (h,0); AppendCharToFile (h,type); if(h) HeapUnlock (h); if(h) HeapRealloc (h, *(unsigned short*)HeapDeref(h) + 3); } void AppendStrToFile (HANDLE handle, void *str) { AppendBlockToFile (handle, str, strlen(str)); } ans guchar(void) { argptr+=2; rul(*(argptr-1)); //return (ans)(*(argptr-1)); } ans gchar(void) { argptr+=2; rsl(*(argptr-1)); //return (ans)(*(argptr-1)); } ans guint(void) { unsigned int ui; unsigned char *p; p=&ui; *p=*(argptr+1); *(p+1)=*(argptr+2); argptr+=3; rul(ui); } ans gint(void) { int vi; unsigned char *p; p=&vi; *p=*(argptr+1); *(p+1)=*(argptr+2); argptr+=3; rsl(vi); } ans gulong(void) { unsigned long ul; unsigned char *p; p=&ul; *p=*(argptr+1); *(p+1)=*(argptr+2); *(p+2)=*(argptr+3); *(p+3)=*(argptr+4); argptr+=5; rul(ul); //return (ans)(ul); } ans glong(void) { signed long ul; unsigned char *p; p=&ul; *p=*(argptr+1); *(p+1)=*(argptr+2); *(p+2)=*(argptr+3); *(p+3)=*(argptr+4); argptr+=5; rsl(ul); //return (ans)(ul); } ans setgmod(void) { char old_gmode; argptr++; old_gmode=gmode; gmode=getsl; rsl(old_gmode); } void exec_cmd(unsigned char *cmd) { HANDLE handle; int err; TRY push_parse_text (cmd); handle = HS_popEStack (); HeapLock (handle); //car je ne suis pas sur à 100% que HS_popEstack locks le handle (contradiction avec HeapAllocHigh). NG_execute (handle, FALSE); ONERR err=errCode; if(disp_err) { if(ERD_dialog (err, TRUE)) { if(handle) HeapFree (handle); exit2("Exit by pressing ENTER"); } } ENDTRY if(handle) HeapFree (handle); //ans = GetIntArg (top_estack); } ans clscr(void) { //clrscr(); argptr++; FastClearScreen_R(lcdad); MoveTo (0,0); } //(*(fonc[*(argptr)]))(); ans a(void) { printf("\n=========>*arg=%x &%x",*argptr,(int)(argptr-argdep+2)); ngetchx(); exit2("Unknown instruction\nProgram lost."); return (ans)0; } ans lusfunc(void) { argptr+=1; //printf("\nexec:%s",foncs[*argptr]); //rsl((*(fonc[*(argptr)])()).sl); //return (ans)0; } /* ans gpvar(void) { argptr+=2; rpul(&(varlist[*(argptr-1)])); } */ ans neg(void) //correspond au minus_tag { argptr++; rsl(-(getsl)); } ans gslvar(void) //equivalent à rsl(*ptrvar) { argptr+=2; rsl((varlist[*(argptr-1)]).sl); } ans printf1(void) { unsigned char *s; argptr+=1; s=getpuc; printf(s,getsl); rpuc(s); } ans printf2(void) { unsigned char *s; long vaaa,vbbb; argptr+=1; s=getpuc; vaaa=getsl; vbbb=getsl; //printf("\n%lp",&varlist); printf(s,vaaa,vbbb); rpuc(s); } ans LBL(void) { argptr+=3; } ans GOTO(void) { int var; var=*(argptr+2); argptr=arglbl[var]; /*int num_var; argptr++; num_var=*(argptr+1); while(*argptr!=0xE9) { foundarg(0x4);//label printf("Valeur de argptr=%d",*argptr); if(*(argptr+2)==num_var) break; } if(*argptr==0xE9) return; argptr+=3;*/ } ans endtag(void) { argptr++; rsl(1); } ans isz(void) { argptr+=3; rsl((++(varlist[*(argptr-1)]).sl)); } ans dsz(void) { argptr+=3; rsl((--(varlist[*(argptr-1)]).sl)); } ans iff(void) { //unsigned int delta; argptr++; if(getsl) {(*(fonc[*(argptr)]))(); } else { argptr+=(*(unsigned char*)(argptr+2)+255*(*(unsigned char*)(argptr+1))+1); } } ans addd(void) { argptr++; return (ans)((getsl)+(getsl)); } ans sub(void) { long l1; argptr++; l1=getsl; return (ans)((getsl)-l1); } ans mul(void) { argptr++; return (ans)((getsl)*(getsl)); } ans divv(void) { long l1; argptr++; l1=getsl; return (ans)((getsl)/l1); } ans tohandl(void) { unsigned char hnum; ESI arg; HANDLE handle; delete_between (bottom_estack, top_estack); hnum=*(++argptr/*+1*/); //num de la variable argptr+=3; for(arg=argptr/*3*/;argRestore auto int1 { SetIntVec (AUTO_INT_1, save_int_1); save_int_1=NULL; //is useful later //SetIntVec (save_int_1,AUTO_INT_1s); } rsl((long)ngetchx()); } ans xorr(void) { argptr++; return (ans)((getsl)^(getsl)); } ans orl(void) { argptr++; return (ans)((getsl)||(getsl)); } ans orb(void) { argptr++; return (ans)((getsl)|(getsl)); } ans notb(void) { argptr++; rsl(~(getsl)); } ans andl(void) { argptr++; return (ans)((getsl)&&(getsl)); } ans andb(void) { argptr++; return (ans)((getsl)&(getsl)); } ans inf(void) { long l1; argptr++; l1=getsl; return (ans)(l1<(getsl)); } ans infeq(void) { long l1; argptr++; l1=getsl; return (ans)(l1<=(getsl)); } ans eq(void) { long l1; argptr++; l1=getsl; return (ans)(l1==(getsl)); } ans eqs(void) //comparaison de string { unsigned char *s1; argptr++; s1=getpuc; if(strcmp(s1,getpuc)==0) rsl(1); else rsl(0); } ans supeq(void) { long l1; argptr++; l1=getsl; return (ans)(l1>=(getsl)); } ans sup(void) { long l1; argptr++; l1=getsl; return (ans)(l1>(getsl)); } ans noteq(void) { long l1,l2; argptr++; l1=getsl; l2=getsl; return (ans)(l1!=l2); } ans nott(void) { //long l1; argptr++; //if(getsl==0) rsl(1); //else rsl(0); //return (ans)(!(getsl)); rsl(!getsl); } /* ans exitt(void) { argptr++; brkvar=0; }*/ ans ifthen(void) { int var; argptr++; var=*(argptr+1); // if(var==9) {printf("var=9 argptr=%ld,\nargendif[9]=%ld\nargelse[9]=%ld",argptr,argendif[var],argelse[var]); ngetchx();} argptr+=2; if(!(getsl)) argptr=argelse[var]; } ans elsee(void) { // int var; // argptr++; // var=*(argptr+1); argptr=argendif[*(argptr+2)]; // argptr=argendif[var]; } ans endif(void) { argptr+=3; } ans GOTOL(void) { argptr+=*(argptr+1)*255+*(argptr+2)+1; } ans WHILE(void) //while_tag char_num_while condition { int var; argptr+=3; var=*(argptr-1); //numero du while if(!(getsl)) { argptr=argendwhile[var]; } } ans EDWHILE(void) { int var; ESI tmpesi; argptr+=3; var=*(argptr-1); tmpesi=argptr; argptr=argwhile[var]+3; if(!(getsl)) { argptr=tmpesi; } } ans nop(void) { argptr++; } ans mallo(void) { //unsigned int l; unsigned char *ptr; argptr++; //l=getsl; ptr=(unsigned char*)malloc(getsl); if(ptr==0) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Malloc():Exit by pressing ENTER"); } } rsl(0); } rpuc(ptr); } ans fre(void) { unsigned char *p; argptr++; p=getpuc; //p=getsl; if(p==0) exit2("Error: free(ptr)\nptr shall be not NULL"); //printf("Avant free"); ngetchx(); free(p); //printf("Apres free"); ngetchx(); } ans pokb(void) //pokb(address,val) { char *p; //char b; argptr++; p=getpuc; *(p)=getsl; rsl(*p); } ans pokw(void) { int *p; //int b; argptr++; p=getpui; *(p)=getsl; rsl(*p); } ans pokl(void) { long *p; //long b; argptr++; p=getpul; *(p)=getsl; rsl(*p); } ans pekb(void) { char *p; argptr++; p=getpuc; rsl(*p); } ans pekw(void) { int *p; argptr++; p=getpui; rsl(*p); } ans pekl(void) { long *p; argptr++; p=getpul; rsl(*p); } ans repeat(void) { register long i,nb; ESI arg; argptr++; nb=getsl; arg=argptr; for(i=0;i HeapSize(h) - 10) { clrscr(); printf("Error when writing a char in a file."); return 0;} *(unsigned short*)base = len + 1; return base[len+2] = c; } ans printc(void) { unsigned char c; argptr++; c=getsl; printf("%c",c); } ans gts(void) { char *buff; argptr++; buff=getpuc; rpuc(gets(buff)); } ans sprntf(void) { char *buff,*strr; long arg; argptr++; buff=getpuc; strr=getpuc; arg=getsl; rpuc(sprintf(buff,strr,arg)); } ans chars(void) { static unsigned char c_str[]={0,0,0,0,0,0,0,0,0,0},index_in_c_str; //jusqu'à 5 string possible de retour //ESI argptrr; argptr++; if(index_in_c_str!=8) index_in_c_str+=2; else index_in_c_str=0; //argptrr=argptr; //argptr+=2; c_str[index_in_c_str]=getsl; //c_str[index_in_c_str+1]=0; rpuc(&c_str[index_in_c_str]); } ans strct(void) { char *d,*s; argptr++; d=getpuc; s=getpuc; rpuc(strcat(d,s)); } void __attribute__((__stkparm__)) ScaleSprite8_OR(unsigned char *sprite,void *dest,short x0,short y0,short sizex,short sizey) { short dx,dy; unsigned char maskorig,mask; unsigned char masksrc; char *tmpdest; (unsigned char *)dest+=((((y0)+(y0))<<4)-((y0)+(y0)))+((x0)>>3); maskorig=(0x80)>>(x0&7); dy=8/1-sizey; for(y0=sizey;y0--;) { if(dy>=0) { do { dy-=sizey, sprite++; } while(dy>0); } tmpdest=dest; masksrc=0x80; mask=maskorig; dx=8/1-sizex; for(x0=sizex;x0--;) { if(dx>=0) { do { dx-=sizex; masksrc>>=1; } while(dx>0); } if(*sprite & masksrc) { *tmpdest |= mask; } asm("ror.b #1,%0;bcc.s 0f;addq.l #1,%1;0:":"=d" (mask),"=g" (tmpdest):"0"(mask),"1"(tmpdest)); dx+=8; } (unsigned char *)dest+=30; dy+=8; } } ans sprt8(void) //Transformed in clipped { signed int x,y,h; unsigned char *sprite/*,i,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; switch(gmode) { case 2: //xor ClipSprite8_XOR_R(x,y,h,sprite,lcdad); return; break; case 3: //AND ClipSprite8_AND_R(x,y,h,sprite,lcdad); return; break; case 0: //or ClipSprite8_OR_R(x,y,h,sprite,lcdad); return; break; case 1: //blank ClipSprite8_RPLC_R(x,y,h,sprite,lcdad); return; break; } } /*void Sprite8_extgraph(unsigned char x,unsigned char y,unsigned int h,unsigned char *sprite,unsigned char mode) { switch(mode) { case 0: //or Sprite8_OR(x,y,h,sprite,lcdad); return; break; case 1: //blank Sprite8_RPLC_R(x,y,h,sprite,lcdad); return; break; case 2: //xor Sprite8_XOR(x,y,h,sprite,lcdad); return; break; case 3: //AND Sprite8_AND(x,y,h,sprite,lcdad); return; break; }*/ ans gsprt8(void) { signed int x,y,h; unsigned char *sprite/*,i,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; ClipSprite8Get_R(x,y,h,sprite,lcdad); } ans sprt16(void) { short x,y,h; // unsigned char i; unsigned int *sprite/*,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; //video_mem=getsl; switch(gmode) { case 2: //xor ClipSprite16_XOR_R(x,y,h,sprite,lcdad); return; break; case 3: //AND ClipSprite16_AND_R(x,y,h,sprite,lcdad); return; break; case 0: //or ClipSprite16_OR_R(x,y,h,sprite,lcdad); return; break; case 1: //blank ClipSprite16_RPLC_R(x,y,h,sprite,lcdad); return; break; } rpuc(sprite); } ans gsprt16(void) { short x,y,h; // unsigned char i; unsigned int *sprite/*,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; ClipSprite16Get_R(x,y,h,sprite,lcdad); rpuc(sprite); } ans sprt32(void) { short x,y,h; // unsigned char i; unsigned long *sprite/*,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; //video_mem=getsl; switch(gmode) { case 2: //xor ClipSprite32_XOR_R(x,y,h,sprite,lcdad); return; break; case 3: //AND ClipSprite32_AND_R(x,y,h,sprite,lcdad); return; break; case 0: //or ClipSprite32_OR_R(x,y,h,sprite,lcdad); return; break; case 1: //blank ClipSprite32_RPLC_R(x,y,h,sprite,lcdad); return; break; } rpuc(sprite); } ans gsprt32(void) { short x,y,h; // unsigned char i; unsigned long *sprite/*,shiftsprt[1]*/; //void *video_mem; argptr++; x=getsl; y=getsl; h=getsl; sprite=getpuc; ClipSprite32Get_R(x,y,h,sprite,lcdad); } ans mmset(void) { char *buff; short val; unsigned int num; argptr++; buff=getpuc; val=getsl; num=getsl; rpuc(memset(buff,val,num)); } ans map(void) { unsigned char varnum; long st,en,ste,*p; ESI argdeb; argptr++; varnum=*(argptr+1); p=&varlist[varnum]; argptr+=2; st=getsl; en=getsl; ste=getsl; //printf("DANS MAP st=%ld en=%ld ste=%ld ",st,en,ste); argdeb=argptr; for(*p=st;*p!=en;*p+=ste) { (*(fonc[*(argptr)]))(); //printf("\ncoucou"); argptr=argdeb; } return ((*(fonc[*(argptr)]))()); } ans multi(void) { int n,i; //nombre de lignes argptr++; n=getsl; for(i=1;i>n); } ans tios(void) { HANDLE handle; unsigned char *str; int err; argptr++; str=getpuc; push_parse_text (str); TRY handle = HS_popEStack (); ONERR if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { if(handle) HeapFree (handle); exit2("os():Exit by pressing ENTER"); } } rsl(0); ENDTRY TRY NG_execute (handle, FALSE); ONERR err=errCode; if(disp_err) { if(ERD_dialog (err, TRUE)) { if(handle) HeapFree (handle); exit2("os():Exit by pressing ENTER"); } } rsl(0); ENDTRY if(handle) HeapFree (handle); switch(GetArgType(top_estack)) { case NEGINT_TAG: rsl(-GetIntArg(top_estack)); break; case POSINT_TAG: rsl(GetIntArg(top_estack)); break; case STR_TAG: rsl(GetStrnArg(top_estack)); break; case LIST_TAG: exit2("\nos() cannot return list"); break; case FLOAT_TAG: rsl((signed long)GetFloatArg (top_estack)); break; //en supposant ci dessous que c'est un négatif (MINUS -) } } ans fc_debug(void) //execute une fonction : f(nom_var_fonction,arg1,arg2,...) TAG: 0d153,getsl : nb arg , newprog_function_id, arg1,arg2,... en mode debug { unsigned char nf/*,nbarg*/,ii,nb_arg; ESI argptrf,argptr_return,argptr_temp; argptr++; nf=*(argptr+1); argptr+=2; //pointe sur la valeur à évaluer du premier argument //Backup global variables nb_arg=user_func_nb_arg[nf]; for(ii=0;ii(LCD_SIZE+100)) {CloseFile_type (handle,STR_TAG); exit2("Toos():destination file size >3940");} //On met le contenu du stack dans le fichier de destination, la liste sera dans le bon ordre: AppendCharToFile(handle,END_TAG); for(ii=0;ii peut alors paraitre seulement comme une simple différence d'écriture dest_file=getpuc; //printf("Dans toos, Heapmax()=%ld",HeapMax ()); ngetchx(); //handle = CreateFile (dest_file); handle=CreateFile_with_specified_size(dest_file,LCD_SIZE+100); //taille max pour toos() qui est arbitraire mais qui devrait convenir dans la majorité des cas if(handle==H_NULL) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Toos():Exit by pressing ENTER"); } } rsl(0); } switch(*argptr) { case 14: //indirection argptr++; p_eval=getpuc; if(*p_eval==216 && *(p_eval+1)==31 && *(p_eval+4)==1) //alors c'est un pointeur de nilist { argptr_temp=argptr; argptr=p_eval; //saute à la nilist value=toos_nilist_process(handle); argptr=argptr_temp; //retourne au PC intial rsl(value); } //si pas pointeur sur nilist, alors c'est un pointeur sur string AppendCharToFile(handle,0); AppendBlockToFile (handle, p_eval, strlen(p_eval)+1); CloseFile_type (handle,STR_TAG); rsl(1); break; case STR_TAG: p_eval=getpuc; str_len_temp=strlen(p_eval); if(str_len_temp>(LCD_SIZE+100-4)) {CloseFile_type (handle,STR_TAG); exit2("Toos():destination file size >3940");} AppendCharToFile(handle,0); AppendBlockToFile (handle, p_eval, strlen(p_eval)+1); CloseFile_type (handle,STR_TAG); rsl(1); break; //CAS DES NILIST case 216: //nilist rsl(toos_nilist_process(handle)); break; //FIN DU CAS DES NILIST } //Si ce n'est pas une string ou une nilist ou une indirection, alors ça ne peut être que des nombres de diverses natures value=getsl; st_bot=top_estack+1; push_longint (value); while(st_bot!=(top_estack+1)) { AppendCharToFile(handle,*st_bot); st_bot++; } delete_expression (top_estack); //supprime l'élément rajouté sur le stack, ne servant plus //Effectue un closefile simple: if(handle) HeapUnlock (handle); if(handle) HeapRealloc (handle, *(unsigned short*)HeapDeref(handle) + 3); rsl(1); } ans sto(void) { char nvarr; long f; unsigned int elem_index; argptr++; switch(*argptr) { case 0x02: //gslvar tag. The destination is a var argptr+=2; //point to the value to store //nvarr=*(argptr-1); //printf("dim elem array%d",byte_width_ilist[nvarr]); //ngetchx(); // f=getsl; varlist[/*nvarr*/*(argptr-1)].sl=getsl; rsl(f); break; case SUBSCRIPT_TAG: //the destination in an element of a list argptr+=3; nvarr=*(argptr-1); //number of the list/var elem_index=getsl; //elem_index of the list f=getsl; //value to store switch(byte_width_ilist[nvarr]) { case 4: if(varlist[nvarr].sl!=0) (varlist[nvarr].psl)[elem_index]=f; rsl(f); break; case 1: if(varlist[nvarr].sl!=0) (varlist[nvarr].psc)[elem_index]=f; rsl(f); break; case 2: if(varlist[nvarr].sl!=0) (varlist[nvarr].psi)[elem_index]=f; rsl(f); break; } if(varlist[nvarr].sl!=0) memcpy((varlist[nvarr].psc)+elem_index*byte_width_ilist[nvarr],f,byte_width_ilist[nvarr]); rsl(f); break; case 96: //osvar() : the destination is a Tios var ; revient à faire un toos() return toos(); break; } rsl(f); } ans prints(void) { argptr++; printf("%s",getpuc); } ans when(void) { long /*cond,*/num; int i; ans anss; argptr++; if(getsl) { if(*argptr!=216) exit2("Syntax : \nwhen(condition,\n{instructions if true},\n{instructions if false})"); argptr++; //ce if ne doit pas contenir une instruction d'une taille supérieure à 255 octets getsl; num=getsl; for(i=0;ihandle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } plen = *(short*)(cptr) + 3; if (SymPtr->flags.bits.archived) { if (!(cptr = malloc (plen))) { if (h) HeapUnlock (h); exit2("Out of memory to load asm"); } memcpy (cptr, fptr, plen); } if(!(fileptr=malloc(sizeof(File)))) { if (h) HeapUnlock (h); if (cptr != fptr) free (cptr); exit2("Memory error in loadasm"); } enter_ghost_space (); EX_patch (cptr + 0x40002, cptr + plen + 0x3FFFE); fileptr->fptr=fptr; fileptr->cptr=cptr; fileptr->plen=plen; fileptr->h=h; rsl(fileptr); } ans execasm(void) { File *fileptr; argptr++; fileptr=getpuc; //printf("\nDans execasm = %ld",(unsigned long)fileptr); ngetchx(); ASM_call (fileptr->cptr + 0x40002); } ans closeasm(void) { File *fileptr; argptr++; fileptr=getpuc; if (fileptr->h) HeapUnlock (fileptr->h); if (fileptr->cptr != fileptr->fptr) free (fileptr->cptr); free(fileptr); } ans strcmpp(void) { char *s1,*s2; argptr++; s1=getpuc; s2=getpuc; rsl(strcmp(s1,s2)); } ans strcpyy(void) { char *dest,*source; argptr++; dest=getpuc; source=getpuc; rsl(strcpy(dest,source)); } ans svscroff(void) { argptr++; sv_scr_on=0; if(screen_buffer!=NULL) free(screen_buffer); //printf("Coucoulléllé"); ngetchx(); } ans memcpyy(void) { unsigned char *destt,*srcc,quotient; unsigned int lenn; argptr++; destt=getpuc; srcc=getpuc; lenn=getsl; /* if((quotient=((lenn-1)/384))) //Is lenn>=385 ? { if((!((unsigned long)(srcc)%2) && (!((unsigned long)(destt)%2)))) //Are they both even address ? { //Yes Fastmemcpy(srcc,destt,quotient-1); //Fast copy assembly routine if(lenn%2) *(destt+lenn-1)=*(srcc+lenn-1); rpuc(destt); } //printf("Here memcpy"); ngetchx(); }*/ rpuc(memcpy(destt,srcc,lenn)); //if lenn<385, common memcpy function will be used // Fastmemcpy(src,dest,nbloop) __attribute__((__stkparm__)); // C prototype Function written by me //memcpy(destt,srcc,lenn); //printf("Premiers bytes\norigine : %d\ncopier : %d",*srcc,*destt); ngetchx(); } ans memmov(void) { unsigned char *destt,*srcc; unsigned int lenn; argptr++; destt=getpuc; srcc=getpuc; lenn=getsl; rsl(memmove(destt,srcc,lenn)); } ans randd(void) { unsigned int rangee,rr; argptr++; rangee=getsl; rr=random(rangee); rsl(rr); } ans escc(void) { argptr++; if(_keytest(RR_ESC)&_keytest(RR_ESC)) { rsl(1); } else rsl(0); //rsl((_rowread(~0b1000000) & _rowread(~0b1000000) & 0b1)); } ans up(void) { argptr++; if(_keytest(RR_UP)&_keytest(RR_UP)) { rsl(1); } else rsl(0); } ans down(void) { argptr++; if(_keytest(RR_DOWN)&_keytest(RR_DOWN)) { rsl(1); } else rsl(0); } ans left(void) { argptr++; if(_keytest(RR_LEFT)&_keytest(RR_LEFT)) { rsl(1); } else rsl(0); } ans right(void) { argptr++; if(_keytest(RR_RIGHT)&_keytest(RR_RIGHT)) { rsl(1); } else rsl(0); } ans second(void) { argptr++; if(_keytest(RR_2ND)&_keytest(RR_2ND)) { rsl(1); } else rsl(0); } ans majj(void) { argptr++; if(_keytest(RR_SHIFT)&_keytest(RR_SHIFT)) { rsl(1); } else rsl(0); } ans diamond(void) { argptr++; if(_keytest(RR_DIAMOND)&_keytest(RR_DIAMOND)) { rsl(1); } else rsl(0); } ans alpha(void) { argptr++; if(_keytest(RR_ALPHA)&_keytest(RR_ALPHA)) { rsl(1); } else rsl(0); } ans gkey(void) { unsigned short key; argptr++; if (!OSdequeue (&key, kbq)) { rsl(key); } rsl(0); } ans keydlay(void) { unsigned int vv; argptr++; vv=getsl; rsl(OSInitKeyInitDelay (vv)); } ans keysped(void) { unsigned int vv; argptr++; vv=getsl; rsl(OSInitBetweenKeyDelay (vv)); } ans llelem(void) //load a list element { unsigned char varnnn; unsigned int nelemm; argptr+=2; varnnn=*argptr; argptr++; nelemm=getsl; //printf("Byte width%d\nvarnn %d ; elem=%d",byte_width_ilist[varnnn],varnnn,nelemm); ngetchx(); switch(byte_width_ilist[varnnn]) { case 1: rsl(((varlist[varnnn]).psc)[nelemm]); break; case 2: rsl(((varlist[varnnn]).psi)[nelemm]); break; case 4: //printf("val[]=%ld",((varlist[varnnn]).psl)[nelemm]); ngetchx(); rsl(((varlist[varnnn]).psl)[nelemm]); break; //case 10: //for file and rep list, functions files and reps. Return a pointer. //rpuc(((varlist[varnnn]).puc)+nelemm*10); //break; //exit2("\nError in var[] function"); } rpuc(((varlist[varnnn]).puc)+nelemm*byte_width_ilist[varnnn]); //printf("Dans llelem%d",nelemm); ngetchx(); } ans gsprt(void) //syntax : gsprt(pixel_width,num_line,"pic_var",sprt_var) { unsigned char rval,cval,sprt_dest,iii; char *picvar; unsigned char *sprtt; //Files *fpic; unsigned char *pic_cptr; argptr++; cval=getsl; //number of columns in byte (8,16 ot 32 only) rval=getsl; //number of rows from 1 to TBD sprtt=malloc(cval*rval); if(!sprtt) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("gsprt():Exit by pressing ENTER"); } } rsl(0); } //if(sprtt==NULL) exit2("\nMemory Error in gsprt()"); if(*argptr!=STR_TAG) exit2("\ngsprt() syntax :\ngsprt(pixel_width,num_line,\n\"pic_var\",sprt_var)"); picvar=getpuc; if(*argptr!=2) exit2("\ngsprt() syntax :\ngsprt(pixel_width,num_line,\n\"pic_var\",sprt_var)"); sprt_dest=*(argptr+1); argptr+=2; varlist[sprt_dest]=(ans)sprtt; if(sprtt==0) rsl(0); //fpic=OpenFile(picvar); pic_cptr=OpenFile(picvar); if(pic_cptr==0) exit2("\ngsprt() syntax :\ngsprt(pixel_width,num_line,\n\"pic_var\",sprt_var)"); switch(cval) //Allow the user to use the [] { case 1: case 8: byte_width_ilist[sprt_dest]=1; for(iii=0;iii4) goto savescr_error; ptrrr=scr_copy[indexx]; } else { if(indexx>4) goto savescr_error; scr_copy[indexx]=(ptrrr=malloc(LCD_SIZE)); //If there is not yet a saved screen is this slot //if(!ptrrr) exit2("\nNot enough memory\n for saving screen."); if(!ptrrr) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Savescr():Exit by pressing ENTER"); } } rsl(0); } } FastCopyScreen(lcdad,ptrrr); rsl(ptrrr); savescr_error: exit2("\nsavescr function,\nMaximum of 4 saved screens\nare allowed.\nOut of range : [0,3]."); /* for(ii=0;ii<(LCD_SIZE/4);ii++) //copy l'écran { ptrrr[ii]=lcdaddd[ii]; } */ } ans loadscr(void) { unsigned char indexx; // int ii; long *ptrrr/*,*lcdaddd*/; argptr++; //lcdaddd=lcdad; indexx=getsl; if(indexx>4) exit2("\nsavescr function,\nMaximum of 4 saved screens\nare allowed.\nOut of range : [0,3]."); ptrrr=scr_copy[indexx]; if(ptrrr) { FastCopyScreen(ptrrr,lcdad); } rsl(ptrrr); } ans newline(void) { argptr++; printf("\n"); } ans files(void) { int counter; SYM_ENTRY *SymPtr; unsigned char *rep,*names,vardest; argptr++; rep=getpuc; if(*argptr!=2) exit2("Format error : files(rep_str,var_dest)"); vardest=*(argptr+1); byte_width_ilist[vardest]=10; names=malloc(500); if(!names) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Reps():Exit by pressing ENTER"); } } rsl(0); } counter=0; //*(unsigned int*)names=counter; SymPtr = SymFindFirst (SYMSTR (rep), FO_SINGLE_FOLDER); while (SymPtr) { /**(unsigned int*)names=*/++counter; //les 4 premiers octets indique le nombre de fichiers if(counter>=98) {exit2("Too much files in repertory (98 max)"); break;} //printf(" %s",SymPtr->name); strcpy (names + (counter-1)*10, SymPtr->name); SymPtr = SymFindNext (); } strcpy (names + (counter)*10, "0"); //A termination tag, not necessary because this function returns the number of fille contained in the rep names=realloc(names, (counter+1)*10); (varlist[vardest].puc)=names; rsl(counter); } ans reps(void) { int counter; SYM_ENTRY *SymPtr; unsigned char *rep,*names,vardest; argptr++; //rep=getpuc; if(*argptr!=2) exit2("Format error : reps(rep_str,var_dest)"); vardest=*(argptr+1); byte_width_ilist[vardest]=10; names=malloc(500); if(!names) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Reps():Exit by pressing ENTER"); } } rsl(0); } counter=0; //*(unsigned int*)names=counter; SymPtr = SymFindFirst (NULL, 0); while (SymPtr) { /**(unsigned int*)names=*/++counter; //les 4 premiers octets indique le nombre de fichiers if(counter>=98) {exit2("Too much reps (98 max)"); break;} //printf(" %s",SymPtr->name); if(strcmp(SymPtr->name,"0001")==0) SymPtr = SymFindNext (); strcpy (names + (counter-1)*10, SymPtr->name); SymPtr = SymFindNext (); } //names=realloc(names, 2 + (counter-1)*10 + 10); strcpy (names + (counter)*10, "0"); //A termination tag, not necessary because this function returns the number of fille contained in the rep names=realloc(names, (counter+1)*10); //ne devrait pas retourner d'erreur car sera plus petit que l'original (varlist[vardest].puc)=names; rsl(counter); } void pass_block(void) //De préférence, utiliser la macro PASS_BLOCK car plus rapide en macro qu'en fonction { /*ESI argptrend; argptr++; argptrend=argyblock[*(argptr+1)]-4; while(argptr<=argptrend) (*(fonc[*(argptr)]))();*/ argptr=argyblock[*(argptr+2)]; //passe le block } ans xb(void) { ESI argptrend,esi_deb; ans rr; argptr+=3; esi_deb=argptr; //nécessaire pour vérifier que l'on est toujours dans le bloc. Préviens des problèmes avec des sauts avec goto par exemple. argptrend=argyblock[*(argptr-1)]-3; // printf("Y num=%d",*(argptr+2)); while(argptr>= esi_deb && argptr10) exit2("In open() : Too much element in nilist"); for(ii=0;ii2)) stringg_return[0]++; else stringg_return[0]=0; sprintf(stringg_return+stringg_return[0]*12+1,"%ld",getpuc); rpuc(stringg_return+stringg_return[0]*12+1); } ans lscroll4(void) { unsigned char nbline,i,temp1; unsigned char *lcdad_temp; register unsigned char decal; unsigned long templ,andvl; unsigned int andvi; argptr++; nbline=getsl; decal=getsl; andvl=0b11111111111111111111111111111111; andvi=0b1111111111111111; andvl=~(andvl>>decal); //mask andvi=~(andvi>>decal); //mask temp1=32-decal; for(i=0;i<=nbline;i++) { lcdad_temp=lcdad+30*i; *(unsigned long*)(lcdad_temp)=(((*(unsigned long*)(lcdad_temp))<>(temp1)); *(unsigned long*)(lcdad_temp+4)=(((*(unsigned long*)(lcdad_temp+4))<>(temp1)); *(unsigned long*)(lcdad_temp+8)=(((*(unsigned long*)(lcdad_temp+8))<>(temp1)); *(unsigned long*)(lcdad_temp+12)=(((*(unsigned long*)(lcdad_temp+12))<>(temp1)); *(unsigned long*)(lcdad_temp+16)=(((*(unsigned long*)(lcdad_temp+16))<>(temp1)); *(unsigned long*)(lcdad_temp+20)=(((*(unsigned long*)(lcdad_temp+20))<>(temp1)); *(unsigned long*)(lcdad_temp+24)=(((*(unsigned long*)(lcdad_temp+24))<>(temp1)); *(unsigned int*)(lcdad_temp+28)<<=decal; } } ans b(void) //skip the b block { unsigned char var; ESI argptr_return; unsigned int nbelemm; argptr+=3; var=*(argptr-1); nbelemm=getsl; // printf("*argptr=%d",*argptr); ngetchx(); //if(*argptr==0xE5) argptr++; //in the case of an not even adress if(((unsigned long)argptr%2)==1) argptr++; varlist[var].sl=argptr; argptr_return=argptr; argptr+=nbelemm; //skip the data and the y rpuc(argptr_return); } ans w(void) { unsigned char var; ESI argptr_return; unsigned int nbelemm; argptr+=3; var=*(argptr-1); nbelemm=getsl; if(((unsigned long)argptr%2)==1) argptr++; //in the case of an not even adress varlist[var].sl=argptr; argptr_return=argptr; argptr+=nbelemm*2; //skip the y rpuc(argptr_return); } ans l(void) { unsigned char var; ESI argptr_return; unsigned int nbelemm; argptr+=3; var=*(argptr-1); nbelemm=getsl; if(((unsigned long)argptr%2)==1) argptr++; //in the case of an not even adress varlist[var].sl=argptr; argptr_return=argptr; argptr+=nbelemm*4; //skip the y //printf("%ld",argptr_return);ngetchx(); rpuc(argptr_return); //printf("*(argptr-1) %d",*(argptr-1)); ngetchx(); } ans prettyxy(void) //Syntax prettyxy, { unsigned char xxx,yyy,*expr_str; argptr++; xxx=getsl; yyy=getsl; expr_str=getpuc; TRY //reset_control_flags(); push_parse_text (expr_str); NG_rationalESI (top_estack); //WinClr (&wind); Print2DExpr (Parse2DExpr (top_estack, FALSE), &wind, xxx, yyy); //reset_control_flags(); rsl(1); ONERR rsl(0); ENDTRY } ans getwbt(void) { unsigned char ww,bb,tt,*expr_str; short wp,bp,tp; argptr++; expr_str=getpuc; if(*(argptr)!=2 || *(argptr+2)!=2 || *(argptr+4)!=2) exit2("Syntax : getwbt(wide_var,\nbottom_var,top_var,expr_ptr)"); ww=*(argptr+1); bb=*(argptr+3); tt=*(argptr+5); argptr+=6; //expr_str=getpuc; TRY //reset_control_flags(); push_parse_text (expr_str); //NG_rationalESI (top_estack); //WinClr (&wind); Parse2DExpr (top_estack, FALSE); Parms2D (top_estack, &wp, &bp, &tp); varlist[ww].sl=wp; varlist[bb].sl=bp; varlist[tt].sl=tp; //Print2DExpr (Parse2DExpr (top_estack, FALSE), &wind, xxx, yyy); rsl(1); ONERR rsl(0); ENDTRY } ans cwidth(void) { argptr++; rsl(FontCharWidth (getsl)); } ans settype(void) { unsigned char old_ttyyppee,var; unsigned int ttyyppee; argptr+=3; var=*(argptr-1); //ttyyppee=getsl; old_ttyyppee=byte_width_ilist[var]; ttyyppee=getsl; //printf("La var num %d, data_size (tpe)=%d 1",var,ttyyppee); ngetchx(); if(ttyyppee==0) { //nop } else { //printf("La var num %d, data_size (tpe)=%d 2",var,ttyyppee); ngetchx(); byte_width_ilist[var]=ttyyppee; } rsl(old_ttyyppee); } ans movto(void) { unsigned int xx; argptr++; xx=getsl; MoveTo(xx,getsl); } ans pause(void) { argptr++; printf("\n%s\n",getpuc); if(save_int_1) //for avoiding crash with keyclear()=>Restore auto int1 { SetIntVec (AUTO_INT_1, save_int_1); save_int_1=NULL; //is useful later } rsl(ngetchx()); } ans seqs(void) { unsigned char var,*tivar,*p_expr,*p_eval; long strt,endd,stepp; unsigned int ii,nbelem,data_dim; HANDLE handle; //ESI sp1; argptr++; data_dim=4; //comprend les tag et les octets de la taille en mémoire if(*argptr!=2) exit2("Syntax : seqs(var,start,\nend,step,var_dest_str,string_ptr"); var=*(argptr+1); argptr+=2; strt=getsl; endd=getsl; stepp=getsl; tivar=getpuc; p_expr=argptr; nbelem=0; for(varlist[var].sl=strt; varlist[var].sl<=endd; varlist[var].sl+=stepp) { p_eval=getpuc; //string à copier dans le fichier data_dim+=(strlen(p_eval)+3); argptr=p_expr; push_zstr (p_eval); nbelem++; } handle = CreateFile_with_specified_size (tivar,data_dim+10); //+10 étant une marge d'erreur éventuelle if(!handle) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Seqs():Exit by pressing ENTER"); } } rsl(0); } AppendCharToFile(handle,END_TAG); //for inverting list for(ii=0;iibase)+srcsize+1-6)); ngetchx(); SymPtr = DerefSym (SymFind (SYMSTR (sub_npp_str))); if (!SymPtr) exit2("NPP file not found"); h = SymPtr->handle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } sub_plen = *(short*)(cptr) + 3; if (SymPtr->flags.bits.archived) { if (!(cptr = malloc (sub_plen))) { if (h) HeapUnlock (h); exit2("Out of memory to load NPP"); } memcpy (cptr, fptr, sub_plen); } sub_srcsize=*(unsigned int*)(cptr); //srcsize=size of data without first two bytes sub_nb_def_fonc=*(cptr+sub_srcsize+1-8); sub_nb_var=*(cptr+sub_srcsize+1-7); //clrscr(); printf("sub NPP nb var %d",sub_nb_var); ngetchx(); argptr=cptr+2; //jumps to the subfunction main_varlist_ptr=varlist; //sub_varlist_ptr=&(varlist[nbvar_main]); varlist=&(varlist[nbvar_main]); while(argptr<(cptr+sub_srcsize)) { //(*(fonc[*(argptr)]))(); printf("\n*argptr=%x &=%x %s",*argptr,(int)(argptr-argdep+2),foncs[*argptr]); ngetchx(); (*(fonc[*(argptr)]))(); } argptr=saved_main_argptr; //restore main PC varlist=main_varlist_ptr; //state_copy=save_main_npp_state(sub_nb_var,sub_nb_def_fonc); //Close the file if (h) HeapUnlock (h); if (cptr != fptr) free (cptr); } ans sprt82(void) //print a sprite and return if there is a collision detected : no display if collision { unsigned char gsprite_buf[128],*sprite,rr; short x,y,ii; unsigned int height; argptr++; x=getsl; y=getsl; height=getsl; sprite=getpuc; ClipSprite8Get_R(x,y,height,gsprite_buf,lcdad); //if(!memcmp (sprite, gsprite_buf, height)) rsl(1); //else rr=0; for(ii=0;ii>16)|(0b11111111&gsprite_buf[ii])); //prend que les coins rpuc(sprt2_return); } } //video_mem=getsl; switch(gmode) { case 2: //xor ClipSprite32_XOR_R(x,y,height,sprite,lcdad); rsl(0); break; case 3: //AND ClipSprite32_AND_R(x,y,height,sprite,lcdad); rsl(0); break; case 0: //or ClipSprite32_OR_R(x,y,height,sprite,lcdad); rsl(0); break; case 1: //blank ClipSprite32_RPLC_R(x,y,height,sprite,lcdad); rsl(0); break; } rsl(0); } ans next(void) { long _lim,_step; unsigned char _nefor,_vdest; //argptr+=3; //pointe sur l'identifiant de la boucle for ou while ESI tmp_esi; argptr+=5; if(*(argptr-3)==1) //for loop { //printf("c'est un for"); ngetchx(); //argptr+=3; _nefor=*(argptr-1);//identifiant de la boucle for endfor // printf("Dans Endfor : Identifiant boucle : %d",_nefor); ngetchx(); _vdest=varnfor[_nefor]; //La variable à faire évoluer //tmpesi=argptr; //sauvegarde du PC // printf("\nDans endfor0 : *argptr=%d et argptr=%lp",*(char*)argptr,argptr); ngetchx(); argptr=argfor[_nefor]; //saute au for pour lire la limite et le pas //printf("\nDans endfor1 : *argptr=%d et argptr=%lp",*(char*)argptr,argptr); ngetchx(); _lim=getsl; // printf("Valeur limite : %ld",_lim); ngetchx(); // printf("\nDans endfor2 : *argptr=%ld et argptr=%lp",*argptr,argptr); ngetchx(); _step=getsl; // printf("\nDans endfor2-2 : *argptr=%ld et argptr=%lp",*argptr,argptr); ngetchx(); if((varlist[_vdest].sl/*+_step*/)!=_lim) { // printf("condition de fin non atteinte"); ngetchx(); varlist[_vdest].sl+=_step; } else argptr=argendfor[_nefor]; //retourne à l'endroit du endfor et sort de la boucle, la condition de fin étant atteinte } else //while loop { //printf("c'est un while"); ngetchx(); //var=*(argptr+1); argptr=argwhile[*(argptr-1)]; } } ans breakk(void) { argptr+=5; if(*(argptr-3)==1) //for loop { argptr=argendfor[*(argptr-1)]; //retourne à l'endroit du endfor et sort de la boucle, la condition de fin étant atteinte } else //while loop { argptr=argendwhile[*(argptr-1)]; } } ans offf(void) { argptr++; off(); } ans drawpic(void) { short x,y; char *pic_name,gmode2; char *fptr, *cptr; SYM_ENTRY *SymPtr; HANDLE h; argptr++; x=getsl; y=getsl; pic_name=getpuc; SCR_RECT full_screen = {{0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1}}; SymPtr = DerefSym (SymFind (SYMSTR (pic_name))); if (!SymPtr) { rsl(0);} h = SymPtr->handle; if (HeapGetLock (h)) //si archivé { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } switch(gmode) { case 2: //xor gmode2=A_XOR; break; case 3: //AND gmode2=A_AND; break; case 0: //or gmode2=A_OR; break; case 1: //blank gmode2=A_REPLACE; break; } BitmapPut (x, y, cptr+2, &full_screen, gmode2); if (h) HeapUnlock (h); rsl(1); } ans getpic(void) { SCR_RECT rect; unsigned char bmp[LCD_SIZE+4],*tivar_str; short bmp_size; HANDLE handle; argptr++; rect.xy.x0=getsl; rect.xy.y0=getsl; rect.xy.x1=getsl; rect.xy.x1=getsl; if(*argptr!=45) exit2("Syntax:getpic(x1,y1,x2,y2,dest_str"); tivar_str=getpuc; bmp_size=BitmapSize (&rect); BitmapGet (&rect, bmp); handle = CreateFile_with_specified_size (tivar_str,bmp_size+5); //2 de marge if(!handle) { if(disp_err) { if(ERD_dialog (ER_MEMORY, TRUE)) { exit2("Seqs():Exit by pressing ENTER"); } } rsl(0); } AppendBlockToFile2 (handle, bmp, bmp_size); CloseFile_type (handle,0xDF); rsl(bmp_size+3); } ans osvar(void) //cette fonction marche, mais pourterai un intérêt si seulement elle serait très évoluée. Je n'ai pas envie de remettre en cause profondémenet le code source pour le momment { char *var_name; unsigned char *fptr, *cptr,*lptr; long rval; SYM_ENTRY *SymPtr; HANDLE h; argptr++; rval=0; var_name=getpuc; SymPtr = DerefSym (SymFind (SYMSTR (var_name))); if (!SymPtr) { rsl(0);} h = SymPtr->handle; lptr=HToESI (h); switch(*lptr) { case POSINT_TAG: rval=GetIntArg (lptr); rsl(rval); break; case NEGINT_TAG: rval=-GetIntArg (lptr); rsl(rval); break; case STR_TAG: rval=GetStrnArg (lptr); rsl(rval); break; case FLOAT_TAG: rsl((signed long)GetFloatArg (lptr)); break; } exit2("In osvar(var_str)\nUnknown type"); } ans isarchi(void) { unsigned char *var_name; SYM_ENTRY *SymPtr; argptr++; var_name=getpuc; SymPtr = DerefSym (SymFind (SYMSTR (var_name))); if (!SymPtr) { rsl(-1);} rsl(SymPtr->flags.bits.archived); } ans archiv(void) { unsigned int nbvar,ii; unsigned char CESI_list[30],*var_name; argptr++; nbvar=getsl; //printf("nbvar %d",nbvar); ngetchx(); CESI_list[0]=END_TAG; CESI_list[1]=0; TRY for(ii=0;ii0 && val<=255) rsl(val); //nombre positif inférieur à 255 (ou plutot à environ 127) // if(val>0 && val>255) rsl(255); //nombre positif mais supérieur à 255 rsl(getsl&0b011111111); } ans unsigw(void) { argptr++; rsl(getsl&0b01111111111111111); } ans memch(void) { unsigned char *str; short c; unsigned long len; argptr++; str=getpuc; c=getsl; len=getsl; rpuc(memchr (str,c,len)); } ans textt(void) { unsigned char *str,len,CESI_list[50]; argptr++; CESI_list[0]=0; str=getpuc; strcpy(CESI_list+1,str); len=strlen(str); CESI_list[len+2]=STR_TAG; if(save_int_1) //for avoiding crash with keyclear()=>Restore auto int1 { SetIntVec (AUTO_INT_1, save_int_1); save_int_1=NULL; //is useful later } TRY cmd_text (CESI_list+len+2); ONERR rsl(0); ENDTRY rsl(1); } /*ans ifsh(void) //Cette fonction marche { unsigned char *ptr; //unsigned int dim; argptr+=2; ptr=argptr-1; //pointe sur la dimension de la condition et de l'instruction //printf("\n*argptr=%d",*argptr); ngetchx(); //dim=getsl; //printf("\ncond=%ld",cond); ngetchx(); if(!getsl) { argptr=ptr+(*ptr); //skip the instruction } else rsl(getsl); }*/ ans ifshort(void) //Cette fonction marche { unsigned char *ptr; //unsigned int dim; argptr+=2; ptr=argptr-1; //pointe sur la dimension de la condition et de l'instruction //printf("\n*argptr=%d",*argptr); ngetchx(); //dim=getsl; //printf("\ncond=%ld",cond); ngetchx(); if(!getsl) { argptr=ptr+(*ptr); //skip the instruction } else rsl(getsl); //si cond vraie, alors exécute l'instruction } ans disperr(void) { unsigned char last_disp_err; argptr++; last_disp_err=disp_err; disp_err=getsl; rsl(last_disp_err); } //0 1 2 3 4 5 6 7 8 9 ans (*fonc[])(void)={ a , guchar, gslvar, a , LBL , GOTO , kwait , isz , dsz , a , //0 freeh ,tohandl, exech , GOTOL , indir ,printf1,printf2,newline,prints, a , //1 svscroff,EDWHILE, finish, when,strlenn, printc,sprntf , chars , strct, atoll , //2 execnpp , guint , gint,gsprt8,gsprt16,printd,printxy, glong , gulong, inter , //3 dline , dmline,setgmod, sprt8 , sprt16, gstr , ordd,sprt82 ,sprt162,sprt322, //4 setlcd, dpix , gpix , sprt32,fillrec, clrdrw, rwky,keyclear,keydisp , ifthen, //5 getlcd, WHILE , offf,gsprt32,reallo , a ,strcat2, next,breakk , elsee , //6 gryon , gryoff, ligh , dar , a ,drwstr,setfontt,freet , sett , endif , //7 gotopos , pos , jsr , rts , pause ,unsigb,unsigw , texp, tval, ifshort, //8 scrleft ,scrrigh,scrup ,scrbot , lrol , rrol , osvar, idlee,memcpyy, a , //9 clscr , randd , gsprt,scrleft2,scrrigh2,scrup2,scrbot2, a ,memmov, a , //10 fopenn ,disperr,fcreatee, a ,files , reps, a , gts , a , a , //11 nott, orb , neg , notb ,dcircle,fillcirc, a , a , sto , a , //12 xorr, orl , andl, inf , infeq , eq , supeq , sup , noteq , addd , //13 textt , sub , andb, mul , a , divv , eqs , escc, up , second, //14 def , enddef, a , fc ,sprt8x , rtn , group , a , down , majj , //15 repeat, a ,savescr,loadscr, mod , belm, welm , lelm , left ,diamond, //16 movto , tios , toos , newstr,gsprt8x, wb , ww , wl , right ,alpha , //17 strcmpp ,strcpyy, gkey,keydlay,keysped, forr , eforr , a , a , a , //18 pokb, pokw , pokl ,lscroll4, archiv,unarchiv, i , b , w , l , //19 pekb , pekw , pekl ,isarchi,loadasm, a , xb , yb , a , a , //20 newstr, exprr ,stringg,llelem ,execasm, a , nilist, mklist,lusfunc, a , //21 map , multi , two , memch ,closeasm, a ,catalog, open , a , endtag, //22 a , finl,settype, finish, seqb , lcdup ,lcddown,drawpic, getpic, a , //23 debugon ,DEBUGOF, seqs , seqe , seqw ,prettyxy,getwbt, cwidth,execbas, a , //24 nop , mallo , fre , mmset , seql,asm_cal, a , a , a , a }; //25 void exit2(unsigned char *str_error) { int ii; clrscr(); printf("\n%s",str_error); SetIntVec (AUTO_INT_5, OldInt5); ngetchx(); free(argdep); if(sv_scr_on==1) {memcpy (LCD_MEM, screen_buffer, LCD_SIZE); free(screen_buffer);} if(GLOBAL_data) free(GLOBAL_data); OSInitKeyInitDelay(336); OSInitBetweenKeyDelay (48); for(ii=0;ii<4;ii++) //free the saved screens { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } WinClose (&wind); //for prettyxy function if(handle_execbas) HeapFree (handle_execbas); exit(4); } void exit3(unsigned char *str_error) { int ii; clrscr(); printf("\n%s",str_error); SetIntVec (AUTO_INT_5, OldInt5); ngetchx(); if(sv_scr_on==1) {memcpy (LCD_MEM, screen_buffer, LCD_SIZE); free(screen_buffer);} if(GLOBAL_data) free(GLOBAL_data); OSInitKeyInitDelay(336); OSInitBetweenKeyDelay (48); for(ii=0;ii<4;ii++) //free the saved screens { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } WinClose (&wind); //for prettyxy function if(handle_execbas) HeapFree (handle_execbas); exit(4); } void disp_stack(void) { ESI a; a=top_estack; printf("\nstack:\n"); while(a!=bottom_estack) {printf("%c",*a); a--;} printf("\n"); a=top_estack; while(a!=bottom_estack) {printf("%x ",*a); a--;} } // Main Function void _main(void) { ESI arg = top_estack; //SYM_ENTRY *src_entry; FILE *f; unsigned char *temp_str,srcname[20]; unsigned int i; scr_rect.xy.x0=0; scr_rect.xy.y0=0; scr_rect.xy.x1=239; scr_rect.xy.y1=127; scr_copy[0]=NULL; scr_copy[1]=NULL; scr_copy[2]=NULL; scr_copy[3]=NULL; save_int_1=NULL; save_int_5=NULL; i_var_user_func_backup=0; //ESI argptr,argdep,tmpesi,argintr[21],intrdeb,argwhile[NB_WHILE],argendwhile[NB_WHILE],argyblock[50]; GLOBAL_data=malloc(260*4*(5)+NB_FOR*4*(2)); if(!GLOBAL_data) exit2("Not enough memory"); argendif=GLOBAL_data+0; //260 argelse=GLOBAL_data+260*4*1; //260 arglbl=GLOBAL_data+260*4*2; //260 argfunc=GLOBAL_data+260*4*3; //260 argendfunc=GLOBAL_data+260*4*4; //260 argendfor=GLOBAL_data+260*4*5; //NB_FOR argfor=GLOBAL_data+260*4*5+4*NB_FOR*1; //NB_FOR //Save screen automatically by default sv_scr_on=1; screen_buffer=malloc(LCD_SIZE); if(screen_buffer==NULL) exit2("Memory error in svscron()"); memcpy (screen_buffer, LCD_MEM, LCD_SIZE); WIN_RECT winr = {0, 0, 239, 127}; //for prettyxy function WinOpen (&wind, &winr, WF_TTY | WF_NOBORDER); //an empty window with no border ready to write in. It will be necessary to close the window before exiting program WinActivate (&wind); // memcpy (LCD_MEM, screen_buffer, LCD_SIZE); //restore screen because prettyxy l'efface //For the function gkey() kbq = kbd_queue (); Counter=0; //int5_allowed=1; OldInt5 = GetIntVec (AUTO_INT_5); SetIntVec (AUTO_INT_5, MyInt5); arg=top_estack; varlist=varlist_array; /*i_rtnf=0;*/ inc=0; for(i=0;i<256;i++) {byte_width_ilist[i]=4; varlist[i].sl=0;} //for llelem function, initialized to 4 by default for compatibility with the group() function i=0; for(i=1;i<=21;i++) argintr[i]=0; i=0; for(i_intr=0;i_intr<20;i_intr++) //met a 0 toutes les interuptions { argintr[i_intr]=0; speedintr[i_intr]=0; } i_intr=0; nsubfonc=0; nswitch=0; handle_execbas=H_NULL; disp_err=1; disp_err_old=1; //par défaut, affiche un message d'erreur Tibasic if(GetArgType (arg) != STR_TAG) exit3("String arg expected\nSource file expected."); temp_str = GetStrnArg(arg); reset_control_flags(); //This is useful for prettyxy and getwbt functions. strcpy (srcname , temp_str); //le nom du fichier header est affecte definitivement ici f=fopen(srcname,"r"); srcsize=*(unsigned int*)(f->base); //srcsize=size of data without first two bytes //printf("\n Compiled with version : %d",*((unsigned char*)(f->base)+srcsize+1-6)); ngetchx(); nbvar_main=*((unsigned char*)(f->base)+srcsize+1-7); if(*((unsigned char*)(f->base)+srcsize+1)!=OTH_TAG && strcmp("NPP",(unsigned char*)(f->base)+srcsize+1-4)!=0) { SetIntVec (AUTO_INT_5, OldInt5); fclose(f);clrscr(); printf("NPP file expected"); ngetchx(); WinClose (&wind); if(sv_scr_on==1) {memcpy (LCD_MEM, screen_buffer, LCD_SIZE); free(screen_buffer);} exit(4);} argptr=malloc(srcsize); memcpy (argptr, (unsigned char*)(f->base)+2, srcsize); fclose(f); //src_entry = DerefSym(SymFind(SYMSTR(srcname))); //if(src_entry && src_entry->name); //else exit2("fichier inexistant"); //argptr=HToESI(src_entry->handle); //if(*argptr!=OTH_TAG) { exit2("OTHer prgm file expected");} //argptr=argptr-srcsize+1; argdep=argptr; gmode=0; nsubfonc=0; lcdad=LCD_MEM; randomize(); //for having real random number with rand() init_bkm(); //OSDisableBreak(); //disable ON KEY breaking //OSSetSR (0x0700); //a enlever exec_none_stop_secured(); exit2("Execution stopped"); }