Vous êtes sur la page 1sur 24

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS
8-1
PRCTICA 8





1. INTRODUCCIN


Esta prctica est enfocada a la comunicacin serial de un PC, interceptando la
interrupcin de uno de los puertos



2 OBJETIVOS


2.1 El alumno aprender a crear rutinas que permitan interceptar una
interrupcin de hardware del sistema.


2.2 Aprender a manipular el almacenamiento circular, es decir, de reas que
estn 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 diagnstico para comunicaciones de tipo serie.


2.4 Se ilustra en ensamblado condicional del ensamblador.



3 DESARROLLO


3.1 Capturar y ensamblar el siguiente mdulo con el nombre ASINC.ASM.

%TITLE MDULO DE COMUNICACIN SERIAL ASNCRONA

IDEAL
DOSSEG
MODEL small

PUBLIC Puerto,Cola

Puerto = 1 ;0 = COM1:, 1 = COM2:

IF Puerto EQ 0
DirPuerto EQU 03F8H ;Direccin base del UART 8250
VectorNo EQU 0CH ;Nmero del vector de interrupcin
COMUNICACIN SERIAL DE UNA PC
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-2
HabilitaIRQ EQU 0EFH ;Mscara para habilitar IRQ4 en el 8259
ImpideIRQ EQU 10H ;Mscara para deshabilitar IRQ4

ELSEIF Puerto EQ 1
DirPuerto EQU 02F8H ;Direccin base del UART
VectorNo EQU 0BH ;Nmero del vector de interrupcin
HabilitaIRQ EQU 0F7H ;Mscara para habilitar IRQ3 en el 8259
ImpideIRQ EQU 08H ;Mscara para deshabilitar IRQ3

ELSE
DISPLAY Puerto debe ser 0 o 1
ERR
ENDIF

; Direcciones de los registros de la tarjeta de comunicacin serie

RegistroTx = DirPuerto + 0 ;Registro de transmisin
RegistroRx = DirPuerto + 0 ;Registro de recepcin
HabilitaInt = DirPuerto + 1 ;Registro para habilitar interrupciones
IdentInt = DirPuerto + 2 ;Identificacin de la interrupcin
ControlLinea = DirPuerto + 3 ;Registro de control de lnea
ControlModem= DirPuerto + 4 ;Registro de control del modem
EdoLinea = DirPuerto + 5 ;Registro del estado de la lnea
EdoModem = DirPuerto + 6 ;Registro del estado del modem

; Otros EQU
EOI EQU 020h ; Cmndo fin de Interrupcin
C8259_0 EQU 020h ;Direccin del 8259
C8259_1 EQU 021h ;Comando fin de interrupciones para el PIC
TamBuff EQU 2048 ;Tamao del buffer de entrada

DATASEG
SegVector DW ? ;Segmento del vector anterior
SesVector DW ? ;Sesgo (offset) de vector anterior
Cabeza DW ? ;Apuntador a la cabeza del buffer
Cola DW ? ;Apuntador a la cola del buffer
Buffer DB TamBuff DUP (?) ;Buffer de entrada

CODESEG

PUBLIC IniciaAsinc, FinAsinc, EsoAsinc
PUBLIC SaleAsinc, LeeAsinc, EdoLeeAsinc

%NEWPAGE








;VaciaBuffer VACA EL BUFFER DE ENTRADA
;
; NOTA: Privado del mdulo
;Entrada: Ninguna
;Salida: Ninguna
;Registros: Ninguno
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-3
PROC VaciaBuffer

cli ;Impide las interrupciones
push ax ;Salva AX
mov ax,offset Buffer ;El buffer est vaco si cabeza es
mov [Cabeza],ax ;igual a Cola
mov [Cola],ax
pop ax ;Recupera AX
sti ;Habilita interrupciones
ret

ENDP VaciaBuffer

%NEWPAGE









PROC IniciaAsinc

call VaciaBuffer ;Inicializa el buffer

; Salva y redefine el vector de interrupcin

push ds ;Salva registros de segmento
push es
mov ax,3500h + VectorNo ;Trae direccin del vector
int 21h ;llama a DOS
mov [SegVector],es ;Salvas segmento del vector
mov [SesVector],bx ;Salva sesgo del vector
push cs ;Direccin de la rutina de servicio
pop ds ;En DS:DX
mov dx,offset ServIRQ ;Para usar funcin 25H
mov ax,2500h + VectorNo
int 21h
pop es ;Restaura registros
pop ds

; habilita interrupcin (IRQ) del 8259 para el adaptador

in al,C8259_1 ;Trae mscara de permiso del 8259
and al,HabilitaIRQ ;Limpia bit de la mscara
out C8259_1,al ;Modifica mscara

; Permite que el 8250 interrumpa al recibir un dato

mov dx,ControlLinea ;Apunta al registro de control
in al,dx ;de lnea, para limpiar el bit
;IniciaAsinc
;
;Entrada: Ninguna
;Salida: Ninguna
;Registros: AX, BX, DX
; NOTA: Invocar a FinAsinc antes de que termine el programa
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-4
and al,07fh ;7 (DLAB)
out dx,al ;lo que permite poner
mov dx,HabilitaInt ;a 1 el bit de habilitar
mov al,1 ;interrupcin (bit 0)
out dx,al ;del registro de interrupciones

