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

📄 func_command.c

📁 linux上实现的多种型号的AVR模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
  gpr_pointer[30]=(uint8_t)z;  gpr_pointer[31]=(uint8_t)(z>>8);  mem_file_changed[30/8]|=(1<<30%8)|(1<<31%8);  mem_file_changed[z/8]|=1<<z%8;  pc++;  clocks+=2;}void st_minus_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;  z--;  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");    }  gpr_pointer[30]=(uint8_t)z;  gpr_pointer[31]=(uint8_t)(z>>8);  mem_file_changed[30/8]|=(1<<30%8)|(1<<31%8);  mem_file_changed[z/8]|=1<<z%8;  pc++;  clocks+=2; }void std_z_commad(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;  z+=list_commands[pc].arg1;  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 sts_command(void){  uint16_t addr,n;  addr=list_commands[pc].arg1;  mem_file_changed[addr/8]|=1<<addr%8;  if(addr<controllers[type_micro].size_gpr+     controllers[type_micro].size_io_reg+controllers[type_micro].size_sram)    {fprintf(stderr,"Error: out of memory\n");return;}  if(addr<controllers[type_micro].size_gpr||     (addr>=controllers[type_micro].size_gpr+      controllers[type_micro].size_io_reg))    gpr_pointer[addr]=gpr_pointer[list_commands[pc].arg2];  else    {      addr-=controllers[type_micro].size_gpr;      for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)	if(addr==controllers[type_micro].io_registers[n].address)	  {	    io_pointer[addr]=gpr_pointer[list_commands[pc].arg2]&	      controllers[type_micro].io_registers[n].write_mask;	    break;	  }    }    pc+=2;  clocks+=2;  }void sub_command(void){  unsigned char arg1,arg2;     arg1=gpr_pointer[list_commands[pc].arg1];  arg2=gpr_pointer[list_commands[pc].arg2];  gpr_pointer[list_commands[pc].arg1]-=arg2;    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 C */  if((~(arg1&0x80)&(arg2&0x80))|     ((arg2&0x80)&(gpr_pointer[list_commands[pc].arg1]&0x80))|     ((gpr_pointer[list_commands[pc].arg1]&0x80)&~(arg1&0x80)))    set_sreg_flag(FLAG_C);  else clear_sreg_flag(FLAG_C);       /* 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 subi_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;  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 C */  if((~(arg1&0x80)&(arg2&0x80))|     ((arg2&0x80)&(gpr_pointer[list_commands[pc].arg1]&0x80))|     ((gpr_pointer[list_commands[pc].arg1]&0x80)&~(arg1&0x80)))    set_sreg_flag(FLAG_C);  else clear_sreg_flag(FLAG_C);   /* 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 swap_command(void){    gpr_pointer[list_commands[pc].arg1]=(gpr_pointer[list_commands[pc].arg1]<<4)+    (gpr_pointer[list_commands[pc].arg1]>>4);  mem_file_changed[list_commands[pc].arg1/8]|=1<<list_commands[pc].arg1%8;    clocks++;  pc++;}void wdr_command(void){  watchdog_prescaler=0;  clocks++;  pc++;}int reg_d5(char * mnemocode,int command,int address)/* 0000000d dddd0000 destantion  r0-r31*/{  command=(command&0x01F0)>>4;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int reg_s5(char * mnemocode,int command,int address)/* 000000d0 0000dddd source  r0-r31    */{  command=((command&0x0200)>>5)|(command&0x000F);  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;} int const_6(char * mnemocode,int command,int address)/* 00000000 dd00dddd const 0-63  */{  command=((command&0x00C0)>>2)|(command&0x000F);  sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  return command;}int bit_sreg(char * mnemocode,int command,int address)/* 00000000 0ddd0000  */{  char bit;  command=(command&0x0070)>>4;  switch(command)    {    case 7: bit='I'; break;    case 6: bit='T'; break;    case 5: bit='H'; break;    case 4: bit='S'; break;    case 3: bit='V'; break;    case 2: bit='N'; break;    case 1: bit='Z'; break;    case 0: bit='C'; break;    }  sprintf(&mnemocode[strlen(mnemocode)],"'%c'",bit);  return command;}int bit_sreg2(char * mnemocode,int command,int address)/* 00000000 00000ddd bld         */{  char bit;  command=command&7;  switch(command)    {    case 7: bit='I'; break;    case 6: bit='T'; break;    case 5: bit='H'; break;    case 4: bit='S'; break;    case 3: bit='V'; break;    case 2: bit='N'; break;    case 1: bit='Z'; break;    case 0: bit='C'; break;    }  sprintf(&mnemocode[strlen(mnemocode)],"'%c'",bit);  return command;}int bit_num2(char * mnemocode,int command,int address)/* 00000000 00000ddd 0-7         */{  command=command&7;  sprintf(&mnemocode[strlen(mnemocode)],"%d",command);  return command;}int reg_d4(char * mnemocode,int command,int address)/* 00000000 dddd0000 destantion r16-r31 */{  command=((command&0x00F0)>>4)|0x0010;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int reg_s4(char * mnemocode,int command,int address)/* 00000000 0000dddd source r16-r31     */{  command=(command&0x000F)|0x0010;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int reg_s3(char * mnemocode,int command,int address)/* 00000000 00000ddd r16-r23      */{  command=(command&0x0007)+16;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int reg_d3(char * mnemocode,int command,int address)/* 00000000 0ddd0000 r16-r23      */{  command=((command&0x0070)>>4)+16;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int none(char * mnemocode,int command,int address){  return 0;}int none_last(char * mnemocode,int command,int address){  mnemocode[strlen(mnemocode)-1]=0;  return 0;}int addr_shift(char * mnemocode,int command,int address)/* 000000dd ddddd000             */{  if(command&0x0200) command=((command&0x03F8)>>3)|(-1<<7);  else command=(command&0x03F8)>>3;  command+=address+1;  sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  return command;}int port(char * mnemocode,int command,int address)/* 00000000 ddddd000 port I/O low*/{  int n;  IO_port *port=NULL;  command=(command&0x00F8)>>3;    for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)    if(command==controllers[type_micro].io_registers[n].address)      {port=&controllers[type_micro].io_registers[n];break;}    if(port==NULL)    sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  else strcat(mnemocode,descr_io_ports[port->code].name);  return command;}int port_all(char * mnemocode,int command,int address)/* 00000dd0 0000dddd port I/O all*/{  int n;  IO_port *port=NULL;  command=((command&0x0600)>>5)|(command&0x000F);    for(n=0;controllers[type_micro].io_registers[n].code!=-1;n++)    if(command==controllers[type_micro].io_registers[n].address)      {port=&controllers[type_micro].io_registers[n];break;}    if(port==NULL)    sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  else strcat(mnemocode,descr_io_ports[port->code].name);  return command;}unsigned char byte(char * mnemocode,int command,int address)/* 0000dddd 0000dddd             */{  command=((command&0x0F00)>>4)|(command&0x000F);  sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  return (unsigned char)command;}int indir_addr(char * mnemocode,int command,int address)/* 00000000 000000dd X,X+,-X           */{  char c;  switch(command&0x000C)    {    case 0xC: c='X'; break;    case 0x8: c='Y'; break;    case 0x0: c='Z'; break;    case 0x4: c='Z'; break;    }  command=command&0x0003;  switch(command)    {      case 0:sprintf(&mnemocode[strlen(mnemocode)],"%c",c);      break;      case 1:sprintf(&mnemocode[strlen(mnemocode)],"%c+",c);      break;      case 2:sprintf(&mnemocode[strlen(mnemocode)],"-%c",c);      break;    }  return command;}int indir_shift(char * mnemocode,int command,int address)/* 00d0dd00 00000ddd 0-63         */{  switch(command&0x0008)    {    case 8: sprintf(&mnemocode[strlen(mnemocode)],"Y+");break;    case 0: sprintf(&mnemocode[strlen(mnemocode)],"Z+");break;    }  command=((command&0x2000)>>8)|((command&0x0C00)>>7)|(command&0x0007);  sprintf(&mnemocode[strlen(mnemocode)],"%Xh",command);  return command;}int addr_shift12(char *mnemocode,int command,int address)/* 0000dddd dddddddd rcall,rjmp  */{  int buf,addr;  if(command&0x0800) buf=command|(-1^0xFFF);   else buf=command&0x0FFF;  /*printf("\ncom: %X\t%X\t%X\n",command,buf,address);*/ /* test line*/  addr=buf+address+1;  sprintf(&mnemocode[strlen(mnemocode)],"%Xh",addr);  return buf;}int reg_d2(char * mnemocode,int command,int address)/* 00000000 00dd0000 r24,r26,r28,r30 */{  command=((command&0x0030)>>3)+24;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int put_z(char *mnemocode,int command,int address){  sprintf(&mnemocode[strlen(mnemocode)],"Z");  return 0;}int put_zplus(char *mnemocode,int command,int address){  sprintf(&mnemocode[strlen(mnemocode)],"Z+");  return 0;}int word_d(char *mnemocode,int command,int address)/* 00000000 dddd0000 r0,r2,...,r30*/{  command=(command&0x00F0)>>3;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int word_s(char *mnemocode,int command,int address)/* 00000000 0000dddd r0,r2,...,r30*/{  command=(command&0x000F)<<1;  sprintf(&mnemocode[strlen(mnemocode)],"r%d",command);  return command;}int addr22(char *mnemocode,int command,int address)/* use in long call and long jmp to get address */{  char buf[10];  sprintf(buf,"%X",list_commands[address+1].code);  fill_zero(buf,5);  strcat(mnemocode,buf);  return list_commands[address+1].code;}int word(char *mnemocode,int command,int address)/* dddd dddd dddd dddd */{  char buf[10];  sprintf(buf,"%X",command);  fill_zero(buf,4);  strcat(mnemocode,buf);  return command;}

⌨️ 快捷键说明

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