// 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 101 // Compile for AMS 1.01 or higher //#define SAVE_SCREEN // Save/Restore LCD Contents #include // Include All Header Files //#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 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 rpans return (ans)(ans*) INT_HANDLER OldInt5 = NULL; INT_HANDLER save_int_1; volatile int Counter = 0; unsigned int srcsize,nintr,sintr; unsigned char *srcptr,*ptr,brkvar,iintr,inc,int5_allowed,sv_scr_on,*screen_buffer; long condswitch[5],rtnf[30],argin[30]; //retour des fonctions inlines : imbrication max de 30 appels . Entrée fonction inline unsigned char i_rtnf,i_intr,byte_width_ilist[256]; FILE *fp; HANDLE handle; ESI argptr,argdep,argintr[21],speedintr[21],intrdeb,argfunc[30],argendfunc[30],arglbl[256],argwhile[30],argendwhile[30]/*,argfor[100],argendfor[30]*/,argelse[257],argendif[257],argloop[30]; void *kbq; //For the function gkey() //0 1 2 3 4 5 6 7 8 9 unsigned char *foncs[]={ "" ,"GUCHAR" , "GSLVAR","adress" , "FLBL", "FGOTO" ,"keywait", "isz" , "dsz" , "iff" , //0 "freeh" , "endh" , "exech" , "" , "INDIR" ,"printf1","printf2", "" ,"prints", "elsee" , //1 "svscroff","fedwhil", "finish", "ifs" , "" , "printc","sprintf", "chars" , "strcat", "" , //2 "" ,"GUINT" , "" , "" , "" ,"printld","printxy", "" ,"GULONG" , "inter" , //3 "dline" ,"dmline" , "gmode" ,"sprt8" ,"sprt16" , "" , "code" ,"interoff","interon", "" , //4 "setlcd", "dpix" ,"gpix" ,"sprt32","fillrect","clrlcd" ,"keytest","int1off","int1on" ,"ifthen" , //5 "getlcd", "fwhile", "" , "" , "" , "" , "" ,"int5off","int5on" , "elsee" , //6 "grayon" ,"grayoff","light" , "dark" , "" ,"drawstr","setfont","freet" ,"settimer", "endiff", //7 "gotopos" , "pos" , "jsr" , "rts" , "fonc", "" , "" ,"timerexp","timerval", "" , //8 "lscroll" ,"rscroll","uscroll","bscroll", "lrol", "rrol" , "" , "idle" , "memcpy", "" , //9 "clrscr","X rand" , "gsprt","lscroll2","rscroll2","uscroll2","bscroll2","" ,"memmove", "" , //10 "fopen" , "fclose", "fputc" , "fgets" , "fgetc" , "fputs" , "" , "gets" , "" , "" , //11 "nott", "" , "neg" , "" , "" , "" , "" , "" , "sto" , "" , //12 "xorr", "orr" , "andd", "inf" , "infeq" , "eq" , "supeq" , "sup" , "noteq" , "add", //13 "" , "sub" , "" , "mul" , "" , "div" , "" , "" , "up" , "second", //14 "def" , "enddef", "" , "fc" , "arg" , "rtn" , "group" , "" , "down", "shiftt", //15 "repeat", "" ,"savescr","loadscr", "" , "lb" , "lw" , "ll" , "leftt","diamond", //16 "" , "os" , "toos", "" , "" , "wb" , "ww" , "wl" , "rightt", "alpha" , //17 "" , "" , "gkey" ,"keydelay", "" , "" , "" , "" , "" , "" , //18 "pokeb" , "pokew" , "pokel" , "" , "" , "" , "" , "" , "" , "" , //19 "peekb" , "peekw" , "peekl" , "" , "" , "" , "" , "" , "" , "" , //20 "" , "" , "" , "xxllelem", "" , "" ,"nilist" , "mklist", "" , "" , //21 "map" , "multi" , "two" , "" , "" , "" , "" , "" , "" ,"ENDTAG" , //22 "" , "" , "" , "finish", "" , "ctup" , "ctdown", "" , "" , "" , //23 "debugon" ,"debugoff", "" , "" , "" , "" , "" , "" ,"execbas", "" , //24 "nop" , "malloc", "free","memset" , "" ,"asmcall", "" , "" , "" , "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; //ans *pans; } ans; typedef struct { char *fptr, *cptr; unsigned short plen; HANDLE h; } File ; SCR_RECT scr_rect; char nsubfonc,gmode,nswitch; //gmode = mode graphique & or xor etc... char strchars[2]; void *lcdad; ans varlist[256]; ESI lbl[256]; ESI subfonc[20]; ans (*fonc[])(void); long *scr_copy[3]; 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,tempp; inc++; //printf(" inc=%d",inc); intrdeb=argptr; for(i=0;i<20;i++) { //if(!(inc%(speedintr[i]))) //if(argintr[i]==0 || speedintr[i]==0) continue; tempp=speedintr[i]; if(tempp==0) tempp=inc; else tempp=(inc%tempp); //tempp=mod_uchar(inc,speedintr[i]); if(tempp==0 && speedintr[i]!=0) { //printf("tempp=%d",tempp); argptr=argintr[i]; //on pointe maintenant sur le tag de la nilist a exécuter //printf(" inc=%d",inc); argptr++; sintr=getsl; nintr=getsl; for(iintr=0;iintrhandle = h) = 0x00010000; return h; } Files* OpenFile(const char *FileName) { char *fptr, *cptr; unsigned short plen; SYM_ENTRY *SymPtr; HANDLE h; Files *fileptr; SymPtr = DerefSym (SymFind (SYMSTR (FileName))); if (!SymPtr) {/*fatal ("Program not found");*/ return 0;} h = SymPtr->handle; 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"); } memcpy (cptr, fptr, plen); } //Create a struct of type file if(!(fileptr=malloc(sizeof(Files)))) { if (h) HeapUnlock (h); if (cptr != fptr) free (cptr); exit2("Memory error"); } fileptr->fptr=fptr; fileptr->cptr=cptr; fileptr->plen=plen; fileptr->h=h; return fileptr; } void CloseOpenedFile(Files *fileptr) { if (fileptr->h) HeapUnlock (fileptr->h); if (fileptr->cptr != fileptr->fptr) free (fileptr->cptr); if(fileptr) free(fileptr); } 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; } void AppendBlockToFile (HANDLE h, void *addr, unsigned short len) { unsigned short i; for (i = len; i; i--) AppendCharToFile (h, *((char*)addr)++); } 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); HeapUnlock (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 execbas(void) //pas tres rapide { ESI arg; HANDLE handle; //HEXA:F8 IP1 IP2 DATA delete_between (bottom_estack, top_estack); for(arg=argptr+3;arg*arg=%x &=%x",*argptr,(int)(argptr-argdep+2)); ngetchx(); exit2("exit by unknown fonc"); return (ans)0; } ans lusfunc(void) { argptr+=1; //printf("\nexec:%s",foncs[*argptr]); //rsl((*(fonc[*(argptr)])()).sl); //return (ans)0; } ans gstr(void) { unsigned int dim; unsigned char *p; argptr+=1; dim=getul; p=argptr; argptr+=dim+1; rpuc(p); } ans gpvar(void) { argptr+=2; rpul(&(varlist[*(argptr-1)])); } ans neg(void) //correspond au minus_tag { argptr++; rsl(-(getul)); } 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 sto(void) { char nvarr; long f; unsigned int elem_index; argptr++; /* if(*argptr==0x02) //gslvar tag { argptr+=2; //point to the value to store varlist[*(argptr-1)]=(ans)(f=getsl); rsl(f); } else //ca ne peut etre qu'une string { argptr+=2; //point to the value to store varlist[*(argptr-1)]=(ans)(f=getpuc); rsl(f); } */ 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].sl=f; 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 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; case 4: if(varlist[nvarr].sl!=0) (varlist[nvarr].psl)[elem_index]=f; rsl(f); break; } break; } } 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 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);} for(ii=0;ii<4;ii++) //free the save screen { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } exit(4); } 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++; for(arg=argptr+3;arg=(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++; return (ans)(~(getsl)); } /*ans endforr(void) { int index; exit2("Endfor function executed!"); argptr+=3; //rsl(1); } ans forr(void) { int index; long l1,l2,l3,*p; index=*(argptr+2); argptr+=3; p=&varlist[index]; l1=getsl; l2=getsl; l3=getsl; argendfor[index]=argptr; /* for(*p=l1;*p>n); } ans tios(void) { HANDLE handle; unsigned char *str; argptr++; str=getpuc; push_parse_text (str); handle = HS_popEStack (); NG_execute (handle, FALSE); 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: printf("\ncommand os cannot return list."); break; //en supposant ci dessous que c'est un négatif (MINUS -) } } ans debugon(void) { argptr++; printf("\nDEBUG ON :"); while(*argptr!=0xE9 && *argptr!=241) //0xf1=241=debugoff { printf("\n*argptr=%x &=%x %s",*argptr,(int)(argptr-argdep+2),foncs[*argptr]); ngetchx(); (*(fonc[*(argptr)]))(); } (*(fonc[*(argptr)]))(); printf("\nDEBUG OFF\n"); rsl(0); } ans DEBUGOF(void) { argptr++; } ans nilist(void) //execute the content of the nilist !?? ->pass? { long d/*,i*/,s; ESI argdeb; argdeb=argptr; argptr++; s=getsl; //size of data d=getsl; //number of data //printf("\ntaille : %d\nNombre d'elements : %d",(int)s,(int)d); //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 fsek(void) { File *stream; long offset; short whence; argptr++; stream=getsl; offset=getsl; whence=getsl; rsl(fseek (stream, offset,whence)); } ans ftel(void) { File *stream; argptr++; stream=getsl; rsl(ftell (stream)); } 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; unsigned int lenn; argptr++; destt=getpuc; srcc=getpuc; lenn=getsl; 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 up(void) { argptr++; if(_keytest(RR_UP)) { rsl(1); } else rsl(0); } ans down(void) { argptr++; if(_keytest(RR_DOWN)) { rsl(1); } else rsl(0); } ans left(void) { argptr++; if(_keytest(RR_LEFT)) { rsl(1); } else rsl(0); } ans right(void) { argptr++; if(_keytest(RR_RIGHT)) { rsl(1); } else rsl(0); } ans second(void) { argptr++; if(_keytest(RR_2ND)) { rsl(1); } else rsl(0); } ans majj(void) { argptr++; if(_keytest(RR_SHIFT)) { rsl(1); } else rsl(0); } ans diamond(void) { argptr++; if(_keytest(RR_DIAMOND)) { rsl(1); } else rsl(0); } ans alpha(void) { argptr++; if(_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",byte_width_ilist[varnnn],varnnn); ngetchx(); switch(byte_width_ilist[varnnn]) { case 1: rsl(((varlist[varnnn]).psc)[nelemm]); break; case 2: rsl(((varlist[varnnn]).psi)[nelemm]); break; case 4: rsl(((varlist[varnnn]).psl)[nelemm]); break; exit2("\nError in var[] function"); } //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; 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==NULL) exit2("\nMemory Error"); 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; fpic=OpenFile(picvar); if(fpic==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;iiicptr)+6)+iii); } break; case 2: case 16: byte_width_ilist[sprt_dest]=2; for(iii=0;iiicptr)+6)+iii); } break; case 4: case 32: byte_width_ilist[sprt_dest]=4; for(iii=0;iiicptr)+6)+iii); } break; printf("\ngsprt() syntax :\ngsprt(pixel_width,num_line,\n\"pic_var\",sprt_var)"); ngetchx(); } CloseOpenedFile(fpic); rsl(sprtt); } ans savescr(void) { unsigned char indexx; int ii; long *ptrrr,*lcdaddd; argptr++; indexx=getsl; lcdaddd=lcdad; //conversion de type if(indexx>4) exit2("\nsavescr function,\nMaximum of 4 saved screens\nare allowed.\nOut of range : [0,3]."); if(scr_copy[indexx]!=NULL) { free(scr_copy[indexx]); } scr_copy[indexx]=(ptrrr=malloc(LCD_SIZE)); if(!ptrrr) exit2("\nNot enough memory\n for saving screen."); for(ii=0;ii<(LCD_SIZE/4);ii++) //copy l'écran { ptrrr[ii]=lcdaddd[ii]; } rsl(ptrrr); } 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!=NULL) { for(ii=0;ii<(LCD_SIZE/4);ii++) //copy l'écran { lcdaddd[ii]=ptrrr[ii]; } } rsl(ptrrr); } //0 1 2 3 4 5 6 7 8 9 ans (*fonc[])(void)={ a , guchar, gslvar, gpvar, LBL , GOTO , kwait , isz , dsz , a , //0 freeh ,tohandl, exech , GOTOL , indir ,printf1,printf2, a ,prints, a , //1 svscroff,EDWHILE, finish, ifs ,strlenn, printc,sprntf , chars , strct, atoll , //2 a , guint , gint, a , a , printd,printxy, glong , gulong, inter , //3 dline , dmline,setgmod, sprt8 , sprt16, gstr , code,introff,intron , a , //4 setlcd, dpix , gpix , sprt32,fillrec, clrdrw, rwky ,int1off,int1on , ifthen, //5 getlcd, WHILE , a , a ,scrrect, a , a ,int5off,int5on , elsee , //6 gryon , gryoff, ligh , dar , a , drwstr,setfontt,freet , sett , endif , //7 gotopos , pos , jsr , rts , foncc , a , a , texp, tval, a , //8 scrleft ,scrrigh,scrup ,scrbot , lrol , rrol , a , idlee,memcpyy, a , //9 clscr , randd , gsprt,scrleft2,scrrigh2,scrup2,scrbot2, a ,memmov, a , //10 fope, fclos , fptc , fgts , fgtc , fpts , fsek , gts , a , a , //11 nott, a , neg , a , a , a , ftel , a , sto , a , //12 xorr, orr , andd, inf , infeq , eq , supeq , sup , noteq , addd , //13 a , sub , a , mul , a , divv , a , a , up , second, //14 def , enddef, a , f , arg , rtn , group , a , down , majj , //15 repeat, a ,savescr,loadscr, a , belm, welm , lelm , left ,diamond, //16 a , tios , toos , newstr, a , wb , ww , wl , right ,alpha , //17 strcmpp ,strcpyy, gkey,keydlay,keysped, a , a , a , a , a , //18 pokb, pokw , pokl , a , a , a , a , a , a , a , //19 pekb , pekw , pekl , a ,loadasm, a , a , a , a , a , //20 newstr, a , a ,llelem ,execasm, a , nilist, mklist,lusfunc, a , //21 map , multi , two , a ,closeasm, a , a , a , a , endtag, //22 a , finl, a , finish, seqb , ctup , ctdown, a , a , a , //23 debugon ,DEBUGOF, a , a , seqw, a , a , a ,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);} OSInitKeyInitDelay(336); OSInitBetweenKeyDelay (48); for(ii=0;ii<4;ii++) //free the save screen { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } 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);} OSInitKeyInitDelay(336); OSInitBetweenKeyDelay (48); for(ii=0;ii<4;ii++) //free the save screen { if(scr_copy[ii]!=NULL) free(scr_copy[ii]); } 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=199; scr_rect.xy.y1=119; scr_copy[0]=NULL; scr_copy[1]=NULL; scr_copy[2]=NULL; scr_copy[3]=NULL; //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); //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; 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_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; if(GetArgType (arg) != STR_TAG) exit3("String arg expected\nSource file expected."); temp_str = GetStrnArg(arg); 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 if(*((unsigned char*)(f->base)+srcsize+1)!=OTH_TAG) { exit2("OTHer prgm file expected");} 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=1; nsubfonc=0; lcdad=LCD_MEM; init_bkm(); OSDisableBreak(); //disable ON KEY breaking //OSSetSR (0x0700); //a enlever exec_none_stop(); //exit2("Done"); }