Pregunta sobre sistema 8088A

Hola grupo

Hace un par de años arme un sistema con un microprocesador 8088A, memorias RAM, EPROM y un 82c55. En aquel entonces escribia mis programas en lenguaje ensamblador y con ayuda del TASM obtenia el codigo objeto para grabar el programa y tablas de datos a la EPROM, y en estos dias me ha dado por desempolvar el sistema y ponerlo a trabajar. Pero me he quedado pensando en la cuestion de si seria posible usar algun compilador de C que me ayude a desarrollar mas rapido las aplicaciones, entiendo que debido a la arquitectura de mi sistema muchas funciones queden inservibles (printf, getch, etc.. y operaciones matematicas en coma fija a falta de un coprocesador matematico) pero creo que tal vez minimo podria aprovecharme de los loops o condicionales (if, for, while y las operaciones logicas).

Para comprobar si es posible usar un compilador de C (el Turbo C de Borland por ejemplo) tengo un par de dudas:

1) Como especificaria desde el C las direcciones para el segmento de codigo, datos y pila de manera que coincidan con el mapa de memoria de mi sistema. En ensamblador empleaba algo asi como: "Data SEGMENT AT 0". 2) Alguien podria recomendarme algun desensamblador(disassembler se traduce asi?? :-s ) conocido o que trabaje bien? de este modo podria repasar el codigo ensamblador generado por el compilador.

Saludos

Reply to
FlyBoy
Loading thread data ...

"FlyBoy" escribió en el mensaje news: snipped-for-privacy@individual.net...

lenguaje

en

de

Si usas un compilador de C, no necesitarías el coprocesador para realizar operaciones en coma variable. El propio C provee el tratamiento de variables float (coma flotante), y las funciones matemáticas para trabajar con ellas (creo que en la librería math.h). El propio compilador (no he bregado mucho con Turbo C, pero Turbo Pascal sí que lo hacía) se encarga de compilar para usar coprocesador o no (según las opciones de compilación que uses).

Creo que tampoco las funciones printf y getch tienen por qué ser inútiles, y podrías usar redirecciones para utilizar printf, por ejemplo para enviar datos a un puerto serie, o getch para leer el estado de algunas teclas, aunque quizás haya que reescribir algo de código.

Este tipo de cosas son habituales en los compiladores de C que se suelen usar para escribir firmware para microcontroladores, con los que, normalmente, el compilador no sabe a priori el hardware que habrá alrededor del micro.

Yo le veo a esto una dificultad importante. Los compiladores para DOS que yo conozco (he usado mucho Turbo Pascal, y no creo que el proceso de compilación difiera mucho del que usa Turbo C), hacen un uso continuo de las funciones del DOS y de la BIOS, porque es la forma más lógica de mantener la compatibilidad entre el software y el hardware en un PC. Sin embargo en tu caso no existen estas funciones.

Una posibilidad sería escribir esas funciones, de forma que hicieran que tu hardware, de cara al compilador, fuera compatible con el de un PC, pero me parec que eso sería un trabajo enormemente arduo.

La verdad es que tampoco tengo muy claro que el compilador use esas funciones para tareas que no requieran una interacción con el hardware, y posiblemente, para la gestión de variables y estructuras, todo el tema matemático, el control de flujo, y cosas así, el compilador genere código máquina puro, sin llamadas a funciones del DOS o la BIOS.

Borland

codigo,

Ni idea. Pienso que en un sistema DOS, esos datos los obtiene el compilador llamando a funciones del DOS, que a su vez utilizan funciones de la BIOS para averiguar las características del hardware disponible. Pero es posible que se pueda forzar al compilador a que utilice un mapeado de memoria concreto mediante opciones o directivas de compilación, (en compiladores para microcontroladores, todo esto se suele definir en una librería, pero no sé si Turbo C permite eso).

traduce

Hombre, si vas a usar productos Borland, los suyo sería usar el Turbo Assembler y el Turbo Debuger (normalmente venían incluidos con los compiladores), pero vamos, que el humilde DEBUG del DOS te permite desensamblar un programa que esté en memoria.