; Limpia el estado del 8250 y los registros de datos

Inic5:

mov dx RegistroRx ;Limpia registro de datos
in al,dx ;al leerlo
mov dx,EdoLinea ;Limpia estado de la lnea,
in al,dx ;leyndola
mov dx,EdoModem ;Limpia estado del modem,
in al,dx ;leyendo dicho puerto
mov dx,IdenInt ;Verifica el registro de
in al,dx ;identificacin de interrupcin
test al,1 ;bit 0 debe ser 1
jz Inic5 ;Brinca si hay interrupcin pendiente

; Pone bit 3 del registro de control del modem

mov dx,ControlModem ;Las interrupciones deben
in al,dx ;ser atendidas tan pronto
or al,08h ;que siguiente bit se ponga en 1
and al,0efh ;Borra loopback
out dx,al ;ya!

; Vaciar el buffer de entrada, por precaucin

call VaciaBuffer
ret

ENDP IniciaAsinc









PROC FinAsinc

; Enmascara (deshabilita) IRQ en el PIC

in al,C8259_1 ;Lee mscaras
or al,ImpideIRQ ;Enmascara bit IRQ
out C8259_1,al ;reescribe mscaras

; Deshabilita interrupcin en el 8250

;FinAsinc DESINSTALA RUTINA DE SERVICIO IRQ
;
;Entrada: Ninguna
;Salida: Ninguna
;Registros: AL, DX
; NOTA: Obligatorio su uso antes de terminar el programa
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-5
mov dx,ControlLinea ;Empieza leyendo el registro
in al,dx ;de control de lnea y limpia
and al,07fh ;bit 7 (bit de acceso al divisor)
out dx,al ;cuando DLAB = 0
mov dx,HabilitaInc ;Limpia todos los bits para
mov al,0 ;deshabilitar todo tipo de interrupcin
out dx,al ;Reescribe dicho registro

; Pone a 0 el bit 3 del control del modem

mov dx,ControlModem ;Asigna direccin del puerto
in al,dx ;Lee tal registro
and al,0f7h ;Limpia bit 3
out dx,al ;Saca nuevo valor

; Las interrupciones ya estn deshabilitadas. Recuperar vector

push ds ;Salva registro de segmento
mov ax,2500h+VectorNo ;pone el vector anterior
mov dx,[SesVector] ;Trae sesgo anterior
mov ds,[SesVector] ;Trae segmento anterior
int 21h ;Repone vector
pop ds
ret

ENDP FinAsinc

%NEWPAGE









PROC EdoAsinc

mov ah,3 ;Nmero de funcin para traer estado
mov dx,Puerto ;de un puerto serie
int 14h ;llama al BIOS
ret

ENDP EdoAsinc






PROC SaleAsinc

;EdoAsinc OBTIENE EL ESTADO DE LA SALIDA
;
;Entrada: Ninguna
;Salida: AH = estado de la lnea
; AL = estado del modem
;Registros: AX, DX
;SaleAsinc ENVA UN BYTE AL PUERTO DE SALIDA (TRANSMITE)
;
;Entrada: AL = carcter (byte) a enviar
;Salida: Ninguna
;Registros: Ninguno
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-6
push dx ;Va a usar DX, lo salva
push ax ;Salva el carcter

@@10:

mov dx,EdoLinea ;Apunta al registro de control
in al,dx ;y lo lee
and al,020h ;Asla bit de transmisin lleno
jz @@10 ;Brinca si THRE est en 0
pop ax ;Recupera carcter
mov dx,RegistroTx ;Apunta a registro de transmisin
out dx,al ;Enva byte en AL
pop dx
ret

ENDP SaleAsinc








PROC LeeAsinc

xor al,al ;Por si est vaco el buffer
mov bx,[Cola] ;Trae apuntador al final del buffer
cmp bx,[Cabeza] ;Prueba si el buffer est vaco
je @@99 ;Sale si est vaco (AL = 0)
mov al,[byte ptr bx] ;Si no, trae carcter del buffer
inc [Cola] ;Avanza apuntador de la cola
cmp [Cola],offset buffer+TamBuff ;En el extremo?
Jb @@99 ;Brinca si no
Mov [Cola],offset buffer ;Si s, reinicia apuntador de cola

@@99:

ret

ENDP LeeAsinc

%NEWPAGE








PROC EdoLeeAsinc

;LeeAsinc TOMA UN BYTE DEL BUFFER DE MEMORIA
;
;Entrada: Ninguna
;Salida: AL = carcter del buffer: si AL = 0 el buffer est vaco
;Registros: AL, BX
;EdoLeeAsinc OBTIENE ESTADO DEL BUFFER DE ENTRADA
;
;Entrada: Ninguna
;Salida: DX = nmero de bytes (caracteres) en el buffer
;Registros: Ninguno
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-7
mov dx,[Cabeza] ;Trae apuntador de cabeza del buffer
sub dx,[Cola] ;Resta cola de cabeza
jge @@99 ;Brinca si el resultado no negativo
add dx,TamBuff ;Ajusta el resultado negativo

