📄 func_command.c
字号:
/* 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 + -