Universidad de Costa Rica Facultad de Ingeniería Escuela de Ingeniería Eléctrica IE – 0502 Proyecto Eléctrico GENERACION DE UNA INTERFAZ DE VISUALIZACION PARA UN SIMULADOR PARA LA CPUCR Por: Jairo Alberto Roldán Morales Ciudad Universitaria Rodrigo Facio Julio del 2009 GENERACION DE UNA INTERFAZ DE VISUALIZACION PARA UN SIMULADOR PARA LA CPUCR Por: Jairo Alberto Roldán Morales Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal: _________________________________ Ing. Roberto Rodríguez Rodríguez Profesor Guía _________________________________ Ing. José Freddy Rojas Chavarría Profesor lector _________________________________ Ing. Andrés Díaz Soto Profesor lector i DEDICATORIA A Dios primeramente, a él sea la gloria por todas las bendiciones que me ha dado por su infinita gracia, a mis padres por la comprensión, paciencia y apoyo brindado en este difícil camino y a mi novia por apoyarme y alentarme durante todo este tiempo. ii RECONOCIMIENTOS A todos mis profesores, compañeros, amigos, a mi novia y demás personas que han compartido conmigo sus conocimientos y me han enseñado muchas cosas. A mis padres por la formación que me han dado, pues han hecho de mí la persona que soy, y a Dios, que me permite levantarme todos los días con una razón y una esperanza para cada día. iii ÍNDICE GENERAL ÍNDICE GENERAL ......................................................................................................... iv ÍNDICE DE FIGURAS..................................................................................................... vi ÍNDICE DE CUADROS .................................................................................................. vii NOMENCLATURA ....................................................................................................... viii RESUMEN....................................................................................................................... ix CAPITULO 1: Introducción............................................................................................... 1 1.1 Objetivos.................................................................................................................. 2 Objetivo general ......................................................................................... 2 1.1.1 Objetivos específicos .................................................................................. 2 1.1.2 1.2 Metodología ............................................................................................................. 3 CAPITULO 2: Desarrollo teórico....................................................................................... 5 2.1 Interfaz Gráfica de Usuario....................................................................................... 5 2.2 Programación Orientada A Objetos (P.O.O.) ............................................................ 6 Conceptos fundamentales............................................................................ 7 2.2.1 2.3 CPUCR_2 (8 Bits).................................................................................................. 10 Código de Instrucción ............................................................................... 10 2.3.1 Modos de Direccionamiento ..................................................................... 11 2.3.2 Instrucciones............................................................................................. 12 2.3.3 2.4 CPUCR_3 (32 Bits)................................................................................................ 13 Código de Instrucción ............................................................................... 13 2.4.1 Modo de Direccionamiento....................................................................... 14 2.4.2 Instrucciones............................................................................................. 15 2.4.3 2.5 GTK+..................................................................................................................... 17 Bibliotecas de GTK+ ................................................................................ 18 2.5.1 Widgets y Objetos más comunes de GTK+2.0 .......................................... 20 2.5.2 CAPITULO 3: Diseño de la Interfaz Gráfica.................................................................... 22 3.1 Archivo principal del programa (main) ................................................................... 23 3.2 Ventana del Editor de Texto ................................................................................... 29 3.3 Ventana de Registros.............................................................................................. 33 3.4 Ventana de Memoria .............................................................................................. 36 CAPITULO 4: Interfaz de Compilación y Simulación...................................................... 42 CAPITULO 5: Conclusiones y Recomendaciones............................................................ 52 Conclusiones:............................................................................................................... 52 Recomendaciones: ....................................................................................................... 53 CAPITULO 6: BIBLIOGRAFÍA ..................................................................................... 53 APÉNDICES ................................................................................................................... 55 Archivo Makefile para la interfaz gráfica con el compilador y el simulador .............. 55 Archivo Makefile para el compilador y simulador..................................................... 56 Archivo Editor.h ...................................................................................................... 57 Archivo Interfaz.h .................................................................................................... 58 Archivo Registros.h.................................................................................................. 61 iv Archivo main.cpp..................................................................................................... 63 Archivo Editor.cpp................................................................................................... 92 Archivo Interfaz.cpp............................................................................................... 101 Archivo Registros.cpp ............................................................................................ 115 ANEXOS....................................................................................................................... 159 v ÍNDICE DE FIGURAS Figura 2.1: Ejemplo de Interfaz Gráfica (GNU/Linux) ....................................................... 5 Figura 2.2: Codificación de una instrucción de la CPUCR_2 [12] ....................................... 11 Figura 2.3: Organización de las Instrucciones de la CPUCR_3......................................... 14 Figura 2.4: Emblema de GTK [8] ...................................................................................... 17 Figura 3.1: Interacción de los módulos de la Interfaz Gráfica .......................................... 23 Figura 3.2: Ventana tipo diálogo que muestra los créditos................................................ 24 Figura 3.3: Ventana de confirmación para salir ................................................................ 24 Figura 3.4: Asistente para guardar un archivo................................................................... 25 Figura 3.5: Asistente para la apertura de un archivo ......................................................... 26 Figura 3.6: Mensaje de error pre-ejecución....................................................................... 28 Figura 3.7: Ventana Principal, Editor de Texto................................................................. 29 Figura 3.8: Ventana de Registros...................................................................................... 33 Figura 3.9: Distribución de contenedores para la ventana de registros .............................. 34 Figura 3.10: Ventana de memoria..................................................................................... 37 Figura 4.1: Captura obtenida del resultado de la primera prueba....................................... 44 Figura 4.2: Captura obtenida del resultado de la primera prueba....................................... 45 Figura 4.3: Prueba al botón "Detener en".......................................................................... 45 Figura 4.4: Ejemplo de simulación ................................................................................... 46 Figura 4.5: Registros obtenidos en simulación de prueba.................................................. 47 Figura 4.6: Ventana de memoria en simulación de prueba ................................................ 48 Figura 4.7: Ventana de registros de simulación hasta posición específica de memoria. ..... 50 Figura 4.8: Prueba de simulación paso a paso................................................................... 51 vi ÍNDICE DE CUADROS Cuadro 2.1 Modos de direccionamiento de la CPUCR_2 [12] ............................................. 11 Cuadro 2.2: Casos especiales de direccionamiento en la CPUCR_2 [12]............................. 12 Cuadro 2.3: Instrucciones de la CPUCR_2 [12] .................................................................. 12 Cuadro 2.4: Modos de direccionamiento CPUCR_3 [12].................................................... 14 Cuadro 2.5: Instrucciones de la CPUCR_3 [12] ................................................................. 16 Cuadro 3.1: Atributos aplicados a la sintaxis .................................................................... 31 Cuadro 4.1: Primer código introducido para la sección de pruebas ................................... 43 Cuadro 4.2: Segundo código introducido para la sección de pruebas ................................ 44 Cuadro 4.3: Ventana de memoria del ejemplo de simulación............................................ 49 vii NOMENCLATURA P.O.O. Programa Orientado a Objetos GTK Gimp Tool Kit GUI Graphical User Interface GNOME GNU Network Object Model Environment Xfce XForms Common Enviroment Qt Biblioteca multiplataforma para desarrollar interfaces gráficas de usuario CPUCR Procesador de computadora diseñado en sus distintas versiones por profesores y estudiantes de la Universidad de Costa Rica viii RESUMEN El principal objetivo que llevó a la realización de este proyecto es la necesidad de tener una interfaz gráfica de visualización para las últimas versiones de la CPUCR, la cual permite al usuario de manera sencilla compilar, mostrar y manipular los parámetros de la simulación. Para ello se utilizó el lenguaje de programación C++ con librerías de GTK+2.0. Lo primero que se hizo fue estudiar las principales características de las versiones de la CPUCR de 8 bits y de 32 bits, de igual manera, fue necesario estudiar la sintaxis, orden y procedimientos necesarios para poder programar en C++ con librerías de GTK+2.0. Para la elaboración del programa, se inició creando un editor de texto desde el cual el usuario ingrese el código fuente, este editor tiene funciones básicas como copiar, pegar, abrir, guardar, compilar y ejecutar el programa, entre otras. Además, al editor se le agregó la característica de resaltar la sintaxis en tiempo real, y es desde el editor que el usuario selecciona la versión de la CPUCR que se desea simular. Seguidamente, se creó la ventana de registros, que muestra al usuario los registros del procesador para las distintas versiones de la CPUCR y le permite modificarlos. Además, es desde aquí que el usuario puede acceder a la ventana de memoria, la cual provee características como visualizar posiciones de memoria específicas, ejecutar hasta una posición de memoria o ejecutar paso a paso la simulación. Finalmente, se procedió a unir la interfaz gráfica con un compilador a través de un objeto, lo cual resultó de manera exitosa, además, el programa quedó previsto para unirlo con un simulador, de tal manera que la interfaz gráfica este permanentemente conectada con el compilador y con el simulador. ix CAPITULO 1: Introducción Este proyecto tiene como principal objetivo, crear una interfaz de visualización para la CPUCR, en donde se puedan modificar las variables de simulación, así como facilitar al usuario la simulación de un programa y su interpretación. El proyecto nace como una necesidad, pues la versión de la CPUCR utilizada hasta ahora para el curso Estructuras de Computadoras no es la más reciente (CPUCR de 6 bits). Además, los procesadores actuales presentan nuevas y mejoradas características, por lo que se hace necesario utilizar un procesador con más reciente, tales como la CPUCR de 8 bits y 32 bits, que ya existen teóricamente pero no tienen programas capaces de realizar simulaciones. De ahí la necesidad de este proyecto: crear una interfaz gráfica para la simulación y ejecución de programas para la CPUCR. La metodología a utilizar para la elaboración de este proyecto está relacionada directamente con lenguajes de programación como es el caso de C, C++ con librerías GTK+2.0, cabe resaltar que el proyecto se realiza para la plataforma GNU/Linux, aunque puede ser funcional también para Microsoft Windows si se instalan los paquetes requeridos por el programa. 1 2 1.1 Objetivos 1.1.1 Objetivo general • Generar una interfaz de visualización para un simulador para la CPUCR 1.1.2 Objetivos específicos • Generar una interfaz de simulación para la CPUCR que permita de una forma simple cambiar de una versión de la CPUCR a otra. • Construir una interfaz para la comunicación del sistema de visualización con un sistema ensamblador-simulador tal que permita el control del sistema y modificar variables de la simulación como son los registros del procesador y posiciones de la memoria. • Incluir en el sistema funcionalidades que permitan simular paso a paso, hasta que se de la instrucción de detenerse o hasta un punto indicado. • Agregar funcionalidades al sistema de visualización tal que permita mostrar registros, cambiarlos, listar variables, posiciones de memoria específicas y otras que posee el EMU8086a. a El EMU8086 es una interfaz gráfica que fue diseñada para emular el comportamiento del procesador Intel 8086 3 1.2 Metodología La metodología a seguir para la elaboración de este proyecto, se puede dividir en 5 grandes etapas: estudio preeliminar, elaboración del programa, etapa de depuración, unión de la interfaz gráfica con el compilador y simulador y elaboración del informe final. 1. Estudio preeliminar: fue necesario estudiar los conceptos básicos de la programación orientada a objetos (P.O.O.), esto porque se iba a utilizar este tipo de programación en la elaboración del programa. También fue necesario estudiar a fondo las versiones de la CPUCR, pues es indispensable conocer detalladamente lo que se pretende simular. Finalmente, se analizó el funcionamiento del EMU8086, pues se deseaba que el simulador para la CPUCR tuviera muchas de las funcionalidades que tiene este simulador, además, este emulador EMU8086 es un ejemplo real de lo que se deseaba hacer. 2. Elaboración del programa: comienza con la instalación de paquetes necesarios para poder compilar y ejecutar adecuadamente un programa en GNU/Linux y en Microsoft Windows, luego, se hicieron distintos “mini-programas” en donde cada uno presentaba una funcionalidad diferente, como barras de menú, barras de herramientas, cuadros y ventanas de texto, botones, etiquetas, cajas y otros widgetsb presentes en el programa final, en el que se unieron estos “mini-programas” para formar un conjunto (esto se hizo uniendo las porciones de código de cada miniprograma, de tal manera que al final se obtiene un conjunto). Dicha unión se hizo de manera estructurada para cada módulo (una porción de código de gran extensión, continua y ordenada para cada módulo, con gran cantidad de información, funciones 4 y variables) y cada módulo unido con los otros módulos a través de un objeto, lo cual representa la totalidad del programa. 3. Etapa de depuración: una vez que el programa presentaba una funcionalidad aceptable, se procedió a corregir aquellos aspectos del programa que podían desembocar en un cierre inesperado del programa o un indebido funcionamiento del mismo. Esto se consiguió estudiando detalladamente la sintaxis de cada instrucción y mejorando los aspectos que se creyeron pertinentes. Se revisaron también otras porciones de código y se eliminaron aquellas que resultaron innecesarias. 4. Unión de la interfaz gráfica con el compilador y el simulador: esta unión se llevó a cabo en manera conjunta con el creador de el compilador y simulador, el estudiante Edgar Villalobos Ortega, con quien antes de la elaboración de los programas (interfaz gráfica, compilador y simulador) se dialogó y se había llegado a un común acuerdo para la manera en que se iban a comunicar dichos programas. Esta unión se haría por medio de objetos, cuyos argumentos iban a ser de tipo string, lo cual resultó de manera exitosa y no presentó inconvenientes o incompatibilidad entre las partes. 5. Elaboración del informe final: el informe se hizo incluyendo los objetivos del proyecto y la información teórica más relevante También se explica el procedimiento que se utilizó para crear la interfaz gráfica y unirla con el compilador y simlador. Se incluye además el código fuente del programa completo, las conclusiones y recomendaciones que se obtuvieron al finalizar el proyecto. b El significado de Widget se explicará más adelante en la página 20. CAPITULO 2: Desarrollo teórico Para comprender muchos detalles y conceptos que se utilizan en este proyecto, es necesario saber primero que son y de que tratan estos conceptos. Algunos de ellos son: la interfaz gráfica de usuario, las bibliotecas GTK, el procesador CPUCR de 8 bits y de 32 bits, entre otros. 2.1 Interfaz Gráfica de Usuario La interfaz gráfica de usuario (en idioma inglés Graphical User Interface [2] , GUI) es una aplicación gráfica que permite al usuario interactuar de una manera sencilla con un programa de computadora. La interfaz gráfica de usuario es un tipo de interfaz de usuario que utiliza un conjunto de imágenes y objetos gráficos para representar la información y acciones disponibles en la interfaz. Habitualmente las acciones se realizan mediante manipulación directa para facilitar la interacción del usuario con la computadora. Figura 2.1: Ejemplo de Interfaz Gráfica (GNU/Linux) 5 6 Surge como evolución de la línea de comandos de los primeros sistemas operativos y es pieza fundamental en un entorno gráfico. Como ejemplo de interfaz gráfica de usuario podemos citar el escritorio del sistema operativo Windows y el entorno X-Window de Linux y también Aqua de Mac OS X [2]. 2.2 Programación Orientada A Objetos (P.O.O.) La Programación Orientada a Objetos (POO) es un tipo de programación que usa objetosc y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos. La programación orientada a objetos expresa un programa como un conjunto de objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar. De esta forma, un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos que favorecen la comunicación entre ellos. Los métodos y atributos están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. c Un objeto es una representación detallada y particular de algo de la realidad. Todo objeto tiene un identidad o nombre, estado (características definidas generalmente en variables) y comportamiento (sus funciones o procedimientos) [7]. 7 2.2.1 Conceptos fundamentales La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a muchos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: • Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas. • Herencia: Es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables públicas declaradas en C. Los componentes registrados como prívate (privados) también se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos públicos. • Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos). Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase. • Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. 8 • Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera. • Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. • Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. • Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase. • Componentes de un objeto: atributos, identidad, relaciones y métodos. • Representación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes [4]. En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto. 9 Existen varios lenguajes de programación orientados a objetos, entre los más comunes se pueden destacar: C++, java, perl, php, python entre otros. Muchos de lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la POO con otros paradigmas. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico. 10 2.3 CPUCR_2 (8 Bits) La CPUCR es un CPU diseñado por los ingenieros Randolph Steinvorth y Marco Antonio Vásquez para la Escuela de Ingeniería Eléctrica de la Universidad de Costa Rica, el cual fue desarrollado con fines didácticos. Originalmente, la CPUCR tenía un ancho de palabra de 6 bits, por lo que solo podía tomar 26 = 64 posibles valores (de 0 a 63). De igual manera, para direccionar la memoria principal, se utilizaba un bus de direcciones de dos palabras, o sea 12 bits, con lo que se podían direccionar 212 = 4096 posiciones. La CPUCR_2 es una versión mejorada de la CPUCR original, en la que el principal cambio es que se cambia el ancho de palabra de 6 bits a 8 bits, con lo que se pueden tener 28 = 256 valores con una palabra, lo cual ayuda a mejorar el desempeño del procesador. Para direccionar la memoria principal se utilizan dos palabras, con lo que se pueden obtener 216 = 65536 posiciones de memoria. La CPUCR_2 utiliza múltiples registros, a diferencia del registro único que poseía la CPUCR original. Con esta nueva característica se hace posible la operación entre dos registros. Se utiliza una palabra para direccionar los registros. En caso de una instrucción que opere sobre dos registros se utilizan 4 bits de dicha palabra, dando así 16 posibles registros. Estos registros se llaman Rd (registro destino) y Rs (registro fuente) [12]. 2.3.1 Código de Instrucción Para la CPUCR_2 se incluye la posibilidad de realizar operaciones de 2 palabras para algunas instrucciones. Se utiliza entonces un bit especial de la palabra de código de instrucción para indicar si se realizará una operación de 8 bits o de 16 bits. Luego de esto se 11 toman 4 bits para el Código de operación y los 4 restantes para el modo de direccionamiento. De esta forma la codificación mostrada en la Figura 2-5. Figura 2.2: Codificación de una instrucción de la CPUCR_2 [12] Al tener 4 bits como código de operación, se tiene la posibilidad de codificar más instrucciones, aumentando así el conjunto de instrucciones a 132 instrucciones, siendo originalmente de 51 instrucciones [12]. 2.3.2 Modos de Direccionamiento Se utilizan diferentes modos de direccionamiento debido a la nueva capacidad de tener múltiples registros. Los modos de direccionamiento de la CPUCR_2 se muestran en el Cuadro 2-1. Cuadro 2.1 Modos de direccionamiento de la CPUCR_2 [12] b2-b0 000 001 010 011 100 101 Direccionamiento Entre Registros Inmediato Absoluto Indirecto Implícito a registro Relativo a registros Dentro de esta lista no se incluyen los direccionamientos cuando b2=b1=1 ya que estas son excepciones con el bit 4 (bit 8/16) y su codificación se muestra en el Cuadro 2-2. 12 Cuadro 2.2: Casos especiales de direccionamiento en la CPUCR_2 [12] Direccionamiento b3-b0 0110 Implícito a status y HLT, NOP, RTI, RTS Relativo a status 0111 INP, OUT 1110 ? 1111 2.3.3 Instrucciones Para la CPUCR_2, la cantidad de instrucciones aumenta como se mencionó antes. Además, algunas de ellas cambian de nombre debido a que ya no se opera sobre un solo registro llamado acumulador sino sobre varios. En el Cuadro 2-3 se resumen todas las instrucciones de la CPUCR_2 [12]. Cuadro 2.3: Instrucciones de la CPUCR_2 [12] 13 2.4 CPUCR_3 (32 Bits) La CPUCR_3 incrementa su ancho de palabra notablemente. Se pasa de los 8 bits, de la CPUCR_2, a 32 bits, obteniendo un ámbito de valores de hasta 232 bits. Como se observó en las anteriores versiones de la CPUCR, modificando el ancho de palabra se abren muchas otras opciones para el diseño del microprocesador. Para la CPUCR_3 ya no es necesario utilizar dos palabras para direccionar la memoria principal, esto debido al tamaño de palabra. Esto es una de las justificaciones para utilizar 32 bits como ancho de palabra. Gracias a su tamaño solo se deberá hacer una operación para acceder a memoria. En cambio, al utilizar dos palabras como dirección era necesario realizar dos accesos. La memoria principal puede ser entonces de un tamaño hasta de 232 posiciones de memoria. Sin embargo esta memoria ya no incluye las instrucciones, se hace necesario el uso de una memoria de instrucciones [12]. 2.4.1 Código de Instrucción Se busca que la palabra de 32 bits contenga toda la información necesaria para la instrucción y así evitar múltiples accesos a la memoria de instrucciones para una misma instrucción, de modo que se utiliza el primer byte (grupo de 8 bits) para almacenar el código de instrucción y el modo de direccionamiento, de forma similar a la CPUCR_2. Sin embargo, no se hace necesario la utilización del byte 8/16, teniéndose la distribución mostrada en la Figura 2-3. 14 Figura 2.3: Organización de las Instrucciones de la CPUCR_3 El resto de la palabra se utilizará entonces para otros datos según el modo de direccionamiento que se utilice [12]. 2.4.2 Modo de Direccionamiento Los Modos de Direccionamiento que se utilizan son similares a los utilizados en la CPUCR_2. Estos se resumen en el Cuadro 2-4. Cuadro 2.4: Modos de direccionamiento CPUCR_3 [12] b3-b0 0000 0001 0010 0011 0100 0101 0110 0111 1110 1111 Modo de Direccionamiento Entre Registros Inmediato Absoluto Indirecto Implícito a Registros Relativo a Registros Implícito al Status y HLT, NOP, RTI, RTS Relativo al Status Entrada / Salida Indefinido 15 2.4.3 Instrucciones Las instrucciones de la CPUCR_3 son similares a las de la CPUCR_2 pero operarán sobre 32 bits. Además, para la CPUCR_3 se tienen también múltiples registros. Debido al ancho de palabra, se utilizan de nuevo 16 registros. Sin embargo no se hace necesario el uso de registros indexados (propiedad de la CPUCR_2 donde se usaban 2 registros para formar un operando de dos palabras), esto debido al tamaño de los registros. A continuación, en el Cuadro 2-5 se muestra un resumen de las instrucciones de la CPUCR_3 para cada modo de direccionamiento y cual es su código de operación. Ambos valores, el código de operación y el modo de direccionamiento, son dados por 4 bits del primer byte de una instrucción, el modo de direccionamiento utiliza los bits 0 al 3 mientras que el código de operación utiliza los bits 4 al 7, cada uno de estos bytes se representa en hexadecimal para hacer mas sencilla su comprensión [12]. 16 Cuadro 2.5: Instrucciones de la CPUCR_3 [12] 17 2.5 GTK+ GTK+ ó The GIMP Toolkit es un conjunto de bibliotecas multiplataforma para desarrollar interfaces gráficas de usuario (GUI) [8] . Inicialmente fueron creadas para desarrollar el programa de edición de imagen GIMP, sin embargo actualmente son utilizadas en muchos otros programas en los sistemas GNU/Linux, aunque también pueden ser compatibles en aplicaciones de Microsoft Windows si se instalan los paquetes apropiadosd. Junto a Qt es uno de las bibliotecas más populares para X Window System. GTK+ se ha diseñado para permitir programar con lenguajes como C, C++, C#, Java, Ruby, Perl, PHP o Python. Licenciado bajo los términos de LGPL, GTK+ es software libre y es parte del proyecto GNU [3]. El emblema de GTK caracteriza las aplicaciones que están hechas con estas bibliotecas, por lo que al ver este símbolo (Figura 2-4) sabremos que se está hablando de un programa hecho con GTK. Figura 2.4: Emblema de GTK [8] d Ver apéndice. 18 2.5.1 Bibliotecas de GTK+ GTK+ se basa en varias bibliotecas del equipo de GTK+ y de GNOME: • GLib: Biblioteca de bajo nivel estructura básica de GTK+ y GNOME. Proporciona manejo de estructura de datos para C, portabilidad, interfaces para funcionalidades de tiempo de ejecución como ciclos, hilos, carga dinámica o un sistema de objetos. • GTK: Biblioteca la cual realmente contiene los objetos y funciones para crear la interfaz de usuario. Maneja Widgets e como ventanas, botones, menús, etiquetas, deslizadores, pestañas, etc. • GDK: Biblioteca que actúa como intermediario entre gráficos de bajo nivel y gráficos de alto nivel [3]. • ATK: Biblioteca para crear interfaces con características de una gran accesibilidad muy importante para personas con discapacidad. Pueden usarse utilerías como lupas de aumento, lectores de pantalla, o entradas de datos alternativas al clásico teclado o mouse [6]. • Pango: Biblioteca para el diseño y reenderezado de texto. Hace hincapié especialmente en la internacionalización. Pango forma el núcleo del manejo de fuente y texto para GTK+-2.0 [10]. • Cairo: Biblioteca de gráficos de dos dimensiones compatible con múltiples dispositivos de salida. Produce una salida consistente en todas las salidas multimedia y puede usar la aceleración por hardware si está disponible. Entre las operaciones que se incluyen en cairo están el trazo y relleno de líneas cúbicas Bézier, la transformación y composición de imágenes translúcidas en el dibujado 19 del texto. Todas las operaciones de dibujo se pueden transformar mediante cualquier transformación afín (escalar, rotación, cortar, etc.) [9]. Algunas aplicaciones que usan GTK+ como toolkit son: • AbiWord: Procesador de textos. • Evolution: Servicio de mensajería. • Firefox: Navegador Web. • GIMP: Editor gráfico. • Chromium: Navegador Web basado en Webkitf y desarrollado en gran medida por Google • Inkscape SVG: Editor de gráficos vectoriales. • K-3D: Modelado libre (de 3D) y programa de animación. • Marionnet: Un simulador interactivo de redes. • Midori: Navegador Web portable • Nero Linux: Aplicación de grabación de nueva generación para el sistema operativo GNU/Linux e • Pidgin: Cliente de mensajería instantánea • VMware Player: Maquina virtual [3]. El concepto de Widget se explica más adelante en la página 20 Webkit es un motor de navegación web de código libre y además, es un esqueleto de Mac OS X que se usó para construir aplicaciones como Safari, Dashboard, Mail entre otras [11]. f 20 2.5.2 Widgets y Objetos más comunes de GTK+2.0 Un widget es una pequeña aplicación o programa, usualmente presentado en archivos o ficheros pequeños que son ejecutados por un motor de widgets o Widget Engine. Entre sus objetivos están los de dar fácil acceso a funciones frecuentemente usadas y proveer de información visual. Sin embargo los widgets pueden hacer todo lo que la imaginación desee e interactuar con servicios e información distribuida en Internet; pueden ser vistosos relojes en pantalla, notas, calculadoras, calendarios, agendas, juegos, ventanas con información del tiempo en su ciudad, etc [5]. Para elaborar un programa utilizando GTK+2.0 es importante conocer algunos de los widgets y objetos más comunes que se utilizan en la elaboración de un programa, pues son muchos y hay algunos en especial que resultan muy comunes en la mayoría de programas elaborados con este tipo de entorno gráfico. La lista completa de widgets y objetos se puede consultar en la página de Internet de la GNOME [6] , a continuación se mencionan los más comunes. • GtkContainer: Corresponde a un contenedor, su función es almacenar un widget y ubicarlo en una posición específica del contenedor. Existen muchos tipos de contenedores, los más comunes son: ventanas, tablas, cajas, cajas horizontales, cajas verticales y cuadernos entre otros. • GtkWindow: Corresponde a una ventana, la cual a su vez es un contenedor que puede almacenar un único objeto en ella. Existen ventanas con ajuste de scroll horizontal, vertical, ambos o ninguno. A su vez, se puede ubicar la ventana en una posición específica de la pantalla, con un determinado título, tamaño, borde, etc. • GtkButton: Corresponde a un botón. Este botón debe ser ubicado en algún contenedor y generalmente se conecta a un evento cuando se hace click sobre él, 21 cuando se suelta, cuando esta presionado, cuando modifica su valor etc. Existen botones comunes, de tipo flechas, tipo casilla de verificación, tipo íconos, etc. • GtkTextEntry: Corresponde a una entrada de texto. Debe ser ubicada en un contenedor, sirve para mostrar un texto o bien para que el usuario pueda introducir texto en dicha entrada. Generalmente se asocia a un búfer de texto (GtkTextBuffer) para conectarlo a eventos, señales o bien para hacer interactivo el texto mostrado o escrito. Dentro de un búfer de texto se pueden ubicar marcas o iteradores de texto con el fin de ubicar una posición fija o variable, tal como una línea específica, una palabra en especial o el final del texto entre otros. • GtkLabel: Corresponde a una etiqueta. Su principal función es mostrar información al usuario, ya sea el título o leyenda de un widget, información acerca de la línea o columna sobre la que está ubicado el cursor. Debe ser almacenado dentro de un contenedor y se puede modificar su contenido durante la ejecución del programa. • GtkMenuBar: Corresponde a una barra de menú. Esta barra es un contenedor y generalmente se ubica en la parte superior de la ventana dentro de un contenedor de tamaño fijo, aunque esto queda a preferencia del programador. Dentro de la barra de menú se pueden adjuntar ítems y subítems de menú para posicionar dentro de ellos opciones que el usuario pueda seleccionar y generalmente están conectados a un evento. • GtkToolbar: Corresponde a una barra de herramientas. Dentro de ella se pueden incluir botones o íconos (StockItem), los cuales generalmente están conectados a eventos. Esta barra es un contenedor y a su vez debe ser ubicada dentro de un contenedor. • GtkDialog: Corresponde a una ventana emergente utilizada para mostrar o seleccionar información. Esta ventana puede contener un mensaje de error, de confirmación, un asistente para imprimir o seleccionar archivos, entre otros. Existen muchos otros widgets utilizados en la elaboración de un programa gráfico, los cuales pueden estudiarse revisando la página Web de GNOME [6] , algunos de ellos fueron utilizados durante la elaboración de este proyecto, los cuales serán brevemente explicados cuando se mencione su utilización. 22 CAPITULO 3: Diseño de la Interfaz Gráfica Para el diseño de la interfaz gráfica, se utilizó el lenguaje de programación C++ con bibliotecas de GTK, esto para la plataforma GNU/Linux, aunque al principio de la elaboración del programa se utilizó el programa Dev-C++ para Microsoft Windows con los paquetes necesarios previamente instalados. La sintaxis de las funciones e instrucciones de las bibliotecas GTK fueron tomadas directamente de la página de Internet de GNOME [6] , en donde entre la documentación se explica brevemente cada parámetro de las instrucciones, así como su sintaxis y las funciones o llamadas que están relacionadas con dicha instrucción. El programa tiene los archivos main.cpp que contiene las principales funciones y métodos que se utilizan durante la ejecución del programa, Editor.cpp que contiene todos los botones, menús, textos y otros widgets que se muestran en la ventana del editor de textos, Registros.cpp muestra en una ventana los registros del procesador y contiene además la ventana de memoria. Finalmente, el archivo Interfaz.cpp contiene todas las clases y métodos utilizados para conectar la Interfaz Gráfica con la etapa de compilación y simulación del código. La interacción que existe entre los módulos de la Interfaz Gráfica es una interacción múltiple, en donde todos los módulos se relacionan entre sí a través de un objeto, compartiendo así sus métodos y funciones con los demás módulos. La interacción existente entre todos los módulos se puede observar en el diagrama de la Figura 3-1. 23 Figura 3.1: Interacción de los módulos de la Interfaz Gráfica El conjunto de ventanas, que se muestran durante la ejecución del programa se puede dividir en tres grandes ventanas “principales”: • Ventana del editor de texto • Ventana de registros • Ventana de memoria También es importante mencionar el archivo main.cpp, pues es el que inicializa y manipula a todos los demás módulos del programa. A continuación se explica el contenido del archivo principal del programa, el de cada ventana y el de la interfaz de compilación y simulación. 3.1 Archivo principal del programa (main) Es el módulo principal del programa. El mismo contiene la inicialización del programa, en donde se declaran los valores iniciales o predeterminados del programa. Seguidamente se llama a la ejecución de la ventana del editor de texto, la cual está contenida en un método encargado de crear dicha ventana. Este método forma parte de una clase llamada Editor. 24 Existen además múltiples variables globales, que contienen los valores de cada registro del procesador, ventana de memoria, puertos, así como de otras variables necesarias para el correcto funcionamiento del programa (por ejemplo variables que indican que el proyecto ha sido guardado, compilado, ejecutado, la ruta del archivo abierto o guardado, etc.). Las funciones contenidas en el main.cpp conectan importantes eventos, tales como: 1. Cerrar el programa: existe una función encargada de cerrar el programa, por lo que destruye cualquier objeto o proceso que se esté ejecutando cuando esta función es llamada. 2. Mostrar ventanas emergentes: muestra una ventana de tipo diálogo con diferentes mensajes que se le quieran comunicar al usuario. Algunas de ellas se muestran en las figuras 3.2 y 3.3. Figura 3.2: Ventana tipo diálogo que muestra los créditos Figura 3.3: Ventana de confirmación para salir 25 3. Almacenar registros del procesador: existe una función que guarda los registros del procesador en un archivo llamado Registros.txt una vez que el programa haya sido ejecutado. 4. Guardar un archivo: existen funciones destinadas a guardar en un archivo, el contenido del búfer de texto que se esté mostrando en el editor de texto. Se muestra además un asistente para guardar el archivo, el cual contiene filtros para tres extensiones (*.cp8, *.c32 y *.txt) para facilitar este proceso al usuario. Figura 3.4: Asistente para guardar un archivo 5. Abrir un archivo: Al igual que el asistente para guardar un archivo, se creó un asistente para abrir un archivo, el cual contiene filtros para facilitar la búsqueda del archivo (extensiones *.cp8, *.c32, *.txt, todas las extensiones soportadas o todos los archivos). 26 Figura 3.5: Asistente para la apertura de un archivo 6. Guardar copia de respaldo: Se creó una función que guarda en el archivo “Sin_Nombre.txt” el código escrito por el usuario cada vez que haya un cambio en el búfer de texto, esto se hace por precaución pues si el programa o la computadora se cierran inesperadamente el usuario tiene la posibilidad de recuperar la información ingresada hasta el último cambio en el búfer. 7. Almacenamiento temporal de cambios: se crearon funciones que almacenan en variables globales los cambios que se hacen en el búfer de texto, esto para poder ejecutar los comandos undo (deshacer última acción) y redo (rehacer última acción previamente modificada por el comando undo). 27 8. Cortar, copiar, pegar: Se crearon funciones que permiten al usuario ejecutar los comandos cortar, copiar, pegar, seleccionar todo, borrar la selección de texto o limpiar la ventana del editor de texto. 9. Resaltar sintaxis: Se creó una función que resalta en tiempo real la sintaxis, la cual se ejecuta cada vez que haya un cambio en el búfer de texto. Tiene la opción de resaltar las palabras reservadas, números, comentarios, caracteres reservados e instrucciones para las versiones de la CPUCR de 8 bits y de 32 bits 10. Aplicar atributos al texto: Se crearon funciones que aplican algunos atributos al texto seleccionado. Entre esos atributos se pueden mencionar negrita, color (verde) y quitar atributos. 11. Compilar el código fuente: Se creó una función que envía para compilación, los valores actuales de los registros, el código fuente escrito por el usuario y la ruta del archivo que contiene el código. Antes de compilar, el programa exige que el código sea guardado si no ha sido guardado antes, o lo guarda si el código fue abierto o guardado antes. 12. Mostrar Advertencias: Se hizo una función que envía a la sección de Warnings del editor de textos, las advertencias obtenidas durante la compilación del código. 13. Ejecutar el programa: Se creó una función que llama a ejecución al programa previamente compilado. Muestra los registros del procesador o los actualiza siempre y cuando la compilación haya sido exitosa, de lo contrario lanza una advertencia indicando que debe compilar exitosamente el código. Esta advertencia se muestra en la figura 3.6. 28 Figura 3.6: Mensaje de error pre-ejecución 14. Casillas de verificación: Se hicieron funciones que cambian la versión de la CPUCR para su compilación, ejecución o resaltado de sintaxis. A su vez, cambian el estado de los botones de check mostrados en la ventana del editor de textos, para que el usuario pueda identificar y cambiar fácilmente la versión de la CPUCR. 15. Crear Atributos: Se hizo una función que crea los diferentes atributos que se le aplican al texto durante la ejecución del programa. Entre los atributos que se crearon se pueden mencionar: • Bold: aplica negrita, se selecciona desde el menú Formato – Negrita. • Color: aplica el color verde, se selecciona desde el menú Formato – Color. • Word: aplica negrita y color café, es utilizada para resaltar las palabras reservadas de la CPUCR. • Coment: aplica el color gris, es utilizada para resaltar los comentarios. • Num: aplica color morado, es utilizada para resaltar los números y el signo dólar. • Centrar: centra el texto, utilizado para centrar el contenido de los registros y de la ventana de memoria. • Under: subraya el texto, utilizado para resaltar la posición de memoria que se está utilizando. 29 3.2 Ventana del Editor de Texto Es la ventana principal del programa, por lo que es la que aparece al usuario cuando inicia el programa, asimismo, si esta ventana se destruye, se cierra por completo el programa y cualquier otra ventana o proceso que se este ejecutando. Figura 3.7: Ventana Principal, Editor de Texto 30 Entre los widgets que se pueden apreciar en la ventana del editor (Figura 3.7) están: • Barra de Menú, ítems del menú y sub-ítems del menú, cada uno de ellos conectado a su respectivo evento. Contiene los ítems: Archivo (Abrir, Guardar, Guardar como y Salir), Edición (Undo, Redo, Seleccionar todo, Limpiar ventana, Cortar, Copiar y Pegar), Formato (Color verde, Negrita y Borrar formato), Ejecutar (Compilar y Ejecutar) y Acerca de… (Créditos). • Barra de Herramientas, en este caso se utilizaron botones del tipo “stockitem”, que son íconos predefinidos con su respectiva leyenda. Cada botón está debidamente conectado a un evento. Estos botones son: Abrir, Guardar, Cortar, Copiar, Pegar, Compilar, Ejecutar y separadores entre secciones. • Ventanas con barras de desplazamiento (scroll), contenedores con desplazamiento vertical y horizontal. • Entradas de texto con búfer, una para escribir el código y otra para mostrar las advertencias. Cada una de ellas está contenida dentro de una ventana con scroll. • Casillas de verificación (Botones de check), para seleccionar la versión de la CPUCR con la que se desea trabajar (de 8 bits o de 32 bits, por defecto aparece marcada la opción de 8 bits). • Etiquetas, para indicaciones importantes, en este caso para indicar la leyenda de cada casilla de verificación y el número de línea sobre la que está el cursor. Esta última se está actualizando cada 250ms por medio de una llamada a función para ubicar la posición del cursor e imprimirla en la etiqueta. 31 • Contenedores de tipo vertical, horizontal y handlebox. El de tipo vertical almacena los widgets de manera vertical, análogamente lo hace el de tipo horizontal. El contenedor de tipo handlebox es una caja que mantiene su tamaño aún cuando se cambien las dimensiones de la ventana y es especialmente útil para almacenar barras de menú y de herramientas, además de permitir arrastrar su contenido para colocarlo en otra posición. Cabe resaltar también que el editor de textos resalta la sintaxis en tiempo real conforme se introduce el código de acuerdo a la versión de la CPUCR que esté seleccionada en los botones de check. El editor de textos reconoce las palabras reservadas (en mayúsculas y minúsculas) como por ejemplo macro, finmac, wrd, dbwrd, carácter “*” y carácter “$”, además reconoce los números, los comentarios y las instrucciones de la CPUCR cada uno con un color diferente tal y como se muestra en el Cuadro 3-1: Cuadro 3.1: Atributos aplicados a la sintaxis Entrada Palabras reservadas y carácter asterisco “*” Números y signo dólar “$” Comentarios (desde “;” hasta final de línea) Instrucciones de la CPUCR Atributo(s) Negrita y color café Color violeta Color gris Negrita Para el reconocimiento de las instrucciones de la CPUCR se utilizaron cadenas del tipo const char* instrucciones [52], instrucciones_m [52]; pues para la CPUCR de 32 bits existen 52 nombres diferentes para las instrucciones de la CPUCR (tanto en mayúsculas como en minúsculas). Para la versión de 8 bits solo existen 38 nombres para las 32 instrucciones, por lo que no fue necesario hacer una re-declaración de todos los términos, solo los que cambian de nombre (por ejemplo el LD de la versión de 32 bits es LDA en la versión de 8 bits), los términos sobrantes de la cadena no se utilizan para la versión de 8 bits (sobran: 52 – 38 = 14 posiciones de las variables declaradas en el const char * escritas anteriormente). La llamada a la función de marcar sintaxis se hace cada vez que el usuario modifique el búfer de texto del editor (basta con introducir o borrar un carácter), por lo que constante y permanentemente se está resaltando la sintaxis. Prácticamente todas las funciones necesarias para el buen funcionamiento del editor de textos están dentro del archivo main.cpp, sin embargo fue necesario agregar una función más para el editor de textos, dicha función es la función de tipo void: insertion (), la cual es la encargada de ubicar el cursor en el búfer de la entrada de texto, una vez ubicado el cursor, imprime el número de línea en la etiqueta que está en la parte inferior derecha de la ventana del editor. Esta etiqueta fue declarada afuera del método que genera la ventana del editor de textos (variable global), para poder acceder a ella desde el método y la función encargadas de imprimir adecuadamente los widgets y sus contenidos en la ventana del editor de textos. El búfer de texto del editor también es declarado como una variable global, pues es necesario acceder a él desde diferentes puntos del código, y las llamadas a función de GTK por una señal solo permiten enviar un argumento a la función, por este motivo se decidió utilizar variables globales en la elaboración de todo el programa. 33 3.3 Ventana de Registros Es la ventana que muestra los registros Fuente (Principales) y Destino (Auxiliares) de la CPUCR. Aparece al usuario cuando se ejecuta el código luego de una compilación exitosa. Como esta ventana está conectada con el editor de textos, en ella también se muestran las variables escritas por el usuario, como por ejemplo los macros, wrd, dbwrd y posiciones de memoria fijas. Además, es desde la ventana de registros que el usuario puede abrir la ventana de memoria. La ventana de registros se muestra en la Figura 3.8. Figura 3.8: Ventana de Registros 34 Para colocar los widgets que se pueden apreciar en esta ventana se hizo la distribución en la ventana que se muestra en la Figura 3.9: Figura 3.9: Distribución de contenedores para la ventana de registros De las Figuras 3.8 y 3.9 se puede apreciar que se hizo uso de múltiples contenedores para ordenar y colocar los widgets en la ventana de registros, como las cajas verticales (hay 4), cajas horizontales (3), cajas tipo handlebox (3), y otras no utilizadas hasta ahora, tal es el caso del notebook (cuaderno), que permite añadir contenedores de tipo “pestaña” para poder seleccionar entre varios contenedores. A su vez, un notebok almacena otro contenedor, el frame (marco), que le da una mejor apariencia colocando una multi-línea en el borde del contenedor. Para este caso, se pusieron dos pestañas para el notebook (cada 35 una con su respectivo frame), una para mostrar los registros principales y la otra para mostrar los registros auxiliares de la CPUCR. Los demás widgets utilizados en esta ventana se declararon de manera muy similar a los del editor de textos (barras de menú y de herramientas, entradas de texto y búfer de texto, botones, ventanas de scroll y etiquetas). Esta ventana está conectada con la interfaz de compilación y de simulación tal y como se muestra en la ¡Error! No se encuentra el origen de la referencia.. Esto permite que desde la ventana de registros se pueda compilar el código escrito en el editor de texto y ejecutarlo. Además, si el usuario cambió el valor de algún registro, la ventana de registros envía al compilador los valores actuales de los registros, con lo que se puede compilar y ejecutar el código fuente con valores iniciales distintos a los valores por defecto de los registros (por defecto, los registros y la ventana de memoria tienen todos valores de $0000 o $00 según corresponda). En esta ventana se puede acceder a la opción de ejecutar paso a paso la simulación, con lo que se puede ver los cambios que van presentando los registros en cada paso que avanza la simulación. Para ejecutar esta opción el programa solicita compilar el código nuevamente, esto para poder compilar con los valores de los registros modificados por el usuario. Los puertos de entrada y de salida, así como la ventana de memoria están accesibles al usuario desde el botón de la barra de herramientas con la leyenda “V.M.” o bien desde el ítem del menú llamado “Ver” en el sub-ítem “Ventana de memoria” o bien en el sub-ítem “Puertos”. Ambos abren la misma ventana (que contiene la memoria y los puertos). Si el usuario compila o ejecuta el código fuente desde la ventana de memoria o desde el editor, los cambios en los registros se pueden observar desde la ventana de 36 registros ya abierta, sin necesidad de tener que abrir otra ventana de registros para ver los cambios. 3.4 Ventana de Memoria Es la ventana que muestra la memoria y los puertos de la CPUCR. Aparece cuando se le da click desde la ventana de memoria al ítem o botón indicado con ese nombre y las funciones que la generan y que la operan están contenidas en el mismo módulo que la ventana de registros (el archivo Registros.cpp). La ventana de memoria se puede apreciar en la Figura 3.10. 37 Figura 3.10: Ventana de memoria La función que genera la ventana de memoria se llama “on_button_vm_clicked”. Como esta ventana también está conectada al editor de texto (por medio de la variable “user_data”, que recibe de la ventana de registros y es la que contiene la entrada de texto que contiene el código fuente escrito por el usuario en la ventana del editor de texto) es posible compilar, ejecutar y ejecutar paso a paso el programa desde ella con solo hacer click en los botones colocados para ese fin. Se agregan además las opciones de agregar hasta 10 posiciones de memoria específicas para poder analizar su comportamiento en cada paso de la ejecución o al final 38 de la misma (ejecutar paso a paso o ejecutar todo, respectivamente). De igual manera, se puede remover una posición específica previamente agregada si ya no interesa analizar su comportamiento, o bien remover todas las posiciones si no se desea analizar ninguna. Si la ejecución se hace paso a paso, el programa irá resaltando con negrita y subrayando la posición de memoria y su contenido cuando esta cambia de valor, además, posicionará el ajuste de la ventana con barra de desplazamiento para que el usuario tenga siempre a la vista la posición que está siendo modificada. De igual manera, si se agregó una posición específica para visualizar los cambios, esta también será resaltada y subrayada cuando cambie. Es importante indicar que sólo se resalta y subraya la posición que está siendo modificada, una vez que se cambie de posición los atributos aplicados a la posición anterior serán desechos. El programa tiene también un botón que sirve para indicar que se desea parar la ejecución del programa, el cual envía un “1” cuando se le da click. Este valor es reestablecido a cero cuando se compila o ejecuta nuevamente el programa. Finalmente, se agregó un botón que indica en cual posición de memoria se desea detener la ejecución El valor donde se desea detener la ejecución está dado por el “spinbutton” (botón con un ámbito de valores numéricos y flechas para seleccionar entre dichos números). Para activar la ejecución hasta una posición específica es necesario activar el botón “Parar en” el cual cambia su leyenda cuando está activado e indica el valor donde se desea detener la ejecución del programa (en hexadecimal). Así si el botón presenta la leyenda “$000f” (“0015” en el spin-button) la ejecución se detendrá en esta posición. Por el contrario si el botón presenta la leyenda “Parar en” entonces la ejecución será realizada hasta el final (instrucción HLT). 39 Como se mencionó antes, la ventana de memoria contiene los puertos de entrada y de salida, mostrando el valor que se va a ingresar o exportar cuando se hace acceso a puertos. Los puertos también modifican sus valores conforme se hace la ejecución paso a paso. Hay varias funciones que ayudan al debido funcionamiento de la ventana de memoria, estas son: 1. void marcar: es la función encargada de resaltar la posición que está siendo modificada cuando se está ejecutado el programa paso a paso. 2. void add_const: es la función encargada de agregar una posición de memoria en el cuadro de “Visualizar Cambios”. Se llama a esta función cuando se le da click al botón de “Agregar”. 3. void remove_const: es la función encargada de eliminar una posición de memoria del cuadro de “Visualizar Cambios”. Se llama a esta función cuando se le da click al botón de “Quitar”. 4. void clear_const: es la función encargada de eliminar todas las posiciones de memoria del cuadro de “Visualizar Cambios”. Se llama a esta función cuando se le da click al botón de “Limpiar”. 5. void on_button_compile: es la función encargada de llamar a compilar el código escrito en el editor de texto, con los valores de los registros presentes en la ventana de registros y que pudieron haber sido modificados por el usuario. 6. void on_button_step_clicked: es la función encargada de ejecutar paso a paso el código escrito en el editor de texto, con los valores de los registros presentes en la ventana de registros y que pudieron haber sido modificados por el usuario. 40 7. void on_button_run: es la función encargada de ejecutar el código escrito en el editor de texto hasta el final o hasta la posición indicada en el botón “Parar en”, con los valores de los registros de la ventana de registros y que pudieron haber sido modificados por el usuario. 8. void on_button_stop_position: es la función encargada de detener la ejecución del programa, envía un “1” al simulador cuando se llama a esta función con el botón “Detener”. 9. void on_button_stop_point: es la función encargada de obtener la posición de memoria donde se desea detener la ejecución del programa. 10. void close_regs y void close_win: Destruyen las ventanas de registros y de memoria respectivamente. 42 CAPITULO 4: Interfaz de Compilación y Simulación La interfaz de compilación y simulación es la encargada de relacionar la interfaz gráfica del procesador con la etapa compiladora y la de simulación, por lo tanto todo el contenido de lo que hay en la interfaz gráfica (editor de texto, registros, ventana de memoria y puertos) se puede modificar u obtener desde aquí. Para poder lograr esta interfaz, el programa recibe las variables de simulación, código fuente, versión de la CPUCR, puertos, registros e indicadores de posición cuando el usuario decide compilar el proyecto. De esta manera, se tiene en un objeto de interfaz todos los valores actuales de las variables para que el programa encargado de compilar o simular el proyecto conozca los parámetros de simulación, restricciones y demás detalles que el usuario haya seleccionado. Esta etapa contiene además, atributos y métodos que toman los valores de los parámetros de simulación para enviarlos a los diferentes widgets encargados de mostrar estos valores en pantalla. Entre los atributos de la interfaz se pueden encontrar variables que indican si el programa fue o no compilado exitosamente, la posición de la ventana de memoria que está siendo ejecutada, valor de la posición donde se desea detener el programa, registros del procesador, la ruta del archivo que contiene el código fuente, indicador de detener la ejecución, versión de la CPUCR, entre otros. Entre las funciones que se pueden encontrar en esta interfaz, se encuentran conversores de tipo de dato (de string a char* por ejemplo), funciones que generan números aleatorios (binarios y hexadecimales, en diferentes tipos y precisión). 43 Entre los métodos que se crearon en la interfaz del programa se encuentran métodos para compilar, simular y ejecutar paso a paso el programa, además de métodos que permiten recuperar los registros y variables de simulación de la clase interfaz (esto porque los atributos fueron declarados como privados). Es importante hacer la aclaración de que la interfaz gráfica solo imprime argumentos del tipo char* ó const char*, de ahí la importancia de la función “string_to_char” (encargada de convertir un string en un char*), pues los objetos utilizados para recibir los resultados de la compilación y de la simulación, retornan valores del tipo string. A continuación se muestra el contenido del texto introducido en la ventana del editor de texto, ventana de registros y ventana de memoria para dos posibles códigos introducidos por el usuario. Con esto se muestra el correcto funcionamiento del programa (interfaz gráfica y compilación). También se pretende mostrar el correcto funcionamiento de la sección de la ventana de memoria destinado a almacenar posiciones de memoria fijas para su análisis. El primer código introducido para hacer las pruebas fue: Cuadro 4.1: Primer código introducido para la sección de pruebas Código de Instrucción Valor Esperado $10 Parte Baja $45 Parte Alta $12 Código de Instrucción $64 Primer Código de Prueba lda $1245 hlt 44 Figura 4.1: Captura obtenida del resultado de la primera prueba De la comparación entre el Cuadro 4-1 y la Figura 4.1, se puede observar que los resultados esperados y los obtenidos (respectivamente) son idénticos. El segundo código introducido para hacer las pruebas fue: Cuadro 4.2: Segundo código introducido para la sección de pruebas Código de Instrucción Valor Esperado $10 Parte Baja $76 Parte Alta $98 Código de Instrucción $11 Parte Baja $32 Parte Alta $54 dca Código de Instrucción $53 hlt Código de Instrucción $64 Segundo Código de Prueba lda $9876 sta $5432 45 Figura 4.2: Captura obtenida del resultado de la primera prueba De la comparación entre el Cuadro 4.2 y la Figura 4-2 se puede observar que los resultados esperados y los obtenidos son idénticos. Además, si se compara la Figura 4-1 con la Figura 4-2 se puede observar que el contenido de la entrada de texto destinada a almacenar posiciones de memoria cambió para las posiciones de memoria $0001 a la $0009, lo cual es cierto, pues a diferencia del primer código de instrucción (lda absoluto) el contenido de las posiciones de memoria cambió. De igual modo, se comprueba que las posiciones de memoria que no tenían ningún valor asociado se les asignó un valor aleatorio. Como se mencionó en el Capítulo 3, el botón “Detener en” está diseñado para mostrar el contenido de la posición en la que se desea detener la ejecución del programa, y a su vez, enviar este valor a la etapa de interfaz. En la Figura 4.3 se muestra el botón activado con el valor de la posición 48115 en hexadecemal. Figura 4.3: Prueba al botón "Detener en". 46 Se hicieron dos pruebas para la simulación, una para la simulación completa y otra para la simulación hasta una posición de memoria específica. En la prueba de simulación completa se introdujo el código en la ventana del editor y se compiló (de manera exitosa) tal como se puede apreciar en la Figura 4-4. Figura 4.4: Ejemplo de simulación 47 Al proceder con la ejecución del programa se obtuvieron los registros del procesador que se muestran en la Figura 4-5. Figura 4.5: Registros obtenidos en simulación de prueba Donde se puede apreciar que la Pila tiene asignado un valor de $00 (se apiló el registro de estado y luego se desapiló), el contador de programa es $000f (se han avanzado 16 posiciones, desde la posición 0 a la 15, que en hexadecimal es $000f), el acumulador es $07 ($01+$01-$01+$05+$01=$07), y las banderas de estado N=0 (acumulador es positivo), V=0 (no hay rebase), I=1 (interrupción), Z=0 (el acumulador es distinto de 0) y C=0 (no hay acarreo). Lo cual es correcto, pues los valores de los registros son los esperados. La ventana de memoria se puede apreciar en la Figura 4-6. 48 Figura 4.6: Ventana de memoria en simulación de prueba La ventana de memoria presenta los códigos de instrucción y valores asociados correctos, pues son los que debería tener con el código introducido en el editor de textos (Figura 4-4). Para comprobar los valores expuestos en la ventana de memoria se puede observar el Cuadro 4.3, donde se explica el valor de cada posición correspondiente al código fuente de este ejemplo (Nota: p.b.= parte baja, p.a.= parte alta). 49 Posición $0000 $0001 $0002 $0003 $0004 $0005 $0006 $0007 $0008 $0009 $000a $000b $000c $000d $000e $000f Código Registro $00 $01 $25 $76 $11 $00 $01 $35 $20 $05 $25 $11 $10 $01 $66 $46 Instrucción LDA p.b. INA PHS STA p.b. p.a. DCA ADD p.b. INA STA p.b. p.a. PLS HLT Cuadro 4.3: Ventana de memoria del ejemplo de simulación Se utilizó el mismo código de la Figura 4-5 para la simulación hasta una posición específica de memoria, en este caso hasta la posición $0004 y se obtuvo el resultado mostrado en la Figura 4-7, de donde se puede apreciar que en efecto el contador de programa tiene el valor $0004. Del Cuadro 4.3 se puede observar que hasta la posición de memoria $0004 el acumulador tiene un valor de $01 + $01 = $02. Además, hasta la posición $0004 se apiló una vez (PHS), por lo que se incrementó en uno el puntero de pila tal como se muestra en la Figura 4-7. 50 Figura 4.7: Ventana de registros de simulación hasta posición específica de memoria. Finalmente, se hizo la prueba de simulación paso a paso. Vale la pena resaltar que por el momento se carece de un simulador paso a paso real, que muestre los verdaderos valores de los registros, puertos y de la ventana de memoria, por lo que fue necesario implementar valores aleatorios para cada registro, puerto y para cada posición de la ventana de memoria con su contenido. Estos valores aleatorios son generados en la sección de interfaz del programa, pues es allí donde el programa va a recibir los resultados de la simulación (aunque también podría hacerlo desde el módulo de registros). Al hacerlo de esta manera se consigue aproximar mucho el comportamiento real del simulador. 51 Los resultados obtenidos de la prueba de simulación paso a paso se muestran en la Figura 4.4, en la que se puede apreciar que el programa resalta la posición de memoria que está siendo ejecutada y si ésta estaba en la ventana de “Visualizar Cambios” también allí es resaltada y modificada con su nuevo contenido, los demás valores permanecen intactos. Figura 4.8: Prueba de simulación paso a paso Con estas pruebas (entre otras), se pudo comprobar que la interfaz gráfica es compatible con otros programas creados con C++ y esto la hace funcional, lo cual es muy importante pues se tiene un programa que permite escribir código fuente para la CPUCR y 52 obtener resultados de compilación y simulación idénticos a los que se obtendrían con el procesador real. Es importante recalcar que el programa se dejó previsto para que el programador lo una con la etapa de simulación paso a paso, pues al momento de la elaboración del programa no se contaba con esta parte, sin embargo el programa está previsto para recibir los resultados de la simulación paso a paso y enviarlos al respectivo objeto encargado de mostrarlo en pantalla de manera gráfica. Dentro de la clase Interfaz (archivo Interfaz.cpp), se comentó el código en una sección del método respectivo (compilar, ejecutar o ejecutar paso a paso) indicando al programador los procedimientos que debe realizar para poder unir correctamente el simulador con la interfaz gráfica de manera sencilla y desde una misma sección del programa para no tener que buscar en el resto del código las variables y Widgets que muestran esta información. Para realizar esta unión de manera exitosa, se deben de crear los objetos necesarios, los cuales son hechos por el creador de la etapa de simulación paso a paso. Una vez establecida esta conexión, la interfaz contiene el código fuente introducido por el usuario, la ruta del archivo donde se guardó el código, los valores actuales de todas las variables de simulación y registros del procesador (descritos e identificados debidamente en el código fuente del archivo Intefaz.cpp), por lo que el usuario puede disponer de esta información para unir la interfaz gráfica con esta etapa de simulación. Con los aspectos descritos anteriormente se logran cumplir los objetivos del proyecto, pues se tiene una interfaz gráfica capaz de reconocer texto y editarlo, compilarlo y mostrar resultados de simulación para las distintas versiones de la CPUCR, además de poder ejecutar la simulación paso a paso, hasta una posición específica o detenerla en algún instante preciso. También es posible compilar y ejecutar el programa con los valores de los 53 registros modificados manualmente por el usuario desde la ventana de registro y la ventana de memoria, teniendo así un programa de características similares a las del emulador EMU8086, que es lo que se pretendía con este proyecto. 52 CAPITULO 5: Conclusiones y Recomendaciones Conclusiones: • La interfaz gráfica de usuario para la CPUCR creada con bibliotecas GTK+2.0 es funcional, útil, estética y fácil de usar. • La interfaz gráfica de usuario para la CPUCR permite de manera sencilla cambiar los valores de los registros y variables del procesador. • La interfaz gráfica permite simular un programa introducido por el usuario, ya sea de manera completa, hasta una posición específica de memoria o bien simular el programa paso a paso. • Las características del procesador CPUCR se pueden emular con una interfaz gráfica de usuario creada con GTK+2.0 unido a un compilador y un simulador. • La interfaz gráfica de usuario para la CPUCR tiene características similares a las que presenta el EMU8086 para el procesador Intel 8086. • Las bibliotecas de GTK+2.0 proveen características que permiten al programador crear software con entorno gráfico que permite al usuario utilizar de manera sencilla un programa. 53 Recomendaciones: • Si se desea agregar o modificar algún botón, menú u otro elemento al programa, de debe ubicar en el archivo de código respectivo (main.cpp, Editor.cpp, Interfaz, ó Registros.cpp) e introducir el nuevo contenido, los comentarios escritos en el código fuente del programa permiten al usuario ubicar para qué sirve cada sección. • Si se quiere cambiar algún detalle del programa y se desconoce la sintaxis a utilizar, se recomienda utilizar el manual de referencia para GTK+2.0 disponible en la página de Internet de Gnome [6], además de tener conocimientos previos de programación orientada a objetos en C++. • Si durante la ejecución del programa se presenta un cierre inesperado, se puede recuperar el código fuente introducido antes del cierre siempre y cuando no se introduzca texto nuevo en la ventana del editor de textos. Para recuperar el trabajo realizado basta con abrir el archivo “Sin_Nombre.txt” creado en la carpeta donde se ejecuta el programa. • Se recomienda compilar completamente y “desde cero” el compilador, el simulador y luego la interfaz gráfica, para evitar inconvenientes en la ejecución del programa. Para esto se disponen los archivos “makefile” necesarios. • Para compilar el programa y ejecutarlo correctamente en GNU/Linux deben instalarse los paquetes, bibliotecas y aplicaciones especificados en la sección de ANEXOS de este informe o bien en la página de Internet de Gnome [6]. 53 CAPITULO 6: BIBLIOGRAFÍA Libros: 1. Gottfried Byron. “Programación en C”, Serie Schawm, 2° Edición, Editorial McGraw-Hill/Interamericana de España S.A.U, Año 1997. Páginas Web: 2. Wikipedia. “Interfaz Gráfica de Usuario”, 25 de marzo del 2009 http://es.wikipedia.org/wiki/Interfaz_gr%C3%A1fica_de_usuario 3. Wikipedia. “GTK+”, 25 de mayo del 2009 http://es.wikipedia.org/wiki/Gtk 4. Wikipedia. “Programación Orientada a Objetos”, 15 de mayo del 2009 http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos 5. Wikipedia. “Widget”, 20 de junio del 2009 http://es.wikipedia.org/wiki/Widget 6. GNOME Documentation Library. “GTK+ Reference Manual”, 26 de junio del 2009 http://library.gnome.org/devel/gtk/unstable/ 7. Diccionario Informático. “Definición de Objeto”, 28 de julio del 2009, http://www.alegsa.com.ar/Dic/objeto.php 8. The GTK+ Project. “What is GTK+”, 28 de julio del 2009, http://www.gtk.org/ 9. Package: libcairo-perl (1.061-1). “Interfaz de Perl para la biblioteca de gráficos Cairo”, 30 de julio del 2009, http://packages.debian.org/es/sid/libcairo-perl 10. Package: libpango1.0-dev (1.22.2-0ubuntu1.1). “Archivos de desarrollo para Pango”, 30 de julio del 2009, http://packages.ubunut.com/es/intrepid/libpango1.0-dev 11. Desarrolloweb.com. “Qué es Webkit”, 30 de julio del 2009, http://www.desarrolloweb.com/articulos/que-es-webkit.html 54 Trabajos Finales de Graduación: 12. Ricardo Barquero Carranza y Mauricio Guillén Torelli. “Desarrollo de un modelo sintetizable para la CPUCR de 32 bits con pipeline”. Proyecto Eléctrico, Escuela de Ingeniería Eléctrica, Universidad de Costa Rica, junio del 2008. 55 APÉNDICES Archivo Makefile para la interfaz gráfica con el compilador y el simulador #g++ -Wall -g main.cpp compiler.o memory.o parser.o scanner.o Editor.h Editor.cpp Interfaz.h Interfaz.cpp Registros.h #Registros.cpp -o CPUCR `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` # archivo make para compilar el ensamblador de la CPUCR con el compilador SOURCES = main.cpp Editor.cpp Interfaz.cpp Registros.cpp OBJS = ${SOURCES:.cpp=.o} OBJ = compiler.o memory.o parser.o scanner.o simulator.o registers.o CFLAGS = `pkg-config --cflags gtk+-2.0` LDADD = `pkg-config --libs gtk+-2.0` CC = g++ PACKAGE = CPUCR all : ${OBJS} ${CC} -o ${PACKAGE} ${OBJ} ${OBJS} ${LDADD} main.o: main.cpp Editor.h Interfaz.h Registros.h $(CC) $(CFLAGS) $(LDADD) -c -o $@ $< Editor.o : Editor.cpp Editor.h Interfaz.h Registros.h $(CC) $(CFLAGS) $(LDADD) -c -o $@ $< Interfaz.o : Interfaz.cpp Editor.h Interfaz.h Registros.h memory.hh compiler.hh $(CC) $(CFLAGS) $(LDADD) -c -o $@ $< Registros.o : Registros.cpp Editor.h Interfaz.h Registros.h compiler.hh $(CC) $(CFLAGS) $(LDADD) -c -o $@ $< .cpp.o: ${CC} ${CFLAGS} -c $< # fin del archivo 56 Archivo Makefile para el compilador y simulador PROGRAM = cpucr CXXSOURCES = sis.cc parser.cc scanner.cc compiler.cc memory.cc simulator.cc registers.cc # list of source files CXXOBJECTS = $(CXXSOURCES:.cc=.o) # expands to list of object files CXXFLAGS = -Wall CXX = g++ all: $(PROGRAM) # Link target: automatically builds its object dependencies before # executing its link command. $(PROGRAM): $(CXXOBJECTS) $(CXX) -o $@ $(CXXOBJECTS) # Object targets: rules that define objects, their dependencies, and # a list of commands for compilation. parser.cc : parser.yy bison -S lalr1.cc -o $@ $< scanner.cc : scanner.ll flex -d -o$@ $< sis.o: sis.cc compiler.hh memory.hh $(CXX) $(CXXFLAGS) -c -o $@ $< parser.o : parser.cc compiler.hh mnemonic.hh $(CXX) $(CXXFLAGS) -c -o $@ $< compiler.o : compiler.cc compiler.hh $(CXX) $(CXXFLAGS) -c -o $@ $< scanner.o : scanner.cc compiler.hh $(CXX) $(CXXFLAGS) -c -o $@ $< memory.o : memory.cc memory.hh $(CXX) $(CXXFLAGS) -c -o $@ $< simulator.o : simulator.cc simulator.hh registers.hh $(CXX) $(CXXFLAGS) -c -o $@ $< resgisters.o : registers.cc registers.hh $(CXX) $(CXXFLAGS) -c -o $@ $< # Clean target: "make -f Makefile.Linux clean" to remove unwanted objects and executables. clean: $(RM) -f $(CXXOBJECTS) $(PROGRAM) 57 Archivo Editor.h // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*************************************************************************************** Librerias y funciones a utilizar en el programa ***************************************************************************************/ #ifndef EDITOR_H #include <string.h> #include <gtk/gtk.h> // Libreria "Estandar" GTK #include <stdio.h> // Libreria para funciones basicas de C #include <stdlib.h> // Libreria que contiene la funcion Random using namespace std; class Editor{ public: int bits; gpointer user_data; char *Advert; //Nombre de la clase //se puede acceder desde el cpp //Atributo (cualidades de la clase) //Atributo que envia el codigo void create(int, gpointer, char*); void win(int, gpointer, char*); }; #endif //Metodo que esta en el archivo.cpp 58 Archivo Interfaz.h // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*************************************************************************************** Librerias y funciones a utilizar en el programa ***************************************************************************************/ #ifndef INTERFAZ_H #include <gtk/gtk.h> #include <string.h> #include <string> #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> // Librerias // Libreria que contiene la funcion Random using namespace std; class Interfaz{ // Nombre de la clase private: int compilado; int posicion_vm; // Atributos que se desean retornar // Programa compilado exitosamente // Valor de donde se esta realizando o interrumpiendo la ejecucion int detener; string vm1, vm2, vm3, vm4; string vm5, vm6, vm7, vm8; char* Adv; char* R_I; char* Port_in; char* Port_out; char* Pp; // Detener Compilacion // Primera mitad de la Ventana de memoria // Segunda mitad de la Ventana de memoria // Warnings // Registro de instrucciones // Puerto de entrada // Puerto de salida // Pila 59 char* Pa; char* PCp; char* PCa; char* Ap; char* Aa; // Contador de programa // Acumulador char* Np; char* Na; char* Vp; char* Va; char* Ip; char* Ia; char* Zp; char* Za; char* Cp; char* Ca; public: // Banderas de Estado // Metodos y otros de la clase char *ruta; const char *version; char *codigo; int Interrupcion; // Ruta del archivo donde se tiene el codigo // Version de la CPUCR, puede ser 8 o 32 // Envia el codigo escrito en el editor /*----------------- Metodos ------------------*/ void setCMPL(char*, const char*, char*, int, char*, const char*, const char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*); void setStep(char*, const char*, int, int); // Ejecuta el programa paso a paso void setRun(char*, const char*, int, int, string); int getCompilado(); // Dice si el proyecto fue compilado correctamente o no int getPosicion_VM(); // Dice la posicion que se esta ejecutando en la ventan de memoria string getVm1(); // Devuelve la ventana de memoria (bloque 1) string getVm2(); // Devuelve la ventana de memoria (bloque 2) string getVm3(); // Devuelve la ventana de memoria (bloque 3) string getVm4(); // Devuelve la ventana de memoria (bloque 4) string getVm5(); // Devuelve la ventana de memoria (bloque 1) string getVm6(); // Devuelve la ventana de memoria (bloque 2) string getVm7(); // Devuelve la ventana de memoria (bloque 3) string getVm8(); // Devuelve la ventana de memoria (bloque 4) char* getADV(); // Devuelve las advertencias char* getR_I(); // Devuelve el registro de instrucciones char* getPort_IN(); // Devuelve el puerto de entrada char* getPort_OUT(); // Devuelve el puerto de salida char* getPP(); char* getPA(); char* getPCP(); char* getPCA(); char* getAP(); char* getAA(); // Devuelve la Pila // Devuelve el Contador de Programa // Devuelve el Acumulador 60 // Devuelve las banderas de estado char* getNP(); char* getNA(); char* getVP(); char* getVA(); char* getIP(); char* getIA(); char* getZP(); char* getZA(); char* getCP(); char* getCA(); }; #endif // N // V // I // Z // C 61 Archivo Registros.h // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*************************************************************************************** Librerias y funciones a utilizar en el programa ***************************************************************************************/ #ifndef REGISTROS_H #include <string.h> #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #define CH 500 using namespace std; class Registros{ public: int bits; gpointer user_data; char *dire; // Direccion char *ppP; // Registros char *cpP; char *aaP; char *ppA; char *cpA; char *aaA; char *nnp; // Banderas char *vvp; char *iip; char *zzp; char *ccp; char *nna; char *vva; char *iia; char *zza; char *cca; // Libreria "Estandar" GTK // Libreria para funciones basicas de C // Libreria que contiene la funcion Random 62 char *vvmm1, *vvmm2, *vvmm3, *vvmm4; char *p_in; char *p_out; void create_window(int, gpointer, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*); void Ventana char*,char*, (int, gpointer, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*); //Metodo que esta en el archivo.cpp }; #endif 63 Archivo main.cpp // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /***************************************************************************************/ /*********************************** Inicio Programa*************************************/ /***************************************************************************************/ #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <time.h> #include <ctype.h> #include "Registros.h" #include "Editor.h" #include "Interfaz.h" #define SIZE_MAX 5000 #define SIZEV 680 #define SIZEH 570 #define SIZE_VM 65536 // Tamaño de la ventana de memoria, debe ser de 65536 /*--------------------------------Metodos---------------------------------*/ void cerrar(GtkWidget *widget, gpointer *data); void creditos (GtkWidget *wid, GtkWidget *win); void confirmation(GtkWidget *button, gpointer user_data); void on_button_vm_clicked (GtkButton * button, gpointer user_data); void guardado (GtkWidget *win, gpointer user_data); void guardar (char *nombre, gpointer user_data); void abrir (char *nombre, gpointer user_data, int longitud); void on_button_open_clicked (GtkButton * button, gpointer user_data); void on_button_save_clicked (GtkButton * button, gpointer user_data); void on_button_save_as_clicked (GtkButton * button, gpointer user_data); void savetemp (GtkWidget *button, gpointer user_data); void undo_redo (GtkButton * button, gpointer user_data); 64 void on_button_undo_clicked (GtkButton * button, gpointer user_data); void on_button_redo_clicked (GtkButton * button, gpointer user_data); void on_button_cut_clicked (GtkButton * button, gpointer user_data); void on_button_copy_clicked (GtkButton * button, gpointer user_data); void on_button_paste_clicked (GtkButton * button, gpointer user_data); void on_button_select_clicked (GtkButton * button, gpointer user_data); void on_button_mark_clicked (GtkButton * button, gpointer user_data); void on_button_bold_clicked (GtkButton * button, gpointer user_data); void on_button_color_clicked (GtkButton * button, gpointer user_data); void on_button_unbold_clicked (GtkButton * button, gpointer user_data); void delete_clicked (GtkButton * button, gpointer user_data); void clear_clicked (GtkButton * button, gpointer user_data); void on_button_compile_clicked (int bits, gpointer user_data); void warnings_changed (int bits, gpointer user_data); void on_button_run_clicked (int bits, gpointer user_data); void check_button_clicked(GtkButton * button, gpointer user_data); void check_button_unclicked(GtkButton * button, gpointer user_data); void pressed(GtkButton *button, gpointer user_data); void create_tags (GtkTextBuffer *buffer); char *string_to_char(string in); using namespace std; // P.o.o /*--------------------------Variables Globales---------------------------*/ char *princPila, *princPC, *princAcum; char *princN, *princV, *princI, *princZ, *princC; char *AuxPila, *AuxPC, *AuxAcum; char *AuxN, *AuxV, *AuxI, *AuxZ, *AuxC; char *advertencias, *memoria1, *memoria2, *memoria3, *memoria4, *direccion; char *Puerto_entrada, *Puerto_salida, *Registro_de_Instrucciones; char *oldtext, *currenttext; const char *versioncpucr = "8"; int saved=0, proyecto_compilado=1, un_re, act, redoactivable; int P_VM=65537; string V_M = "$0000"; /*-----------------------------------------------------------------------*/ /*************************************************************************************** */ /*****************************************Main****************************************** */ /*************************************************************************************** */ int main (int argc, char *argv[]) { gtk_init (&argc, &argv); saved = 5; Editor Editor1; // Main // Inicializacion del programa //Crea el objeto Editor 65 Editor1.win(8, NULL, advertencias); gtk_main (); return 0; // Metodo que crea la ventana del editor } /*************************************************************************************** */ /**************************************Funciones*****************************************/ /*************************************************************************************** */ /*-----------------------------------------------------------------------------------*/ /*************************************Ventanas****************************************/ /*-----------------------------------------------------------------------------------*/ void cerrar(GtkWidget *widget, gpointer *data) { gtk_main_quit(); } void creditos (GtkWidget *wid, GtkWidget *win) { GtkWidget *dialog = NULL; // Cierra el programa /*************/ // Funcion que muestra un dialogo // Declaracion de "Variables" dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Universidad de Costa Rica - Escuela de Ingenieria Electrica\nCreado por: Jairo Roldan Morales - Interfaz Grafica\nEdgar Villalobos Ortega - Compilador y Simulador\nComo Proyectos Electricos - Junio 2009\nProfesor Coordinador: Roberto Rodriguez Rodriguez"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); // Destructor del dialogo } /*************/ void guardado (GtkWidget *button, gpointer user_data) // Funcion que guada los registros de la CPUCR { GtkWidget *dialog = NULL; // Declaracion de "Variables" GtkTextBuffer *buffer; GtkTextIter start, end; int v; gchar *variables; FILE *fpt; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); variables = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); fpt = fopen("Registros.txt", "w+"); 66 fprintf (fpt, "***************************CPUCR de %s Bits***************************\n\n\n", versioncpucr); fprintf (fpt, "***REGISTROS PRINCIPALES***\n\n"); fprintf (fpt, "\nAcumulador:\n%s \n", princAcum); fprintf (fpt, "\nBanderas de Estado:\nN=%s\nV=%s\nI=%s\nZ=%s\nC=%s\n", princN, princV, princI, princZ, princC); fprintf (fpt, "\nContador de Programa:\n%s \n", princPC); fprintf (fpt, "\nPila:\n%s \n", princPila); v = atoi(versioncpucr); if(v!=8) { fprintf (fpt, "\n\n\n***REGISTROS AUXILIARES***\n\n"); fprintf (fpt, "\nAcumulador:\n%s \n", AuxAcum); fprintf (fpt, "\nBanderas de Estado:\nN=%s\nV=%s\nI=%s\nZ=%s\nC=%s\n", AuxN, AuxV, AuxI, AuxZ, AuxC); fprintf (fpt, "\nContador de Programa:\n%s \n", AuxPC); fprintf (fpt, "\nPila:\n%s \n", AuxPila); } fprintf (fpt, "\n\n\n***PUERTOS***\n\n"); fprintf (fpt, "\nPuerto de Entrada:\n%s \n", Puerto_entrada); fprintf (fpt, "\nPuerto de Salida:\n%s \n", Puerto_salida); fprintf (fpt, "\n\n\n***VARIABLES***\n\n"); fprintf (fpt, "%s\n", variables); fprintf (fpt, "\n\n\n***VENTANA DE MEMORIA***\n\n"); fprintf (fpt, "%s", memoria1); fprintf (fpt, "%s", memoria2); fprintf (fpt, "%s", memoria3); fprintf (fpt, "%s", memoria4); fprintf (fpt, "\n\n****************************FIN DE ARCHIVO****************************"); fclose(fpt); dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Registros guardados en el archivo 'Registros.txt'"); //Lo que imprime la ventana de informacion gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); // Destructor del dialogo } /*************/ void confirmation(GtkWidget *button, gpointer user_data) // Confirmacion para guardar antes de salir { GtkWidget *window, *label, *cajav, *cajah, *spacev, *spaceh; GtkWidget *button_yes, *button_no; 67 window = // Ventana emergente gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Confirmacion"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_widget_set_usize(GTK_WIDGET (window), 250, 180); cajav = gtk_vbox_new(FALSE, 20); gtk_container_add(GTK_CONTAINER(window), cajav); spacev = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(cajav), spacev); label = gtk_label_new("Desea guardar el documento \nantes de salir??"); gtk_container_add(GTK_CONTAINER(cajav), label); gtk_widget_set_usize(GTK_WIDGET (label), 250, 40); cajah = gtk_hbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(cajav), cajah); spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(cajah), spaceh); button_yes = gtk_button_new_with_label("Si"); programa gtk_container_add(GTK_CONTAINER(cajah), button_yes); gtk_widget_set_usize(GTK_WIDGET (button_yes), 50, 15); button_no = gtk_button_new_with_label("No"); gtk_container_add(GTK_CONTAINER(cajah), button_no); gtk_widget_set_usize(GTK_WIDGET (button_yes), 50, 15); // Boton para guardar el // Boton para salir sin guardar spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(cajah), spaceh); spacev = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(cajav), spacev); g_signal_connect ((gpointer) button_yes, "clicked", G_CALLBACK (on_button_save_clicked), (gpointer) user_data); g_signal_connect ((gpointer) button_yes, "released", G_CALLBACK (cerrar), NULL); g_signal_connect ((gpointer) button_no, "clicked", G_CALLBACK (cerrar), NULL); gtk_widget_show_all(window); } void warnings_changed (int bits, gpointer user_data) { 68 GtkTextBuffer *buffer; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); if(saved!=5) { gtk_text_buffer_set_text (buffer, advertencias, -1); } } /*-----------------------------------------------------------------------------------*/ /*************************************Archivos****************************************/ /*-----------------------------------------------------------------------------------*/ /*************/ void abrir (char *nombre, gpointer user_data, int longitud) // Abre un archivo y copia el contenido en { // el editor de texto GtkTextBuffer *buffer; GtkTextIter start, end; string a, c; char* s; int i, cont; FILE *fpt; el que recibio fpt = fopen(nombre, "r"); on_button_open_clicked cont = 0; fseek(fpt, 0, SEEK_END); cont = ftell(fpt); fclose(fpt); g_assert (GTK_IS_TEXT_VIEW (user_data)); texto buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); el texto del editor gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); gtk_text_buffer_get_bounds (buffer, &start, &end); gtk_text_buffer_delete (buffer, &start, &end); fpt = fopen(nombre, "r"); for(i=0; i<cont; i++) { a = getc(fpt); uno por uno c = c + a; } fclose(fpt); s = string_to_char(c); // Abre un archivo con nombre, // de la funcion // Toma la ventana del editor de // Crea un buffer conectado con // Toma los caracteres del archivo // Cierra el archivo 69 gtk_text_buffer_set_text (buffer, s, -1); archivo en // escribe el texto obtenido del return; } /*************/ void guardar (char *nombre, gpointer user_data) { GtkTextBuffer *buffer; GtkTextIter start; GtkTextIter end; gchar *textin; FILE *fpt; fpt = fopen(nombre, "w+"); g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); textin = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, TRUE); // Incluye caracteres ocultos fprintf (fpt, "%s", textin); fprintf (fpt, "\n"); fclose(fpt); return; } /*************/ void on_button_open_clicked (GtkButton * button, gpointer user_data) { GtkWidget *window, *dialog; GtkFileFilter *filter8, *filter32, *filtertxt, *filter_suported, *filter_all; int i, llevo, cont; char a; string str; FILE *fpt; filter_suported = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter_suported), "*.cp8"); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter_suported), "*.c32"); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter_suported), "*.txt"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter_suported), ("All Suported")); filter8 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter8), "*.cp8"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter8), ("*.cp8")); filter32 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter32), "*.c32"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter32), ("*.c32")); 70 filtertxt = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filtertxt), "*.txt"); gtk_file_filter_set_name (GTK_FILE_FILTER(filtertxt), ("*.txt")); filter_all = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter_all), "*"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter_all), ("All Files")); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); dialog = gtk_file_chooser_dialog_new ("Abrir", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter_suported); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter8); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter32); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filtertxt); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter_all); if (gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); str = (string)filename; direccion = string_to_char(str); saved = 3; llevo = 0; fpt = fopen(filename, "r"); cont = 0; fseek(fpt, 0, SEEK_END); cont = ftell(fpt); for(i=0; i<cont; i++) { a = getc(fpt); // Toma los caracteres del archivo uno por uno if(!isalnum(a)) { llevo = llevo + 1; } } fclose(fpt); abrir (filename, user_data, llevo-1); g_free (filename); } gtk_widget_destroy (dialog); } /*************/ void on_button_save_as_clicked (GtkButton * button, gpointer user_data) { GtkWidget *window, *dialog; 71 GtkFileFilter *filter8, *filter32, *filtertxt; filter8 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter8), "*.cp8"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter8), ("*.cp8")); filter32 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter32), "*.c32"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter32), ("*.c32")); filtertxt = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filtertxt), "*.txt"); gtk_file_filter_set_name (GTK_FILE_FILTER(filtertxt), ("*.txt")); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); dialog = gtk_file_chooser_dialog_new ("Save File", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(dialog), "Sin_Nombre.txt"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter8); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter32); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filtertxt); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); direccion = filename; saved = 2; guardar (filename, user_data); g_free (filename); } ; gtk_widget_destroy (dialog); } /*************/ void on_button_save_clicked (GtkButton * button, gpointer user_data) { GtkWidget *window, *dialog; GtkFileFilter *filter8, *filter32, *filter_all; GtkTextBuffer *buffer; GtkTextIter start; GtkTextIter end; gchar *textin; char *filename; FILE *fpt; // Toma los caracteres del archivo uno por uno 72 if(saved == 5) // Pregunta si el archivo esta en blanco { filter8 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter8), "*.cp8"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter8), ("*.cp8")); filter32 = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter32), "*.c32"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter32), ("*.c32")); filter_all = gtk_file_filter_new(); gtk_file_filter_add_pattern (GTK_FILE_FILTER(filter_all), "*"); gtk_file_filter_set_name (GTK_FILE_FILTER(filter_all), ("All Files")); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); dialog = gtk_file_chooser_dialog_new ("Save File", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(dialog), "Sin_Nombre.txt"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter_all); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter8); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter32); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); direccion = filename; fpt = fopen(filename, "w+"); g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); textin = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); fprintf (fpt, "%s", textin); fprintf (fpt, "\n"); fclose (fpt); saved = 1; } gtk_widget_destroy (dialog); } else { fpt = fopen(direccion, "w+"); g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); 73 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); textin = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); fprintf (fpt, "%s", textin); fprintf (fpt, "\n"); saved = 2; fclose(fpt); } } void savetemp (GtkWidget *button, gpointer user_data) // Funcion que muestra un dialogo { GtkTextBuffer *buffer; // Declaracion de "Variables" GtkTextIter start, end; gchar *texto; FILE *fpt; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); if( !gtk_text_iter_equal(&start, &end) ) { fpt = fopen("Sin_Nombre.txt","w+"); texto = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); fprintf (fpt, "%s", texto); fclose(fpt); } } /*-----------------------------------------------------------------------------------*/ /***************************************Menus*****************************************/ /*-----------------------------------------------------------------------------------*/ /*************/ void undo_redo (GtkButton * button, gpointer user_data) { GtkTextBuffer *buffer = NULL; GtkTextIter start, end; gchar *text; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, TRUE); if(act){ if (un_re) { oldtext = text; un_re = 0; 74 } else { currenttext = text; un_re = 1; } } act = 1; } /*************/ void on_button_undo_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *buffer = NULL; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); act = 0; if (un_re) { gtk_text_buffer_set_text (buffer, oldtext, -1); un_re = 1; } else { gtk_text_buffer_set_text (buffer, currenttext, -1); un_re = 0; } redoactivable = 1; } /*************/ void on_button_redo_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *buffer = NULL; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); act = 0; if(redoactivable) { if (!un_re) { gtk_text_buffer_set_text (buffer, oldtext, -1); un_re = 1; } else { gtk_text_buffer_set_text (buffer, currenttext, -1); un_re = 0; } redoactivable = 0; } 75 } /*************/ void delete_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (textbuffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (textbuffer), &end); gtk_text_buffer_get_bounds (textbuffer, &start, &end); gtk_text_buffer_delete (textbuffer, &start, &end); } /*************/ void clear_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end); gtk_text_buffer_select_range (textbuffer, &start, &end ); gtk_text_buffer_delete (textbuffer, &start, &end); } /*************/ void on_button_cut_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_cut_clipboard (textbuffer, gtk_clipboard_get (GDK_NONE), TRUE); } /*************/ void on_button_copy_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_copy_clipboard (textbuffer, gtk_clipboard_get (GDK_NONE)); } /*************/ void on_button_paste_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_paste_clipboard (textbuffer, gtk_clipboard_get (GDK_NONE), NULL, TRUE); } 76 /*************/ void on_button_select_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (textbuffer), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (textbuffer), &end); gtk_text_buffer_get_bounds (textbuffer, &start, &end); gtk_text_buffer_select_range (textbuffer, &start, &end ); } /*************/ void on_button_mark_clicked (GtkButton * button, gpointer user_data) reservadas del codigo { //Marca las palabaras GtkTextBuffer *buffer = NULL; // Buffer de lectura GtkTextIter start, end; // Indican la posicion de la palabra encontrada GtkTextIter iter, iter2; // Interactor que indica la posicion inicial char valores[10]; // numeros del 0 al 9 como caracteres int exit, count, numeros[10], i, v_cpucr; // Variables de condicion gboolean founda, foundm, foundw, foundb, foundfm, foundn, foundc, fi;// Para saber si se encontro la palabra const char *instrucciones[52], *instrucciones_m[52]; v_cpucr = atoi(versioncpucr); if(v_cpucr==8) { instrucciones[0] = "ADD "; instrucciones[1] = "AND "; instrucciones[2] = "BCC"; instrucciones[3] = "BCS"; instrucciones[4] = "BEQ"; instrucciones[5] = "BMI"; instrucciones[6] = "BNE"; instrucciones[7] = "BPL"; instrucciones[8] = "BVC"; instrucciones[9] = "BVS"; instrucciones[10] = "CLA"; instrucciones[11] = "CLC"; instrucciones[12] = "CLI"; instrucciones[13] = "CPA"; instrucciones[14] = "DCA"; instrucciones[15] = "HLT"; instrucciones[16] = "INA"; instrucciones[17] = "INP "; instrucciones[18] = "JMP "; 77 instrucciones[19] = "JSR "; instrucciones[20] = "LDA "; instrucciones[21] = "NOP"; instrucciones[22] = "ORA "; instrucciones[23] = "OUT "; instrucciones[24] = "PHA"; instrucciones[25] = "PHS"; instrucciones[26] = "PLA"; instrucciones[27] = "PLS"; instrucciones[28] = "ROL"; instrucciones[29] = "ROR"; instrucciones[30] = "RTI"; instrucciones[31] = "RTS"; instrucciones[32] = "SEC"; instrucciones[33] = "SEI"; instrucciones[34] = "STA "; instrucciones[35] = "SUB "; instrucciones[36] = "TAP"; instrucciones[37] = "TPA"; instrucciones_m[0] = "add "; instrucciones_m[1] = "and "; instrucciones_m[2] = "bcc"; instrucciones_m[3] = "bcs"; instrucciones_m[4] = "beq"; instrucciones_m[5] = "bmi"; instrucciones_m[6] = "bne"; instrucciones_m[7] = "bpl"; instrucciones_m[8] = "bvc"; instrucciones_m[9] = "bvs"; instrucciones_m[10] = "cla"; instrucciones_m[11] = "clc"; instrucciones_m[12] = "cli"; instrucciones_m[13] = "cpa"; instrucciones_m[14] = "dca"; instrucciones_m[15] = "hlt"; instrucciones_m[16] = "ina"; instrucciones_m[17] = "inp "; instrucciones_m[18] = "jmp "; instrucciones_m[19] = "jsr "; instrucciones_m[20] = "lda "; instrucciones_m[21] = "nop"; instrucciones_m[22] = "ora "; instrucciones_m[23] = "out "; instrucciones_m[24] = "pha"; instrucciones_m[25] = "phs"; instrucciones_m[26] = "pla"; instrucciones_m[27] = "pls"; instrucciones_m[28] = "rol"; instrucciones_m[29] = "ror"; instrucciones_m[30] = "rti"; instrucciones_m[31] = "rts"; instrucciones_m[32] = "sec"; instrucciones_m[33] = "sei"; instrucciones_m[34] = "sta "; instrucciones_m[35] = "sub "; 78 instrucciones_m[36] = "tap"; instrucciones_m[37] = "tpa"; } else { instrucciones[0] = "ADD "; instrucciones[1] = "AND "; instrucciones[2] = "BCC"; instrucciones[3] = "BCS"; instrucciones[4] = "BEQ"; instrucciones[5] = "BMI"; instrucciones[6] = "BNE"; instrucciones[7] = "BPL"; instrucciones[8] = "BVC"; instrucciones[9] = "BVS"; instrucciones[10] = "CLR"; instrucciones[11] = "CLC"; instrucciones[12] = "CLI"; instrucciones[13] = "CPL"; instrucciones[14] = "DEC"; instrucciones[15] = "HLT"; instrucciones[16] = "INC"; instrucciones[17] = "INP "; instrucciones[18] = "JMP "; instrucciones[19] = "JSR "; instrucciones[20] = "LD "; instrucciones[21] = "NOP"; instrucciones[22] = "ORA "; instrucciones[23] = "OUT "; instrucciones[24] = "PH"; instrucciones[25] = "PHS"; instrucciones[26] = "PL"; instrucciones[27] = "PLS"; instrucciones[28] = "ROL"; instrucciones[29] = "ROR"; instrucciones[30] = "RTI"; instrucciones[31] = "RTS"; instrucciones[32] = "SEC"; instrucciones[33] = "SEI"; instrucciones[34] = "ST "; instrucciones[35] = "SUB "; instrucciones[36] = "TAP"; instrucciones[37] = "TPA"; instrucciones[38] = "XOR "; instrucciones[39] = "NAND"; instrucciones[40] = "NOR"; instrucciones[41] = "XNOR"; instrucciones[42] = "ADC"; instrucciones[43] = "SBC"; instrucciones[44] = "TRP"; instrucciones[45] = "TPR"; instrucciones[46] = "BL"; instrucciones[47] = "BLE"; instrucciones[48] = "BG"; instrucciones[49] = "BGE"; 79 instrucciones[50] = "BZ"; instrucciones[51] = "BNZ"; instrucciones_m[0] = "add "; instrucciones_m[1] = "and "; instrucciones_m[2] = "bcc"; instrucciones_m[3] = "bcs"; instrucciones_m[4] = "beq"; instrucciones_m[5] = "bmi"; instrucciones_m[6] = "bne"; instrucciones_m[7] = "bpl"; instrucciones_m[8] = "bvc"; instrucciones_m[9] = "bvs"; instrucciones_m[10] = "clr"; instrucciones_m[11] = "clc"; instrucciones_m[12] = "cli"; instrucciones_m[13] = "cpl"; instrucciones_m[14] = "dec"; instrucciones_m[15] = "hlt"; instrucciones_m[16] = "inc"; instrucciones_m[17] = "inp "; instrucciones_m[18] = "jmp "; instrucciones_m[19] = "jsr "; instrucciones_m[20] = "ld "; instrucciones_m[21] = "nop"; instrucciones_m[22] = "or "; instrucciones_m[23] = "out "; instrucciones_m[24] = "ph"; instrucciones_m[25] = "phs"; instrucciones_m[26] = "pl"; instrucciones_m[27] = "pls"; instrucciones_m[28] = "rol"; instrucciones_m[29] = "ror"; instrucciones_m[30] = "rti"; instrucciones_m[31] = "rts"; instrucciones_m[32] = "sec"; instrucciones_m[33] = "sei"; instrucciones_m[34] = "st "; instrucciones_m[35] = "sub "; instrucciones_m[36] = "tap"; instrucciones_m[37] = "tpa"; instrucciones_m[38] = "xor "; instrucciones_m[39] = "nand"; instrucciones_m[40] = "xnor"; instrucciones_m[41] = "adc"; instrucciones_m[42] = "sbc"; instrucciones_m[43] = "trp"; instrucciones_m[44] = "tpr"; instrucciones_m[45] = "bl"; instrucciones_m[46] = "ble"; instrucciones_m[47] = "bg"; instrucciones_m[48] = "bge"; instrucciones_m[49] = "bz"; 80 instrucciones_m[50] = "bnz"; instrucciones_m[51] = "nor"; } /*--------------------------------------------------------------------*/ // Recupera e inicializa el buffer de escritura g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_get_end_iter (buffer, &iter2); if( !gtk_text_iter_equal(&iter, &iter2) ){ gtk_text_buffer_remove_tag_by_name (buffer, "num", &iter, &iter2); gtk_text_buffer_remove_tag_by_name (buffer, "word", &iter, &iter2); gtk_text_buffer_remove_tag_by_name (buffer, "coment", &iter, &iter2); gtk_text_buffer_remove_tag_by_name (buffer, "instruccion", &iter, &iter2);} /*--------------------------------------------------------------------*/ exit = 0; // Encuentra palabra "MACRO" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundm = gtk_text_iter_forward_search (&iter, "MACRO ", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundm) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundm = 0; } else { exit = 1; } }while(exit!=1); exit = 0; // Encuentra palabra "macro" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundm = gtk_text_iter_forward_search (&iter, "macro ", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundm) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundm = 0; } else { exit = 1; } }while(exit!=1); /*--------------------------------------------------------------------*/ exit = 0; // Encuentra palabra "WRD" 81 gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundw = gtk_text_iter_forward_search (&iter, " WRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundw = 0; } else { foundw = gtk_text_iter_forward_search (&iter, "\nWRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundw = 0; } else { exit = 1; } } }while(exit!=1); /*--------------------------------------------------------------------*/ exit = 0; // Encuentra palabra "wrd" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundw = gtk_text_iter_forward_search (&iter, " wrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundw = 0; } else { foundw = gtk_text_iter_forward_search (&iter, "\nwrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundw = 0; } else { exit = 1; } } }while(exit!=1); 82 /*--------------------------------------------------------------------*/ exit = 0; // Encuentra palabra "DBWRD" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundb = gtk_text_iter_forward_search (&iter, "DBWRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundb) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundb = 0; } else { exit = 1; } }while(exit!=1); exit = 0; // Encuentra palabra "dbwrd" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundb = gtk_text_iter_forward_search (&iter, "dbwrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundb) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundb = 0; } else { exit = 1; } }while(exit!=1); /*--------------------------------------------------------------------*/ exit = 0; // Encuentra caracter asterisco '*' gtk_text_buffer_get_start_iter (buffer, &iter); do{ founda = gtk_text_iter_forward_search (&iter, "*", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (founda) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; founda = 0; } else { exit = 1; } }while(exit!=1); 83 /*--------------------------------------------------------------------*/ exit = 0; // Encuentra caracter dollar '$' gtk_text_buffer_get_start_iter (buffer, &iter); do{ founda = gtk_text_iter_forward_search (&iter, "$", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (founda) { gtk_text_buffer_apply_tag_by_name (buffer, "num", &start, &end); iter=end; founda = 0; } else { exit = 1; } }while(exit!=1); /*--------------------------------------------------------------------*/ exit = 0; // Encuentra palabra "FINMAC" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundfm = gtk_text_iter_forward_search (&iter, "FINMAC", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundfm) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundfm = 0; } else { exit = 1; } }while(exit!=1); exit = 0; // Encuentra palabra "finmac" gtk_text_buffer_get_start_iter (buffer, &iter); do{ foundfm = gtk_text_iter_forward_search (&iter, "finmac", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundfm) { gtk_text_buffer_apply_tag_by_name (buffer, "word", &start, &end); iter=end; foundfm = 0; } else { exit = 1; } 84 }while(exit!=1); /*--------------------------------------------------------------------*/ for (i=0; i<10; i++) // Encuentra los numeros del texto { gtk_text_buffer_get_start_iter (buffer, &iter); exit = 0; do { numeros[i] = i; sprintf(valores, "%d", numeros[i]); foundn = gtk_text_iter_forward_search (&iter, valores, GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundn) { gtk_text_buffer_apply_tag_by_name (buffer, "num", &start, &end); iter=end; foundn = 0; } else { exit = 1; } }while(exit!=1); } /*--------------------------------------------------------------------*/ if(v_cpucr==8) { for (i=0; i<38; i++) // Encuentra instrucciones (MAYUSCULAS) { gtk_text_buffer_get_start_iter (buffer, &iter); exit = 0; do { fi = gtk_text_iter_forward_search (&iter,instrucciones[i],GTK_TEXT_SEARCH_VISIBLE_ONLY,&start,&end,NULL); if (fi) { gtk_text_buffer_apply_tag_by_name (buffer, "instruccion", &start, &end); iter=end; fi = 0; } else { exit = 1; } }while(exit!=1); } for (i=0; i<38; i++) // Encuentra instrucciones (minusculas) { gtk_text_buffer_get_start_iter (buffer, &iter); 85 exit = 0; do { fi = gtk_text_iter_forward_search (&iter,instrucciones_m[i],GTK_TEXT_SEARCH_VISIBLE_ONLY,&start,&end,NULL); if (fi) { gtk_text_buffer_apply_tag_by_name (buffer, "instruccion", &start, &end); iter=end; fi = 0; } else { exit = 1; } }while(exit!=1); } } else { for (i=0; i<52; i++) // Encuentra instrucciones (MAYUSCULAS) { gtk_text_buffer_get_start_iter (buffer, &iter); exit = 0; do { fi = gtk_text_iter_forward_search (&iter,instrucciones[i],GTK_TEXT_SEARCH_VISIBLE_ONLY,&start,&end,NULL); if (fi) { gtk_text_buffer_apply_tag_by_name (buffer, "instruccion", &start, &end); iter=end; fi = 0; } else { exit = 1; } }while(exit!=1); } for (i=0; i<52; i++) // Encuentra instrucciones (minusculas) { gtk_text_buffer_get_start_iter (buffer, &iter); exit = 0; do { fi = gtk_text_iter_forward_search (&iter,instrucciones_m[i],GTK_TEXT_SEARCH_VISIBLE_ONLY,&start,&end,NULL); if (fi) { gtk_text_buffer_apply_tag_by_name (buffer, "instruccion", &start, &end); iter=end; fi = 0; } else 86 { exit = 1; } }while(exit!=1); } } /*--------------------------------------------------------------------*/ exit = 0; // Encuentra los Comentarios gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_get_end_iter (buffer, &end); do{ foundc = gtk_text_iter_forward_search (&iter, ";", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundc) { if (gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL)) { gtk_text_buffer_remove_tag_by_name (buffer, "num", &start, &end); // Quita formato anterior gtk_text_buffer_remove_tag_by_name (buffer, "word", &start, &end); // Quita formato anterior gtk_text_buffer_remove_tag_by_name (buffer, "instruccion", &start, &end); // Quita formato anterior gtk_text_buffer_apply_tag_by_name (buffer, "coment", &start, &end); // Coloca formato de comentario iter=end; foundc = 0; } else { count = gtk_text_buffer_get_char_count (buffer); gtk_text_buffer_get_iter_at_offset (buffer, &end, count); gtk_text_buffer_remove_tag_by_name (buffer, "num", &start, &end); // Quita formato anterior gtk_text_buffer_remove_tag_by_name (buffer, "word", &start, &end); // Quita formato anterior gtk_text_buffer_remove_tag_by_name (buffer, "instruccion", &start, &end); // Quita formato anterior gtk_text_buffer_apply_tag_by_name (buffer, "coment", &start, &end); // Coloca formato de comentario exit = 1; } } else { exit = 1; } }while(exit!=1); } /*************/ void on_button_bold_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; 87 g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end); gtk_text_buffer_apply_tag_by_name (textbuffer, "bold", &start, &end); } /*************/ void on_button_color_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end); gtk_text_buffer_apply_tag_by_name (textbuffer, "color", &start, &end); } /*************/ void on_button_unbold_clicked (GtkButton * button, gpointer user_data) { GtkTextBuffer *textbuffer = NULL; GtkTextIter start, end; g_assert (GTK_IS_TEXT_VIEW (user_data)); textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end); gtk_text_buffer_remove_tag_by_name (textbuffer, "bold", &start, &end); gtk_text_buffer_remove_tag_by_name (textbuffer, "color", &start, &end); } /*************/ void create_tags (GtkTextBuffer * buffer) { g_assert (GTK_IS_TEXT_BUFFER (buffer)); gtk_text_buffer_create_tag (buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_create_tag (buffer, "under", "underline", PANGO_UNDERLINE_SINGLE, NULL); gtk_text_buffer_create_tag (buffer, "centrar", "justification", GTK_JUSTIFY_CENTER, NULL); gtk_text_buffer_create_tag (buffer, "color", "foreground", "green", NULL); gtk_text_buffer_create_tag (buffer, "num", "foreground", "purple", NULL); gtk_text_buffer_create_tag (buffer, "coment", "foreground", "gray", NULL); gtk_text_buffer_create_tag (buffer, "instruccion", "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_create_tag (buffer, "word", "foreground", "brown", "weight", PANGO_WEIGHT_BOLD, NULL); } 88 /*-----------------------------------------------------------------------------------*/ /**************************************Checks*****************************************/ /*-----------------------------------------------------------------------------------*/ /*************/ void check_button_clicked(GtkButton * button, gpointer user_data) { if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(user_data))) { versioncpucr = "8"; } else { versioncpucr = "32"; } } /*************/ void check_button_unclicked(GtkButton * button, gpointer user_data) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(user_data), FALSE); } void pressed(GtkButton *button, gpointer user_data) { gtk_button_set_focus_on_click (GTK_BUTTON(user_data), TRUE); } /*-----------------------------------------------------------------------------------*/ /**************************************Ejecutar***************************************/ /*-----------------------------------------------------------------------------------*/ /*************/ void on_button_compile_clicked (int bits, gpointer user_data) { GtkTextBuffer *buffer; GtkTextIter start; GtkTextIter end; char *codigo; // Variable que toma el codigo // string str1, str2, str3, str4; on_button_save_clicked(NULL, user_data); g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); escrito en el gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); como un // toma el codigo // editor de texto 89 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); // char* especificamente en la codigo = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); // variable codigo /*----------------------------------------------------------------------------------------------*/ if(saved!=5) { // str = Interfaz Interfaz1; Interfaz1.setCMPL(direccion, versioncpucr, codigo, P_VM, memoria1, Puerto_entrada, Puerto_salida, princPila, princPC, princAcum, AuxPila, AuxPC, AuxAcum, princN, princV, princI, princZ, princC, AuxN, AuxV, AuxI, AuxZ, AuxC);// Aqui le envio el codigo escrito en el editor al objeto advertencias = Interfaz1.getADV(); // Obtiene Advertencias proyecto_compilado = Interfaz1.getCompilado(); // Obtiene si el proyecto fue compilado exitosamente } } /*************/ void on_button_run_clicked (int bits, gpointer user_data) { GtkWidget *dialog; string mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8; int vb; vb = atoi(versioncpucr); if(!proyecto_compilado) { /*----------------------------------------------------------------------------------------------*/ Interfaz Interfaz2; Interfaz2.setRun(direccion, versioncpucr, 65535, 0, V_M); mem1 = Interfaz2.getVm1(); // Obtiene la Ventana de memoria mem2 = Interfaz2.getVm3(); // Obtiene la Ventana de memoria mem3 = Interfaz2.getVm5(); // Obtiene la Ventana de memoria mem4 = Interfaz2.getVm7(); // Obtiene la Ventana de memoria mem5 = Interfaz2.getVm2(); // Obtiene la Ventana de memoria mem6 = Interfaz2.getVm4(); // Obtiene la Ventana de memoria mem7 = Interfaz2.getVm6(); // Obtiene la Ventana de memoria mem8 = Interfaz2.getVm8(); // Obtiene la Ventana de memoria mem1 = mem1 + mem5; mem2 = mem2 + mem6; mem3 = mem3 + mem7; mem4 = mem4 + mem8; memoria1 = string_to_char(mem1); memoria2 = string_to_char(mem2); memoria3 = string_to_char(mem3); // Obtiene la Ventana de memoria // Obtiene la Ventana de memoria // Obtiene la Ventana de memoria 90 memoria4 = string_to_char(mem4); // Obtiene la Ventana de memoria Registro_de_Instrucciones = Interfaz2.getR_I(); // Obtiene el registro de instrucciones Puerto_entrada = Interfaz2.getPort_IN(); // Obtiene puerto de entrada Puerto_salida = Interfaz2.getPort_OUT(); // Obtiene puerto de salida princPila = Interfaz2.getPP(); princPC = Interfaz2.getPCP(); princAcum = Interfaz2.getAP(); AuxPila = Interfaz2.getPA(); AuxPC = Interfaz2.getPCA(); AuxAcum = Interfaz2.getAA(); princN = Interfaz2.getNP(); princV = Interfaz2.getVP(); princI = Interfaz2.getIP(); princZ = Interfaz2.getZP(); princC = Interfaz2.getCP(); AuxN = Interfaz2.getNA(); AuxV = Interfaz2.getVA(); AuxI = Interfaz2.getIA(); AuxZ = Interfaz2.getZA(); AuxC = Interfaz2.getCA(); // Obtiene Pila principal // Obtiene PC principal // Obtiene Acumulador principal // Obtiene Pila Auxiliar // Obtiene PC Auxiliar // Obtiene Acumulador Auxiliar // Obtiene N principal // Obtiene V principal // Obtiene I principal // Obtiene Z principal // Obtiene Z principal // Obtiene N Auxiliar // Obtiene V Auxiliar // Obtiene I Auxiliar // Obtiene Z Auxiliar // Obtiene C Auxiliar Registros Registros1; // Crea el objeto Registros Registros1.Ventana(vb, user_data, direccion, princPila, princPC, princAcum, AuxPila, AuxPC, AuxAcum, princN, princV, princI, princZ, princC, AuxN, AuxV, AuxI, AuxZ, AuxC, memoria1, memoria2, memoria3, memoria4, Puerto_entrada, Puerto_salida); // Le envia el texto recibido en la linea anterior /*----------------------------------------------------------------------------------------------*/ } else { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nDebe Compilar Exitosamente el Proyecto Antes de Ejecutarlo!!"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); } } /*************************************************************************************** **************************************************************************************** 91 ************************************ Fin De main ***************************************** **************************************************************************************** ***************************************************************************************/ 92 Archivo Editor.cpp // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*********************************************************************************/ /*********************************************************************************/ /*********************************** Inicio Editor ***********************************/ /*********************************************************************************/ /*********************************************************************************/ #include <gtk/gtk.h> #include <gdk/gdk.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <time.h> #include <ctype.h> #include "Registros.h" #include "Editor.h" #include "Interfaz.h" #define SIZE_MAX 5000 #define SIZEV 620 #define SIZEH 500 // Incluir librerias void cerrar(GtkWidget *widget,gpointer *data); // Inicializar funciones void creditos (GtkWidget *wid, GtkWidget *win); void confirmation(GtkWidget *button, gpointer user_data); void guardar (char *nombre, gpointer user_data); void abrir (char *nombre, gpointer user_data); void on_button_open_clicked (GtkButton * button, gpointer user_data); void on_button_save_clicked (GtkButton * button, gpointer user_data); void on_button_save_as_clicked (GtkButton * button, gpointer user_data); void savetemp (GtkWidget *button, gpointer user_data); void undo_redo (GtkButton * button, gpointer user_data); void on_button_undo_clicked (GtkButton * button, gpointer user_data); void on_button_redo_clicked (GtkButton * button, gpointer user_data); 93 void delete_clicked (GtkButton * button, gpointer user_data); void clear_clicked (GtkButton * button, gpointer user_data); void on_button_cut_clicked (GtkButton * button, gpointer user_data); void on_button_copy_clicked (GtkButton * button, gpointer user_data); void on_button_paste_clicked (GtkButton * button, gpointer user_data); void on_button_select_clicked (GtkButton * button, gpointer user_data); void on_button_mark_clicked (GtkButton * button, gpointer user_data); void insertion(); void on_button_bold_clicked (GtkButton * button, gpointer user_data); void on_button_color_clicked (GtkButton * button, gpointer user_data); void on_button_unbold_clicked (GtkButton * button, gpointer user_data); void on_button_compile_clicked (int bits, gpointer user_data); void warnings_changed (int bits, gpointer user_data); void on_button_run_clicked (int bits, gpointer user_data); void check_button_clicked(GtkButton * button, gpointer user_data); void check_button_unclicked(GtkButton * button, gpointer user_data); void pressed(GtkButton *button, gpointer user_data); void on_button_vm_clicked (GtkButton * button, gpointer user_data); void create_tags (GtkTextBuffer *buffer); char *string_to_char(string in); /*------------------------------------------------------------------------*/ /*--------------------------Creacion del Editor---------------------------*/ /*------------------------------------------------------------------------*/ void Editor::win(int bits, gpointer user_data, char* advertencias){ // Clase que conecta el editor this-> create (bits, user_data, advertencias); }; GtkWidget *numero_de_linea; GtkTextBuffer *buffer_editor; void Editor::create (int bits, gpointer user_data, char* advertencias) { //Declaracion de Variables GTK GtkWidget *window, *cajav, *cajah, *menu_bar; // Elementos de la Ventana Principal GtkWidget *inf, *dialog, *check1, *check2; // Casillas de verificacion para seleccionar 8 o 32 bits GtkWidget *menu_file, *file, *open, *save, *save_as, *quit; // Elementos del menu Archivo GtkWidget *menu_edit, *edit, *cut, *copy, *paste; // Elementos del menu Edicion GtkWidget *button_undo, *button_redo, *limpiar; // Boton deshacer, rehacer, y limpiar ventana GtkWidget *menu_format, *format, *color, *bold, *unbold, *sel_all; // Elementos del menu Formato GtkWidget *menu_debug, *debug, *compile, *run; // Elementos del menu Ejecutar GtkWidget *menu_acerca_de, *acerca_de, *credits; // Elementos del menu Acerca de GtkWidget *handlemenu, *handlebox, *handlelabel; // Barras de menu, de herramientas y de checks GtkWidget *toolbar; GtkWidget *button_cut,*button_copy,*button_paste; // Boton cortar, copiar y pegar GtkWidget *button_open, *button_save; // Boton Abrir y Guardar 94 GtkWidget *button_compile, *button_run; // Boton Compilar y Ejecutar GtkWidget *text, *scrolledwindow; GtkWidget *warnings, *scrolled_war; GtkTextBuffer *bufferw; // Ventana de Texto // Ventana de advertencias // Buffer para el texto mostrado y escrito /****************Ventana Principal*******************/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Ventana principal gtk_window_set_title (GTK_WINDOW (window), "Ensamblador de la CPRUCR para 8 y 32 bits"); // Titulo de la ventana gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); // Posicion de la ventana como centrada gtk_window_set_default_size (GTK_WINDOW(window), SIZEH, SIZEV); // Dimensiones "DEFAULT" de la ventana gtk_container_set_resize_mode (GTK_CONTAINER(window), GTK_RESIZE_IMMEDIATE); gtk_container_resize_children (GTK_CONTAINER(window)); gtk_container_set_reallocate_redraws (GTK_CONTAINER(window), FALSE); cajav = gtk_vbox_new(FALSE, 0); // Caja vertical para colocar la barra de menu, herramientas, texto, checks gtk_container_add(GTK_CONTAINER(window), cajav); // la caja esta contenida en la ventana gtk_container_set_resize_mode (GTK_CONTAINER(cajav), GTK_RESIZE_IMMEDIATE); gtk_container_resize_children (GTK_CONTAINER(cajav)); gtk_container_set_reallocate_redraws (GTK_CONTAINER(cajav), TRUE); handlemenu = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlemenu, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlemenu), NULL, 28); /****************Menu File*******************/ menu_bar = // Creacion de la barra de menu gtk_menu_bar_new(); gtk_container_add(GTK_CONTAINER(handlemenu), menu_bar); menu_file = gtk_menu_new(); // Se crea un menu (Archivo) file = gtk_menu_item_new_with_label("Archivo"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), menu_file); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), file); open = gtk_menu_item_new_with_label("Abrir"); // Items del menu Archivo 95 gtk_menu_append(GTK_MENU(menu_file), open); save = gtk_menu_item_new_with_label("Guardar"); gtk_menu_append(GTK_MENU(menu_file), save); save_as = gtk_menu_item_new_with_label("Guardar como"); gtk_menu_append(GTK_MENU(menu_file), save_as); quit = gtk_menu_item_new_with_label("Salir"); gtk_menu_append(GTK_MENU(menu_file), quit); /****************Menu Edit*******************/ menu_edit = gtk_menu_new(); // Se crea un menu (Edicion) edit = gtk_menu_item_new_with_label("Edicion"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit), menu_edit); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), edit); button_undo = gtk_menu_item_new_with_label("Undo"); gtk_menu_append(GTK_MENU(menu_edit), button_undo); button_redo = gtk_menu_item_new_with_label("Redo"); gtk_menu_append(GTK_MENU(menu_edit), button_redo); sel_all = gtk_menu_item_new_with_label("Seleccionar todo"); gtk_menu_append(GTK_MENU(menu_edit), sel_all); limpiar = gtk_menu_item_new_with_label("Limpiar Ventana"); gtk_menu_append(GTK_MENU(menu_edit), limpiar); cut = // Items del menu Edicion gtk_menu_item_new_with_label("Cortar"); gtk_menu_append(GTK_MENU(menu_edit), cut); copy = gtk_menu_item_new_with_label("Copiar"); gtk_menu_append(GTK_MENU(menu_edit), copy); paste = gtk_menu_item_new_with_label("Pegar"); gtk_menu_append(GTK_MENU(menu_edit), paste); 96 /****************Menu Format*******************/ menu_format = gtk_menu_new(); // Se crea un menu (Formato) format = gtk_menu_item_new_with_label("Formato"); // Items del menu Formato gtk_menu_item_set_submenu(GTK_MENU_ITEM(format), menu_format); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), format); color = gtk_menu_item_new_with_label("Color (verde)"); gtk_menu_append(GTK_MENU(menu_format), color); bold = gtk_menu_item_new_with_label("Negrita"); gtk_menu_append(GTK_MENU(menu_format), bold); unbold = gtk_menu_item_new_with_label("Borrar Formato"); gtk_menu_append(GTK_MENU(menu_format), unbold); /****************Menu Debug*******************/ menu_debug = gtk_menu_new(); // Se crea un menu (Ejecutar) debug = gtk_menu_item_new_with_label("Ejecutar"); // Items del menu Ejecutar gtk_menu_item_set_submenu(GTK_MENU_ITEM(debug), menu_debug); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), debug); compile = gtk_menu_item_new_with_label("Compilar"); gtk_menu_append(GTK_MENU(menu_debug), compile); run = gtk_menu_item_new_with_label("Ejecutar"); gtk_menu_append(GTK_MENU(menu_debug), run); /****************Menu Acerca de...*******************/ menu_acerca_de = gtk_menu_new(); // Se crea un menu (Acerca de...) acerca_de = // Items del menu Acerca de... gtk_menu_item_new_with_label("Acerca de---"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(acerca_de), menu_acerca_de); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), acerca_de); 97 credits = gtk_menu_item_new_with_label("Creditos"); gtk_menu_append(GTK_MENU(menu_acerca_de), credits); /*************Barra de herramientas**********/ handlebox = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlebox, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlebox), NULL, 65); toolbar = gtk_toolbar_new (); gtk_container_add (GTK_CONTAINER (handlebox), toolbar); // Items de la barra de herramientas button_open = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-open", "Abrir", "Abrir", NULL, NULL, -1); button_save = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-save", "Guardar", "Guardar", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); button_cut = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-cut", "Cortar", "Cortar", NULL, NULL, -1); button_copy = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-copy", "Copiar", "Copiar", NULL, NULL, -1); button_paste = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-paste", "Pegar", "Pegar", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items button_compile = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-ok", "Compilar", "Compilar", NULL, NULL, -1); button_run = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-execute", "Ejecutar", "Ejecutar", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items /****************Ventana de scroll y Texto*******************/ scrolledwindow = // Ventana con scroll gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (cajav), scrolledwindow, TRUE, TRUE, 0); text = gtk_text_view_new (); // Texto y buffer del texto gtk_container_add (GTK_CONTAINER (scrolledwindow), text); buffer_editor = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); create_tags (buffer_editor); handlelabel = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlelabel, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlelabel), NULL, 28); 98 cajah = gtk_hbox_new(FALSE, 10); gtk_container_add(GTK_CONTAINER(handlelabel), cajah); inf = // Etiqueta con texto gtk_label_new("Seleccione la cantidad de bits: "); gtk_container_add(GTK_CONTAINER(cajah), inf); check1 = gtk_check_button_new_with_label ("8 Bits");// Boton de check para seleccinar 8 bits gtk_container_add(GTK_CONTAINER(cajah), check1); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check1), TRUE); // Por default, 8 bits estara activo check2 = gtk_check_button_new_with_label ("32 Bits");// Boton de check para seleccinar 32 bits gtk_container_add(GTK_CONTAINER(cajah), check2); numero_de_linea = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(cajah), numero_de_linea); scrolled_war = // Ventana para los warnigs gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (cajav), scrolled_war, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (scrolled_war), NULL, 75); warnings = gtk_text_view_new (); // Texto y buffer para los warnings gtk_container_add (GTK_CONTAINER (scrolled_war), warnings); gtk_widget_set_usize(GTK_WIDGET (warnings), NULL, 75); bufferw = gtk_text_view_get_buffer (GTK_TEXT_VIEW (warnings)); gtk_text_buffer_set_text (bufferw, "Warnigs...", -1); /******************************Conectar elementos a Funciones*******************************/ g_signal_connect ((gpointer) window, "destroy", G_CALLBACK (cerrar), NULL); g_signal_connect ((gpointer) quit, "activate", G_CALLBACK (confirmation), (gpointer) text); g_signal_connect ((gpointer) credits, "activate", G_CALLBACK (creditos), NULL); g_signal_connect ((gpointer) open, "activate", G_CALLBACK (on_button_open_clicked), (gpointer) text); g_signal_connect ((gpointer) save, "activate", G_CALLBACK (on_button_save_clicked), (gpointer) text); g_signal_connect ((gpointer) save_as, "activate", G_CALLBACK (on_button_save_as_clicked), (gpointer) text); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) text); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) text); g_signal_connect ((gpointer) paste, "activate", G_CALLBACK (on_button_paste_clicked), (gpointer) text); g_signal_connect ((gpointer) button_undo, "activate",G_CALLBACK (on_button_undo_clicked),(gpointer) text); g_signal_connect ((gpointer) button_redo, "activate",G_CALLBACK (on_button_redo_clicked),(gpointer) text); 99 g_signal_connect ((gpointer) sel_all, "activate",G_CALLBACK (on_button_select_clicked),(gpointer) text); g_signal_connect ((gpointer) limpiar, "activate",G_CALLBACK (delete_clicked),(gpointer) text); g_signal_connect ((gpointer) color, "activate",G_CALLBACK (on_button_color_clicked),(gpointer) text); g_signal_connect ((gpointer) bold, "activate",G_CALLBACK (on_button_bold_clicked),(gpointer) text); g_signal_connect ((gpointer) unbold, "activate",G_CALLBACK (on_button_unbold_clicked),(gpointer) text); g_signal_connect ((gpointer) compile, "activate", G_CALLBACK (on_button_compile_clicked), (gpointer) text); g_signal_connect ((gpointer) compile, "activate", G_CALLBACK (warnings_changed), (gpointer) warnings); g_signal_connect ((gpointer) run, "activate", G_CALLBACK (on_button_run_clicked), (gpointer) text); g_signal_connect ((gpointer) button_open, "clicked", G_CALLBACK (on_button_open_clicked), (gpointer) text); g_signal_connect ((gpointer) button_save, "clicked", G_CALLBACK (on_button_save_clicked), (gpointer) text); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) text); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) text); g_signal_connect ((gpointer) button_paste, "clicked", G_CALLBACK (on_button_paste_clicked), (gpointer) text); g_signal_connect ((gpointer) button_compile, "clicked", G_CALLBACK (on_button_compile_clicked), (gpointer) text); g_signal_connect ((gpointer) button_compile, "released", G_CALLBACK (warnings_changed), (gpointer) warnings); g_signal_connect ((gpointer) button_run, "clicked", G_CALLBACK (on_button_run_clicked), (gpointer) text); g_signal_connect ((gpointer) button_run, "clicked", G_CALLBACK (pressed), (gpointer) button_run); g_signal_connect ((gpointer) check1, "released", G_CALLBACK (check_button_unclicked), (gpointer) check2); g_signal_connect ((gpointer) check1, "clicked", G_CALLBACK (check_button_clicked), (gpointer) check1); g_signal_connect ((gpointer) check2, "released", G_CALLBACK (check_button_unclicked), (gpointer) check1); g_signal_connect ((gpointer) check2, "clicked", G_CALLBACK (check_button_clicked), (gpointer) check1); g_signal_connect ((gpointer) check1, "released", G_CALLBACK (on_button_mark_clicked), (gpointer) text); g_signal_connect ((gpointer) check2, "released", G_CALLBACK (on_button_mark_clicked), (gpointer) text); g_signal_connect ((gpointer) buffer_editor, "changed", G_CALLBACK (on_button_mark_clicked),(gpointer) text); g_signal_connect ((gpointer) buffer_editor, "changed", G_CALLBACK (undo_redo),(gpointer) text); g_signal_connect ((gpointer) buffer_editor, "changed", G_CALLBACK (savetemp),(gpointer) text); gtk_timeout_add (200, (GtkFunction)insertion, NULL); /**************************Finalizacion del programa****************************/ gtk_widget_show_all (window); widgets de la ventana // Muestra todos los 100 dialog = gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, // Mensaje inicial GTK_BUTTONS_CLOSE, "BIENVENIDO!!!\n\nSimulador de la CPUCR para 8 bits y 32 bits");//Lo que imprime la ventana de informacion gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); } void insertion() { char s[3], *c; int i; string str, etiqueta; GtkTextIter start, end, iter; gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer_editor), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer_editor), &end); gtk_text_buffer_get_selection_bounds (buffer_editor, &iter, NULL); etiqueta = "Nº Linea: "; i = 1 + gtk_text_iter_get_line (&iter); sprintf(s, "%d", i); str = (string)s; str = etiqueta + str; c = string_to_char(str); gtk_label_set_text (GTK_LABEL(numero_de_linea), c); gtk_label_set_justify (GTK_LABEL(numero_de_linea), GTK_JUSTIFY_LEFT); } 101 Archivo Interfaz.cpp // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*************************************************************************************** **************************************************************************************** **************************Etapa de Compilación y simulacion********************************* **************************************************************************************** ***************************************************************************************/ #include "Registros.h" // Cabeceras de codigo #include "Editor.h" #include "Interfaz.h" #include "compiler.hh" #include "memory.hh" #include "simulator.hh" // Agregado #include "registers.hh" // Agregado #include <string.h> // Librerias #include <string> #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <ctype.h> #define TAMANO 16 // Utilizado para las pruebas, se puede eliminar #define SIZE_VM 65536 // Tamaño de la ventana de memoria, debe ser de 65536 int ranum(); // Metodo que genera un numero binario aleatorio del tipo int int random_num(); // Metodo que genera un numero aleatorio del tipo int char *randoble(); // Metodo que genera un numero aleatorio del tipo char* char *ran(); // Metodo que genera un numero binario aleatorio del tipo char* string randstring2(); // Metodo que genera un numero aleatorio del tipo string char *string_to_char(string in);// Metodo que convierte de string a char* int temp; /*---------------------------------------------------------------------------------------------------------*/ /*--------------------------------Clase que Compila y obtiene los resultados-------------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ 102 void Interfaz::setCMPL(char* ruta, const char* version, char* codigo, int posicion, char* mem, const char*Pto_ent, const char*Pto_sal, char*Ppila, char*Ppc, char*Pacum, char*Apila, char*Apc, char*Aacum, char*pN, char*pV, char*pI, char*pZ, char*pC, char*aN, char*aV, char*aI, char*aZ, char*aC) // Recibir datos a compilar {// Ruta del archivo, Version de la CPUCR, Codigo fuente, Posicion donde se interrumpe el programa char *mensaje; int vb; // Utilizada para devolver Warnings, que son del tipo char* // Version de bits de la CPUCR (8 o 32) /*-----------------------------------------------------------------------------------------------------------------*/ compiler compilador; memory memoria; compilador.set_memory(&memoria); compilador.parse(string (ruta) ); /*-----------------------------------------------------------------------------------------------------------------*/ this -> compilado = compilador.check_errors();// Programa pudo o no ser compilado exitosamente mensaje = string_to_char (compilador.error_to_window); this -> Adv = mensaje; // Toma los errores y los envia a Adv /*-------------------------------------------------------------------------------*/ /*-----------------Descomentar esto con los nombres correctos--------------------*/ /*-------------------------------------------------------------------------------*/ /* Nombre_clase_Simuladora Objeto1; // Crea el objeto para compilar */ /* Objeto1.Nombre_del_Metodo(ruta, vb, Interrupcion, ....); /* */ */ /* this -> Posicion_vm = Objeto1.Nombre_del_Metodo_que_retorna_variable_vm(); */ /* this -> Port_in = Objeto1.Nombre_del_Metodo_que_retorna_variable_Port_in(); */ /* this -> Port_out = Objeto1.Nombre_del_Metodo_que_retorna_variable_Port_out();*/ /* . . . */ /* . . . /* . . . */ */ /* this -> Cp = Objeto1.Nombre_del_Metodo_que_retorna_variable_Cp(); */ 103 /* this -> Ca = Objeto1.Nombre_del_Metodo_que_retorna_variable_Ca(); */ /*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/ //Eliminar a partir de esta seccion: /**/ this -> Port_in = randoble(); /**/ this -> Port_out = randoble(); /**/ /**/ this -> Pp = randoble(); // Pila /**/ this -> Pa = randoble(); /**/ this -> PCp = randoble(); /**/ this -> PCa = randoble(); /**/ this -> Ap = randoble(); /**/ this -> Aa = randoble(); /**/ /**/ this -> Np = ran(); /**/ this -> Na = ran(); /**/ this -> Vp = ran(); /**/ this -> Va = ran(); /**/ this -> Ip = ran(); /**/ this -> Ia = ran(); /**/ this -> Zp = ran(); /**/ this -> Za = ran(); /**/ this -> Cp = ran(); /**/ this -> Ca = ran(); /**///Fin de seleccion a eliminar } // Puerto de entrada // Puerto de salida // Contador de programa // Acumulador // Banderas de Estado /*---------------------------------------------------------------------------------------------------------*/ /*-----------------------Clase que Ejecuta el programa y obtiene la ventana de memoria---------------------*/ /*---------------------------------------------------------------------------------------------------------*/ void Interfaz::setRun(char* ruta, const char* version, int posicion_final, int interrumpir_ejecucion, string VALOR_V_M) { char *regs, *n, *v, *I, *z, *c, *flag; int i, vb, nn, vv, ii, zz,cc; string strS, space, dollar, equis, inp_memory, pos_memory, vector[65536]; string Registro_de_estado, get_flag_str; string str1, str2, str3, str4, str5, str6, str7, str8; string nuevo1, nuevo2, nuevo3, nuevo4, nuevo5, nuevo6, nuevo7, nuevo8; FILE *fpt; vb = atoi(version); strS="\n"; space=" "; dollar="$"; equis="x"; nuevo1=""; nuevo2=""; nuevo3=""; nuevo4=""; // vb es un int que indica la version de la CPUCR (8 o 32) 104 compiler compilador2; memory memoria2; simulator sim; // Agregado se crea el objeto simulador registers reg; // Agregado se crea el objeto de registros compilador2.set_memory(&memoria2); sim.set_memory (&memoria2); // Agregado se le pasa la memoria al simulador sim.set_registers (&reg); // Agregado sele pasan los registros al simualdor compilador2.parse( string(ruta) ); temp = 0; for(i=0; i<SIZE_VM; i++) { pos_memory = compilador2.convert_to_string(i, 16, 4); inp_memory = memoria2.read_memory(pos_memory); if(inp_memory!=equis) { vector[i] = dollar+pos_memory+space+dollar+inp_memory+strS; temp = i+1; } else { vector[i] = dollar+pos_memory+space+randstring2()+strS; } } for(i=0; i<(SIZE_VM/8); i++) { str1 = nuevo1 + vector[i]; nuevo1 = str1; str2 = nuevo2 + vector[i+(SIZE_VM/8)]; nuevo2 = str2; str3 = nuevo3 + vector[i+2*(SIZE_VM/8)]; nuevo3 = str3; str4 = nuevo4 + vector[i+3*(SIZE_VM/8)]; nuevo4 = str4; str5 = nuevo5 + vector[i+4*(SIZE_VM/8)]; nuevo5 = str5; str6 = nuevo6 + vector[i+5*(SIZE_VM/8)]; nuevo6 = str6; str7 = nuevo7 + vector[i+6*(SIZE_VM/8)]; nuevo7 = str7; str8 = nuevo8 + vector[i+7*(SIZE_VM/8)]; nuevo8 = str8; } this -> vm1 = str1; this -> vm2 = str2; this -> vm3 = str3; this -> vm4 = str4; this -> vm5 = str5; this -> vm6 = str6; this -> vm7 = str7; this -> vm8 = str8; // Ventana de memoria 105 if(posicion_final==65535) { sim.run_simulation( "0" , "0000"); } else { sim.run_simulation( "1", ( compilador2.convert_to_string(posicion_final, 16, 4) ) ); } this -> Pp = string_to_char(dollar+reg.pp_read()); // Recibe Pila this -> PCp = string_to_char(dollar+reg.pc_read()); // Recibe Contador de programa this -> Ap = string_to_char(dollar+reg.ac_read()); // Recibe Acumulador /**/ /**/ this -> Port_in = randoble(); this -> Port_out = randoble(); /**/ /**/ /**/ this -> Pa = randoble(); this -> PCa = randoble(); this -> Aa = randoble(); // Puerto de entrada // Puerto de salida this -> R_I = string_to_char(reg.ri_read()); /* Registro_de_estado = reg.rs_read(); regs = string_to_char(Registro_de_estado); fpt = fopen("status", "w+"); fprintf (fpt, "%s", regs); fclose(fpt); fpt = fopen("status", "r"); for(i=0; i<8; i++) { get_flag_str = getc(fpt); flag = string_to_char(get_flag_str); switch(i) { case 2: n = flag; break; case 4: v = flag; break; case 5: I = flag; break; case 6: z = flag; break; 106 case 7: c = flag; break; default: break; } } fclose(fpt); */ n = string_to_char( reg.bn_read() ); v = string_to_char( reg.bv_read() ); I = string_to_char( reg.bi_read() ); z = string_to_char( reg.bz_read() ); c = string_to_char( reg.bc_read() ); this -> Np = n; this -> Vp = v; this -> Ip = I; this -> Zp = z; this -> Cp = c; /**/ /**/ /**/ /**/ /**/ // Banderas de Estado this -> Na = ran(); this -> Va = ran(); this -> Ia = ran(); this -> Za = ran(); this -> Ca = ran(); } /*---------------------------------------------------------------------------------------------------------*/ /*--------------------------Clase que Ejecuta paso a paso y obtiene los resultados-------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ void Interfaz::setStep(char* ruta, const char* version, int Interrupcion, int Pos_VM) // Recibir datos para compilar paso a paso {// Ruta del archivo, Version de la CPUCR, Solicitud de interrumpir el programa ("1" interrumpe) char *mensaje; const char *error="Hubo errores en la compilacion"; // Warning opcional, indica No Exito const char *exito="Compilacion realizada exitosamente"; // Warning opcional, indica Exito int vb; string strT, str[32], strS="\n"; str[0]="$0000 "; str[1]="$0001 "; str[2]="$0002 "; str[3]="$0003 "; str[4]="$0004 "; str[5]="$0005 "; str[6]="$0006 "; str[7]="$0007 "; str[8]="$0008 "; str[9]="$0009 "; str[10]="$000a "; // Seccion de pruebas, se puede eliminar // // // // // // // // // // // 107 str[11]="$000b str[12]="$000c str[13]="$000d str[14]="$000e str[15]="$000f str[16]="$0010 str[17]="$0011 str[18]="$0012 str[19]="$0013 str[20]="$0014 str[21]="$0015 str[22]="$0016 str[23]="$0017 str[24]="$0018 str[25]="$0019 str[26]="$001a str[27]="$001b str[28]="$001c str[29]="$001d str[30]="$001e str[31]="$001f "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; // // // // // // // // // // // // // // // // // // // // // Fin de seccion de pruebas vb = atoi(version); /*-------------------------------------------------------------------------------*/ /*-----------------Descomentar esto con los nombres correctos--------------------*/ /*-------------------------------------------------------------------------------*/ /* Nombre_clase_Simuladora Objeto1; // Crea el objeto para compilar */ /* Objeto1.Nombre_del_Metodo(ruta, vb, Interrupcion); */ /* */ /* this -> compilado = Objeto1.Nombre_del_Metodo_que_retorna_variable_1(); */ /* this -> Posicion_vm = Objeto1.Nombre_del_Metodo_que_retorna_variable_2(); */ /* this -> Adv = Objeto1.Nombre_del_Metodo_que_retorna_variable_3(); */ /* . . . /* . . . /* . . . */ */ */ /* this -> Cp = Objeto1.Nombre_del_Metodo_que_retorna_variable_n-1(); */ /* this -> Ca = Objeto1.Nombre_del_Metodo_que_retorna_variable_n(); */ /*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/ compiler compilador2; memory memoria2; 108 simulator sim; // Agregado se crea el objeto simulador registers reg; // Agregado se crea el objeto de registros compilador2.set_memory(&memoria2); sim.set_memory (&memoria2); // Agregado se le pasa la memoria al simulador sim.set_registers (&reg); // Agregado sele pasan los registros al simualdor compilador2.parse( string(ruta) ); // sim.run_simulation("2","0000"); /**///Eliminar a partir de esta seccion: /**/ this -> compilado = ranum(); // Programa pudo o no ser compilado exitosamente /**///Fin de seleccion a eliminar /*Warnings Opcionales*/ /**/ if (compilado) /**/ { /**/ mensaje = (char*)exito; /**/ } /**/ /**/ else /**/ { /**/ mensaje = (char*)error; /**/ } /*Fin de Warnings Opcionales*/ /**///Eliminar a partir de esta seccion: /**/ this -> posicion_vm = random_num();// Futuramente: this -> posicion_vm = random_num()%vb; /**/ this -> Adv = mensaje; // Toma la direccion del archivo y lo almacena en Adv /**/ /**/ strT=str[posicion_vm]+randstring2()+strS; /**/ this -> vm1 = strT; // Ventana de memoria /**/ this -> Port_in = randoble(); // Puerto de entrada /**/ this -> Port_out = randoble(); // Puerto de salida /**/ /**/ this -> Pp = randoble(); // Pila /**/ this -> Pa = randoble(); /**/ this -> PCp = randoble(); // Contador de programa /**/ this -> PCa = randoble(); /**/ this -> Ap = randoble(); // Acumulador /**/ this -> Aa = randoble(); /**/ /**/ this -> Np = ran(); // Banderas de Estado /**/ this -> Na = ran(); /**/ this -> Vp = ran(); /**/ this -> Va = ran(); /**/ this -> Ip = ran(); /**/ this -> Ia = ran(); /**/ this -> Zp = ran(); /**/ this -> Za = ran(); 109 /**/ this -> Cp = ran(); /**/ this -> Ca = ran(); /**///Fin de seleccion a eliminar } /*---------------------------------------------------------------------------------------------------------*/ /*-------------------------------Clases que Devuelven los registros y memoria------------------------------*/ /*----------------------------------No modificar, funcionan perfectamente----------------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ int Interfaz::getCompilado(){ return this->compilado;} int Interfaz::getPosicion_VM(){ return this->posicion_vm;} string Interfaz::getVm1() { return this->vm1;} // Recuperar Ventana de memoria string Interfaz::getVm2() { return this->vm2;} // Recuperar Ventana de memoria string Interfaz::getVm3() { return this->vm3;} // Recuperar Ventana de memoria string Interfaz::getVm4() { return this->vm4;} // Recuperar Ventana de memoria string Interfaz::getVm5() { return this->vm5;} // Recuperar Ventana de memoria string Interfaz::getVm6() { return this->vm6;} // Recuperar Ventana de memoria string Interfaz::getVm7() { return this->vm7;} // Recuperar Ventana de memoria string Interfaz::getVm8() { return this->vm8;} // Recuperar Ventana de memoria char* Interfaz::getADV(){ return this->Adv;} // Obtiene las Advertencias si las hay char* Interfaz::getPort_IN(){ return this->Port_in;} // Recuperar valor del puerto de entrada char* Interfaz::getPort_OUT(){ return this->Port_out;} char* Interfaz::getR_I() { return this->R_I;} // Recuperar valor del puerto de salida // Devuelve el registro de instrucciones 110 char* Interfaz::getPP() { return this->Pp;} // Recuperar Pila char* Interfaz::getPA(){ return this->Pa;} char* Interfaz::getPCP(){ return this->PCp;} // Recuperar PC char* Interfaz::getPCA(){ return this->PCa;} char* Interfaz::getAP(){ return this->Ap;} // Recuperar Acumulador char* Interfaz::getAA(){ return this->Aa;} /*--------------Devuelve las banderas de estado---------------*/ char* Interfaz::getNP(){ return this->Np;} // N char* Interfaz::getNA(){ return this->Na;} char* Interfaz::getVP(){ return this->Vp;} // V char* Interfaz::getVA(){ return this->Va;} char* Interfaz::getIP(){ return this->Ip;} // I char* Interfaz::getIA(){ return this->Ia;} char* Interfaz::getZP(){ return this->Zp;} // Z char* Interfaz::getZA(){ return this->Za;} char* Interfaz::getCP(){ return this->Cp;} // C char* Interfaz::getCA(){ return this->Ca;} /*---------------------------------------------------------------------------------------------------------*/ /*------------------------------------------------Metodos--------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------*/ char *string_to_char(string in) // Convierte un string en un char* 111 { char *s; s = strdup(in.c_str()); return s; } /*--------------------------------------------*/ char *randoble() //Genera 4 numeros aleatorios { char *s; const char *prueba; int num; num = rand(); num = num % TAMANO; switch (num) { case 0: prueba = "$0000"; break; case 1: prueba = "$0001"; break; case 2: prueba = "$0002"; break; case 3: prueba = "$0003"; break; case 4: prueba = "$0004"; break; case 5: prueba = "$0005"; break; case 6: prueba = "$0006"; break; case 7: prueba = "$0007"; break; case 8: prueba = "$0008"; break; 112 case 9: prueba = "$0009"; break; case 10: prueba = "$000a"; break; case 11: prueba = "$000b"; break; case 12: prueba = "$000c"; break; case 13: prueba = "$000d"; break; case 14: prueba = "$000e"; break; case 15: prueba = "$000f"; break; } s = (char*)prueba; return s; } /*--------------------------------------------*/ char *ran() // Genera 1 numero aleatorio { char *s; const char *c; int num; num = rand(); num = num % 2; if(num){ c = "1";} else{ c = "0";} s = (char*)c; return s; } /*--------------------------------------------*/ int ranum() // Genera 1 numero binario aleatorio 113 { int num; num = rand(); num = num % 2; return num; } /*--------------------------------------------*/ int random_num() // Genera 1 numero aleatorio entre 0 y 31 { int num; num = rand(); num = num % 32; return num; } string randstring2() { string prueba; int num; num = rand(); num = num % TAMANO; switch (num) { case 0: prueba = "$00"; break; case 1: prueba = "$01"; break; case 2: prueba = "$02"; break; case 3: prueba = "$03"; break; case 4: prueba = "$04"; break; case 5: prueba = "$05"; break; case 6: // Genera 1 string aleatorio de 4 caracteres 114 prueba = "$06"; break; case 7: prueba = "$07"; break; case 8: prueba = "$08"; break; case 9: prueba = "$09"; break; case 10: prueba = "$0A"; break; case 11: prueba = "$0B"; break; case 12: prueba = "$0C"; break; case 13: prueba = "$0D"; break; case 14: prueba = "$0E"; break; case 15: prueba = "$0F"; break; } return prueba; } /*************************************************************************************** **************************************************************************************** ************************** Fin De Etapa de Compilación y simulacion ************************** **************************************************************************************** ***************************************************************************************/ 115 Archivo Registros.cpp // Copyright (c) 2009 Universidad de Costa Rica, Escuela de Ingenieria Eléctrica // Author: Jairo Alberto Roldán Morales // // This program 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 3 of the License, or // (at your option) any later version. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. /*************************************************************************************** **************************************************************************************** **********************************Ventana de Registros************************************* **************************************************************************************** ***************************************************************************************/ #include "Registros.h" #include "Editor.h" #include "Interfaz.h" #include "compiler.hh" #include <string.h> #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define CH 500 #define SIZEV 610 #define SIZEH 780 #define SIZEVM 130 columna #define MAX_VALUE 10 permitidas en la V.M. // Libreria "Estandar" GTK // Libreria para funciones basicas de C // Tamaño del texto void salidas(GtkWidget *wid, GtkWidget *win); void close (GtkWidget *widget, gpointer *data); void close_win (GtkWidget *wid, GtkWidget *win); void close_regs (GtkWidget *wid, GtkWidget *win); void creditos (GtkWidget *wid, GtkWidget *win); void confirmation(GtkWidget *button, gpointer user_data); void guardado (GtkWidget *win, gpointer user_data); void on_button_save_clicked (GtkButton * button, gpointer user_data); void on_button_stop (GtkButton * button, gpointer user_data); void on_button_stop_point (GtkButton * button, gpointer user_data); // Tamaño Vertical de la ventana // Tamaño Horizontal de la ventana // Tamaño maximo horizontal para // Tamaño maximo de constantes // Funciones a utilizar 116 void on_button_stop_position (GtkButton * button, gpointer user_data); void on_button_select_clicked (GtkButton * button, gpointer user_data); void delete_clicked (GtkButton * button, gpointer user_data); void clear_clicked (GtkButton * button, gpointer user_data); void on_button_cut_clicked (GtkButton * button, gpointer user_data); void on_button_copy_clicked (GtkButton * button, gpointer user_data); void on_button_paste_clicked (GtkButton * button, gpointer user_data); void on_button_compile (GtkButton * button, gpointer user_data); void on_button_step_clicked (GtkButton * button, gpointer user_data); void on_button_run (GtkButton * button, gpointer user_data); void on_button_mark_clicked (GtkButton * button, gpointer user_data); void create_tags (GtkTextBuffer *buffer); void changed_values(GtkButton * button, gpointer user_data); void changed_vm(GtkButton * button, gpointer user_data); void on_button_compile_clicked (int bits, gpointer user_data); void warnings_changed (int bits, gpointer user_data); void on_button_vm_clicked (GtkButton * button, gpointer user_data); void marcar (GtkTextIter prueba, gpointer user_data); void add_const (GtkButton * button, gpointer user_data); void remove_const (GtkButton * button, gpointer user_data); void clear_const (GtkButton * button, gpointer user_data); char *string_to_char(string in); /*************************************************************************************** ********************* **********************************Clase que crea la Ventana de Registros************************************* **************************************************************************************** ********************/ void Registros::Ventana(int bits, gpointer user_data, char *dire, char *ppP, char *cpP, char *aaP, char *ppA, char *cpA, char *aaA, char *nnp, char *vvp, char *iip, char *zzp, char *ccp, char *nna, char *vva, char *iia, char *zza, char *cca, char* vvmm1, char* vvmm2, char* vvmm3, char* vvmm4, char* pp_in, char* pp_out) {//tipo de retorno,nombre de la clase::metodo(char,int) this-> create_window (bits, user_data, dire, ppP, cpP, aaP, ppA, cpA, aaA, nnp, vvp, iip, zzp, ccp, nna, vva, iia, zza, cca, vvmm1, vvmm2, vvmm3, vvmm4, pp_in, pp_out); }; // Crea la ventana de registros con los datos recibidos /*--------------------------------------------Variables Globales-------------------------------------------*/ char *RprincPila, *RprincPC, *RprincAcum; char *RAuxPila, *RAuxPC, *RAuxAcum; char *RprincN, *RprincV, *RprincI, *RprincZ, *RprincC; char *RAuxN, *RAuxV, *RAuxI, *RAuxZ, *RAuxC; char *Radvertencias, *Rdireccion; char *ventana_de_memoria1, *ventana_de_memoria2, *ventana_de_memoria3, *ventana_de_memoria4; char *registro_de_instrucciones; 117 const char *puerto_in = "0000"; const char *puerto_out = "0000"; int Rversioncpucr = 8; int v_activa=0, vm_closed=0, Pos_VM=65535; int Rproyecto_compilado; int marcas_de_posicion[MAX_VALUE], linea=0; int vm_created = 0; int Detener=0, To_posicion=0; int primer_step=0; string VALOR_V_M = "$0000"; GtkWidget *text; GtkWidget *constantes; GtkTextBuffer *buffervm; GtkTextBuffer *bufferconst; // Texto de la ventana de memoria // Buffer para la ventana de memoria GtkTextBuffer *buff = NULL; GtkTextBuffer *bufferP[4]; GtkTextBuffer *bufferA[4]; GtkTextBuffer *buffer_instrucciones; // Buffer para las variables // Buffer para los registros principales // Buffer para los registros Auxiliares // Buffer para el registro de instruccciones GtkWidget *textoP[4]; GtkWidget *textoA[4]; GtkWidget *texto_instrucciones; GtkWidget *entryP[5]; GtkWidget *entryA[5]; GtkWidget *puertos[2]; // Texto de los registros Principales // Texto de los registros Auxiliares // Texto para el registro de instrucciones // Para las banderas de estado Reg. Princ. // Para las banderas de estado Reg. Aux. // Para los puertos de la CPUCR /***/ Interfaz Interfaz2; /*************************************************************************************** ********************* *******************************************Codigo Registros************************************************** **************************************************************************************** ********************/ void Registros::create_window (int bits, gpointer user_data, char*dire, char*ppP, char*cpP, char*aaP, char*ppA, char*cpA, char*aaA, char*nnp, char*vvp, char*iip, char*zzp, char*ccp, char*nna, char*vva, char*iia, char*zza, char*cca, char* vvmm1, char* vvmm2, char* vvmm3, char* vvmm4, char* pp_in, char* pp_out) { GtkWidget *window, *notebook, *page1, *page2, *page3;// Declaracion de "Variables" de gtk GtkWidget *tab1, *tab2, *tab3, *boxv, *boxA, *box_tab3; GtkWidget *cajav, *caja_v1, *caja_v2, *caja_v3, *caja_h, *caja_h2, *caja_h3; // Cajas Reg. Princ. GtkWidget *caja_v1A, *caja_v2A, *caja_v3A, *caja_hA, *caja_h2A, *caja_h3A; // Cajas Reg. Aux. GtkWidget *space_left, *space_right, *spaceh, *spacev; GtkWidget *Flags, *ven_vm, *ven_vmA; GtkWidget *label_pila, *label_status, *label_acum, *label_pc, *label_reg; // Etiquetas Reg. Princ. GtkWidget *label_pilaA, *label_statusA, *label_acumA, *label_pcA, *label_regA; // Etiquetas Reg. Aux. GtkWidget *bit, *label_bits, *label_bits2; 118 GtkWidget *menu_bar; GtkWidget *menu_file, *file, *save, *quit; GtkWidget *menu_edit, *edit, *copy, *cut, *borrar_sel, *borrar_reg; GtkWidget *menu_ver, *ver, *memoria, *puertos; GtkWidget *menu_acerca_de, *acerca_de, *credits; GtkWidget *scrolledwindowP, *scrolledwindowPC, *scrolledwindowreg; // Ventanas de Scroll Reg. Princ. GtkWidget *scrolledwindowPA, *scrolledwindowPCA, *scrolledwindowregA; // Ventanas de Scroll Reg. Aux. GtkWidget *scrolledwindowinstrucciones; GtkWidget *handlemenu, *handlebox; GtkWidget *toolbar; GtkWidget *button_mem; GtkWidget *button_save; GtkWidget *button_delete; GtkWidget *button_clear; GtkWidget *button_cut; GtkWidget *button_copy; GtkWidget *button_compile; GtkWidget *button_run; GtkWidget *button_next; GtkWidget *button_quit; // Barra de herramientas // Boton Ventana de memoria // Boton guardar // Boton borrar // Boton limpiar // Boton cortar // Boton copiar // Boton Compilar // Boton Ejecutar // Boton Siguiente // Boton Salir GtkTextIter start, end, nstart, nend; GtkTextIter iter; // Indican la posicion de la palabra encontrada // Interactor que indica la posicion inicial gchar *a, *b, *cc, *d; gchar *cpyvar; gboolean founda, foundm, foundw, foundb; // Texto introducido int i, num; int exit, count; double total; char nvizc[2]; char num_bits[2]; // Para saber si se encontro la palabra // Variables de condicion /*------------------------------------------------------------------------------------------*/ /*----------------------------------Condiciones Iniciales-----------------------------------*/ /*------------------------------------------------------------------------------------------*/ if(bits == 8){ total = pow(2, 8);} else { total = pow(2, 32); } Rversioncpucr = bits; Rproyecto_compilado = 1; vm_created = 0; ventana_de_memoria1 = vvmm1; ventana_de_memoria2 = vvmm2; ventana_de_memoria3 = vvmm3; ventana_de_memoria4 = vvmm4; puerto_in = pp_in; puerto_out = pp_out; 119 Rdireccion = dire; RprincPila = ppP; RprincPC = cpP; RprincAcum = aaP; RprincN = nnp; RprincV = vvp; RprincI = iip; RprincZ = zzp; RprincC = ccp; RAuxPila = ppA; RAuxPC = cpA; RAuxAcum = aaA; RAuxN = nna; RAuxV = vva; RAuxI = iia; RAuxZ = zza; RAuxC = cca; /*------------------------------------------------------------------------------------------*/ /*-----------------------------------Creacion de Ventana------------------------------------*/ /*------------------------------------------------------------------------------------------*/ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // Crea la Ventana de Registros gtk_window_set_title(GTK_WINDOW(window),"Registros CPUCR"); // Titulo de la ventana gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); // Posicion de la ventana gtk_widget_set_usize(GTK_WIDGET (window), SIZEH, SIZEV); // Tamaño de la ventana gtk_window_set_resizable (GTK_WINDOW (window), TRUE); // Bloquear las dimensiones de la ventana cajav = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), cajav); handlemenu = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlemenu, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlemenu), SIZEH, 28); /****************Menu File*******************/ menu_bar = menu gtk_menu_bar_new(); gtk_container_add(GTK_CONTAINER(handlemenu), menu_bar); gtk_widget_set_usize(GTK_WIDGET (menu_bar), SIZEH, 30); menu_file = gtk_menu_new(); // Creacion de la barra de 120 file = // Menu Archivo gtk_menu_item_new_with_label("Archivo"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), menu_file); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), file); save = gtk_menu_item_new_with_label("Guardar Registros"); gtk_menu_append(GTK_MENU(menu_file), save); // Item Salir quit = gtk_menu_item_new_with_label("Salir"); gtk_menu_append(GTK_MENU(menu_file), quit); // Item Salir /****************Menu Edit*******************/ menu_edit = gtk_menu_new(); edit = // Menu Edicion gtk_menu_item_new_with_label("Edicion"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit), menu_edit); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), edit); copy = gtk_menu_item_new_with_label("Copiar"); gtk_menu_append(GTK_MENU(menu_edit), copy); // Item Copiar cut = gtk_menu_item_new_with_label("Cortar"); gtk_menu_append(GTK_MENU(menu_edit), cut); // Item Cortar borrar_sel = gtk_menu_item_new_with_label("Borrar Seleccion"); gtk_menu_append(GTK_MENU(menu_edit), borrar_sel); // Item borrar seleccion borrar_reg = gtk_menu_item_new_with_label("Borrar Todos los Registros"); gtk_menu_append(GTK_MENU(menu_edit), borrar_reg); // Item borrar regstros /********************Menu Ver************************/ menu_ver = gtk_menu_new(); ver = // Menu Acerca de... gtk_menu_item_new_with_label("Ver"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(ver), menu_ver); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), ver); memoria = gtk_menu_item_new_with_label("Ventana de Memoria"); gtk_menu_append(GTK_MENU(menu_ver), memoria); // Item Creditos 121 puertos = gtk_menu_item_new_with_label("Puertos"); gtk_menu_append(GTK_MENU(menu_ver), puertos); // Item Creditos /****************Menu Acerca de...*******************/ menu_acerca_de = gtk_menu_new(); acerca_de = // Menu Acerca de... gtk_menu_item_new_with_label("Acerca de..."); gtk_menu_item_set_submenu(GTK_MENU_ITEM(acerca_de), menu_acerca_de); gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), acerca_de); credits = gtk_menu_item_new_with_label("Creditos"); gtk_menu_append(GTK_MENU(menu_acerca_de), credits); // Item Creditos /*********************************** Barra de Herramientas*******************************/ handlebox = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlebox, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlebox), SIZEH, 65); toolbar = gtk_toolbar_new (); gtk_container_add (GTK_CONTAINER (handlebox), toolbar); gtk_widget_set_usize(GTK_WIDGET (toolbar), SIZEH, 65); // Items de la barra de herramientas gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // button_undo = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-undo", NULL, NULL, NULL, NULL, -1); button_mem = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "V. M.", "Ventana de Memoria", NULL, NULL, NULL, -1); button_save = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-save", "Guardar Registros", "Pegar", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items button_delete = gtk_toolbar_insert_stock(GTK_TOOLBAR (toolbar), "gtk-delete","Borrar Ventana","Borrar Ventana",NULL,NULL,-1); button_clear = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-clear", "Borrar Selccion", "Borrar Seleccion", NULL, NULL, -1); button_cut = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-cut", "Cortar", "Cortar", NULL, NULL, -1); button_copy = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-copy", "Copiar", "Copiar", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items button_compile = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-ok", "Compilar", "Compilar", NULL, NULL, -1); button_run = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-execute", "Ejecutar", "Ejecutar", 122 NULL, NULL, -1); button_next = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-goforward","Siguiente","Siguiente",NULL,NULL,-1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items button_quit = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-quit", "Salir", "Salir", NULL, NULL, -1); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); // Espacio entre Items /*-----------------------------Creacion de pestañas----------------------------------*/ page1 = gtk_label_new("Registros"); page2 = gtk_label_new("Registro Destino"); page3 = gtk_label_new("Registro de Instrucciones"); tab1 = gtk_frame_new ("Fuente"); tab2 = gtk_frame_new ("Destino"); tab3 = gtk_frame_new ("Instrucciones"); notebook = gtk_notebook_new (); gtk_container_add (GTK_CONTAINER (cajav), notebook); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), tab1, page1); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), tab2, page2); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), tab3, page3); if(Rversioncpucr != 8){ gtk_notebook_set_tab_label_text(GTK_NOTEBOOK (notebook), tab1, "Registro Principal"); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK (notebook), tab2, "Registro Auxiliar"); gtk_frame_set_label (GTK_FRAME(tab1), "Principal"); gtk_frame_set_label (GTK_FRAME(tab2), "Auxiliar"); box_tab3 = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(tab3), box_tab3); scrolledwindowinstrucciones = // Crea una ventana de scroll para el registro de inst. gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (box_tab3), scrolledwindowinstrucciones, FALSE, FALSE, 0); texto_instrucciones = // Coloca un editor de texto en la ventana gtk_text_view_new (); // de scroll gtk_container_add (GTK_CONTAINER (scrolledwindowinstrucciones), texto_instrucciones); buffer_instrucciones = // Crea un buffer para el texto gtk_text_view_get_buffer (GTK_TEXT_VIEW (texto_instrucciones)); } else 123 { gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), 1); box_tab3 = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(tab3), box_tab3); scrolledwindowinstrucciones = // Crea una ventana de scroll para el registro de inst. gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (box_tab3), scrolledwindowinstrucciones, FALSE, FALSE, 0); texto_instrucciones = // Coloca un editor de texto en la ventana gtk_text_view_new (); // de scroll gtk_container_add (GTK_CONTAINER (scrolledwindowinstrucciones), texto_instrucciones); buffer_instrucciones = // Crea un buffer para el texto gtk_text_view_get_buffer (GTK_TEXT_VIEW (texto_instrucciones)); } /*-----------------------------------------------------------------------------------*/ /*--------------------------------Ventana Principal----------------------------------*/ /*-----------------------------------------------------------------------------------*/ /****************Creacion de columnas****************/ boxv = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(tab1), boxv); caja_h = // Creacionde una caja vertical sin espaciamiento gtk_hbox_new(FALSE, 0); // la cual es la caja "principal" gtk_container_add(GTK_CONTAINER(boxv), caja_h); // se incluye en la ventana principal space_left = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_h),space_left); la ventana // Coloca un espacio izquierdo en caja_v1 = // Creacion de caja vertical con espaciamiento gtk_vbox_new(FALSE, 4); // de 4, la cual va montada en la gtk_container_add(GTK_CONTAINER(caja_h), caja_v1); // caja principal en la primera posicion vertical gtk_widget_set_usize(GTK_WIDGET (caja_v1), SIZEVM, 420); // que va a ser la primera columna spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_h),spaceh); la columna // Coloca un espacio horizontal en caja_v2 = // Creacion de una segunda caja vertical con gtk_vbox_new(FALSE, 0); // espaciamiento 4 entre botones gtk_container_add(GTK_CONTAINER(caja_h), caja_v2); // que va en la segunda posicion de la ventana 124 gtk_widget_set_usize(GTK_WIDGET (caja_v2), SIZEVM, 440); columna) spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_h),spaceh); // vertical (segunda // Coloca el boton en la ventana caja_v3 = // Creacion de una segunda caja horizontal con gtk_vbox_new(FALSE, 10); // espaciamiento 4 entre botones gtk_container_add(GTK_CONTAINER(caja_h), caja_v3); // que va en la tercera columna vertical gtk_widget_set_usize(GTK_WIDGET (caja_v3), SIZEVM, 350); space_right = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_h),space_right); // Coloca el espacio en la ventana /***********************************************************/ /*********************Primera Columna***********************/ spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),spacev); // Crea un espaciamiento // Coloca el espacio en la columna label_pila = // Detalles de la etiqueta gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),label_pila); // Coloca la etiqueta en la columna gtk_widget_set_usize(GTK_WIDGET (label_pila), SIZEVM, 20); gtk_label_set_markup (GTK_LABEL (label_pila), "<b>PILA</b>"); // La etiqueta dice "PILA" en negrita scrolledwindowP = // Crea una ventana de scroll para la pila gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v1), scrolledwindowP, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (scrolledwindowP), SIZEVM, 185); textoP[0] = // Coloca un editor de texto en la ventana gtk_text_view_new (); // de scroll gtk_container_add (GTK_CONTAINER (scrolledwindowP), textoP[0]); gtk_widget_set_usize(GTK_WIDGET (textoP[0]), SIZEVM, 140); bufferP[0] = texto gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoP[0])); // Crea un buffer para el spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),spacev); spacev = // Crea un espaciamiento // Coloca el espacio en la columna // Crea un espaciamiento 125 vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),spacev); // Coloca el espacio en la columna label_status = // Detalles del boton gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),label_status); // Coloca la etiqueta en la ventana gtk_widget_set_usize(GTK_WIDGET (label_status), SIZEVM, 20); gtk_label_set_markup (GTK_LABEL (label_status), "<b>BANDERAS DE ESTADO</b>"); Flags = // Crea una etiqueta gtk_label_new("N V I Z C"); // con el texto N V I Z C en la parte superior gtk_container_add(GTK_CONTAINER(caja_v1),Flags); // Lo coloca en la caja vertical caja_h2 = // Crea una caja horizontal gtk_hbox_new(TRUE, 0); // sin espaciamiento entre objetos de la caja gtk_container_add(GTK_CONTAINER(caja_v1),caja_h2); for(i=0; i<5; i++) { num = rand(); num = num % 2; // Prueba para asignar valores binarios a cada // bandera de estado // Elige un numero al azar // toma el residuo de dividirlo por 2 (solo // puede ser 1 o 0) sprintf(nvizc, "%d", num); // Convierte entero a char* entryP[i] = gtk_entry_new_with_max_length (1); // Define cada espacio para cada flag gtk_entry_set_text (GTK_ENTRY(entryP[i]),nvizc); // con el contenido de la cadena nvizc gtk_container_add(GTK_CONTAINER(caja_h2), entryP[i]); la caja gtk_widget_show_all (caja_h2); } // lo coloca en la parte inferior de // vertical // Muestra todos los elementos spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1),spacev); // Crea un espaciamiento // Coloca el espacio en la columna /*********************Segunda Columna***********************/ label_pc = // Detalles de la etiqueta gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v2),label_pc); // Coloca la etiqueta en la segunda columna gtk_widget_set_usize(GTK_WIDGET (label_pc), 200, 20); gtk_label_set_markup (GTK_LABEL (label_pc), "<b>CONTADOR DE \n PROGRAMA</b>"); scrolledwindowPC = // Crea una ventan de Scroll parel PC gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v2), scrolledwindowPC, FALSE, FALSE, 0); textoP[1] = gtk_text_view_new (); // Creaccion de un texto editable para el PC 126 gtk_container_add (GTK_CONTAINER (scrolledwindowPC), textoP[1]); gtk_widget_set_usize(GTK_WIDGET (textoP[1]), SIZEVM, 300); bufferP[1] = PC gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoP[1])); // Crea un buffer para el caja_h3 = // Creacion de una caja horizontal gtk_hbox_new(FALSE, 0); // en la tercera columna gtk_container_add(GTK_CONTAINER(caja_v2), caja_h3); label_bits = version gtk_label_new("Version de"); gtk_container_add(GTK_CONTAINER(caja_h3), label_bits); sprintf(num_bits, "%d", bits); // Etiquetqa que muestra la // con la que se esta trabajando // Convierte de int a char* bit = // Detalles de la etiqueta bits gtk_label_new(num_bits); bits: 8 o 32 gtk_container_add(GTK_CONTAINER(caja_h3), bit); label_bits2 = gtk_label_new("Bits"); Version de XX Bits gtk_container_add(GTK_CONTAINER(caja_h3), label_bits2); columna // muestra la cantidad de // Completa la oracion: // que se muestra en la tercera /*********************Tercera Columna***********************/ spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3),spacev); // Crea un espaciamiento // Coloca el espacio en la columna label_acum = // Detalles de la etiqueta que dice gtk_label_new(NULL); gtk_widget_set_usize(GTK_WIDGET (label_acum), 100, 20); gtk_container_add(GTK_CONTAINER(caja_v3),label_acum); gtk_label_set_markup (GTK_LABEL (label_acum), "<b>ACUMULADOR</b>"); // "Acumulador" en negrita textoP[2] = // Crea una linea de texto para mostrar el Acum. gtk_text_view_new (); gtk_container_add (GTK_CONTAINER (caja_v3), textoP[2]); gtk_widget_set_usize(GTK_WIDGET (textoP[2]), 40, 20); bufferP[2] = Acumulador gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoP[2])); // Crea un buffer parael 127 spacev = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3),spacev); ven_vm = gtk_button_new_with_label("Ver Ventana de Memoria"); gtk_container_add(GTK_CONTAINER(caja_v3), ven_vm); spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3),spacev); // Coloca un espacio vertical en la // tercera columna // Boton para ver la ventana de memoria // Crea un espaciamiento // Coloca el espacio en la columna label_reg = // Detalles de la etiqueta que dice gtk_label_new(NULL); gtk_widget_set_usize(GTK_WIDGET (label_reg), 100, 20); gtk_container_add(GTK_CONTAINER(caja_v3),label_reg); gtk_label_set_markup (GTK_LABEL (label_reg), "<b>Variables</b>"); // "Variables" en negrita scrolledwindowreg = // Crea una ventan de Scroll parel PC gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v3), scrolledwindowreg, FALSE, FALSE, 0); textoP[3] = // Crea una linea de texto para mostrar el Acum. gtk_text_view_new (); gtk_container_add (GTK_CONTAINER (scrolledwindowreg), textoP[3]); gtk_widget_set_usize(GTK_WIDGET (textoP[3]), 60, 160); bufferP[3] = Acumulador gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoP[3])); // Crea un buffer parael spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3),spacev); // Crea un espaciamiento // lo colocaen la tercera columna /*-----------------------------------------------------------------------------------*/ /*---------------------------------Ventana Auxiliar----------------------------------*/ /*-----------------------------------------------------------------------------------*/ if(Rversioncpucr!=8) { /****************Creacion de columnas****************/ boxA = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(tab2), boxA); caja_hA = gtk_hbox_new(FALSE, 0); // Creacionde una caja vertical sin espaciamiento // la cual es la caja "principal" 128 gtk_container_add(GTK_CONTAINER(boxA), caja_hA); principal space_left = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_hA),space_left); la ventana // se incluye en la ventana // Coloca un espacio izquierdo en caja_v1A = // Creacion de caja vertical con espaciamiento gtk_vbox_new(FALSE, 4); // de 4, la cual va montada en la gtk_container_add(GTK_CONTAINER(caja_hA), caja_v1A); // caja principal en la primera posicion vertical gtk_widget_set_usize(GTK_WIDGET (caja_v1A), SIZEVM, 420); // que va a ser la primera columna spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_hA),spaceh); la columna // Coloca un espacio horizontal en caja_v2A = // Creacion de una segunda caja vertical con gtk_vbox_new(FALSE, 0); // espaciamiento 4 entre botones gtk_container_add(GTK_CONTAINER(caja_hA), caja_v2A); // que va en la segunda posicion de la ventana gtk_widget_set_usize(GTK_WIDGET (caja_v2A), SIZEVM, 440); // vertical (segunda columna) spaceh = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_hA),spaceh); // Coloca el boton en la ventana caja_v3A = // Creacion de una segunda caja horizontal con gtk_vbox_new(FALSE, 10); // espaciamiento 4 entre botones gtk_container_add(GTK_CONTAINER(caja_hA), caja_v3A); // que va en la tercera columna vertical gtk_widget_set_usize(GTK_WIDGET (caja_v3A), SIZEVM, 350); space_right = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_hA),space_right); ventana // Coloca el espacio en la /***********************************************************/ /*********************Primera Columna***********************/ spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1A),spacev); label_pilaA = gtk_label_new(NULL); // Crea un espaciamiento // Coloca el espacio en la columna // Detalles de la etiqueta 129 gtk_container_add(GTK_CONTAINER(caja_v1A),label_pilaA); columna gtk_widget_set_usize(GTK_WIDGET (label_pilaA), SIZEVM, 20); gtk_label_set_markup (GTK_LABEL (label_pilaA), "<b>PILA</b>"); en negrita // Coloca la etiqueta en la // La etiqueta dice "PILA" scrolledwindowPA = // Crea una ventana de scroll para la pila gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v1A), scrolledwindowPA, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (scrolledwindowPA), SIZEVM, 185); textoA[0] = // Coloca un editor de texto en la ventana gtk_text_view_new (); // de scroll gtk_container_add (GTK_CONTAINER (scrolledwindowPA), textoA[0]); gtk_widget_set_usize(GTK_WIDGET (textoA[0]), SIZEVM, 140); bufferA[0] = texto gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoA[0])); // Crea un buffer para el spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1A),spacev); spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1A),spacev); // Crea un espaciamiento // Coloca el espacio en la columna // Crea un espaciamiento // Coloca el espacio en la columna label_statusA = // Detalles del boton gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1A),label_statusA); // Coloca la etiqueta en la ventana gtk_widget_set_usize(GTK_WIDGET (label_statusA), SIZEVM, 20); gtk_label_set_markup (GTK_LABEL (label_statusA), "<b>BANDERAS DE ESTADO</b>"); Flags = // Crea una etiqueta gtk_label_new("N V I Z C"); // con el texto N V I Z C en la parte superior gtk_container_add(GTK_CONTAINER(caja_v1A),Flags); // Lo coloca en la caja vertical caja_h2A = // Crea una caja horizontal gtk_hbox_new(TRUE, 0); // sin espaciamiento entre objetos de la caja gtk_container_add(GTK_CONTAINER(caja_v1A),caja_h2A); for(i=0; i<5; i++) { num = rand(); num = num % 2; // Prueba para asignar valores binarios a cada // bandera de estado // Elige un numero al azar // toma el residuo de dividirlo por 2 (solo // puede ser 1 o 0) sprintf(nvizc, "%d", num); // Convierte entero a char* entryA[i] = gtk_entry_new_with_max_length (1); // Define cada espacio para cada flag gtk_entry_set_text (GTK_ENTRY(entryA[i]),nvizc); // con el contenido de la cadena nvizc 130 gtk_container_add(GTK_CONTAINER(caja_h2A), entryA[i]); la caja gtk_widget_show_all (caja_h2A); } // lo coloca en la parte inferior de // vertical // Muestra todos los elementos spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v1A),spacev); // Crea un espaciamiento // Coloca el espacio en la columna /*********************Segunda Columna***********************/ label_pcA = // Detalles de la etiqueta gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v2A),label_pcA); // Coloca la etiqueta en la segunda columna gtk_widget_set_usize(GTK_WIDGET (label_pcA), 200, 20); gtk_label_set_markup (GTK_LABEL (label_pcA), "<b>CONTADOR DE \n PROGRAMA</b>"); scrolledwindowPCA = // Crea una ventan de Scroll parel PC gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v2A), scrolledwindowPCA, FALSE, FALSE, 0); textoA[1] = // Creaccion de un texto editable para el PC gtk_text_view_new (); gtk_container_add (GTK_CONTAINER (scrolledwindowPCA), textoA[1]); gtk_widget_set_usize(GTK_WIDGET (textoA[1]), SIZEVM, 300); bufferA[1] = PC gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoA[1])); // Crea un buffer para el caja_h3A = // Creacion de una caja horizontal gtk_hbox_new(FALSE, 0); // en la tercera columna gtk_container_add(GTK_CONTAINER(caja_v2A), caja_h3A); label_bits = version gtk_label_new("Version de"); gtk_container_add(GTK_CONTAINER(caja_h3A), label_bits); sprintf(num_bits, "%d", bits); // Etiquetqa que muestra la // con la que se esta trabajando // Convierte de int a char* bit = // Detalles de la etiqueta bits gtk_label_new(num_bits); bits: 8 o 32 gtk_container_add(GTK_CONTAINER(caja_h3A), bit); label_bits2 = gtk_label_new("Bits"); // muestra la cantidad de // Completa la oracion: 131 Version de XX Bits gtk_container_add(GTK_CONTAINER(caja_h3A), label_bits2); columna // que se muestra en la tercera /*********************Tercera Columna***********************/ spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3A),spacev); // Crea un espaciamiento // Coloca el espacio en la columna label_acumA = // Detalles de la etiqueta que dice gtk_label_new(NULL); gtk_widget_set_usize(GTK_WIDGET (label_acumA), 100, 20); gtk_container_add(GTK_CONTAINER(caja_v3A),label_acumA); gtk_label_set_markup (GTK_LABEL (label_acumA), "<b>ACUMULADOR</b>"); // "Acumulador" en negrita textoA[2] = // Crea una linea de texto para mostrar el Acum. gtk_text_view_new (); gtk_container_add (GTK_CONTAINER (caja_v3A), textoA[2]); gtk_widget_set_usize(GTK_WIDGET (textoA[2]), 40, 20); bufferA[2] = Acumulador gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoA[2])); spacev = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3A),spacev); // Crea un buffer parael // Coloca un espacio vertical en la // tercera columna ven_vmA = gtk_button_new_with_label("Ver Ventana de Memoria"); // Boton para ver la ventana de memoria gtk_container_add(GTK_CONTAINER(caja_v3A), ven_vmA); spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3A),spacev); // Crea un espaciamiento // Coloca el espacio en la columna label_regA = // Detalles de la etiqueta que dice gtk_label_new(NULL); gtk_widget_set_usize(GTK_WIDGET (label_regA), 100, 20); gtk_container_add(GTK_CONTAINER(caja_v3A),label_regA); gtk_label_set_markup (GTK_LABEL (label_regA), "<b>Variables</b>"); // "Variables" en negrita scrolledwindowregA = // Crea una ventan de Scroll parel PC gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja_v3A), scrolledwindowregA, FALSE, FALSE, 0); textoA[3] = gtk_text_view_new (); // Crea una linea de texto para mostrar el Acum. 132 gtk_container_add (GTK_CONTAINER (scrolledwindowregA), textoA[3]); gtk_widget_set_usize(GTK_WIDGET (textoA[3]), 60, 160); bufferA[3] = Acumulador gtk_text_view_get_buffer (GTK_TEXT_VIEW (textoA[3])); // Crea un buffer parael spacev = vertical gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(caja_v3A),spacev); // Crea un espaciamiento // lo colocaen la tercera columna } /*---------------------------------------------------------------------------------------------------------*/ /***********************************Conectar Señales a Eventos**********************************************/ /*---------------------------------------------------------------------------------------------------------*/ // g_signal_connect ((gpointer) window, "destroy", G_CALLBACK (close_objects), NULL); g_signal_connect ((gpointer) window, "destroy", G_CALLBACK (close_regs), (gpointer) window); g_signal_connect ((gpointer) quit, "activate", G_CALLBACK (confirmation), NULL); g_signal_connect ((gpointer) credits, "activate", G_CALLBACK (creditos), NULL); g_signal_connect ((gpointer) save, "activate", G_CALLBACK (guardado), (gpointer) textoP[3]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) memoria, "activate", G_CALLBACK (on_button_vm_clicked), (gpointer) user_data); 133 g_signal_connect ((gpointer) puertos, "activate", G_CALLBACK (on_button_vm_clicked), (gpointer) user_data); g_signal_connect ((gpointer) button_save, "clicked", G_CALLBACK (guardado), (gpointer) textoP[3]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[0]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[1]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[2]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoP[3]); g_signal_connect ((gpointer) button_compile, "clicked", G_CALLBACK (on_button_compile), (gpointer) user_data); g_signal_connect ((gpointer) button_run, "clicked", G_CALLBACK (on_button_run), NULL); g_signal_connect ((gpointer) button_next, "clicked", G_CALLBACK (on_button_step_clicked), NULL); g_signal_connect ((gpointer) button_mem, "clicked", G_CALLBACK (on_button_vm_clicked), NULL); g_signal_connect ((gpointer) ven_vm, "clicked", G_CALLBACK (on_button_vm_clicked), (gpointer) user_data); g_signal_connect ((gpointer) button_quit, "clicked", G_CALLBACK (confirmation), (gpointer) user_data); g_signal_connect ((gpointer) credits, "activate",G_CALLBACK (on_button_mark_clicked),(gpointer) textoP[3]); if(Rproyecto_compilado) { g_signal_connect ((gpointer) button_next, "released", G_CALLBACK (marcar), (gpointer) text); } if(Rversioncpucr!=8) { g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) 134 textoA[0]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) borrar_reg, "activate", G_CALLBACK (delete_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) borrar_sel, "activate", G_CALLBACK (clear_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) cut, "activate", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) copy, "activate", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) button_delete, "clicked", G_CALLBACK (delete_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[1]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) button_cut, "clicked", G_CALLBACK (on_button_cut_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[0]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[1]); 135 g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[2]); g_signal_connect ((gpointer) button_copy, "clicked", G_CALLBACK (on_button_copy_clicked), (gpointer) textoA[3]); g_signal_connect ((gpointer) ven_vmA, "clicked", G_CALLBACK (on_button_vm_clicked), (gpointer) user_data); g_signal_connect ((gpointer) credits, "activate",G_CALLBACK (on_button_mark_clicked),(gpointer) textoA[3]); /* g_signal_connect ((gpointer) bufferP[0], "changed", G_CALLBACK (changed_values),(gpointer) textoP[0]); g_signal_connect ((gpointer) bufferP[1], "changed", G_CALLBACK (changed_values),(gpointer) textoP[1]); g_signal_connect ((gpointer) bufferP[2], "changed", G_CALLBACK (changed_values),(gpointer) textoP[2]); g_signal_connect ((gpointer) bufferP[3], "changed", G_CALLBACK (changed_values),(gpointer) textoP[3]); g_signal_connect ((gpointer) bufferA[0], "changed", G_CALLBACK (changed_values),(gpointer) textoA[0]); g_signal_connect ((gpointer) bufferA[1], "changed", G_CALLBACK (changed_values),(gpointer) textoA[1]); g_signal_connect ((gpointer) bufferA[2], "changed", G_CALLBACK (changed_values),(gpointer) textoA[2]); g_signal_connect ((gpointer) bufferA[3], "changed", G_CALLBACK (changed_values),(gpointer) textoA[3]); g_signal_connect ((gpointer) entryP[0], "activate", G_CALLBACK (changed_values),(gpointer) entryP[0]); g_signal_connect ((gpointer) entryP[1], "activate", G_CALLBACK (changed_values),(gpointer) entryP[1]); g_signal_connect ((gpointer) entryP[2], "activate", G_CALLBACK (changed_values),(gpointer) entryP[2]); g_signal_connect ((gpointer) entryP[3], "activate", G_CALLBACK (changed_values),(gpointer) entryP[3]); g_signal_connect ((gpointer) entryP[4], "activate", G_CALLBACK (changed_values),(gpointer) entryP[4]); g_signal_connect ((gpointer) entryA[0], "activate", G_CALLBACK (changed_values),(gpointer) entryA[0]); g_signal_connect ((gpointer) entryA[1], "activate", G_CALLBACK (changed_values),(gpointer) entryA[1]); g_signal_connect ((gpointer) entryA[2], "activate", G_CALLBACK (changed_values),(gpointer) entryA[2]); g_signal_connect ((gpointer) entryA[3], "activate", G_CALLBACK (changed_values),(gpointer) entryA[3]); g_signal_connect ((gpointer) entryA[4], "activate", G_CALLBACK (changed_values),(gpointer) entryA[4]); */ } /***************--------------------------------------------------------------------------------******************/ /***************-------------------------------Copia las variables------------------------------******************/ /***************--------------------------------------------------------------------------------******************/ g_assert (GTK_IS_TEXT_VIEW (user_data)); 136 buff = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buff), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buff), &end); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (bufferP[3]), &nstart); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); exit = 0; // Encuentra palabra "MACRO" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundm = gtk_text_iter_forward_search (&iter, "MACRO ", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundm) { count = 0; gtk_text_iter_forward_search (&start, "FINMAC", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); d = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP[3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, d, -1); gtk_text_buffer_insert (bufferP[3], &nend, "\n\n", -1); iter=end; foundm = 0; } else { exit = 1; } }while(exit!=1); exit = 0; // Encuentra palabra "macro" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundm = gtk_text_iter_forward_search (&iter, "macro ", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundm) { count = 0; gtk_text_iter_forward_search (&start, "finmac", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); d = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP[3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, d, -1); gtk_text_buffer_insert (bufferP[3], &nend, "\n\n", -1); iter=end; foundm = 0; } else { exit = 1; } 137 }while(exit!=1); exit = 0; // Encuentra caracter asterisco '*' gtk_text_buffer_get_start_iter (buff, &iter); do{ founda = gtk_text_iter_forward_search (&iter, "*", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (founda) { count = 0; gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); a = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, a, -1); iter=end; founda = 0; } else { exit = 1; gtk_text_buffer_insert (bufferP[3], &nend, "\n", -1); } }while(exit!=1); exit = 0; // Encuentra palabra "WRD" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundw = gtk_text_iter_forward_search (&iter, " WRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundw) { count = 0; gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); b = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, b, -1); iter=end; foundw = 0; } else { foundw = gtk_text_iter_forward_search (&iter, "\nWRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { 138 count = 0; gtk_text_iter_forward_search (&end, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); b = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count-1); gtk_text_buffer_insert (bufferP[3], &nend, b, -1); iter=end; foundw = 0; } else { exit = 1; } } }while(exit!=1); exit = 0; // Encuentra palabra "wrd" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundw = gtk_text_iter_forward_search (&iter, " wrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundw) { count = 0; gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); b = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, b, -1); iter=end; foundw = 0; } else { foundw = gtk_text_iter_forward_search (&iter, "\nwrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, &end, NULL); if (foundw) { count = 0; gtk_text_iter_forward_search (&end, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); b = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count-1); gtk_text_buffer_insert (bufferP[3], &nend, b, -1); iter=end; foundw = 0; } else 139 { exit = 1; } } }while(exit!=1); exit = 0; // Encuentra palabra "DBWRD" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundb = gtk_text_iter_forward_search (&iter, "DBWRD", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundb) { count = 0; gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); cc = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, cc, -1); iter=end; foundb = 0; } else { exit = 1; } }while(exit!=1); exit = 0; // Encuentra palabra "dbwrd" gtk_text_buffer_get_start_iter (buff, &iter); do{ foundb = gtk_text_iter_forward_search (&iter, "dbwrd", GTK_TEXT_SEARCH_VISIBLE_ONLY, &start, NULL, NULL); if (foundb) { count = 0; gtk_text_iter_forward_search (&start, "\n", GTK_TEXT_SEARCH_VISIBLE_ONLY, NULL, &end, NULL); cc = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buff), &start, &end, FALSE); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &nend); count = gtk_text_buffer_get_char_count (bufferP [3]); gtk_text_buffer_get_iter_at_offset (bufferP[3], &nend, count); gtk_text_buffer_insert (bufferP[3], &nend, cc, -1); iter=end; foundb = 0; } else { exit = 1; } }while(exit!=1); 140 create_tags(bufferP[3]); on_button_mark_clicked (NULL, textoP[3]); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (bufferP[3]), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (bufferP[3]), &end); cpyvar = gtk_text_buffer_get_text (bufferP[3], &start, &end, TRUE); if(Rversioncpucr!=8) { gtk_text_buffer_set_text (bufferA[3], cpyvar, -1); create_tags(bufferA[3]); on_button_mark_clicked (NULL, textoA[3]); } /***************------------------------Ver Resultados y Objetos----------------------------******************/ gtk_text_buffer_set_text (bufferP[0], ppP, -1); // Registros Principales gtk_text_buffer_set_text (bufferP[1], cpP, -1); gtk_text_buffer_set_text (bufferP[2], aaP, -1); gtk_entry_set_text (GTK_ENTRY(entryP[0]),nnp); gtk_entry_set_text (GTK_ENTRY(entryP[1]),vvp); gtk_entry_set_text (GTK_ENTRY(entryP[2]),iip); gtk_entry_set_text (GTK_ENTRY(entryP[3]),zzp); gtk_entry_set_text (GTK_ENTRY(entryP[4]),ccp); if(Rversioncpucr!=8) { gtk_text_buffer_set_text (bufferA[0], ppA, -1); gtk_text_buffer_set_text (bufferA[1], cpA, -1); gtk_text_buffer_set_text (bufferA[2], aaA, -1); gtk_entry_set_text (GTK_ENTRY(entryA[0]),nna); gtk_entry_set_text (GTK_ENTRY(entryA[1]),vva); gtk_entry_set_text (GTK_ENTRY(entryA[2]),iia); gtk_entry_set_text (GTK_ENTRY(entryA[3]),zza); gtk_entry_set_text (GTK_ENTRY(entryA[4]),cca); } gtk_widget_show_all (window); // Muestra todos los elementos de la vewntana de Registros } /*---------------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ /********************************************** METODOS **********************************************/ /*---------------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/ /********************************Ventana de memoria***********************************/ 141 /*-----------------------------------------------------------------------------------*/ /*************/ void on_button_vm_clicked (GtkButton * button, gpointer user_data) { GtkWidget *window, *scrolled; GtkWidget *cajah, *caja, *cajah2, *cajah3, *cajah4, *cajav, *cajav2, *cajav3, *handletitle, *handlelabel; GtkWidget *label, *titulo, *l_in, *l_out; GtkWidget *button_add, *button_remove, *button_clear, *button_compile, *button_step, *button_run; GtkWidget *button_position, *button_stop, *stop_position, *c_h; // Boton para seleccionar la posicion donde detenerse GtkTextIter start, end; vm_created = 1; vm_closed = 1; linea = 0; window = // Ventana principal de la ventana de memoria gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Ventana de Memoria"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_widget_set_usize(GTK_WIDGET (window), 480, 520); cajah = gtk_hbox_new(TRUE, 10); gtk_container_add(GTK_CONTAINER(window), cajah); gtk_container_set_border_width (GTK_CONTAINER(cajah), 10); caja = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(cajah), caja); handletitle = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (caja), handletitle, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handletitle), 200, 36); titulo = gtk_label_new("Posicion Valor "); gtk_container_add (GTK_CONTAINER (handletitle), titulo); scrolled = // Ventana de memoria gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (caja), scrolled, TRUE, TRUE, 0); gtk_container_resize_children (GTK_CONTAINER(scrolled)); text = gtk_text_view_new (); // Texto de la ventana de memoria gtk_container_add (GTK_CONTAINER (scrolled), text); gtk_widget_set_usize(GTK_WIDGET (text), 225, 465); cajav = gtk_vbox_new(FALSE, 20); gtk_container_add(GTK_CONTAINER(cajah), cajav); 142 handlelabel = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (cajav), handlelabel, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET (handlelabel), 200, 36); label = gtk_label_new("Visualizar Cambios\nPosicion Valor"); gtk_container_add (GTK_CONTAINER (handlelabel), label); constantes = gtk_text_view_new (); // Texto y buffer para los warnings gtk_container_add (GTK_CONTAINER (cajav), constantes); gtk_widget_set_usize(GTK_WIDGET (constantes), 225, 170); cajah2 = gtk_hbox_new(TRUE, 5); gtk_container_add(GTK_CONTAINER(cajav), cajah2); button_add = gtk_button_new_with_label("Agregar"); // Boton para ver la ventana de memoria gtk_container_add(GTK_CONTAINER(cajah2), button_add); button_remove = gtk_button_new_with_label("Quitar"); // Boton para ver la ventana de memoria gtk_container_add(GTK_CONTAINER(cajah2), button_remove); button_clear = gtk_button_new_with_label("Limpiar"); // Boton para ver la ventana de memoria gtk_container_add(GTK_CONTAINER(cajah2), button_clear); cajah4 = gtk_hbox_new(TRUE, 5); gtk_container_add(GTK_CONTAINER(cajav), cajah4); button_compile = gtk_button_new_with_label("Compilar"); // Boton para Compilar desde la ventana de memoria gtk_container_add(GTK_CONTAINER(cajah4), button_compile); button_run = gtk_button_new_with_label("Ejecutar"); // Boton para Ejecutar todo desde la ventana de memoria gtk_container_add(GTK_CONTAINER(cajah4), button_run); button_step = gtk_button_new_with_label("Siguiente"); // Boton para Ejecutar paso a paso ventana de memoria gtk_container_add(GTK_CONTAINER(cajah4), button_step); c_h = gtk_hbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(cajav), c_h); stop_position = gtk_toggle_button_new_with_label ("Parar en");; gtk_container_add(GTK_CONTAINER(c_h), stop_position); 143 button_position = gtk_spin_button_new_with_range (0, 65535, 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON(button_position), 65535); gtk_container_add(GTK_CONTAINER(c_h), button_position); button_stop = gtk_button_new_with_label ("Detener"); // Boton para detener Ejecucion desde la ventana de memoria gtk_container_add(GTK_CONTAINER(c_h), button_stop); cajah3 = gtk_hbox_new(TRUE, 10); gtk_container_add(GTK_CONTAINER(cajav), cajah3); cajav2 = gtk_vbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(cajah3), cajav2); puertos[0] = gtk_entry_new_with_max_length (8); // Puerto de entrada gtk_container_add(GTK_CONTAINER(cajav2), puertos[0]); l_in = gtk_label_new("Puerto de\nEntrada"); gtk_container_add (GTK_CONTAINER (cajav2), l_in); cajav3 = gtk_vbox_new(TRUE, 10); gtk_container_add(GTK_CONTAINER(cajah3), cajav3); puertos[1] = gtk_entry_new_with_max_length (8); // Puerto de salida gtk_container_add(GTK_CONTAINER(cajav3), puertos[1]); l_out = gtk_label_new("Puerto de\nSalida"); gtk_container_add (GTK_CONTAINER (cajav3), l_out); buffervm = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); // contenido de la ventana de memoria bufferconst = gtk_text_view_get_buffer (GTK_TEXT_VIEW (constantes)); gtk_text_buffer_set_text (buffervm, ventana_de_memoria1, -1); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_insert (buffervm, &end, ventana_de_memoria2, -1); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_insert (buffervm, &end, ventana_de_memoria3, -1); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_insert (buffervm, &end, ventana_de_memoria4, -1); gtk_entry_set_text (GTK_ENTRY(puertos[0]), puerto_in);// Le asigna el valor del puerto de entrada gtk_entry_set_text (GTK_ENTRY(puertos[1]), puerto_out);// Le asigna el valor del puerto de salida create_tags(buffervm); create_tags(bufferconst); gtk_text_buffer_get_start_iter (buffervm, &start); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_apply_tag_by_name (buffervm, "centrar", &start, &end); 144 g_signal_connect ((gpointer) button_add, "clicked", G_CALLBACK (add_const), (gpointer) text); g_signal_connect ((gpointer) button_remove, "clicked", G_CALLBACK (remove_const), (gpointer) constantes); g_signal_connect ((gpointer) button_clear, "clicked", G_CALLBACK (clear_const), (gpointer) constantes); g_signal_connect ((gpointer) button_compile, "clicked", G_CALLBACK (on_button_compile), (gpointer) user_data); g_signal_connect ((gpointer) button_run, "clicked", G_CALLBACK (on_button_run), NULL); g_signal_connect ((gpointer) button_step, "clicked", G_CALLBACK (on_button_step_clicked), (gpointer) text); g_signal_connect ((gpointer) button_step, "released", G_CALLBACK (marcar), (gpointer) text); g_signal_connect ((gpointer) button_stop, "clicked", G_CALLBACK (on_button_stop), (gpointer)button_stop); g_signal_connect ((gpointer) stop_position, "clicked", G_CALLBACK (on_button_stop_position), (gpointer)stop_position); g_signal_connect ((gpointer) button_position,"value_changed",G_CALLBACK (on_button_stop_point),(gpointer)button_position); g_signal_connect ((gpointer) button_position,"value_changed",G_CALLBACK(on_button_stop_position),(gpointer)stop_position); g_signal_connect ((gpointer) window, "destroy", G_CALLBACK (close_win), (gpointer) window); gtk_widget_show_all(window); } /*-----------------------------------------------------------------------------------*/ /*********************************Marcar Posiciones***********************************/ /*-----------------------------------------------------------------------------------*/ void marcar (GtkTextIter prueba, gpointer user_data) { GtkTextIter start, end; int count; if(vm_created) { if(Rproyecto_compilado) { gtk_text_buffer_get_start_iter (buffervm, &start); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_remove_tag_by_name (buffervm, "under", &start, &end); gtk_text_buffer_remove_tag_by_name (buffervm, "bold", &start, &end); gtk_text_buffer_remove_tag_by_name (buffervm, "instruccion", &start, &end); gtk_text_buffer_get_iter_at_line (buffervm, &start, Pos_VM); gtk_text_buffer_get_iter_at_line (buffervm, &end, Pos_VM+1); count = gtk_text_buffer_get_line_count (buffervm); if(count==Pos_VM+1){ gtk_text_buffer_get_end_iter (buffervm, &end);} gtk_text_buffer_place_cursor (buffervm, &start); gtk_text_buffer_apply_tag_by_name (buffervm, "under", &start, &end); gtk_text_buffer_apply_tag_by_name (buffervm, "bold", &start, &end); gtk_text_buffer_apply_tag_by_name (buffervm, "instruccion", &start, &end); gtk_text_buffer_apply_tag_by_name (buffervm, "centrar", &start, &end); } 145 } } /*-----------------------------------------------------------------------------------*/ /********************************Agregar Posiciones***********************************/ /*-----------------------------------------------------------------------------------*/ void add_const (GtkButton * button, gpointer user_data) { GtkWidget *dialog; GtkTextIter start, iter, iter2, end, final; GtkTextBuffer *buffer; gchar *textin; int posicion_iter, count; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter (buffer, &iter2); gtk_text_buffer_get_selection_bounds (buffer, &iter2, NULL); posicion_iter = gtk_text_iter_get_line (&iter2); marcas_de_posicion[linea] = posicion_iter; linea = linea + 1; gtk_text_buffer_get_start_iter (buffer, &start); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_remove_tag_by_name (buffer, "under", &start, &end); gtk_text_buffer_remove_tag_by_name (buffer, "bold", &start, &end); gtk_text_buffer_remove_tag_by_name (buffer, "coment", &start, &end); gtk_text_buffer_get_selection_bounds (buffer, &iter, NULL); posicion_iter = gtk_text_iter_get_line (&iter); gtk_text_buffer_get_iter_at_line (buffer, &start, posicion_iter); gtk_text_buffer_get_iter_at_line (buffer, &end, posicion_iter+1); count = gtk_text_buffer_get_line_count (buffer); if(count==posicion_iter+1){ gtk_text_buffer_get_end_iter (buffer, &end);} textin = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, TRUE); gtk_text_buffer_get_end_iter (bufferconst, &final); gtk_text_buffer_insert (bufferconst, &final, textin, -1); if(count==posicion_iter+1){ gtk_text_buffer_insert (bufferconst, &final, "\n", -1);} gtk_text_buffer_get_start_iter (bufferconst, &start); gtk_text_buffer_get_end_iter (bufferconst, &end); gtk_text_buffer_apply_tag_by_name (bufferconst, "centrar", &start, &end); if(linea >= MAX_VALUE) { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de 146 informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nSolo puede agregar 10 valores!! si agrega mas\nestos no se agregaran a esta ventana"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); linea = MAX_VALUE; } } /*-----------------------------------------------------------------------------------*/ /********************************Remover Posiciones***********************************/ /*-----------------------------------------------------------------------------------*/ void remove_const (GtkButton * button, gpointer user_data) { GtkTextIter start, iter, end; GtkTextBuffer *buffer; int i, posicion_iter, count; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter (buffer, &start); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_get_selection_bounds (buffer, &iter, NULL); posicion_iter = gtk_text_iter_get_line (&iter); gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_get_selection_bounds (buffer, &iter, NULL); posicion_iter = gtk_text_iter_get_line (&iter); /**/ for(i=posicion_iter; i<linea; i++) { marcas_de_posicion[i] = marcas_de_posicion[i+1]; } marcas_de_posicion[linea] = 0; linea = linea - 1; posicion_iter = gtk_text_iter_get_line (&iter); /**/ gtk_text_buffer_get_iter_at_line (buffer, &start, posicion_iter); gtk_text_buffer_get_iter_at_line (buffer, &end, posicion_iter+1); count = gtk_text_buffer_get_line_count (buffer); if(count==posicion_iter+1){ gtk_text_buffer_get_end_iter (buffer, &end);} gtk_text_buffer_select_range (buffer, &start, &end ); gtk_text_buffer_delete (buffer, &start, &end); } 147 /*-----------------------------------------------------------------------------------*/ /***************************Limpiar ventana de constantes*****************************/ /*-----------------------------------------------------------------------------------*/ void clear_const (GtkButton * button, gpointer user_data) { GtkTextBuffer *buffer; GtkTextIter start, end; linea = 0; g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); gtk_text_buffer_get_start_iter (buffer, &start); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_get_bounds (buffer, &start, &end); gtk_text_buffer_delete (buffer, &start, &end); } void changed_values(GtkButton * button, gpointer user_data) { GtkTextIter start1, end1; GtkTextIter start2, end2; GtkTextIter start3, end3; GtkTextIter start4, end4; GtkTextIter start5, end5; GtkTextIter start6, end6; const gchar* textin; gtk_text_buffer_get_start_iter (bufferP[0], &start1); gtk_text_buffer_get_end_iter (bufferP[0], &end1); RprincPila = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferP[0]), &start1, &end1, TRUE); gtk_text_buffer_get_start_iter (bufferP[1], &start2); gtk_text_buffer_get_end_iter (bufferP[1], &end2); RprincPC = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferP[1]), &start2, &end2, TRUE); gtk_text_buffer_get_start_iter (bufferP[2], &start3); gtk_text_buffer_get_end_iter (bufferP[2], &end3); RprincAcum = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferP[2]), &start3, &end3, TRUE); if(Rversioncpucr!=8) { gtk_text_buffer_get_start_iter (bufferA[0], &start4); gtk_text_buffer_get_end_iter (bufferA[0], &end4); RAuxPila = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferA[0]), &start4, &end4, TRUE); gtk_text_buffer_get_start_iter (bufferA[1], &start5); gtk_text_buffer_get_end_iter (bufferA[1], &end5); RAuxPC = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferA[1]), &start5, &end5, TRUE); gtk_text_buffer_get_start_iter (bufferA[2], &start6); gtk_text_buffer_get_end_iter (bufferA[2], &end6); RAuxAcum = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(bufferA[2]), &start6, &end6, TRUE); 148 } textin = gtk_entry_get_text (GTK_ENTRY(entryP[0])); RprincN = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryP[1])); RprincV = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryP[2])); RprincI = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryP[3])); RprincZ = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryP[4])); RprincC = (char*)textin; if(Rversioncpucr!=8) { textin = gtk_entry_get_text (GTK_ENTRY(entryA[0])); RAuxN = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryA[1])); RAuxV = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryA[2])); RAuxI = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryA[3])); RAuxZ = (char*)textin; textin = gtk_entry_get_text (GTK_ENTRY(entryA[4])); RAuxC = (char*)textin; } } void changed_vm(GtkButton * button, gpointer user_data) { GtkTextIter start, end; if( gtk_text_buffer_get_modified(buffervm) ) { gtk_text_buffer_get_start_iter (buffervm, &start); gtk_text_buffer_get_iter_at_line (buffervm, &end, 16384); ventana_de_memoria1 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); gtk_text_buffer_get_iter_at_line (buffervm, &start, 16384); gtk_text_buffer_get_iter_at_line (buffervm, &end, 2*16384); ventana_de_memoria2 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); gtk_text_buffer_get_iter_at_line (buffervm, &start, 2*16384); gtk_text_buffer_get_iter_at_line (buffervm, &end, 3*16384); ventana_de_memoria3 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); gtk_text_buffer_get_iter_at_line (buffervm, &start, 3*16384); gtk_text_buffer_get_end_iter (buffervm, &end); ventana_de_memoria4 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); } } /*-----------------------------------------------------------------------------------*/ 149 /***********************************Boton Compilar************************************/ /*-----------------------------------------------------------------------------------*/ void on_button_compile (GtkButton * button, gpointer user_data) { GtkWidget *dialog; GtkTextBuffer *buffer; GtkTextIter start; GtkTextIter end; char *codigo; // Variable que toma el codigo const char *caso1="8", *caso2="32", *vb; Detener=0; primer_step=0; on_button_save_clicked(NULL, user_data); g_assert (GTK_IS_TEXT_VIEW (user_data)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data)); // toma el codigo escrito en el gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffer), &start); // editor de texto como un gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffer), &end); // char* especificamente en la codigo = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &start, &end, FALSE); // variable codigo if(vm_created) { if(vm_closed) { gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (buffervm), &start); // editor de texto como un gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (buffervm), &end); // char* especificamente en la ventana_de_memoria1 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, FALSE);//Vent. de mem. g_signal_connect ((gpointer) entryP[0], "activate", G_CALLBACK (changed_values),(gpointer) entryP[0]); g_signal_connect ((gpointer) buffervm, "changed", G_CALLBACK (changed_vm),(gpointer) text); } } if(Rversioncpucr==8){ vb=caso1;} else{ vb=caso2;} /*----------------------------------------------------------------------------------------------*/ Interfaz Interfaz1; Interfaz1.setCMPL(Rdireccion, vb, codigo, Pos_VM, ventana_de_memoria1, puerto_in, puerto_out, RprincPila, RprincPC, RprincAcum, RAuxPila, RAuxPC, RAuxAcum, RprincN, RprincV, RprincI, RprincZ, RprincC, RAuxN, RAuxV, RAuxI, RAuxZ, RAuxC); // Aqui le envio el codigo escrito en el editor al objeto Radvertencias = Interfaz1.getADV(); // Obtiene Advertencias 150 Rproyecto_compilado = Interfaz1.getCompilado(); exitosamente // Obtiene si el proyecto fue compilado if(!Rproyecto_compilado) { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nProyecto compilado Exitosamente!!"); } else { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nEl proyecto no fue compilado exitosamente!!"); } gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); } /*-----------------------------------------------------------------------------------*/ /********************************Ejecutar paso a paso*********************************/ /*-----------------------------------------------------------------------------------*/ void on_button_step_clicked (GtkButton * button, gpointer user_data) { /*--------------------------------------------Variables-----------------------------------------*/ GtkWidget *dialog; GtkTextIter start, start2, inicio, final; GtkTextIter end, end2, posicionador; GtkTextIter startvm, endvm; gchar *old_new; char *vb, *posicion_que_cambia; // Variable que toma el codigo const char *caso1="8", *caso2="32"; int i, count; if(Rversioncpucr==8){ vb=(char*)caso1;} else{ vb=(char*)caso2;} g_signal_connect ((gpointer) entryP[0], "activate", G_CALLBACK (changed_values),NULL); /*------------------------------------------conexion con el metodo------------------------------*/ Interfaz2.setStep(Rdireccion, vb, Detener, Pos_VM);// Aqui le envio el codigo escrito en el editor al 151 objeto Radvertencias = Interfaz2.getADV(); // Obtiene Advertencias puerto_in = Interfaz2.getPort_IN(); // Obtiene puerto de entrada puerto_out = Interfaz2.getPort_OUT(); // Obtiene puerto de salida Pos_VM = Interfaz2.getPosicion_VM(); posicion_que_cambia=string_to_char(Interfaz2.getVm1());//Obtiene el valor de la Posicion y su contenido que cambia // | RprincPila = Interfaz2.getPP(); // Obtiene Pila principal | RprincPC = Interfaz2.getPCP(); // Obtiene PC principal | RprincAcum = Interfaz2.getAP(); // Obtiene Acumulador principal V RAuxPila = Interfaz2.getPA(); // Obtiene Pila Auxiliar . RAuxPC = Interfaz2.getPCA(); // Obtiene PC Auxiliar . RAuxAcum = Interfaz2.getAA(); // Obtiene Acumulador Auxiliar . RprincN = Interfaz2.getNP(); RprincV = Interfaz2.getVP(); RprincI = Interfaz2.getIP(); RprincZ = Interfaz2.getZP(); RprincC = Interfaz2.getCP(); RAuxN = Interfaz2.getNA(); RAuxV = Interfaz2.getVA(); RAuxI = Interfaz2.getIA(); RAuxZ = Interfaz2.getZA(); RAuxC = Interfaz2.getCA(); // Obtiene N principal // Obtiene V principal // Obtiene I principal // Obtiene Z principal // Obtiene Z principal // Obtiene N Auxiliar // Obtiene V Auxiliar // Obtiene I Auxiliar // Obtiene Z Auxiliar // Obtiene C Auxiliar if(!Rproyecto_compilado) { if(!primer_step) { gtk_text_buffer_set_text (bufferP[1], RprincPC, -1); if(Rversioncpucr!=8) { gtk_text_buffer_set_text (bufferA[1], RAuxPC, -1); } primer_step = 1; } else { gtk_text_buffer_get_start_iter (bufferP[1], &start); gtk_text_buffer_insert (bufferP[1], &start, "\n", -1); gtk_text_buffer_get_start_iter (bufferP[1], &start); gtk_text_buffer_insert (bufferP[1], &start, RprincPC, -1); if(Rversioncpucr!=8) { gtk_text_buffer_get_start_iter (bufferA[1], &start); gtk_text_buffer_insert (bufferA[1], &start, "\n", -1); 152 gtk_text_buffer_get_start_iter (bufferA[1], &start); gtk_text_buffer_insert (bufferA[1], &start, RAuxPC, -1); } } gtk_text_buffer_set_text (bufferP[0], RprincPila, -1); // Registros Principales gtk_text_buffer_set_text (bufferP[2], RprincAcum, -1); gtk_entry_set_text (GTK_ENTRY(entryP[0]),RprincN); gtk_entry_set_text (GTK_ENTRY(entryP[1]),RprincV); gtk_entry_set_text (GTK_ENTRY(entryP[2]),RprincI); gtk_entry_set_text (GTK_ENTRY(entryP[3]),RprincZ); gtk_entry_set_text (GTK_ENTRY(entryP[4]),RprincC); if(Rversioncpucr!=8) { gtk_text_buffer_set_text (bufferA[0], RAuxPila, -1); gtk_text_buffer_set_text (bufferA[2], RAuxAcum, -1); gtk_entry_set_text (GTK_ENTRY(entryA[0]),RAuxN); gtk_entry_set_text (GTK_ENTRY(entryA[1]),RAuxV); gtk_entry_set_text (GTK_ENTRY(entryA[2]),RAuxI); gtk_entry_set_text (GTK_ENTRY(entryA[3]),RAuxZ); gtk_entry_set_text (GTK_ENTRY(entryA[4]),RAuxC); } /*--------------------------Remover Tag y sustituir valor de la V.M. que cambia-----------------------*/ if(vm_created) { if(vm_closed) { gtk_entry_set_text (GTK_ENTRY(puertos[0]),puerto_in); gtk_entry_set_text (GTK_ENTRY(puertos[1]),puerto_out); } gtk_text_buffer_get_start_iter (buffervm, &start); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_get_iter_at_line (buffervm, &posicionador, Pos_VM); // Ubicar el cursor en dondu hubo el cambio gtk_text_buffer_place_cursor (buffervm, &posicionador); gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(text), &posicionador,NULL, NULL, NULL, NULL); gtk_text_buffer_remove_tag_by_name (buffervm, "under", &start, &end);// Remover negrita, subrayado y color azul gtk_text_buffer_remove_tag_by_name (buffervm, "bold", &start, &end); gtk_text_buffer_remove_tag_by_name (buffervm, "instruccion", &start, &end); gtk_text_buffer_get_iter_at_line (buffervm, &startvm, Pos_VM); // Ubica al iter al principio y al final de la . gtk_text_buffer_get_iter_at_line (buffervm, &endvm, Pos_VM+1); // posicion de la ventana de memoria que cambio . // . 153 gtk_text_buffer_delete (buffervm, &startvm, &endvm); // Borra el antiguo valor de la posicion . gtk_text_buffer_get_iter_at_line (buffervm, &startvm, Pos_VM); // Ubica al iter al principio y al final de la | gtk_text_buffer_get_iter_at_line (buffervm, &endvm, Pos_VM+1); // posicion que cambio | // | gtk_text_buffer_insert (buffervm, &startvm, posicion_que_cambia, -1); // Inserta el nuevo valor de la posicion <---gtk_text_buffer_get_iter_at_line (buffervm, &startvm, Pos_VM); // Ubica al iter al principio y al final de la gtk_text_buffer_get_iter_at_line (buffervm, &endvm, Pos_VM+1); // posicion que fue marcada y que cambio if(Pos_VM==31){ // Si esta en la U.L. ubique el iter gtk_text_buffer_get_end_iter (buffervm, &endvm);}// al final de todo el texto gtk_text_buffer_apply_tag_by_name (buffervm, "under", &startvm, &endvm); // Aplica negrita, subrayado, azul y centrado gtk_text_buffer_apply_tag_by_name (buffervm, "bold", &startvm, &endvm); gtk_text_buffer_apply_tag_by_name (buffervm, "instruccion", &startvm, &endvm); gtk_text_buffer_apply_tag_by_name (buffervm, "centrar", &startvm, &endvm); /*-----------------------------Marcar la constante que cambio-----------------------------------*/ for(i=0; i<linea; i++) { gtk_text_buffer_get_iter_at_line (buffervm, &start, marcas_de_posicion[i]);// Ubica al iter al principio y final de gtk_text_buffer_get_iter_at_line (buffervm, &end, marcas_de_posicion[i]+1);// lo que se desea copiar count = gtk_text_buffer_get_line_count (buffervm); // Obtiene el nuevo valor de la posicion if(marcas_de_posicion[i]==count){ // Si esta en la U.L. ubique el iter gtk_text_buffer_get_end_iter (buffervm, &end);} // al final de todo el texto old_new = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); // Valor a cambiar if(marcas_de_posicion[i]==Pos_VM) de la Ventana de { alguna de las marcadas // Pregunta si la posicion // memoria coincide con gtk_text_buffer_get_iter_at_line (bufferconst, &start2, i); // Ubica al iter al principio y al final de la gtk_text_buffer_get_iter_at_line (bufferconst, &end2, i+1); // posicion que fue marcada y que cambio gtk_text_buffer_delete (bufferconst, &start2, &end2); // Borra el antiguo valor de la posicion gtk_text_buffer_get_iter_at_line (bufferconst, &start2, i); // Ubica al iter al principio y al final de la gtk_text_buffer_get_iter_at_line (bufferconst, &end2, i+1); // posicion que fue marcada y que cambio 154 gtk_text_buffer_insert (bufferconst, &start2, old_new, -1); // Inserta el nuevo valor de la posicion gtk_text_buffer_get_iter_at_line (bufferconst, &start2, i); // Ubica al iter al principio y al final de la gtk_text_buffer_get_iter_at_line (bufferconst, &end2, i+1); // posicion que fue marcada y que cambio if(i==linea-1){ // Si esta en la U.L. ubique el iter gtk_text_buffer_get_end_iter (bufferconst, &end2);}// al final de todo el texto gtk_text_buffer_get_start_iter (bufferconst, &inicio); // Ubica al iter al principio y al final de la gtk_text_buffer_get_end_iter (bufferconst, &final); // ventana de constantes gtk_text_buffer_get_iter_at_line (bufferconst, &start2, i); // Ubica al iter al principio y al final de la gtk_text_buffer_get_iter_at_line (bufferconst, &end2, i+1); // posicion que fue marcada y que cambio gtk_text_buffer_place_cursor (bufferconst, &start2); // Ubica el cursor en la posicion que cambia gtk_text_buffer_remove_tag_by_name (bufferconst, "under", &inicio, &final); // Quita negrita y subrayado gtk_text_buffer_remove_tag_by_name (bufferconst, "bold", &inicio, &final); gtk_text_buffer_remove_tag_by_name (bufferconst, "instruccion", &inicio, &final); gtk_text_buffer_apply_tag_by_name (bufferconst, "under", &start2, &end2); // Aplica negrita y subrayado gtk_text_buffer_apply_tag_by_name (bufferconst, "bold", &start2, &end2); gtk_text_buffer_apply_tag_by_name (bufferconst, "instruccion", &start2, &end2); gtk_text_buffer_apply_tag_by_name (bufferconst, "centrar", &start2, &end2); } // marcas coinciden? } // for } // VM creada Detener=0; } // Proyecto compilado else { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nAntes de Ejecutar paso a paso, debe Compilar Exitosamente el Proyecto"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); } } /*-----------------------------------------------------------------------------------*/ /**************************************Ejecutar***************************************/ 155 /*-----------------------------------------------------------------------------------*/ void on_button_run (GtkButton * button, gpointer user_data) { int i, count; const char *caso1="8", *caso2="32", *vb; string mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8; gchar* old_new; GtkWidget *dialog; GtkTextIter start, end; if(Rversioncpucr==8){ vb=caso1;} else{ vb=caso2;} /*----------------------------------------------------------------------------------------------*/ Interfaz Interfaz1; if(To_posicion) { Interfaz1.setRun(Rdireccion, vb, Pos_VM, 0, VALOR_V_M); } else { Interfaz1.setRun(Rdireccion, vb, 65535, 0, VALOR_V_M); } puerto_in = Interfaz1.getPort_IN(); // Obtiene puerto de entrada puerto_out = Interfaz1.getPort_OUT(); // Obtiene puerto de salida registro_de_instrucciones = Interfaz1.getR_I(); RprincPila = Interfaz1.getPP(); // Obtiene Pila principal RprincPC = Interfaz1.getPCP(); // Obtiene PC principal RprincAcum = Interfaz1.getAP(); // Obtiene Acumulador principal RAuxPila = Interfaz1.getPA(); // Obtiene Pila Auxiliar RAuxPC = Interfaz1.getPCA(); // Obtiene PC Auxiliar RAuxAcum = Interfaz1.getAA(); // Obtiene Acumulador Auxiliar RprincN = Interfaz1.getNP(); // Obtiene N principal RprincV = Interfaz1.getVP(); // Obtiene V principal RprincI = Interfaz1.getIP(); // Obtiene I principal RprincZ = Interfaz1.getZP(); // Obtiene Z principal RprincC = Interfaz1.getCP(); // Obtiene Z principal RAuxN = Interfaz1.getNA(); // Obtiene N Auxiliar RAuxV = Interfaz1.getVA(); // Obtiene V Auxiliar RAuxI = Interfaz1.getIA(); // Obtiene I Auxiliar RAuxZ = Interfaz1.getZA(); // Obtiene Z Auxiliar RAuxC = Interfaz1.getCA(); // Obtiene C Auxiliar /*----------------------------------------------------------------------------------------------*/ Detener=0; primer_step=0; if(!Rproyecto_compilado) { gtk_text_buffer_set_text (bufferP[0], RprincPila, -1); // Registros Principales 156 gtk_text_buffer_set_text (bufferP[1], RprincPC, -1); gtk_text_buffer_set_text (bufferP[2], RprincAcum, -1); gtk_text_buffer_set_text (buffer_instrucciones, registro_de_instrucciones, -1); gtk_entry_set_text (GTK_ENTRY(entryP[0]),RprincN); gtk_entry_set_text (GTK_ENTRY(entryP[1]),RprincV); gtk_entry_set_text (GTK_ENTRY(entryP[2]),RprincI); gtk_entry_set_text (GTK_ENTRY(entryP[3]),RprincZ); gtk_entry_set_text (GTK_ENTRY(entryP[4]),RprincC); if(Rversioncpucr!=8) { gtk_text_buffer_set_text (bufferA[0], RAuxPila, -1); gtk_text_buffer_set_text (bufferA[1], RAuxPC, -1); gtk_text_buffer_set_text (bufferA[2], RAuxAcum, -1); gtk_entry_set_text (GTK_ENTRY(entryA[0]),RAuxN); gtk_entry_set_text (GTK_ENTRY(entryA[1]),RAuxV); gtk_entry_set_text (GTK_ENTRY(entryA[2]),RAuxI); gtk_entry_set_text (GTK_ENTRY(entryA[3]),RAuxZ); gtk_entry_set_text (GTK_ENTRY(entryA[4]),RAuxC); } if(vm_created) { if(vm_closed) { mem1 = Interfaz1.getVm1(); // Obtiene la Ventana de mem2 = Interfaz1.getVm3(); // Obtiene la Ventana de mem3 = Interfaz1.getVm5(); // Obtiene la Ventana de mem4 = Interfaz1.getVm7(); // Obtiene la Ventana de mem5 = Interfaz1.getVm2(); // Obtiene la Ventana de mem6 = Interfaz1.getVm4(); // Obtiene la Ventana de mem7 = Interfaz1.getVm6(); // Obtiene la Ventana de mem8 = Interfaz1.getVm8(); // Obtiene la Ventana de memoria memoria memoria memoria memoria memoria memoria memoria mem1 = mem1 + mem5; mem2 = mem2 + mem6; mem3 = mem3 + mem7; mem4 = mem4 + mem8; mem1 = mem1 + mem2 + mem3 + mem4; ventana_de_memoria1 = string_to_char(mem1); // Obtiene la Ventana de memoria gtk_entry_set_text (GTK_ENTRY(puertos[0]),puerto_in); gtk_entry_set_text (GTK_ENTRY(puertos[1]),puerto_out); gtk_text_buffer_set_text (buffervm, ventana_de_memoria1, -1); 157 gtk_text_buffer_get_start_iter (buffervm, &start); gtk_text_buffer_get_end_iter (buffervm, &end); gtk_text_buffer_apply_tag_by_name (buffervm, "centrar", &start, &end); for(i=0; i<linea; i++) { gtk_text_buffer_get_iter_at_line (buffervm, &start, marcas_de_posicion[i]); gtk_text_buffer_get_iter_at_line (buffervm, &end, marcas_de_posicion[i]+1); count = gtk_text_buffer_get_line_count (buffervm); if(marcas_de_posicion[i]==count){ gtk_text_buffer_get_end_iter (buffervm, &end);} old_new = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffervm), &start, &end, TRUE); gtk_text_buffer_get_iter_at_line (bufferconst, &start, i); gtk_text_buffer_get_iter_at_line (bufferconst, &end, i+1); gtk_text_buffer_delete (bufferconst, &start, &end); gtk_text_buffer_get_iter_at_line (bufferconst, &start, i); gtk_text_buffer_get_iter_at_line (bufferconst, &end, i+1); gtk_text_buffer_insert (bufferconst, &start, old_new, -1); } gtk_text_buffer_get_start_iter (bufferconst, &start); gtk_text_buffer_get_end_iter (bufferconst, &end); gtk_text_buffer_apply_tag_by_name (bufferconst, "centrar", &start, &end); } } } else { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, //Lo que imprime la ventana de informacion GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "\n\nAntes de Ejecutar, debe Compilar Exitosamente el Proyecto"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); // Posicion de la ventana de dialogo gtk_dialog_run (GTK_DIALOG (dialog)); // Corre el dialogo gtk_widget_destroy (dialog); } } /*-----------------------------------------------------------------------------------*/ /***********************************INTERRUPCION************************************** / /*-----------------------------------------------------------------------------------*/ void on_button_stop (GtkButton * button, gpointer user_data) { 158 Detener=1; } void on_button_stop_position (GtkButton * button, gpointer user_data) { char *s; string str="$"; To_posicion = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(user_data)); compiler compilador; str = str + compilador.convert_to_string(Pos_VM, 16, 4); s = string_to_char(str); if(To_posicion) { gtk_button_set_label(GTK_BUTTON(user_data), s); } else{ gtk_button_set_label(GTK_BUTTON(user_data), "Parar en"); Pos_VM = 65535; } } void on_button_stop_point (GtkButton * button, gpointer user_data) // Devuelve el valor del boton donde se desea detener { // la ejecucion del programa Pos_VM = gtk_spin_button_get_value (GTK_SPIN_BUTTON(user_data)); // Si se desea que devuelva un double // Pos_VM = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(user_data)); // Si se desea que devuelva un int } /*-----------------------------------------------------------------------------------*/ /**********************************Cerrar Ventanas************************************/ /*-----------------------------------------------------------------------------------*/ void close_regs (GtkWidget *wid, GtkWidget *win) { vm_closed = 0; vm_created = 0; gtk_window_set_destroy_with_parent (GTK_WINDOW(win), TRUE); } void close_win (GtkWidget *wid, GtkWidget *win) { vm_closed = 0; vm_created = 0; gtk_window_set_destroy_with_parent (GTK_WINDOW(win), TRUE); } /**************************************************************************************/ /**************************************************************************************/ /***************************************FIN********************************************/ /**************************************************************************************/ /**************************************************************************************/ 159 ANEXOS Librerías necesarias para la compilación y ejecución del programa en Linux y que pueden ser instaladas desde el gestor de paquetes de Synaptic: • • • • • • • • • • • • • • • • libart2.24-cil libatk1.0-0 libcairo2 libcairomm-1.0-1 libglade2.0-cil libglademm-2.4-1c2a libglib2.0-0 libglib2.0-cil libgnome2-0 libgnome2.24-cil libgtk2.0-0 libgtk2.0-cil libgtkspell0 libgtk-vnc-1.0-0 libpango1.0-0 libpangomm-1.4-1 Además, es importante el paquete: php-gtk_2.0.0-1_i386.deb, que puede ser descargado desde Internet. Existe además el paquete “libgtk2.0-dev_2.16.1-0ubuntu2_i386.deb” para Ubuntu que instala todas las librerias mencionadas anteriormente y está disponible en la dirección: https://launchpad.net/ubuntu/karmic/i386/libgtk2.0-dev/2.16.1-0ubuntu2, al 30 de julio del 2009. Para compilar el simulador completo para la CPUCR, basta con escribir “make” sin comillas, desde la terminal de Linux, ubicándose sobre la carpeta donde están contenidos los archivos del programa. 160 Para crear un programa con GTK desde Microsoft Windows, puede utilizarse el tutorial disponible en las direcciones web (es el mismo tutorial para las dos direciones): • http://lubriotech.blogspot.com/2005/10/trabajando-con-dev-c-y-gtk-bajo.html • http://lubriotech.blogspot.com/