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
%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
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