@@99:

ret

ENDP EdoLeeAsinc








PROC ServIRQ

push ax bx ds dx ;Salva todo registro usado
mov ax,@@data ;Apunta a los datos locales
mov ds,ax
mov dx,RegistroRx ;DX = direccin registro de recepcin
in al,dx ;Lee byte en el puerto
mov bx,[Cabeza] ;Trae apuntador de cabeza
mov [byte ptr bx],al ;Salva carcter en el buffer
inc bx ;Avanza apuntador de cabeza
cmp bx,offset Buffer+TamBuff ;Lleg al extremo
jne @@10
mov bx,offset Buffer ;Si s, reinicia la cabeza

@@10:

cmp bx,[Cola] ;Verifica si hay derrame
jne @@20 ;Brinca si no
mov bx,[Cabeza] ;caso contrario, cancela avance

@@20:

mov [Cabeza],bx ;Salva nuevo apuntador de cabeza
mov al,EOI ;Enva comando fin de interrupcin
out C8259_0,al ;Al controlador de interrupciones
pop dx ds bx ax ;Repone registros
iret

ENDP ServIRQ

END ;Fin del mdulo ASINC.ASM


3.2 Capturar programa y salvarlo como TRM.ASM. Ensamblarlo y hacerlo ejecutable
mediante:
;ServIRQ RUTINA DE SERVICIO A LA INTERRUPCIN ASNCRONA
;
;Entrada: Ninguna
;Salida: Ninguna (El carcter recibido es puesto en buffer de entrada)
;Registros: DX
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-8

C:\SEM386>tasm /zi trm
C:\SEM386>tlink /v trm,,,rem

%TITLE EMULACIN DE TERMINAL CON DEPURACIN PARA CDIGOS DE CONTROL

IDEAL
DOSSEG
MODEL small
STACK 1024

; De ASINC.OBJ

EXTRN Puerto:abs

rc EQU 13 ;ASCII del retorno de carro
nl EQU 10 ;ASCII de nueva lnea
bd2400 EQU 0A3H ;2400 baud, sin paridad, 1 bit paro, 8 bits
TeclaFin EQU 100 ;Cdigo de tecla F10

DATASEG

ClaveFin DB 0
saludo DB rc,nl,Emulador de terminales con depuracin,rc,nl
DB rc,nl,Configurada para 2400 bauds. Exhibe
DB rc,nl,cdigos de control en parntesis para
DB rc,nl,diagnosticar un puerto serial RS-232
DB rc,nl,Oprimir F10 para terminar,rc,nl,nl,0
Cadena DB 80 DUP (0) ;Cadena para diversos usos

CODESEG

; De ASINC.OBJ

EXTRN IniciaAsinc:proc,FinAsinc:proc,EdoAsinc:proc
EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO.OBJ

EXTRN EsperaTecla:proc,TraeCar:proc

; De BINASC.OBJ

EXTRN BinAscDec:proc

; De CADENAS.OBJ

EXTRN SacaCadena:proc

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-9
Inicia:

mov ax,@data ;Inicializa DS para apuntar al
mov ds,ax ;segmento de datos
mov es,ax ;Hace ES = DS
mov di,offset saludo ;Exhibe bienvenida con explicacin
call SacaCadena

; Inicializa el baud rate y el resto del puerto asncrono

mov ah,0 ;Funcin del BIOS para iniciar puerto
mov al,bd2400 ;Trae byte de configuracin
mov dx,Puerto ;Nmero de puerto (0 o 1)
int 14h ;Servicio par RS-232
call IniciaAsinc ;Inicializa el mdulo asncrono

; Realiza la emulacin de una terminal

Emula:

call EdoLeeAsinc ;Lleg algo al puerto?
Or dx,dx ;Verifica si DX>0
Jz Emu5
Call LeeAsinc ;Lee carcter del buffer de recepcin
Call SacaCar ;Eco local del carcter recibido
Jmp Emula

Emu5:

call EsperaTecla ;Verifica si se presion una tecla
jz Emula ;Brinca si no
call TraeCar ;Trae carcter de la tecla
jnz Emu10 ;Brinca si tecla normal
cmp al,TeclaFin ;Se oprimi tecla al terminar?
Je Salir

Emu10:

push ax
call SacaCar
pop ax
call SaleAsinc ;Manda byte al puerto
jmp Emula

; Fin de emulacin. Repone mdulo asncrono y regresa a DOS

Salir:

call FinAsinc ;Detiene el mdulo asncrono
mov ah,04ch ;Funcin de DOS: Termina el programa
mov al,[ClaveFin] ;Regresa cdigo de salida
int 21h

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-10
%NEWPAGE








PROC SacaCar

cmp al,20h ;Es un carcter de control?
jc Control ;si, brinca

PROC UnCar

