LENGUAJES DE INTERFAZ UNIDAD I

INTRODUCCION AL LENGUAJE ENSAMBLADOR

LENGUAJES DE INTERFAZ UNIDAD II

PROGRAMACION BASICA

LENGUAJES DE INTERFAS

PROGRAMACION DE DISPOSITIVOS

jueves, 14 de mayo de 2015

Programación híbrida

Programación híbrida

 Pascal y ensamblador Como ya se mencionó, la programación en lenguaje ensamblador  proporciona un mayor control sobre el hardware de la computadora, pero también dificulta la buena estructuración de los programas.La programación híbrida proporciona un mecanismo por medio del cual podemos aprovechar lasventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin de escribir  programas más rápidos y eficientes.En esta sección se mostrará la forma para crear programas híbridos utilizando el lenguajeensamblador y Turbo Pascal. Turbo Pascal permite escribir procedimientos y funciones encódigo ensamblador e incluirlas como parte de los programas en lenguaje Pascal; para esto,Turbo Pascal cuenta con dos palabras reservadas: Assembler y Asm.Assembler permite indicarle a Turbo Pascal que la rutina o procedimiento que se está escribiendoestá totalmente escrita en código ensamblador. Ejemplo de un procedimiento híbrido: ProcedureLimpia_Pantalla;Assembler;AsmMov AX,0600hMov BH,18hMov CX,0000hMov DX,184FhInt 10hEnd;El procedimiento del listado 23 utiliza la función 06h de la Int 10h del BIOS para limpiar la pantalla, este procedimiento es análogo al procedimientoClr Scr de la unidad CRT de TurboPascal

Detección de la dirección base del puerto paralelo

Detección de la dirección base del puerto paralelo


MS-DOS
Bajo MS-DOS se puede usar el comando externo debug.exe del siguiente modo:
Ejecutar el comando: debug.exe, luego aparece el símbolo -
Escribir después de este signo d 40:0008
Dependiendo del equipo aparece un volcado de la memoria de la siguiente forma: (los datos pueden variar)
0040:0000 ______________________78 03 00 00 00 00 00 00
La dirección del puerto se encuentra en forma invertida (78 03), entonces la dirección es:
0378 en hexadecimal. Cabe hacer notar que esta dirección puede ser diferente en otros PC.
(Se escribe q y luego enter para salir de debug.exe)

En Turbo Pascal con ensamblador
Program buscar_base;
uses crt;
Var base : word;
begin
asm
mov ax, 0040h {Colocar 0040h en el reg. Ax}
mov es, ax {Direccionar el segmento es con el valor de ax}
mov ax, es:[si] {Colocar en ax el contenido de la dirección de memoria [0040:0008]}
mov base, ax; {Actualizar la variable base con el valor de ax}
end;
writeln (' La dirección base en decimal es : ',base);
end.


En Turbo Pascal
Program buscar_base;
uses crt;
Var base:word;
Begin
base:=memW[$0040:$0008];
writeln('La dirección base en decimal es : ',base);
end.

