Professional Documents
Culture Documents
1 Memoria Descriptiva..........................................................................................3
1.1 Objeto del proyecto.........................................................................................3
1.2 Titular..............................................................................................................3
1.2 Antecedentes...................................................................................................3
1.4 Posibles soluciones y solucin adoptada........................................................4
1.5 Diferencias entre programas bajo DOS y bajo Windows...............................5
1.6 Introduccin a C++ Buider.............................................................................8
1.7 Descripcin general........................................................................................9
1.7.1 Introduccin ...........................................................................................9
1.7.2 Esquema Proceso de Ensamblado y Linkado.......................................13
1.7.3 Esquema del Proyecto...........................................................................15
1.7.4 Descripcin de las funciones.................................................................20
2 Presupuesto.......................................................................................................50
3 Conclusiones......................................................................................................51
4 Pliego de Condiciones........................................................................................53
4.1. Condiciones generales..................................................................................53
4.2. Condiciones econmicas..............................................................................58
4.3. Condiciones facultativas...............................................................................61
4.4. Condiciones tcnicas....................................................................................61
5 Anexos.................................................................................................................62
5.1. Manual de usuario.........................................................................................62
5.2. Cdigo...........................................................................................................71
2
1 Memoria Descriptiva
1.2 Titular
1.3 Antecedentes
3
Figura 1. Esquema Entorno Global del MC68000
Se podra haber realizado el proyecto con cualquier tipo de los diversos lenguajes
visuales para Windows existentes en el mercado como por ejemplo: Visual C, Visual
Basic, etc, pero finalmente se ha optado por el C++ Builder de Borland por diversas
razones, entre las que podemos destacar su gran potencia heredada del C, la posibilidad
de programar en modo orientado a objetos (POO) como en C++ y la ltima y ms
importante debido a que facilita y ahorra mucho tiempo a la hora de programar, es que
ya incluye clases creadas con lo cual se agiliza en gran medida la generacin de cdigo
nuevo y complejo. En resumen, mediante C++ Builder se consigue una programacin
orientada a componentes (POC). Un componente es similar a una clase, pero adems
consta de propiedades y eventos. Cada componente nuevo ya creado e incluido en el
compilador, no es ms que un trozo de cdigo que da origen a un formulario, una
etiqueta, una listbox, etc, con lo cual se ahorra, mediante esta standarizacin el tiempo
para programar dichos objetos, lo cual suele ser bastante engorroso y complejo en
lenguajes como C++.
4
1.5 Diferencias entre programas bajo DOS y bajo Windows
5
Main( ) Inicio Rutina 1
Rutina 2
Salir? Rutina n
Rutina 3
Fin
Rutina n
Fin
Figura 2. Ejecucin de las rutinas bajo DOS (a) y bajo Windows (b)
Los mensajes a los que se haca antes alusin, son una notificacin a la aplicacin
con la finalidad de advertirle de que ha sucedido algo y que debe realizar alguna accin.
Cuando se enva un mensaje a una aplicacin sta, inmediatamente ejecutar una
funcin. Las aplicaciones de Windows emplean una ventana de interface con el
usuario. Las aplicaciones se encargan del control del rea de trabajo de dichas ventanas.
Mientras la cola de mensajes de una aplicacin est vaca, Windows no le ceder el
control a sta, ya que no hay mensajes a procesar en ese momento. As se optimiza en
gran medida la utilizacin de todos los recursos del sistema por parte de todas las
aplicaciones.
Seguidamente se muestra el diagrama de funcionamiento:
6
WINDOWS APLICACIN A
Entrada
Cola de Mensajes
del Sistema WinMain
Cola de Mensajes
de Aplicacin A Funcin 1
Windows comparte recursos entre aplicaciones de ah que sea multitarea, con lo cual
es necesario que cualquier acceso a un recurso por parte de una aplicacin se establezca
a travs del sistema operativo, pero nunca directamente. Si una aplicacin necesita
emplear algn recurso hardware, tendr que ser a travs del sistema operativo. Para que
las aplicaciones sean independientes del hardware empleado, el sistema operativo
accede a ste mediante lo que se llama drivers o controladores. Cada fabricante de
dispositivos hard tiene que poner a disposicin los drivers pertinentes para que
stos sean completamente compatibles con Windows. Esta independencia hardware
implica que las aplicaciones sean independientes del hardware empleado, facilitando la
programacin.
El software mediante el cual estn realizados mayoritariamente todos drivers de
dispositivos perifricos son los archivos de extensin .dll o libreras de enlace
dinmico Windows permite adems el uso de stas. Los ficheros .dll son cdigo que
pueden usar de forma compartida diferentes aplicaciones. Existen DLL suministradas
por Windows, o bien es posible la programacin propia de DLL para su uso por
nuestras aplicaciones.
Finalmente cabe aadirse que el sistema operativo Windows proporciona unas
interfaces para la programacin de aplicaciones llamadas API las cuales son un
conjunto de funciones que tienen que ser empleadas para programar una aplicacin que
se ejecute bajo Windows.
7
1.6 Introduccin a C++ Builder
8
1.7 Descripcin General
1.7.1 Introduccin
El programa consta de una sla ventana en la cual estn integrados todos los
elementos necesarios para el ensamblado y linkado de ficheros. Para pasar de un
mdulo a otro simplemente basta con hacer clic sobre una de las 2 pestaas. Primero
evidentemente se debe proceder ensamblando el fichero de extensin .asm. Para ello
bastar con introducir el nombre del fichero fuente en su campo correspondiente.
Automticamente los campos de los ficheros destino (.obj) y listado (.lst) se rellenan por
defecto con el mismo nombre aunque naturalmente cabe la posibilidad de modificarlos
posteriormente. A continuacin se hace clic sobre el botn Ensambla situado en el
men principal de la parte superior de la ventana. Al instante obtendremos los
resultados en los memos tanto de informacin (si no hubieran errores), como de errores
(si los hubiera). El fichero .asm contiene un cdigo escrito en lenguaje nemotcnico el
cual al ser ensamblado se transforma directamente a cdigo mquina inteligible por la
mquina. El cdigo generado en este ltimo fichero est en hexadecimal. A
continuacin, una vez creados los ficheros objeto y de listado se puede proceder a su
linkado. Para ello basta una vez ms con presionar la pestaa de la parte
correspondiente al linker. Ahora se tienen ms campos por rellenar. Se puede apreciar
como adems de los campos de destino (cuya extensin es .s28) y de mapa (cuya
extensin es .map), hay otro campo para introducir la posicin de memoria donde se
desea que sea o sean linkado/s nuestro/s fichero/s objeto y finalmente una ListBox por
si se quiere linkar ms de un fichero objeto. Evidentemente antes de introducir dichos
ficheros objeto en la ListBox tendrn que haber sido creados mediante su previo
ensamblado. Una vez introducidos ficheros .obj en la ListBox haremos click sobre el
botn Linka situado en el men superior de la ventana. Al igual que en el caso del
ensamblador sern presentados en los memos de informacin y de error los posibles
avisos o errores cometidos por el usuario.
Para llegar hasta el formulario final se ha seguido un proceso de transformacin
intermedio. Para ello en primer lugar se crearon 2 formularios provisionales, uno de
entrada y otro de salida (cuyos captions poseen el mismo nombre). El programa
entonces era apto para un entorno C++ Builder. Ambos formularios sirvieron de
referencia, una vez finalizado el proyecto, para comparar y confirmar si los mensajes de
salida y entrada, el tipo de errores provocados, etc eran los mismos en los formularios
principales que en el definitivo. Como se ha dicho anteriormente los formularios de
entrada y salida eran meramente formularios de apoyo, ya que consistan simplemente
en 2 objetos de la clase TForm con un memo del tipo TMemo cada uno en su interior y
el mecanismo de entrada y de salida era exactamente igual que el programa ejecutable
sobre DOS, slo que ahora se haca sobre un par de ventanas que podan soportar
Windows. Finalmente se ha decidido no eliminar dichos formularios debido a su gran
utilidad en una futura actualizacin a macroensamblador del presente programa,
simplemente se han configurado en modo invisible por motivos de esttica.
9
Como se puede apreciar en la Figura 4, el formulario provisional de salida est
constituido nicamente de un memo que es un objeto de la clase TMemo, y de un
formulario que es otro objeto que contiene al anterior y es de la clase TForm. El
formulario se puede redimensionar en su totalidad. Por el memo simplemente salen
todos los mensajes que salan en la versin del ensamblador para DOS.
10
A continuacin se muestra en la Figura 6 el formulario definitivo que integra todas
las partes (entrada y salida). En concreto la de la Figura inferior corresponde a la parte
del Ensamblador. Es un formulario bastante ms completo y complejo que los
provisionales puesto que consta de ms componentes. En primer lugar se pueden
observar en la parte superior 2 controles, los cuales son objetos de la clase
TmenuItem y al hacer clic sobre ellos ejecutan la rutina principal correspondiente, ya
sea del ensamblador en el caso de Ensambla o del linkador en el caso de Linka. Estas
funciones se encuentran como veremos ms adelante en fichero .cpp asociado a este
formulario, en nuestro caso menuprin.cpp, el cual ser comentado ms adelante en
profundidad. Adems dichos controles se pueden activar haciendo Alt+E en el caso del
ensamblador y Alt+L en el caso del linkador.
Un poco ms abajo de estos controles, se han creado otros 2 correspondientes a las
pestaas que hacen posible la eleccin de la parte que se encarga del ensamblado o de la
que se encarga de la de linkado.
11
Como se puede apreciar en la figura 7, el linkador se compone de 3 labels que son
objetos de la clase Tlabel y al igual que el ensamblador, posee 2 memos, que son
objetos de la clase Tmemo y que muestran los diferentes warnings o mensajes de
salida y errores dependiendo de lo que el usuario introduzca por teclado en las etiquetas
de entrada.
12
1.7.2 Esquema Proceso de Ensamblado y Linkado
13
A continuacin se pasar a explicar el programa fuente elaborado haciendo especial
hincapi en el cdigo que hace referencia a la parte visual y al aspecto de Entrada/Salida
(I/O) tanto del Ensamblador como del Linkador. Para ello se ha estructurado este
captulo en los diferentes archivos de los que consta el programa. El programa global
que contiene a resto de subarchivos es un archivo de tipo project cuya extensin es
.bpr. Este es el tipo de archivo que constituye una aplicacin de C++ Builder, es
decir, en l estn contenidos toda una serie de ficheros que interactan entre s y hacen
posible su funcionamiento. Estos pueden constar de 2 tipos de ficheros: .cpp y
formularios asociados o no a estos archivos. Los formularios son en realidad trozos de
cdigo que les implementan grficamente. Sin embargo tambin se pueden visualizar
los formularios, si como todos los objetos creados en un entorno C++ Builder, mediante
la opcin View as Text, que es una de las opciones que se encuentran al clicar con el
botn derecho sobre el formulario en cuestin, al hacer clic en esa opcin se podrn
observar todos los objetos contenidos en el formulario, as como todas sus propiedades
principales con los valores que se les han asignado o que venan por defecto en un
archivo cuya extensin es .dfm. En ese mismo fichero se pueden variar dichas
propiedades escribiendo los valores que se deseen:
14
A continuacin se presenta un esquema grfico de todos los ficheros que componen
el fichero proyecto .bpr y despus se irn enumerando los archivos que contiene el
proyecto, y explicando cada una de las funciones de las que constan. Algunas de ellas
pertenecen a los formularios de salida y entrada que se realizaron como provisionales en
un principio aunque la mayora fueron tiles tanto a dichos formularios provisionales
como al final y definitivo ya que bsicamente son funciones de DOS que son
renombradas para que sean compatibles en un entorno C++ Builder.
15
FORM2
MENUPRIN.cpp
MAIN_ENS MAIN_LINK
ENS68K.cpp LINKER.cpp
COPYR.cpp
SUBF2.cpp
TABLA.cpp
COPYRLINK.cpp
FUNC.cpp
PARSERL.cpp
ERRORES.cpp
ARBOLES.cpp
PARSER.cpp
16
1).Archivos Comunes
-old_io
void old_sleep(int a
int old_cprintf(char *c1)
int old_cprintf(char *c1,char*c2)
int old_cprintf(char *c1,int c2)
int old_cprintf(char *c1,char*c2,char *c3)
int old_cprintf(char *c1,char*c2,int i3,char *c4)
int old_cprintf(char *c1,char*c2,int i3)
int old_cprintf(char *c1,char*c2,char *c3,char *c4)
int old_cprintf(char *c1,int i2,char *c3,char *c4)
int old_cprintf(char *c1,char* c2,int i3,char *c4,int i5)
int old_cputs(const char *org)
void old_textattr(int newattr)
void old_gotoxy(int x, int y)
void old_clrscr()
char *old_gets(char *s)
void old_cco(unsigned char car, unsigned char atrib)
void old_music(int a,int b)
void old_rectan(int a, int b, int c, int d)
void old_scr_cursoff()
void old_top(int a,int c,int b)
void old_vert(int a,int b,int d)
void old_bot(int a,int c,int d)
void old_scr_rowcol(int a,int b)
void old_scr_curson()
void old_int86()
void old_marc(int le,int to, int ri, int bo, char s)
void old_elimarc(int le,int to, int ri, int bo, char s)
void old_puttext(int le,int to, int ri, int bo, char s)
void old_window(int a,int b,int c,int d)
void old_sedit(char cap,char str,unsigned char mvoid
old_scroll2(char c)
void old_miss2(char s)
void old_prom2()
void old_cprint(char str,unsigned char atr )
void old_cfill(unsigned int a,unsigned int b,unsigned int
c,unsigned
int d,unsigned char at)
void old_rectan(int a, int b, int c, int d,char t, char at)
void old_pit()
void old_epit()
17
-menuprin
void __fastcall TForm2::Ens68000Click(TObject *Sender)
void __fastcall TForm2::Printf_Error(char* c1)
void __fastcall TForm2::Printf_Error(char* c1,char *c2)
void __fastcall TForm2::Printf_Error(char* c1,char *c2,char *c3)
void __fastcall TForm2::Printf_Error(char *c1,char*c2,int i3,char
*c4)
void __fastcall TForm2::Printf_Error(char *c1,char*c2,int i3,char
*c4, int i4)
void __fastcall TForm2::Printf_Error(char *c1,char*c2,int i3)
void __fastcall TForm2::Printf_mens(char* c1)
void __fastcall TForm2::Printf_mens(char* c1,char *c2)
void __fastcall TForm2::Printf_mens(char* c1,char *c2,char *c3)
void __fastcall TForm2::Printf_mens(char *c1,char*c2,int i3,char
*c4)
void __fastcall TForm2::Printf_mens(char *c1,char*c2,int i3)
void __fastcall TForm2::Printf_mens(char *c1,char*c2,int i3,char
*c4, int i4)
void __fastcall TForm2::FuenteChange(TObject *Sender)
void __fastcall TForm2::FormResize(TObject *Sender)
void __fastcall TForm2::PestanasChange(TObject *Sender)
void __fastcall TForm2::Linka1Click(TObject *Sender)
void __fastcall TForm2::objChange(TObject *Sender)
void __fastcall TForm2::AnadirClick(TObject *Sender)
void __fastcall TForm2::kitarClick(TObject *Sender)
2).Ensamblador
-ENS68K.cpp
static int lee_linea(char *s,FILE *ff);
static void imprtitulo(void);
static int trans(char *,char *,int *);
static void mostrar_pantalla_ayuda(void);
char *treutabs(char *,char *);
void ini();
int old_main(int argc,char *argv)
-COPYR.cpp
void copyr()
18
-TABLA.cpp
static int
tipo1(void),add(void),adda(void),addi(void),addq(void),and(void),
andi(void),asr(void),bra(void),bchg(void),chk(void),neg(void),
cmp(void),cmpm(void),nbcd(void),endd(void),eor(void),equ(void),
exg(void),ext(void),exter(void),glob(void),jmp(void),lea(void),
link(void),move(void),movea(void),movem(void),movep(void),
moveq(void),page(void),nada(void),or(void),org(void),rel(void),
stop(void),sub(void),swap(void),title(void),trap(void),unlk(void),
abso(void),dc(void),ds(void),dbcc(void),scc(void),high(void),low(v
oi
d);
static int buscar_tabla(void);
static void stcat(void);
static void invertir (char *);
static int mascara(char *,char *linea);
static int sp(long int);
static void opp_a_op(void);
-FUNC.cpp
static struct operando registro (char *,int);
char *coger_palabra(line,palabra,label)
char *cogeyanal(line,err,externo,aa)
int tipo2(valor,aa,ensamblado,operando)
int tipo3(valor,aa,ensamblado)
int masde4bits(a)
int masde8bits(a)
int masde16bits(a)
int esta_en (c,s)
long int hexdec(expresion,err)
long int bindec(expresion,err)
-ARBOLES.cpp
struct arbol *buscar_rama(struct arbol *a,char *label)
void eliminar_rama(a,label)
struct arbol *insarbol(struct arbol *r,struct arbol *a,char
*label,int *error,long int dato,int tipodevariable)
void listar_arbol (a,i)
-PARSER.cpp
19
static void coger_expresion(long int *);
static void nivel1(long int *);
static void nivel2(long int *);
static void nivel3(long int *);
static void nivel4(long int *);
static void nivel5(long int *);
static void nivel6(long int *);
static void primitiva(long int *);
static void arit (char ,long int *,long int *);
static void unitario (char,long int *);
static void coger_termino(void);
static esdelimitador(char);
static long int valor(char *);
-ERRORES.cpp
void error(tipo)
3).LINKADOR
-linker.cpp
static void insertarabs(struct lista *);
static void insertarreu(struct lista *);
static void listar(struct lista *);
static void listar_arbol (struct etiqueta *);
static void comprobar_externas(struct etiqueta *);
static void s28(char *);
static void volcars28(void);
static void nexit(int,char *);
static void sexit(void);
static int cogerfichero(char *,int);
static int buscarlista(struct lista *,char *);
static int insertar_etiqueta(struct etiqueta **,char *,char *);
static int checksum(char*);
static long int cogerposicion(void);
static struct etiqueta *buscar_etiqueta(struct etiqueta *,char *);
int copyrlink();
long int hexdec(char *);
-Subf2.cpp
marc(le, to, ri, bo, s)
elimarc(le, to, ri, bo, s)
20
int old_sedit(cap,str,m)
scroll2(c)
miss2(s)
rom2()
cfill(a,b,c,d,at)
pit()
epit()
old_rectan(a,b,c,d,t,at)
old_top(x1,x2,y)
old_bot(x1,x2,y)
old_vert(x,y1,y2)
-copyrlink.cpp
copyrlink()
-Parserl.cpp
static void coger_expresion(long int *);
static void nivel1(long int *);
static void nivel2(long int *);
static void nivel3(long int *);
static void nivel4(long int *);
static void nivel5(long int *);
static void nivel6(long int *);
static void primitiva(long int *);
static void arit (char ,long int *,long int *);
static void unitario (char,long int *);
static void coger_token(void);
static esdelimitador(char);
static long int valor(char *);
static int esta_en (char,char *);
Hay 2 archivos que son comunes a todo el proyecto. En ellos se encuentran funciones
de ambas partes, tanto linkador como ensamblador:
-old_io.cpp
En la parte superior de este archivo se definen las libreras donde se incluyen
algunas funciones que se han creado y otras standard que ya venan implementadas.
Adems todas los funciones que se han creado nuevas renombrndolas y modificando
21
su contenido se han ido escribiendo en su fichero de cabecera, en este caso old_io.h,
para que no se produzcan errores de compilacin. En un fichero de cabecera siempre
deben incluirse todas las funciones de las que hace uso su archivo .cpp asociado. A
continuacin viene definido un array de caracteres llamado cadena => char
cadena[1024] q consta de 1024 elementos de tipo char. Dicho array se emplea para
almacenar o copiar los nombres de otras cadenas de caracteres. A continuacin estn
definidas algunas funciones relativas al ensamblador:
1.-Funciones relativas al Ensamblador:
-void old_sleep(int a) => Esta funcin es una modificacin de la original sleep(int
a). Se ha modificado debido a que era una funcin propia de DOS, la cual no puede
funcionar en un entorno de C++ Builder. Lo mismo se ha hecho con todas las funciones
de DOS que podan dar problemas al compilador de builder. En este caso simplemente
se renombra la funcin y se modifica para que no haga nada. Anteriormente en vez de
modificar este tipo de funciones para que no hicieran nada, se haca que escribieran en
un formulario de salida provisional su propio nombre para comprobar que
efectivamente se ejecutaban y el programa llegaba all.
-void old_textattr(int newattr) => Esta funcin, al igual que la anterior,
nicamente funciona en la plataforma DOS. Su finalidad era modificar los atributos del
texto mostrado por pantalla. Se han renombrado y posteriormente modificado para que
no haga nada, puesto que los atributos de texto en un entorno C++ builder funcionan de
otro modo.
-void old_gotoxy(int x, int y) => Nuevamente se est frente a una funcin
propia del sistema operativo DOS cuya utilidad es la de situar las coordenadas en un
punto determinado de la pantalla, algo totalmente improcedente en los formularios.
-void old_clrscr() => Al igual que las anteriores esta funcin proviene de la
funcin original clrscr() propia de DOS para limpiar la pantalla antes de presentar
datos por pantalla. En C++ builder se utilizarn otros mtodos para limpiar tanto
memos de informacin y de errores, como la ListBox y las Labels. Tambin esta
funcin ha sido renombrada para que no haga nada.
-int old_cprintf(char *c1,char *c2) => cprintf() es una funcin de DOS que
muestra datos por pantalla. Su funcionalidad no es vlida en un entorno C++ Builder,
con lo cual ha sido sustituida por old_cprintf y modificada totalmente. A esta funcin se
le pasan en este caso 2 punteros a carcter. Mediante la funcin sprintf() se copiarn
las cadenas de caracteres que son apuntadas por los punteros antes mencionados a la
cadena de caracteres llamada cadena. La funcin sprintf() tan slo se encarga de
copiar una cadena de caracteres a un string u otra cadena de caracteres.
-int old_cprintf(char *c1,int c2),
-int old_cprintf(char *c1,char*c2,char *c3),
-int old_cprintf(char *c1,char*c2,int i3,char *c4),
-int old_cprintf(char *c1,char*c2,int i3),
-int old_cprintf(char *c1,char*c2,char *c3,char *c4),
-int old_cprintf(char *c1,int i2,char *c3,char *c4),
-int old_cprintf(char *c1,char* c2,int i3,char *c4,int i5) => Estas siete
funciones realizan exactamente el mismo papel que la anterior, slo que a cada una le
pasamos los argumentos pertinentes dependiendo de los que les sean enviados a estas.
22
-int old_cprintf(char *c1) => Esta funcin escribe en el memo del formulario de
salida cadenas de caracteres. Por primera vez en esta funcin nos encontramos objetos.
FormSalida->Texto->Lines->Add(c1);
Por ejemplo en la lnea superior se ven los comandos necesarios para presentar por
formulario una cadena de caracteres. Cabe observar como la accin que se quiere
implementar recae sobre el ltimo fragmento de cdigo, en este caso:
Lines->Add(c1)
Pero a pesar de ello, se tiene que referirse a ella partiendo desde el conjunto ms
grande al que pertenece, en este caso el formulario Form2 que es el formulario
principal, pasando por los diversos elementos o conjuntos ms pequeos que tambin la
contienen y que a su vez estn contenidos (como todos los elementos) en un formulario
principal o global que es como ya se ha dicho antes Form2. En este caso el elemento
inmediatamente inferior al formulario principal Form2 es un memo cuyo caption
es Texto. Texto es un objeto de la clase TMemo y los objetos de esta clase poseen
una propiedad llamada Lines que a su vez es un objeto del tipo TStrings. Lines a
su vez tiene un mtodo (uno de los muchos que tiene) llamado Add(), que sirve para
aadir lneas de texto. En la siguiente figura se puede apreciar claramente este concepto:
23
La diferencia entre un mtodo y una propiedad es que los mtodos son funciones
que se evalan cuando previamente se le han pasado unos argumentos, exactamente
igual que una funcin normal y corriente. En cambio, una propiedad es una variable
a la que directamente se le asigna un valor, por ejemplo la altura del texto que se
escribe. Cada clase de objeto tiene multiples funciones, mtodos y eventos. Un
evento es como un mtodo pero que se ejecuta como su propio nombre indica,
cuando se produce o provoca un evento o accin, por ejemplo hacer clic en un
formulario, cerrar un ventana, etc, en ese momento, se ejecutar la funcin que se
haya implementado para tal suceso.
24
ansistring es una cadena de caracteres, pero que adems en su cabecera contiene el
nmero de caracteres de dicha cadena excluyendo su carcter final de cadena (\0).
Finalmente se retorna la cadena copiada en s.
Naturalmente este formulario de entrada es el que se emplea en este caso para
introducir el nombre del fichero de extensin .asm.
Ahora se pasar a explicar las nuevas funciones de entrada y salida del linkador. En
el linkador no se ha creado otro formulario de salida y otro de entrada. Ya que se ha
aprovechado el mismo que se ha creado para el ensamblador. La verificacin y
confirmacin de los mensajes, informacin, warnings, nmero de errores, etc del
programa final y definitivo se ha hecho comparndolos directamente con los obtenidos
en el formulario provisional de salida. Tambin se ha tenido en cuenta la posibilidad de
actualizacin posterior del linkador. En las funciones siguientes del linkador,
simplemente se han renombrado todas las funciones y se ha modificado el contenido de
las mismas para que impriman su nombre en el formulario de salida para confirmar que
el programa llega all donde se encuentran y no se atascan antes , entre medio o
despus. El motivo de su renombramiento y posterior modificacin es al igual que
ocurra con las funciones del ensamblador por causas de compatibilidad de los sistemas
operativos, ya que las funciones que haba antes son exclusivamente para DOS y no son
portables a un entorno Windows. Dichas funciones nicamente se encargaban de
aspectos grficos o estticos, de producir sonidos cuando suga algun error, etc. Dichas
funciones son las siguientes:
25
-void old_cfill(unsigned int a,unsigned int b,unsigned int
c,unsigned int d,unsigned char at)
-void old_rectan(int a, int b, int c, int d,char t, char at)
-void old_pit()
-void old_epit()
-menuprin.cpp
26
En Main form se ha de introducir el nombre del primer formulario que ha de salir
por pantalla en momento que se ejecute el programa. En este caso se han creado varios
formularios teniendo en cuenta los formularios provisionales de entrada y salida, pero el
programa definitivo tan slo consta de uno principal.
A continuacin se pasa a explicar el contenido de este archivo:
En primer lugar se tienen los archivos de cabecera en la parte superior del archivo.
Como puede observarse se encuentran los archivos de extensin .h de los formularios
de salida y entrada provisionales y por supuesto el archivo old_io.h, ya que se
necesitarn las funciones de entrada y salida que se han implementado para los
formularios provisionales. Tambin es bsico para que no de errores el compilador,
incluir los fichero de cabecera tanto del linkador como del ensamblador ("ens.h" y
"linker.h") ya que se har alusin a algunas de las funciones contenidas en ellos.
Despus de las libreras se tiene la siguiente declaracin, en la cual definimos que
Form2 es un puntero a objetos de la clase TForm2:
TForm2 *Form2
Seguidamente se citan y explican las funciones del fichero:
try
{
Form2->Memo2->Clear();
Form2->Memo1->Clear();
old_main(argc,argv);
}
catch(char *msg)
{
old_cprintf("FINAL ENS68K: %s\n",msg);
}
28
-void __fastcall TForm2::FuenteChange(TObject *Sender) => Mediante esta
funcin se copia simultaneamente el nombre introducido en la etiqueta del fichero
fuente, a los campos donde se debe introducir el nombre del fichero de destino y el de
listado. La razn de ser de esta funcin es porque normalmente los nombres de los
ficheros destino y listado suelen tener el mismo nombre que el fichero fuente. Sin
embargo, en caso de que el usuario deseara que los nombres de esos campos fueran
distintos a los del fichero fuente, podran cambiarlos posteriormente sin ningn
problema.
Destino->Text=Fuente->Text
Listado->Text=Fuente->Text
Para implementar dicha funcin, simplemente se hace que la propiedad Text de los
objetos de tipo TEdit, es decir, las etiquetas o labels adquieran el valor de la
propiedad Text de la etiqueta del fichero fuente.
29
En cambio el linkador lo seleccionamos mediante:
else if(Pestanas->ActivePage==Linker)
A continuacin en el cdigo contenido tras esas lneas de comandos, se asignan a los
memos de informacin y de errores de ambas partes otros nombres para que el cdigo
del programa principal pueda distinguir a los memos de errores y de informacin del
ensamblador por un lado:
Memo1=Memo1_Ens68K;
Memo2=Memo2_Ens68K;
30
old_cprintf("SE HA PRODUCIDO UNA EXCEPCION: %s\n",msg);
Como ya se ha dicho anteriormente, el hecho de que se lance una excepcin
mediante Throw (en el caso de C++ Builder) no significa que sea forzosamente fruto
de un error, sino que se trata simplemente de un aviso para indicar que se ha finalizado
con xito un programa, o bien tambin puede indicar que se ha producido un error.
31
sscanf() se coge la posicin de memoria que se introducir en la etiqueta Edit1.
Seguidamente se almacenar en el ansistring linea, el nombre del fichero que se
quiere linkar junto con su posicin de memoria, separados ambos por una @ que
indica que el nmero que lleva pegado a ella es una direccin de memoria. En esa
misma asignacin se convierte la posicin de entero a hexadecimal mediante la funcin
IntToHex, ya que el ensamblador trabaja con este tipo de numeracin. Finalmente se
aade el ansistring linea a la ListBox.
-ENS68K.cpp
Este es el mdulo principal del programa que hace referencia a la parte del
ensamblador. Desde aqu se llama a otros submdulos del ensamblador.
En primer lugar se tienen los archivos de cabecera en la parte superior. Entre ellos
estn old_io.cpp y menuprin.cpp que ya se ha comentado antes y que es donde se
encuentran todas las funciones de interfaz con el usuario entre otras. Tambin cabe
destacar la librera standard vcl.h (Visual Component Library), ya que en ella se
encuentran todas las funciones que hacen referencia a los elementos grficos, controles
y objetos que ya vienen creados en el entorno C++ Builder. Las libreras contenidas
entre <> son las que ya vienen implementadas y las que vienen entre son los archivos
creados por la persona que realice el proyecto y que contienen funciones que se
emplearn en este fichero.
Seguidamente se declaran las variables globales empleadas en este mdulo, algunas
de las cuales son inicializadas.
A continuacin se definen todos los posibles mensajes que se mostrarn en los
memos de error y de informacin dependiendo de los errores que tenga el archivo a
ensamblar o de los datos que introduzca el usuario por teclado. Dichos mensajes se
almacenarn en un array de punteros a carcter:
char *mensaje_ens68k[]
Despus se definen las funciones que se emplearn en este mdulo.
Ahora se pasar a explicar las funciones que conforman este fichero:
33
En la segunda pasada se realiza la codificacin de las instrucciones. Como la tabla de
smbolos est completa, se resuelven las llamadas a las etiquetas. Si se da el caso de que
las etiquetas que no existan, stas se considerarn externas al mdulo y se prepararn
para resolverse en el linkador.
Al igual que antes se advertir de que ha tenido lugar una segunda pasada por el
memo de informacin del ensamblador.
Se tiene que tener en cuenta que al principio de cada pasada se inicializa el PC
(program counter), para pasar a contener la primera instruccin a ensamblar contenida
en el fichero .asm.
En esta segunda pasada se procede al tratamiento de las directivas. Es prcticamente
igual que en la primera pasada, con la salvedad de que ahora se graban en el fichero
objeto.
-static int lee_linea(char *s,FILE *ff) => Esta funcin lee una linea del
fichero que especifiquemos sin importar si la lnea acaba en \n o si acaba en \r\n. La
variable n limita el nmero de caracteres que se pueden leer por lnea. En este caso
n=255 como mximo.
-static int trans (char *entrada,char *salida,int *error) => Esta funcin
coge un string, que sern los parmetros de una directiva del tipo DC y los analiza
devolviendo otra cadena que sern una serie de dgitos hexadecimales
equivalentes a la cadena de entrada.
-char *treutabs(char *sin,char *s) => Sustituye las tabulaciones por 8 espacios
para evitar caracteres indeseados en los old_cprintf, pero no modifica s para evitar
alterar las funciones que emplean punteros sobre s.
-void ini() => Esta funcin es bsica para que el programa ensamble tantas veces
como se quiera, ya que si se omite slo ensamblara bien la primera vez. Lo nico que
se hace en su interior es inicializar las variables que deben ser inicializadas con un
cierto valor justo antes de ejecutarse el programa.
-COPYR.cpp
34
cuya nica misin es mostrar en el memo de informacin un mensaje de
presentacin.
-TABLA.cpp
Este mdulo contiene el ensamblador de lneas y las tablas que utiliza ste,
conteniendo los nombres de los nemotcnicos , y otros valores necesarios para el
ensamblado. En este caso no se incluyen los archivos de cabecera de los componentes
visuales (vcl.h), ni el de funciones de entrada y salida, ni tampoco el que contiene las
funciones asociadas a nuestro formulario, debido a que todas las funciones contenidas
en este archivo son puramente relativas al funcionamiento del ensamblador en s. En
resumen, la misin de las funciones contenidas en este archivo es la decodificacin de
las instrucciones del motorola 68000.
A continuacin se definen las constantes que nos indicarn si un nemotcnico, un
direccionamiento o un tamao son incorrectos, el nmero de nemotcnicos
implementados, etc.
Seguidamente se definen las funciones empleadas, donde se encuentran todas las
instrucciones ensamblador del MC68000. Luego vienen dadas varias tablas donde se
encuentran los nombres de todas las instrucciones, los tamaos correspondientes a cada
instruccin, una tabla de valores y finalmente una tabla con el nmero de operandos que
puede tener cada instruccin y otra con la longitud que pueden tener dichos operandos.
A continuacin, despus de declarar todas las variables globales vienen las funciones
implementadas:
-procesar(int (*f) ()) => A esta funcin simplemente se le pasa como argumento
un puntero a funcin que devuelve un entero y nos devuelve exactamente lo mismo.
-static int
tipo1(void),add(void),adda(void),addi(void),addq(void),and(void),
andi(void),asr(void),bra(void),bchg(void),chk(void),neg(void),
cmp(void),cmpm(void),nbcd(void),endd(void),eor(void),equ(void),
exg(void),ext(void),exter(void),glob(void),jmp(void),lea(void),
35
link(void),move(void),movea(void),movem(void),movep(void),
moveq(void),page(void),nada(void),or(void),org(void),rel(void),
stop(void),sub(void),swap(void),title(void),trap(void),unlk(void),
abso(void),dc(void),ds(void),dbcc(void),scc(void),high(void),low(voi
d) => Todas estas funciones se encargan de decodificar las instrucciones del
MC68000 y buscar en las tablas el nmero de operandos, su longitud, la longitud de
las diferentes instrucciones, etc.
-static void opp_a_op(void) => Esta funcin actualiza el valor de los operandos,
dndoles los valores que se les hayan introducido en el programa en ensamblador.
-FUNC.cpp
Este mdulo contiene una serie de funciones de apoyo para el ensamblador de lineas,
para extraer operandos, nemotcnicos y para descifrar los operandos y codificarlos. Al
igual que en el archivo anterior, aqu tampoco se citarn el archivo de cabecera que
contiene los componentes visuales ni los que contienen las funciones de interfaz con el
usuario o las relativas directamente a nuestro formulario.
A continuacin se pasa a explicar cada una de las funciones que conforman este
archivo:
-char *coger_palabra(line,palabra,label) => Esta funcin devuelve en
palabra la primera palabra de una linea, en linea la posicin dentro de la lnea donde
empezar a buscar los parmetros la funcin correspondiente, y finalmente label dice
si lo que ha encontrado es una label o no. En size devuelve 1 si la instruccin es
de tamao byte, 2 si es de tamao word y 3 si es de tamao long word. Si no se
ha especificado un tamao devuelve 4 y si hay un error size pasa a valer 16. Cabe
destacar que una etiqueta no debe llevar ningn punto.
Lo que hace en primer lugar esta funcin es elimar espacios, despus una vez llega a
una palabra, se hace con ella y lo primero que hace es comprobar si es una etiqueta o es
cualquier otra instruccin. En caso de que efectivamente sea una etiqueta la funcin
habr finalizado su tarea, de lo contrario, si se trata de una instruccin, la funcin
averiguar el tamao de la misma. Finalmente se hace que line apunte a la prxima
palabra de la lnea.
36
-char *cogeyanal(line,err,externo,aa) => La funcin cogeyanal devuelve
como resultado un apuntador al prximo carcter despus del operando y en err el
error cometido. En operando quedar el operando que se anda buscando. En aa
quedar el tipo de direccionamiento que utiliza.
El tipo de direccionamiento puede ser:
1 = Registro direcciones
2 = Ind registro e indice
3 = Inmediato
4 = Registro Indirecto
5 = Predecremento
6 = Postincremento
7 = Registro datos
8 = Relativo al PC
9 = Relativo al PC con ndice
10= Registro Ind. con offset
11= Direccin absoluta
12= CCR
13= SR
14= USP (+error =8)
En primer lugar la funcin mira si la instruccin contiene algn operando. A
continuacin, segn si lleva o no parntesis descartar unos modos de direccionamiento
u otros o si se introducen ms parntesis de los necesarios, en cuyo caso emitir un
error. Adems tambin se buscan posibles errores de sintaxis, se mira si un operando es
o no un registro y se vigila que los tamaos de los operandos sean los correctos.
-static struct operando registro (char *reg,int l) => Mira si hay datos en
el registro y el tamao que tienen estos, ya sea byte, word o long word.
-int masde4bits(a),
-int masde8bits(a),
-int masde16bits(a) => Mediante estas 3 funciones se identifica el tamao de los
operandos.
37
-long int hexdec(expresion,err) => Esta funcin se encarga de convertir valores
de hexadecimal a decimal, ya que las direcciones de los registros y datos vienen
codificadas de esa manera.
-long int bindec(expresion,err) => Esta funcin se encarga de convertir valores
de binario a decimal, puesto que el usuario o programador puede introducir las
direcciones directamente en binario poniendo previamente al nmero el smbolo #.
-ARBOLES.cpp
Este mdulo contiene las funciones de manejo de los rboles binarios utilizados en
este ensamblador para almacenar y recuperar las etiquetas , sus valores y el tipo de
etiqueta que es. Tampoco en este caso se incluyen las libreras visuales ni los archivos
que contienen las rutinas de interfaz. En la declaracin de variables, se puede apreciar
que en:
static char ti[][24]
se almacenan los mensajes que se pueden presentar por el memo de informacin
del ensamblador relativos a las etiquetas.
A continuacin se explican las funciones contenidas en este archivo:
-struct arbol *buscar_rama(struct arbol *a,char *label) => Esta funcin
busca dentro de una estructura de rbol binario, en el cual se tendrn las etiquetas del
programa, una determinada etiqueta, devolvindonos un puntero a la rama que estamos
buscando. Se trata de una funcin recursiva. Esta funcin es llamada cada vez que es
necesario recuperar el valor de una etiqueta.
-void listar_arbol (a,i) => Esta funcin inserta dentro de una estructura de rbol
binario, en la que se tendrn las etiquetas del programa, una determinada etiqueta,
devolvindose un puntero a la raiz del rbol. Al igual que en el caso anterior, se trata de
una funcin recursiva.
38
-PARSER.cpp
Este mdulo contiene un parser del tipo recursivo descendente para descifrar y
evaluar expresiones matemticas y lgicas con nmeros en binario, decimal y
hexadecimal as como con etiquetas previamente definidas.
Tampoco esta vez se declaran las libreras de componentes visuales ni los archivos
de cabecera con las funciones de entrada/salida (I/O). Luego se declaran las variables
globales y las funciones empleadas en este mdulo.
A continuacin se pasa a explicar dichas funciones:
-static void primitiva(resultado) => Esta funcin utiliza las variables globales
tipo_termino y termino para hallar el valor de termino. La variable
tipo_termino debe ser o VARIABLE o NUMERO , sino es as hay un error de
sintaxis en la expresin.
-static void arit (o,r,h) => Esta funcin realiza una operacin especificada en la
variable o sobre los trminos r y h. Esta operacin debe ser una de las operaciones
vlidas implementadas en este PARSER.
-static void unitario (o,r) => Esta funcin se utiliza para implementar el "NOT"
lgico y el cambio de signo.
-static void coger_termino() => Esta funcin se encarga de extraer uno a uno los
trminos que forman la expresin a evaluar. Extrae los trminos de la expresin
almacenada en p y los coloca en termino.
39
-static esdelimitador(c) => Esta funcin devuelve un 1 si el carcter que se le
pasa es un delimitador, y un 0 si no lo es.
-static long int valor (puntero) => Esta funcin halla el valor de un smbolo y
el tipo de smbolo que es.
-ERRORES.cpp
Este mdulo contiene los mensajes de error del ensamblador. En este caso puede
verse como s que contiene las libreras de componentes visuales (vcl.h) as como el
archivo que contiene las nuevas funciones de entrada/salida, ya que se emiten mensajes
en los memos y finalmente la que hace referencia al formulario, ya que los mensajes
saldrn en un objeto contenido en l. La variable que almacena estos mensajes es un
array de punteros a carcter:
*terror[]
Tan slo contiene la funcin:
-void error(tipo) => Esta funcin se llama cada vez que el ensamblador encuen-
tra un error y nos muestra una descripcin del error cometido por la pantalla. Cada vez
que se llama a esta funcin se incrementa la variable global errores que contiene el
nmero total de errores cometidos durante el ensamblado. Cabe destacar adems que
mediante, las lneas siguientes, se muestran los mensajes de error por el memo de
errores del ensamblador:
Form2->Show();
Form2->Printf_Error("** %s **\n\r",terror[tipo+idioma*NE]);
-LINKER.cpp
Este es el mdulo principal del programa que hace referencia a la parte del linkador.
Desde aqu se llama a otros submdulos del linkador.
En primer lugar se tienen los archivos de cabecera en la parte superior. Entre ellos
estn old_io.cpp y menuprin.cpp que ya se ha comentado antes y que es donde se
encuentran todas las funciones de interfaz con el usuario entre otras. Tambin cabe
destacar la librera standard vcl.h (Visual Component Library), ya que en ella se
encuentran todas las funciones que hacen referencia a los elementos grficos, controles
y objetos que ya vienen creados en el entorno C++ Builder.
40
A continuacin se declaran las variables globales y las funciones empleadas. Una de
las variables es la siguiente:
char *mensaje_linker[]
Se trata de un array o vector de punteros a carcter que almacenan las direcciones
donde se encuentran los mensajes tanto de informacin como de posibles errores del
linkador.
Seguidamente se describen todas las funciones que componen este mdulo:
41
Si tipo== 4 se trata de un fichero de extensin .map.
Esta parte se ha implementado mediante un switch:
switch (tipo)
case 0: if(indice_obj+1>Form2->ListObj->Items->Count)
*f=0;
else
{
AnsiString todo=Form2->ListObj->Items->Strings[indice_obj];
AnsiString dato;
int posarroba=todo.AnsiPos("@");
if(posarroba==0)
dato=todo;
else
dato=todo.SubString(1,posarroba-1);
strcpy(f,dato.c_str());
indice_obj++;
}
break;
case 3: strcpy(f,Form2->s28->Text.c_str());
break;
default: strcpy(f,Form2->map->Text.c_str());
}
En primer lugar se mira si se han acabado de coger los diferentes nombres de los
ficheros a linkar en la ListBox. Para ello se observa cual es el ndice actual de la
ListBox, es decir, se averigua por qu Item va, y se compara con el nmero de
Items totales de la ListBox para ver si ha acabado. Si es as, el contenido del
puntero *f se inicializar a 0 para la prxima vez que se linke.
Si no es as, es decir si se tiene la lnea de ms abajo, entonces significa que el
programa no ha terminado de coger el nombre de todos los ficheros de la ListBox:
indice_obj+1<Form2->ListObj->Items->Count
Items es una propiedad de objetos del tipo TListBox, la cual a su vez posee
distintas propiedades para manipular los strings o cadenas de caracteres contenidos en
la ListBox. Count es una de las propiedades de Items e indica el nmero de
strings totales que posee una ListBox.
Si el programa no ha terminado de coger los nombres de todos los ficheros de la
ListBox entonces mediante la siguiente lnea de cdigo, se coge todo el ansistring
de la ListBox que toque en ese momento:
todo=Form2->ListObj->Items->Strings[indice_obj]
todo es un objeto de la clase ansistring. A continuacin se mira si el ansistring
actual contiene el carcter @. En caso de que el fichero .asm sea reubicable, el
42
ansistring de la ListBox contendr una @ a causa de la funcin que se ha
implementado anteriormente contenida en el archivo menuprin.cpp. Si contiene la
@ mediante la siguiente lnea de cdigo, se conseguir el ndice o la situacin donde
se encuentra dicho carcter:
posarroba=todo.AnsiPos("@")
Ansipos es un mtodo de objetos de la clase ansistring que retorna la posicin
de un determinado carcter que contiene un ansistring. Si dicho carcter no est
contenido en el ansistring entonces retornar un "0". Si no encuentra la @ significa
que el usuario no ha insertado una posicin de memoria donde ensamblar el fichero, en
cuyo caso el programa nicamente se har con el nombre del fichero asignando al
tambin ansistring dato el ansistring todo. Sin embargo, si el ansistring
todo si que contiene el carcter @ mediante la siguiente lnea de cdigo, se coge el
nombre del fichero.
dato=todo.SubString(1,posarroba-1)
Substring es otro mtodo de los objetos de la clase ansistring que coge un
substring existente dentro de otro ansistring. En esta parte slo coge el nombre del
fichero y no la posicin de memoria. Lo que indica que substring se coge dentro del
ansistring es la posicin de inicio y de final, en este caso la posicin inicial es el
primer carcter y la final, una posicin justo antes de la @ con lo cual abarca todo el
nombre del fichero .obj.
Finalmente a partir de los siguientes comandos, se copia el ansistring
dato.c_str() que contiene el nombre del fichero a la variable f y luego se incrementa
el ndice indice_obj para que el siguiente elemento de la ListBox sea procesado:
strcpy(f,dato.c_str());
indice_obj++;
Si el usuario introduce una posicin de memoria, sta se procesa en la funcin:
void __fastcall TForm2::AnadirClick(TObject *Sender)
como ya se ha explicado en el apartado referente a las funciones de las que se
compone el archivo menuprin.cpp.
En las otras opciones que componen nuestro switch:
case 3: strcpy(f,Form2->s28->Text.c_str());
break;
default: strcpy(f,Form2->map->Text.c_str());
simplemente se copian los ansistrings que contienen los ficheros .s28 y .map a
las variables corespondientes con las que trabaja el programa a la hora de procesar dicha
informacin.
Seguidamente se asigna a la variable i el nmero de caracteres que contiene el
ansistring, es decir, la longitud del nombre del fichero. Si i igual a 0, en la versin
para DOS se sala del bucle infinito, es decir, ya no segua pidiendo nombres el
programa.
A continuacin, en el trozo de cdigo siguiente, mediante la funcin strchr() se
busca el carcter . en la cadena f, y si no la encuentra le concatena o aade la
extensin .s28 a partir de la funcin strcat().
if (!strchr(f,'.'))
strcat (f,".S28");
43
Es decir, que si el usuario no introduce la extensin, sta es aadida automticamente
por el programa. En el ejemplo de arriba era el caso que haca referencia a ficheros de
extensin .s28; pero tambin se hace esto con los otros 2 tipos de ficheros de la forma
siguiente:
if (!strchr(f,'.')) strcat (f,".MAP")
if (!strchr(f,'.')) strcat (f,".OBJ")
Luego, mediante la funcin siguiente, se busca en una lista los diferentes archivos
.obj a linkar y se mira que no haya ninguno repetido:
buscarlista(ficheros,f)
El resto de cdigo de la funcin principal se encarga de linkar dichos ficheros.
44
-void insertarabs(e) => Esta funcin tiene por misin hacer que un archivo
reubicable se convierta en absoluto en la direccin que haya introducido el usuario en la
Label correspondiente.
-void insertarreu(e) => Esta funcin realiza la misma funcin que la anterior, pero
con ms de un fichero, es decir los ubica a todos a partir de la direccin que introduzca
el usuario.
-void listar(l) => Esta funcin simplemente se encarga de listar todos los ficheros a
linkar.
-void sexit() => Esta cadena finaliza la funcin mostrando el copyright. Esto en la
versin anterior para DOS, ya que ahora ya no ocurre eso.
-void nexit(int ne, char mis[]) => Esta funcin es la opuesta a la anterior, ya
que sale del programa pero lanzando una excepcin mediante throw, que en este caso
avisa de que se ha producido algn error. Para que podamos identificar esta excepcin y
diferenciarla de las dems, se imprimir: ENS1.
45
-Subf2.cpp
Este fichero nicamente contiene funciones exclusivamente para DOS, e intiles para
el nuevo entorno. Simplemente se ocupan del entorno grfico y la presentacin
mediante la creacin de marcos, etc. Tambin hay implementadas pequeas funciones
que mediante la funcin Sound() emiten un sonido para indicar que se ha producido
algn error, pasndoles como argumentos la frecuencia a la que queremos que suene y
la duracin de tal sonido. Tampoco este ltimo tipo de funciones sirve con C++ Builder.
Lo nico que se ha hecho una vez ms es renombrarlas y hacer que muestren por el
memo provisional de salida su nombre, para comprobar que efectivamente el
programa llega all.
A continuacin se citan:
-old_rectan(a,b,c,d,t,at),
-old_top(x1,x2,y),
-old_bot(x1,x2,y),
-old_vert(x,y1,y2) => Estas 4 funciones tan slo realizan funciones grficas
exclusivas de DOS.
46
-Copyrlink.cpp
-Parserl.cpp
Este archivo contiene funciones utilizadas a la hora de linkar los ficheros .obj.
Simplemente realizan sencillas operaciones aritmticas o lgicas.
-static void nivel1(long int *) => Esta funcin hace la OR y la XOR lgicas.
-static void nivel2(long int *) => Esta funcin hace la AND lgica.
-static void nivel3(long int *) => Esta funcin suma o resta 2 trminos.
-static void nivel6(long int *) => Se emplea para las expresiones quie vienen
dadas entre parntesis.
-static esdelimitador(char)
47
-static int esta_en (char,char *)
48
2 Presupuesto
TOTAL 515.583
49
3 Conclusiones
50
que se ha producido algn error ya sea por la introduccin errnea de los datos por el
usuario o por el propio programa; y en segundo lugar las funciones de entrada y salida
que hacen posible la interaccin con el usuario. Estas ltimas consisten bsicamente en
funciones encargadas de coger los nombres de los ficheros a linkar o ensamblar, de las
etiquetas dispuestas para ellos, de conseguir la posicin la posicin de memoria donde
se desea linkar dichos archivos, de mostrar a travs de los memos del formulario
principal los errores o warnings que se han producido, etc.
Despus de esta primera fase de reconocimiento, se ha pasado a renombrar las
funciones que se comentaba antes. Algunas han sido simplemente renombradas y otras
renombradas y completamente modificadas.
El primer tipo de funciones para DOS al que se ha hecho referencia antes, las cuales
en realidad no tienen ninguna utilidad para el nuevo entorno creado, se han conservado
por diversas razones: en primer lugar lo que se ha hecho con estas funciones es hacer
que muestren su nombre por un formulario provisional de salida, de esta forma se poda
comparar y verificar que los mensajes que salan en nuestro formulario final y definitivo
eran correctos, y en segundo lugar, como ya se ha dicho anteriormente, se pretende
realizar un macroensamblador a partir de este proyecto, con lo cual dichas funciones
resultarn muy tiles.
El segundo tipo de funciones, son bsicas para el interface con el usuario. Estas no
slo han sido renombradas sino que en la mayora de los casos, ntegramente
modificadas. Por poner un ejemplo en las funciones principales del ensamblador y el
linkador contenidas en los ficheros ENS68K.cpp y Linker.cpp se encuentran los
cdigos encargados de hacerse con los nombres de los ficheros a linkar o ensamblar. En
ambos casos esto se haca por teclado. Antes de proceder a su modificacin para su
posterior adaptacin, se ha estudiado detalladamente el proceso y camino de estos datos
por parte de la versin para DOS. Finalmente se han adaptado y acondicionado para que
pudieran ser compatibles con C++ Builder.
51
4 Pliego de Condiciones
4.1. GENERALIDADES
4.1.3.1. COMIENZO:
La Empresa Programadora comenzar a crear el programa en el termino que figura
en el contrato establecido con la Empresa Usuaria, o en su defecto a los quince das de
la adjudicacin definitiva o la firma del contrato.
52
4.1.3.2. PLAZO DE EJECUCIN:
53
4.1.5. TRABAJOS COMPLEMENTARIOS.
4.1.6. MODIFICACIONES.
Cuando la Empresa Programadora halle cualquier parte del Programa defectuosa que
no se ajuste a lo especificado en el Proyecto o en este Pliego de Condiciones, el Tcnico
Director podr aceptarlo o rechazarlo; en el primer caso, ste fijar el precio que crea
justo con arreglo a las diferencias que hubiera, estando obligada la Empresa
Programadora a aceptar dicha valoracin, en el otro caso, se reconstruir a expensas de
la Empresa Programadora la parte mal ejecutada sin que ello sea motivo de reclamacin
econmica o de ampliacin del plazo de ejecucin.
Sern de la Empresa Programadora todos los medios y mquinas auxiliares que sean
necesarias para la ejecucin del Programa.
54
4.1.9. CONSERVACIN DEL PROGRAMA.
Una vez terminado el Programa, tendr lugar la recepcin provisional y para ello se
practicar en ellas un detenido reconocimiento por el Tcnico Director y la Empresa
Usuaria en presencia de la Empresa Programadora, levantando acta y empezando a
correr desde ese da el plazo de garanta si se halla en estado de ser admitido.
El Programa solo se puede vender, tal cual, sin modificarlo, completamente con la
licencia de derecho de uso del Programa, la copia del Programa y el Manual de
Instalacin y Uso.
55
4.1.10.3. PLAZO DE GARANTA.
4.1.11.2. PRESENTACIN.
Las empresas seleccionadas para dicho concurso debern presentar sus proyectos en
sobre lacrado, antes del 15 de Febrero de 2002 en el domicilio de la Empresa Usuaria.
4.1.11.3. SELECCIN.
4.1.12. FIANZA.
56
De no estipularse la fianza en el contrato se entiende que se adopta como garanta
una retencin del 5% sobre los pagos a cuenta citados.
4.2.2. PRECIOS.
57
En caso de tener que realizarse unidades de Programa no previstas en el proyecto, se
fijar su precio entre el Tcnico Director y la Empresa Programadora antes de iniciar el
Programa y se presentar a la Empresa Usuaria para su aceptacin o no.
4.2.4. PENALIZACIONES.
4.2.5. CONTRATO.
4.2.6. RESPONSABILIDADES.
58
relacionadas con el mismo. Tambin es responsable de los daos que por errores,
inexperiencia o empleo de mtodos inadecuados se produzcan en la Empresa Usuaria.
Siempre que se rescinda el Contrato por causas anteriores o bien por acuerdo de
ambas partes, se abonar a la Empresa Programadora las unidades de Programa ya
terminadas.
59
Cuando se rescinda el contrato llevar implcito la retencin de la fianza para obtener
los posibles gastos de conservacin de el perodo de garanta y los derivados del
mantenimiento hasta la fecha de nueva adjudicacin.
4.3.1. PERSONAL.
La Empresa Programadora tendr el nmero y clase de operarios que haga falta para
el volumen y naturaleza de los trabajos que se realicen, los cuales sern de reconocida
aptitud y experimentados en el oficio. La Empresa Programadora estar obligada a
separar de la programacin, a aquel personal que a juicio del Tcnico Director no
cumpla con sus obligaciones, realice el trabajo defectuosamente, bien por falta de
conocimientos o por obrar de mala fe.
Para que el Programa pueda funcionar con cierta agilidad se aconseja tener como
mnimo el siguiente Hardware:
PC 486 con coprocessador a 66 Mhz como mnimo 8 Mb de RAM como mnimo 3
Mb de espacio libre en el disco duro. Ratn Microsoft o compatible.
Monitor SVGA con una resolucin de 800 * 600 pxeles como mnimo.
Para que pueda funcionar el Programa se tendr que tener instalado en el ordenador
como mnimo el Software siguiente con sus respectivas licencias.
Microsoft Windows 95 o posterior.
60
Manual de usuario del Ens&Link 68000
61
1 Introduccin
2 Descripcin de manejo
2.1 Ens68K
62
Lo primero que haremos antes de linkar el cdigo que hemos generado ser
ensamblarlo. Para ello clicaremos previamente sobre la pestaa superior donde pone
Ens68K. A continuacin seguiremos los siguientes pasos:
63
Fig3. Resultados del ensamblado
Mensajes de Informacin:
64
-"TABLA DE SIMBOLOS"
-"PAGINA"
-"FICHERO DE AYUDA HELP.HLP NO ENCONTRADO"
-"MEMORIA INSUFICIENTE"
Mensajes de Error:
-"PARAMETROS ERRONEOS"
-"ERROR AL CREAR EL FICHERO OBJETO %s"
-"ERROR AL CREAR EL FICHERO DE LISTADO %s",
-"ERRORES"
2.2 Link68K
65
Una vez ensamblado se habr generado un fichero cuya extensin ser .obj
(fichero objeto).
A continuacin tendremos que linkar los archivos .obj creados siguiendo los
siguientes pasos:
66
Fig6. Introduccin de los nombres de los ficheros en la ListBox
67
Fig7. Resultado del linkado de archivos
Mensajes de Informacin:
-"LINKER 68000"
-"MEMORIA INSUFICIENTE"
-"ETIQUETA GLOBAL '%s' DECLARADA EN DOS MODULOS"
-"NO SE PUEDE EVALUAR LA EXPRESION '%s'"
-"LISTADO DE ETIQUETAS
-"TIPO MODULO ETIQUETA VALOR"
-"FICHERO OBJETO '%s' REPETIDO"
-"EL FICHERO OBJETO '%s' NO EXISTE"
68
-"MODULO NOMBRE SEGMENTO INICIO FINAL"
-"LOCAL "
-"GLOBAL
-"ETIQUETA EXTERNA NO RESUELTA"
-"FORMATO DEL FICHERO '%s' INCORRECTO"
Mensajes de Error:
-"NUMERO DE ERRORES"
-"ERROR AL ABRIR EL FICHERO"
-"SEGMENTOS DEL PROGRAMA SOLAPADOS"
69