mov dl,sl ;Pone carcter en DL
mov ah,2 ;Funcin de DOS para exhibir carcter
int 21h ;Llamado a DOS
ret

ENDP UnCar

; Exhibe cdigos de control

Control:

sub ah,ah ;Convierte AL a un valor de 16 bits
mov cx,1 ;Especifica al menos un carcter
mov di,offset cadena ;Direcciona la cadena
call BinAscDec ;Convierte a decimal en ASCII
mov al,< ;Saca <
call UnCar ;Exhibe byte en AL
call SacaCadena ;Exhibe cadena de cdigos de control
mov al,> ;Pone >
jmp short UnCar

ENDP SacaCar

END Inicia



3.3 Ejecutar el programa TRM en dos mquinas interconectadas por el puerto serie y
observar cmo cualquier carcter 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 continuacin se ofrecen los datos para conectores de 9 y 25 terminales para los
puertos RC-232-C.
;SacaCar,UnCar EXHIBE UN VALOR ASCII
;
;Entrada: AL = valor ASCII (0255)
;Salida: Ninguna. Exhibe cdigos de control como <23>, <10>, etc.
;Registros: AX, CX, DL, DI
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-11
CONECTOR MACHO DEL PUERTO SERIE DE 9 TERMINALES DE LA PC-AT

Nm. de
terminal
Descripcin Seal Direccin
1 Deteccin de portadora CD
2 Recepcin del dato RD Entrada
3 Transmisin del dato TD Salida
4 Terminal lista DTR Salida
5 Tierra de seal SG
6 Datos listos DSR Entrada
7 Peticin de envo RTS Salida
8 Activar envo CTS Entrada
9 Indicador de llamada RI Entrada

CONECTOR MACHO DEL PUERTO SERIE DE 25 TERMINALES DE LA PC-XT

Nm. de
terminal
Descripcin Seal Direccin
8 Deteccin de portadora DCD Entrada
3 Recepcin del dato RD Entrada
2 Transmisin del dato TD Salida
20 Terminal lista DTR Salida
7 Tierra de seal SG
6 Datos listos DSR Entrada
4 Peticin de envo RTS Salida
5 Activar envo CTS Entrada
22 Indicador RI Entrada
1 Tierra de chasiss Tierra Fsica

CONEXIONES SUGERIDAS



PC1
TD
RD
RTS
CTS
DSR
DTR
SG
PC2
RD
TD
CTS
RTS
DTR
DSR
SG
PC1
TD
RD
RTS
CTS
DSR
DTR
SG
RETROLAZO
TD
RD
RTS
CTS
DSR
DTR
DSD
PC2
RD
TD
CTS
RTS
DTR
DSR
SG
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-12
CONECTOR DEL PUERTO SERIE DE 25 TERMINALES DE INTERFAZ DCE (MODEM)

Nm. de
terminal
Descripcin Seal Direccin
8 Deteccin de portadora DCD Salida
3 Recepcin del dato RxD (BB) Salida
2 Transmisin del dato TxD (BA) Entrada
20 Terminal lista DTR Entrada
7 Tierra de seal SG Retorno
6 Datos listos DSR Salida
4 Peticin de envo RTS Entrada
5 Activar envo CTS Salida
22 Indicador de llamada RI Salida
1 Tierra de Chasiss Tierra Fsica



4. TAREAS


4.1 Agregar al mdulo TRM.ASM lo necesario para que procese los caracteres
correspondientes al beep, al retroceso de carro y al salto de lnea, 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 slo funciones del BIOS e interceptar el tic del temporizador


4.3 Escribir un programa tipo COM llamndolo GUARDA.ASM que se pueda dejar
residente y que salve el contenido de una pantalla alfanumrica en el archivo
XX.PRN (sobre escribindolo) si se usa la tecla Mayus-Imprn Pant. El programa
debe evitar su reinstalacin y debe poder ser desinstalado con el comando:

GUARDA /C

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-13
USO DE LOS PUERTOS DEL ADAPTADO ASNCRONO

COM1: COM2: COM3: COM4: Usado para: Comentarios
3F8H 2F8H 3E8H 2E8H Dato a transmitir
3F8H 2F8H 3E8H 2E8H Dato recibido
Si el bit 7 del registro de control de lnea es 0
3F8H 2F8H 3E8H 2E8H Byte bajo de divisor
3F9H 2F9H 3E9H 2E9H Byte alto de divisor
Si el bit 7 del registro de control de lnea es 1
3F9H 2F9H 3E9H 2E9H Registro para habilitar Interrupciones
3FAH 2FAH 3EAH 2EAH Registro de identificacin De interrupciones
3FBH 2FBH 3EBH 2EBH Registro de control De lnea
3FCH 2FCH 3ECH 2ECH Registro de control De modem
3FDH 2FDH 3EDH 2EDH Registro de estado de La lnea
3FEH 2FEH 3EEH 2EEH Registro de estado Del modem

REGISTRO DE CONTROL DE LNEA DE COMUNICACIN ASNCRONA