Analizador del puerto paralelo
Este analizador se utiliza para determinar la dirección base del puerto y además permite visualizar el contenido de los registros en forma continua y en formato binario y hexadecimal.
Este programa se compila con Turbo Pascal.
{Archivo analisis.pas}
{Analizador de estado del Puerto Paralelo}
{Autor: Juan Carlos Galarza Roca}
{Diciembre de 1997}
{Versión : 1.0}
Program analisis_PP;
uses crt, dos, cadena, utiles;
var
dir_base,
dir_estado,
dir_control : Word;
puntero_int_1C : Pointer;
tick : Integer;
sw_m_t : Integer;
{$F+,S-,W-}
procedure manejador; interrupt;
{Este manejador se utiliza para temporizar el despliegue del
indicador de exploración, de modo que se haga la lectura de
datos y a la vez se despliegue el indicador}
var
a,
b,
x,
y : Integer;
begin
if sw_m_t=0 then begin;
{sw_m_t es la bandera del manejador de tareas
Esta bandera es actualizada por el programa
principal
}
x:=whereX;
y:=whereY;
{se guarda la posición del cursor en la pantalla}
tick:=tick+1;
{ La variable tick se incrementa cada 18,20677500572 segundos}
a:=6;
b:=3;
textcolor(7);
gotoxy(39+a,b);write('Explorando... ');
textcolor(2);
case tick of
13: begin gotoxy(60+a,b); write('> ');
gotoxy(52+a,b); write(' <');end;
15: begin gotoxy(60+a,b); write('-> ');
gotoxy(52+a,b) ;write(' <-');end;
17: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
19: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
21: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
23: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
25: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write('< ');end;
27: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
29: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
31: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
33: begin gotoxy(60+a,b); write('<- ');
gotoxy(52+a,b); write(' -> ');end;
34: tick:=13;
end;
gotoxy(x,y);
{Devolver la posición original del cursor}
end;
end;
{$F-,S+}
begin
cursor_off;
tick:=0;
{Colocar el manejador de tareas}
GetIntVec($1C,puntero_int_1C);
SetIntVec($1C,Addr(manejador));
clrscr;
dir_base:=memW[$0040:0008];
dir_estado:=dir_base+1;
dir_control:=dir_base+2;
textcolor(2);
gotoxy(23,2);writeln('Analizador del Puerto Paralelo');
textcolor(9);
gotoxy(8,4); writeln('Direcciones: ');
textcolor(9);
gotoxy(10,5); writeln('Datos : ',dec_a_hexa(dir_base),' (h)');
gotoxy(10,6); writeln('Estado : ',dec_a_hexa(dir_estado),' (h)');
gotoxy(10,7); writeln('Control: ',dec_a_hexa(dir_control),' (h)');
{Ciclo repetivo principal}
repeat
sw_m_t:=1;
textcolor(9);
gotoxy(34,4); writeln('Estado: ');
gotoxy(36,5); write('Datos : ',port[dir_base]:3,' (d) ');
dec_bin(port[dir_base]);write(' (b)');
gotoxy(36,6); write('Estado : ',port[dir_estado]:3,' (d) ');
dec_bin(port[dir_estado]);write(' (b)');
gotoxy(36,7); write('Control: ',port[dir_control]:3,' (d) ');
dec_bin(port[dir_control]);write(' (b)');
textcolor(7);
gotoxy(9,9); write('Registro de Datos');
gotoxy(25,10); write('Pines 9 8 7 6 5 4 3 2');
gotoxy(25,11); write('Nombre D7 D6 D5 D4 D3 D2 D1 D0');
textcolor(2);
gotoxy(25,12); write('Valor '); dec_bin2(port[dir_base]);
textcolor(7);
gotoxy(9,14); write('Registro de Estado');
gotoxy(25,15); write('Pines 11 10 12 13 15 ** ** **');
gotoxy(25,16); write('Nombre -S7 S6 S5 S4 S3 ** ** **');
textcolor(2);
gotoxy(25,17);write('Valor '); dec_bin2(port[dir_estado]);
textcolor(7);
gotoxy(9,19); write('Registro de Control');
gotoxy(25,20); write('Pines ** ** ** ** 17 16 14 1');
gotoxy(25,21); write('Nombre ** ** ** ** -C3 C2 -C1 -C0');
textcolor(2);
gotoxy(25,22);write('Valor '); dec_bin2(port[dir_control]);
textcolor(2);
gotoxy(8,24);write('[Copyrigth (c) 1997 por JCGR Soft <pparalelo@hotmail.com>]');
textcolor(7);
sw_m_t:=0;
delay(100);
until keypressed;
cursor_on;
{Restaurar manejador de tareas}
SetIntVec($1C,puntero_int_1C);
end.



Envio y lectura de datos del puerto
El puerto paralelo puede ser usado como una comunicación directa con el PC, de este modo es posible desarrollar aplicaciones en tiempo-real que necesiten un rápido tiempo de respuesta.
El acceso se realiza escribiendo un byte (8 bits) en registro determinado. Este byte debe referirse a cada uno de los bits del registro. Esto significa que se debe definir el byte a escribir en sistema binario.
Por ejemplo si queremos escribir en el registro de datos el bit D0 y el bit D2 entonces el byte es:

0
0
0
0
0
1
0
1
= 5  En decimal
D7
D6
D5
D4
D3
D2
D1
D0
Registro de datos

Luego, se debe escribir 5 en el registro de datos (dirección base):
Notas:
dir_base y dir_estado es de tipo word, y dato es de tipo byte.
En Turbo Pascal
Port[dir_base]:=5;
En C
Outportb(dir_base, 5);
En ensamblador
mov dx, dir_base {Direccionar en dx la dirección base}
mov al, 5 {Colocar en ² al ² el número 5}
out dx, al {Enviar al puerto}