Pero yo creo que lo que en lugar de Turbo C, te interesaría más usar un compilador genérico para sistemas 8088/8086 (no necesariamente PC), como este:

formatting link

Este tipo de compiladores están orientados a crear soft para sistemas hardware genéricos, al estilo de los compiladores para microcontroladores, permiten definir exactamente el hardware (el mapeado de memoria, registros, etc) en la librería startup.h (o similar), y suelen incluir ensamblador, debuger, y me imagino que simulador. No sé cómo de fácil será pillar un compilador de estos, o si habrá alguno freeware por ahí, pero podrías probar con la versión demo de este que te he dicho, a ver qué tal (creo que la limitación de la demo es el tamaño del programa, así que para probar te vale).

--


Saludos de Jose Manuel Garcia
jose.mgg@terra.es
http://213.97.130.124
Reply to
Pepitof

Diox! te vas a convertir en un "clon" mío pero con 20 años menos :-) Yo pasé unos años trabajando así, en los primeros tiempos del PC, puedes hacerlo muy facilmente.

Por lo que parece, dispones del TASM, TurboC, necesitas tambien TLINK, y TLIB para linkar los programas y crearte tus librerías, todo ello en versiones antiguas de 16 bits. Cuento más moderno el compilador, mejor, pero que sea de 16 bits.

Lo primero: debes estudiar detalladamente las opciones de turboc, verás que hay una opcion /S que te genera como salida el assmbler, así puedes estudiar cómo genera asm el compilador y verás que no es tan diferente a tu propio código asm, despues de ver esto ya no querrás usar más asm :-)

En el código C puedes insertar codigo asm, hay tambien pseudoinstrucciones para manejar los registros de segmento, no recuerdo ahora la sintaxis exacta pero no es dificil y hay varias formas de hacerlo.

Debes aprender a compilar con el turboc sin usar las opciones por defecto, primero compilas y luego linkas. Esto te permite prescindir del código de arranque y librerías de turboc.

Debes escribir tu propio código de arranque. El turboc puede compilar con varios modos o modelos de memoria, el más sencillo es "tiny", que te genera ejecutables ".com" para DOS que son fáciles de cargar, ya que no puedes usar el cargador de exes del DOS. Un ejecutable .com es un binario que se carga en un segmento en el offset 0x100, y comienza su ejecucion en ese punto con DS=ES=SS, y SP en el final del segmento. Así solo puedes generar ejecutables de 64K (menos), pero puedes tener distintos ejecutables en distintos segmentos y comunicarlos por interrupciones software.

Y con eso ya lo tienes todo. Lo único es que en determinadas circunstancias el turboc genera una llamada a una funcion de su librería, hay cuatro o seis funciones de las que no puedes prescindir y que tendrás que reescribir en tus librerias. Son funciones del estilo de inicializar un bloque de memoria a cero, o copiar un bloque de memoria de un sitio a otro, etc... muy sencillo todo y no tienes que hacerlo ahora, solo cuando te salga un error de simbolo no resuelto por el link miras en el asm cual es la llamada a esa funcion (cómo pasa los parámetros) y escribes la funcion.

Joder, todo esto lo tenía olvidado y ahora me entra la nostalgia, que mierda el modo protegido ;-)

Reply to
Nolo Pongo

Hola,

nd

go,

Busca un directorio llamado startup. Ah=ED es donde se encuentran los archivos C0*.asm que definen los segmentos.

Aparte tienes la opcion de generar un fichero .com si le pones el modelo small (menos de 64K de codigo y datos). Para generar este fichero creo que era la opcion /t.

ce

Si tienes el pack completo de borland con Turbo Assembler, Turbo Debugger, etc... no necesitas desensamblador. Le puedes pasar una opcion con la que te saca el codigo en ensamblador. Pero si necesitas uno puedes decargarte NASM.

