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