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