7 6 5 4 3 2 1 0 Funcin Inicia Valores posibles
Bit de acceso 0 1=accesa divisor baud
Pone control rup 0 0=deshabilita 1=manda 0s
Fija paridad 0 1= sin paridad
Paridad par 0 0= paridad impar 1= par
Habilita paridad 0 0= ninguna 1= un bit de par
Bits de paro 0 0=1 bit de paro 2=1.5 o 2

Tamao del dato 00
00=5 bits 01=6 bits
10=7 bits 11= 8 bits

REGISTRO DE ESTADO DE LNEA DE LA COMUNICACIN ASNCRONA

7 6 5 4 3 2 1 0 Funcin Inicia Valores posibles
Siempre cero 0 Sin funcin
Reg transm vaco 1 0 = enviado 1 = desocupado
Reg transm vaco 1 0 = listo 1 = ocupado
Ind interrupcin 0 0 = normal 1 = ruptura
Error de marco 0 0 = normal 1 = error
Error de paridad 0 0 = normal 1 = error
Error de prdida 0 0 = normal 1 = dato no tomado
Dato recibido 0 0 = nada lleg 1 = hay dato

REGISTRO DE HABILITACIN DE INTERRUPCIONES DE COMUNICACIN ASNCRONA

7 6 5 4 3 2 1 0 Funcin Inicia Valores posibles
Siempre cero 0 Sin funcin
Interr. de modem 0 1 = habilita interrupcin de modem
Interr. de lnea 0 1 = habilita interrupcin receptor
Interr. de trans. 0 1 = habilita reg Trans. Vaco int.
Interr. dato listo 0 1 = habilita int. dato recibido

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-14
REGISTRO DE CONTROL DEL MODEM DE COMUNICACIN ASNCRONA

7 6 5 4 3 2 1 0 Funcin Inicia Valores posibles
Siempre cero 0 Sin funcin
Modo prueba 0 1 = habilita autoconexin
Seal OUT2 (IRQ) 0 1 = -OUT2 habilita 0 = alto
Seal OUT1 0 1 = -OUT1 es bajo 0 = alto
Seal RTS 0 1 = -RTS es positivo 0 = negativo
Seal -DTR 0 1 = -DTR es positivo 0 = negativo

REGISTRO DE ESTADO DEL MODEM DE COMUNICACIN ASNCRONA

7 6 5 4 3 2 1 0 Funcin Inicia Valores posibles
-DCD negada ? 1 si entrada RS-232 es un voltaje positivo
-RI negada ? 1 si entrada RS-232 es un voltaje positivo
-DSR negada ? 1 si entrada RS-232 es un voltaje positivo
-CTS negada ? 1 si entrada RS-232 es un voltaje positivo
Delta DCD 0 1 = -DCD cambio de estado
Ind de fila negada 0 1 = -RI cambio a OFF
Delta DSR 0 1 = -DSR cambio de estado
Delta CTS 0 1 = -CTS cambio de estado

1 SOH 2 STX 3 ETX 4 EOT 13 CR

5 ENQ 6 ACK 16 DEL 21 NAK 27 ESC

8 BS 10 LF 7 BEL 24 CAN 22 SYN
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-15
PROYECTO


Se ofrecen los archivos para recepcin y envo del protocolo XMODEM.
Ensamblarlos, ligarlos y ejecutar el de recepcin en una PC y el de envo en otra PC,
conectada a la primera, para enviar archivos menores de 32K.

%TITLE RECIBE UN ARCHIVO USANDO PROTOCOLO XMODEM

IDEAL
DOSSEG
MODEL small
STACK
JUMPS

; De ASINC.OBJ

EXTRN Puerto:abs

rc EQU 13 ;ASCII del retorno de carro
nl EQU 10 ;ASCII de nueva lnea
bd4800 EQU 03ch ;4800 baud, sin paridad, 1 bit paro, 8 bits
teclaFin EQU 100 ;Cdigo de tecla F10
soh EQU 01 ;Inicio de cabeza
ack EQU 06 ;Respuesta positiva
nak EQU 21 ;Respuesta negativa
can EQU 18 ;Cancelar
eot EQU 04 ;Fin de texto

DATASEG

apronta DB rc,nl,archivo de salida existe. Sobre escribir? (s/n),0
ClaveFin DB 0

saludo DB rc,nl,
cade DB rc,nl,RECIBE UN ARCHIVO POR PUERTO SERIE USANDO
DB rc,nl,XMODEM. Configuracin para 4800 bauds. Usa COM:
DB rc,nl,Oprimir F10 para terminar
DB rc,nl,
DB rc,nl,0

pidearch DB rc,nl,Dar nombre de archivo:,0
cadena DB 80 dup (0) ;Cadena para diversos usos
NomArch DB 35 dup (0) ;Cadena para recibir nombre de archivo
HandleA DW 0 ;Handle del archivo de salida
Pagina DB 32576 dup (0) ;Buffer para recibir
paquet DB 1 ;Nmero de paquete
suma DB 0 ;Suma de cotejo
noint DB 0 ;Contador de intentos fallidos
contador DB 0 ;Apuntador a Pagina

