📄 avr_simulator.c
字号:
/* File : avr_simulator.c Author : Sergiy Uvarov - Copyright (C) 2001 Description : This is the main file. Copyright notice: avr_simulator - A GNU/Linux simulator for the Atmel AVR series of microcontrollers. Copyright (C) 2001 Sergiy Uvarov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Sergiy Uvarov E-mail : colonel@ff.dsu.dp.ua*/#include <stdio.h>#include <inttypes.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <libintl.h>#include <locale.h>#include <pthread.h>#include <signal.h>#include <Xm/XmAll.h>#include <X11/Xmu/Editres.h>#include <X11/xpm.h>#define AVR_SIMULATOR#define MAIN#include "types.h"#include "avr_simulator.h"#include "global.h"/* #include "auto_step.xpm" *//* #include "breakpoint.xpm" *//* #include "current.xpm" *//* #include "empty.xpm" *//* #include "load.xpm" *//* #include "multi_step.xpm" *//* #include "reload.xpm" *//* #include "reset.xpm" *//* #include "run.xpm" *//* #include "step_out.xpm" *//* #include "step_over.xpm" *//* #include "stop.xpm" *//* #include "trace_into.xpm" */#define _(x) gettext(x)void init();int create_listing(FILE *file);int read_word_gen(int *command,int *address,FILE *file);int read_word_intel(int *command,int *address,FILE *file);int read_word_motorola(int *command,int *address,FILE *file);void fill_zero(char *string,int number_sym);int load_flash(char *name);int load_eeprom(char *name);void draw();void create_main();void update_main();Pixmap CreatePixmap(Window window,unsigned int width,unsigned int height, Pixel pixel);void show_error();void exec_command();void show_info();void reset();void manage();void unmanage();void file_selection_ok();void refresh();void resize();void use_project_callback();void scroll_bar_callback();void time_button_s_callback();void time_button_us_callback();void time_button_ms_callback();void file_selection_gen();void file_selection_intel();void file_selection_motorola();void set_size_static_window();void info_close_callback();void drawarea_input_callback();int (*read_word)(int *,int *,FILE *)=read_word_gen;pthread_t thread;pthread_attr_t attr_thread;Window window;Pixmap pixmap,stop_pixmap,current_pixmap;Widget error_dialog,form,separator,frame,option_menu, menu_fileselection,file_selection,info_dialog;Widget label_freq, /* widget for displaying frequency of MPU */ edit_pc, /* edit field for displaying PC register */ edit_X, /* edit field for displaying X register */ edit_Y, /* edit fieldfor displaying Y register */ edit_Z, /* edit field for displaying Z register */ label_sreg, /* label for displaying SREG register */ edit_time, /* edit field for displaying TIME */ edit_clock; /* edit field for displaying CLOCKS */static String fallbacks[]={ "*background: rgb:D0/E0/C0", "*XmPushButton.armColor: rgb:A0/A0/A0", "*XmPushButton.highlightThickness: 1", "*XmPushButton.shadowThickness: 1", "*XmTextField.highlightThickness: 1", "*XmTextField.shadowThickness: 1", "*XmCascadeButtonGadget.shadowThickness: 1", "*XmCascadeButtonGadget.highlightThickness: 1", "*XmPushButtonGadget.shadowThickness: 1", "*XmPushButtonGadget.highlightThickness: 1", "*XmToggleButtonGadget.highlightThickness: 0", "*XmToggleButtonGadget.shadowThickness: 0", "*XmToggleButtonGadget.indicatorOn: INDICATOR_CHECK", "*option.shadowThickness: 1", "*XmScrolledWindow*shadowThickness: 1", "*Scroll*shadowThickness: 0", "*Scroll.XmScrollBar.shadowThickness: 1", "*XmComboBox.shadowThickness: 1", "*XmComboBox.highlightThickness: 1", "*XmComboBox.marginHeight: 1", "*XmComboBox.marginWidth: 2", "*XmTextField.background: rgb:C0/D0/D0", "*XmTextField.marginHeight:2", "*XmTextField.marginWidth: 3", "*XmList.background: rgb:C0/D0/D0", "*option_menu.marginHeight: 0", "*option_menu.marginWidth: 0", "*memory_label.shadowThickness: 1", "*memory_label.highlightThickness: 0", "*memory_label.background: rgb:A8/B8/B8", "*memory_field.shadowThickness: 1", "*BulletinBoard.marginHeight: 0", "*BulletinBoard.marginWidth: 0", NULL};int main(int argc, char *args[]){ Widget menu_bar,button,main_window,scroll,form_buttons; XtAppContext context; XmString string; XtSetLanguageProc(NULL,NULL,NULL); textdomain("avr_simulator"); toplevel=XtVaOpenApplication(&context,"Avr_simulator",NULL,0,&argc,args, fallbacks,sessionShellWidgetClass,NULL); display=XtDisplay(toplevel); scr_num=DefaultScreen(display); XtAddEventHandler(toplevel,(EventMask)0,True, (XtEventHandler)_XEditResCheckMessages,0); XtVaSetValues(toplevel,XmNallowShellResize,True, XmNkeyboardFocusPolicy,XmPOINTER,NULL); main_window=XtVaCreateManagedWidget("main_window", xmMainWindowWidgetClass,toplevel, XmNheight,400,/* XmNwidth,520, */NULL); /* create menu */ menu_bar=XmCreateMenuBar(main_window,"menu",NULL,0); create_menu(menu_bar,menu,5); form=XtVaCreateWidget("form",xmFormWidgetClass,main_window,NULL); XtVaSetValues(main_window,XmNmenuBar,menu_bar,XmNworkWindow,form,NULL); XtManageChild(menu_bar); /* end menu */ /* create Selection File */ string=XmStringGenerate(_("Selection of file"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); file_selection=XmCreateFileSelectionDialog(toplevel,"selection_file",NULL,0); XtVaSetValues(file_selection,XmNdialogTitle,string, XmNheight,400,XmNwidth,400, XmNdialogStyle,XmDIALOG_PRIMARY_APPLICATION_MODAL,NULL); XmStringFree(string); string=XmStringGenerate("*.gen",XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); XtVaSetValues(file_selection,XmNpattern,string,NULL); XmStringFree(string); XtAddCallback(file_selection,XmNcancelCallback, (XtCallbackProc)unmanage, (XtPointer)&file_selection); XtAddCallback(file_selection,XmNokCallback, (XtCallbackProc)file_selection_ok, (XtPointer)&file_selection); XtUnmanageChild(XmFileSelectionBoxGetChild(file_selection, XmDIALOG_HELP_BUTTON)); /* option menu */ option_menu=XmCreateOptionMenu(file_selection,"option_menu",NULL,0); menu_fileselection=XmCreatePulldownMenu(option_menu,"option",NULL,0); string=XmStringGenerate(_("generic"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); button=XtVaCreateManagedWidget("generic",xmPushButtonGadgetClass, menu_fileselection,XmNlabelString,string, NULL); XtAddCallback(button,XmNactivateCallback,(XtCallbackProc)file_selection_gen, (XtPointer)&file_selection); XmStringFree(string); string=XmStringGenerate(_("motorola"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); button=XtVaCreateManagedWidget("motorola",xmPushButtonGadgetClass, menu_fileselection,XmNlabelString,string, NULL); XtAddCallback(button,XmNactivateCallback, (XtCallbackProc)file_selection_motorola, (XtPointer)&file_selection); XmStringFree(string); string=XmStringGenerate(_("intel"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); button=XtVaCreateManagedWidget("intel",xmPushButtonGadgetClass, menu_fileselection,XmNlabelString,string, NULL); XtAddCallback(button,XmNactivateCallback, (XtCallbackProc)file_selection_intel, (XtPointer)&file_selection); XmStringFree(string); string=XmStringCreateLocalized(_("Type of file:")); XtVaSetValues(option_menu,XmNsubMenuId,menu_fileselection,XmNlabelString, string, XmNtopAttachment,XmATTACH_FORM,XmNtopOffset,10, XmNleftAttachment,XmATTACH_FORM,XmNleftOffset,10, NULL); XmStringFree(string); XtManageChild(option_menu); /* end Selection File */ form_buttons= XtVaCreateManagedWidget("form",xmFormWidgetClass,form, XmNtopAttachment,XmATTACH_FORM, XmNleftAttachment,XmATTACH_FORM, XmNrightAttachment,XmATTACH_FORM, /* XmNheight,30, */NULL); create_buttons(form_buttons); separator=XtVaCreateManagedWidget("Separator",xmSeparatorWidgetClass,form, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget,form_buttons, XmNtopOffset,3,XmNleftOffset,2, XmNleftAttachment,XmATTACH_FORM, XmNrightAttachment,XmATTACH_FORM, XmNrightOffset,2,NULL); /* window for text of program */ frame=XtVaCreateManagedWidget("Frame",xmFrameWidgetClass,form, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget,separator,XmNtopOffset,5, XmNleftAttachment,XmATTACH_FORM, XmNleftOffset,5, XmNbottomAttachment,XmATTACH_FORM, XmNbottomOffset,5, XmNmarginWidth,2,XmNmarginHeight,2, NULL); scroll=XtVaCreateManagedWidget("Scroll",xmScrolledWindowWidgetClass,frame, XmNscrollingPolicy,XmAPPLICATION_DEFINED, XmNscrollBarDisplayPolicy,XmSTATIC, NULL); drawarea.draw=XtVaCreateManagedWidget("Drawing area", xmDrawingAreaWidgetClass,scroll, XmNbackground, WhitePixel(display,scr_num), XmNforeground, BlackPixel(display,scr_num),NULL); drawarea.v_scrb=XtVaCreateManagedWidget("scr_bar",xmScrollBarWidgetClass, scroll,XmNorientation,XmVERTICAL, XmNincrement,1,XmNminimum,0, XmNvalue,0,XmNsliderSize,1, XmNmaximum,1,NULL); XtAddCallback(drawarea.v_scrb,XmNvalueChangedCallback, (XtCallbackProc)scroll_bar_callback,NULL); XtAddCallback(drawarea.v_scrb,XmNdragCallback, (XtCallbackProc)scroll_bar_callback,NULL); XtAddCallback(drawarea.draw,XmNinputCallback, (XtCallbackProc)drawarea_input_callback,NULL); XmScrolledWindowSetAreas(scroll,NULL,drawarea.v_scrb,drawarea.draw); /* end of window */ /* create error message window */ error_dialog=XmCreateErrorDialog(toplevel,"Error message",NULL,0); string=XmStringGenerate(_("Error message"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); XtVaSetValues(error_dialog,XmNdialogTitle,string,NULL); XmStringFree(string); XtUnmanageChild(XmMessageBoxGetChild(error_dialog, XmDIALOG_HELP_BUTTON)); XtUnmanageChild(XmMessageBoxGetChild(error_dialog, XmDIALOG_CANCEL_BUTTON)); string=XmStringGenerate(_("Close"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); XtVaSetValues(error_dialog,XmNokLabelString,string, XmNdialogStyle,XmDIALOG_PRIMARY_APPLICATION_MODAL,NULL); XmStringFree(string); /* end of error message window */ /* create info message window */ info_dialog=XmCreateInformationDialog(toplevel,"Info_dialog",NULL,0); string=XmStringGenerate(_("Info message"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); XtVaSetValues(info_dialog,XmNdialogTitle,string,NULL); XmStringFree(string); XtUnmanageChild(XmMessageBoxGetChild(info_dialog, XmDIALOG_HELP_BUTTON)); XtUnmanageChild(XmMessageBoxGetChild(info_dialog, XmDIALOG_OK_BUTTON)); string=XmStringGenerate(_("Close"),XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT,_MOTIF_DEFAULT_LOCALE); XtVaSetValues(info_dialog,XmNcancelLabelString,string, XmNdialogStyle,XmDIALOG_PRIMARY_APPLICATION_MODAL,NULL); XmStringFree(string); XtAddCallback(info_dialog,XmNcancelCallback, (XtCallbackProc)info_close_callback,NULL); /* end of info message window */ create_project_selection(); /* create window of general purpose registers */ create_gpr_window(); /* create sram window */ create_sram_window(); /* create I/O ports window */ create_io_ports_window(); /* create EEPROM window */ create_eeprom_window(); /* create main status */ create_main(); create_debugger_window(); create_ports_window(); create_about(); XtManageChild(form); XtRealizeWidget(toplevel); init(); XtAppMainLoop(context); return 0;}void init(void){ XFontStruct *font_struct; XGCValues values; Dimension toplevel_height,toplevel_width; int n; mem_file_changed=eeprom_changed=NULL; drawarea.current_line_deb=-1; drawarea.num_commands=0; /* allocate data memory */ if((gpr_pointer=malloc(controllers[type_micro].size_gpr+ controllers[type_micro].size_io_reg+ controllers[type_micro].size_sram))==NULL) { puts("init(): can't allocate memory for 'gpr_pointer'"); exit(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -