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

📄 func_command.c

📁 linux上实现的多种型号的AVR模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
{  if(gpr_pointer[list_commands[pc].arg1]!=gpr_pointer[list_commands[pc].arg2])    {      pc++;      clocks++;     }  else    {      clocks+=list_commands[pc+1].num_words+1;      pc+=list_commands[pc+1].num_words+1;    }}void dec_command(void){  /* check flag V */  if(gpr_pointer[list_commands[pc].arg1]==0x80) set_sreg_flag(FLAG_V);  else clear_sreg_flag(FLAG_V);     gpr_pointer[list_commands[pc].arg1]--;  /* 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;    check_Z_N_flags(gpr_pointer[list_commands[pc].arg1]);    /* 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);   clocks++;  pc++;}void elpm1_command(void){  int address;  uint16_t code;  if(!ISPORT(RAMPZ))    {      puts("This command doesn't support by this device.");      return;    }    address=gpr_pointer[30];  address+=gpr_pointer[31]<<8;  address+=get_port(RAMPZ)<<16;  code=list_commands[address>>1].code;  if(address&1)    gpr_pointer[0]=code>>8;  else     gpr_pointer[0]=code;  /* set bit, it means that field's value will be update */  mem_file_changed[0]=mem_file_changed[0]|1;  pc++;  clocks+=3;}void elpm2_command(void){  int address;  uint16_t code;  if(!ISPORT(RAMPZ))    {      puts("This command doesn't support by this device.");      return;    }    address=gpr_pointer[30];  address+=gpr_pointer[31]<<8;  address+=get_port(RAMPZ)<<16;  code=list_commands[address>>1].code;  if(address&1)    gpr_pointer[list_commands[pc].arg1]=code>>8;  else     gpr_pointer[list_commands[pc].arg1]=code;  /* 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;    pc++;  clocks+=3;}void elpm3_command(void){  int address;  uint16_t code;  if(!ISPORT(RAMPZ))    {      puts("This command doesn't support by this device.");      return;    }    address=gpr_pointer[30];  address+=gpr_pointer[31]<<8;  address+=get_port(RAMPZ)<<16;  code=list_commands[address>>1].code;  if(address&1)    gpr_pointer[list_commands[pc].arg1]=code>>8;  else     gpr_pointer[list_commands[pc].arg1]=code;  address++;  gpr_pointer[30]=(uint8_t)address;  gpr_pointer[31]=(uint8_t)(address>>8);  /* 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;  mem_file_changed[31/8]|=(1<<31%8)|(1<<30%8);    if((address>>16)!=get_port(RAMPZ))    set_port(RAMPZ,address>>16);    pc++;  clocks+=3;}void eor_command(void){  gpr_pointer[list_commands[pc].arg1]^=gpr_pointer[list_commands[pc].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;    check_Z_N_flags(gpr_pointer[list_commands[pc].arg1]);  /* clear FLAG_V */  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 fmul_command(void){  return;}void fmuls_command(void){  return;}void fmulsu_command(void){  return;}void icall_command(void){  uint16_t sp;    if(type_micro==0)    {      stack_90s1200[2]=stack_90s1200[1];      stack_90s1200[1]=stack_90s1200[0];      stack_90s1200[0]=pc+1;    }  else    {      if(ISPORT(SPH)) sp=get_port16(SPL,SPH);      else sp=get_port(SPL);      if(sp<2) {fprintf(stderr,"Error: Stack Pointer not set\n");}            gpr_pointer[sp]=(uint8_t)(pc>>8);      mem_file_changed[sp/8]|=1<<sp%8;      sp--;      gpr_pointer[sp]=(uint8_t)pc;      mem_file_changed[sp/8]|=1<<sp%8;      sp--;      if(ISPORT(SPH)) set_port16(SPL,SPH,sp);      else set_port(SPL,sp);      }  pc=gpr_pointer[30]+(gpr_pointer[31]<<8);  clocks+=3;}void ijmp_command(void){  pc=gpr_pointer[30]+(gpr_pointer[31]<<8);  clocks+=2;}void in_command(void){  int n;  IO_port *port=NULL;  uint16_t value;  for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)    if(list_commands[pc].arg2==controllers[type_micro].io_registers[n].address)      {port=&controllers[type_micro].io_registers[n];break;}  if(port==NULL)    {      fprintf(stderr,"Port not defined, address: 0x%X\n",	      list_commands[pc].arg2);      pc++;      clocks++;      return;    }  for(n=0;port16_rd[n].code!=-1;n++)    if(port16_rd[n].code==port->code) break;    if(port16_rd[n].code==-1)    {      gpr_pointer[list_commands[pc].arg1]=io_pointer[list_commands[pc].arg2];      mem_file_changed[list_commands[pc].arg1/8]=1<<list_commands[pc].arg1%8;    }  else    {      switch(port16_rd[n].type){      case LOW:	value=get_port16(port16_rd[n].code,port16_rd[n-1].code);	gpr_pointer[list_commands[pc].arg1]=(uint8_t)value;	*port16_rd[n].temp=(uint8_t)(value>>8);	mem_file_changed[list_commands[pc].arg1/8]=1<<list_commands[pc].arg1%8;	break;      case HIGH: 	gpr_pointer[list_commands[pc].arg1]=*port16_rd[n].temp;	mem_file_changed[list_commands[pc].arg1/8]=1<<list_commands[pc].arg1%8;      }    }  pc++;  clocks++;}void inc_command(void){  /* check Flag V */  if(gpr_pointer[list_commands[pc].arg1]==0x7F) set_sreg_flag(FLAG_V);  else clear_sreg_flag(FLAG_V);    gpr_pointer[list_commands[pc].arg1]++;  /* 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;    check_Z_N_flags(gpr_pointer[list_commands[pc].arg1]);    /* 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 jmp_command(void){  pc=list_commands[pc].arg1;  clocks++;}/* add useing RAMPX register for >64K data memory*/void ld_x_command(void){  int x=gpr_pointer[26];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) x+=gpr_pointer[27]<<8;  if(x<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[x];  else fprintf(stderr,"Error: X register don't point to data memory\n");  /* 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;    pc++;  clocks+=2;}void ld_x_plus_command(void){  int x=gpr_pointer[26];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) x+=gpr_pointer[27]<<8;  if(x<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[x];  else fprintf(stderr,"Error: X register don't point to data memory\n");    x++;  gpr_pointer[26]=(uint8_t)x;  if(size>0xFF) gpr_pointer[27]=(uint8_t)(x>>8);    /* 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;  mem_file_changed[26/8]|=(1<<26%8)|(1<<27%8);    pc++;  clocks+=2;}void ld_minus_x_command(void){  int x=gpr_pointer[26];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) x+=gpr_pointer[27]<<8;  x--;  if(x<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[x];  else fprintf(stderr,"Error: X register don't point to data memory\n");    gpr_pointer[26]=(uint8_t)x;  if(size>0xFF) gpr_pointer[27]=(uint8_t)(x>>8);    /* 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;  mem_file_changed[26/8]|=(1<<26%8)|(1<<27%8);    pc++;  clocks+=2;}void ld_y_command(void){  int y=gpr_pointer[28];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) y+=gpr_pointer[29]<<8;  if(y<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[y];  else fprintf(stderr,"Error: X register don't point to data memory\n");   /* 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;      pc++;  clocks+=2;}void ld_y_plus_command(void){  int y=gpr_pointer[28];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) y+=gpr_pointer[29]<<8;  if(y<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[y];  else fprintf(stderr,"Error: X register don't point to data memory\n");    y++;  gpr_pointer[28]=(uint8_t)y;  if(size>0xFF) gpr_pointer[29]=(uint8_t)(y>>8);    /* 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;  mem_file_changed[28/8]|=(1<<28%8)|(1<<29%8);    pc++;  clocks+=2;}void ld_minus_y_command(void){  int y=gpr_pointer[28];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) y+=gpr_pointer[29]<<8;  y--;  if(y<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[y];  else fprintf(stderr,"Error: X register don't point to data memory\n");    gpr_pointer[28]=(uint8_t)y;  if(size>0xFF) gpr_pointer[29]=(uint8_t)(y>>8);    /* 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;  mem_file_changed[28/8]|=(1<<28%8)|(1<<29%8);  pc++;  clocks+=2;}void ld_z_command(void){  int z=gpr_pointer[30];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) z+=gpr_pointer[30]<<8;  if(z<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[z];  else fprintf(stderr,"Error: X register don't point to data memory\n");  /* 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;  pc++;  clocks+=2;}void ld_z_plus_command(void){  int z=gpr_pointer[30];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) z+=gpr_pointer[31]<<8;  if(z<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[z];  else fprintf(stderr,"Error: X register don't point to data memory\n");    z++;  gpr_pointer[30]=(uint8_t)z;  if(size>0xFF) gpr_pointer[31]=(uint8_t)(z>>8);    /* 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;  mem_file_changed[30/8]|=(1<<30%8)|(1<<31%8);  pc++;  clocks+=2;}void ld_minus_z_command(void){  int z=gpr_pointer[30];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) z+=gpr_pointer[31]<<8;  z--;  if(z<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[z];  else fprintf(stderr,"Error: X register don't point to data memory\n");    gpr_pointer[30]=(uint8_t)z;  if(size>0xFF) gpr_pointer[31]=(uint8_t)(z>>8);    /* 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;  mem_file_changed[30/8]|=(1<<30%8)|(1<<31%8);    pc++;  clocks+=2;}void ldd_y_command(void){  int y=gpr_pointer[28];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) y+=gpr_pointer[29]<<8;  y+=list_commands[pc].arg2;  if(y<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[y];  else fprintf(stderr,"Error: X register don't point to data memory\n");   /* 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;   pc++;  clocks+=2;}void ldd_z_command(void){  int z=gpr_pointer[30];  int size=controllers[type_micro].size_gpr+    controllers[type_micro].size_io_reg+controllers[type_micro].size_sram;    if(size>0xFF) z+=gpr_pointer[30]<<8;  z+=list_commands[pc].arg2;  if(z<size) gpr_pointer[list_commands[pc].arg1]=gpr_pointer[z];  else fprintf(stderr,"Error: X register don't point to data memory\n");  /* 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;  pc++;  clocks+=2;}void ldi_command(void){  gpr_pointer[list_commands[pc].arg1]=list_commands[pc].arg2;

⌨️ 快捷键说明

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