⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr_simulator.c

📁 linux上实现的多种型号的AVR模拟器
💻 C
📖 第 1 页 / 共 4 页
字号:
  if((file=fopen(filename,"r"))==NULL)     {      sprintf(error_message,"open file: %s",strerror(errno));      return 1;    }    drawarea.current_line_deb=pc=-1;  free(list_commands);  if((list_commands=      malloc(controllers[type_micro].size_flash*sizeof(ListCommand)))==NULL)    {      puts("load_flash(): can't allocate memory for 'list_commands'");      exit(1);    }    free(drawarea.display_lines);  if((drawarea.display_lines=      malloc(controllers[type_micro].size_flash*sizeof(int)))==NULL)    {      puts("load_flash(): \can't allocate memory for 'drawarea.display_lines'");      exit(1);    }  if(create_listing(file))     {      drawarea.current_line_deb=-1;      drawarea.num_commands=0;      XtVaSetValues(drawarea.v_scrb,XmNsliderSize,1,		  XmNmaximum,drawarea.num_commands+1,		  XmNvalue,0,NULL);      draw(); /* clean screen */      XtSetSensitive(menu[DEBUG_MENU].button,False);      return 1;    }      /* set size of slider in drawarea */  if(drawarea.height/drawarea.font_height<=drawarea.num_commands)    XtVaSetValues(drawarea.v_scrb,XmNsliderSize,		  drawarea.height/drawarea.font_height,		  XmNmaximum,drawarea.num_commands,		  XmNvalue,0,NULL);  else    XtVaSetValues(drawarea.v_scrb,XmNvalue,0,XmNsliderSize,1,XmNmaximum,1,		  NULL);  draw();  clean_memory();   XtSetSensitive(buttons[RELOAD].widget,True);  XtSetSensitive(buttons[TRACE_INTO].widget,True);  XtSetSensitive(buttons[STEP_OVER].widget,True);  XtSetSensitive(buttons[STEP_OUT].widget,True);  XtSetSensitive(buttons[MULTI_STEP].widget,True);  XtSetSensitive(buttons[AUTO_STEP].widget,True);  XtSetSensitive(buttons[RUN].widget,True);  XtSetSensitive(buttons[STOP].widget,False);  XtSetSensitive(buttons[RESET_].widget,True);  XtSetSensitive(menu[DEBUG_MENU].button,True);  XtSetSensitive(menu[DEBUG_MENU].sub_menu[STOP_BUTTON].button,False);  return 0;}int load_eeprom(char *name){  static char *filename;  static FILE *file;  int address,data,error;    if(name!=NULL)    { /* new file */      free(filename);      if((filename=malloc(strlen(name)+1))==NULL)	{	  puts("load_eeprom(): can't allocate memory for 'filename'");	  exit(1);	}      strcpy(filename,name);    }  if(filename==NULL) return 0;  if(file!=NULL) fclose(file);  if((file=fopen(filename,"r"))==NULL)     {      sprintf(error_message,"open file: %s",strerror(errno));      return 1;    }  while((error=read_word(&data,&address,file))==2)    {      if(address>=controllers[type_micro].size_eeprom)	{	  sprintf(error_message,		  _("Size of file is bigger then size of eeprom"));	  full_update_eeprom_window();	  return 1;	}      eeprom_pointer[address]=data;    }  if(error==1) return 1;  full_update_eeprom_window();  return 0;}void scroll_bar_callback (Widget w,XtPointer client_data, XtPointer call_data){  draw();  return;}void drawarea_input_callback(Widget w,XtPointer client_data,			     XtPointer call_data){  XmDrawingAreaCallbackStruct *data;  int num_line,address,cur_line;    if(list_commands==NULL) return;  data=(XmDrawingAreaCallbackStruct *)call_data;  if(data->reason==XmCR_INPUT)    if(data->event->type==ButtonPress)      {	if(data->event->xbutton.x>drawarea.font_width*8&&	   data->event->xbutton.x<drawarea.font_width*12&&	   data->event->xbutton.button==Button1)	  {	    XtVaGetValues(drawarea.v_scrb,XmNvalue,&num_line,NULL);	    if((cur_line=num_line+data->event->xbutton.y/		drawarea.font_height)>=drawarea.num_commands)	      return;	    address=drawarea.display_lines[cur_line];	    if(list_commands[address].flags&BREAKPOINT)	      list_commands[address].flags=		list_commands[address].flags&(~BREAKPOINT);	    else list_commands[address].flags=		   list_commands[address].flags|BREAKPOINT;	    draw();	  }      }    }void draw(void){  int value,num_line,n;  char line[30],buf[10];    XFreePixmap(display,pixmap);  pixmap=CreatePixmap(window,drawarea.width,drawarea.height,		      WhitePixel(display,scr_num));  /* Get number of first displaying line */  XtVaGetValues(drawarea.v_scrb,XmNvalue,&value,NULL);  /* if current debug line not displaying then to change first */  /* displaying line */  if(debug==TRUE&&drawarea.current_line_deb!=-1)    {      if(drawarea.current_line_deb<value||	 drawarea.current_line_deb>value+drawarea.height/drawarea.font_height)	{	  if(drawarea.current_line_deb+drawarea.height/drawarea.font_height>	     drawarea.num_commands-1)	    value=drawarea.num_commands-drawarea.height/drawarea.font_height;	  else	    value=drawarea.current_line_deb;	}            if(drawarea.current_line_deb>	 value+drawarea.height/drawarea.font_height-5&&	 drawarea.current_line_deb<=value+drawarea.height/drawarea.font_height)	{	  	  if(drawarea.num_commands<	     drawarea.current_line_deb+drawarea.height/drawarea.font_height/2)	    {	      if(drawarea.num_commands-drawarea.height/drawarea.font_height-1>		 value)		value=drawarea.num_commands-		  drawarea.height/drawarea.font_height-1;	    }	  else	    value=drawarea.current_line_deb-	      drawarea.height/drawarea.font_height/2;	}    }  XtVaSetValues(drawarea.v_scrb,XmNvalue,value,NULL);      /* print debuging lines */  for(n=value,num_line=0;num_line<drawarea.height/drawarea.font_height;n++)    {      if(n>=drawarea.num_commands) break;      sprintf(buf,"%X",drawarea.display_lines[n]);      fill_zero(buf,5);      sprintf(line,"%s      %s",buf,	      list_commands[drawarea.display_lines[n]].mnemocode);      XDrawString(display,pixmap,drawarea.gc,6,		  num_line*drawarea.font_height+10,		  line,strlen(line));      /* display stop_pixmap */      if(list_commands[drawarea.display_lines[n]].flags&BREAKPOINT)	XCopyArea(display,stop_pixmap,pixmap,drawarea.gc,0,0,		  15,15,drawarea.font_width*8+4,		  (num_line-1)*drawarea.font_height+13);      num_line++;    }    /* displaying current_pixmap */  if(pc!=-1&&drawarea.current_line_deb>=value&&     drawarea.current_line_deb<=drawarea.height/drawarea.font_height+value&&     drawarea.current_line_deb!=-1)    {      XCopyArea(display,current_pixmap,pixmap,drawarea.gc,0,0,		15,15,drawarea.font_width*6,		(drawarea.current_line_deb-value)*drawarea.font_height);    }  XCopyArea(display,pixmap,window,drawarea.gc,0,0,drawarea.width,	    drawarea.height,0,0);}Pixmap CreatePixmap(Window window,unsigned int width,unsigned int height,		    Pixel pixel){  Pixmap pixmap;  char *data;    if((data=malloc(width*height))==NULL)    {      puts("CreatePixmap(): can't allocate memory for 'data'");      exit(1);    }  memset(data,0,width*height);      pixmap=XCreatePixmapFromBitmapData(display,window,data,width,				     height,WhitePixel(display,scr_num),				     pixel,DefaultDepth(display,scr_num));  free(data);  return pixmap;}void create_main(void){  char buf[10];  XmString string;  Widget label,frame1,frame1_form,menu_timeselection,option_menu,button;    frame1=XtVaCreateManagedWidget("frame",xmFrameWidgetClass,form,				 XmNtopAttachment,XmATTACH_WIDGET,				 XmNtopWidget,separator,				 XmNtopOffset,5,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,frame,				 XmNleftOffset,5,				 XmNrightAttachment,XmATTACH_FORM,				 XmNrightOffset,5,				 XmNmarginWidth,6,XmNmarginHeight,4,NULL);  frame1_form=XtVaCreateManagedWidget("form",xmFormWidgetClass,frame1,NULL);  string=XmStringGenerate("PC:",XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label=XtVaCreateManagedWidget("label pc",xmLabelGadgetClass,frame1_form,				XmNtopAttachment,XmATTACH_FORM,				XmNleftAttachment,XmATTACH_FORM,				XmNtopOffset,2,				XmNbottomAttachment,XmATTACH_FORM,				XmNbottomOffset,2,				XmNlabelString,string,				NULL);  XmStringFree(string);    sprintf(buf,"%X",pc);  fill_zero(buf,8);  edit_pc=XtVaCreateManagedWidget("field",xmTextFieldWidgetClass,frame1_form,				  XmNtopAttachment,XmATTACH_FORM,				  XmNleftAttachment,XmATTACH_WIDGET,				  XmNleftWidget,label,				  XmNleftOffset,0,				  XmNcolumns,6,XmNmaxLength,6,				  XmNvalue,buf,XmNeditable,False,				  XmNcursorPositionVisible,False,NULL);      string=XmStringGenerate("X:",XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label=XtVaCreateManagedWidget("label X",xmLabelGadgetClass,frame1_form,				XmNtopAttachment,XmATTACH_FORM,				XmNleftAttachment,XmATTACH_WIDGET,				XmNleftWidget,edit_pc,				XmNtopOffset,2,XmNleftOffset,10,				XmNlabelString,string,				NULL);  XmStringFree(string);    edit_X=XtVaCreateManagedWidget("field",xmTextFieldWidgetClass,frame1_form,				 XmNtopAttachment,XmATTACH_FORM,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,label,				 XmNleftOffset,0,				 XmNcolumns,4,XmNmaxLength,4,				 XmNvalue,"0000",				 XmNcursorPositionVisible,False,NULL);    string=XmStringGenerate("Y:",XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label=XtVaCreateManagedWidget("label Y",xmLabelGadgetClass,frame1_form,				XmNtopAttachment,XmATTACH_FORM,				XmNleftAttachment,XmATTACH_WIDGET,				XmNleftWidget,edit_X,				XmNtopOffset,2,XmNleftOffset,10,				XmNlabelString,string,				NULL);  XmStringFree(string);    edit_Y=XtVaCreateManagedWidget("field",xmTextFieldWidgetClass,frame1_form,				 XmNtopAttachment,XmATTACH_FORM,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,label,				 XmNleftOffset,0,				 XmNcolumns,4,XmNmaxLength,4,				 XmNvalue,"0000",				 XmNcursorPositionVisible,False,NULL);    string=XmStringGenerate("Z:",XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label=XtVaCreateManagedWidget("label Z",xmLabelGadgetClass,frame1_form,				XmNtopAttachment,XmATTACH_FORM,				XmNleftAttachment,XmATTACH_WIDGET,				XmNleftWidget,edit_Y,				XmNtopOffset,2,XmNleftOffset,10,				XmNlabelString,string,				NULL);  XmStringFree(string);  edit_Z=XtVaCreateManagedWidget("field",xmTextFieldWidgetClass,frame1_form,				 XmNtopAttachment,XmATTACH_FORM,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,label,				 XmNleftOffset,0,				 XmNrightAttachment,XmATTACH_FORM,				 XmNcolumns,4,XmNmaxLength,4,				 XmNvalue,"0000",				 XmNcursorPositionVisible,False,NULL);  frame1=XtVaCreateManagedWidget("frame",xmFrameWidgetClass,form,				 XmNtopAttachment,XmATTACH_WIDGET,				 XmNtopWidget,frame1,				 XmNtopOffset,5,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,frame,				 XmNleftOffset,5,				 XmNrightAttachment,XmATTACH_FORM,				 XmNrightOffset,5,				 XmNmarginWidth,3,XmNmarginHeight,2,NULL);  string=XmStringGenerate(_("Status Register"),XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  XtVaCreateManagedWidget("label",xmLabelGadgetClass,frame1,                          XmNlabelString,string,                          XmNframeChildType,XmFRAME_TITLE_CHILD,                          XmNchildHorizontalAlignment,XmALIGNMENT_BEGINNING,                          XmNchildVerticalAlignment,XmALIGNMENT_CENTER,                          NULL);  XmStringFree(string);  string=XmStringGenerate("I:0 T:0 H:0 S:0 V:0 N:0 Z:0 C:0",			  XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label_sreg=XtVaCreateManagedWidget("label sreg",xmLabelGadgetClass,frame1,				     XmNlabelString,string,NULL);  XmStringFree(string);    frame1=XtVaCreateManagedWidget("frame",xmFrameWidgetClass,form,				 XmNtopAttachment,XmATTACH_WIDGET,				 XmNtopWidget,frame1,				 XmNtopOffset,5,				 XmNleftAttachment,XmATTACH_WIDGET,				 XmNleftWidget,frame,				 XmNleftOffset,5,				 XmNrightAttachment,XmATTACH_FORM,				 XmNrightOffset,5,				 XmNmarginWidth,6,XmNmarginHeight,0,NULL);  frame1_form=XtVaCreateManagedWidget("form",xmFormWidgetClass,frame1,NULL);    string=XmStringGenerate(_("Elapsed time:"),XmFONTLIST_DEFAULT_TAG,			  XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE);  label=XtVaCreateManagedWidget("label sreg",xmLabelGadgetClass,				frame1_form,				XmNtopAttachment,XmATTACH_FORM,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -