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); |
} |
} |
|
|
|
|