Programa que conecta dos máquinas

Anuncio
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
PRÁCTICA 8
COMUNICACIÓN SERIAL DE UNA PC
1.
INTRODUCCIÓN
Esta práctica está enfocada a la comunicación serial de un PC, interceptando la
interrupción de uno de los puertos
2
OBJETIVOS
2.1
El alumno aprenderá a crear rutinas que permitan interceptar una
interrupción de hardware del sistema.
2.2
Aprenderá a manipular el almacenamiento circular, es decir, de áreas que
están definidas por un apuntador de cola y otro de la cabeza.
2.3
Aprenderá a crear y ensamblar un programa que permita usar la PC como una
herramienta de diagnóstico para comunicaciones de tipo serie.
2.4
Se ilustra en ensamblado condicional del ensamblador.
3
DESARROLLO
3.1
Capturar y ensamblar el siguiente módulo con el nombre ASINC.ASM.
%TITLE
“MÓDULO DE COMUNICACIÓN SERIAL ASÍNCRONA”
IDEAL
DOSSEG
MODEL
small
PUBLIC
Puerto,Cola
Puerto = 1
IF
Puerto
DirPuerto
VectorNo
;0 = COM1:, 1 = COM2:
EQ
EQU
EQU
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
0
03F8H
0CH
;Dirección base del UART 8250
;Número del vector de interrupción
8-1
LENGUAJE ENSAMBLADOR 80386
HabilitaIRQ
ImpideIRQ
ELSEIF Puerto
DirPuerto
VectorNo
HabilitaIRQ
ImpideIRQ
PRÁCTICA 8
EQU
EQU
0EFH
10H
;Máscara para habilitar IRQ4 en el 8259
;Máscara para deshabilitar IRQ4
EQ
EQU
EQU
EQU
EQU
1
02F8H
0BH
0F7H
08H
;Dirección base del UART
;Número del vector de interrupción
;Máscara para habilitar IRQ3 en el 8259
;Máscara para deshabilitar IRQ3
ELSE
DISPLAY
ERR
“Puerto debe ser 0 o 1”
ENDIF
;
Direcciones de los registros de la tarjeta de comunicación serie
RegistroTx
=
RegistroRx =
HabilitaInt
=
IdentInt
=
ControlLinea =
ControlModem=
EdoLinea
=
EdoModem =
;
DirPuerto + 0
DirPuerto + 0
DirPuerto + 1
DirPuerto + 2
DirPuerto + 3
DirPuerto + 4
DirPuerto + 5
DirPuerto + 6
;Registro de transmisión
;Registro de recepción
;Registro para habilitar interrupciones
;Identificación de la interrupción
;Registro de control de línea
;Registro de control del modem
;Registro del estado de la línea
;Registro del estado del modem
Otros EQU
EOI EQU
C8259_0
C8259_1
TamBuff
020h
EQU 020h
EQU 021h
EQU 2048
; Cmndo fin de Interrupción
;Dirección del 8259
;Comando fin de interrupciones para el PIC
;Tamaño del buffer de entrada
DATASEG
SegVector
SesVector
Cabeza
Cola
Buffer
DW
DW
DW
DW
DB
?
?
?
?
TamBuff DUP (?)
;Segmento del vector anterior
;Sesgo (offset) de vector anterior
;Apuntador a la cabeza del buffer
;Apuntador a la cola del buffer
;Buffer de entrada
CODESEG
PUBLIC
PUBLIC
IniciaAsinc, FinAsinc, EsoAsinc
SaleAsinc, LeeAsinc, EdoLeeAsinc
%NEWPAGE
;VaciaBuffer
;
;
;Entrada:
;Salida:
;Registros:
VACÍA EL BUFFER DE ENTRADA
NOTA: Privado del módulo
Ninguna
Ninguna
Ninguno
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-2
LENGUAJE ENSAMBLADOR 80386
PROC
PRÁCTICA 8
VaciaBuffer
cli
push
mov
mov
mov
pop
sti
ret
ENDP
ax
ax,offset Buffer
[Cabeza],ax
[Cola],ax
ax
;Impide las interrupciones
;Salva AX
;El buffer está vacío si cabeza es
;igual a Cola
;Recupera AX
;Habilita interrupciones
VaciaBuffer
%NEWPAGE
;IniciaAsinc
;
;Entrada:
;Salida:
;Registros:
;
PROC
IniciaAsinc
call
;
;Inicializa el buffer
ds
es
ax,3500h + VectorNo
21h
[SegVector],es
[SesVector],bx
cs
ds
dx,offset ServIRQ
ax,2500h + VectorNo
21h
es
ds
;Salva registros de segmento
;Trae dirección del vector
;llama a DOS
;Salvas segmento del vector
;Salva sesgo del vector
;Dirección de la rutina de servicio
;En DS:DX
;Para usar función 25H
;Restaura registros
habilita interrupción (IRQ) del 8259 para el adaptador
in
and
out
;
VaciaBuffer
Salva y redefine el vector de interrupción
push
push
mov
int
mov
mov
push
pop
mov
mov
int
pop
pop
;
Ninguna
Ninguna
AX, BX, DX
NOTA: Invocar a FinAsinc antes de que termine el programa
al,C8259_1
al,HabilitaIRQ
C8259_1,al
;Trae máscara de permiso del 8259
;Limpia bit de la máscara
;Modifica máscara
Permite que el 8250 interrumpa al recibir un dato
mov
in
dx,ControlLinea
al,dx
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Apunta al registro de control
;de línea, para limpiar el bit
8-3
LENGUAJE ENSAMBLADOR 80386
and
out
mov
mov
out
;
al,07fh
dx,al
dx,HabilitaInt
al,1
dx,al
PRÁCTICA 8
;7 (DLAB)
;lo que permite poner
;a “1” el bit de habilitar
;interrupción (bit 0)
;del registro de interrupciones
Limpia el estado del 8250 y los registros de datos
Inic5:
mov
in
mov
in
mov
in
mov
in
test
jz
;
;Limpia registro de datos
;al leerlo
;Limpia estado de la línea,
;leyéndola
;Limpia estado del modem,
;leyendo dicho puerto
;Verifica el registro de
;identificación de interrupción
;bit 0 debe ser “1”
;Brinca si hay interrupción pendiente
Pone bit 3 del registro de control del modem
mov
in
or
and
out
;
dx
RegistroRx
al,dx
dx,EdoLinea
al,dx
dx,EdoModem
al,dx
dx,IdenInt
al,dx
al,1
Inic5
dx,ControlModem
al,dx
al,08h
al,0efh
dx,al
;Las interrupciones deben
;ser atendidas tan pronto
;que siguiente bit se ponga en “1”
;Borra loopback
;¡ya!
Vaciar el buffer de entrada, por precaución
call
ret
VaciaBuffer
ENDP
IniciaAsinc
;FinAsinc
;
;Entrada:
;Salida:
;Registros:
;
DESINSTALA RUTINA DE SERVICIO IRQ
PROC
;
NOTA: Obligatorio su uso antes de terminar el programa
FinAsinc
Enmascara (deshabilita) IRQ en el PIC
in
or
out
;
Ninguna
Ninguna
AL, DX
al,C8259_1
al,ImpideIRQ
C8259_1,al
;Lee máscaras
;Enmascara bit IRQ
;reescribe máscaras
Deshabilita interrupción en el 8250
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-4
LENGUAJE ENSAMBLADOR 80386
mov
in
and
out
mov
mov
out
;
;Empieza leyendo el registro
;de control de línea y limpia
;bit 7 (bit de acceso al divisor)
;cuando DLAB = “0”
;Limpia todos los bits para
;deshabilitar todo tipo de interrupción
;Reescribe dicho registro
Pone a “0” el bit 3 del control del modem
mov
in
and
out
;
dx,ControlLinea
al,dx
al,07fh
dx,al
dx,HabilitaInc
al,0
dx,al
PRÁCTICA 8
dx,ControlModem
al,dx
al,0f7h
dx,al
;Asigna dirección del puerto
;Lee tal registro
;Limpia bit 3
;Saca nuevo valor
Las interrupciones ya están deshabilitadas. Recuperar vector
push
mov
mov
mov
int
pop
ret
ENDP
ds
ax,2500h+VectorNo
dx,[SesVector]
ds,[SesVector]
21h
ds
;Salva registro de segmento
;pone el vector anterior
;Trae sesgo anterior
;Trae segmento anterior
;Repone vector
FinAsinc
%NEWPAGE
;EdoAsinc
;
;Entrada:
;Salida:
;
;Registros:
Ninguna
AH = estado de la línea
AL = estado del modem
AX, DX
PROC
EdoAsinc
mov
mov
int
ret
OBTIENE EL ESTADO DE LA SALIDA
ah,3
dx,Puerto
14h
;Número de función para traer estado
;de un puerto serie
;llama al BIOS
ENDP
EdoAsinc
;SaleAsinc
ENVÍA UN BYTE AL PUERTO DE SALIDA (TRANSMITE)
;
;Entrada:
;Salida:
;Registros:
AL = carácter (byte) a enviar
Ninguna
Ninguno
PROC
SaleAsinc
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-5
LENGUAJE ENSAMBLADOR 80386
push dx
push ax
PRÁCTICA 8
;Va a usar DX, lo salva
;Salva el carácter
@@10:
mov
in
and
jz
pop
mov
out
pop
ret
dx,EdoLinea
al,dx
al,020h
@@10
ax
dx,RegistroTx
dx,al
dx
;Apunta al registro de control
;y lo lee
;Aísla bit de transmisión lleno
;Brinca si THRE está en “0”
;Recupera carácter
;Apunta a registro de transmisión
;Envía byte en AL
ENDP
SaleAsinc
;LeeAsinc
;
;Entrada:
;Salida:
;Registros:
TOMA UN BYTE DEL BUFFER DE MEMORIA
PROC
LeeAsinc
xor
mov
cmp
je
mov
inc
cmp
Jb
Mov
Ninguna
AL = carácter del buffer: si AL = 0 el buffer está vacío
AL, BX
al,al
bx,[Cola]
bx,[Cabeza]
@@99
al,[byte ptr bx]
[Cola]
[Cola],offset buffer+TamBuff
@@99
[Cola],offset buffer
;Por si está vacío el buffer
;Trae apuntador al final del buffer
;Prueba si el buffer está vacío
;Sale si está vacío (AL = 0)
;Si no, trae carácter del buffer
;Avanza apuntador de la cola
;¿En el extremo?
;Brinca si no
;Si sí, reinicia apuntador de cola
@@99:
ret
ENDP
LeeAsinc
%NEWPAGE
;EdoLeeAsinc
;
;Entrada:
;Salida:
;Registros:
OBTIENE ESTADO DEL BUFFER DE ENTRADA
PROC
EdoLeeAsinc
Ninguna
DX = número de bytes (caracteres) en el buffer
Ninguno
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-6
LENGUAJE ENSAMBLADOR 80386
mov
sub
jge
add
dx,[Cabeza]
dx,[Cola]
@@99
dx,TamBuff
PRÁCTICA 8
;Trae apuntador de cabeza del buffer
;Resta cola de cabeza
;Brinca si el resultado no negativo
;Ajusta el resultado negativo
@@99:
ret
ENDP
EdoLeeAsinc
;ServIRQ
;
;Entrada:
;Salida:
;Registros:
RUTINA DE SERVICIO A LA INTERRUPCIÓN ASÍNCRONA
PROC
ServIRQ
push
mov
mov
mov
in
mov
mov
inc
cmp
jne
mov
Ninguna
Ninguna (El carácter recibido es puesto en buffer de entrada)
DX
ax bx ds dx
ax,@@data
ds,ax
dx,RegistroRx
al,dx
bx,[Cabeza]
[byte ptr bx],al
bx
bx,offset Buffer+TamBuff
@@10
bx,offset Buffer
;Salva todo registro usado
;Apunta a los datos locales
bx,[Cola]
@@20
bx,[Cabeza]
;Verifica si hay derrame
;Brinca si no
;caso contrario, cancela avance
[Cabeza],bx
al,EOI
C8259_0,al
dx ds bx ax
;Salva nuevo apuntador de cabeza
;Envía comando fin de interrupción
;Al controlador de interrupciones
;Repone registros
;DX = dirección registro de recepción
;Lee byte en el puerto
;Trae apuntador de cabeza
;Salva carácter en el buffer
;Avanza apuntador de cabeza
;Llegó al extremo
;Si sí, reinicia la cabeza
@@10:
cmp
jne
mov
@@20:
mov
mov
out
pop
iret
ENDP
ServIRQ
END
3.2
;Fin del módulo ASINC.ASM
Capturar programa y salvarlo como TRM.ASM. Ensamblarlo y hacerlo ejecutable
mediante:
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-7
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
C:\SEM386>tasm /zi trm
C:\SEM386>tlink /v trm,,,rem
%TITLE
“EMULACIÓN DE TERMINAL CON DEPURACIÓN PARA CÓDIGOS DE CONTROL”
IDEAL
DOSSEG
MODEL
STACK
;
small
1024
De ASINC.OBJ
EXTRN
rc
nl
bd2400
TeclaFin
EQU
EQU
EQU
EQU
Puerto:abs
13
10
0A3H
100
;ASCII del retorno de carro
;ASCII de nueva línea
;2400 baud, sin paridad, 1 bit paro, 8 bits
;Código de tecla F10
DATASEG
ClaveFin
saludo
Cadena
DB
DB
DB
DB
DB
DB
DB
0
rc,nl,”Emulador de terminales con depuración”,rc,nl
rc,nl,”Configurada para 2400 bauds. Exhibe “
rc,nl,”códigos de control en paréntesis para”
rc,nl,”diagnosticar un puerto serial RS-232”
rc,nl,”Oprimir F10 para terminar”,rc,nl,nl,0
80 DUP (0)
;Cadena para diversos usos
CODESEG
;
De ASINC.OBJ
EXTRN
EXTRN
;
De TECLADO.OBJ
EXTRN
;
EsperaTecla:proc,TraeCar:proc
De BINASC.OBJ
EXTRN
;
IniciaAsinc:proc,FinAsinc:proc,EdoAsinc:proc
SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc
BinAscDec:proc
De CADENAS.OBJ
EXTRN
SacaCadena:proc
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-8
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
Inicia:
mov
mov
mov
mov
call
;
;Inicializa DS para apuntar al
;segmento de datos
;Hace ES = DS
;Exhibe bienvenida con explicación
Inicializa el baud rate y el resto del puerto asíncrono
mov
mov
mov
int
call
;
ax,@data
ds,ax
es,ax
di,offset saludo
SacaCadena
ah,0
al,bd2400
dx,Puerto
14h
IniciaAsinc
;Función del BIOS para iniciar puerto
;Trae byte de configuración
;Número de puerto (0 o 1)
;Servicio par RS-232
;Inicializa el módulo asíncrono
Realiza la emulación de una terminal
Emula:
call
Or
Jz
Call
Call
Jmp
EdoLeeAsinc
dx,dx
Emu5
LeeAsinc
SacaCar
Emula
;¿Llegó algo al puerto?
;Verifica si DX>0
EsperaTecla
Emula
TraeCar
Emu10
al,TeclaFin
Salir
;Verifica si se presionó una tecla
;Brinca si no
;Trae carácter de la tecla
;Brinca si tecla normal
;¿Se oprimió tecla al terminar?
;Lee carácter del buffer de recepción
;Eco local del carácter recibido
Emu5:
call
jz
call
jnz
cmp
Je
Emu10:
push
call
pop
call
jmp
;
ax
SacaCar
ax
SaleAsinc
Emula
;Manda byte al puerto
Fin de emulación. Repone módulo asíncrono y regresa a DOS
Salir:
call
mov
mov
int
FinAsinc
ah,04ch
al,[ClaveFin]
21h
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Detiene el módulo asíncrono
;Función de DOS: Termina el programa
;Regresa código de salida
8-9
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
%NEWPAGE
;SacaCar,UnCar
EXHIBE UN VALOR ASCII
;
;Entrada:
AL = valor ASCII (0…255)
;Salida:
Ninguna. Exhibe códigos de control como <23>, <10>, etc.
;Registros:
AX, CX, DL, DI
PROC
SacaCar
cmp
jc
PROC
;¿Es un carácter de control?
;si, brinca
UnCar
mov
mov
int
ret
ENDP
;
al,20h
Control
dl,sl
ah,2
21h
;Pone carácter en DL
;Función de DOS para exhibir carácter
;Llamado a DOS
UnCar
Exhibe códigos de control
Control:
sub
mov
mov
call
mov
call
call
mov
jmp
ENDP
ah,ah
cx,1
di,offset cadena
BinAscDec
al,’<’
UnCar
SacaCadena
al,’>’
short UnCar
;Convierte AL a un valor de 16 bits
;Especifica al menos un carácter
;Direcciona la cadena
;Convierte a decimal en ASCII
;Saca <
;Exhibe byte en AL
;Exhibe cadena de códigos de control
;Pone >
SacaCar
END Inicia
3.3
Ejecutar el programa TRM en dos máquinas interconectadas por el puerto serie y
observar cómo cualquier carácter normal tecleado en una de ellas, se observa en la otra
y ver si los caracteres de control se exhiben en la otra PC.
A continuación se ofrecen los datos para conectores de 9 y 25 terminales para los
puertos RC-232-C.
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-10
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
CONECTOR MACHO DEL PUERTO SERIE DE 9 TERMINALES DE LA PC-AT
Núm. de
terminal
Descripción
1
2
3
4
5
6
7
8
9
Detección de portadora
Recepción del dato
Transmisión del dato
Terminal lista
Tierra de señal
Datos listos
Petición de envío
Activar envío
Indicador de llamada
Señal Dirección
CD
RD
TD
DTR
SG
DSR
RTS
CTS
RI
Entrada
Salida
Salida
Entrada
Salida
Entrada
Entrada
CONECTOR MACHO DEL PUERTO SERIE DE 25 TERMINALES DE LA PC-XT
Núm. de
terminal
8
3
2
20
7
6
4
5
22
1
Descripción
Señal
Dirección
Detección de portadora
DCD
Recepción del dato
RD
Transmisión del dato
TD
Terminal lista
DTR
Tierra de señal
SG
Datos listos
DSR
Petición de envío
RTS
Activar envío
CTS
Indicador
RI
Tierra de chasiss
Tierra Física
Entrada
Entrada
Salida
Salida
Entrada
Salida
Entrada
Entrada
CONEXIONES SUGERIDAS
PC1
PC2
PC1
PC2
RETROLAZO
TD
RD
TD
RD
TD
RD
TD
RD
TD
RD
RTS
CTS
RTS
CTS
RTS
CTS
RTS
CTS
RTS
CTS
DSR
DTR
DSR
DTR
DSR
DTR
DSR
DTR
DSR
DTR
SG
SG
SG
SG
DSD
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-11
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
CONECTOR DEL PUERTO SERIE DE 25 TERMINALES DE INTERFAZ DCE (MODEM)
Núm. de
terminal
8
3
2
20
7
6
4
5
22
1
4.
Descripción
Señal
Detección de portadora
DCD
Recepción del dato
RxD (BB)
Transmisión del dato
TxD (BA)
Terminal lista
DTR
Tierra de señal
SG
Datos listos
DSR
Petición de envío
RTS
Activar envío
CTS
Indicador de llamada
RI
Tierra de Chasiss
Tierra Física
Dirección
Salida
Salida
Entrada
Entrada
Retorno
Salida
Entrada
Salida
Salida
TAREAS
4.1
Agregar al módulo TRM.ASM lo necesario para que procese los caracteres
correspondientes al beep, al retroceso de carro y al salto de línea, de tal
manera de emular parcialmente una terminal tonta.
4.2
Modificar TRM.ASM para exhibir continuamente la fecha en el formato:
14 de agosto de 1994
Y la hora en el formato:
17:23:57
NOTA: Usar sólo funciones del BIOS e interceptar el tic del temporizador
4.3
Escribir un programa tipo COM llamándolo GUARDA.ASM que se pueda dejar
residente y que salve el contenido de una pantalla alfanumérica en el archivo
XX.PRN (sobre escribiéndolo) si se usa la tecla Mayus-Imprn Pant. El programa
debe evitar su reinstalación y debe poder ser desinstalado con el comando:
GUARDA /C
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-12
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
USO DE LOS PUERTOS DEL ADAPTADO ASÍNCRONO
COM1:
COM2:
COM3:
COM4:
3F8H
3F8H
3F8H
3F9H
3F9H
3FAH
3FBH
3FCH
3FDH
3FEH
2F8H
2F8H
2F8H
2F9H
2F9H
2FAH
2FBH
2FCH
2FDH
2FEH
3E8H
3E8H
3E8H
3E9H
3E9H
3EAH
3EBH
3ECH
3EDH
3EEH
2E8H
2E8H
2E8H
2E9H
2E9H
2EAH
2EBH
2ECH
2EDH
2EEH
Usado para:
Comentarios
Dato a transmitir
Dato recibido
Byte bajo de divisor
Byte alto de divisor
Registro para habilitar
Registro de identificación
Registro de control
Registro de control
Registro de estado de
Registro de estado
Si el bit 7 del registro de control de línea es 0
Si el bit 7 del registro de control de línea es 1
Interrupciones
De interrupciones
De línea
De modem
La línea
Del modem
REGISTRO DE CONTROL DE LÍNEA DE COMUNICACIÓN ASÍNCRONA
7
6
5
4
3
2
1
0
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
Función
Inicia
Valores posibles
Bit de acceso
Pone control rup
Fija paridad
Paridad par
Habilita paridad
Bits de paro
0
0
0
0
0
0
Tamaño del dato
00
1=accesa divisor baud
0=deshabilita 1=manda 0s
1= sin paridad
0= paridad impar 1= par
0= ninguna 1= un bit de par
0=1 bit de paro 2=1.5 o 2
00=5 bits 01=6 bits
10=7 bits 11= 8 bits
REGISTRO DE ESTADO DE LÍNEA DE LA COMUNICACIÓN ASÍNCRONA
7
6
5
4
3
2
1
0
Función
Inicia
‫ـ‬
Siempre cero
Reg transm vacío
Reg transm vacío
Ind interrupción
Error de marco
Error de paridad
Error de pérdida
Dato recibido
0
1
1
0
0
0
0
0
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
Valores posibles
Sin función
0 = enviado
0 = listo
0 = normal
0 = normal
0 = normal
0 = normal
0 = nada llegó
1 = desocupado
1 = ocupado
1 = ruptura
1 = error
1 = error
1 = dato no tomado
1 = hay dato
REGISTRO DE HABILITACIÓN DE INTERRUPCIONES DE COMUNICACIÓN ASÍNCRONA
7
6
5
4
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
3
2
1
0
Función
Inicia
Valores posibles
‫ـ‬
Siempre cero
Interr. de modem
Interr. de línea
Interr. de trans.
Interr. dato listo
0
0
0
0
0
Sin función
1 = habilita interrupción de modem
1 = habilita interrupción receptor
1 = habilita reg Trans. Vacío int.
1 = habilita int. dato recibido
‫ـ‬
‫ـ‬
‫ـ‬
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-13
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
REGISTRO DE CONTROL DEL MODEM DE COMUNICACIÓN ASÍNCRONA
7
6
5
‫ـ‬
‫ـ‬
‫ـ‬
4
3
2
1
0
Función
Inicia
Valores posibles
‫ـ‬
Siempre cero
Modo prueba
Señal –OUT2 (IRQ)
Señal –OUT1
Señal –RTS
Señal -DTR
0
0
0
0
0
0
Sin función
1 = habilita autoconexión
1 = -OUT2 habilita 0 = alto
1 = -OUT1 es bajo 0 = alto
1 = -RTS es positivo 0 = negativo
1 = -DTR es positivo 0 = negativo
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
REGISTRO DE ESTADO DEL MODEM DE COMUNICACIÓN ASÍNCRONA
7
6
5
4
3
2
1
0
Función
Inicia
Valores posibles
‫ـ‬
-DCD negada
-RI negada
-DSR negada
-CTS negada
Delta DCD
Ind de fila negada
Delta DSR
Delta CTS
?
?
?
?
0
0
0
0
1 si entrada RS-232 es un voltaje positivo
1 si entrada RS-232 es un voltaje positivo
1 si entrada RS-232 es un voltaje positivo
1 si entrada RS-232 es un voltaje positivo
1 = -DCD cambio de estado
1 = -RI cambio a OFF
1 = -DSR cambio de estado
1 = -CTS cambio de estado
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
‫ـ‬
1 SOH ☺
2 STX ☻
3
5 ENQ ♣
6 ACK ♠
16 DEL ►
21 NAK §
27 ESC ←
8 BS
10 LF
7 BEL
24 CAN ↑
22 SYN ‗
◘
◙
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
ETX ♥
●
4
EOT ♦
13 CR
♪
8-14
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
PROYECTO
Se ofrecen los archivos para recepción y envío del protocolo XMODEM.
Ensamblarlos, ligarlos y ejecutar el de recepción en una PC y el de envío en otra PC,
conectada a la primera, para enviar archivos menores de 32K.
%TITLE
“RECIBE UN ARCHIVO USANDO PROTOCOLO XMODEM”
IDEAL
DOSSEG
MODEL
STACK
JUMPS
;
small
De ASINC.OBJ
EXTRN
rc
nl
bd4800
teclaFin
soh
ack
nak
can
eot
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
Puerto:abs
13
10
03ch
100
01
06
21
18
04
;ASCII del retorno de carro
;ASCII de nueva línea
;4800 baud, sin paridad, 1 bit paro, 8 bits
;Código de tecla F10
;Inicio de cabeza
;Respuesta positiva
;Respuesta negativa
;Cancelar
;Fin de texto
DATASEG
apronta
ClaveFin
DB
DB
rc,nl,’archivo de salida existe. ¿Sobre escribir? (s/n)’,0
0
saludo
cade
DB
DB
DB
DB
DB
DB
rc,nl,“┌───────────────────────────────────────────────┐”
rc,nl,”│RECIBE UN ARCHIVO POR PUERTO SERIE USANDO
│”
rc,nl,”│XMODEM. Configuración para 4800 bauds. Usa COM:│”
rc,nl,”│Oprimir F10 para terminar
│”
rc,nl,”└───────────────────────────────────────────────┘”
rc,nl,0
pidearch
cadena
NomArch
HandleA
Pagina
paquet
suma
noint
contador
DB
DB
DB
DW
DB
DB
DB
DB
DB
rc,nl,”Dar nombre de archivo:”,0
80 dup (0)
;Cadena para diversos usos
35 dup (0)
;Cadena para recibir nombre de archivo
0
;Handle del archivo de salida
32576 dup (0)
;Buffer para recibir
1
;Número de paquete
0
;Suma de cotejo
0
;Contador de intentos fallidos
0
;Apuntador a Pagina
CODESEG
;
De ASINC.OBJ
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-15
LENGUAJE ENSAMBLADOR 80386
EXTRN
EXTRN
;
TraeUnPar:proc,CuentaPar:proc,TraePar:proc
De BINASC.OBJ
EXTRN
;
ErrDisco:proc
De PARAM
EXTRN
;
EsperaTecla:proc,TraeCar:proc,CursorDer:proc
De ERRDISCO
EXTRN
;
IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc
SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc
De TECLADO,OBJ
EXTRN
;
PRÁCTICA 8
BinAscDec:proc
De CADENAS.OBJ
EXTRN
SacaCadena:proc,LeeCadena:proc
Inicia:
mov
mov
call
mov
mov
add
mov
mov
call
cmp
je
mov
call
mov
mov
call
jmp
ax,@data
es,ax
TraePar
bp,dx
dx,puerto
dl,’1’
[cade+48],dl
di,offset saludo
SacaCadena
bp,1
@@10
di,offset pidearch
SacaCadena
di,offset NomArch
cl,35
LeeCadena
short @@15
;inicializa DS para apuntar al
;Salva número de parámetros
;Trae número de puerto – 1
;Lo hace ASCII
;Lo pone en cadena de aviso
;Exhibe bienvenida con explicación
;Recupera número de parámetros
;Exhibe apuntador
;Apunta con DI a cadena de nombre
@@10:
xor
call
cx,cx
TraeUnPar
;DI apunta a nombre dado en línea de comando
@@15:
mov
call
jc
call
call
je
mov
int
dx,di
ArchExiste
@@20
SacaCadena
Confirma
@@20
ax,4c00h
21h
;Para abrir archivo
;Salta si no existe
;Pide confirmación para sobre escribir
;Brinca si sí
;Sale si no
@@20:
mov
xor
mov
int
dx,di
cx,cx
ah,3ch
21h
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Función de DOS para crear archivo
8-16
LENGUAJE ENSAMBLADOR 80386
jnc
jmp
PRÁCTICA 8
@@30
errores
@@30:
mov
mov
mov
;
[HandleA],ax
bx,offset Pagina
di,0
;Salva andel del archivo destino
;Apunta con DI a buffer de salida
Inicializa el baun rate y el resto del puerto asíncrono
mov
mov
mov
int
call
ah,0
al,bd4800
dx,Puerto
14h
IniciaAsinc
;Función del BIOS para iniciar puerto
;Trae byte de configuración
;Número de puerto (0 o 1)
;Servicio para RS-232
;Inicializa el modo asíncrono
al,nak
Zalea zinc
;Empieza el dialogo o rechaza paquete
;Pide inicio o retransmisión
EdoLeeAsinc
dx,dx
@@50
LeeAsinc
al,soh
@@55
al,eot
@@45
al,ack
SaleAsinc
salvar
;Verifica si hay dato recibido
;No, salta a revisar teclado
;Lee carácter del buffer de recepción
;¿Llegó inicio de paquete?
;Si, salta a recibir el resto
;¿Fin de la transferencia?
;No, brinca
;Manda OK final
;Por el puerto serie
@@40:
mov
call
@@45:
call
or
jz
call
cmp
je
cmp
jne
mov
call
jmp
@@50:
call
jz
call
jnz
cmp
je
jmp
;
EsperaTecla
@@45
TraeCar
@@45
al,TeclaFin
salir
@@45
;¿Hay rechazo?
;No, salta a revisar por dato recibido
;Trae valor de la tecla
;Salta si no es de función
;¿F10?
Recibe resto del paquete
@@55:
mov
[suma],soh
@@60:
call
or
jz
call
mov
EdoLeeAsinc
dx,dx
@@55
LeeAsinc
[paquet],al
;Verifica si carácter recibido
;Lee carácter del buffer de recepción
;Salva número de paquete
@@70:
mov
call
or
jz
[contador],di
EdoLeeAsinc
dx,dx
@@70
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Verifica si DX > 0
8-17
LENGUAJE ENSAMBLADOR 80386
call
add
cmp
jne
dec
PRÁCTICA 8
LeeAsinc
al,[paquet]
al,-1
@@45
[suma]
;Lee carácter del buffer de recepción
;¿Llegó completo a unos?
cx,128
;Para recibir 128 caracteres
EdoLeeAsinc
dx,dx
@@90
LeeAsinc
[Pagina+di],al
[suma[,al
di
@@90
;¿Dato disponible?
;No, salta (tira datos)
;Reduce suma de cotejar
@@80:
mov
@@90:
call
or
jz
call
mov
add
inc
loop
;Trae el carácter
;Lo salva en buffer de salida
;Actualiza suma de cotejo
;Avanza apuntador
;Sigue hasta acabar
@@100:
call
or
jz
call
cmp
je
mov
jmp
EdoLeeAsinc
dx,dx
@@100
LeeAsinc
al,[suma]
@@110
di,[contador]
@@40
;Trae suma enviada por emisor
;¿Coinciden ambas sumas?
;Repone apuntador
@@110:
mov
call
mov
call
jmp
al,’.’
EscrCarX
al,ack
SaleAsinc
@@45
;Exhibe “.”
bx,[HandleA]
dx,offset Pagina
ah,40
cx,di
21h
@@120
errores
;Trae handle
bx,[HandleA]
ah,3eh
21h
al,eot
SaleAsinc
salir
;Cierra el archivo
;Responde que recibió bien
;Sigue por más
salvar:
mov
mov
mov
mov
int
jnc
jmp
;Función de DOS par escribir un archivo
@@120:
mov
mov
int
mov
call
jmp
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Usando DOS
;Manda carácter final
8-18
LENGUAJE ENSAMBLADOR 80386
;
PRÁCTICA 8
Fin de emulación. Repone módulo asíncrono y regresa a DOS
Errores:
mov
call
[ClaveFin],al
ErrDisco
call
mov
mov
int
FinAsinc
ah,04ch
al,0
21h
;Procesa error de disco
Salir:
;Detiene el módulo asíncrono
;Función de DOS: Termina el programa
;Regresa código de salida
%NEWPAGE
ArchExiste
PROC
xor
mov
int
jc
mov
mov
int
clc
al,al
ah,3dh
21h
@@99
bx,ax
ah,3eh
221h
;Sólo lectura
;Para abrir archivo
;con DOS
;Salta si no existe
;Recupera handle
;Función para cerrar
;archivo
;Limpia acarreo para indicar que existe
@@99:
ret
ENDP
ArchExiste
PROC
push
mov
call
mov
int
or
cmp
je
cmp
je
jmp
Confirma
di
di,offset Apronta
SacaCadena
ah,1
21h
al,20h
al,’s’
@@99
al,’n’
@@20
Confirma
;Salva
;Apuntador a aprontar
;De sobre escritura
;Función de DOS
;para leer teclazo
;Lo hace minúscula
;¿Se dio “S” o “s”?
;Si, salta
;¿Se dio “N” o “n”?
;Si, salta
al,’@’
;Hace ZF = “0”
@@20:
cmp
@@99:
pop
ret
ENDP
di
Confirma
PROC
push
mov
mov
mov
mov
int
call
EscrCarX
ax bx cx
ah,9
bh,0
cx,1
bl,1fh
10h
CursorDer
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Llamada para imprimir carácter/atributo
;Asigna página 0
;Escribe solamente un carácter
;Escribe el carácter y el atributo
;Ahora mueve el cursor a la siguiente posición
8-19
LENGUAJE ENSAMBLADOR 80386
pop
ret
ENDP
PRÁCTICA 8
cx bx ax
EscrCarX
END Inicia
(Archivo EXMODEM.ASM)
%TITLE
;
“ENVÍA UN ARCHIVO USANDO XMODEM”
Implementa la transmisión de un archivo usando protocolo de Ward Christensen, de 1979
IDEAL
DOSSEG
MODEL
SNACK
JUMPS
;
small
512
De ASINC.OBJ
EXTRN
rc
nl
bd4800
TeclaFin
Soh
Ack
Nak
Can
Eot
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
Puerto:abs
;Especifica puerto COM (0 = COM1)
13
10
0c3h
100
01
06
21
18h
04
;ASCII del retorno de carro
;ASCII de nueva línea
;4800 baud, sin paridad, 1 bit de paro, 8 bits
;Código de tecla F10
;Inicio de encabezado
;Respuesta positiva
;Respuesta negativa
;Cancelar
;Fin de texto
DATASEG
ClaveFin
saludo
DB
0
cade
DB
DB
DB
DB
DB
DB
rc,nl,“┌────────────────────────────────────────────────┐”,rc
rc,nl,“│ENVÍA UN ARCHIVO POR PUERTO SERIE USANDO XMODEM │”
rc,nl,“│Configurada para 4800 bauds. Usa COM :
│”
rc,nl,“│Oprimir F10 para terminar
│”
rc,nl,”└────────────────────────────────────────────────┘”
rc,nl,nl,0
PideArch
Cadena
NomArch
HandleA
Pagina
paquet
suma
noint
DB
DB
DB
DW
DB
DB
DB
DB
rc,nl,”Dar nombre de archivo: “,0
80 dup (0)
;Cadena para diversos usos
30 dup (0)
;Cadena para recibir nombre de archivo
0
;Handle del archivo
256 dup (0)
1
;Número de paquete
0
;Suma para cotejar
0
;Número de intentos fallidos
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-20
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 8
CODESEG
;
De ASINC.OBJ
EXTRN
EXTRN
;
De TECLADO.OBJ
EXTRN
;
TraeUnPar:proc,CuentaPar:proc,TraePar:proc
De BINASC.OBJ
EXTRN
:
ErrDisco:proc
De PARAM
EXTRN
;
EsperaTecla:proc,TraeCar:proc,CursorDer:proc
De ERRDISCO
EXTRN
;
IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc
SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc
BinAscDec:proc
De CADENAS.OBJ
EXTRN
SacaCadena:proc,LeeCadena:proc
Inicia:
mov
mov
call
call
mov
mov
add
mov
mov
call
cmp
je
mov
call
mov
mov
call
jmp
ax,@data
es,ax
TraePar
CuentaPar
bp,dx
dx,puerto
dl,’1’
[cade+40],dl
di,offset saludo
SacaCadena
bp,1
@@10
di,offset pidearch
SacaCadena
di,offset NomArch
cl,30
LeeCadena
short @@15
;Inicializa DS para apuntar al
;Cuenta parámetros
;Salva cantidad de parámetros
;Informa qué puerto COM usar
;Lo hace ASCII
;Lo inserta en cadena
;Exhibe bienvenida con explicación
;Trae cantidad de parámetros
;Exhibe aprontador que pide archivo
;Apunta con DI a cadena de nombre
;30 caracteres máximo de nombre
@@10:
xor
call
cx,cx
TraeUnPar
;Apunta a nombre dado en línea de comando
@@15:
mov
mov
mov
int
jnc
dx,di
ah,3dh
al,0
21h
@@20
;Para abrir archivo
;Sólo lectura
;Brinca si lo abrió
@@20:
mov
[HandleA],ax
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Salva andel del archivo fuente
8-21
LENGUAJE ENSAMBLADOR 80386
;
PRÁCTICA 8
Inicializa el baud rate y el resto de puerto asíncrono
mov
mov
mov
int
call
ah,0
al,bd4800
dx,puerto
14h
IniciaAsinc
;Función del BIOS para iniciar puerto
;Trae byte de configuración
;Número de puerto (0 o 1)
;Servicio para RS-232
;Inicializa el módulo asíncrono
EdoLeeAsinc
dx,dx
@@40
LeeAsinc
al,nak
@@30
short @@50
;Verifica si recibió carácter
;Salta a ver teclado si no
;lee carácter del buffer de recepción
;¿Llegó nak inicial?
;Salta si no
EsperTecla
@@30
TraeCar
@@30
al,TeclaFin
Salir
@@30
;Verifica si se presionó una tecla
;Brinca si no
;Trae carácter de la tecla
;Brinca si tecla normal
;¿Se oprimió tecla de terminar?
;Si, salta
;Salta a esperar dato serial
ax,0
cx,64
di,offset Pagina
stow
bx,[HandleA]
ah,3fh
cx,128
dx,offset Pagina
21h
@@60
errores
;Pone 128 ceros
@@30:
call
or
jz
call
cmp
jne
jmp
@@40:
call
jz
call
jnz
cmp
je
jmp
@@50:
mov
mov
mov
rep
mov
mov
mov
mov
int
jnc
jmp
;en buffer de salida
;Trae handle del archivo
;Función de DOS para leer un archivo
;128 bytes
:Apunta al buffer
;Salta si OK
@@60:
mov
[byte ptr noint],0
@@65:
mov
or
jz
mov
mov
mov
Call
cx,128
ax,ax
@@90
bx,0
[suma],soh
al,’.’
EscrCarX
;Para enviar 128 bytes
;¿Leyó algunos bytes?
;Salta si no
;Inicia apuntador
;inicia suma de cotejar
;Exhibe “.”
al,
SaleAsinc
al,[paquet]
SaleAsinc
al,[paquet]
al
[paquet]
;Envía inicio de paquete
@@70:
mov
call
mov
call
mov
not
inc
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Envía número consecutivo
;Trae consecutivo
;Lo complementa a unos
;Lo envía
8-22
LENGUAJE ENSAMBLADOR 80386
call
dec
PRÁCTICA 8
SaleAsinc
[suma]
;Actualiza suma de cotejar
al,[bl+Pagina]
[suma],al
SaleAsinc
bx
cx
cx,cx
@@100
short @@80
;Trae un byte del buffer
;Lo agrega
;Y lo manda
;Avanza apuntador
;Decrementa contador
;¿Acabó con los 128?
;Si, salta
;No, envía más
bx,[HandleA]
ah,3eh
21h
al,eot
SaleAsinc
salir
;Cierra el archivo
;Función para cerrar archivo
al,[suma]
SaleAsinc
;Envía suma formada
EdoLeeAsinc
dx,dx
@@160
LeeAsinc
al,ack
120
@@50
;¿Llegó algo al puerto?
;Verifica si hay dato recibido
al,nak
@@140
[noint]
[noint],5
@@130
@@90
;¿Llegó respuesta negativa?
;No, salta
;aumenta número de intentos
;¿Llegó a 5?
;No, brinca
;Salta para salir
@@80:
mov
add
call
inc
dec
or
jz
jmp
@@90:
mov
mov
int
mov
call
jmp
;Manda byte final
@@100:
mov
call
@@110:
call
or
jz
call
cmp
jne
jmp
;Lee carácter del buffer de recepción
;¿Llegó ACK?
;No, salta
;Si, salta a enviar otro paquete
@@120:
cmp
jne
inc
cmp
jb
jmp
@@130:
jmp
@@65
@@140:
cmp
jmp
al,can
@@90
;¿Llegó petición de cancelar?
@@150:
jmp
@@65
@@160:
call
jz
call
jnz
cmp
je
EsperaTecla
@@110
TraeCar
@@170
al,TeclaFin
Salir
;Verifica si se presionó una tecla
;Brinca si no
;Trae carácter de la tecla
;Brinca si tecla normal
;¿Se oprimió tecla de terminar?
SaleAsinc
@@110
;Manda byte al puerto
@@170:
call
jmp
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-23
LENGUAJE ENSAMBLADOR 80386
;
PRÁCTICA 8
Fin de emulación. Repone módulo asíncrono y regresa a DOS
Errores:
mov
call
[ClaveFin],al
ErrDisco
call
mov
mov
int
FinAsinc
ah,04ch
al,0
21h
Salir:
;Detiene el módulo asíncrono
;Función de DOS: Termina el programa
;Regresa código de salida
%NEWPAGE
PROC
push
mov
mov
mov
mov
int
call
pop
ret
ENDP
EscrCarX
ax bx cx
ah,9
bh,0
cx,1
bl,1fh
10h
CursorDer
cx bx ax
;Salva registros
;Llamada para imprimir carácter/atributo
;Asigna página 0
;Escribe solamente un carácter
;Escribe el carácter y el atributo
;Ahora mueve el cursor a la siguiente posición
;Recobra registros
EcsrCarX
END Inicia
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIÓN: PROFESOR PABLO FUENTES RAMOS
8-24
Descargar