Annotation of ADD_ver_10/Source Code/Source Files/AnalizadorOperandos16bits.c, revision 1.1

1.1     ! rico        1: /********************************************************************/
        !             2: /*  AnalizadorOperandos16bits.c                                     */
        !             3: /*                                                                  */
        !             4: /*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */
        !             5: /*                                                                  */
        !             6: /*  This file is part of ADD version 5.10.                          */
        !             7: /*                                                                  */
        !             8: /*  ADD is free software; you can redistribute it and/or modify     */
        !             9: /*  it under the terms of the GNU General Public License as         */
        !            10: /*  published by the Free Software Foundation; either version 2 of  */
        !            11: /*  the License, or (at your option) any later version.             */
        !            12: /*                                                                  */
        !            13: /*  ADD is distributed in the hope that it will be useful,          */
        !            14: /*  but WITHOUT ANY WARRANTY; without even the implied warranty of  */
        !            15: /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   */
        !            16: /*  GNU General Public License for more details.                    */
        !            17: /*                                                                  */
        !            18: /*  You should have received a copy of the GNU General Public       */
        !            19: /*  License along with ADD; if not, write to the Free Software      */
        !            20: /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA        */
        !            21: /*  02111-1307  USA                                                 */
        !            22: /*                                                                  */
        !            23: /*  --------------------------- History --------------------------- */
        !            24: /*                                                                  */
        !            25: /*  Revision 1.2. 01/2006                                           */
        !            26: /*  Added GPL License and JavaDoc style documentation               */
        !            27: /*                                                                  */
        !            28: /*  Revision 1.1. 09/2005                                           */
        !            29: /*  Initial Revision                                                */
        !            30: /*                                                                  */
        !            31: /********************************************************************/
        !            32: 
        !            33: /******************************************************************************/
        !            34: /* MÓDULO: AnalizadorOperandos16bits.c                                        */
        !            35: /*                                                                            */
        !            36: /* Este módulo analiza el uso de los operandos y construye una ficha de la    */
        !            37: /* instrucción clasificando los operandos por su uso.                         */
        !            38: /* También calcula el número total de ciclos.                                 */
        !            39: /******************************************************************************/
        !            40: /* Fecha: 13 de junio de 2005                                                 */
        !            41: /******************************************************************************/
        !            42: 
        !            43: #include <stdio.h>
        !            44: #include <stdlib.h>
        !            45: #include <string.h>
        !            46: #include <ctype.h>
        !            47: 
        !            48: #include "defines.h"
        !            49: #include "tipos.h"
        !            50: #include "analizadoroperandos16bits.h"
        !            51: 
        !            52: /* bases de datos */
        !            53: extern unsigned int num_nemonicos;
        !            54: extern operacion *nemonicos;
        !            55: extern unsigned int num_simbolos;
        !            56: extern operando *simbolos;
        !            57: 
        !            58: 
        !            59: 
        !            60: /* esta función convierte una cadena de operandos a una cadena normalizada */
        !            61: /* de posibles ubicaciones (sin desplazamientos ni valores inmediatos) */
        !            62: 
        !            63: void NormalizarUbicacion(char *cadena)
        !            64: {
        !            65:     switch(cadena[0])
        !            66:     {
        !            67:         case '\0':    /* sin operando; aquí se supone que no debería entrar */
        !            68:         break;
        !            69: 
        !            70:         case '[':    /* operando memoria */
        !            71:         if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]");    /* es un desplazamiento absoluto */
        !            72:         else
        !            73:         {
        !            74:             if(cadena[3]==']') cadena[4]='\0';    /* termino la cadena justo después aunque */
        !            75:             else cadena[6]='\0';                /* pueda haber desplazamiento adicional */
        !            76:         }
        !            77:         break;
        !            78: 
        !            79:         default:    /* registros o valores (inmediatos o direcciones físicas) */
        !            80:         if(isxdigit(cadena[1]))    /* es un número hexadecimal */
        !            81:         {
        !            82:             switch(strlen(cadena))
        !            83:             {
        !            84:                 case 2:    /* inmediato de 1 byte */
        !            85:                 strcpy(cadena, "INM8");
        !            86:                 break;
        !            87: 
        !            88:                 case 4:    /* inmediato de 2 bytes */
        !            89:                 strcpy(cadena, "INM16");
        !            90:                 break;
        !            91: 
        !            92:                 case 9:    /* dirección física */
        !            93:                 strcpy(cadena, "B:D");
        !            94:                 break;
        !            95:             }
        !            96:         }
        !            97:         break;
        !            98:     }
        !            99: }
        !           100: 
        !           101: 
        !           102: /* esta función clasifica un operando explícito según su funcionalidad */
        !           103: /* las funciones de los operandos se dan en la base de datos de símbolos */
        !           104: /* se consideran independientes de la operación (lo cual no es cierto siempre) */
        !           105: 
        !           106: void ClasificarOperandoExplicito(char *operando, char modo, fichainstruccion *tarjetaoperandos)
        !           107: {
        !           108:     int id_simb;
        !           109:     char cadena[MAX_LINE];
        !           110:     char mensaje[MAX_LINE];
        !           111: 
        !           112:     strcpy(cadena, operando);
        !           113: 
        !           114:     if(cadena[0]!= '\0')
        !           115:     {
        !           116:         NormalizarUbicacion(cadena);
        !           117:         id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
        !           118: 
        !           119:         if(id_simb == -1)
        !           120:         {
        !           121:             /* emito un error al fichero de log */ 
        !           122:             sprintf(mensaje, "[ClasificarOperandoExplicito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
        !           123:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           124:         }
        !           125: 
        !           126:         /* relleno la tarjeta de operandos explícitos para el operando (cadena) */
        !           127:         /* según la funcionalidad dada por el campo tipo */
        !           128: 
        !           129:         switch(simbolos[id_simb].tipo)
        !           130:         {
        !           131:             case DATOS:
        !           132:             switch(modo)
        !           133:             {
        !           134:                 case LEIDOYESCRITO:    /* leido y escrito */
        !           135:                 AgregarElementoLista(tarjetaoperandos->leidoexpldatos, simbolos[id_simb].simbolo);
        !           136:                 AgregarElementoLista(tarjetaoperandos->leidoexpldatos, simbolos[id_simb].dependencias);
        !           137:                 case ESCRITO:    /* escrito */
        !           138:                 AgregarElementoLista(tarjetaoperandos->escritoexpldatos, simbolos[id_simb].simbolo);
        !           139:                 AgregarElementoLista(tarjetaoperandos->escritoexpldatos, simbolos[id_simb].dependencias);
        !           140:                 break;
        !           141: 
        !           142:                 case LEIDO:    /* leido */
        !           143:                 AgregarElementoLista(tarjetaoperandos->leidoexpldatos, simbolos[id_simb].simbolo);
        !           144:                 AgregarElementoLista(tarjetaoperandos->leidoexpldatos, simbolos[id_simb].dependencias);
        !           145:                 break;
        !           146: 
        !           147:                 case NO_EXISTE:    /* no existe: emitir un error al fichero de log */
        !           148:                 sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe");
        !           149:                 Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           150:                 break;
        !           151:             }
        !           152:             break;
        !           153: 
        !           154:             case PTR_MEM:
        !           155:             switch(modo)
        !           156:             {
        !           157:                 case LEIDOYESCRITO:    /* leido y escrito */
        !           158:                 AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].simbolo);
        !           159:                 case ESCRITO:    /* escrito */
        !           160:                 AgregarElementoLista(tarjetaoperandos->escritoexpldir, simbolos[id_simb].simbolo);
        !           161:                 break;
        !           162: 
        !           163:                 case LEIDO:    /* leido */
        !           164:                 AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].simbolo);
        !           165:                 break;
        !           166: 
        !           167:                 case NO_EXISTE:    /* no existe: emitir un error al fichero de log */
        !           168:                 sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe");
        !           169:                 Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           170:                 break;
        !           171:             }
        !           172:             break;
        !           173: 
        !           174:             case PTR_PILA:
        !           175:             switch(modo)
        !           176:             {
        !           177:                 case LEIDOYESCRITO:    /* leido y escrito */
        !           178:                 AgregarElementoLista(tarjetaoperandos->leidoexplpila, simbolos[id_simb].simbolo);
        !           179:                 case ESCRITO:    /* escrito */
        !           180:                 AgregarElementoLista(tarjetaoperandos->escritoexplpila, simbolos[id_simb].simbolo);
        !           181:                 break;
        !           182: 
        !           183:                 case LEIDO:    /* leido */
        !           184:                 AgregarElementoLista(tarjetaoperandos->leidoexplpila, simbolos[id_simb].simbolo);
        !           185:                 break;
        !           186: 
        !           187:                 case NO_EXISTE:    /* no existe: emitir un error al fichero de log */
        !           188:                 sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe");
        !           189:                 Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           190:                 break;
        !           191:             }
        !           192:             break;
        !           193: 
        !           194:             case BANDERAS:
        !           195:             /* nunca se dan explícitamente pero pueden ser considerados explícitos a través del nemónico */
        !           196:             /* así se hará en la clasificación de implícitos */
        !           197:             break;
        !           198: 
        !           199:             /* los 2 siguientes no representan realmente funciones */
        !           200: 
        !           201:             case ACCESOS_MEM:    /* accesos a memoria */
        !           202:             /* CÓMPUTO DE DIRECCIONES */
        !           203:             /* BASE: registro de segmento */
        !           204:             /* si hay prefijo de registro de segmento (longitud 2), ese es el leído */
        !           205:             if(strlen(tarjetaoperandos->prefijo)==2)
        !           206:             {
        !           207:                 if(strcmp(tarjetaoperandos->prefijo, "SS") == 0) AgregarElementoLista(tarjetaoperandos->leidoexplpila, tarjetaoperandos->prefijo);
        !           208:                 else AgregarElementoLista(tarjetaoperandos->leidoexpldir, tarjetaoperandos->prefijo);
        !           209:             }
        !           210:             /* si no lo hay, agrego el indicado por defecto */
        !           211:             else
        !           212:             {
        !           213:                 switch (simbolos[id_simb].segmento)
        !           214:                 {
        !           215:                     case CS:
        !           216:                     AgregarElementoLista(tarjetaoperandos->leidoimpldir, "CS");
        !           217:                     break;
        !           218: 
        !           219:                     case SS:
        !           220:                     AgregarElementoLista(tarjetaoperandos->leidoimplpila, "SS");
        !           221:                     break;
        !           222: 
        !           223:                     case DS:
        !           224:                     AgregarElementoLista(tarjetaoperandos->leidoimpldir, "DS");
        !           225:                     break;
        !           226: 
        !           227:                     case ES:
        !           228:                     AgregarElementoLista(tarjetaoperandos->leidoimpldir, "ES");
        !           229:                     break;
        !           230:                 }
        !           231:             }
        !           232: 
        !           233:             /* OFFSET: los registros involucrados en el cómputo de direcciones */
        !           234:             /* siempre son leídos; la función depende de la BASE */
        !           235:             if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 ||
        !           236:                 simbolos[id_simb].segmento == SS)
        !           237:                 AgregarElementoLista(tarjetaoperandos->leidoexplpila, simbolos[id_simb].dependencias);
        !           238:             else AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias);
        !           239: 
        !           240:             /* DATO */
        !           241:             if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 || simbolos[id_simb].segmento == SS)
        !           242:             {
        !           243:                 switch(modo)
        !           244:                 {
        !           245:                     case LEIDOYESCRITO:    /* leido y escrito */
        !           246:                     AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA");
        !           247:                     case ESCRITO:    /* escrito */
        !           248:                     AgregarElementoLista(tarjetaoperandos->escritoexplpila, "PILA");
        !           249:                     break;
        !           250: 
        !           251:                     case LEIDO:    /* leido */
        !           252:                     AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA");
        !           253:                     break;
        !           254: 
        !           255:                     case NO_EXISTE:    /* no existe: emitir un error al fichero de log */
        !           256:                     sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe");
        !           257:                     Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           258:                     break;
        !           259:                 }
        !           260:             }
        !           261:             else
        !           262:             {
        !           263:                 switch(modo)
        !           264:                 {
        !           265:                     case LEIDOYESCRITO:    /* leido y escrito */
        !           266:                     AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM");
        !           267:                     case ESCRITO:    /* escrito */
        !           268:                     AgregarElementoLista(tarjetaoperandos->escritoexpldatos, "MEM");
        !           269:                     break;
        !           270: 
        !           271:                     case LEIDO:    /* leido */
        !           272:                     AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM");
        !           273:                     break;
        !           274: 
        !           275:                     case NO_EXISTE:    /* no existe: emitir un error al fichero de log */
        !           276:                     sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe");
        !           277:                     Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           278:                     break;
        !           279:                 }
        !           280:                 break;
        !           281:             }
        !           282:             break;
        !           283: 
        !           284:             case OTROS:
        !           285:             AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias);
        !           286:             break;
        !           287: 
        !           288:             default:
        !           289:             /* emitir un error al fichero de log */
        !           290:             sprintf(mensaje, "[ClasificarOperandoExplicito] El tipo de símbolo no existe");
        !           291:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           292:             break;
        !           293:         }
        !           294:     }
        !           295: }
        !           296: 
        !           297: 
        !           298: /* esta función clasifica un operando implícito leído según su funcionalidad */
        !           299: /* las funciones de los operandos se dan en la base de datos de símbolos */
        !           300: /* se consideran independientes de la operación (lo cual no es cierto siempre) */
        !           301: 
        !           302: void ClasificarOperandoImplicitoLeido(char *cadena, char tipo, fichainstruccion *tarjetaoperandos)
        !           303: {
        !           304:     int id_simb;
        !           305:     char mensaje[MAX_LINE];
        !           306: 
        !           307:     id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
        !           308: 
        !           309:     if(id_simb == -1)
        !           310:     {
        !           311:         /* emito un error al fichero de log */ 
        !           312:         sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
        !           313:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           314:     }
        !           315: 
        !           316:     switch(simbolos[id_simb].tipo)
        !           317:     {
        !           318:         case DATOS:
        !           319:         AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].simbolo);
        !           320:         AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].dependencias);
        !           321:         break;
        !           322: 
        !           323:         case PTR_MEM:
        !           324:         AgregarElementoLista(tarjetaoperandos->leidoimpldir, simbolos[id_simb].simbolo);
        !           325:         break;
        !           326: 
        !           327:         case PTR_PILA:
        !           328:         AgregarElementoLista(tarjetaoperandos->leidoimplpila, simbolos[id_simb].simbolo);
        !           329:         break;
        !           330: 
        !           331:         case BANDERAS:
        !           332:         if(tipo == SALTO_CONDICIONAL || tipo == CONTROL)
        !           333:             /* los saltos condicionales y las operaciones sobre banderas */
        !           334:             /* pueden ser considerados explícitos a través del nemónico */
        !           335:             AgregarElementoLista(tarjetaoperandos->leidoexplestado, simbolos[id_simb].simbolo);
        !           336:         else AgregarElementoLista(tarjetaoperandos->leidoimplestado, simbolos[id_simb].simbolo);
        !           337:         break;
        !           338: 
        !           339:         default:    /* emitir un error al fichero de log */
        !           340:         sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] El tipo de símbolo no existe");
        !           341:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           342:         break;
        !           343:     }
        !           344: }
        !           345: 
        !           346: 
        !           347: /* esta función clasifica un operando implícito escrito según su funcionalidad */
        !           348: /* las funciones de los operandos se dan en la base de datos de símbolos */
        !           349: /* se consideran independientes de la operación (lo cual no es cierto siempre) */
        !           350: 
        !           351: void ClasificarOperandoImplicitoEscrito(char *cadena, char tipo, fichainstruccion *tarjetaoperandos)
        !           352: {
        !           353:     int id_simb;
        !           354:     char mensaje[MAX_LINE];
        !           355: 
        !           356:     id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);
        !           357:         
        !           358:     if(id_simb == -1)
        !           359:     {  
        !           360:         /* emito un error al fichero de log */ 
        !           361:         sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
        !           362:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           363:     }
        !           364: 
        !           365:     switch(simbolos[id_simb].tipo)
        !           366:     {
        !           367:         case DATOS:
        !           368:         AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].simbolo);
        !           369:         AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].dependencias);
        !           370:         break;
        !           371: 
        !           372:         case PTR_MEM:
        !           373:         AgregarElementoLista(tarjetaoperandos->escritoimpldir, simbolos[id_simb].simbolo);
        !           374:         break;
        !           375: 
        !           376:         case PTR_PILA:
        !           377:         AgregarElementoLista(tarjetaoperandos->escritoimplpila, simbolos[id_simb].simbolo);
        !           378:         break;
        !           379: 
        !           380:         case BANDERAS:
        !           381:         if(tipo == SALTO_CONDICIONAL || tipo == CONTROL)
        !           382:             /* los saltos condicionales y las operaciones sobre banderas */
        !           383:             /* pueden ser considerados explícitos a través del nemónico */
        !           384:             AgregarElementoLista(tarjetaoperandos->escritoexplestado, simbolos[id_simb].simbolo);
        !           385:         else AgregarElementoLista(tarjetaoperandos->escritoimplestado, simbolos[id_simb].simbolo);
        !           386:         break;
        !           387: 
        !           388:         default:    /* emitir un error al fichero de log */
        !           389:         sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] El tipo de símbolo no existe");
        !           390:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           391:         break;
        !           392:     }
        !           393: }
        !           394: 
        !           395: 
        !           396: /* esta función desensambla una instrucción a partir de una secuencia de bytes */
        !           397: /* extrae información a partir del nemónico */
        !           398: /* clasifica el uso de los operandos explícitos según su función */
        !           399: /* clasifica el uso de los operandos implícitos según su función */
        !           400: 
        !           401: void AnalizarOperandosIA16(unsigned char secuencia[12], fichainstruccion *tarjetaoperandos)
        !           402: {
        !           403:     /* El argumento de la función es un array con 2 posibles */
        !           404:     /* formatos de instrucción: la que hay que desensamblar  */
        !           405:     /* y la siguiente para poder saber si se salta o no      */
        !           406:     /* ¡OJO! En realidad cada formato debería tener 7 bytes  */
        !           407:     /* para prevenir el uso de prefijos                      */
        !           408: 
        !           409:     unsigned char formato[6];
        !           410:     int i, j;
        !           411:     struct desensamblado instruccion;  /* reservo memoria para una estructura de tipo desensamblado */
        !           412:     int id_nemo;
        !           413:     char cadena[MAX_LINE];    /* esto es un array de caracteres; cadena[x] es un puntero */
        !           414:     char *elemento;           /* es un puntero a char; no es igual a cadena[x] para la función strtok */
        !           415:     char mensaje[MAX_LINE];
        !           416: 
        !           417:     /* inicio la tarjeta de operandos */
        !           418:     IniciarTarjeta(tarjetaoperandos);
        !           419: 
        !           420:     /* cargo la primera instrucción desde la secuencia */
        !           421: 
        !           422:     for(i=0; i<6; i++) formato[i] = secuencia[i];
        !           423: 
        !           424:     /* desensamblo la instrucción */
        !           425:     DecodificarInstruccion086(formato, &instruccion);
        !           426: 
        !           427:     /* analizo la estructura desensamblada */
        !           428:     /* PRIMERO: busco el nemónico en la BD */
        !           429: 
        !           430:     id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, instruccion.nemonico);
        !           431: 
        !           432:     if(id_nemo == -1)
        !           433:     {
        !           434:         /* emito un error al fichero de log */ 
        !           435:         sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico);
        !           436:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           437:     }
        !           438: 
        !           439:     /* salvo la información en la estructura de la ficha de instrucción */
        !           440:     strcpy(tarjetaoperandos->nemonico, instruccion.nemonico);
        !           441:     strcpy(tarjetaoperandos->op1, instruccion.op1);
        !           442:     strcpy(tarjetaoperandos->op2, instruccion.op2);
        !           443:     for (i=0; i<instruccion.longitud; i++)
        !           444:     {
        !           445:         cadena[0] = '\0';   /* inicio la cadena auxiliar */
        !           446:         sprintf (cadena, "%02X", (unsigned char) formato[i]);
        !           447:         /* si no le digo 'unsigned char' lo toma de 4 bytes */
        !           448:         strcat(tarjetaoperandos->hexadecimal, cadena);
        !           449:     }
        !           450:     tarjetaoperandos->longitud = instruccion.longitud;
        !           451: 
        !           452:     /* ya puedo reutilizar la estructura de desensamblado de instrucción */
        !           453:     /* porque la he salvado en la tarjeta de operandos */
        !           454: 
        !           455:     switch(nemonicos[id_nemo].tipo)
        !           456:     {
        !           457:         case SALTO_CONDICIONAL:     /* salto condicional */
        !           458:         /* hay que saber si el salto se ha tomado o no */
        !           459:         /* si la siguiente instrucción en la traza coincide con la */
        !           460:         /* que aparece de forma residual en la cadena formato */
        !           461:         /* a partir del último byte decodificado del salto entonces */
        !           462:         /* el salto no se ha tomado ya que lo residual es consecutivo */
        !           463: 
        !           464:         /* cargo la siguiente instrucción desde la secuencia */
        !           465: 
        !           466:         for(i=0; i<BYTES_POR_INSTRUCCION; i++) formato[i] = secuencia[i+BYTES_POR_INSTRUCCION];
        !           467: 
        !           468:         /* desensamblo la instrucción */
        !           469:         DecodificarInstruccion086(formato, &instruccion);
        !           470: 
        !           471:         /* compruebo si las codificaciones binarias son iguales */
        !           472:         for(i=tarjetaoperandos->longitud, j = 0; i<BYTES_POR_INSTRUCCION-tarjetaoperandos->longitud && j<instruccion.longitud; i++, j++)
        !           473:         {
        !           474:             if (secuencia[i] != secuencia[BYTES_POR_INSTRUCCION+j]) break;
        !           475:         }
        !           476:         /* si salgo del bucle sin break entonces son iguales y NO hay salto */
        !           477:         if(i==BYTES_POR_INSTRUCCION-tarjetaoperandos->longitud || j==instruccion.longitud) tarjetaoperandos->salto = NOTOMADO;
        !           478:         /* si salgo con break la siguiente instrucción en la traza no es la */
        !           479:         /* siguiente en la secuencia: el salto SI se toma */
        !           480:         else tarjetaoperandos->salto = TOMADO;
        !           481:         break;
        !           482: 
        !           483:         
        !           484:         case PREFIJO:     /* prefijo */
        !           485:         case PREFIJO_SEG:     /* prefijo registro de segmento */
        !           486:         tarjetaoperandos->salto = 1;    /* no es instrucción de salto */
        !           487: 
        !           488:         /* guardo el prefijo */
        !           489:         strcpy(tarjetaoperandos->prefijo, instruccion.nemonico);
        !           490: 
        !           491:         /* decodifico lo que queda de instrucción */
        !           492:         /* OJO, el 7º byte se ha tomado de la siguiente instrucción */
        !           493:         for(i=0; i<6; i++) formato[i] = secuencia[i+1];
        !           494: 
        !           495:         /* desensamblo la instrucción */
        !           496:         DecodificarInstruccion086(formato, &instruccion);
        !           497: 
        !           498: 
        !           499:         /* salvo la información en la estructura de la ficha de instrucción */
        !           500:         strcpy(tarjetaoperandos->nemonico, instruccion.nemonico);
        !           501:         strcpy(tarjetaoperandos->op1, instruccion.op1);
        !           502:         strcpy(tarjetaoperandos->op2, instruccion.op2);
        !           503:         /* anexo el formato al prefijo -primer byte hexadecimal- */
        !           504:         for (i=0; i<instruccion.longitud; i++)
        !           505:         {
        !           506:             cadena[0] = '\0';   /* inicio la cadena auxiliar */
        !           507:             sprintf (cadena, "%02X", (unsigned char) formato[i]);
        !           508:             /* si no le digo 'unsigned char' lo toma de 4 bytes */
        !           509:             strcat(tarjetaoperandos->hexadecimal, cadena);
        !           510:         }
        !           511:         tarjetaoperandos->longitud += instruccion.longitud;
        !           512: 
        !           513:         /* extraigo el índice del registro de la base de datos */
        !           514:         id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, instruccion.nemonico);
        !           515: 
        !           516:         if(id_nemo == -1)
        !           517:         {
        !           518:             /* emito un error al fichero de log */ 
        !           519:             sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico);
        !           520:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
        !           521:         }
        !           522:         break;
        !           523: 
        !           524:         case TRANSFERENCIA:     /* transferencia */
        !           525:         case ARITMETICA:     /* aritmética */
        !           526:         case LOGICA:     /* lógica */
        !           527:         case CADENAS:     /* cadenas */
        !           528:         case CONTROL:     /* control */
        !           529:         case SIN_TIPO:   /* sin tipo */
        !           530:         tarjetaoperandos->salto = NO_SALTO;    /* no es instrucción de salto */
        !           531:         break;
        !           532: 
        !           533:         case SALTO_INCONDICIONAL:     /* salto incondicional */
        !           534:         tarjetaoperandos->salto = INCONDICIONAL;    /* instrucción de salto */
        !           535:         break;
        !           536:     }
        !           537: 
        !           538:     /* SEGUNDO: operandos explícitos */
        !           539:     /* operando fuente (op2) */
        !           540:     ClasificarOperandoExplicito(tarjetaoperandos->op2, nemonicos[id_nemo].modo_op2, tarjetaoperandos);
        !           541:     
        !           542:     /* operando destino (op1) */
        !           543:     ClasificarOperandoExplicito(tarjetaoperandos->op1, nemonicos[id_nemo].modo_op1, tarjetaoperandos);
        !           544:     
        !           545: 
        !           546:     /* TERCERO: operandos implícitos */
        !           547:     /* analizo la lista de implícitos leídos */
        !           548:     /* copio la información de la BD para no modificarla */
        !           549:     strcpy(cadena, nemonicos[id_nemo].implicitos_leidos);
        !           550: 
        !           551:     elemento = strtok(cadena, ":");   /* el separador de elementos de la lista es ':' */
        !           552:     while(elemento != NULL)
        !           553:     {
        !           554:         ClasificarOperandoImplicitoLeido(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos);
        !           555:         
        !           556:         /* capturo el siguiente campo */
        !           557:         elemento = strtok(NULL, ":");
        !           558:     }
        !           559: 
        !           560:     /* analizo la lista de implícitos escritos */
        !           561:     /* copio la información de la BD para no modificarla */
        !           562:     strcpy(cadena, nemonicos[id_nemo].implicitos_escritos);
        !           563:     
        !           564:     elemento = strtok(cadena, ":");    /* el separador de elementos de la lista es ':' */
        !           565:     while(elemento != NULL)
        !           566:     {
        !           567:         ClasificarOperandoImplicitoEscrito(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos);
        !           568: 
        !           569:         /* capturo el siguiente campo */
        !           570:         elemento = strtok(NULL, ":");
        !           571:     }
        !           572: }
        !           573: 
        !           574: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>