Hacia tiempo que no me pasaba por aqu=ED (cosas de wanadoo y sus news).

Un saludos a todos.

Reply to
RF

ias

je

en

de

nd

go,

ce

La mayoria de las librerias de C, o bien en alguna parte echan una llamada al DOS o bien necesitan de la rutina de arranque C0x que si hace llamados al DOS. Para usarlas tendrias que escribir tu propia rutina de inicializacion que contemple esos llamados, algo que medio largo si se busca compatibilidad total. Tampoco estoy seguro si la libreria de emulacion del coprocesador se podra usar de manera sencilla sin el DOS, tal vez te convenga trabajar con punto fijo.

Esto es un ejemplo de como lo puedes hacer, durante el desarrollo lo debuggeas a nivel fuente con el Turbo Debugger, y al final generas el binario.

;--- MODULO ASM DE INICIO .MODEL TINY,C

.DATA extrn p:WORD ; variables del bloque en C

.CODE extrn prueba:proc ; rutina en C

ORG 7C00h ; Inicio del codigo en la EPROM Inicio proc mov ax,cs ; Inicializo segmentos mov es,ax ; y stack mov ds,ax mov dx,4000h mov ss,ax mov sp,dx

;............ ;............ ;............

mov ax,45h ; Pongo cualquier cosa mov p,ax ; en las variables del C

call prueba,57h ; Llamada de 'alto nivel' ; a la rutina C

;............ ;............ ;............

mov ax,4C00h ; Terminacion DOS 'solo para pruebas' int 21h endp

end Inicio

;--- MODULO C

int p;

int prueba(int x){ x*=3Dx; // puse cualquier operacion if(x>1300) x/=3D300 ;

return x*p/7 ; }

;--- Comp&link tasm /zi cod_asm.asm bcc -v -c -mt cod_c.c tlink -v cod_asm+cod_c,codigo

;--- Al final, para generar el binario exe2bin codigo.exe codigo.bin

;--- O bien hacer el link con tlink -t cod_asm+cod_c,codigo.bin

Saludos. Eduardo.

Reply to
Eduardo

variables

mucho

para

En serio?? desconocia esto.. pero me parecio lo mas logico. Esto me hace preguntarme ahora cuando es que entra al juego el coprocesador matematico?

compilador

posible

no

Precisamente me interesaria saber si existe alguna directiva en Turbo C para especificar los segmentos.

Ouch!!! tienes razon respecto a esto.. nunca lo habia visto desde este punto de vista. Usaba muy seguido el TD.exe (Turbo Debuger) y nunca cai en cuenta que lo que hacia era precisamente el desensamblado.. que torpe soy...

Parece que de nueva cuenta trato de solucionar las cosas por la via dificil.... Este software se ve bien, a ver si la mula me ayuda porque veo dificil que 149 dolares me caigan del cielo. La manera en que aprendi a hacer las cosas era ensamblando mis programas con el TASM y el TLINK para obtener un ejecutable que a partir de una utileria exe2bin.exe obtenia el codigo que se graba en la EPROM. Como no me paso por la cabeza que existiria software para hardware genericos !!! Gracias pepitof, una vez mas me has iluminado :-)

Saludos

Reply to
FlyBoy

Jejeje.. hace algunos años(tengo bastante tiempo observando bajo la sombra) cuando comence a "forear" el nickname que tengo me quedaba al dedo, pero ahora tengo que pensar en un cambio.

mejor,

Tengo la version 4 y 5 del TASM.

Caray... nunca deja uno de aprender cosas nuevas aun cuando cree conocerlo todo.. y tantos años que tengo programando el Turbo C.

exacta

Err.. podrias desempolvar tus notas o programas viejos que me pudieran ayudar??

Las memorias que tenia a la mano eran de 8 K (2764 y 6264), la EPROM esta en la parte mas alta del mapa (FE000-FFFFF H) de este modo puedo capturar el vector de reset, pero luego necesitare hacer un salto a la direccion FE000 que es donde comienzo a almacenar mis instrucciones. Entonces no me queda muy claro como hacer esto desde el Turbo C.

