void decodeInstruction(instruction_t instruction,uint32_t *registro,flags_t *bandera, uint8_t *SRAM, uint16_t *codificacion, char **Flash) { int i; *codificacion=0; // valor incial // comparar el mnemonic con el nombre de cada una de las funciones, y asi ejecutar la adecuada if( strcmp(instruction.mnemonic,"LDR") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(13<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; instruction.op3_value<<=2; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { LDR(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Read); } } if((instruction.op1_type=='R') && (instruction.op2_type=='S') && (instruction.op3_type=='#')) { *codificacion=(19<<11)+(instruction.op1_value<<8)+instruction.op3_value; instruction.op3_value<<=2; if(((*(registro+13)+instruction.op3_value)>=0x20000000)&&((*(registro+13)+instruction.op3_value)<0x40000000)) { LDR(registro+instruction.op1_value,*(registro+13),instruction.op3_value,SRAM); } if((*(registro+13)+instruction.op3_value)<0x20000000) { } if((*(registro+13)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+13)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Read); } } if((instruction.op1_type=='R') && (instruction.op2_type=='P') && (instruction.op3_type=='#')) // label { *codificacion=(9<<11)+(instruction.op1_value<<8)+instruction.op3_value; instruction.op3_value<<=2; if(((*(registro+15)+instruction.op3_value)>=0x20000000)&&((*(registro+15)+instruction.op3_value)<0x40000000)) { LDR(registro+instruction.op1_value,*(registro+15),instruction.op3_value,SRAM); } if((*(registro+15)+instruction.op3_value)<0x20000000) { } if((*(registro+15)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+15)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Read); } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(11<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { LDR(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Read); } } registro[15]++; } if( strcmp(instruction.mnemonic,"LDRB") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(15<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { LDRB(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { uint8_t data; IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,&data,Read); *(registro+instruction.op1_value)= (uint32_t)data; } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(1<<14)+(7<<10)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { LDRB(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { uint8_t data; IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,&data,Read); *(registro+instruction.op1_value)=(uint32_t) data; } } registro[15]++; } if( strcmp(instruction.mnemonic,"LDRH") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(1<<15)+(1<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; instruction.op3_value<<=1; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { LDRH(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Read); } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(5<<12)+(5<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { LDRH(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Read); } registro[15]++; } if( strcmp(instruction.mnemonic,"LDRSB") ==0) { *codificacion=(5<<12)+(3<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { LDRSB(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Read); } registro[15]++; } if( strcmp(instruction.mnemonic,"LDRSH") ==0) { *codificacion=(5<<12)+(7<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { LDRSH(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Read); } registro[15]++; } if( strcmp(instruction.mnemonic,"STR") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(3<<13)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; instruction.op3_value<<=2; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { STR(*(registro+instruction.op1_value),*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Write); } } if((instruction.op1_type=='R') && (instruction.op2_type=='S') && (instruction.op3_type=='#')) { *codificacion=(9<<12)+(instruction.op1_value<<8)+instruction.op3_type; instruction.op3_value<<=2; if(((*(registro+13)+instruction.op3_value)>=0x20000000)&&((*(registro+13)+instruction.op3_value)<0x40000000)) { STR(*(registro+instruction.op1_value),*(registro+13),instruction.op3_value,SRAM); } if((*(registro+13)+instruction.op3_value)<0x20000000) { } if((*(registro+13)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+13)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Write); } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(5<<12)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { STR(*(registro+instruction.op1_value),*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Write); } } registro[15]++; } if( strcmp(instruction.mnemonic,"STRB") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(7<<12)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { STRB(*(registro+instruction.op1_value),*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { uint8_t data; data=(uint8_t)(*(registro+instruction.op1_value)); IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,&data,Write); } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(21<<10)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { STRB(*(registro+instruction.op1_value),*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { uint8_t data; data=(uint8_t)(*(registro+instruction.op1_value)); IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,&data,Write); } } registro[15]++; } if( strcmp(instruction.mnemonic,"STRH") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { *codificacion=(1<<15)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; instruction.op3_value<<=1; if(((*(registro+instruction.op2_value)+instruction.op3_value)>=0x20000000)&&((*(registro+instruction.op2_value)+instruction.op3_value)<0x40000000)) { STRH(*(registro+instruction.op1_value),*(registro+instruction.op2_value),instruction.op3_value,SRAM); } if((*(registro+instruction.op2_value)+instruction.op3_value)<0x20000000) { } if((*(registro+instruction.op2_value)+instruction.op3_value)>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+instruction.op3_value)&0xFF,registro+instruction.op1_value,Write); } } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { *codificacion=(5<<12)+(1<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; if(((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x20000000)&&((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x40000000)) { STRH(*(registro+instruction.op1_value),*(registro+instruction.op2_value),*(registro+instruction.op3_value),SRAM); } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))<0x20000000) { } if((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))>=0x40000000) { //IOAccess((*(registro+instruction.op2_value)+*(registro+instruction.op3_value))&0xFF,registro+instruction.op1_value,Write); } } registro[15]++; } if( strcmp(instruction.mnemonic,"PUSH") ==0) { for(i=0;i<8;i++) { *codificacion+=(instruction.registers_list[i]<<i); } *codificacion+=(11<<12)+(1<<10)+(instruction.registers_list[14]<<8); PUSH(registro,SRAM,&instruction.registers_list[0]); registro[15]++; } if( strcmp(instruction.mnemonic,"POP") ==0) { for(i=0;i<8;i++) { *codificacion+=(instruction.registers_list[i]<<i); } *codificacion=(11<<12)+(3<<10)+(instruction.registers_list[15]<<8); POP(registro,SRAM,&instruction.registers_list[0]); registro[15]++; } if( strcmp(instruction.mnemonic,"ADCS") ==0) { *codificacion=(1<<14)+(5<<6)+(instruction.op2_value<<3)+instruction.op1_value; ADCS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"ADD") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { ADD(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value)); *codificacion=(1<<14)+(1<<10)+(instruction.op2_value<<3)+((8&instruction.op1_value)<<4)+(7&instruction.op1_value); } if((instruction.op1_type=='R') && (instruction.op2_type=='S') && (instruction.op3_type=='#')) { ADD(registro+instruction.op1_value,*(registro+13),instruction.op2_value); *codificacion=(21<<11)+(instruction.op1_value<<8)+instruction.op3_value; } if((instruction.op1_type=='S') && (instruction.op2_type=='S') && (instruction.op3_type=='#')) { ADD(registro+13,*(registro+13),instruction.op3_value); *codificacion=(11<<12)+instruction.op3_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='S') && (instruction.op3_type=='R')) { ADD(registro+instruction.op1_value,*(registro+13),*(registro+instruction.op3_value)); *codificacion=(1<<14)+(1<<10)+(13<<3)+((8&instruction.op1_value)<<4)+(7&instruction.op1_value); } if((instruction.op1_type=='S') && (instruction.op2_type=='R')) { ADD(registro+13,*(registro+13),*(registro+instruction.op2_value)); *codificacion=(1<<14)+(9<<7)+5+(instruction.op2_value<<3); } registro[15]++; } if( strcmp(instruction.mnemonic,"ADDS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { ADDS(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,bandera); *codificacion=(7<<10)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='#')) { ADDS(registro+instruction.op1_value,*(registro+instruction.op1_value),instruction.op2_value,bandera); *codificacion=(3<<12)+(instruction.op1_value<<8)+instruction.op2_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { ADDS(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value), bandera); *codificacion=(3<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } // los parametros de las demas funciones aritmeticas, de desplazamiento y logicas son similares if( strcmp(instruction.mnemonic,"ANDS") ==0) { *codificacion=(1<<14)+(instruction.op2_value<<3)+instruction.op1_value; ANDS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"ASRS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { ASRS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); *codificacion=(1<<14)+(1<<8)+(instruction.op2_value<<3)+instruction.op1_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { ASRS(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,bandera); *codificacion=(1<<12)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"BICS") ==0) { *codificacion=(1<<14)+(14<<6)+(instruction.op2_value<<3)+instruction.op1_value; BICS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"CMN") ==0) { *codificacion=(1<<14)+(11<6)+(instruction.op2_value<<3)+instruction.op1_value; CMN(*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); // En diferencia a las demas funciones, se envian como parametros 2 valores registro[15]++; } if( strcmp(instruction.mnemonic,"CMP") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { if(instruction.op1_value>=8) { CMP(*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); // En diferencia a las demas funciones, se envian como parametros 2 valores *codificacion=(1<<14)+(5<<8)+(instruction.op2_value<<3)+(7&instruction.op1_value)+((8&instruction.op1_value)<<4); } else { CMP(*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); // En diferencia a las demas funciones, se envian como parametros 2 valores *codificacion=(1<<14)+(10<<6)+(instruction.op2_value<<3)+instruction.op1_value; } } if((instruction.op1_type=='R') && (instruction.op2_type=='#')) { CMP(*(registro+instruction.op1_value),instruction.op2_value, bandera); // Como parametros se tienen el contenido de un registro y un valor *codificacion=(5<<11)+(instruction.op1_value<<8)+instruction.op2_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"EORS") ==0) { *codificacion=(1<<14)+(1<<6)+(instruction.op2_value<<3)+instruction.op1_value; EORS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value),bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"LSLS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { LSLS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); *codificacion=(1<<14)+(1<<7)+(instruction.op2_value<<3)+instruction.op1_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { LSLS(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,bandera); *codificacion=(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"LSRS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { LSRS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); *codificacion=(1<<14)+(3<<6)+(instruction.op2_value<<3)+instruction.op1_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { LSRS(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,bandera); *codificacion=(1<<11)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"MOV") ==0) { *codificacion=(1<<14)+(3<<9)+(instruction.op2_value<<3)+(7&instruction.op1_value)+((8&instruction.op1_value)<<4); MOV(registro+instruction.op1_value,*(registro+instruction.op2_value)); // Envio como parametros una direccion y el contenido de un registro registro[15]++; } if( strcmp(instruction.mnemonic,"MOVS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='#')) { MOVS(registro+instruction.op1_value,instruction.op2_value, bandera); *codificacion=(1<<13)+(instruction.op1_value<<8)+instruction.op2_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R')) { MOVS(registro+instruction.op1_value,*(registro+instruction.op2_value),bandera); *codificacion=(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"MULS") ==0) { *codificacion=(1<<14)+(13<<6)+(instruction.op2_value<<3)+instruction.op3_value; MULS(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"MVNS") ==0) { *codificacion=(1<<14)+(15<<6)+(instruction.op2_value<<3)+instruction.op1_value; RSBS(registro+instruction.op1_value,*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"NOP") ==0) { *codificacion=(11<<12)+(15<<8); registro[15]++; } if( strcmp(instruction.mnemonic,"ORRS") ==0) { *codificacion=(1<<14)+(3<<8)+(instruction.op2_value<<3)+instruction.op1_value; ORRS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"REV") ==0) { *codificacion=(11<<12)+(5<<9)+(instruction.op2_value<<3)+instruction.op1_value; REV(registro+instruction.op1_value, *(registro+instruction.op2_value)); registro[15]++; } if( strcmp(instruction.mnemonic,"REV16") ==0) { *codificacion=(11<<12)+(5<<9)+(1<<6)+(instruction.op2_value<<3)+instruction.op1_value; REV16(registro+instruction.op1_value,*(registro+instruction.op2_value)); registro[15]++; } if( strcmp(instruction.mnemonic,"REVSH") ==0) { *codificacion=(11<<12)+(5<<9)+(3<<6)+(instruction.op2_value<<3)+instruction.op1_value; REVSH(registro+instruction.op1_value,*(registro+instruction.op2_value)); registro[15]++; } if( strcmp(instruction.mnemonic,"RORS") ==0) { *codificacion=(1<<14)+(7<<6)+(instruction.op2_value<<3)+instruction.op1_value; RORS(registro+instruction.op1_value,*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"RSBS") ==0) { *codificacion=(1<<14)+(9<<6)+(instruction.op2_value<<3)+instruction.op1_value; RSBS(registro+instruction.op1_value,*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"SBCS") ==0) { *codificacion=(1<<14)+(3<<7)+(instruction.op2_value<<3)+instruction.op1_value; SBCS(registro+instruction.op1_value,*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); registro[15]++; } if( strcmp(instruction.mnemonic,"SUB") ==0) { if((instruction.op1_type=='S') && (instruction.op2_type=='S') && (instruction.op3_type=='#')) { SUB(registro+13,*(registro+13),instruction.op3_value); *codificacion=(11<<12)+(1<<7)+instruction.op3_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"SUBS") ==0) { if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='#')) { SUBS(registro+instruction.op1_value,*(registro+instruction.op2_value),instruction.op3_value,bandera); *codificacion=(15<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='#')) { SUBS(registro+instruction.op1_value,*(registro+instruction.op1_value),instruction.op2_value,bandera); *codificacion=(7<<11)+(instruction.op1_value<<8)+instruction.op2_value; } if((instruction.op1_type=='R') && (instruction.op2_type=='R') && (instruction.op3_type=='R')) { SUBS(registro+instruction.op1_value,*(registro+instruction.op2_value),*(registro+instruction.op3_value), bandera); *codificacion=(13<<9)+(instruction.op3_value<<6)+(instruction.op2_value<<3)+instruction.op1_value; } registro[15]++; } if( strcmp(instruction.mnemonic,"TST") ==0) { *codificacion=(1<<14)+(1<<9)+(instruction.op2_value<<3)+instruction.op1_value; TST(*(registro+instruction.op1_value),*(registro+instruction.op2_value), bandera); // Como parametros se tienen el contenido de un registro y un valor registro[15]++; } // Las siguientes funciones, son funciones de saltos if( strcmp(instruction.mnemonic,"B") ==0) { *codificacion=(7<<13)+instruction.op1_value; B(registro,instruction.op1_value); // Envio como parametroa la direccion de registro y el valor del salto } if( strcmp(instruction.mnemonic,"BL") ==0) { *codificacion=(31<<11)+(2047&instruction.op1_value); BL(registro,instruction.op1_value); // Envio como parametroa la direccion de registro y el valor del salto } if( strcmp(instruction.mnemonic,"BLX") ==0) { *codificacion=(1<<14)+(15<<7)+(instruction.op1_value<<3); BLX(registro,*(registro+instruction.op1_value)); // Envio como parametroa la direccion de registro y el contenido de un registro } if( strcmp(instruction.mnemonic,"BX") ==0) { *codificacion=(1<<14)+(14<<7)+(instruction.op1_value<<3); if(instruction.op1_type=='L') // Sucede cuando { BX(registro,registro[14]); // PC=LR } if(instruction.op1_type=='R') // Sucede cuando se tiene como parametro un registro diferente a LR { BX(registro,*(registro+instruction.op1_value)); } } if( strcmp(instruction.mnemonic,"BEQ") ==0) { *codificacion=(13<<12)+instruction.op1_value; BEQ(registro,instruction.op1_value,*bandera); // Envio como parametros la direccion de registro, el valor del salto y las banderas } // Todas las siguientes funciones de salto tienen los mismos parametro que BEQ if( strcmp(instruction.mnemonic,"BNE") ==0) { *codificacion=(13<<12)+(1<<8)+instruction.op1_value; BNE(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BCS") ==0) { *codificacion=(13<<12)+(2<<8)+instruction.op1_value; BCS(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BCC") ==0) { *codificacion=(13<<12)+(3<<8)+instruction.op1_value; BCC(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BMI") ==0) { *codificacion=(13<<12)+(4<<8)+instruction.op1_value; BMI(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BPL") ==0) { *codificacion=(13<<12)+(5<<8)+instruction.op1_value; BPL(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BVS") ==0) { *codificacion=(13<<12)+(6<<8)+instruction.op1_value; BVS(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BVC") ==0) { *codificacion=(13<<12)+(7<<8)+instruction.op1_value; BVC(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BHI") ==0) { *codificacion=(13<<12)+(8<<8)+instruction.op1_value; BHI(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BLS") ==0) { *codificacion=(13<<12)+(9<<8)+instruction.op1_value; BLS(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BGE") ==0) { *codificacion=(13<<12)+(10<<8)+instruction.op1_value; BGE(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BLT") ==0) { *codificacion=(13<<12)+(11<<8)+instruction.op1_value; BLT(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BGT") ==0) { *codificacion=(13<<12)+(12<<8)+instruction.op1_value; BGT(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BLE") ==0) { *codificacion=(13<<12)+(13<<8)+instruction.op1_value; BLE(registro,instruction.op1_value,*bandera); } if( strcmp(instruction.mnemonic,"BAL") ==0) { *codificacion=(13<<12)+(14<<8)+instruction.op1_value; BAL(registro,instruction.op1_value,*bandera); } }
// // 柦椷幚峴 // INT CPU::EXEC( INT request_cycles ) { BYTE opcode; // 僆儁僐乕僪 INT OLD_cycles = TOTAL_cycles; INT exec_cycles; BYTE nmi_request, irq_request; BOOL bClockProcess = m_bClockProcess; // TEMP register WORD EA; register WORD ET; register WORD WT; register BYTE DT; while( request_cycles > 0 ) { exec_cycles = 0; if( DMA_cycles ) { if( request_cycles <= DMA_cycles ) { DMA_cycles -= request_cycles; TOTAL_cycles += request_cycles; // 僋儘僢僋摨婜張棟 mapper->Clock( request_cycles ); #if DPCM_SYNCCLOCK apu->SyncDPCM( request_cycles ); #endif if( bClockProcess ) { nes->Clock( request_cycles ); } // nes->Clock( request_cycles ); goto _execute_exit; } else { exec_cycles += DMA_cycles; // request_cycles -= DMA_cycles; DMA_cycles = 0; } } nmi_request = irq_request = 0; opcode = OP6502( R.PC++ ); if( R.INT_pending ) { if( R.INT_pending & NMI_FLAG ) { nmi_request = 0xFF; R.INT_pending &= ~NMI_FLAG; } else if( R.INT_pending & IRQ_MASK ) { R.INT_pending &= ~IRQ_TRIGGER2; if( !(R.P & I_FLAG) && opcode != 0x40 ) { irq_request = 0xFF; R.INT_pending &= ~IRQ_TRIGGER; } } } //增加指令预测忽略功能 //opcode BYTE iInstructionLen =1; switch (TraceAddrMode[opcode]) { case IND: case ADR: case ABS: case ABX: case ABY: iInstructionLen = 3; break; case IMM: case ZPG: case ZPX: case ZPY: case INX: case INY: iInstructionLen = 2; break; case IMP:case ACC:case ERR: break; case REL:iInstructionLen = 2;break; } if( ((TraceArr[opcode][0]=='*') || (TraceArr[opcode][1]=='?'))&& (!Config.emulator.bIllegalOp) ) { //这里可以优化输出信息 //char str[111]; //DecodeInstruction (R.PC-1, str); //DEBUGOUT( "Bad Instruction:%s\n",str); R.PC=(R.PC-1)+iInstructionLen; ADD_CYCLE(iInstructionLen*2); goto end_is; } // switch( opcode ) { case 0x69: // ADC #$?? MR_IM(); ADC(); ADD_CYCLE(2); break; case 0x65: // ADC $?? MR_ZP(); ADC(); ADD_CYCLE(3); break; case 0x75: // ADC $??,X MR_ZX(); ADC(); ADD_CYCLE(4); break; case 0x6D: // ADC $???? MR_AB(); ADC(); ADD_CYCLE(4); break; case 0x7D: // ADC $????,X MR_AX(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0x79: // ADC $????,Y MR_AY(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0x61: // ADC ($??,X) MR_IX(); ADC(); ADD_CYCLE(6); break; case 0x71: // ADC ($??),Y MR_IY(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xE9: // SBC #$?? MR_IM(); SBC(); ADD_CYCLE(2); break; case 0xE5: // SBC $?? MR_ZP(); SBC(); ADD_CYCLE(3); break; case 0xF5: // SBC $??,X MR_ZX(); SBC(); ADD_CYCLE(4); break; case 0xED: // SBC $???? MR_AB(); SBC(); ADD_CYCLE(4); break; case 0xFD: // SBC $????,X MR_AX(); SBC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xF9: // SBC $????,Y MR_AY(); SBC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xE1: // SBC ($??,X) MR_IX(); SBC(); ADD_CYCLE(6); break; case 0xF1: // SBC ($??),Y MR_IY(); SBC(); CHECK_EA(); ADD_CYCLE(5); break; case 0xC6: // DEC $?? MR_ZP(); DEC(); MW_ZP(); ADD_CYCLE(5); break; case 0xD6: // DEC $??,X MR_ZX(); DEC(); MW_ZP(); ADD_CYCLE(6); break; case 0xCE: // DEC $???? MR_AB(); DEC(); MW_EA(); ADD_CYCLE(6); break; case 0xDE: // DEC $????,X MR_AX(); DEC(); MW_EA(); ADD_CYCLE(7); break; case 0xCA: // DEX DEX(); ADD_CYCLE(2); break; case 0x88: // DEY DEY(); ADD_CYCLE(2); break; case 0xE6: // INC $?? MR_ZP(); INC(); MW_ZP(); ADD_CYCLE(5); break; case 0xF6: // INC $??,X MR_ZX(); INC(); MW_ZP(); ADD_CYCLE(6); break; case 0xEE: // INC $???? MR_AB(); INC(); MW_EA(); ADD_CYCLE(6); break; case 0xFE: // INC $????,X MR_AX(); INC(); MW_EA(); ADD_CYCLE(7); break; case 0xE8: // INX INX(); ADD_CYCLE(2); break; case 0xC8: // INY INY(); ADD_CYCLE(2); break; case 0x29: // AND #$?? MR_IM(); AND(); ADD_CYCLE(2); break; case 0x25: // AND $?? MR_ZP(); AND(); ADD_CYCLE(3); break; case 0x35: // AND $??,X MR_ZX(); AND(); ADD_CYCLE(4); break; case 0x2D: // AND $???? MR_AB(); AND(); ADD_CYCLE(4); break; case 0x3D: // AND $????,X MR_AX(); AND(); CHECK_EA(); ADD_CYCLE(4); break; case 0x39: // AND $????,Y MR_AY(); AND(); CHECK_EA(); ADD_CYCLE(4); break; case 0x21: // AND ($??,X) MR_IX(); AND(); ADD_CYCLE(6); break; case 0x31: // AND ($??),Y MR_IY(); AND(); CHECK_EA(); ADD_CYCLE(5); break; case 0x0A: // ASL A ASL_A(); ADD_CYCLE(2); break; case 0x06: // ASL $?? MR_ZP(); ASL(); MW_ZP(); ADD_CYCLE(5); break; case 0x16: // ASL $??,X MR_ZX(); ASL(); MW_ZP(); ADD_CYCLE(6); break; case 0x0E: // ASL $???? MR_AB(); ASL(); MW_EA(); ADD_CYCLE(6); break; case 0x1E: // ASL $????,X MR_AX(); ASL(); MW_EA(); ADD_CYCLE(7); break; case 0x24: // BIT $?? MR_ZP(); BIT(); ADD_CYCLE(3); break; case 0x2C: // BIT $???? MR_AB(); BIT(); ADD_CYCLE(4); break; case 0x49: // EOR #$?? MR_IM(); EOR(); ADD_CYCLE(2); break; case 0x45: // EOR $?? MR_ZP(); EOR(); ADD_CYCLE(3); break; case 0x55: // EOR $??,X MR_ZX(); EOR(); ADD_CYCLE(4); break; case 0x4D: // EOR $???? MR_AB(); EOR(); ADD_CYCLE(4); break; case 0x5D: // EOR $????,X MR_AX(); EOR(); CHECK_EA(); ADD_CYCLE(4); break; case 0x59: // EOR $????,Y MR_AY(); EOR(); CHECK_EA(); ADD_CYCLE(4); break; case 0x41: // EOR ($??,X) MR_IX(); EOR(); ADD_CYCLE(6); break; case 0x51: // EOR ($??),Y MR_IY(); EOR(); CHECK_EA(); ADD_CYCLE(5); break; case 0x4A: // LSR A LSR_A(); ADD_CYCLE(2); break; case 0x46: // LSR $?? MR_ZP(); LSR(); MW_ZP(); ADD_CYCLE(5); break; case 0x56: // LSR $??,X MR_ZX(); LSR(); MW_ZP(); ADD_CYCLE(6); break; case 0x4E: // LSR $???? MR_AB(); LSR(); MW_EA(); ADD_CYCLE(6); break; case 0x5E: // LSR $????,X MR_AX(); LSR(); MW_EA(); ADD_CYCLE(7); break; case 0x09: // ORA #$?? MR_IM(); ORA(); ADD_CYCLE(2); break; case 0x05: // ORA $?? MR_ZP(); ORA(); ADD_CYCLE(3); break; case 0x15: // ORA $??,X MR_ZX(); ORA(); ADD_CYCLE(4); break; case 0x0D: // ORA $???? MR_AB(); ORA(); ADD_CYCLE(4); break; case 0x1D: // ORA $????,X MR_AX(); ORA(); CHECK_EA(); ADD_CYCLE(4); break; case 0x19: // ORA $????,Y MR_AY(); ORA(); CHECK_EA(); ADD_CYCLE(4); break; case 0x01: // ORA ($??,X) MR_IX(); ORA(); ADD_CYCLE(6); break; case 0x11: // ORA ($??),Y MR_IY(); ORA(); CHECK_EA(); ADD_CYCLE(5); break; case 0x2A: // ROL A ROL_A(); ADD_CYCLE(2); break; case 0x26: // ROL $?? MR_ZP(); ROL(); MW_ZP(); ADD_CYCLE(5); break; case 0x36: // ROL $??,X MR_ZX(); ROL(); MW_ZP(); ADD_CYCLE(6); break; case 0x2E: // ROL $???? MR_AB(); ROL(); MW_EA(); ADD_CYCLE(6); break; case 0x3E: // ROL $????,X MR_AX(); ROL(); MW_EA(); ADD_CYCLE(7); break; case 0x6A: // ROR A ROR_A(); ADD_CYCLE(2); break; case 0x66: // ROR $?? MR_ZP(); ROR(); MW_ZP(); ADD_CYCLE(5); break; case 0x76: // ROR $??,X MR_ZX(); ROR(); MW_ZP(); ADD_CYCLE(6); break; case 0x6E: // ROR $???? MR_AB(); ROR(); MW_EA(); ADD_CYCLE(6); break; case 0x7E: // ROR $????,X MR_AX(); ROR(); MW_EA(); ADD_CYCLE(7); break; case 0xA9: // LDA #$?? MR_IM(); LDA(); ADD_CYCLE(2); break; case 0xA5: // LDA $?? MR_ZP(); LDA(); ADD_CYCLE(3); break; case 0xB5: // LDA $??,X MR_ZX(); LDA(); ADD_CYCLE(4); break; case 0xAD: // LDA $???? MR_AB(); LDA(); ADD_CYCLE(4); break; case 0xBD: // LDA $????,X MR_AX(); LDA(); CHECK_EA(); ADD_CYCLE(4); break; case 0xB9: // LDA $????,Y MR_AY(); LDA(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA1: // LDA ($??,X) MR_IX(); LDA(); ADD_CYCLE(6); break; case 0xB1: // LDA ($??),Y MR_IY(); LDA(); CHECK_EA(); ADD_CYCLE(5); break; case 0xA2: // LDX #$?? MR_IM(); LDX(); ADD_CYCLE(2); break; case 0xA6: // LDX $?? MR_ZP(); LDX(); ADD_CYCLE(3); break; case 0xB6: // LDX $??,Y MR_ZY(); LDX(); ADD_CYCLE(4); break; case 0xAE: // LDX $???? MR_AB(); LDX(); ADD_CYCLE(4); break; case 0xBE: // LDX $????,Y MR_AY(); LDX(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA0: // LDY #$?? MR_IM(); LDY(); ADD_CYCLE(2); break; case 0xA4: // LDY $?? MR_ZP(); LDY(); ADD_CYCLE(3); break; case 0xB4: // LDY $??,X MR_ZX(); LDY(); ADD_CYCLE(4); break; case 0xAC: // LDY $???? MR_AB(); LDY(); ADD_CYCLE(4); break; case 0xBC: // LDY $????,X MR_AX(); LDY(); CHECK_EA(); ADD_CYCLE(4); break; case 0x85: // STA $?? EA_ZP(); STA(); MW_ZP(); ADD_CYCLE(3); break; case 0x95: // STA $??,X EA_ZX(); STA(); MW_ZP(); ADD_CYCLE(4); break; case 0x8D: // STA $???? EA_AB(); STA(); MW_EA(); ADD_CYCLE(4); break; case 0x9D: // STA $????,X EA_AX(); STA(); MW_EA(); ADD_CYCLE(5); break; case 0x99: // STA $????,Y EA_AY(); STA(); MW_EA(); ADD_CYCLE(5); break; case 0x81: // STA ($??,X) EA_IX(); STA(); MW_EA(); ADD_CYCLE(6); break; case 0x91: // STA ($??),Y EA_IY(); STA(); MW_EA(); ADD_CYCLE(6); break; case 0x86: // STX $?? EA_ZP(); STX(); MW_ZP(); ADD_CYCLE(3); break; case 0x96: // STX $??,Y EA_ZY(); STX(); MW_ZP(); ADD_CYCLE(4); break; case 0x8E: // STX $???? EA_AB(); STX(); MW_EA(); ADD_CYCLE(4); break; case 0x84: // STY $?? EA_ZP(); STY(); MW_ZP(); ADD_CYCLE(3); break; case 0x94: // STY $??,X EA_ZX(); STY(); MW_ZP(); ADD_CYCLE(4); break; case 0x8C: // STY $???? EA_AB(); STY(); MW_EA(); ADD_CYCLE(4); break; case 0xAA: // TAX TAX(); ADD_CYCLE(2); break; case 0x8A: // TXA TXA(); ADD_CYCLE(2); break; case 0xA8: // TAY TAY(); ADD_CYCLE(2); break; case 0x98: // TYA TYA(); ADD_CYCLE(2); break; case 0xBA: // TSX TSX(); ADD_CYCLE(2); break; case 0x9A: // TXS TXS(); ADD_CYCLE(2); break; case 0xC9: // CMP #$?? MR_IM(); CMP_(); ADD_CYCLE(2); break; case 0xC5: // CMP $?? MR_ZP(); CMP_(); ADD_CYCLE(3); break; case 0xD5: // CMP $??,X MR_ZX(); CMP_(); ADD_CYCLE(4); break; case 0xCD: // CMP $???? MR_AB(); CMP_(); ADD_CYCLE(4); break; case 0xDD: // CMP $????,X MR_AX(); CMP_(); CHECK_EA(); ADD_CYCLE(4); break; case 0xD9: // CMP $????,Y MR_AY(); CMP_(); CHECK_EA(); ADD_CYCLE(4); break; case 0xC1: // CMP ($??,X) MR_IX(); CMP_(); ADD_CYCLE(6); break; case 0xD1: // CMP ($??),Y MR_IY(); CMP_(); CHECK_EA(); ADD_CYCLE(5); break; case 0xE0: // CPX #$?? MR_IM(); CPX(); ADD_CYCLE(2); break; case 0xE4: // CPX $?? MR_ZP(); CPX(); ADD_CYCLE(3); break; case 0xEC: // CPX $???? MR_AB(); CPX(); ADD_CYCLE(4); break; case 0xC0: // CPY #$?? MR_IM(); CPY(); ADD_CYCLE(2); break; case 0xC4: // CPY $?? MR_ZP(); CPY(); ADD_CYCLE(3); break; case 0xCC: // CPY $???? MR_AB(); CPY(); ADD_CYCLE(4); break; case 0x90: // BCC MR_IM(); BCC(); ADD_CYCLE(2); break; case 0xB0: // BCS MR_IM(); BCS(); ADD_CYCLE(2); break; case 0xF0: // BEQ MR_IM(); BEQ(); ADD_CYCLE(2); break; case 0x30: // BMI MR_IM(); BMI(); ADD_CYCLE(2); break; case 0xD0: // BNE MR_IM(); BNE(); ADD_CYCLE(2); break; case 0x10: // BPL MR_IM(); BPL(); ADD_CYCLE(2); break; case 0x50: // BVC MR_IM(); BVC(); ADD_CYCLE(2); break; case 0x70: // BVS MR_IM(); BVS(); ADD_CYCLE(2); break; case 0x4C: // JMP $???? JMP(); ADD_CYCLE(3); break; case 0x6C: // JMP ($????) JMP_ID(); ADD_CYCLE(5); break; case 0x20: // JSR JSR(); ADD_CYCLE(6); break; case 0x40: // RTI RTI(); ADD_CYCLE(6); break; case 0x60: // RTS RTS(); ADD_CYCLE(6); break; // 僼儔僌惂屼宯 case 0x18: // CLC CLC(); ADD_CYCLE(2); break; case 0xD8: // CLD CLD(); ADD_CYCLE(2); break; case 0x58: // CLI CLI(); ADD_CYCLE(2); break; case 0xB8: // CLV CLV(); ADD_CYCLE(2); break; case 0x38: // SEC SEC(); ADD_CYCLE(2); break; case 0xF8: // SED SED(); ADD_CYCLE(2); break; case 0x78: // SEI SEI(); ADD_CYCLE(2); break; // 僗僞僢僋宯 case 0x48: // PHA PUSH( R.A ); ADD_CYCLE(3); break; case 0x08: // PHP PUSH( R.P | B_FLAG ); ADD_CYCLE(3); break; case 0x68: // PLA (N-----Z-) R.A = POP(); SET_ZN_FLAG(R.A); ADD_CYCLE(4); break; case 0x28: // PLP R.P = POP() | R_FLAG; ADD_CYCLE(4); break; // 偦偺懠 case 0x00: // BRK BRK(); ADD_CYCLE(7); break; case 0xEA: // NOP ADD_CYCLE(2); break; // 枹岞奐柦椷孮 case 0x0B: // ANC #$?? case 0x2B: // ANC #$?? MR_IM(); ANC(); ADD_CYCLE(2); break; case 0x8B: // ANE #$?? MR_IM(); ANE(); ADD_CYCLE(2); break; case 0x6B: // ARR #$?? MR_IM(); ARR(); ADD_CYCLE(2); break; case 0x4B: // ASR #$?? MR_IM(); ASR(); ADD_CYCLE(2); break; case 0xC7: // DCP $?? MR_ZP(); DCP(); MW_ZP(); ADD_CYCLE(5); break; case 0xD7: // DCP $??,X MR_ZX(); DCP(); MW_ZP(); ADD_CYCLE(6); break; case 0xCF: // DCP $???? MR_AB(); DCP(); MW_EA(); ADD_CYCLE(6); break; case 0xDF: // DCP $????,X MR_AX(); DCP(); MW_EA(); ADD_CYCLE(7); break; case 0xDB: // DCP $????,Y MR_AY(); DCP(); MW_EA(); ADD_CYCLE(7); break; case 0xC3: // DCP ($??,X) MR_IX(); DCP(); MW_EA(); ADD_CYCLE(8); break; case 0xD3: // DCP ($??),Y MR_IY(); DCP(); MW_EA(); ADD_CYCLE(8); break; case 0xE7: // ISB $?? MR_ZP(); ISB(); MW_ZP(); ADD_CYCLE(5); break; case 0xF7: // ISB $??,X MR_ZX(); ISB(); MW_ZP(); ADD_CYCLE(5); break; case 0xEF: // ISB $???? MR_AB(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xFF: // ISB $????,X MR_AX(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xFB: // ISB $????,Y MR_AY(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xE3: // ISB ($??,X) MR_IX(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xF3: // ISB ($??),Y MR_IY(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xBB: // LAS $????,Y MR_AY(); LAS(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA7: // LAX $?? MR_ZP(); LAX(); ADD_CYCLE(3); break; case 0xB7: // LAX $??,Y MR_ZY(); LAX(); ADD_CYCLE(4); break; case 0xAF: // LAX $???? MR_AB(); LAX(); ADD_CYCLE(4); break; case 0xBF: // LAX $????,Y MR_AY(); LAX(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA3: // LAX ($??,X) MR_IX(); LAX(); ADD_CYCLE(6); break; case 0xB3: // LAX ($??),Y MR_IY(); LAX(); CHECK_EA(); ADD_CYCLE(5); break; case 0xAB: // LXA #$?? MR_IM(); LXA(); ADD_CYCLE(2); break; case 0x27: // RLA $?? MR_ZP(); RLA(); MW_ZP(); ADD_CYCLE(5); break; case 0x37: // RLA $??,X MR_ZX(); RLA(); MW_ZP(); ADD_CYCLE(6); break; case 0x2F: // RLA $???? MR_AB(); RLA(); MW_EA(); ADD_CYCLE(6); break; case 0x3F: // RLA $????,X MR_AX(); RLA(); MW_EA(); ADD_CYCLE(7); break; case 0x3B: // RLA $????,Y MR_AY(); RLA(); MW_EA(); ADD_CYCLE(7); break; case 0x23: // RLA ($??,X) MR_IX(); RLA(); MW_EA(); ADD_CYCLE(8); break; case 0x33: // RLA ($??),Y MR_IY(); RLA(); MW_EA(); ADD_CYCLE(8); break; case 0x67: // RRA $?? MR_ZP(); RRA(); MW_ZP(); ADD_CYCLE(5); break; case 0x77: // RRA $??,X MR_ZX(); RRA(); MW_ZP(); ADD_CYCLE(6); break; case 0x6F: // RRA $???? MR_AB(); RRA(); MW_EA(); ADD_CYCLE(6); break; case 0x7F: // RRA $????,X MR_AX(); RRA(); MW_EA(); ADD_CYCLE(7); break; case 0x7B: // RRA $????,Y MR_AY(); RRA(); MW_EA(); ADD_CYCLE(7); break; case 0x63: // RRA ($??,X) MR_IX(); RRA(); MW_EA(); ADD_CYCLE(8); break; case 0x73: // RRA ($??),Y MR_IY(); RRA(); MW_EA(); ADD_CYCLE(8); break; case 0x87: // SAX $?? MR_ZP(); SAX(); MW_ZP(); ADD_CYCLE(3); break; case 0x97: // SAX $??,Y MR_ZY(); SAX(); MW_ZP(); ADD_CYCLE(4); break; case 0x8F: // SAX $???? MR_AB(); SAX(); MW_EA(); ADD_CYCLE(4); break; case 0x83: // SAX ($??,X) MR_IX(); SAX(); MW_EA(); ADD_CYCLE(6); break; case 0xCB: // SBX #$?? MR_IM(); SBX(); ADD_CYCLE(2); break; case 0x9F: // SHA $????,Y MR_AY(); SHA(); MW_EA(); ADD_CYCLE(5); break; case 0x93: // SHA ($??),Y MR_IY(); SHA(); MW_EA(); ADD_CYCLE(6); break; case 0x9B: // SHS $????,Y MR_AY(); SHS(); MW_EA(); ADD_CYCLE(5); break; case 0x9E: // SHX $????,Y MR_AY(); SHX(); MW_EA(); ADD_CYCLE(5); break; case 0x9C: // SHY $????,X MR_AX(); SHY(); MW_EA(); ADD_CYCLE(5); break; case 0x07: // SLO $?? MR_ZP(); SLO(); MW_ZP(); ADD_CYCLE(5); break; case 0x17: // SLO $??,X MR_ZX(); SLO(); MW_ZP(); ADD_CYCLE(6); break; case 0x0F: // SLO $???? MR_AB(); SLO(); MW_EA(); ADD_CYCLE(6); break; case 0x1F: // SLO $????,X MR_AX(); SLO(); MW_EA(); ADD_CYCLE(7); break; case 0x1B: // SLO $????,Y MR_AY(); SLO(); MW_EA(); ADD_CYCLE(7); break; case 0x03: // SLO ($??,X) MR_IX(); SLO(); MW_EA(); ADD_CYCLE(8); break; case 0x13: // SLO ($??),Y MR_IY(); SLO(); MW_EA(); ADD_CYCLE(8); break; case 0x47: // SRE $?? MR_ZP(); SRE(); MW_ZP(); ADD_CYCLE(5); break; case 0x57: // SRE $??,X MR_ZX(); SRE(); MW_ZP(); ADD_CYCLE(6); break; case 0x4F: // SRE $???? MR_AB(); SRE(); MW_EA(); ADD_CYCLE(6); break; case 0x5F: // SRE $????,X MR_AX(); SRE(); MW_EA(); ADD_CYCLE(7); break; case 0x5B: // SRE $????,Y MR_AY(); SRE(); MW_EA(); ADD_CYCLE(7); break; case 0x43: // SRE ($??,X) MR_IX(); SRE(); MW_EA(); ADD_CYCLE(8); break; case 0x53: // SRE ($??),Y MR_IY(); SRE(); MW_EA(); ADD_CYCLE(8); break; case 0xEB: // SBC #$?? (Unofficial) MR_IM(); SBC(); ADD_CYCLE(2); break; case 0x1A: // NOP (Unofficial) case 0x3A: // NOP (Unofficial) case 0x5A: // NOP (Unofficial) case 0x7A: // NOP (Unofficial) case 0xDA: // NOP (Unofficial) case 0xFA: // NOP (Unofficial) ADD_CYCLE(2); break; case 0x80: // DOP (CYCLES 2) case 0x82: // DOP (CYCLES 2) case 0x89: // DOP (CYCLES 2) case 0xC2: // DOP (CYCLES 2) case 0xE2: // DOP (CYCLES 2) R.PC++; ADD_CYCLE(2); break; case 0x04: // DOP (CYCLES 3) case 0x44: // DOP (CYCLES 3) case 0x64: // DOP (CYCLES 3) R.PC++; ADD_CYCLE(3); break; case 0x14: // DOP (CYCLES 4) case 0x34: // DOP (CYCLES 4) case 0x54: // DOP (CYCLES 4) case 0x74: // DOP (CYCLES 4) case 0xD4: // DOP (CYCLES 4) case 0xF4: // DOP (CYCLES 4) R.PC++; ADD_CYCLE(4); break; case 0x0C: // TOP case 0x1C: // TOP case 0x3C: // TOP case 0x5C: // TOP case 0x7C: // TOP case 0xDC: // TOP case 0xFC: // TOP R.PC+=2; ADD_CYCLE(4); break; case 0x02: /* JAM */ case 0x12: /* JAM */ case 0x22: /* JAM */ case 0x32: /* JAM */ case 0x42: /* JAM */ case 0x52: /* JAM */ case 0x62: /* JAM */ case 0x72: /* JAM */ case 0x92: /* JAM */ case 0xB2: /* JAM */ case 0xD2: /* JAM */ case 0xF2: /* JAM */ default: if( !Config.emulator.bIllegalOp ) { throw CApp::GetErrorString( IDS_ERROR_ILLEGALOPCODE ); goto _execute_exit; } else { R.PC--; ADD_CYCLE(4); } break; // default: // __assume(0); } end_is: __asm nop; if( nmi_request ) { _NMI(); } else if( irq_request ) { _IRQ(); } request_cycles -= exec_cycles; TOTAL_cycles += exec_cycles; // 僋儘僢僋摨婜張棟 mapper->Clock( exec_cycles ); #if DPCM_SYNCCLOCK apu->SyncDPCM( exec_cycles ); #endif if( bClockProcess ) { nes->Clock( exec_cycles ); } // nes->Clock( exec_cycles ); } _execute_exit: #if !DPCM_SYNCCLOCK apu->SyncDPCM( TOTAL_cycles - OLD_cycles ); #endif return TOTAL_cycles - OLD_cycles; }
void decodeInstruction(instruction_t instruction, uint32_t *dir_reg, char *dir_flags, uint8_t *SRAM, uint16_t *dec) { uint8_t *R_activos=instruction.registers_list; /* Comparacion de mnemonic y Llamado de las funciones */ if( strcmp(instruction.mnemonic,"ADC") == 0 || strcmp(instruction.mnemonic,"ADCS") == 0){ dir_reg[PC]++; *dec=16704; *dec=*dec|instruction.op3_value<<3|instruction.op1_value; dir_reg[instruction.op1_value]=ADC(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); } if( strcmp(instruction.mnemonic,"ADDS") == 0 || strcmp(instruction.mnemonic,"ADD") == 0){ dir_reg[PC]++; if(instruction.op2_type=='S'){ *dec=45056; dir_reg[SP]=ADD(dir_reg[SP],instruction.op3_value,dir_flags); *dec=*dec|instruction.op3_value;} else if(instruction.op3_type=='#'){ *dec=7168; *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; dir_reg[instruction.op1_value]=ADD(dir_reg[instruction.op2_value], instruction.op3_value,dir_flags); mvprintw(4,20,"%X",*dec);} else{ *dec=6144; *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; dir_reg[instruction.op1_value]=ADD(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags);} } if( strcmp(instruction.mnemonic,"AND") == 0 || strcmp(instruction.mnemonic,"ANDS") == 0){ dir_reg[PC]++; *dec=16384; if(instruction.op3_type=='#'){ dir_reg[instruction.op1_value]=AND(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags);} else dir_reg[instruction.op1_value]=AND(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); } if( strcmp(instruction.mnemonic,"ASR") == 0 || strcmp(instruction.mnemonic,"ASRS") == 0){ dir_reg[PC]++; if(instruction.op3_type=='#'){ *dec=4096; *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; dir_reg[instruction.op1_value]=ASR(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags);} else{ *dec=16640; *dec=*dec|instruction.op3_value<<3|instruction.op1_value; dir_reg[instruction.op1_value]=ASR(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags);} } if( strcmp(instruction.mnemonic,"BICS") == 0 || strcmp(instruction.mnemonic,"BICS") == 0){ dir_reg[PC]++; if(instruction.op3_type=='#') dir_reg[instruction.op1_value]=BIC(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags); else{ *dec=17280; dir_reg[instruction.op1_value]=BIC(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"CMN" ) == 0 || strcmp(instruction.mnemonic,"CMNS") == 0){ dir_reg[PC]++; CMN(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value],dir_flags); *dec=17088; *dec=*dec|instruction.op2_value<<3|instruction.op1_value; mvprintw(4,20,"%X",*dec); } if( strcmp(instruction.mnemonic,"CMP") == 0 || strcmp(instruction.mnemonic,"CMPS") == 0){ dir_reg[PC]++; CMP(dir_reg[instruction.op1_value],dir_reg[instruction.op2_value],dir_flags); *dec=17024; *dec=*dec|instruction.op2_value<<3|instruction.op1_value; mvprintw(4,20,"%X",*dec); } if( strcmp(instruction.mnemonic,"EOR") == 0 || strcmp(instruction.mnemonic,"EORS") == 0){ dir_reg[PC]++; *dec=16448; if(instruction.op3_type=='#') dir_reg[instruction.op1_value]=EOR(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags); else dir_reg[instruction.op1_value]=EOR(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); } if( strcmp(instruction.mnemonic,"LSLS") == 0 || strcmp(instruction.mnemonic,"LSL") == 0){ dir_reg[PC]++; if(instruction.op3_type=='#'){ *dec=0; dir_reg[instruction.op1_value]=LSL(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=16512; dir_reg[instruction.op1_value]=LSL(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"LSRS") == 0 || strcmp(instruction.mnemonic,"LSR") == 0){ dir_reg[PC]++; if(instruction.op3_type=='#'){ *dec=2048; dir_reg[instruction.op1_value]=LSR(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=16576; dir_reg[instruction.op1_value]=LSR(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"MOV") == 0 || strcmp(instruction.mnemonic,"MOVS") == 0){ dir_reg[PC]++; if(instruction.op2_type=='#'){ *dec=8192; dir_reg[instruction.op1_value]=MOV(instruction.op2_value,dir_flags); *dec=*dec|instruction.op1_value<<8|instruction.op2_value;} else{ *dec=0; dir_reg[instruction.op1_value]=MOV(dir_reg[instruction.op2_value],dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"MUL") == 0 || strcmp(instruction.mnemonic,"MULS") == 0){ dir_reg[PC]++; *dec=17216; if(instruction.op3_type=='#'){ dir_reg[instruction.op1_value]=MUL(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags);} else{ dir_reg[instruction.op1_value]=MUL(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"MVN") == 0 || strcmp(instruction.mnemonic,"MVNS") == 0){ dir_reg[PC]++; *dec=17344; dir_reg[instruction.op1_value]=MVN(dir_reg[instruction.op2_value], dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"ORR") == 0 || strcmp(instruction.mnemonic,"ORRS") == 0){ dir_reg[PC]++; *dec=17152; if(instruction.op3_type=='#'){ dir_reg[instruction.op1_value]=ORR(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags);} else{ dir_reg[instruction.op1_value]=ORR(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"REV") == 0 || strcmp(instruction.mnemonic,"REVS") == 0){ dir_reg[PC]++; *dec=47616; dir_reg[instruction.op1_value]=REV(dir_reg[instruction.op2_value]); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"REVG") == 0 || strcmp(instruction.mnemonic,"REVGS") == 0){ dir_reg[PC]++; *dec=47680; dir_reg[instruction.op1_value]=REVG(dir_reg[instruction.op2_value]); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"REVSH") == 0 || strcmp(instruction.mnemonic,"REVSHS") == 0){ dir_reg[PC]++; *dec=47808; dir_reg[instruction.op1_value]=REVSH(dir_reg[instruction.op2_value]); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"ROR") == 0 || strcmp(instruction.mnemonic,"RORS") == 0){ dir_reg[PC]++; *dec=16832; if(instruction.op3_type=='#'){ dir_reg[instruction.op1_value]=ROR(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags);} else{ dir_reg[instruction.op1_value]=ROR(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"RSB") == 0 || strcmp(instruction.mnemonic,"RSBS") == 0){ dir_reg[PC]++; *dec=16690; dir_reg[instruction.op1_value]=RSB(dir_reg[instruction.op2_value], dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"SBC") == 0 || strcmp(instruction.mnemonic,"SBCS") == 0){ dir_reg[PC]++; *dec=16768; SBC(dir_reg[instruction.op1_value],dir_reg[instruction.op2_value], dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"SUBS") == 0 || strcmp(instruction.mnemonic,"SUB") == 0){ dir_reg[PC]++; if(instruction.op2_type=='S'){ *dec=45184; dir_reg[SP]=SUB(dir_reg[SP],instruction.op3_value,dir_flags); *dec=*dec|instruction.op3_value;} else if(instruction.op3_type=='#'){ *dec=7680; dir_reg[instruction.op1_value]=SUB(dir_reg[instruction.op2_value],instruction.op3_value,dir_flags); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=6656; dir_reg[instruction.op1_value]=SUB(dir_reg[instruction.op2_value],dir_reg[instruction.op3_value],dir_flags); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if( strcmp(instruction.mnemonic,"TST") == 0 || strcmp(instruction.mnemonic,"TSTS") == 0){ dir_reg[PC]++; *dec=16896; TST(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], dir_flags); *dec=*dec|instruction.op2_value<<3|instruction.op1_value; } if( strcmp(instruction.mnemonic,"NOP") == 0 ){ NOP(dir_reg); *dec=48896; } if( strcmp(instruction.mnemonic,"B") == 0 ){ *dec=57344; *dec=*dec|instruction.op1_value; B(instruction.op1_value, dir_reg); } if( strcmp(instruction.mnemonic,"BL") == 0 ){ *dec=0; BL(instruction.op1_value, dir_reg); } if( strcmp(instruction.mnemonic,"BX") == 0 ){ *dec=18176; BX(dir_reg); } if( strcmp(instruction.mnemonic,"BEQ") == 0 ){ *dec=0; BEQ(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BNE") == 0 ){ *dec=0; BNE(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BCS") == 0 ){ *dec=0; BCS(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BCC") == 0 ){ *dec=0; BCC(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BMI") == 0 ){ *dec=0; BMI(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BPL") == 0 ){ *dec=0; BPL(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BVS") == 0 ){ *dec=0; BVS(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BVC") == 0 ){ *dec=0; BVC(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BHI") == 0 ){ *dec=0; BHI(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BLS") == 0 ){ *dec=0; BLS(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BGE") == 0 ){ *dec=0; BGE(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BLT") == 0 ){ *dec=0; BLT(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BGT") == 0 ){ *dec=0; BGT(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BLE") == 0 ){ *dec=0; BLE(instruction.op1_value, dir_reg, dir_flags); } if( strcmp(instruction.mnemonic,"BAL") == 0 ){ *dec=0; BAL(instruction.op1_value, dir_reg); } if(strcmp(instruction.mnemonic,"PUSH")==0){ dir_reg[PC]++; *dec=46080; PUSH(SRAM, dir_reg,R_activos); } if(strcmp(instruction.mnemonic,"POP")==0){ dir_reg[PC]++; *dec=48128; POP(SRAM,dir_reg,R_activos); } data=(uint8_t)dir_reg[instruction.op1_value]; if(strcmp(instruction.mnemonic,"LDR")==0){ dir_reg[PC]++; if(instruction.op2_type=='=' && instruction.op3_type=='N'){ *dec=0; dir_reg[instruction.op1_value]=instruction.op2_value;} else if(instruction.op2_type=='S'){ *dec=38912; dir_reg[instruction.op1_value]=LDR(dir_reg[SP], instruction.op3_value<<2, SRAM); *dec=*dec|instruction.op3_value|instruction.op1_value<<8;} else if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=26624; if((dir_reg[instruction.op2_value]+(instruction.op3_value<<2))>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(instruction.op3_value<<2)), &data,Read); else dir_reg[instruction.op1_value]=LDR(dir_reg[instruction.op2_value], instruction.op3_value<<2, SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value|instruction.op1_value;} else{ *dec=22528; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value]), &data,Read); else dir_reg[instruction.op1_value]=LDR(dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if(strcmp(instruction.mnemonic,"LDRB")==0){ dir_reg[PC]++; if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=30720; if((dir_reg[instruction.op2_value]+instruction.op3_value)>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+instruction.op3_value), &data,Read); else dir_reg[instruction.op1_value]=LDRB(dir_reg[instruction.op2_value], instruction.op3_value, SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=23552; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value]), &data,Read); else dir_reg[instruction.op1_value]=LDRB(dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if(strcmp(instruction.mnemonic,"LDRH")==0){ dir_reg[PC]++; if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=34816; if((dir_reg[instruction.op2_value]+(instruction.op3_value<<1))>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(instruction.op3_value<<1)), &data,Read); else dir_reg[instruction.op1_value]=LDRH(dir_reg[instruction.op2_value], instruction.op3_value<<1, SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=23040; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value]), &data,Read); else dir_reg[instruction.op1_value]=LDRH(dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if(strcmp(instruction.mnemonic,"LDRSB")==0){ dir_reg[PC]++; *dec=22016; *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value]), &data,Read); else dir_reg[instruction.op1_value]=LDRSB(dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); } if(strcmp(instruction.mnemonic,"LDRSH")==0){ dir_reg[PC]++; *dec=24064; *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value]), &data,Read); else dir_reg[instruction.op1_value]=LDRSH(dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); } if(strcmp(instruction.mnemonic,"STR")==0){ dir_reg[PC]++; if(instruction.op2_type=='S'){ *dec=38912; STR(dir_reg[instruction.op1_value],dir_reg[SP], instruction.op3_value<<2, SRAM); *dec=*dec|instruction.op3_value|instruction.op1_value<<8;} else if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=24576; if((dir_reg[instruction.op2_value]+(instruction.op3_value<<2))>=0x40000000){ IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(instruction.op3_value<<2)), &data,Write);} else{ STR(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], instruction.op3_value<<2, SRAM);} *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value; mvprintw(1,3,"Hola");} else{ *dec=20480; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op2_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(dir_reg[instruction.op3_value])), &data,Write); else{ STR(dir_reg[instruction.op1_value], instruction.op2_value, instruction.op3_value, SRAM);} *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if(strcmp(instruction.mnemonic,"STRB")==0){ dir_reg[PC]++; if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=28672; if(dir_reg[instruction.op2_value]+instruction.op3_value>=0x40000000){ IOAccess((uint8_t)(dir_reg[instruction.op2_value]+instruction.op3_value), &data,Write);} else{ STRB(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], instruction.op3_value, SRAM);} *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=21504; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000){ IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(dir_reg[instruction.op3_value])), &data,Write);} else{ STRB(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM);} *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } if(strcmp(instruction.mnemonic,"STRH")==0){ dir_reg[PC]++; if(instruction.op3_type=='#' || instruction.op3_type=='N'){ *dec=32768; if(((dir_reg[instruction.op2_value])+(instruction.op3_value<<1))>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(instruction.op3_value<<1)),&data,Write); else STRH(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], instruction.op3_value<<1, SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} else{ *dec=20992; if((dir_reg[instruction.op2_value]+dir_reg[instruction.op3_value])>=0x40000000) IOAccess((uint8_t)(dir_reg[instruction.op2_value]+(dir_reg[instruction.op3_value])), &data,Write); else STRH(dir_reg[instruction.op1_value], dir_reg[instruction.op2_value], dir_reg[instruction.op3_value], SRAM); *dec=*dec|instruction.op3_value<<6|instruction.op2_value<<3|instruction.op1_value;} } }
void decodeInstruction(instruction_t instruction,unsigned long *r[],unsigned long *bandera,unsigned long *PC,unsigned long*LR,uint8_t*memoria,unsigned long *codificacion) { int auxban; unsigned long aux1,aux2,des; // codificacion funciones de la alu if(strcmp(instruction.mnemonic,"ADDS") == 0) { if(instruction.op1_type=='R') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=ADD(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type== '#' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=ADD(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type== 'R' )&&(instruction.op3_type =='#' )) { r[instruction.op1_value]=ADD(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type== '#' )&&(instruction.op3_type =='#' )) { r[instruction.op1_value]=ADD(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { ADD(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { ADD(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { ADD(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { ADD(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if(strcmp(instruction.mnemonic,"CMN") == 0) { if((instruction.op1_type== 'R' )&&(instruction.op2_type =='R' )) { ADD(r[instruction.op1_value],r[instruction.op2_value],&bandera); } if((instruction.op1_type == '#' )&&(instruction.op2_type== 'R' )) { ADD(instruction.op1_value,r[instruction.op2_value],&bandera); } if((instruction.op1_type == 'R' )&&(instruction.op2_type == '#' )) { ADD(r[instruction.op1_value],instruction.op2_value,&bandera); } if((instruction.op1_type == '#' )&&(instruction.op2_type == '#' )) { ADD(instruction.op1_value,instruction.op2_value,&bandera); } } if( strcmp(instruction.mnemonic,"ADCS") == 0) { if(instruction.op1_type=='R') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=ADC(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { r[instruction.op1_value]=ADC(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=ADC(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=ADC(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { ADC(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { ADC(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { ADC(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { ADC(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if( strcmp(instruction.mnemonic,"ANDS") == 0) { if(instruction.op1_type=='R') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=AND(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { r[instruction.op1_value]=AND(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=AND(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=AND(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { AND(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { AND(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { AND(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { AND(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if(strcmp(instruction.mnemonic,"TEST") == 0) { if((instruction.op1_type== 'R' )&&(instruction.op2_type =='R' )) { AND(r[instruction.op1_value],r[instruction.op2_value],&bandera); } if((instruction.op1_type == '#' )&&(instruction.op2_type== 'R' )) { AND(instruction.op1_value,r[instruction.op2_value],&bandera); } if((instruction.op1_type == 'R' )&&(instruction.op2_type == '#' )) { AND(r[instruction.op1_value],instruction.op2_value,&bandera); } if((instruction.op1_type == '#' )&&(instruction.op2_type == '#' )) { AND(instruction.op1_value,instruction.op2_value,&bandera); } } if( strcmp(instruction.mnemonic,"EORS") == 0) { if(instruction.op1_type=='R') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=EOR(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { r[instruction.op1_value]=EOR(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=EOR(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=EOR(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { EOR(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { EOR(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { EOR(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { EOR(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if( (strcmp(instruction.mnemonic,"MOVS") == 0)||(strcmp(instruction.mnemonic,"MOV") == 0)) { if((instruction.op1_type == 'R')&&(instruction.op2_type=='R') ) { r[instruction.op1_value]=MOV(r[instruction.op1_value],r[instruction.op2_value],&bandera); mostrar(r[instruction.op1_value]); } if((instruction.op1_type == 'R')&&(instruction.op2_type=='#') ) { r[instruction.op1_value]=MOV(instruction.op1_value,instruction.op2_value,&bandera); mostrar(r[instruction.op1_value]); } } if( strcmp(instruction.mnemonic,"ORRS") == 0) { if(instruction.op1_type=='R') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=ORR(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { r[instruction.op1_value]=ORR(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=ORR(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=ORR(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { ORR(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { ORR(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { ORR(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { ORR(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if( strcmp(instruction.mnemonic,"SUBS") == 0) { if(instruction.op1_type== 'R' ) { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { r[instruction.op1_value]=SUB(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { r[instruction.op1_value]=SUB(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=SUB(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { r[instruction.op1_value]=SUB(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } if(instruction.op1_type=='N') { if((instruction.op2_type== 'R' )&&(instruction.op3_type =='R' )) { SUB(r[instruction.op2_value],r[instruction.op3_value],&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type== 'R' )) { SUB(instruction.op2_value,r[instruction.op3_value],&bandera); } if((instruction.op2_type == 'R' )&&(instruction.op3_type == '#' )) { SUB(r[instruction.op2_value],instruction.op3_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { SUB(instruction.op2_value,instruction.op3_value,&bandera); } mostrar(r[instruction.op1_value]); } } if(strcmp(instruction.mnemonic,"CMP") == 0) { if((instruction.op1_type== 'R' )&&(instruction.op2_type =='R' )) { SUB(r[instruction.op1_value],r[instruction.op2_value],&bandera); } if((instruction.op1_type == '#' )&&(instruction.op2_type== 'R' )) { SUB(instruction.op1_value,r[instruction.op2_value],&bandera); } if((instruction.op1_type == 'R' )&&(instruction.op2_type == '#' )) { SUB(r[instruction.op1_value],instruction.op2_value,&bandera); } if((instruction.op2_type == '#' )&&(instruction.op3_type == '#' )) { SUB(instruction.op1_value,instruction.op2_value,&bandera); } } // decodificacion funciones branch if(strcmp(instruction.mnemonic,"B")==0) { if(instruction.op1_type=='#') { *codificacion=(28<<11)+(instruction.op1_value); B(&PC,instruction.op1_value); } } if(strcmp(instruction.mnemonic,"BEQ")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(instruction.op1_value); BEQ(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BNE")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(1<<8)+(instruction.op1_value); BNE(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BCS")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(2<<8)+(instruction.op1_value); BCS(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BCC")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(3<<8)+(instruction.op1_value); BCC(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BMI")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(4<<8)+(instruction.op1_value); BMI(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BPL")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(5<<8)+(instruction.op1_value); BPL(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BVS")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(6<<8)+(instruction.op1_value); BVS(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BVC")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(2<<7)+(instruction.op1_value); BVC(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BHI")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(8<<8)+(instruction.op1_value); BHI(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BLS")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(9<<8)+(instruction.op1_value); BLS(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BGE")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(10<<8)+(instruction.op1_value); BGE(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BLT")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(11<<8)+(instruction.op1_value); BLT(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BGT")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(12<<8)+(instruction.op1_value); BGT(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BLE")==0) { if(instruction.op1_type=='#') { *codificacion=(13<<11)+(13<<8)+(instruction.op1_value); BLE(&PC,instruction.op1_value,&bandera); } } if(strcmp(instruction.mnemonic,"BL")==0) { if(instruction.op1_type=='#') { *codificacion=(31<<11)+(2047&instruction.op1_value+(((1<<31)&instruction.op1_value)>>20)); BL(&PC,instruction.op1_value,&LR); } }