CODESEG
; De ASINC.OBJ
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-16
EXTRN IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc
EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO,OBJ
EXTRN EsperaTecla:proc,TraeCar:proc,CursorDer:proc

; De ERRDISCO
EXTRN ErrDisco:proc

; De PARAM
EXTRN TraeUnPar:proc,CuentaPar:proc,TraePar:proc

; De BINASC.OBJ
EXTRN BinAscDec:proc

; De CADENAS.OBJ
EXTRN SacaCadena:proc,LeeCadena:proc

Inicia:
mov ax,@data ;inicializa DS para apuntar al
mov es,ax
call TraePar
mov bp,dx ;Salva nmero de parmetros
mov dx,puerto ;Trae nmero de puerto 1
add dl,1 ;Lo hace ASCII
mov [cade+48],dl ;Lo pone en cadena de aviso
mov di,offset saludo ;Exhibe bienvenida con explicacin
call SacaCadena
cmp bp,1 ;Recupera nmero de parmetros
je @@10
mov di,offset pidearch ;Exhibe apuntador
call SacaCadena
mov di,offset NomArch ;Apunta con DI a cadena de nombre
mov cl,35
call LeeCadena
jmp short @@15
@@10:
xor cx,cx
call TraeUnPar ;DI apunta a nombre dado en lnea de comando
@@15:
mov dx,di
call ArchExiste ;Para abrir archivo
jc @@20 ;Salta si no existe
call SacaCadena
call Confirma ;Pide confirmacin para sobre escribir
je @@20 ;Brinca si s
mov ax,4c00h ;Sale si no
int 21h
@@20:
mov dx,di
xor cx,cx
mov ah,3ch ;Funcin de DOS para crear archivo
int 21h
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-17
jnc @@30
jmp errores
@@30:
mov [HandleA],ax ;Salva andel del archivo destino
mov bx,offset Pagina
mov di,0 ;Apunta con DI a buffer de salida

; Inicializa el baun rate y el resto del puerto asncrono

mov ah,0 ;Funcin del BIOS para iniciar puerto
mov al,bd4800 ;Trae byte de configuracin
mov dx,Puerto ;Nmero de puerto (0 o 1)
int 14h ;Servicio para RS-232
call IniciaAsinc ;Inicializa el modo asncrono
@@40:
mov al,nak ;Empieza el dialogo o rechaza paquete
call Zalea zinc ;Pide inicio o retransmisin
@@45:
call EdoLeeAsinc
or dx,dx ;Verifica si hay dato recibido
jz @@50 ;No, salta a revisar teclado
call LeeAsinc ;Lee carcter del buffer de recepcin
cmp al,soh ;Lleg inicio de paquete?
je @@55 ;Si, salta a recibir el resto
cmp al,eot ;Fin de la transferencia?
jne @@45 ;No, brinca
mov al,ack ;Manda OK final
call SaleAsinc ;Por el puerto serie
jmp salvar
@@50:
call EsperaTecla ;Hay rechazo?
jz @@45 ;No, salta a revisar por dato recibido
call TraeCar ;Trae valor de la tecla
jnz @@45 ;Salta si no es de funcin
cmp al,TeclaFin ;F10?
je salir
jmp @@45

; Recibe resto del paquete