Pienso igual.. la realizacion de este sistema es una de las cosas mas satisfactorias que he realizado, lo pase a circuito impreso de dos caras. Fue una verdadera labor, de lo cual siempre me ha surgido el deseo de redescubrir y aprender nuevos trucos.

Hablando de sistemas con microprocesadores, alguien se ha montado uno basado en el 80486DX2? o Pentium? Que en algunos de mis sueños mas locos me veo diseñando una placa multicapa o llena de cables al estilo del famoso chino que tanto nos tiene asombrados, para un micro 80486.

Saludos

Reply to
FlyBoy

Gracias, voy a mirar en los ficheros a ver como los puedo modificar.

Pepitof ya me acaba de recordar, que con el TD lo tengo resuelto. Pero gracias por el dato.

El foro ha estado algo flojo pero lo importante es que nadie (al menos yo) lo revisan varias veces al dia de esta manera no muere.

Saludos

Reply to
FlyBoy

Esa es la cuestion, si veo que puedo acomodar las llamadas sin mucho problema entonces compruebo que puedo usar el Turbo C.

Gracias por la ayuda.

Un saludo

Reply to
FlyBoy

Jejeje.. hace algunos años(tengo bastante tiempo observando bajo la sombra) cuando comence a "forear" el nickname que tengo me quedaba al dedo, pero ahora tengo que pensar en un cambio.

mejor,

Tengo la version 4 y 5 del TASM.

Caray... nunca deja uno de aprender cosas nuevas aun cuando cree conocerlo todo.. y tantos años que tengo programando el Turbo C.

exacta

Err.. podrias desempolvar tus notas o programas viejos que me pudieran ayudar??

Las memorias que tenia a la mano eran de 8 K (2764 y 6264), la EPROM esta en la parte mas alta del mapa (FE000-FFFFF H) de este modo puedo capturar el vector de reset, pero luego necesitare hacer un salto a la direccion FE000 que es donde comienzo a almacenar mis instrucciones. Entonces no me queda muy claro como hacer esto desde el Turbo C.

Pienso igual.. la realizacion de este sistema es una de las cosas mas satisfactorias que he realizado, lo pase a circuito impreso de dos caras. Fue una verdadera labor, de lo cual siempre me ha surgido el deseo de redescubrir y aprender nuevos trucos.

Hablando de sistemas con microprocesadores, alguien se ha montado uno basado en el 80486DX2? o Pentium? Que en algunos de mis sueños mas locos me veo diseñando una placa multicapa o llena de cables al estilo del famoso chino que tanto nos tiene asombrados, para un micro 80486.

Saludos

Reply to
FlyBoy

Disculpas por el mensaje repetido, pero este mensaje era en respuesta a Nolopongo y el olulu no aparece correctamente.

Reply to
FlyBoy

FlyBoy afirmó que:

¡Qué tiempos!

Yo creo que aunque las herramientas Borland (Turbo Pascal, TC, TD, TASM) han sido lo mejor que he conocido, no va a ser tan fácil emplearlas para algo que no sea un PC. Principalmente por lo que se ha comentado acerca de las llamadas al DOS y a la BIOS, que no van a estar ahí para responder. Desde luego me agradaría saber mucho si lo consiguieras, sé positivamente que nunca me pondré en algo así pero siento curiosidad.

Reply to
Franois

Eduardo se atrevió a decir:

Perdona, pero ¿para qué llamas a la interrupción 21h para salir del programa, DOS no va a estar ahí.

Reply to
Franois

Franois afirmó que:

Vale, vale, no he dicho nada:

; Terminacion DOS 'solo para pruebas'

Debe ser la edad.

Reply to
Franois

el programa,

Presbicia?

Aunque pensandolo mejor es "para pruebas muy particulares en la PC", el programa residente en la EPROM no puede terminar nunca.

Saludos. Eduardo.

Reply to
Eduardo

Eduardo afirmó que:

