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

📄 func_command.c

📁 linux上实现的多种型号的AVR模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
  /* check flag V */  if(((arg1&0x80)&~(arg2&0x80)&(~(gpr_pointer[list_commands[pc].arg1]&0x80)))|     ((~(arg1&0x80))&(arg2&0x80)&(gpr_pointer[list_commands[pc].arg1]&0x80)))    set_sreg_flag(FLAG_V);  else clear_sreg_flag(FLAG_V);      /* check flag S */  if(get_sreg_flag(FLAG_N)^get_sreg_flag(FLAG_V)) set_sreg_flag(FLAG_S);  else clear_sreg_flag(FLAG_S);    pc++;  clocks++;}void sbci_command(void){  unsigned char arg1,arg2;     arg1=gpr_pointer[list_commands[pc].arg1];  arg2=list_commands[pc].arg2;  gpr_pointer[list_commands[pc].arg1]-=arg2;  /* set bit, it means that field's value will be update */  mem_file_changed[list_commands[pc].arg1/8]|=1<<list_commands[pc].arg1%8;    if(get_sreg_flag(FLAG_C)) gpr_pointer[list_commands[pc].arg1]--;   if(gpr_pointer[list_commands[pc].arg1]) clear_sreg_flag(FLAG_Z);    /* check flag C */  if((~(arg1&0x80)&(arg2&0x80))|     (~(arg1&0x80)&(gpr_pointer[list_commands[pc].arg1]&0x80))|     ((gpr_pointer[list_commands[pc].arg1]&0x80)&(arg2&0x80)))    set_sreg_flag(FLAG_C);  else clear_sreg_flag(FLAG_C);    /* check flag N */  if(gpr_pointer[list_commands[pc].arg1]&0x80) set_sreg_flag(FLAG_N);  else clear_sreg_flag(FLAG_N);      /* check flag H */  if((~(arg1&0x08)&(arg2&0x08))|     ((arg2&0x08)&(gpr_pointer[list_commands[pc].arg1]&0x8))|     ((gpr_pointer[list_commands[pc].arg1]&0x08)&(arg1&0x08)))    set_sreg_flag(FLAG_H);  else clear_sreg_flag(FLAG_H);    /* check flag V */  if(((arg1&0x80)&~(arg2&0x80)&(~(gpr_pointer[list_commands[pc].arg1]&0x80)))|     ((~(arg1&0x80))&(arg2&0x80)&(gpr_pointer[list_commands[pc].arg1]&0x80)))    set_sreg_flag(FLAG_V);  else clear_sreg_flag(FLAG_V);    /* check flag S */  if(get_sreg_flag(FLAG_N)^get_sreg_flag(FLAG_V)) set_sreg_flag(FLAG_S);  else clear_sreg_flag(FLAG_S);    pc++;  clocks++;  }void sbi_command(void){  int n,address;  for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)    if(list_commands[pc].arg1==controllers[type_micro].io_registers[n].address)      {	io_pointer[list_commands[pc].arg1]=	  (io_pointer[list_commands[pc].arg1]|(0x1<<list_commands[pc].arg2))&	  controllers[type_micro].io_registers[n].write_mask;	break;      }  address=list_commands[pc].arg1+controllers[type_micro].size_gpr;  mem_file_changed[address/8]|=1<<address%8;    pc++;  clocks+=2;}void sbic_command(void){  if(io_pointer[list_commands[pc].arg1]&(1<<list_commands[pc].arg2))    {      pc++;      clocks++;     }  else    {      clocks+=list_commands[pc+1].num_words+1;      pc+=list_commands[pc+1].num_words+1;    }  }void sbis_command(void){  if(io_pointer[list_commands[pc].arg1]&(1<<list_commands[pc].arg2))    {      clocks+=list_commands[pc+1].num_words+1;      pc+=list_commands[pc+1].num_words+1;    }  else    {      pc++;      clocks++;     } }void sbiw_command(void){  uint16_t reg,old;  reg=gpr_pointer[list_commands[pc].arg1];  reg+=gpr_pointer[list_commands[pc].arg1+1]<<8;  old=reg;  reg-=list_commands[pc].arg2;  gpr_pointer[list_commands[pc].arg1]=(uint8_t)reg;  gpr_pointer[list_commands[pc].arg1+1]=(uint8_t)(reg>>8);  /* set bit, it means that field's value will be update */  mem_file_changed[0]|=0x03;    /* check Flag Z */  if(!reg) set_sreg_flag(FLAG_Z);  else clear_sreg_flag(FLAG_Z);       /* check Flag N */  if(reg&0x8000) set_sreg_flag(FLAG_N);  else clear_sreg_flag(FLAG_N);          /* check Flag C */  if((reg&0x8000)&&(~(old&0x8000))) set_sreg_flag(FLAG_C);  else clear_sreg_flag(FLAG_C);        /* check flag V */  if((old&0x8000)&&(~(reg&0x8000))) set_sreg_flag(FLAG_V);  else clear_sreg_flag(FLAG_V);          /* check flag S */  if(get_sreg_flag(FLAG_N)^get_sreg_flag(FLAG_V)) set_sreg_flag(FLAG_S);  else clear_sreg_flag(FLAG_S);    pc++;  clocks+=2;}void sbrc_command(void){  if(gpr_pointer[list_commands[pc].arg1]&(1<<list_commands[pc].arg2))    {      pc++;      clocks++;    }  else    {      clocks+=list_commands[pc+1].num_words+1;      pc+=list_commands[pc+1].num_words+1;    }}void sbrs_command(void){  if(gpr_pointer[list_commands[pc].arg1]&(1<<list_commands[pc].arg2))    {      clocks+=list_commands[pc+1].num_words+1;      pc+=list_commands[pc+1].num_words+1;    }  else    {      pc++;      clocks++;    } }void sleep_command(void){  pc++;  clocks++;}void st_x_command(void){  uint16_t x;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    x=gpr_pointer[26];  if(size>0xFF) x+=gpr_pointer[27]<<8;  /* set bit, it means that field's value will be update */  mem_file_changed[x/8]|=1<<x%8;    if(x>size) {fprintf(stderr,"Error: X points out of memory\n");return;}    if(x<controllers[type_micro].size_gpr||     (x>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[x]=gpr_pointer[list_commands[pc].arg2];  else    {      x-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(x==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[x]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }      pc++;  clocks+=2;}void st_x_plus_command(void){  uint16_t x;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    x=gpr_pointer[26];  if(size>0xFF) x+=gpr_pointer[27]<<8;    if(x>size) {fprintf(stderr,"Error: X points out of memory\n");return;}    if(x<controllers[type_micro].size_gpr||     (x>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[x]=gpr_pointer[list_commands[pc].arg2];  else    {      x-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(x==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[x]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  x++;  gpr_pointer[26]=(uint8_t)x;  gpr_pointer[27]=(uint8_t)(x>>8);  mem_file_changed[26/8]|=(1<<26%8)|(1<<27%8);  mem_file_changed[x/8]|=1<<x%8;  pc++;  clocks+=2;  }void st_minus_x_command(void){  uint16_t x;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    x=gpr_pointer[26];  if(size>0xFF) x+=gpr_pointer[27]<<8;  x--;  if(x>size) {fprintf(stderr,"Error: X points out of memory\n");return;}    if(x<controllers[type_micro].size_gpr||     (x>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[x]=gpr_pointer[list_commands[pc].arg2];  else    {      x-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(x==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[x]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  gpr_pointer[26]=(uint8_t)x;  gpr_pointer[27]=(uint8_t)(x>>8);  mem_file_changed[26/8]|=(1<<26%8)|(1<<27%8);  mem_file_changed[x/8]|=1<<x%8;  pc++;  clocks+=2; }void st_y_command(void){  uint16_t y;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    y=gpr_pointer[28];  if(size>0xFF) y+=gpr_pointer[29]<<8;  /* set bit, it means that field's value will be update */  mem_file_changed[y/8]|=1<<y%8;    if(y>size) {fprintf(stderr,"Error: Y points out of memory\n");return;}    if(y<controllers[type_micro].size_gpr||     (y>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[y]=gpr_pointer[list_commands[pc].arg2];  else    {      y-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(y==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[y]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }      pc++;  clocks+=2;}void st_y_plus_command(void){  uint16_t y;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    y=gpr_pointer[28];  if(size>0xFF) y+=gpr_pointer[29]<<8;    if(y>size) {fprintf(stderr,"Error: Y points out of memory\n");return;}    if(y<controllers[type_micro].size_gpr||     (y>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[y]=gpr_pointer[list_commands[pc].arg2];  else    {      y-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(y==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[y]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  y++;  gpr_pointer[28]=(uint8_t)y;  gpr_pointer[29]=(uint8_t)(y>>8);  mem_file_changed[28/8]|=(1<<28%8)|(1<<29%8);  mem_file_changed[y/8]|=1<<y%8;  pc++;  clocks+=2;}void st_minus_y_command(void){  uint16_t y;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    y=gpr_pointer[28];  if(size>0xFF) y+=gpr_pointer[29]<<8;  y--;  if(y>size) {fprintf(stderr,"Error: Y points out of memory\n");return;}    if(y<controllers[type_micro].size_gpr||     (y>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[y]=gpr_pointer[list_commands[pc].arg2];  else    {      y-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(y==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[y]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  gpr_pointer[28]=(uint8_t)y;  gpr_pointer[29]=(uint8_t)(y>>8);  mem_file_changed[28/8]|=(1<<28%8)|(1<<29%8);  mem_file_changed[y/8]|=1<<y%8;  pc++;  clocks+=2;}void std_y_commad(void){  uint16_t y;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    y=gpr_pointer[28];  if(size>0xFF) y+=gpr_pointer[29]<<8;  y+=list_commands[pc].arg1;   if(y>size) {fprintf(stderr,"Error: X points out of memory\n");return;}    if(y<controllers[type_micro].size_gpr||     (y>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[y]=gpr_pointer[list_commands[pc].arg2];  else    {      y-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(y==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[y]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  mem_file_changed[y/8]|=1<<y%8;  pc++;  clocks+=2;}void st_z_command(void){  uint16_t z;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    z=gpr_pointer[30];  if(size>0xFF) z+=gpr_pointer[31]<<8;  if(z>size) {fprintf(stderr,"Error: Z points out of memory\n");return;}    if(z<controllers[type_micro].size_gpr||     (z>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[z]=gpr_pointer[list_commands[pc].arg2];  else    {      z-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(z==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[z]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  mem_file_changed[z/8]|=1<<z%8;  pc++;  clocks+=2;}void st_z_plus_command(void){  uint16_t z;  int n,size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    z=gpr_pointer[30];  if(size>0xFF) z+=gpr_pointer[31]<<8;    if(z>size) {fprintf(stderr,"Error: Z points out of memory\n");return;}    if(z<controllers[type_micro].size_gpr||     (z>=controllers[type_micro].size_gpr+controllers[type_micro].size_io_reg))    gpr_pointer[z]=gpr_pointer[list_commands[pc].arg2];  else    {      z-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(z==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[z]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }      if(controllers[type_micro].io_registers[n].code==-1)	fprintf(stderr,"Error: Port doesn't exist\n");    }  z++;

⌨️ 快捷键说明

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