@@55:
mov [suma],soh
@@60:
call EdoLeeAsinc
or dx,dx ;Verifica si carcter recibido
jz @@55
call LeeAsinc ;Lee carcter del buffer de recepcin
mov [paquet],al ;Salva nmero de paquete
@@70:
mov [contador],di
call EdoLeeAsinc
or dx,dx ;Verifica si DX > 0
jz @@70
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-18
call LeeAsinc ;Lee carcter del buffer de recepcin
add al,[paquet] ;Lleg completo a unos?
cmp al,-1
jne @@45 ;No, salta (tira datos)
dec [suma] ;Reduce suma de cotejar
@@80:
mov cx,128 ;Para recibir 128 caracteres
@@90:
call EdoLeeAsinc ;Dato disponible?
or dx,dx
jz @@90
call LeeAsinc ;Trae el carcter
mov [Pagina+di],al ;Lo salva en buffer de salida
add [suma[,al ;Actualiza suma de cotejo
inc di ;Avanza apuntador
loop @@90 ;Sigue hasta acabar
@@100:
call EdoLeeAsinc
or dx,dx
jz @@100
call LeeAsinc ;Trae suma enviada por emisor
cmp al,[suma] ;Coinciden ambas sumas?
je @@110
mov di,[contador] ;Repone apuntador
jmp @@40
@@110:
mov al,. ;Exhibe .
call EscrCarX
mov al,ack ;Responde que recibi bien
call SaleAsinc
jmp @@45 ;Sigue por ms

salvar:
mov bx,[HandleA] ;Trae handle
mov dx,offset Pagina
mov ah,40 ;Funcin de DOS par escribir un archivo
mov cx,di
int 21h
jnc @@120
jmp errores

@@120:
mov bx,[HandleA] ;Cierra el archivo
mov ah,3eh ;Usando DOS
int 21h
mov al,eot ;Manda carcter final
call SaleAsinc
jmp salir

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-19
; Fin de emulacin. Repone mdulo asncrono y regresa a DOS

Errores:
mov [ClaveFin],al
call ErrDisco ;Procesa error de disco

Salir:
call FinAsinc ;Detiene el mdulo asncrono
mov ah,04ch ;Funcin de DOS: Termina el programa
mov al,0 ;Regresa cdigo de salida
int 21h

%NEWPAGE
PROC ArchExiste
xor al,al ;Slo lectura
mov ah,3dh ;Para abrir archivo
int 21h ;con DOS
jc @@99 ;Salta si no existe
mov bx,ax ;Recupera handle
mov ah,3eh ;Funcin para cerrar
int 221h ;archivo
clc ;Limpia acarreo para indicar que existe
@@99:
ret
ENDP ArchExiste

PROC Confirma
push di ;Salva
mov di,offset Apronta ;Apuntador a aprontar
call SacaCadena ;De sobre escritura
mov ah,1 ;Funcin de DOS
int 21h ;para leer teclazo
or al,20h ;Lo hace minscula
cmp al,s ;Se dio S o s?
je @@99 ;Si, salta
cmp al,n ;Se dio N o n?
je @@20 ;Si, salta
jmp Confirma
@@20:
cmp al,@ ;Hace ZF = 0
@@99:
pop di
ret
ENDP Confirma

PROC EscrCarX
push ax bx cx
mov ah,9 ;Llamada para imprimir carcter/atributo
mov bh,0 ;Asigna pgina 0
mov cx,1 ;Escribe solamente un carcter
mov bl,1fh
int 10h ;Escribe el carcter y el atributo
call CursorDer ;Ahora mueve el cursor a la siguiente posicin
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-20
pop cx bx ax
ret
ENDP EscrCarX

END Inicia



(Archivo EXMODEM.ASM)


%TITLE ENVA UN ARCHIVO USANDO XMODEM

; Implementa la transmisin de un archivo usando protocolo de Ward Christensen, de 1979

IDEAL
DOSSEG
MODEL small
SNACK 512
JUMPS

; De ASINC.OBJ
EXTRN Puerto:abs ;Especifica puerto COM (0 = COM1)

rc EQU 13 ;ASCII del retorno de carro
nl EQU 10 ;ASCII de nueva lnea
bd4800 EQU 0c3h ;4800 baud, sin paridad, 1 bit de paro, 8 bits
TeclaFin EQU 100 ;Cdigo de tecla F10
Soh EQU 01 ;Inicio de encabezado
Ack EQU 06 ;Respuesta positiva
Nak EQU 21 ;Respuesta negativa
Can EQU 18h ;Cancelar
Eot EQU 04 ;Fin de texto

DATASEG

ClaveFin DB 0

saludo DB rc,nl,,rc
cade DB rc,nl,ENVA UN ARCHIVO POR PUERTO SERIE USANDO XMODEM
DB rc,nl,Configurada para 4800 bauds. Usa COM :
DB rc,nl,Oprimir F10 para terminar
DB rc,nl,
DB rc,nl,nl,0

PideArch DB rc,nl,Dar nombre de archivo: ,0
Cadena DB 80 dup (0) ;Cadena para diversos usos
NomArch DB 30 dup (0) ;Cadena para recibir nombre de archivo
HandleA DW 0 ;Handle del archivo
Pagina DB 256 dup (0)
paquet DB 1 ;Nmero de paquete
suma DB 0 ;Suma para cotejar
noint DB 0 ;Nmero de intentos fallidos

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-21
CODESEG

; De ASINC.OBJ
EXTRN IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc
EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO.OBJ
EXTRN EsperaTecla:proc,TraeCar:proc,CursorDer:proc

; De ERRDISCO
EXTRN ErrDisco:proc

; De PARAM
EXTRN TraeUnPar:proc,CuentaPar:proc,TraePar:proc

; De BINASC.OBJ
EXTRN BinAscDec:proc

: De CADENAS.OBJ
EXTRN SacaCadena:proc,LeeCadena:proc

Inicia:
mov ax,@data ;Inicializa DS para apuntar al
mov es,ax
call TraePar
call CuentaPar ;Cuenta parmetros
mov bp,dx ;Salva cantidad de parmetros
mov dx,puerto ;Informa qu puerto COM usar
add dl,1 ;Lo hace ASCII
mov [cade+40],dl ;Lo inserta en cadena
mov di,offset saludo ;Exhibe bienvenida con explicacin
call SacaCadena
cmp bp,1 ;Trae cantidad de parmetros
je @@10
mov di,offset pidearch ;Exhibe aprontador que pide archivo
call SacaCadena
mov di,offset NomArch ;Apunta con DI a cadena de nombre
mov cl,30 ;30 caracteres mximo de nombre
call LeeCadena
jmp short @@15
@@10:
xor cx,cx
call TraeUnPar ;Apunta a nombre dado en lnea de comando
@@15:
mov dx,di
mov ah,3dh ;Para abrir archivo
mov al,0 ;Slo lectura
int 21h
jnc @@20 ;Brinca si lo abri
@@20:
mov [HandleA],ax ;Salva andel del archivo fuente

LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-22
; Inicializa el baud rate y el resto de puerto asncrono

mov ah,0 ;Funcin del BIOS para iniciar puerto
mov al,bd4800 ;Trae byte de configuracin
mov dx,puerto ;Nmero de puerto (0 o 1)
int 14h ;Servicio para RS-232
call IniciaAsinc ;Inicializa el mdulo asncrono
@@30:
call EdoLeeAsinc
or dx,dx ;Verifica si recibi carcter
jz @@40 ;Salta a ver teclado si no
call LeeAsinc ;lee carcter del buffer de recepcin
cmp al,nak ;Lleg nak inicial?
jne @@30 ;Salta si no
jmp short @@50
@@40:
call EsperTecla ;Verifica si se presion una tecla
jz @@30 ;Brinca si no
call TraeCar ;Trae carcter de la tecla
jnz @@30 ;Brinca si tecla normal
cmp al,TeclaFin ;Se oprimi tecla de terminar?
je Salir ;Si, salta
jmp @@30 ;Salta a esperar dato serial
@@50:
mov ax,0 ;Pone 128 ceros
mov cx,64
mov di,offset Pagina ;en buffer de salida
rep stow
mov bx,[HandleA] ;Trae handle del archivo
mov ah,3fh ;Funcin de DOS para leer un archivo
mov cx,128 ;128 bytes
mov dx,offset Pagina :Apunta al buffer
int 21h
jnc @@60 ;Salta si OK
jmp errores
@@60:
mov [byte ptr noint],0
@@65:
mov cx,128 ;Para enviar 128 bytes
or ax,ax ;Ley algunos bytes?
jz @@90 ;Salta si no
mov bx,0 ;Inicia apuntador
mov [suma],soh ;inicia suma de cotejar
mov al,. ;Exhibe .
Call EscrCarX
@@70:
mov al, ;Enva inicio de paquete
call SaleAsinc
mov al,[paquet] ;Enva nmero consecutivo
call SaleAsinc
mov al,[paquet] ;Trae consecutivo
not al ;Lo complementa a unos
inc [paquet] ;Lo enva
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-23
call SaleAsinc
dec [suma] ;Actualiza suma de cotejar
@@80:
mov al,[bl+Pagina] ;Trae un byte del buffer
add [suma],al ;Lo agrega
call SaleAsinc ;Y lo manda
inc bx ;Avanza apuntador
dec cx ;Decrementa contador
or cx,cx ;Acab con los 128?
jz @@100 ;Si, salta
jmp short @@80 ;No, enva ms
@@90:
mov bx,[HandleA] ;Cierra el archivo
mov ah,3eh ;Funcin para cerrar archivo
int 21h
mov al,eot ;Manda byte final
call SaleAsinc
jmp salir
@@100:
mov al,[suma] ;Enva suma formada
call SaleAsinc
@@110:
call EdoLeeAsinc ;Lleg algo al puerto?
or dx,dx ;Verifica si hay dato recibido
jz @@160
call LeeAsinc ;Lee carcter del buffer de recepcin
cmp al,ack ;Lleg ACK?
jne 120 ;No, salta
jmp @@50 ;Si, salta a enviar otro paquete
@@120:
cmp al,nak ;Lleg respuesta negativa?
jne @@140 ;No, salta
inc [noint] ;aumenta nmero de intentos
cmp [noint],5 ;Lleg a 5?
jb @@130 ;No, brinca
jmp @@90 ;Salta para salir
@@130:
jmp @@65
@@140:
cmp al,can ;Lleg peticin de cancelar?
jmp @@90
@@150:
jmp @@65
@@160:
call EsperaTecla ;Verifica si se presion una tecla
jz @@110 ;Brinca si no
call TraeCar ;Trae carcter de la tecla
jnz @@170 ;Brinca si tecla normal
cmp al,TeclaFin ;Se oprimi tecla de terminar?
je Salir
@@170:
call SaleAsinc ;Manda byte al puerto
jmp @@110
LENGUAJE ENSAMBLADOR 80386 PRCTICA 8
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS
8-24
; Fin de emulacin. Repone mdulo asncrono y regresa a DOS

Errores:
mov [ClaveFin],al
call ErrDisco

Salir:
call FinAsinc ;Detiene el mdulo asncrono
mov ah,04ch ;Funcin de DOS: Termina el programa
mov al,0 ;Regresa cdigo de salida
int 21h

%NEWPAGE

PROC EscrCarX
push ax bx cx ;Salva registros
mov ah,9 ;Llamada para imprimir carcter/atributo
mov bh,0 ;Asigna pgina 0
mov cx,1 ;Escribe solamente un carcter
mov bl,1fh
int 10h ;Escribe el carcter y el atributo
call CursorDer ;Ahora mueve el cursor a la siguiente posicin
pop cx bx ax ;Recobra registros
ret
ENDP EcsrCarX
END Inicia

Vous aimerez peut-être aussi