Je,je, de momento no, sin problema alguno en la vista. Yo diría impaciencia, el leer los mensajes rápidamente por encima. Aunque dicen que la paciencia viene con la edad :-o

Lo leí y pensé inmediatamente ¿a dónde cojones quiere volver en una eprom con la int21h / 4c este tío?, supongo que el subconsciente cogió las riendas y ya no quiso leer el comentario (como el sentido común dicta).

Reply to
Franois

Estoy buceando por el fondo del HD, a ver si saco un ejemplo que sea facil de entender. Lo publicaré en cuanto lo pruebe. De todas formas la idea es la misma que te ha mostrado Eduardo.

Si la eeprom la tienes en FE000, y quieres cargar ahí el programa, esa direccion será lo mismo que FE00:0000 lo más facil será que en la direccion del reset pongas un JMP FE00:0000, aunque si cargas un COM que comienza en CS:0100 tambien puedes hacer un JMP FDF0:0100 (si no me equivoco porque todo esto lo tengo muy olvidado).

Reply to
Nolo Pongo

Aquí va el ejemplo más sencillo que he podido compilar, para verlo funcionado en el PC, usa dos funciones de DOS, la de pintar string y la de terminar programa.

En un sistema que ejecute el programa desde eeprom, sería más compliado, el codigo de arranque sería distinto para separar los segmentos de datos y de código, además habría que usar una sentencia pragma para forzar los strings constantes en el segmento de código en vez de en el de datos.

-- Herramientas borland 16 bits--- TASM Ensamblador BCC Compilador C/C++ RTM usado por BCC TLINK Linker TLIB Crea librerías

-- Ejemplo ----- C0.asm Código de arranque en ensamblador Hola.cpp Resto del código, en C CC.BAT Compila el programa

REM CC.BAT, compila el programa HOLA

REM compila el codigo de arranque TASM /s /m /mx /z C0.ASM

REM solo para ver el asm BCC -S -d -mt HOLA.CPP

REM compila el C (esta vez de verdad) BCC -c -d -mt HOLA.CPP

REM enlaza sin librerías (siempre C0.obj el primero) TLINK /c /t C0+HOLA, HOLA

comment |

***** CODIGO PARA ARRANCAR PROGRAMA EN 'C ' ***** ***** Modelo TINY en fichero .COM *****

Fichero : C0.ASM Compilar : TASM /s /mx /m /z C0

Fin Comentario |

DGROUP group _TEXT,_DATA,_BSS _TEXT SEGMENT PARA PUBLIC 'CODE' ORG 100h assume cs:DGROUP,ds:DGROUP,ss:DGROUP EXTRN _main:near ;enlace con el C Tmain proc cli mov ax, cs mov ds,ax mov es,ax mov ss,ax xor sp,sp mov bp,sp sti call _main ; main(void) ! ;OJO: Llamada al DOS para terminar programa mov ah,4ch ;errorlevel = main(); int 21h Tmain endp _TEXT ENDS

_DATA SEGMENT PARA PUBLIC 'DATA' _DATA ENDS _BSS SEGMENT WORD PUBLIC 'BSS' _BSS ENDS END Tmain

/* Fichero : HOLA.CPP Ejemplo de pequeno programa

*/

/* ---------- PINTA TEXTO EN PANTALLA ----------- */ void Print(char *mensaje) { asm { mov dx,mensaje mov ah,9 int 0x21 } }

/* ----- ENTRADA DEL PROGRAMA ---------- */ main() { Print("Hola$"); return 0; }

Reply to
Nolo Pongo

El miércoles pudimos ver a FlyBoy diciendo:

Joder, debe hacer casi una década que no hablaba de estas cosas y por una casualidad que no tiene nada que ver con este hilo, me encontré esto; apenas lo he mirado, pero suena tan bien que no puedo esperar para soltarlo. Después de cenar, si mi mujercita me deja, le echo un vistazo...

formatting link

Y además, ¡es free!

Reply to
Franois

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.