//#define PC #include #include //#include #include #ifndef PC #include #include #include "n2DLib.h" #include "n2DLib_font.h" #include "newprogcx_fonts.h" //#include "n2DLib.c" //#include //#include "utils.h" #endif unsigned char neo_prgm_name[100]; unsigned char prgm[65535],*ptr; unsigned char *ifs_after_all[260],nb_ifs; unsigned char *lbl_ptr[260]; unsigned char *else_ptr[256],*endif_ptr[256]; unsigned char *for_ptr[256],*endfor_ptr[256]; unsigned char *while_ptr[256],*endwhile_ptr[256]; unsigned char *when_false[256],*when_end[256]; unsigned char *func_ptr[100],*endfunc_ptr[100],args_var_iden_list[100][16]; unsigned char is_breakk=0,is_goto=0,is_continue,is_return; unsigned short newdata_var_nbrows[256]; unsigned short newdata_var_nbcols[256]; unsigned char newdata_var_type[256]; //SDL_Rect sdl_rect_list[20]; int return_value=0; //SDL_Surface *screen; unsigned char is_graph_buf; unsigned short *lcdad; unsigned char dropdown_str_return[500]; unsigned char msg_request_str_box_return[40]; unsigned char is_timer1_activated; int x_pos,y_pos; unsigned short chars_color,edge_color; unsigned char font; unsigned char fonts_w_list[4]={6,8,8,16}; unsigned char fonts_h_list[4]={8,8,12,16}; unsigned char *font_sprite_list_ptr[4]; //={font6x8_ascii,n2DLib_font ,font8x8_basic,Font8x12}; unsigned char my_gets_x_y_len_buf[100]; //unsigned int etat_precedent; unsigned char *first_adress_for_sync,*deb_ptr; //unsigned char is_delay; int prgm_size; int npvar_list[256]; //int *npvar_list; int npvar_list_row_columns[256][2]; int (*fonc[])(void); unsigned char //0 //1 //2 //3 //4 //5 //6 //7 //8 //9 *neo_funcs_list_str[]={"GETUCHAR" ,"GETUSHORT", "GETUINT" ,"GETSCHAR" ,"GETSSHORT", "GETSINT" , "NPVAR", "STOVAR" , "ADDD" , "ISEQU", //0 "keywait" , "LBL" , "GOTO" , "IFS" , "FORR" , "BREAKK" , "GETADR" , "STRDATA" , "SUBB" , "ISNEQ", //1 "repeat" , "ISZZ" , "KEYTEST" , "IFTHENN" , "ENDFOR" ,"CONTINUEE", "" , "" , "MULL" , "ISINF", //2 "printd" , "DSZZ" , "" , "ELSEE" , "" , "" , "" , "" , "DIVV" , "ISSUP", //3 "prints" ,"DEFDATAuc", "" , "ENDIFF" , "" , "" , "" , "" , "" , "ISEQINF", //4 "printf" , "" , "" , "" , "" , "" , "" , "" , "" , "ISEQSUP", //5 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //6 "" , "" , "" , "" , "" ,"CONTUCPTR","CONTUSPTR","CONTUIPTR","CONTSCPTR","CONTSSPTR", //7 "CONTSIPTR", "FUNC" , "ENDFUNC" , "EXECFC" ,"RETURNN" , "" , "" , "SPRTPART", "" , "" , //8 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //9 "" ,"STOLELEM" , "" , "" , "" , "" , "" , "" , "" , "" , //10 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //11 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //12 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //13 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //14 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //15 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //16 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //17 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //18 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //19 "NOTLL", "" , "" , "" , "" , "" , "" , "" , "" , "" , //20 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //21 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //22 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //23 "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , //24 "" , "" , "" , "" , "" , "END" }; //25 //0 1 2 3 4 5 6 7 8 9 unsigned char funcs_nbarg[] ={ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 2 , 2 , //0 0 , 0 , 0 , 0 , 4 , 0 , 1 , 0 , 2 , 2 , //1 2 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 2 , 2 , //2 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 2 , //3 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , //4 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , //5 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //6 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , //7 1 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , //8 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //9 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //10 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //11 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //12 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //13 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //14 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //15 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //16 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //17 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //18 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //19 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //20 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //21 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //22 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //23 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , //24 0 , 0 , 0 , 0 , 0 , 0 }; //25 typedef struct { t_key k; signed short matching_num; unsigned char matching_description_str[10]; unsigned char char_value; } newprogcx_key_data; newprogcx_key_data newprogcx_key_data_list[]= { {KEY_NSPIRE_CTRL,7,"CTRL",0}, {KEY_NSPIRE_RET,64,"return",0}, {KEY_NSPIRE_ENTER,37,"enter",'\n'}, {KEY_NSPIRE_SPACE,70,"space",' '}, {KEY_NSPIRE_NEGATIVE,36,"minus",'-'}, {KEY_NSPIRE_Z,69,"z",'z'}, {KEY_NSPIRE_PERIOD,35,".",'.'}, //?? {KEY_NSPIRE_Y,68,"y",'y'}, {KEY_NSPIRE_0,34,"0",'0'}, {KEY_NSPIRE_X,67,"x",'x'}, {KEY_NSPIRE_THETA,12,"theta",0}, //? {KEY_NSPIRE_COMMA,56,",",','}, {KEY_NSPIRE_PLUS,30,"+",'+'}, {KEY_NSPIRE_W,66,"w",'w'}, {KEY_NSPIRE_3,29,"3",'3'}, {KEY_NSPIRE_V,65,"v",'v'}, {KEY_NSPIRE_2,28,"2",'2'}, {KEY_NSPIRE_U,63,"u",'u'}, {KEY_NSPIRE_1,27,"1",'1'}, {KEY_NSPIRE_T,62,"t",'t'}, {KEY_NSPIRE_eEXP,25,"e",'e'}, {KEY_NSPIRE_PI,47,"pi",0}, {KEY_NSPIRE_QUES,46,"?",'!'}, {KEY_NSPIRE_QUESEXCL,46,"!",'!'}, {KEY_NSPIRE_MINUS,31,"-",'-'}, {KEY_NSPIRE_S,61,"s",'s'}, {KEY_NSPIRE_6,22,"6",'6'}, {KEY_NSPIRE_R,60,"r",'r'}, {KEY_NSPIRE_5,21,"5",'5'}, {KEY_NSPIRE_Q,59,"q",'q'}, {KEY_NSPIRE_4,20,"4",'4'}, {KEY_NSPIRE_P,58,"p",'p'}, {KEY_NSPIRE_TENX,26,"10^x",0}, {KEY_NSPIRE_EE,38,"EE",0}, {KEY_NSPIRE_COLON,35,".",'.'}, {KEY_NSPIRE_MULTIPLY,23,"*",'*'}, {KEY_NSPIRE_O,57,"o",'o'}, {KEY_NSPIRE_9,15,"9",'9'}, {KEY_NSPIRE_N,54,"n",'n'}, {KEY_NSPIRE_8,14,"8",'8'}, {KEY_NSPIRE_M,53,"m",'m'}, {KEY_NSPIRE_7,13,"7",'7'}, {KEY_NSPIRE_L,52,"l",'l'}, {KEY_NSPIRE_SQU,19,"²",'²'}, {KEY_NSPIRE_II,100,"II",0}, //??? {KEY_NSPIRE_QUOTE,30,"+",'+'}, {KEY_NSPIRE_DIVIDE,24,"/",'/'}, {KEY_NSPIRE_K,51,"k",'k'}, {KEY_NSPIRE_TAN,101,"TAN",0}, //??? {KEY_NSPIRE_J,50,"j",'j'}, {KEY_NSPIRE_COS,102,"COS",0}, //??? {KEY_NSPIRE_I,49,"i",'i'}, {KEY_NSPIRE_SIN,103,"SIN",0}, {KEY_NSPIRE_H,48,"h",'h'}, {KEY_NSPIRE_EXP,18,"^",'^'}, {KEY_NSPIRE_GTHAN,104,"GTHAN",0}, //??? {KEY_NSPIRE_APOSTROPHE,105,"'",0}, {KEY_NSPIRE_CAT,17,"CATALOG",0}, {KEY_NSPIRE_FRAC,24,"/",'/'}, {KEY_NSPIRE_G,45,"g",'g'}, {KEY_NSPIRE_RP,33,")",')'}, {KEY_NSPIRE_F,44,"f",'f'}, {KEY_NSPIRE_LP,32,"(",'('}, {KEY_NSPIRE_E,43,"e",'e'}, {KEY_NSPIRE_VAR,9,"VAR",0}, {KEY_NSPIRE_D,42,"d",'d'}, {KEY_NSPIRE_DEL,10,"DEL",0}, {KEY_NSPIRE_LTHAN,110,"LTHAN",0}, {KEY_NSPIRE_FLAG,55,"FLAG",0}, {KEY_NSPIRE_CLICK,1000,"CLICK",0}, {KEY_NSPIRE_C,41,"c",'c'}, {KEY_NSPIRE_HOME,2,"HOME",0}, {KEY_NSPIRE_B,40,"b",'b'}, {KEY_NSPIRE_MENU,6,"MENU",0}, {KEY_NSPIRE_A,39,"a",'a'}, {KEY_NSPIRE_ESC,1,"ESC",0}, {KEY_NSPIRE_BAR,3,"BAR",0}, {KEY_NSPIRE_TAB,5,"TAB",0}, {KEY_NSPIRE_EQU,11,"=",'='}, {KEY_NSPIRE_UP,1008,"UP",0}, {KEY_NSPIRE_UPRIGHT,10086,"UPRIGHT",0}, {KEY_NSPIRE_RIGHT,1006,"RIGHT",0}, {KEY_NSPIRE_RIGHTDOWN,10062,"RIGHTDOWN",0}, {KEY_NSPIRE_DOWN,1002,"DOWN",0}, {KEY_NSPIRE_DOWNLEFT,10024,"DOWNLEFT",0}, {KEY_NSPIRE_LEFT,1004,"LEFT",0}, {KEY_NSPIRE_LEFTUP,10048,"LEFTUP",0}, {KEY_NSPIRE_SHIFT,8,"SHIFT",0}, {KEY_NSPIRE_DOC,4,"DOC",0}, {KEY_NSPIRE_TRIG,12,"TRIG",0}, {KEY_NSPIRE_SCRATCHPAD,3,"SCRATCH",0}, {0,0,0,0} }; void (*fc_skip[])(void); void fillscr_c(unsigned short color) { unsigned short *uiptr; int i; uiptr=REAL_SCREEN_BASE_ADDRESS; for(i=0;i<320*240;i++) uiptr[i]=color; } void drawString_x_y_max_len(unsigned char* ,int , int , unsigned char ,unsigned short ,unsigned short ); unsigned char is_alpha_num_or_dot_or_div(unsigned char *ptr) { if(*ptr=='_' || *ptr>='a' && *ptr<='z' || *ptr>='A' && *ptr<='Z' || *ptr>='0' && *ptr<='9' || *ptr=='.' || *ptr=='/') return 1; else return 0; } int printf1_in_cx_vm_corpse(unsigned char *str,int value,int x,int y,unsigned short color) { unsigned char buf[200],i; if(strlen(str)>150) return 0; for(i=0;i<200;i++) buf[i]=0; sprintf(buf,str,value); drawString_x_y_max_len(buf,x,y,1,color,199); } unsigned int getkey(void) { unsigned short i; t_key report; if(isKeyPressed(KEY_NSPIRE_UP)) return 1008; if(isKeyPressed(KEY_NSPIRE_DOWN)) return 1002; if(isKeyPressed(KEY_NSPIRE_LEFT)) return 1004; if(isKeyPressed(KEY_NSPIRE_RIGHT)) return 1006; if(isKeyPressed(KEY_NSPIRE_UPRIGHT)) return 10086; if(isKeyPressed(KEY_NSPIRE_RIGHTDOWN)) return 10062; if(isKeyPressed(KEY_NSPIRE_DOWNLEFT)) return 10024; if(isKeyPressed(KEY_NSPIRE_LEFTUP)) return 10048; if(isKeyPressed(KEY_NSPIRE_CLICK)) return 1000; if(get_key_pressed(&report)) { i=0; //printf("\nkey pressed"); while(newprogcx_key_data_list[i].matching_num!=0) { if(isKey(report, newprogcx_key_data_list[i].k)) { //printf(" k=%d",newprogcx_key_data_list[i].matching_num); return newprogcx_key_data_list[i].matching_num; } i++; } } return 0; } void my_setPixel(int x, int y, unsigned short fc) { *(lcdad+x+320*y)=fc; } void my_setPixelsafe(int x, int y, unsigned short fc) { if(x>=0 && x<=319 && y>=0 && y<=239)*(lcdad+x+320*y)=fc; } /* unsigned char font; unsigned char fonts_w_list[4]={6,8,8,8}; unsigned char fonts_h_list[4]={8,8,8,12}; char *font_sprite_list_ptr={font6x8_ascii,n2DLib_font ,font8x8_basic,Font8x12}; */ void my_drawChar(int *x, int *y, int margin, char ch, unsigned short fc, unsigned short olc) { int i, j; unsigned char *charSprite; //,temp_char[12]={0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00}; //,*rect_full_sprite[]={-1,-1,-1,-1,-1,-1,-1,-1}; //printf("\n ch=%c ",ch); keywait(); if(ch==0) return ; if(ch == '\n') { *x = margin; //*y += 8; *y += fonts_h_list[font]; //moi if(*y>240-/*8*/fonts_h_list[font]) { memmove(lcdad,lcdad+320*/*8*/fonts_h_list[font],(320*240-320*/*8*/fonts_h_list[font])*2); //scroll to up memset(lcdad+320*(240-/*8*/fonts_h_list[font]),edge_color,320*/*8*/fonts_h_list[font]*2); (*y)-=/*8*/fonts_h_list[font]; /* chars_color=0xffff; edge_color=0; */ } } else //if(*y < 239) { if((*x+/*8*/fonts_w_list[font])>320) { *x = margin; *y += /*8*/fonts_h_list[font]; if(*y>240-/*8*/fonts_h_list[font]) { memmove(lcdad,lcdad+320*/*8*/fonts_h_list[font],(320*240-320*/*8*/fonts_h_list[font])*2); //scroll to up memset(lcdad+320*(240-/*8*/fonts_h_list[font]),edge_color,320*/*8*/fonts_h_list[font]*2); (*y)-=/*8*/fonts_h_list[font]; } } //charSprite=rect_full_sprite; /* if(font==1) //8x8 bold { for(i = 0; i < fonts_h_list[font]; i++) { for(j = fonts_w_list[font]; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + (7 - j), *y + i, fc); else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); } } *x += fonts_w_list[font]; }*/ if(font==0) //6x8 { charSprite = ch * /*8*/fonts_h_list[font] + /*n2DLib_font*/font_sprite_list_ptr[font]; for(i = 0; i < fonts_h_list[font]; i++) { for(j = fonts_w_list[font]; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + (7 - j), *y + i, fc); /* else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); */ } } *x += fonts_w_list[font]; } if(font==1) //8x8 classic { charSprite = ch * /*8*/fonts_h_list[font] + /*n2DLib_font*/font_sprite_list_ptr[font]; for(i = 0; i < fonts_h_list[font]; i++) { for(j = fonts_w_list[font]; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + /*(7 - j)*/j, *y + i, fc); /* else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); */ } } *x += fonts_w_list[font]; } if(font==2) //8x12 classic { charSprite = 4 + ((ch-32) * fonts_h_list[font]) + /*n2DLib_font*/font_sprite_list_ptr[font]; //charSprite=temp_char; // !} for(i = 0; i < fonts_h_list[font]; i++) { for(j = fonts_w_list[font]; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + (7 - j), *y + i, fc); /* else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); */ } } *x += fonts_w_list[font]; } if(font==3) //16x16 { charSprite =((ch) * fonts_h_list[font]) + /*n2DLib_font*/font_sprite_list_ptr[font]; //charSprite=temp_char; // !} for(i = 0; i < fonts_h_list[font]; i++) { for(j = fonts_w_list[font]; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + (7 - j), *y + i, fc); /* else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); */ } } *x += fonts_w_list[font]; } // Draw charSprite as monochrome 8*8 image using given color /* for(i = 0; i < 8; i++) { for(j = 7; j >= 0; j--) { if((charSprite[i] >> j) & 1) my_setPixel(*x + (7 - j), *y + i, fc); else if(isOutlinePixel(charSprite, 7 - j, i)) my_setPixel(*x + (7 - j), *y + i, olc); } } *x += 8; */ } } void my_drawString(int *x, int *y, int _x, const char *str, unsigned short fc, unsigned short olc) { int i, max = strlen(str) + 1; for(i = 0; i < max; i++) my_drawChar(x, y, /*_x*/0, str[i], fc, olc); } unsigned char *skip_arg(unsigned char *p) { unsigned char *ptr_temp,*rtn; ptr_temp=p; ptr=p; ((*(fc_skip[*(ptr)]))()); rtn=ptr; ptr=ptr_temp; return rtn; } int exec_arg(unsigned char *instruct_ptr) { unsigned char *ptr_temp; int rtn; ptr_temp=ptr; ptr=instruct_ptr; rtn=((*(fonc[*(ptr)]))()); ptr=ptr_temp; return rtn; } #ifdef PC void keywait(void) { getchar(); } #else unsigned short keywait(void) { unsigned short k; wait_no_key_pressed(); while((k=getkey())==0) ; return k; } /* unsigned short keywait(void) { unsigned short k,is_up,k2,delay,i; //printf("\nin keywait()"); k=0; k2=0; //wait_no_key_pressed(); while(timer_read(1)) { k=(getkey()); if(k && etat_precedent!=k) //premiere fois que l'on presse { delay=32760/10;//kwait_delay; timer_load(1,delay); etat_precedent=k; return k; } } while((k=(getkey()))==0) ; //delay=kwait_delay; delay=32760/10; timer_load(1,delay); etat_precedent=k; return k; } */ #endif // PC int my_msgbox(unsigned char *title_str, unsigned char *msg_str); int finishh(void) { ptr++; if(is_timer1_activated) timer_restore(0); //if(npvar_list) free(npvar_list); exit(0); } void my_exit(char *msg) { //my_msgbox("Error",msg); printf1_in_cx_vm_corpse("\nError:%s",msg,0,0,20000); keywait(); finishh(); } int guchar(void) { ptr+=2; return *(unsigned char *)(ptr-1); } int gushort(void) { //unsigned short n; //printf("\nin gushort"); //n=*(ptr+2)*256+*(ptr+1); ptr+=3; //printf("\in ini bkm, gushort=%d",*(unsigned char*)(ptr-2)+*(unsigned char*)(ptr-1)*256); return *(unsigned char*)(ptr-2)+*(unsigned char*)(ptr-1)*256; } int guint(void) { //unsigned int n,n1,n2,n3,n4; //unsigned short s1,s2; //printf("guint "); //s1=*(unsigned short*)(ptr+1); //s2=*(unsigned short*)(ptr+3); //n=s1+65536*s2; ptr+=5; //printf("guint=%d",n); return *(unsigned char*)(ptr-4)+*(unsigned char*)(ptr-3)*256+*(unsigned char*)(ptr-2)*65536+*(unsigned char*)(ptr-1)*16777216; } int gschar(void) { ptr++; return *(signed char *)(ptr++); } int gsshort(void) { signed short n; n=*(signed short *)(ptr+1); ptr+=3; return n; } signed int gsint(void) { signed int n; //n=*(signed int *)(ptr+1); memcpy(&n,ptr+1,4); ptr+=5; return n; } int kwait(void) { ptr++; return keywait(); } int repeat(void) { int n,i; unsigned char *fc_ptr,*after_ptr; ptr++; n=((*(fonc[*(ptr)]))()); //printf("\ndans repeat, n=%d \n",n); keywait(); if(n==0) { ptr=skip_arg(ptr); return 0; } fc_ptr=ptr; //printf("FUNC TO REPEAT=%s\n",neo_funcs_list_str[*ptr]); for(i=0;in1; } int iseqinf(void) { int n1,n2; ptr++; //skip_stovar tag and iden n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); return n2<=n1; } int iseqsup(void) { int n1,n2; ptr++; //skip_stovar tag and iden n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); return n2>=n1; } int addd(void) { int n1,n2; ptr++; //skip_stovar tag and iden n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); return n2+n1; } int subb(void) { int n1,n2; ptr++; //skip_stovar tag and iden n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); return n2-n1; } int mulll(void) { int n1,n2; ptr++; //skip_stovar tag and iden //printf("in mull "); n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); //printf("n1=%d,n2=%d\n",n1,n2); return n2*n1; } int divv(void) { int n1,n2; ptr++; //skip_stovar tag and iden n1=((*(fonc[*(ptr)]))()); n2=((*(fonc[*(ptr)]))()); return n2/n1; } int ifthenn(void) { int iden,cond; ptr+=2; //tag and iden iden=*(ptr-1); cond=((*(fonc[*(ptr)]))()); if(!cond) { if(else_ptr[iden]!=0) ptr=else_ptr[iden]; else ptr=endif_ptr[iden]; } } int elsee(void) { int iden; ptr+=2; iden=*(ptr-1); ptr=endif_ptr[iden]; } int endiff(void) { ptr+=2; } int forr(void) { int f_iden,v_iden,beginn,endd,stepp; unsigned char *deb_ptr; int *v_ptr; ptr+=2; f_iden=*(ptr-1); v_iden=*(ptr+1); //printf("f_iden=%d v_iden=%d ",f_iden,v_iden); v_ptr=&npvar_list[v_iden]; ptr+=2; //now point on begin beginn=((*(fonc[*(ptr)]))()); endd=((*(fonc[*(ptr)]))()); stepp=((*(fonc[*(ptr)]))()); deb_ptr=ptr; //printf("deb_ptr=%p ",*deb_ptr); *v_ptr=beginn; is_goto=0; //printf("In for, iden=%d, begin=%d, end=%d, step=%d\n",f_iden,beginn,endd,stepp); for(*v_ptr=beginn;*v_ptr!=(endd+stepp);*v_ptr+=stepp) { ptr=deb_ptr; //printf("in for deb i=%d, *ptr=%d\n",*v_ptr,*ptr); while(*ptr!=24) //endfor_tag { ((*(fonc[*(ptr)]))()); if(is_breakk) goto for_fin; if(is_continue) { is_continue=0; break; } if(is_goto) { if(ptr>=endfor_ptr[f_iden] || ptr<=for_ptr[f_iden]) { is_breakk=0; return ; } } } } for_fin: is_breakk=0; ptr=endfor_ptr[f_iden]; } int forrc(void) { int f_iden,v_iden,beginn,endd,stepp; unsigned char *deb_ptr,*init_ptr,*cond_ptr,*isz_ptr; int *v_ptr; ptr+=2; f_iden=*(ptr-1); // v_iden=*(ptr+1); init_ptr=ptr; ptr=skip_arg(ptr); //skip init arg cond_ptr=ptr; ptr=skip_arg(ptr); //skip cond arg isz_ptr=ptr; ptr=skip_arg(ptr); //skip "isz arg" .point now on first instruc deb_ptr=ptr; //printf("deb_ptr=%p ",*deb_ptr); is_goto=0; for(exec_arg(init_ptr);exec_arg(cond_ptr);exec_arg(isz_ptr)) { ptr=deb_ptr; //printf("in for deb i=%d, *ptr=%d\n",*v_ptr,*ptr); while(*ptr!=24) //endfor_tag { ((*(fonc[*(ptr)]))()); if(is_breakk) goto for_fin; if(is_continue) { is_continue=0; break; } if(is_goto) { if(ptr>=endfor_ptr[f_iden] || ptr<=for_ptr[f_iden]) { is_breakk=0; return ; } } } } for_fin: is_breakk=0; ptr=endfor_ptr[f_iden]; } int endforr(void) { my_exit("ENDFOR error"); } int whilee(void) { int w_iden; unsigned char *deb_ptr,*cond_ptr; int *v_ptr; ptr+=2; w_iden=*(ptr-1); cond_ptr=ptr; deb_ptr=while_ptr[w_iden]; //pointe sur la 1ere instruc conditionnelle is_goto=0; //printf("In while, iden=%d\n",w_iden); while(exec_arg(cond_ptr)) { ptr=deb_ptr; while(*ptr!=44) //endwhile { ((*(fonc[*(ptr)]))()); if(is_breakk) goto while_fin; if(is_continue) { is_continue=0; break; } if(is_goto) { if(ptr>=endwhile_ptr[w_iden] || ptr<=while_ptr[w_iden]) { is_breakk=0; return ; } } } } while_fin: is_breakk=0; ptr=endwhile_ptr[w_iden]; } int endwhilee(void) { my_exit("ENDWHILE error"); } int breakk(void) { ptr++; is_breakk=1; } int continuee(void) { ptr++; is_continue=1; } int strdata(void) { unsigned char *rtn; unsigned short len; ptr++; len=((*(fonc[*(ptr)]))()); rtn=ptr; ptr+=len+1; //printf("\nafter str=%d",*ptr); return (int)rtn; } int getadress(void) { unsigned char degree,data_type,var_iden; unsigned short nbrow,nbcol,row_iden,col_iden,row,col; signed int rtn; if(*(ptr+1)==6) //direct var { ptr+=3; return (int)(&npvar_list[*(ptr-1)]); } else //lelem list or mat { ptr++; //skip getadress tag ptr++; //skip lelem tag var_iden=*(ptr+1); ptr+=2; //skip var degree=*(ptr+1); ptr+=2; //skip degree data_type=*(ptr+1); ptr+=2; nbrow=npvar_list_row_columns[var_iden][0]; nbcol=npvar_list_row_columns[var_iden][1]; col=0; if(nbrow==0) my_exit("Error:not defined list or matrix"); row=((*(fonc[*(ptr)]))()); if(degree==2) { col=((*(fonc[*(ptr)]))()); } //printf("\ndata type=%d",data_type); switch(data_type) { case 1: //uc rtn= (unsigned char *)(npvar_list[var_iden]+col+row*nbcol); break; case 11: //sc rtn= (signed char *)(npvar_list[var_iden]+col+row*nbcol); break; case 2: //us rtn= (unsigned short *)(npvar_list[var_iden]+2*col+row*nbcol*2); //printf("\nin lelem-2",rtn); break; case 22: //ss rtn= (signed short *)(npvar_list[var_iden]+2*col+row*nbcol*2); break; case 4: //us rtn= (unsigned int *)(npvar_list[var_iden]+4*col+row*nbcol*4); break; case 44: //ss rtn= (signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4); break; } return rtn; } } int prints(void) { unsigned char *rtn; ptr++; rtn=(unsigned char*)((*(fonc[*(ptr)]))()); printf("%s",rtn); return (int)rtn; } int contucptr(void) { ptr++; return *(unsigned char*)((*(fonc[*(ptr)]))()); } int contusptr(void) { ptr++; return *(unsigned short*)((*(fonc[*(ptr)]))()); } int contuiptr(void) { ptr++; return *(unsigned int*)((*(fonc[*(ptr)]))()); } int contscptr(void) { ptr++; return *(signed char*)((*(fonc[*(ptr)]))()); } int contssptr(void) { ptr++; return *(signed short*)((*(fonc[*(ptr)]))()); } int contsiptr(void) { ptr++; return *(signed int*)((*(fonc[*(ptr)]))()); } int iszz(void) { unsigned char *iuc; unsigned short *ius; unsigned int *iui; signed char *isc; signed short *iss; signed int *isi; char *data_beginning_ptr; //for lelem unsigned char degree,data_type,var_iden; unsigned short nbrow,nbcol,row_iden,col_iden,row,col; signed int rtn; ptr++; //printf("\nin isz, *ptr=%d",*ptr); switch(*ptr) { case 6: //var ptr+=2; return (npvar_list[*(ptr-1)])++; break; case 75: ptr++; iuc=((unsigned char*)((*(fonc[*(ptr)]))())); (*iuc)++; return *iuc-1; break; case 76: ptr++; ius=((unsigned short*)((*(fonc[*(ptr)]))())); (*ius)++; return *ius-1; break; case 77: ptr++; iui=((unsigned int*)((*(fonc[*(ptr)]))())); (*iui)++; return *iui-1; break; case 78: ptr++; isc=((signed char*)((*(fonc[*(ptr)]))())); (*isc)++; return *isc-1; break; case 79: ptr++; iss=((signed short*)((*(fonc[*(ptr)]))())); (*iss)++; return *iss-1; break; case 80: ptr++; isi=((signed int*)((*(fonc[*(ptr)]))())); //printf("\nin isz si, ptr=%d",isi); (*isi)++; return *isi-1; break; case 51: //lelem_tag static //printf("\nL_elem tag"); keywait(); ptr++; //skip lelem tag var_iden=*(ptr+1); ptr+=2; //skip var degree=*(ptr+1); //printf("\ndegre=%d",degree); keywait(); ptr+=2; //skip degree data_type=*(ptr+1); ptr+=2; nbrow=npvar_list_row_columns[var_iden][0]; nbcol=npvar_list_row_columns[var_iden][1]; col=0; if(nbrow==0) my_exit("Error:not defined list or matrix"); row=((*(fonc[*(ptr)]))()); if(degree==2) { col=((*(fonc[*(ptr)]))()); } //printf("\ndata type=%d",data_type); switch(data_type) { case 1: //uc //rtn= (unsigned char *)(npvar_list[var_iden]+col+row*nbcol); iuc=(unsigned char *)(npvar_list[var_iden]+col+row*nbcol); //printf("\n avant isz=%d ",*iuc); keywait(); rtn=(*iuc)++; //printf("\n apres isz=%d ",*iuc); keywait(); //rtn = (*((unsigned char *)(npvar_list[var_iden]+col+row*nbcol))++); break; case 11: //sc isc=(signed char *)(npvar_list[var_iden]+col+row*nbcol); rtn= (*isc)++; break; case 2: //us ius=(unsigned short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*ius)++; //printf("\nin lelem-2",rtn); break; case 22: //ss iss=(signed short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*iss)++; break; case 4: //ui iui=(unsigned int *)(npvar_list[var_iden]+4*col+row*nbcol*4); rtn= (*iui)++; break; case 44: //si isi=(signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4); rtn= (*isi)++; break; } return rtn; break; case 52: //dynamic lists 'newdata' ptr++; var_iden=*(ptr+1); //printf1_in_cx_vm_corpse("in lelem wdata, type=%d",newdata_var_type[var_iden],150,100,-1); if(newdata_var_nbrows[var_iden]!=0) { //printf1_in_cx_vm_corpse("dynamique lelem%s","",150,110,-1); data_beginning_ptr=((*(fonc[*(ptr)]))()); //ptr+=2; //skip var data_type=newdata_var_type[var_iden]; degree=*(ptr+1); //printf1_in_cx_vm_corpse("degree=%d",degree,150,10,-1); ptr+=2; //skip degree //ptr+=2; //skip data_type nbrow=newdata_var_nbrows[var_iden]; nbcol=newdata_var_nbcols[var_iden]; //printf1_in_cx_vm_corpse("nbrow=%d",nbrow,150,20,-1); //printf1_in_cx_vm_corpse("nbcol=%d",nbcol,150,30,-1); row=((*(fonc[*(ptr)]))()); //printf1_in_cx_vm_corpse("row=%d",row,150,40,-1); if(degree==2) col=((*(fonc[*(ptr)]))()); else col=0; //printf1_in_cx_vm_corpse("col=%d",col,150,50,-1); //keywait(); } switch(data_type) { case 1: //uc //rtn= (unsigned char *)(npvar_list[var_iden]+col+row*nbcol); iuc=(unsigned char *)(npvar_list[var_iden]+col+row*nbcol); //printf("\n avant isz=%d ",*iuc); keywait(); rtn=(*iuc)++; //printf("\n apres isz=%d ",*iuc); keywait(); //rtn = (*((unsigned char *)(npvar_list[var_iden]+col+row*nbcol))++); break; case 11: //sc isc=(signed char *)(npvar_list[var_iden]+col+row*nbcol); rtn= (*isc)++; break; case 2: //us ius=(unsigned short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*ius)++; //printf("\nin lelem-2",rtn); break; case 22: //ss iss=(signed short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*iss)++; break; case 4: //ui iui=(unsigned int *)(npvar_list[var_iden]+4*col+row*nbcol*4); rtn= (*iui)++; break; case 44: //si isi=(signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4); rtn= (*isi)++; break; } return rtn; break; } my_exit("Error: ++ only with direct var or *(uc*),..."); } int dszz(void) { unsigned char *iuc; unsigned short *ius; unsigned int *iui; signed char *isc; signed short *iss; signed int *isi; char *data_beginning_ptr; //for lelem unsigned char degree,data_type,var_iden; unsigned short nbrow,nbcol,row_iden,col_iden,row,col; signed int rtn; ptr++; switch(*ptr) { case 6: //var ptr+=2; return (npvar_list[*(ptr-1)])--; break; case 75: ptr++; iuc=((unsigned char*)((*(fonc[*(ptr)]))())); (*iuc)--; return *iuc+1; break; case 76: ptr++; ius=((unsigned short*)((*(fonc[*(ptr)]))())); (*ius)--; return *ius+1; break; case 77: ptr++; iui=((unsigned int*)((*(fonc[*(ptr)]))())); (*iui)--; return *iui+1; break; case 78: ptr++; isc=((signed char*)((*(fonc[*(ptr)]))())); (*isc)--; return *isc+1; break; case 79: ptr++; iss=((signed short*)((*(fonc[*(ptr)]))())); (*iss)--; return *iss+1; break; case 80: ptr++; isi=((signed int*)((*(fonc[*(ptr)]))())); printf("\nin isz si, ptr=%d",isi); *(isi)--; return *isi+1; break; case 51: //lelem_tag //printf("\nL_elem tag"); keywait(); ptr++; //skip lelem tag var_iden=*(ptr+1); ptr+=2; //skip var degree=*(ptr+1); //printf("\ndegre=%d",degree); keywait(); ptr+=2; //skip degree data_type=*(ptr+1); ptr+=2; nbrow=npvar_list_row_columns[var_iden][0]; nbcol=npvar_list_row_columns[var_iden][1]; col=0; if(nbrow==0) my_exit("Error:not defined list or matrix"); row=((*(fonc[*(ptr)]))()); if(degree==2) { col=((*(fonc[*(ptr)]))()); } //printf("\ndata type=%d",data_type); switch(data_type) { case 1: //uc //rtn= (unsigned char *)(npvar_list[var_iden]+col+row*nbcol); iuc=(unsigned char *)(npvar_list[var_iden]+col+row*nbcol); //printf("\n avant isz=%d ",*iuc); keywait(); rtn=(*iuc)--; //printf("\n apres isz=%d ",*iuc); keywait(); //rtn = (*((unsigned char *)(npvar_list[var_iden]+col+row*nbcol))++); break; case 11: //sc isc=(signed char *)(npvar_list[var_iden]+col+row*nbcol); rtn= (*isc)--; break; case 2: //us ius=(unsigned short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*ius)--; //printf("\nin lelem-2",rtn); break; case 22: //ss iss=(signed short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*iss)--; break; case 4: //ui iui=(unsigned int *)(npvar_list[var_iden]+4*col+row*nbcol*4); rtn= (*iui)--; break; case 44: //si isi=(signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4); rtn= (*isi)--; break; } return rtn; case 52: //dynamic lists 'newdata' ptr++; var_iden=*(ptr+1); //printf1_in_cx_vm_corpse("in lelem wdata, type=%d",newdata_var_type[var_iden],150,100,-1); if(newdata_var_nbrows[var_iden]!=0) { //printf1_in_cx_vm_corpse("dynamique lelem%s","",150,110,-1); data_beginning_ptr=((*(fonc[*(ptr)]))()); //ptr+=2; //skip var data_type=newdata_var_type[var_iden]; degree=*(ptr+1); //printf1_in_cx_vm_corpse("degree=%d",degree,150,10,-1); ptr+=2; //skip degree //ptr+=2; //skip data_type nbrow=newdata_var_nbrows[var_iden]; nbcol=newdata_var_nbcols[var_iden]; //printf1_in_cx_vm_corpse("nbrow=%d",nbrow,150,20,-1); //printf1_in_cx_vm_corpse("nbcol=%d",nbcol,150,30,-1); row=((*(fonc[*(ptr)]))()); //printf1_in_cx_vm_corpse("row=%d",row,150,40,-1); if(degree==2) col=((*(fonc[*(ptr)]))()); else col=0; //printf1_in_cx_vm_corpse("col=%d",col,150,50,-1); //keywait(); switch(data_type) { case 1: //uc //rtn= (unsigned char *)(npvar_list[var_iden]+col+row*nbcol); iuc=(unsigned char *)(npvar_list[var_iden]+col+row*nbcol); //printf("\n avant isz=%d ",*iuc); keywait(); rtn=(*iuc)--; //printf("\n apres isz=%d ",*iuc); keywait(); //rtn = (*((unsigned char *)(npvar_list[var_iden]+col+row*nbcol))++); break; case 11: //sc isc=(signed char *)(npvar_list[var_iden]+col+row*nbcol); rtn= (*isc)--; break; case 2: //us ius=(unsigned short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*ius)--; //printf("\nin lelem-2",rtn); break; case 22: //ss iss=(signed short *)(npvar_list[var_iden]+2*col+row*nbcol*2); rtn= (*iss)--; break; case 4: //ui iui=(unsigned int *)(npvar_list[var_iden]+4*col+row*nbcol*4); rtn= (*iui)--; break; case 44: //si isi=(signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4); rtn= (*isi)--; break; } return rtn; } } my_exit("Error: -- only with direct var or *(uc*),..."); } int printff(void) { unsigned char nbargs,*str,str_buf[2000],str_buf2[2200],buf[100]; int i; int args_list[10],str_len,i2,i3; ptr+=3; nbargs=*(ptr-1); str=((*(fonc[*(ptr)]))()); if((str_len=strlen(str))>2000) my_exit("Error:string too long in printf"); i3=0; for(i2=0;i26) my_exit("Error:Too much args in printf (6 maxi)"); } int sprintff(void) { unsigned char nbargs,i,*str,*buff;//,str_buf[2000]; int args_list[10],str_len,i2,i3; ptr+=3; nbargs=*(ptr-1); buff=((*(fonc[*(ptr)]))()); str=((*(fonc[*(ptr)]))()); /* if((str_len=strlen(str))>2000) my_exit("Error:string too long in printf"); i3=0; for(i2=0;i26) my_exit("Error:Too much args in sprintf (6 maxi)"); } int funcc(void) { ptr++; ptr=endfunc_ptr[*(ptr+1)]; //+2 //goto after func, skip the func. For calling a func, use exec_fc } int endfuncc(void) { ptr+=3; } int execfc(void) { unsigned char i,iden,nbargs,nbargs_local,*first_instruc_ptr/*,args_var_iden_list[6]*/,*temp_ptr,*temp_ptr2,*ptr_fin,*ptr_after_exec_func; int args_save_list[16]; ptr++; //skip execfc tag ptr+=2; //skip iden iden=*(ptr-1); //iden of function to launch //printf("\nin execfunc, iden=%d",iden); first_instruc_ptr=func_ptr[iden]; //printf("\nfirst instruc=%d",*first_instruc_ptr); ptr+=2; //skip nbargs nbargs=*(ptr-1); //printf("\nnbargs func=%d",nbargs); for(i=0;i=first_instruc_ptr && ptr=nbcol || row>=nbrow) return 0; data_beginning_ptr=ptr; data_type=newdata_var_type[var_iden]; */ } if(degree==2) //matrix { switch(data_type) { case 1: //uc return *(unsigned char *)((unsigned char *)data_beginning_ptr+col+nbcol*row); break; case 11: //sc return *(signed char *)((signed char *)data_beginning_ptr+col+nbcol*row); break; case 2: //us return *(unsigned short *)((unsigned short *)data_beginning_ptr+col+nbcol*row); break; case 22: //ss return *(signed short *)((signed short *)data_beginning_ptr+col+nbcol*row); break; case 4: //ui return *(unsigned int *)((unsigned int *)data_beginning_ptr+col+nbcol*row); break; case 44: //si return *(signed int *)((signed int *)data_beginning_ptr+col+nbcol*row); break; } } else //list { switch(data_type) { case 1: //uc return *(unsigned char *)((unsigned char *)data_beginning_ptr+row); break; case 11: //sc return *(signed char *)((signed char *)data_beginning_ptr+row); break; case 2: //us return *(unsigned short *)((unsigned short *)data_beginning_ptr+row); break; case 22: //ss return *(signed short *)((signed short *)data_beginning_ptr+row); break; case 4: //ui return *(unsigned int *)((unsigned int *)data_beginning_ptr+row); break; case 44: //si return *(signed int *)((signed int *)data_beginning_ptr+row); break; } } return 0; } int stoelem(void) { unsigned char degree,data_type,var_iden,va; unsigned short nbrow,nbcol,row_iden,col_iden,row,col; signed int rtn; ptr++; //skip sto_tag ptr++; //skip lelem var_iden=*(ptr+1); ptr+=2; //skip var degree=*(ptr+1); ptr+=2; //skip degree if(newdata_var_nbrows[var_iden]!=0) //if newdata { data_type=newdata_var_type[var_iden]; //ptr+=2; //skip data_type nbrow=newdata_var_nbrows[var_iden]; nbcol=newdata_var_nbcols[var_iden]; if(nbrow==0) my_exit("Error:not defined list or matrix ('newdata')"); col=0; row=((*(fonc[*(ptr)]))()); if(degree==2) { col=((*(fonc[*(ptr)]))()); } /* printf1_in_cx_vm_corpse("degree=%d",degree,0,70,-1); printf1_in_cx_vm_corpse("nbrow=%d",nbrow,0,80,-1); printf1_in_cx_vm_corpse("nbcol=%d",nbcol,0,90,-1); printf1_in_cx_vm_corpse("row=%d",row,0,100,-1); printf1_in_cx_vm_corpse("col=%d",col,0,110,-1); */ } else //static { data_type=*(ptr+1); ptr+=2; nbrow=npvar_list_row_columns[var_iden][0]; nbcol=npvar_list_row_columns[var_iden][1]; col=0; if(nbrow==0) my_exit("Error:not defined list or matrix"); row=((*(fonc[*(ptr)]))()); if(degree==2) { col=((*(fonc[*(ptr)]))()); } } //va=0; switch(data_type) { case 1: //uc return *(unsigned char *)(npvar_list[var_iden]+col+row*nbcol)=((*(fonc[*(ptr)]))()); break; case 11: //sc return *(signed char *)(npvar_list[var_iden]+col+row*nbcol)=((*(fonc[*(ptr)]))()); break; case 2: //us return *(unsigned short *)(npvar_list[var_iden]+col*2+row*nbcol*2)=((*(fonc[*(ptr)]))()); break; case 22: //ss return *(signed short *)(npvar_list[var_iden]+col*2+row*nbcol*2)=((*(fonc[*(ptr)]))()); break; case 4: //ui return *(unsigned int *)(npvar_list[var_iden]+col*4+row*nbcol*4)=((*(fonc[*(ptr)]))()); break; case 44: //si return *(signed int *)(npvar_list[var_iden]+col*4+row*nbcol*4)=((*(fonc[*(ptr)]))()); break; } my_exit("Error in sto elem"); //if(va==0) my_exit("\nError in sto in list or matrix"); } int getlcdad(void) { ptr++; return (unsigned int)lcdad; } int setlcdad(void) { ptr++; return lcdad=((*(fonc[*(ptr)]))()); } int keytest(void) { int k; ptr++; k=((*(fonc[*(ptr)]))()); //printf("\n in keytest=%d",k); switch(k) { case 1004: return isKeyPressed(KEY_NSPIRE_LEFT); break; case 1008: return isKeyPressed(KEY_NSPIRE_UP); break; case 1006: return isKeyPressed(KEY_NSPIRE_RIGHT); break; case 1002: return isKeyPressed(KEY_NSPIRE_DOWN); break; case 10086: return isKeyPressed(KEY_NSPIRE_UPRIGHT); break; case 10062: return isKeyPressed(KEY_NSPIRE_RIGHTDOWN); break; case 10024: return isKeyPressed(KEY_NSPIRE_DOWNLEFT); break; case 10048: return isKeyPressed(KEY_NSPIRE_LEFTUP); break; case 1: return isKeyPressed(KEY_NSPIRE_ESC); break; case 2: return isKeyPressed(KEY_NSPIRE_HOME); break; case 4: return isKeyPressed(KEY_NSPIRE_DOC); break; case 5: return isKeyPressed(KEY_NSPIRE_TAB); break; case 6: return isKeyPressed(KEY_NSPIRE_MENU); break; case 7: return isKeyPressed(KEY_NSPIRE_CTRL); break; case 8: return isKeyPressed(KEY_NSPIRE_SHIFT); break; case 9: return isKeyPressed(KEY_NSPIRE_VAR); break; case 10: return isKeyPressed(KEY_NSPIRE_DEL); break; case 37: return isKeyPressed(KEY_NSPIRE_ENTER); break; } my_exit("Error:Unimplemented keytest"); } int notll(void) { ptr++; return !((*(fonc[*(ptr)]))()); } int andbb(void) { ptr++; return ((*(fonc[*(ptr)]))()) & ((*(fonc[*(ptr)]))()); } int orbb(void) { ptr++; return ((*(fonc[*(ptr)]))()) | ((*(fonc[*(ptr)]))()); } int blockk(void) { block_skip(); return 0; } /* char * value; show_msg_user_input("title", "msg", "default", &value); printf(" rtn msgbox %d",show_msgbox("Hello" ,value)); if(value) free(value); */ int my_msgbox(unsigned char *title_str, unsigned char *msg_str) { unsigned char buf[100]; unsigned short *lcd_buf;//lcd_buf[320][240]; unsigned short t_len,m_len,t_len_corrected,m_len_corrected,t_len_printed,m_len_printed; unsigned char border_thick,shift_from_int_border,font_w,font_h; unsigned short str_max_len,str_min_len,str_len_final,font_temp,font_color_temp; signed short f_x,f_y,w,h,w_min,w_max; unsigned short *lcdadtemp; int rtn; //printf("\nla a"); keywait(); lcdadtemp=lcdad; lcdad=REAL_SCREEN_BASE_ADDRESS; lcd_buf=malloc(320*240*2); if(lcd_buf==0) my_exit("\nError allocating memory in 'msgbox()'"); //printf("\nla b"); keywait(); font_temp=font; //save current font font_color_temp=chars_color; font=1; chars_color=-1; border_thick=12; shift_from_int_border=2; font_w=8; font_h=8; //w_min=60; w_max=320; h=2*border_thick+2*shift_from_int_border+2*font_h; //h_min=30; //h_max=240; str_min_len=10; str_max_len=(w_max-2*border_thick-2*shift_from_int_border)/font_w; t_len=strlen(title_str); m_len=strlen(msg_str); t_len_corrected=t_len; m_len_corrected=m_len; if(t_len>str_max_len) t_len_corrected=str_max_len; if(m_len>str_max_len) m_len_corrected=str_max_len; if(t_len0) { i--; my_fillRect_real_address(x,y,str_len_max*8,8,0); if(strlen(my_gets_x_y_len_buf)>0) my_gets_x_y_len_buf[strlen(my_gets_x_y_len_buf)-1]=0; drawString_x_y(my_gets_x_y_len_buf,x,y,1,font_color); } if(get_key_ascii(k) && i='a' && get_key_ascii(k)<='z' && shift_locked) ascii_str[0]=get_key_ascii(k)-32; else ascii_str[0]=get_key_ascii(k); strcat(my_gets_x_y_len_buf,ascii_str); drawString_x_y(my_gets_x_y_len_buf,x,y,1,font_color); i++; } k=keywait(); } while(getkey()) ; return my_gets_x_y_len_buf; } int my_gets(int x,int y,int str_len_max,unsigned char *default_str,unsigned short font_color) //use default font { int k,i,v; unsigned char ascii_str[2],buf[100],shift_locked,font_w,font_h; font_w=fonts_w_list[font]; font_h=fonts_h_list[font]; shift_locked=0; my_gets_x_y_len_buf[0]=0; ascii_str[1]=0; for(v=0;v0) { i--; my_fillRect_real_address(x,y,str_len_max*font_w,font_h,0); if(strlen(my_gets_x_y_len_buf)>0) my_gets_x_y_len_buf[strlen(my_gets_x_y_len_buf)-1]=0; drawString_x_y(my_gets_x_y_len_buf,x,y,font,font_color); } if(get_key_ascii(k) && i='a' && get_key_ascii(k)<='z' && shift_locked) ascii_str[0]=get_key_ascii(k)-32; else ascii_str[0]=get_key_ascii(k); strcat(my_gets_x_y_len_buf,ascii_str); drawString_x_y(my_gets_x_y_len_buf,x,y,font,font_color); i++; } k=keywait(); } while(getkey()) ; return my_gets_x_y_len_buf; } int getss(void) { unsigned short len_max; int rtn; ptr++; len_max=((*(fonc[*(ptr)]))()); rtn=my_gets(x_pos,y_pos,len_max,"",chars_color); return rtn; } int msg_request_str_box(unsigned char *title_str,unsigned char *msg_str,unsigned char *default_str,unsigned char **request_str) { unsigned char buf[100]; unsigned char msg_str_double_points_added[100],*rtn_gets_str; unsigned short *lcd_buf;//lcd_buf[320][240]; unsigned short t_len,m_len,t_len_corrected,m_len_corrected,t_len_printed,m_len_printed; unsigned char border_thick,shift_from_int_border,font_w,font_h; unsigned short str_max_len,str_min_len,str_len_final,font_temp,font_color_temp; signed short f_x,f_y,w,h,w_min,w_max; int rtn; lcd_buf=malloc(320*240*2); if(lcd_buf==0) my_exit("\nError allocating memory in 'request1str()'"); msg_request_str_box_return[0]=0; //Add the double point a message str if(strlen(msg_str)>=99) //return -1; { free(lcd_buf); return -1; } strcpy(msg_str_double_points_added,msg_str); strcat(msg_str_double_points_added,":"); msg_str=msg_str_double_points_added; font_temp=font; //save current font font_color_temp=chars_color; font=1; chars_color=-1; border_thick=12; shift_from_int_border=2; font_w=8; font_h=8; //w_min=60; w_max=320; h=2*border_thick+2*shift_from_int_border+2*font_h/*added after*/+1*font_h+2*shift_from_int_border; //h_min=30; //h_max=240; str_min_len=10+10; //modif str_max_len=(w_max-2*border_thick-2*shift_from_int_border)/font_w; t_len=strlen(title_str); m_len=strlen(msg_str); t_len_corrected=t_len; m_len_corrected=m_len; if(t_len>str_max_len) t_len_corrected=str_max_len; if(m_len>str_max_len) m_len_corrected=str_max_len; if(t_len (b) ? (a) : (b)) /* int setrectn(void) { unsigned char iden; SDL_Rect *r; int x,y,w,h; ptr++; iden=((*(fonc[*(ptr)]))()); //rect iden if(iden>=20) my_exit("Error:with setrectn(iden,{,,,}), iden must be from 0 to 19"); ptr++; //skip block_tag r=&sdl_rect_list[iden]; r->x=((*(fonc[*(ptr)]))()); r->y=((*(fonc[*(ptr)]))()); r->w=((*(fonc[*(ptr)]))()); r->h=((*(fonc[*(ptr)]))()); ptr++; //skip end_tag (block) return r; }*/ /* int sdlinit(void) { ptr++; if(SDL_Init(SDL_INIT_VIDEO) == -1) { printf("Couldn't initialize SDL: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } screen = SDL_SetVideoMode(320, 240, has_colors ? 16 : 8, SDL_SWSURFACE); if(screen == NULL) { printf("Couldn't initialize display: %s\n", SDL_GetError()); SDL_Quit(); exit(EXIT_FAILURE); } SDL_ShowCursor(SDL_DISABLE); is_sdl_used=1; return screen; } */ int bufonn(void) { ptr++; is_graph_buf=1; lcdad=malloc(320*240*2); if(lcdad) memcpy(lcdad,REAL_SCREEN_BASE_ADDRESS,320*240*2); return lcdad; } int bufofff(void) { ptr++; if(is_graph_buf) { is_graph_buf=0; if(lcdad) free(lcdad); } return lcdad=REAL_SCREEN_BASE_ADDRESS; } /* SDL_Surface *load_bmp(const char *file) { SDL_Surface *tmp, *image; tmp = SDL_LoadBMP(file); if(tmp == NULL) return NULL; image = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); return image; } */ // Loads a 24-bits bitmap image into an n2DLib-compatible unsigned short* array /* unsigned short * loadBMP(const char *path, unsigned short transparency) { int size, width, height, offset, i, j, padding; uint16_t *returnValue; FILE *temp = fopen(path, "rb"); if(!temp) return NULL; // Check if the file's 2 first char are BM (indicates bitmap) if(!(fgetc(temp) == 0x42 && fgetc(temp) == 0x4d)) { printf("Image is not a bitmap\n"); fclose(temp); return NULL; } // Check if the file is in 24 bpp fseek(temp, 0x1c, SEEK_SET); if(fgetc(temp) != 24) { printf("Wrong format : bitmap must use 24 bpp\n"); fclose(temp); return NULL; } // Get the 4-bytes pixel width and height, situated respectively at 0x12 and 0x16 fseek(temp, 0x12, SEEK_SET); width = fgetc(temp) | (fgetc(temp) << 8) | (fgetc(temp) << 16) | (fgetc(temp) << 24); //fseek(temp, 0x16, SEEK_SET); height = fgetc(temp) | (fgetc(temp) << 8) | (fgetc(temp) << 16) | (fgetc(temp) << 24); size = width * height + 3; // include header // Gets the 4-bytes offset to the start of the pixel table, situated at 0x0a fseek(temp, 0x0a, SEEK_SET); offset = fgetc(temp) | (fgetc(temp) << 8) | (fgetc(temp) << 16) | (fgetc(temp) << 24); fseek(temp, offset, SEEK_SET); returnValue = malloc(size * sizeof(unsigned short)); if(!returnValue) { printf("Couldn't allocate memory\n"); fclose(temp); return NULL; } returnValue[0] = width; returnValue[1] = height; returnValue[2] = transparency; padding = 4 - (width * 3 - (width * 3 / 4) * 4); padding %= 4; for(j = height - 1; j >= 0; j--) { for(i = 0; i < width; i++) returnValue[j * width + i + 3] = (unsigned short)((fgetc(temp) >> 3) | ((fgetc(temp) >> 2) << 5) | ((fgetc(temp) >> 3) << 11)); // Skip padding for widths that are not a multiple of 4 for(i = 0; i < padding; i++) fgetc(temp); } fclose(temp); return returnValue; } */ int loadbmpp(void) { unsigned char *file; unsigned short transparency; //unsigned short transparency; ptr++; file=((*(fonc[*(ptr)]))()); transparency=((*(fonc[*(ptr)]))()); //transparency=((*(fonc[*(ptr)]))()); //couleur de transparence return loadBMP(file,transparency); } int bufflipp(void) { ptr++; memcpy(REAL_SCREEN_BASE_ADDRESS,lcdad,320*240*2); } /* void setPixel( int x, int y, unsigned short c) { if(x < 320 && x>=0 && y < 240 && y>=0) *((unsigned short*)lcdad + x + y * 320) = c; } */ /* void my_setpixel(int x,int y,unsigned short color) { if(x<0 || x>320 || y<0 || y>240) return; *(lcdad+x+320*y)=color; } */ void my_drawSprite(unsigned short *src, int _x, int _y) { int x, y, w = src[0] + _x, h = src[1] + _y, c = 3; for(y = _y; y < h; y++) { for(x = _x; x < w; x++, c++) { if(src[c] != src[2]) *(lcdad+x+320*y)=src[c]; //my_setpixel(x, y, src[c]); } if(y > 239) break; } } int sdlsprite(void) { int x,y; unsigned short *sprt; //SDL_Surface *sprt; //SDL_Rect src_rect, screen_pos; ptr++; //void draw_tile(SDL_Surface *tileset, int tile_num, int x, int y) { sprt=((*(fonc[*(ptr)]))()); x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); my_drawSprite(sprt,x,y); } void drawSpriteScaledd(unsigned short* source, const Rect* info, int flash, unsigned short flashColor) { Fixed dx = itofix(source[0]) / info->w; Fixed dy = itofix(source[1]) / info->h; int x, y, _x = info->x + info->w / 2, _y = info->y + info->h / 2; Fixed tx = 0, ty = 0; unsigned short c; for(y = info->y - info->h / 2; y < _y; y++, ty += dy) { for(x = info->x - info->w / 2, tx = 0; x < _x; x++, tx += dx) { c = getPixel(source, fixtoi(tx), fixtoi(ty)); if(c != source[2]) *(lcdad+x+320*y)=c; //setPixel(x, y, flash ? flashColor : c); if(x > 319) break; } if(y > 239) break; } } int spritescaledd(void) { int x,y,w,h; unsigned short *sprite; Rect spr; Fixed theta = 45; ptr++; sprite=((*(fonc[*(ptr)]))()); spr.x=((*(fonc[*(ptr)]))()); spr.y=((*(fonc[*(ptr)]))()); spr.w = ((*(fonc[*(ptr)]))()); spr.h = ((*(fonc[*(ptr)]))()); drawSpriteScaledd(sprite, &spr, 0, 0); // don't flash } void my_drawSpriteRotated(unsigned short* source, const Rect* sr, const Rect* rc, Fixed angle, int flash, unsigned short flashColor) { Rect defaultRect = { source[0] / 2, source[1] / 2, 0, 0 }; Rect fr; unsigned short currentPixel; Fixed dX = fixcos(angle), dY = fixsin(angle); if(rc == NULL) rc = &defaultRect; getBoundingBox(-rc->x, -rc->y, source[0], source[1], 0, 0, angle, &fr); fr.x += sr->x; fr.y += sr->y; fr.w += fr.x; fr.h += fr.y; Rect cp, lsp, cdrp; // Feed fixed-point to get fixed-point rotate(itofix(fr.x - sr->x), itofix(fr.y - sr->y), 0, 0, -angle, &lsp); for(cp.y = fr.y; cp.y <= fr.h; cp.y++) { cdrp.x = lsp.x; cdrp.y = lsp.y; for(cp.x = fr.x; cp.x <= fr.w; cp.x++) { if(cp.x >= 0 && cp.x < 320 && cp.y >= 0 && cp.y < 240) { currentPixel = getPixel(source, fixtoi(cdrp.x) + rc->x, fixtoi(cdrp.y) + rc->y); if(currentPixel != source[2]) { *(lcdad+cp.x+320*cp.y)=currentPixel; //setPixelUnsafe(cp.x, cp.y, flash ? flashColor : currentPixel); } } cdrp.x += dX; cdrp.y += dY; } lsp.x -= dY; lsp.y += dX; } } int spriterotatedd(void) { int x,y,w,h; unsigned short *sprite; Rect spr, nullRect = {0, 0, 0, 0}; Fixed theta = 128;//45; ptr++; sprite=((*(fonc[*(ptr)]))()); spr.x=((*(fonc[*(ptr)]))()); spr.y=((*(fonc[*(ptr)]))()); theta=((*(fonc[*(ptr)]))()); // 0 to 128 nullRect.x=sprite[0]/2; //w nullRect.y=sprite[1]/2; //h //spr.w = 60; //((*(fonc[*(ptr)]))()); //spr.h = 60; //((*(fonc[*(ptr)]))()); my_drawSpriteRotated(sprite,&spr,&nullRect,theta,0,0); } int andlogic(void) { //int v1,v2; ptr++; //printf("\nin andl, v1 *ptr=%d",*ptr); //v1=((*(fonc[*(ptr)]))()); //printf("v2 *ptr=%d",*ptr); keywait(); //v2=((*(fonc[*(ptr)]))()); return ((*(fonc[*(ptr)]))()) && ((*(fonc[*(ptr)]))()); } int orlogic(void) { ptr++; return ((*(fonc[*(ptr)]))()) || ((*(fonc[*(ptr)]))());; } int timerinitt(void) { ptr++; if(is_timer1_activated==0) timer_init(1); is_timer1_activated=1; //return SDL_GetTicks(); } int timeroff(void) { ptr++; if(is_timer1_activated) { timer_load(1, 0); timer_restore(1); } is_timer1_activated=0; } int timersett(void) { ptr++; if(is_timer1_activated) timer_load(1, ((*(fonc[*(ptr)]))())); } int timerreadd(void) { ptr++; if(is_timer1_activated==1) return timer_read(1); return 0; } int delayy(void) { unsigned int d; ptr++; d=((*(fonc[*(ptr)]))()); /* if(is_timer1_activated==0) { timer_init(0); is_timer1_activated=1; } */ timer_init(0); timer_load(0,d*33); while(timer_read(0)) ; timer_restore(0); } int updaterectt(void) { signed int x,y,w,h,i,nbbytes; unsigned short *pbuf,*preal; unsigned int _x,_y,_w,_h; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); if(!is_graph_buf) return 0; _x= max(x, 0); _y = max(y, 0); _w = min(320 - _x, w - _x + x); _h = min(240 - _y, h - _y + y); nbbytes=_w*2; //per line pbuf=(unsigned short *)(lcdad+_x+320*2*_y); preal=(((unsigned short *)REAL_SCREEN_BASE_ADDRESS)+_x+320*_y); for(i=0;i<_h;i++) { memcpy(preal,pbuf,nbbytes); preal+=320; pbuf+=320; } return 1; } int setPixell(void) { int x,y,color; unsigned short *p; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); if(x<0 || x>320 || y<0 || y>240) return; p=lcdad; *(unsigned short *)(p+x+320*y)=color; } int getPixell(void) { int x,y; int r; //unsigned short *p; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); //color=((*(fonc[*(ptr)]))()); //if(x<0 || x>320 || y<0 || y>240) return; //p=lcdad; r=*(unsigned short *)(lcdad+x+320*y); if(r==65535) return -1; return r; } void my_setpixel(int x,int y, unsigned short color) { *(unsigned short *)(lcdad+x+320*y)=color; } void my_memset(unsigned short *dest,int value_16,int nb_short_num) //memset for unsigned short { unsigned int nb32,i,nb8,color_32,count; unsigned short *short_ptr,*ptr; unsigned int *ptr32_begin,*ptr32_end; short_ptr=(unsigned short*)&color_32; *(short_ptr+0)=value_16; *(short_ptr+1)=value_16; if((unsigned int)dest%4==0) //début %4==0 even x { ptr32_begin=dest; if(nb_short_num%2==0) { //ptr32_end=dest+nb_short_num; count=nb_short_num/2; while(count--) *ptr32_begin++ = color_32; return; } else { count=nb_short_num/2; while(count--) *ptr32_begin++ = color_32; *(unsigned short *)ptr32_begin=value_16; return; } } else //not even x { *dest=value_16; ptr32_begin=dest+1; if(nb_short_num%2==0) { //ptr32_end=dest+nb_short_num; count=(nb_short_num-1)/2; while(count--) *ptr32_begin++ = color_32; *(unsigned short *)ptr32_begin=value_16; return; } else { count=(nb_short_num-1)/2; while(count--) *ptr32_begin++ = color_32; //*(unsigned short *)ptr32_begin=value_16; return; } } } int fillrectt(void) { signed int x,y,w,h,color,ix,iy,iw,ih; unsigned int _x,_y,_w,_h; unsigned short *p; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); _x= max(x, 0); _y = max(y, 0); _w = min(320 - _x, w - _x + x); _h = min(240 - _y, h - _y + y); p=lcdad; for(iy=_y;iy<_y+_h;iy++) { //memset((unsigned short *)(p+x+320*iy),color,w*2); my_memset((unsigned short *)(p+_x+320*iy),color,_w); } } int getspritew(void) { unsigned short *sprite; ptr++; sprite=((*(fonc[*(ptr)]))()); return sprite[0]; } int getspriteh(void) { unsigned short *sprite; ptr++; sprite=((*(fonc[*(ptr)]))()); return sprite[1]; } int getspritemsk(void) { unsigned short *sprite; ptr++; sprite=((*(fonc[*(ptr)]))()); return sprite[2]; } int setspritemsk(void) { unsigned short *sprt,color; ptr++; sprt=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); return sprt[2]=color; } int drwline(void) { //void drawLine(int x1, int y1, int x2, int y2, unsigned short c) int x1,y1,x2,y2,dx,dy,sx,sy,err,e2; unsigned short color; ptr++; x1=((*(fonc[*(ptr)]))()); y1=((*(fonc[*(ptr)]))()); x2=((*(fonc[*(ptr)]))()); y2=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); dx = abs(x2-x1); dy = abs(y2-y1); sx = (x1 < x2)?1:-1; sy = (y1 < y2)?1:-1; err = dx-dy; while (!(x1 == x2 && y1 == y2)) { my_setpixel(x1,y1,color); //setPixel(x1,y1,c); //*(unsigned short *)(lcdad+x1+320*y1)=color; e2 = 2*err; if (e2 > -dy) { err = err - dy; x1 = x1 + sx; } if (e2 < dx) { err = err + dx; y1 = y1 + sy; } } } int scrollleft(void) { signed int x,y,w,h,ix,iy,iw,ih; int _x,_y,_w,_h,_xori,_wori,n; unsigned int nb_pix,n32,*uiptr,n16; //ori unsigned short *usptr; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); nb_pix=((*(fonc[*(ptr)]))()); _x= max(x, 0); _y = max(y, 0); _w = min(320 - _x, w - _x + x); _h = min(240 - _y, h - _y + y); if(_y+_h>240) return; if(nb_pix%2) //pour les décalages impairs { if(_x+_w+nb_pix>320) { n16=_w-nb_pix; } else n16=_w; for(iy=_y;iy<_y+_h;iy++) { usptr=lcdad+_x+iy*320; //for(n=0;n<(n32/nb_pix)*2;n++) for(n=0;n240) return; //239 //n32=_w/2; if(_x+_w+nb_pix>320) { n32=_w/2-nb_pix/2; } else n32=_w/2; for(iy=_y;iy<_y+_h;iy++) { uiptr=lcdad+_x+iy*320; //for(n=0;n<(n32/nb_pix)*2;n++) for(n=0;n240) return; if(nb_pix%2) //pour les décalages impairs. 2 fois plus lent que pairs { n16=_w-nb_pix; for(iy=_y;iy<_y+_h;iy++) { usptr=lcdad+_x+iy*320; //usptr=lcdad+_x+_w+iy*320; //for(n=0;n<(n32/nb_pix)*2;n++) for(n=n16;n>0;n--) { *(usptr+n)=*(usptr+n-nb_pix); } } } else //pour les décalages d'un nombre pair de pixels { _x=_x-_x%2; _y=_y-_y%2; _w=_w-_w%2; if(_y+_h>240) return; //239 n32=_w/2-nb_pix/2; for(iy=_y;iy<_y+_h;iy++) { uiptr=lcdad+_x+iy*320; //for(n=0;n<(n32/nb_pix)*2;n++) for(n=n32;n>0;n--) { *(uiptr+n)=*(uiptr+n-nb_pix/2); } } } } int scrolldown(void) { signed int x,y,w,h,ix,iy,iw,ih; int _x,_y,_w,_h,_xori,_wori,n,_xa,_xb; unsigned int nb_pix,n32,*uiptr,n16; //ori unsigned short *usptr; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); nb_pix=((*(fonc[*(ptr)]))()); _x= max(x, 0); _y = max(y, 0); _w = min(320 - _x, w - _x + x); _h = min(240 - _y, h - _y + y); if(_x%2) { //usptr=lcdad+_x+_y*320; for(iy=_y+_h-1;iy>_y+nb_pix;iy--) { *(lcdad+_x+iy*320)=*(lcdad+_x+(iy-nb_pix)*320); } _xa=_x+1; } else _xa=_x; if((_x+_w)%2) { for(iy=_y+_h-1;iy>_y+nb_pix;iy--) { *(lcdad+(_x+_w-1)+iy*320)=*(lcdad+(_x+_w-1)+(iy-nb_pix)*320); } _xb=_x+_w-1; } else _xb=_x+_w; for(iy=_y+_h-1;iy>_y+nb_pix;iy--) { for(ix=_xa;ix<_xb;ix+=2) { *(unsigned int *)(lcdad+ix+iy*320) = *(unsigned int *)(lcdad+ix+(iy-nb_pix)*320); } } } int scrollup(void) { signed int x,y,w,h,ix,iy,iw,ih; int _x,_y,_w,_h,_xori,_wori,n,_xa,_xb; unsigned int nb_pix,n32,*uiptr,n16; //ori unsigned short *usptr; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); nb_pix=((*(fonc[*(ptr)]))()); _x= max(x, 0); _y = max(y, 0); _w = min(320 - _x, w - _x + x); _h = min(240 - _y, h - _y + y); if(_x%2) { //for(iy=_y+_h-1;iy>_y+nb_pix;iy--) for(iy=_y;iy<_y+_h-nb_pix;iy++) { *(lcdad+_x+iy*320)=*(lcdad+_x+(iy+nb_pix)*320); } _xa=_x+1; } else _xa=_x; if((_x+_w)%2) { //for(iy=_y+_h-1;iy>_y+nb_pix;iy--) for(iy=_y;iy<_y+_h-nb_pix;iy++) { *(lcdad+(_x+_w-1)+iy*320)=*(lcdad+(_x+_w-1)+(iy+nb_pix)*320); } _xb=_x+_w-1; } else _xb=_x+_w; //ori /* for(iy=_y;iy<_y+_h-nb_pix;iy++) { for(ix=_xa;ix<_xb;ix+=2) { *(unsigned int *)(lcdad+ix+iy*320) = *(unsigned int *)(lcdad+ix+(iy+nb_pix)*320); } } */ //end ori for(iy=_y;iy<_y+_h-nb_pix;iy++) { for(ix=_xa;ix<_xb;ix+=2) { *(unsigned int *)(lcdad+ix+iy*320) = *(unsigned int *)(lcdad+ix+(iy+nb_pix)*320); } } } int scrollup2(void) { signed int x,y,w,h,ix,iy,iw,ih; int _x,_y,_w,_h,_xori,_wori,_xa,_xb; unsigned int nb_pix,n32,*uiptr,*uiptr1,*uiptr2,n16; //ori unsigned short *usptr,n; ptr++; for(iy=0;iy<240-1;iy++) //lcd heigth == 240 { uiptr1=(unsigned int *)(lcdad+iy*320); uiptr2=(unsigned int *)(lcdad+iy*320+320); n=0; while(n++<160) //lcd width==320 ; 160=320/2 { *(uiptr1++)=*(uiptr2++); //n++; } } } int setposition(void) { ptr++; x_pos=((*(fonc[*(ptr)]))()); y_pos=((*(fonc[*(ptr)]))()); } int getposx(void) { ptr++; return x_pos; } int getposy(void) { ptr++; return y_pos; } int settxtcolor(void) { ptr++; chars_color=((*(fonc[*(ptr)]))()); //edge_color=((*(fonc[*(ptr)]))()); return chars_color; } int ordd(void) { unsigned char *strr; ptr++; strr=((*(fonc[*(ptr)]))()); return strr[0]; } int locall(void) { my_exit("Error: 'local(...)' must be placed just after 'func fc_name(...)'"); } int setfontt(void) { ptr++; font=((*(fonc[*(ptr)]))()); if(font<0 || font>3) my_exit("Error in 'setfont(f)', 0<=f<=3 expected"); } int get_keyy(void) { //unsigned short i; //t_key report; ptr++; return getkey(); /* if(get_key_pressed(&report)) { i=0; //printf("\nkey pressed"); while(newprogcx_key_data_list[i].matching_num!=0) { if(isKey(report, newprogcx_key_data_list[i].k)) { //printf(" k=%d",newprogcx_key_data_list[i].matching_num); return newprogcx_key_data_list[i].matching_num; } i++; } } return 0; */ } int get_key_ascii(int keynum) { unsigned short i; i=0; while(newprogcx_key_data_list[i].matching_num!=0) { if(newprogcx_key_data_list[i].matching_num==keynum) { //printf("\nk=%d, i=%d,matching num=%d,str=%s,ascii=%c",keynum,i,newprogcx_key_data_list[i].matching_num,newprogcx_key_data_list[i].matching_description_str,newprogcx_key_data_list[i].char_value); return newprogcx_key_data_list[i].char_value; } i++; } return 0; } int keyascii(void) { unsigned short i,keynum; ptr++; keynum=((*(fonc[*(ptr)]))()); return get_key_ascii(keynum); } //void drawSpritePart(const unsigned short *src, int _x, int _y, const Rect* part, int flash, unsigned short flashColor) void my_drawSpritePart(unsigned short *src,int _x,int _y,Rect* part) { unsigned short c; int x, y, w = part->w + _x, h = part->h + _y, z = part->x, t = part->y; for(y = _y; y < h; y++, t++) { for(x = _x, z = part->x; x < w; x++, z++) { c = getPixel(src, z, t); if(c != src[2]) my_setPixel(x, y, c); if(x > 319) break; } if(y > 239) break; } } int sprtpart(void) { unsigned short *src;; int _x,_y; Rect part; ptr++; src=((*(fonc[*(ptr)]))()); _x=((*(fonc[*(ptr)]))()); _y=((*(fonc[*(ptr)]))()); ptr++; //skip block_tag part.x=((*(fonc[*(ptr)]))()); part.y=((*(fonc[*(ptr)]))()); part.w=((*(fonc[*(ptr)]))()); part.h=((*(fonc[*(ptr)]))()); ptr++; my_drawSpritePart(src,_x,_y,&part); } int newspritee(void) { unsigned short w,h,mask_color,*rtn_ptr; ptr++; w=((*(fonc[*(ptr)]))()); h=((*(fonc[*(ptr)]))()); mask_color=((*(fonc[*(ptr)]))()); rtn_ptr=malloc(2*w*h+3*2); if(rtn_ptr==0) return 0; rtn_ptr[0]=w; rtn_ptr[1]=h; rtn_ptr[2]=mask_color; return rtn_ptr; } int memmovee(void) { unsigned char *dest,*ori; unsigned int nbbytes;; ptr++; dest=((*(fonc[*(ptr)]))()); ori=((*(fonc[*(ptr)]))()); nbbytes=((*(fonc[*(ptr)]))()); return memmove(dest,ori,nbbytes); } int memmoveww(void) { unsigned short *dest,*ori; unsigned int nbshortt,i; ptr++; dest=((*(fonc[*(ptr)]))()); ori=((*(fonc[*(ptr)]))()); nbshortt=((*(fonc[*(ptr)]))()); for(i=0;i> 3) << 11) | ((gg >> 2) << 5) | (bb >> 3)); } int blitt(void) { unsigned short *src; int src_surface_w,src_surface_h,src_subx,src_suby,src_subw,src_subh; //src unsigned short *dest; int dest_surface_w,dest_surface_h,dest_subx,dest_suby,dest_subw,dest_subh; //dest unsigned short *first_pix_src_ptr,*first_pix_dest_ptr; signed int iy,ix,nbline,nbpixbyline; ptr++; //All about SRC //first arg ptr++; //skip block_tag src=((*(fonc[*(ptr)]))()); src_surface_w=((*(fonc[*(ptr)]))()); src_surface_h=((*(fonc[*(ptr)]))()); ptr++; //skip end block tag //2nd arg ptr++; //skip block_tag src_subx=((*(fonc[*(ptr)]))()); src_suby=((*(fonc[*(ptr)]))()); src_subw=((*(fonc[*(ptr)]))()); src_subh=((*(fonc[*(ptr)]))()); ptr++; //skip end block tag //All about DEST //3eme arg ptr++; //skip block_tag dest=((*(fonc[*(ptr)]))()); dest_surface_w=((*(fonc[*(ptr)]))()); dest_surface_h=((*(fonc[*(ptr)]))()); ptr++; //skip end block tag //4eme arg ptr++; //skip block_tag dest_subx=((*(fonc[*(ptr)]))()); dest_suby=((*(fonc[*(ptr)]))()); //dest_subw=((*(fonc[*(ptr)]))()); //dest_subh=((*(fonc[*(ptr)]))()); ptr++; //skip end block tag first_pix_src_ptr=src+src_subx+src_surface_w*src_suby; first_pix_dest_ptr=dest+dest_subx+dest_surface_w*dest_suby; //nbline=min(src_subh,dest_subh); //nbpixbyline=min(src_subw,dest_subw); nbline=src_subh; nbpixbyline=src_subw; for(iy=0;iy>nbbits; } int rollll(void) { signed int v,nbbits; ptr++; nbbits=((*(fonc[*(ptr)]))()); v=((*(fonc[*(ptr)]))()); return v<100) return -1; p+=len+1; if(strcasecmp(p,"END")==0) { return 0; //end of list reached } return p; //return next str elem ptr } short get_dropdown_nb_elem(unsigned char *first_elem_ptr) //input must be formated { unsigned short n; unsigned char *next_elem_ptr; n=0; if(strcmp("END",first_elem_ptr)==0) return 0; //void list if(*first_elem_ptr==0) return 0; n=1; while((next_elem_ptr=get_next_str_elem(first_elem_ptr))!=0) { if(next_elem_ptr==-1) return -1; n++; first_elem_ptr=next_elem_ptr; } return n; } unsigned char *get_dropdown_elem_n(unsigned char *formated_list_beginning,unsigned short n_elem) //n_elem start to 1 (not 0) { unsigned short n; unsigned char *next_elem_ptr; n=0; if(strcmp("END",formated_list_beginning)==0) return 0; //void list n=1; while(nmax_len) max_len=len; } return max_len; } unsigned short format_list_str_dropdown(unsigned char *in_str,unsigned char *list_formated) //transform the '\0' by 0 { //unsigned char *p; unsigned short n_in,n_out,n; //p=in_str; n_in=0; n_out=0; while(*(in_str+n_in)!=0) { if(n_out>(6000-2)) { printf("\nIn dropdown(), list too long (maxi 6000 chars)"); keywait(); return; } if(*(in_str+n_in)=='/' /*'/'*/ && *(in_str+n_in+1)=='/') // transform '//' to 0 { *(list_formated+n_out)=0; n_out++; n_in+=2; } else //all other chars { *(list_formated+n_out)=*(in_str+n_in); n_out++; n_in++; } } *(list_formated+n_out)=0; n_out++; //real size of output return n_out; } void drawString_x_y(unsigned char *str,int x, int y, unsigned char _font,unsigned short color) { int x_pos_save,y_pos_save; unsigned char font_save; font_save=font; x_pos_save=x_pos; y_pos_save=y_pos; x_pos=x; y_pos=y; font=_font; my_drawString(&x_pos,&y_pos,x_pos,str,color,color); font=font_save; x_pos=x_pos_save; y_pos=y_pos_save; } void drawString_x_y_max_len(unsigned char *str,int x, int y, unsigned char font,unsigned short color,unsigned short max_len) { unsigned char buf[202]; unsigned short n; //if(max_len>199) return; if(strlen(str)>max_len) { for(n=0;nmax_str_len_in_win) title_len=max_str_len_in_win; my_fillRect_real_address(x,y,w,h,1000); my_fillRect_real_address(x+10,y+10,w-2*10,h-2*10,10000); drawString_x_y_max_len(title_str,x+12,y+1,0,0b1111100000000000,max_str_len_in_win-6); //red = 0b1111100000000000 drawString_x_y_max_len("OK",x+16,y+h-9,1,0b1111100000000000,max_str_len_in_win); drawString_x_y_max_len("ESC",x+w-3*6-16,y+h-9,1,0b1111100000000000,max_str_len_in_win); drawString_x_y_max_len(">",x+2,y+12,1,0b1111100000000000,1); if(is_ctrl_lock) { drawString_x_y("CTRL",x+w-4*8-10,y+1,1,0b1111100000000000); } } void fill_frame_dropdown_with_elems(unsigned short i,unsigned short nb_elems_max,unsigned short nbelem_printable,unsigned char *formated_list,int x,int y,int w,int h,int max_str_len_in_win,unsigned char *title_str,unsigned char is_ctrl_lock) { unsigned short n,nb_elems_to_draw; draw_void_frame_dropdown(x,y,w,h,title_str,max_str_len_in_win,is_ctrl_lock); if(i>nb_elems_max) nb_elems_to_draw=0; if(nb_elems_max-i+1>nbelem_printable) nb_elems_to_draw=nbelem_printable; else nb_elems_to_draw=nb_elems_max-i+1; for(n=0;nnb_elems_max) nb_elems_to_draw=0; if(nb_elems_max-i+1>nbelem_printable) nb_elems_to_draw=nbelem_printable; else nb_elems_to_draw=nb_elems_max-i+1; if(nb_elems_to_draw<=0) return; nblines_to_scroll=(nb_elems_to_draw-1)*8; inside_upper_frame_corner_ptr=((unsigned short *)(REAL_SCREEN_BASE_ADDRESS))+(x+12)+(y+12)*320; inside_src_frame_corner_ptr=((unsigned short *)(REAL_SCREEN_BASE_ADDRESS))+(x+12)+(y+12)*320+8*320; for(v=0;vnb_elems_max) nb_elems_to_draw=0; if(nb_elems_max-i+1>nbelem_printable) nb_elems_to_draw=nbelem_printable; else nb_elems_to_draw=nb_elems_max-i+1; if(nb_elems_to_draw<=0) return; nblines_to_scroll=(nb_elems_to_draw-1)*8; src_frame_corner_ptr=((unsigned short *)(REAL_SCREEN_BASE_ADDRESS))+(x+12)+(y+12)*320; dest_frame_corner_ptr=((unsigned short *)(REAL_SCREEN_BASE_ADDRESS))+(x+12)+(y+12)*320+8*320; for(v=nblines_to_scroll-1;v>=0;v--) { memmove(dest_frame_corner_ptr+v*320,src_frame_corner_ptr+v*320,(w-2*12)*2); } my_fillRect_real_address(x+10,y+12,w-2*10,8,10000); drawString_x_y_max_len(get_dropdown_elem_n(formated_list,i),x+12,y+12,0,-1,max_str_len_in_win); } int tolowerchar(int c) { if(c>='A' && c<='Z') return c+32; return c; } short dropdown_select(unsigned short *index_rtn, short i,unsigned short nb_elems_max,unsigned short nbelem_printable,unsigned char *formated_list,int x,int y,int w,int h,int max_str_len_in_win,unsigned char *title_str) { unsigned short k,vv; short n,n_temp; unsigned char is_ctrl_lock,ctrl_scroll_nblines,*temp_str,buf[300]; int temp_ascii; is_ctrl_lock=0; temp_ascii=0; n=i; if(i>nb_elems_max) { *index_rtn=0; return 0; } fill_frame_dropdown_with_elems(n,nb_elems_max,nbelem_printable,formated_list,x,y,w,h,max_str_len_in_win,title_str,is_ctrl_lock); //init frame k=0; while(getkey()) ; //wait no key pressed while(!isKeyPressed(KEY_NSPIRE_ESC) && !isKeyPressed(KEY_NSPIRE_ENTER)) //kesc == 1 ; kenter == 37 { k=keywait(); if((temp_ascii=get_key_ascii(k))!=0) { for(vv=1;vv<=nb_elems_max;vv++) { temp_str=get_dropdown_elem_n(formated_list,vv); if(tolowerchar(*temp_str)==temp_ascii) { fill_frame_dropdown_with_elems(vv,nb_elems_max,nbelem_printable,formated_list,x,y,w,h,max_str_len_in_win,title_str,is_ctrl_lock); n=vv; break; } } } if(isKeyPressed(KEY_NSPIRE_CTRL)) { if(!is_ctrl_lock) { is_ctrl_lock=1; my_fillRect_real_address(x+w-4*8-10,y+1,4*8,8,1000); drawString_x_y("CTRL",x+w-4*8-10,y+1,1,0b1111100000000000); } else { is_ctrl_lock=0; my_fillRect_real_address(x+w-4*8-10,y+1,4*8,8,1000); } } if(isKeyPressed(KEY_NSPIRE_DOWN) && n1) //up { if(is_ctrl_lock) { n_temp=n; ctrl_scroll_nblines=n-max(1,n-10); n=max(1,n-10); for(vv=0;vv=max_nbelems_printable) { nbelem_printable=max_nbelems_printable; win_h=max_nbelems_printable*8+2*12; } else { nbelem_printable=nb_elem; win_h=nbelem_printable*8+2*12; } if(index0==0 || index0>nb_elem) index0=1; max_len=get_dropdown_max_len_all_elem(list_formated,nb_elem); //in chars if(strlen(title_str)+5>max_len) { max_len=strlen(title_str)+5; } if(max_len*6+2*12>max_win_w) //width sup to max w { win_w=max_win_w; max_str_len_in_win=(max_win_w-2*12)/6; //in chars } else { if(max_len*6+2*12<=min_win_w) //width inf to min w { win_w=min_win_w; max_str_len_in_win=(min_win_w-2*12)/6; } else //between min and max win width { win_w=max_len*6+2*12; max_str_len_in_win=(win_w-2*12)/6; } } ans=dropdown_select(&user_rtn,index0,nb_elem,nbelem_printable,list_formated,320/2-win_w/2,240/2-win_h/2,win_w,win_h,max_str_len_in_win,title_str); if(ans==0) { *index_rtn=0; } else { elem_str_rtn=get_dropdown_elem_n(list_formated,user_rtn); if(elem_str_rtn!=0) { strcpy(dropdown_str_return,elem_str_rtn); } else dropdown_str_return[0]=0; *index_rtn=user_rtn; *var_str_ptr=dropdown_str_return; } memcpy(REAL_SCREEN_BASE_ADDRESS,scr_buf,320*240*2); //restore screen free(scr_buf); lcdad=lcdadtemp; return ans; } int whenn(void) { int cond,rtn; unsigned char iden; ptr++; iden=*ptr; ptr++; cond=((*(fonc[*(ptr)]))()); if(cond) { rtn=((*(fonc[*(ptr)]))()); ptr=when_end[iden]; } else { ptr=when_false[iden]; rtn=((*(fonc[*(ptr)]))()); } return rtn; } int drwstrxy(void) { int x,y; unsigned char *str; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); str=((*(fonc[*(ptr)]))()); my_drawString(&x,&y,x,str,chars_color,chars_color); } int strcmpp(void) { unsigned char *s1,*s2; ptr++; s1=((*(fonc[*(ptr)]))()); s2=((*(fonc[*(ptr)]))()); return strcmp(s1,s2); } int strcasecmpp(void) { unsigned char *s1,*s2; ptr++; s1=((*(fonc[*(ptr)]))()); s2=((*(fonc[*(ptr)]))()); return strcasecmp(s1,s2); } int atoii(void) { ptr++; return atol(((*(fonc[*(ptr)]))())); } int isnumstrr(void) { unsigned char *str; unsigned int i,len; ptr++; str=((*(fonc[*(ptr)]))()); len=strlen(str); for(i=0;i='0' && str[i]<='9')) return 0; } return 1; } int fopenn(void) { unsigned char *f_str,*mod_str; ptr++; f_str=((*(fonc[*(ptr)]))()); mod_str=((*(fonc[*(ptr)]))()); return fopen(f_str,mod_str); } int fclosee(void) { FILE *f; ptr++; f=((*(fonc[*(ptr)]))()); return fclose(f); } int fputcc(void) { FILE *f; int c; ptr++; c=((*(fonc[*(ptr)]))()); f=((*(fonc[*(ptr)]))()); return fputc(c,f); } int fseekk(void) { FILE *f; int offsett,whencee; ptr++; f=((*(fonc[*(ptr)]))()); offsett=((*(fonc[*(ptr)]))()); whencee=((*(fonc[*(ptr)]))()); return fseek(f,offsett,whencee); } int ftelll(void) { FILE *f; ptr++; f=((*(fonc[*(ptr)]))()); return ftell(f); } void my_fillCircle(int x, int y, int radius, unsigned short c) { int i,j; for(j=-radius; j<=radius; j++) for(i=-radius; i<=radius; i++) if(i*i+j*j <= radius*radius) my_setPixel(x + i, y + j, c); } void my_fillCircle_safe(int x, int y, int radius, unsigned short c) { int i,j; for(j=-radius; j<=radius; j++) for(i=-radius; i<=radius; i++) if(i*i+j*j <= radius*radius) my_setPixelsafe(x + i, y + j, c); } int fillcirclee(void) { int x,y,r; unsigned short color; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); r=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); if(x>=0 && x<=319 && y>=0 && y<=239 && (x-r)>=0 && (x+r)<=319 && (y-r)>=0 && (y+r)<=239) my_fillCircle(x,y,r,color); else my_fillCircle_safe(x,y,r,color); } void my_drawCircle(int x0, int y0, int radius, unsigned short c) { int x = radius, y = 0; int radiusError = 1-x; while(x >= y) { my_setPixel(x + x0, y + y0,c); my_setPixel(y + x0, x + y0,c); my_setPixel(-x + x0, y + y0,c); my_setPixel(-y + x0, x + y0,c); my_setPixel(-x + x0, -y + y0,c); my_setPixel(-y + x0, -x + y0,c); my_setPixel(x + x0, -y + y0,c); my_setPixel(y + x0, -x + y0,c); y++; if(radiusError<0) radiusError+=2*y+1; else { x--; radiusError+=2*(y-x+1); } } } void my_drawCircle_safe(int x0, int y0, int radius, unsigned short c) { int x = radius, y = 0; int radiusError = 1-x; while(x >= y) { my_setPixelsafe(x + x0, y + y0,c); my_setPixelsafe(y + x0, x + y0,c); my_setPixelsafe(-x + x0, y + y0,c); my_setPixelsafe(-y + x0, x + y0,c); my_setPixelsafe(-x + x0, -y + y0,c); my_setPixelsafe(-y + x0, -x + y0,c); my_setPixelsafe(x + x0, -y + y0,c); my_setPixelsafe(y + x0, -x + y0,c); y++; if(radiusError<0) radiusError+=2*y+1; else { x--; radiusError+=2*(y-x+1); } } } int drwcirclee(void) { int x,y,r; unsigned short color; ptr++; x=((*(fonc[*(ptr)]))()); y=((*(fonc[*(ptr)]))()); r=((*(fonc[*(ptr)]))()); color=((*(fonc[*(ptr)]))()); //my_drawCircle_safe(x,y,r,color); if(x>=0 && x<=319 && y>=0 && y<=239 && (x-r)>=0 && (x+r)<=319 && (y-r)>=0 && (y+r)<=239) my_drawCircle(x,y,r,color); else my_drawCircle_safe(x,y,r,color); } int abss(void) { int v; ptr++; v=((*(fonc[*(ptr)]))()); if(v<0) return -v; return v; } int sto_in_npvar(unsigned char var_iden,int value) { npvar_list[var_iden]=value; } int newdata(void) { int temp; unsigned char var_iden,degree,type,has_reached; unsigned short nbrow,nbcol,nbelem,real_nbelem,i; unsigned char *dataucptr; //1 signed char *datascptr; //11 unsigned short *datausptr; //2 signed short *datassptr; //22 unsigned int *datauiptr; //4 signed int *datasiptr; //44 void *voidptr; char buf[100]; voidptr=0; ptr++; var_iden=*(ptr+1); //printf1_in_cx_vm_corpse("\nvar_iden=%d",var_iden,0,80,-1); //printf1_in_cx_vm_corpse("\nvar initial=%d",npvar_list[var_iden],0,140,-1); ptr+=2; type=((*(fonc[*(ptr)]))()); if(type!=1 && type!=11 && type!=2 && type!=22 && type!=4 && type!=44) my_exit("\nWrong type in 'newdata()'"); //printf1_in_cx_vm_corpse("\ntype=%d",type,0,90,-1); newdata_var_type[var_iden]=type; degree=((*(fonc[*(ptr)]))()); //printf1_in_cx_vm_corpse("\ndegree=%d",degree,0,70,-1); nbcol=1; nbrow=((*(fonc[*(ptr)]))()); if(degree==2) nbcol=((*(fonc[*(ptr)]))()); newdata_var_nbrows[var_iden]=nbrow; newdata_var_nbcols[var_iden]=nbcol; nbelem=((*(fonc[*(ptr)]))()); //printf1_in_cx_vm_corpse("\nnbelem=%d",nbelem,0,100,-1); //keywait(); real_nbelem=nbrow*nbcol; //printf1_in_cx_vm_corpse("\nnbelem=%d",nbelem,0,110,-1); //now ptr points on ler elem voidptr=0; switch(type) { case 1: //uc case 11: voidptr=malloc(real_nbelem); break; case 2: //uc case 22: //ss voidptr=malloc(real_nbelem*2); break; case 4: //ui case 44: //si voidptr=malloc(real_nbelem*4); break; } if(voidptr==0) { my_exit("\nMemory missing with 'newdata'"); } //printf1_in_cx_vm_corpse("\nmalloc rtn ptr=%d",voidptr,0,120,-1); //printf1_in_cx_vm_corpse("\nreal nbelem=%d",real_nbelem,0,100,-1); //my_msgbox("not null",""); //printf("\n\n\nvoidptr=%d",voidptr); keywait(); //has_reached=0; switch(type) { case 1: //uc dataucptr=voidptr; for(i=0;i=2) return 1; //double var } } return 0; } void func_skip(void) { unsigned short iden,nbargs,nbargs_local,i; unsigned char buf[100]; ptr++; iden=*(ptr+1); ptr+=2; //printf("\nin fc skip, iden=%d",iden); nbargs=*(ptr+1); //printf("\nnbargs=%d",nbargs); ptr+=2; for(i=0;i i=%d",i); if(i!=4) my_exit(err_str); ptr=block_tag_ptr; block_skip(); } void delay_init(void) { ptr++; //is_delay=1; /* if(is_timer1_activated==0) { is_timer1_activated=1; //timer_init(0); } */ ((*(fc_skip[*(ptr)]))()); } void dropdo_skip(void) { ptr++; ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); } void when_skip(void) { ptr++; ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); } void nwdata_skip(void) { ptr++; ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); ((*(fc_skip[*(ptr)]))()); } //0 1 2 3 4 5 6 7 8 9 int (*fonc[])(void)={ guchar , gushort , guint , gschar , gsshort , gsint , npvar , stovar , addd , isequ ,//0 kwait , LBL , GOTO , ifss , forr , breakk , getadress , strdata , subb , isnequ ,//01 repeat , iszz , keytest , ifthenn , endforr ,continuee , getlcdad , getspritew , mulll , isinfff,//02 isnumstrr , dszz , blockk , elsee , whilee ,setPixell ,fillrectt , getspriteh , divv , issuppp,//03 getss , datauc , msgboxx , endiff ,endwhilee ,getPixell , settxtcolor , newspritee , 0 , iseqinf,//04 printff ,lelem_data ,lelemnwdata, timerinitt, forrc , /*end*/0 , setlcdad , getfirstpix , 0 , iseqsup,//05 sprintff , getposx , 0 , delayy ,updaterectt, abss , strlenn , getspritesize, 0 , 0 ,//06 setposition , getposy , 0 , ordd ,locall ,contucptr ,contusptr ,contuiptr , contscptr , contssptr ,//07 contsiptr , funcc , endfuncc , execfc ,returnfc ,returnnulfc, 0 ,sprtpart , 0 , 0 ,//08 setfontt , get_keyy , keyascii , bufonn , bufofff , loadbmpp , bufflipp ,sdlsprite , 0 , 0 ,//09 freee , stoelem , whenn , timeroff, 0 , atoii , strcatt ,spritescaledd ,spriterotatedd , andlogic ,//10 mallocc , strcpyy , strcmpp , timersett , randd , 0 , 0 , fillscr , 0 , orlogic ,//11 drwline , reallocc ,strcasecmpp,timerreadd , 0 , 0 , 0 , colorrgbb , 0 , rollrr ,//12 finishh , datasc , dataus , datass , dataui , datasi , 0 , getspritemsk, 0 , rollll ,//13 scrollleft ,scrollright,scrolldown , scrollup , 0 , 0 , 0 , setspritemsk, 0 , modd ,//14 memmovee , 0 , 0 , scrollup2, 0 , fopenn , fillcirclee , 0 , 0 , 0 ,//15 memmoveww ,dropdownn , 0 , 0 , 0 , fclosee , drwcirclee , 0 , 0 , 0 ,//16 memsett , drwstrxy , 0 , 0 , 0 , fputcc , 0 , 0 , 0 , 0 ,//17 memsetww , 0 , 0 , 0 , 0 , fseekk , 0 , 0 , 0 , 0 ,//18 newdata , 0 , 0 , 0 , 0 , ftelll , 0 , 0 , 0 , 0 ,//19 notll, andbb , orbb , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//20 blitt , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//21 printdd , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//22 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//23 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//24 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };//25 //0 1 2 3 4 5 6 7 8 9 void (*fc_skip[])(void)={skip_gc , skip_gs , skip_gi ,skip_gc ,skip_gs , skip_gi , skip_var , C2 , C2 , C2 ,//0 C0 , LBL_skip, GOTO_skip, IFS_skip , FOR_skip , C0 , C1 ,STRDATA_skip , C2 , C2 ,//01 C2 , C1 , C1 ,IFTHEN_skip,ENDFOR_skip, C0 , C0 , C1 , C2 , C2 ,//02 C1 , C1 ,block_skip ,ELSE_skip ,WHILE_skip , C3 , C5 , C1 , C2 , C2 ,//03 C1 ,DATAuc_skip,msgboxx_skip,ENDIF_skip,ENDWHILE_skip, C2 , C1 , C3 , 0 , C2 ,//04 C99 ,LELEMDA_skip,LELEMNEWDATA_skip,C0 , FORC_skip , C0 , C1 , C1 , 0 , C2 ,//05 C99 , C0 , 0 , delay_init, C5 , C1 , C1 , C1 , 0 , 0 ,//06 C2 , C0 , 0 , C1 ,LOCAL_skip , C1 , C1 , C1 , C1 , C1 ,//07 C1 , func_skip,endfunc_skip,exec_fc_skip, C1 , C0 , 0 , sprtpart_skip , 0 , 0 ,//08 C1 , C0 , C1 , C0 , C0 , C2 , C0 , C3 , C1 , C2 ,//09 C1 ,stoelm_skip, when_skip , C0 , 0 , C1 , C2 , C5 , C4 , C2 ,//10 C1 , C2 , C2 , C1 , C1 , 0 , 0 , C1 , 0 , C2 ,//11 C5 , C2 , C2 , C0 , 0 , 0 , 0 , C3 , 0 , C2 ,//12 C0 ,DATAsc_skip,DATAus_skip,DATAss_skip,DATAui_skip,DATAsi_skip, 0 , C1 , 0 , C2 ,//13 C5 , C5 , C5 , C5 , 0 , 0 , 0 , C2 , 0 , C2 ,//14 C3 , 0 , 0 , C0 , 0 , C2 , C4 , 0 , 0 , 0 ,//15 C3 ,dropdo_skip, 0 , 0 , 0 , C1 , C4 , 0 , 0 , 0 ,//16 C3 , C3 , 0 , 0 , 0 , C2 , 0 , 0 , 0 , 0 ,//17 C3 , 0 , 0 , 0 , 0 , C3 , 0 , 0 , 0 , 0 ,//18 nwdata_skip , 0 , 0 , 0 , 0 , C1 , 0 , 0 , 0 , 0 ,//19 C1 , C2 , C2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//20 C4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//21 C1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//22 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//23 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,//24 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };//25 void load_neo_prgm(void) { int c; unsigned short delta; FILE *f = fopen(neo_prgm_name,"r"); if(!f) { my_exit("Failed to open NEO PRGM : out.tns\n"); } //printf("\n In load neo prgm, &=%d",prgm); memset(prgm,0,65535); prgm_size=0; while((c=fgetc(f))!=EOF) { prgm[prgm_size]=c; prgm_size++; if(prgm_size>65534) my_exit("NEO file too big"); } first_adress_for_sync=*prgm+256*(*(prgm+1))+256*256*(*(prgm+2))+256*256*256*(*(prgm+3)); ptr=prgm; delta=(4-((unsigned int)first_adress_for_sync)%4)%4; if(((int)ptr%2)!=0) { memmove(prgm+1,prgm,65530); ptr++; } if(delta!=(4-((unsigned int)ptr)%4)%4) { memmove(ptr+2,ptr,65530); ptr+=2; } //printf("\n verif sync, delta=%d, delta prgm=%d",delta,(4-((unsigned int)ptr)%4)%4); ptr+=4; //skip sync adress deb_ptr=ptr; fclose(f); } void init_all_bookmark(void) { unsigned char *ptr_ori,*temp_ptr,*temp_ptr2; int iden; ptr_ori=ptr; //printf("In init all bookmarks\n"); while(ptr<(prgm+prgm_size)) { //printf("init %s, token=%d\n",neo_funcs_list_str[*ptr],*ptr); switch(*ptr) { case 41: DATA_uc_init_bookmarks(); //make also affectation continue; break; case 131: DATA_sc_init_bookmarks(); continue; case 132: DATA_us_init_bookmarks(); continue; break; case 133: DATA_ss_init_bookmarks(); continue; case 134: DATA_ui_init_bookmarks(); continue; break; case 135: DATA_si_init_bookmarks(); continue; break; case 102: //when() ptr+=2; //tag and iden iden=*(ptr-1); ((*(fc_skip[*(ptr)]))()); //cond ((*(fc_skip[*(ptr)]))()); //skip true instruc when_false[iden]=ptr; ((*(fc_skip[*(ptr)]))()); //skip false instruc when_end[iden]=ptr; continue; break; case 13: //ifshort temp_ptr=ptr; ((*(fc_skip[*(ptr)]))()); temp_ptr2=ptr;//after cond and instruc if yes ptr=temp_ptr; //return to ifs tag iden=*(ptr+2); ptr+=3; //skip ifs tag and iden. Point now on cond ifs_after_all[iden]=temp_ptr2; //printf("Ifs added. iden=%d\n",iden); printf("After all token str %s\n",neo_funcs_list_str[*temp_ptr2]); continue; break; case 11: //lbl temp_ptr=ptr; lbl_ptr[*(ptr+2)]=ptr+3; ptr+=3; continue; break; case 33: //else tag ptr+=2; //tag and iden iden=*(ptr-1); else_ptr[iden]=ptr; continue; break; case 43: //endif tag ptr+=2; //tag and iden iden=*(ptr-1); endif_ptr[iden]=ptr; continue; break; case 14: //for ptr+=2; //tag and iden iden=*(ptr-1); temp_ptr=ptr; ptr=skip_arg(skip_arg(skip_arg(skip_arg(ptr)))); //skip all params for_ptr[iden]=ptr; //pointe à la première instruction du bloc ptr=temp_ptr; continue; break; case 92: //for_c_tag ptr+=2; //tag and iden iden=*(ptr-1); temp_ptr=ptr; ptr=skip_arg(skip_arg(skip_arg(skip_arg(ptr)))); //skip all params for_ptr[iden]=ptr; //pointe à la première instruction du bloc ptr=temp_ptr; continue; break; case 24: //endfor ptr+=2; //tag and iden iden=*(ptr-1); endfor_ptr[iden]=ptr; //pointe à la première instruction du bloc continue; break; case 34: //while ptr+=2; //tag and iden iden=*(ptr-1); temp_ptr=ptr; ptr=skip_arg(ptr); while_ptr[iden]=ptr; ptr=temp_ptr; continue; break; case 44: //endfor ptr+=2; //tag and iden iden=*(ptr-1); endwhile_ptr[iden]=ptr; //pointe à la première instruction du bloc continue; break; case 1: //gushort ptr+=3; //printf("\in ini bkm, gushort=%d",*(unsigned char*)(ptr-2)+*(unsigned char*)(ptr-1)*256); continue; break; } //printf(" skip=%d",*ptr); ptr=skip_arg(ptr); } //printf("Bookmarks initialized\n"); ptr=ptr_ori; } void init_npvar_list(void) { int i,row,col; for(i=0;i<255;i++) { npvar_list[i]=0; npvar_list_row_columns[i][0]=0; npvar_list_row_columns[i][1]=0; } } void init_ifthen_else_endif(void) { int i; for(i=0;i<255;i++) { else_ptr[i]=0; endif_ptr[i]=0; } } void init_newdata_rows_cols(void) { unsigned short i; for(i=0;i<256;i++) { newdata_var_nbrows[i]=0; newdata_var_nbcols[i]=0; newdata_var_type[i]=4; } } /* int show_msg_user_input(const char * title, const char * msg, const char * defaultvalue, char ** value_ref) { String request_value = string_new(); String s_title = string_new(); String s_msg = string_new(); string_set_ascii(request_value, defaultvalue); string_set_ascii(s_title, title); string_set_ascii(s_msg, msg); String request_struct[] = {s_msg, request_value}; int len_out = -1; int no_error = _show_msgUserInput(0, request_struct, s_title->str, s_msg->str); string_free(s_title); string_free(s_msg); if (!(no_error && request_value->len > 0)) goto err; char *s = string_to_ascii(request_value); if (!s) goto err; if (value_ref) { *value_ref = strdup(s); if (!*value_ref) goto err; } len_out = strlen(s); err: string_free(request_value); return len_out; } */ int main(int argc, char *argv[]) { int v,i; unsigned char *ptr_temp,buf[100],buf2[100]; FILE *f; //npvar_list=0; //npvar_list=malloc(256*4); /* if(npvar_list==0) { my_exit("\nMemory missing"); } */ if(argc<=1) // { //my_exit("\nNot expected to be launch.\nRun a NewprogCX valid program"); printf("\nLoad 'npcxfiles.tns'"); f=fopen("./npcxfiles.tns","r"); if(f==0) { sprintf(buf,"\nError:Unable to load:%s","./npcxfiles.tns"); my_exit(buf); } for(i=0;i<100;i++) buf2[i]=0; if(fgets(buf2,99,f)==0) { sprintf(buf,"\nError:Unable to load in line 1 'INPUTSRC=' in %s","./npcxfiles.tns"); fclose(f); my_exit(buf); } if(fgets(buf2,99,f)==0) { sprintf(buf,"\nError:Unable to load in line 2 'EXEC=' in %s","./npcxfiles.tns"); fclose(f); my_exit(buf); } neo_prgm_name[0]=0; for(i=0;i0) { //if(!is_alpha_num(src_str_input[strlen(src_str_input)-1])) src_str_input[strlen(src_str_input)-1]=0; for(v=0;v<50;v++) { if(!is_alpha_num_or_dot_or_div(&neo_prgm_name[v])) { neo_prgm_name[v]=0; goto end_npprgm; } } } break; } } end_npprgm : strcat(neo_prgm_name,".tns"); if(neo_prgm_name[0]==0) { sprintf(buf,"\nError:Unable to load in line 2 'EXEC=' in %s","./npcxfiles.tns"); fclose(f); my_exit(buf); } printf("\nNewprogcx byte code prgm=%s",neo_prgm_name); fclose(f); //strcpy(neo_prgm_name,"./minesweeper.tns"); } else { //strcpy(neo_prgm_name,argv[1]); my_exit("\nError"); } //printf("\nargc=%d, %s %s\n",argc,argv[0],argv[1]); //for(i=0;i<20;i++) printf("%c ",*(ptr_temp+i)); //keywait(); nb_ifs=0; load_neo_prgm(); //ptr is the moving ptr, prgm_size is the size of the neo byte code printf("\nSuccess reading SRC '%s'\n",neo_prgm_name); //keywait(); //is_delay=0; //for delay() func //keywait(); //printf("\nnew vm ptr=%d",ptr); //printf("\nfirst adress compilator=%d\n",first_adress_for_sync); is_timer1_activated=0; init_npvar_list(); init_all_bookmark(); init_newdata_rows_cols(); is_breakk=0; is_goto=0; is_continue=0; is_return=0; is_graph_buf=0; lcdad=REAL_SCREEN_BASE_ADDRESS; x_pos=0; y_pos=0; chars_color=0xffff; edge_color=0; font=1; //8x8 bold font_sprite_list_ptr[0]=console_font_6x8; //font_sprite_list_ptr[1]=n2DLib_font; font_sprite_list_ptr[1]=font8x8_basic; font_sprite_list_ptr[2]=Font8x12; font_sprite_list_ptr[3]=cp437_font; printf("Bookmarks initialized\n"); /* v=0; printf("\n v=%d",v); while(v!=4) { v=is_front_montant_touche(); if(v!=0) { printf("\n new frt montant=%d",v); if(v==3) break; } } */ /* while(ptr<(prgm+prgm_size)) { printf("Token=%X ptr=%d ",*ptr,ptr); printf("%s\n",neo_funcs_list_str[*ptr]); ptr=skip_arg(ptr); //((*(fc_skip[*(ptr)]))()); } */ //printf("ptr=%d prgm=%d\n",ptr,prgm); //ptr=prgm; ptr=deb_ptr; printf("Run prgm...\n"); keywait(); fillscr_c(0); //printf("ptr=%d prgm=%d\n",ptr,prgm); /* x=50; y=50; my_drawString(&x, &y, x, "ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqsrtuvwxyz\n0123456789==================================================================================================================================\n", 0xffff,0); keywait(); */ ptr_temp=ptr; //printf("Token=%X ptr=%p ",*ptr,ptr); //printf("%s",neo_funcs_list_str[*ptr]);// printf(" %p\n",ptr);printf("2-printd ptr=%p",printd); while(ptr<(deb_ptr+prgm_size) && ptr>=deb_ptr) { //printf1_in_cx_vm_corpse("\ntokens=%d",*ptr,50,50,-1); keywait(); //printf1_in_cx_vm_corpse("\nptr=%d",ptr,rand()%150,rand()%150,-1); keywait(); //if(*ptr==30) {(*(printd))(); continue;} /* switch(*ptr) { case 14: (*(forr))(); continue; break; case 30: (*(printd))(); continue; break; } */ //printf("\nforr=%p printd=%p",forr,printd); (*(fonc[*(ptr)]))(); //ptr=ptr_temp; } keywait(); finishh(); printf("Fini\n"); keywait(); return 0; }