Lectura de datos del puerto
La lectura de datos se realiza accesando un byte del registro determinado. Al hacer la lectura se debe convertir el byte a binario para determinar él o los bits que interesen. Note que sólo se debe leer el registro de estado, o sea, la dirección base+1.
En Turbo Pascal
Var dato: byte;
dato:=Port[dir_estado];
En C
unsigned int dato;
dato=inportb(dir_estado);
En ensamblador
mov dx, dir_estado {Direccionar dx con el registro de estado del puerto}
in al, dx {Leer del puerto. En el registro ² al ² está el dato leído}

Por ejemplo, si el dato leído es igual a 96, significa que los bits S5 y S6 están activos(tienen un nivel alto, un 1).
0
1
1
0
0
0
0
0
= 96  En decimal
S7
S6
S5
S4
S3
S2
S1
S0
Registro de estado

Enmascaramiento
Tanto en el envío como recepción de datos binarios, se realizan operaciones a nivel de bits. Estas operaciones permiten aislar uno más bits. Este proceso se denomina enmascaramiento.
Por ejemplo, para saber si determinado bit que se ha leído del registro de estado está en un nivel alto (1 lógico) se puede hacer la operación "Y" lógica (AND) de la lectura con un valor que resulta de elevar 2 a la posición que ocupa ese bit en el byte, y luego realizar la comparación.
Si el bit que se desea conocer es el bit 5, entonces la operación es:
Masc:=2^5=32
(Byte_leido AND masc)
En el caso que el bit 5 esté en un nivel alto:
Byte_leido
0
1
1
0
0
0
0
0
96
S7
S6
S5
S4
S3
S2
S1
S0
Posición
AND
0
0
1
0
0
0
0
0
Máscara = 32
Resulta
0
0
1
0
0
0
0
0
32= máscara

En el caso que el bit 5 no esté en un nivel alto:
Byte_leido
0
1
0
1
0
0
0
0
80
S7
S6
S5
S4
S3
S2
S1
S0
Posición
AND
0
0
1
0
0
0
0
0
Máscara = 32
Resulta
0
0
0
0
0
0
0
0
0 <> máscara

Si el bit 5 es 1, entonces el resultado es 16, o igual a masc.
Haciendo la comparación:
Si (Byte_leido AND masc) = masc entonces
Inicio
/* las acciones a realizar cuando el 4to bit es 1 */
Fin
Si el bit 5 es 0, entonces el resultado siempre es 0, lo cual es diferente a masc.
En caso que se desee realizar el enmascaramiento de más de un bit, se realiza la suma los valores.
Ej. Máscara para el bit 5 y el 7
Masc= 2^5+2^7=160

.

Programación de Comunicación Serial

Programación de Comunicación Serial
La librería RS232 contiene varias funciones que manejan todos los aspectos de la comunicación serial. Las funciones más importantes son: open, close, read y write. Estas funciones se describen en seguida:
  • Abriendo y Cerrando los Puertos COM

    Antes de usar una función serial para la comunicación con un instrumento, se debe abrir una "sesión" a un puerto COM usando OpenComConfig
  •                int OpenComConfig
  •                (int COM_Port, char Device_Name[],long Baud_Rate,
  •                                int Parity, int Data_Bits,
  •                                int Stop_Bits, int Input_Queue_Size,
  •                                int Output_Queue_Size);


Esta función especifica la velocidad en baudios, los bits de datos, bits de parada y tamaño del bloque de memoria. CVI permite especificar el tamaño del espacio en memoria para almacenar los mensajes seriales. En lugar de la función OpenComConfig se puede utilizar la función OpenCom, en cuyo caso se utilizarían los parámetros del puerto por defecto, especificados en el sistema operativo.

Para liberar los recursos utilizados por la sesión serial se utiliza la función CloseCom. Para garantizar que todos los bytes fueron escritos antes de cerrar el puerto, se debe utilizar la funciónGetOutQLen para monitorear la cola de salida de datos. Cuando la longitud de esta cola es cero, se puede cerrar el puerto sin problemas. 
  • Escribiendo al Puerto COM

    Para escribir datos contenidos en un arreglo a un dispositivo se utiliza:
  •                int ComWrt (int COM_Port, char Buffer[], int Count);

ComWrt escribe datos de la memoria especificada por el arreglo "Buffer" al puerto COM especificado. El parámetro "Count" especifica el número de bytes que se deben escribir al puerto. La función strlen (de las librerías de ANSI C) determina el tamaño en bytes de un arreglo de caracteres. El valor regresado por esta función (strlen) puede usarse para determinar el parámetro "Count" en la función ComWrt. 
  • Leyendo del Puerto COM

    Para leer datos que vienen de un dispositivo a través del puerto serial se utiliza la función:
  •                int ComRd (int COM_Port, char Buffer[], int Count);

ComRd lee el número de bytes especificado por el parámetro "Count" del puerto COM indicado. Para obtener el número de bytes presentes en la cola de entrada del puerto se utiliza la funciónGetInQLen. Es conveniente utilizar el valor regresado por GetInQLen como el parámetro "Count" para la función ComRd. 
  • Usando la Función InstallComCallback para Leer del Puerto Serial

    Consideremos una situación en la cuál un instrumento genera una grán cantidad de datos o toma mucho tiempo para obtener un dato. El instrumento tiene que mandar datos a la computadora tan pronto como los datos son adquiridos. Si quisiéramos esperar la respuesta del instrumento llamando a la función ComRd inmediatamente después de solicitar los datos, nuestro programa se quedaría estancado en esa llamada y no sabríamos el tamaño de la respuesta del instrumento. La alternativa es que el programa sea notificado cuando la respuesta del instrumento esté lista.

    La función InstallComCallback nos permite instalar una función que será llamada cuando haya una respuesta en el puerto COM: 
  •                int InstallComCallback
  •                                (int COM_Port, int Event_Mask, int Notify_Count,
  •                                 int Event_Character,
  •                                 ComCallbackPtr Callback_Function,
  •                                 void *Callback_Data);

El parámetro Callback_Function recibe el nombre de una función creada dentro del mismo programa que llama a InstallComCallback. Esta función será llamada cuando el evento específicado por Event_Mask ocurra. Para mayor información sobre estas funciones y sus parámetros, revise la documentación en línea para cada función en su "function panel" o la documentación escrita de CVI

Acceso a discos en lenguaje ensamblador

Qué es el acceso a dispositivos de almacenamiento

Los dispositivos de almacenamiento se pueden clasificar de acuerdo al modo de acceso a los datos que contienen:
Pueden ser:
Acceso Aleatorio:
El método de acceso aleatorio es la forma en que la computadora accede a los datos de manera directa y veloz, sin interactuar directamente con datos ó espacio físico dónde se encuentran otros datos. 

A continuación se expone una analogía para entender mejor el concepto.

Imaginemos un patio cuadrado, en el que se encuentran de pie varias personas. Si tu intentas ir con alguno de ellos, solamente te diriges hacia el, sin la necesidad de interactuar directamente con los demás.

El acceso aleatorio es similar, si la computadora requiere un dato específico, solamente se dirigirá hacia el dato sin necesidad de haber interactuado con otros datos ó directamente en la superficie dónde se encuentren grabados.
 
 
Aqui se muestra el acceso aleatorio cuando un Lector o escritor se dirige directamente al dato que se busca.
 
 
Dispositivos donde se realiza este modo de acceso:
  1. Disco duro.
  2. Memoria USB
  3. Disquete
  4. Memoria RAM
  5. Unidad SSD
  6. Memoria Caché
  7. Lector de disco óptico (CD/DVD/HD-DVD ó Blu-ray):
  8. Unidad LS-120
 
Acceso secuencial:
 
El método de acceso secuencial es la forma en que la computadora accede a los datos de manera que es necesario interactuar directamente con los datos ó el espacio físico dónde se encuentran otros datos.
 
 
El acceso secuencial es similar, si la computadora requiere un dato específico, tiene que recorrer el espacio dónde se encuentra otra información hasta llegar al lugar dónde esta el dato requerido.
 
Dispositivos en el que se realiza este modo de acceso.
  1. Tocadiscos: para reproducir la melodía específica del disco de vinilo, la aguja recorre por lo menos parte de la anterior canción para que se reproduzca la elegida por el usuario.
  2. Lectora de cintas de respaldo: tanto para leer como para escribir un dato, es necesario que la cabeza magnética recorra parte de la cinta.
  3. Grabador de discos ópticos (CD, DVD, HD-DVD ó Blu-ray): el proceso de grabado se hace de manera espiral por medio de un rayo láser, el cuál escribe sobre tal espiral un dato a continuación del otro.
  4. Casetera: tanto para leer como para escribir un dato, es necesario que la cabeza magnética recorra parte del casete.
 


 

 
Se muestra el modo de acceso secuencial donde el lector/escritor de datos tiene que pasar sobre cada dato anterior al que realmente busca.
 
 
Acceso al disco en ensamblador
 
Para leer o escribir en un disco, no se realiza byte a byte, sino más bien en bloques de bytes, debido a que el acceso a disco implica movimientos mecánicos además de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto que solo envía los comandos a la interfase que maneja la unidad de disco y ésta es la que se encarga de leer o escribir información de un área especial de memoria, llamada DMA; este proceso es conocido como acceso directo a memoria.

Para el manejo de disco desde BIOS se hace uso de la INT 13h, y con servicios de la misma interrupción. Para el manejo de disco desde el sistema DOS, se utilizan los discos a los cuales se le halla aplicado el comando: format
el cual realiza un formato a nivel de BIOS (INT 13h), es decir mapea todos los sectores físicos de un disco en sectores lógicos, divide el disco en 4 áreas básicas de información: 
Boot record: Contiene la información acerca del formato del disco, tal como número de sectores, número tracks, número de lados, etc. Además contiene un pequeño programa que se encargará de bajar el sistema operativo (boot del sistema).

Boot Strap:

Lee el primer sector del disco (boot record) y le transfiere el control.

Boot del sistema:

Pasa a memoria los archivos del sistema operativo, les transfiere el control para que aparezca el prompt del sistema.

Tabla de localización de archivos (FAT): En esta tabla se guarda una lista de los sectores ocupados por cada archivo contenido en el disco.

Directorio: Se guarda información acerca de los archivos en el disco (nombre, extensión, tamaño, fecha y hora de última actualización, atributos y un apuntador a su correspondiente en el FAT).
 
Archivos (área de datos): Es donde se guarda la información contenida en los archivos.


En DOS, para trabajar con archivos se necesitan dos estructuras de datos:

Un área de memoria para el DTA, donde se van a escribir los registros.

DTA DB 128 DUP (0)

Un área para el bloque de control de archivos (FCB) en donde se guarda información importante para el acceso a archivo.

FCB DB 36 DUP (0)



Un bloque de archivo consta de 80h registros de 80h bytes cada uno. Al iniciar el manejo de un archivo los únicos campos del FCB que se inicializan son el de la unidad, el nombre y la extensión; los demás bytes se ponen en cero y son actualizados por el sistema.




Forma de acceder a los discos en ensamblador
los datos se registran sobre la superficie del disco en una serie de circunferencias concentricas llamadas pistas (track).
Varias pistas , una por cada cara del disco (generalmente 2) , componen un cluster. cada pista esta divida en porciones iguales  llamadas sectores. un sector es la unidad basica del almacenamiento en un disco. El tamamaño de un sector se mide en bytes y depende de las caracteristicas del disco.
un ejemplo de las 3 rutinas son : que permiten lectura y escritura absoluta de sectores, asi como la determinacion del espacio libre disponible en un disco.



Ejemplo:
programa de demuestre en su ejecucion el acceso a disco para grabar y leer

Codigo:




BUFFER DE VIDEO EN MODO TEXTO

BUFFER DE VIDEO EN MODO TEXTO
›Se llama modo texto a cualquier modo de video de un ordenador en el cual el contenido de la pantalla se representa internamente en términos de caracteres textuales.

›Las aplicaciones en modo texto se comunican con el usuario mediante líneas de comandos e interfaces textuales de usuario, muchos juegos de caracteres usados en aplicaciones en modo texto también incluyen un conjunto limitado de caracteres semi gráficos predefinidos que pueden usarse para dibujar cajas u otros gráficos usados para destacar el contenido o simular widgets y controles como los presentes en las aplicaciones escritas para interfaces graficas. }


›Es la ubicación de la memoria de un dispositivo digital o una computadoraque está reservada para el almacenamiento temporal de información. Mientras losdatos están en el buffer, aguardan para ser procesados.Un ejemplo de buffer tiene lugar cuando se intenta ejecutar aplicaciones de audioo video directamente desde Internet, sin descargarlas a la computadora. Estapráctica, conocida como streaming, requiere de la utilización de un buffer parareducir el riesgo de que se corte la reproducción ante problemas en el ancho debanda

marcos

EJEMPLOS DE MACROS

Estos programas son ejemplos de macros externas




SEGUNDO EJEMPLO DE MACROS





DIFERENCIAS ENTRE MACROS Y PROCEDIMIENTOS

Las macros son mas rápidas porque se ejecutan en linea en un programa y los procedimientos son mas lentos a la hora de ejecutar el programa.
Las macros pueden pasar y recibir parámetros.
La escritura de una macro es simple en cambio la de los procedimientos es mas compleja.
Los procedimientos ayudan a reducir el código y los macros lo hacen mas grande.

procedimientos

Los siguientes programas son para realizar sumas de dos variables utilizando procedimientos




En este programa se indica donde se almacena la suma