|
|
| version 1.1, 2006/01/19 17:16:29 | version 1.2, 2006/02/15 13:00:30 |
|---|---|
| Line 1 | Line 1 |
| /********************************************************************/ | |
| /* CalcularCiclos.c */ | |
| /* */ | |
| /* Copyright (c) 1997-2006 Rafael Rico (rafael.rico@uah.es) */ | |
| /* */ | |
| /* This file is part of ADD version 5.10. */ | |
| /* */ | |
| /* ADD is free software; you can redistribute it and/or modify */ | |
| /* it under the terms of the GNU General Public License as */ | |
| /* published by the Free Software Foundation; either version 2 of */ | |
| /* the License, or (at your option) any later version. */ | |
| /* */ | |
| /* ADD is distributed in the hope that it will be useful, */ | |
| /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ | |
| /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ | |
| /* GNU General Public License for more details. */ | |
| /* */ | |
| /* You should have received a copy of the GNU General Public */ | |
| /* License along with ADD; if not, write to the Free Software */ | |
| /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA */ | |
| /* 02111-1307 USA */ | |
| /* */ | |
| /* --------------------------- History --------------------------- */ | |
| /* */ | |
| /* Revision 1.2. 01/2006 */ | |
| /* Added GPL License and JavaDoc style documentation */ | |
| /* */ | |
| /* Revision 1.1. 09/2005 */ | |
| /* Initial Revision */ | |
| /* */ | |
| /********************************************************************/ | |
| /******************************************************************************/ | /******************************************************************************/ |
| /* MÓDULO: CalcularCiclos.c */ | /* MÓDULO: CalcularCiclos.c */ |
| /* */ | /* */ |
| Line 70 extern double cpimedio; | Line 38 extern double cpimedio; |
| char ComputarDireccion(char *cadena) | char ComputarDireccion(char *cadena) |
| { | { |
| int id; | int id; |
| char ciclos_tiempo; | char ciclos_tiempo; |
| int desplazamiento = NO; | int desplazamiento = NO; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| switch(cadena[0]) | switch(cadena[0]) |
| { | { |
| case '\0': /* sin operando; aquí se supone que no debería entrar */ | case '\0': /* sin operando; aquí se supone que no debería entrar */ |
| ciclos_tiempo = 0; | ciclos_tiempo = 0; |
| break; | break; |
| case '[': /* operando memoria */ | case '[': /* operando memoria */ |
| if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]"); /* es un desplazamiento absoluto */ | if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]"); /* es un desplazamiento absoluto */ |
| else /* ubicaciones de memoria basadas en registros */ | else /* ubicaciones de memoria basadas en registros */ |
| { | { |
| if(cadena[3]==']') /* registro base o índice solamente */ | if(cadena[3]==']') /* registro base o índice solamente */ |
| { | { |
| if(cadena[4]=='\0') desplazamiento = NO; | if(cadena[4]=='\0') desplazamiento = NO; |
| else desplazamiento = SI; | else desplazamiento = SI; |
| cadena[4]='\0'; /* termino la cadena sin del posible desplazamiento */ | cadena[4]='\0'; /* termino la cadena sin del posible desplazamiento */ |
| } | } |
| else | else |
| { | { |
| if(cadena[6]=='\0') desplazamiento = NO; | if(cadena[6]=='\0') desplazamiento = NO; |
| else desplazamiento = SI; | else desplazamiento = SI; |
| cadena[6]='\0'; /* termino la cadena sin del posible desplazamiento */ | cadena[6]='\0'; /* termino la cadena sin del posible desplazamiento */ |
| } | } |
| } | } |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, cadena); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, cadena); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", cadena); | sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", cadena); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| ciclos_tiempo = ciclos[id].ciclos; | ciclos_tiempo = ciclos[id].ciclos; |
| if(desplazamiento == SI) /* si hay desplzamiento añado su tiempo */ | if(desplazamiento == SI) /* si hay desplzamiento añado su tiempo */ |
| { | { |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "DESPLZ"); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "DESPLZ"); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", "DESPLZ"); | sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", "DESPLZ"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| ciclos_tiempo += ciclos[id].ciclos; | ciclos_tiempo += ciclos[id].ciclos; |
| } | } |
| strcpy(cadena, "MEM"); /* cambio la cadena por la de acceso a MEMORIA */ | strcpy(cadena, "MEM"); /* cambio la cadena por la de acceso a MEMORIA */ |
| break; | break; |
| default: /* registros, inmediatos, o direcciones físicas */ | default: /* registros, inmediatos, o direcciones físicas */ |
| if(isxdigit(cadena[1])) /* es un número hexadecimal */ | if(isxdigit(cadena[1])) /* es un número hexadecimal */ |
| Line 141 char ComputarDireccion(char *cadena) | Line 109 char ComputarDireccion(char *cadena) |
| break; | break; |
| } | } |
| } | } |
| else | else |
| { | { |
| if(cadena[1]=='L' || cadena[1]=='H') strcpy(cadena, "REG8"); | if(cadena[1]=='L' || cadena[1]=='H') strcpy(cadena, "REG8"); |
| else strcpy(cadena, "REG16"); | else strcpy(cadena, "REG16"); |
| } | } |
| ciclos_tiempo = 0; | ciclos_tiempo = 0; |
| break; | break; |
| } | } |
| return ciclos_tiempo; | return ciclos_tiempo; |
| } | } |
| Line 159 char ComputarDireccion(char *cadena) | Line 127 char ComputarDireccion(char *cadena) |
| void CalcularCiclosInstruccion(fichainstruccion *tarjetaoperandos) | void CalcularCiclosInstruccion(fichainstruccion *tarjetaoperandos) |
| { | { |
| int id; | int id; |
| char op1[MAX_OPE], op2[MAX_OPE]; | char op1[MAX_OPE], op2[MAX_OPE]; |
| char pesa_inm = SI; /* indico si un inmediato pesa en ciclos o no */ | char pesa_inm = SI; /* indico si un inmediato pesa en ciclos o no */ |
| char ciclos_tiempo; | char ciclos_tiempo; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| /* TIEMPO DEBIDO A LA OPERACIÓN */ | /* TIEMPO DEBIDO A LA OPERACIÓN */ |
| /* busco en la tabla de ciclos */ | /* busco en la tabla de ciclos */ |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->nemonico); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->nemonico); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->nemonico); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->nemonico); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| tarjetaoperandos->ciclosALU = ciclos[id].ciclos; | tarjetaoperandos->ciclosALU = ciclos[id].ciclos; |
| /* ahora busco en la tabla de nemónicos */ | /* ahora busco en la tabla de nemónicos */ |
| id = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico); | id = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| /* TIEMPO DEBIDO AL CÓMPUTO DE DIRECCIONES */ | /* TIEMPO DEBIDO AL CÓMPUTO DE DIRECCIONES */ |
| strcpy(op2, tarjetaoperandos->op2); | strcpy(op2, tarjetaoperandos->op2); |
| ciclos_tiempo = ComputarDireccion(op2); | ciclos_tiempo = ComputarDireccion(op2); |
| strcpy(op1, tarjetaoperandos->op1); | strcpy(op1, tarjetaoperandos->op1); |
| ciclos_tiempo += ComputarDireccion(op1); | ciclos_tiempo += ComputarDireccion(op1); |
| /* he obtenido los operandos normalizados */ | /* he obtenido los operandos normalizados */ |
| /* TIEMPO DEBIDO AL TIPO DE OPERANDO Y TIPO DE ACCESO */ | /* TIEMPO DEBIDO AL TIPO DE OPERANDO Y TIPO DE ACCESO */ |
| /* tamaño de acceso a memoria y tipo de acceso */ | /* tamaño de acceso a memoria y tipo de acceso */ |
| if(!strcmp(op2, "MEM")) | if(!strcmp(op2, "MEM")) |
| { | { |
| if(strcmp(op1, "REG8") && strcmp(op1, "INM8")) strcat(op2, "16"); | if(strcmp(op1, "REG8") && strcmp(op1, "INM8")) strcat(op2, "16"); |
| else strcat(op2, "8"); | else strcat(op2, "8"); |
| /* tipo de acceso: lectura o escritura */ | /* tipo de acceso: lectura o escritura */ |
| switch(nemonicos[id].modo_op2) | switch(nemonicos[id].modo_op2) |
| { | { |
| case LEIDO: /* leido */ | case LEIDO: /* leido */ |
| strcat(op2, "L"); | strcat(op2, "L"); |
| break; | |
| case ESCRITO: /* escrito */ | |
| strcat(op2, "E"); | |
| break; | break; |
| case ESCRITO: /* escrito */ | |
| strcat(op2, "E"); | |
| break; | |
| case LEIDOYESCRITO: /* leido y escrito */ | case LEIDOYESCRITO: /* leido y escrito */ |
| strcat(op2, "LE"); | strcat(op2, "LE"); |
| break; | break; |
| } | } |
| } | } |
| if(!strcmp(op1, "MEM")) | if(!strcmp(op1, "MEM")) |
| { | { |
| if(strcmp(op2, "REG8") && strcmp(op2, "INM8")) strcat(op1, "16"); | if(strcmp(op2, "REG8") && strcmp(op2, "INM8")) strcat(op1, "16"); |
| else strcat(op1, "8"); | else strcat(op1, "8"); |
| /* tipo de acceso: lectura o escritura */ | /* tipo de acceso: lectura o escritura */ |
| switch(nemonicos[id].modo_op1) | switch(nemonicos[id].modo_op1) |
| { | { |
| case LEIDO: /* leido */ | case LEIDO: /* leido */ |
| strcat(op1, "L"); | strcat(op1, "L"); |
| break; | |
| case ESCRITO: /* escrito */ | |
| strcat(op1, "E"); | |
| break; | break; |
| case ESCRITO: /* escrito */ | |
| strcat(op1, "E"); | |
| break; | |
| case LEIDOYESCRITO: /* leido y escrito */ | case LEIDOYESCRITO: /* leido y escrito */ |
| strcat(op1, "LE"); | strcat(op1, "LE"); |
| break; | break; |
| } | } |
| } | } |
| /* indico si los inmediatos pesan o no en ciclos (los de los saltos, etc. no pesan) */ | /* indico si los inmediatos pesan o no en ciclos (los de los saltos, etc. no pesan) */ |
| if(nemonicos[id].tipo < SALTO_INCONDICIONAL) pesa_inm = SI; | if(nemonicos[id].tipo < SALTO_INCONDICIONAL) pesa_inm = SI; |
| else pesa_inm = NO; | else pesa_inm = NO; |
| /* busco en la tabla de ciclos los operandos normalizados */ | /* busco en la tabla de ciclos los operandos normalizados */ |
| if(op2[0]!='\0') /* fuente */ | if(op2[0]!='\0') /* fuente */ |
| { | { |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op2); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op2); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op2); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op2); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| ciclos_tiempo += ciclos[id].ciclos; | ciclos_tiempo += ciclos[id].ciclos; |
| } | } |
| if(op1[0]!='\0') /* destino */ | if(op1[0]!='\0') /* destino */ |
| { | { |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op1); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op1); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op1); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op1); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| /* los inmediatos que no pesan sólo pueden estar en el destino */ | /* los inmediatos que no pesan sólo pueden estar en el destino */ |
| if(pesa_inm == SI) ciclos_tiempo += ciclos[id].ciclos; | if(pesa_inm == SI) ciclos_tiempo += ciclos[id].ciclos; |
| } | } |
| /* TIEMPO DEBIDO A LOS PREFIJOS */ | /* TIEMPO DEBIDO A LOS PREFIJOS */ |
| if(strcmp(tarjetaoperandos->prefijo, "")) | if(strcmp(tarjetaoperandos->prefijo, "")) |
| { | { |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->prefijo); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->prefijo); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->prefijo); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->prefijo); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| ciclos_tiempo += ciclos[id].ciclos; | ciclos_tiempo += ciclos[id].ciclos; |
| } | } |
| tarjetaoperandos->ciclosBIU = ciclos_tiempo; | tarjetaoperandos->ciclosBIU = ciclos_tiempo; |
| /* TIEMPO ASOCIADO A LOS SALTOS CONDICIONALES */ | /* TIEMPO ASOCIADO A LOS SALTOS CONDICIONALES */ |
| if(tarjetaoperandos->salto == 2) /* salto condicional TOMADO */ | if(tarjetaoperandos->salto == 2) /* salto condicional TOMADO */ |
| { | { |
| id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "TOMADO"); | id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "TOMADO"); |
| if(id == -1) | if(id == -1) |
| { | { |
| /* emito un error al fichero de log */ | /* emito un error al fichero de log */ |
| sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", "TOMADO"); | sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", "TOMADO"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| tarjetaoperandos->ciclosALU += ciclos[id].ciclos; | tarjetaoperandos->ciclosALU += ciclos[id].ciclos; |
| } | } |
| } | } |
| Line 320 void CalcularCiclosInstruccion(fichainst | Line 288 void CalcularCiclosInstruccion(fichainst |
| void ActualizarCPImedio(unsigned short int ciclosALU, unsigned short int ciclosBIU) | void ActualizarCPImedio(unsigned short int ciclosALU, unsigned short int ciclosBIU) |
| { | { |
| unsigned int ciclos; | unsigned int ciclos; |
| ciclos = ciclosALU + ciclosBIU; | ciclos = ciclosALU + ciclosBIU; |
| cpimedio = CalcularNuevoPromedio (cpimedio, (double)ciclos, instruccion); | cpimedio = CalcularNuevoPromedio (cpimedio, (double)ciclos, instruccion); |
| } | } |