Vistas de página en total

domingo, 17 de noviembre de 2013

LIBRERÍA PROTOCOLO DH+ Network

  Hoy voy a poner las funciones que crearán el nivel de transmisión del protocolo DH+.

  Son muy simples, pues el protocolo es muy simple.



DH_Net.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.

include DH.mac

    public _Recive_DH
    public _Send_DH
   
   
.model compact,pascal


.data


.code


; extrae un mensaje del la trama DH+
; se le pasa el buffer de recepción
; devuelve :

;el mensaje en el buffer
; la longitud del mensaje en dh , maximo 256 byte
; el nodo que lo envía en dl   0-255
; Si al=0ffh ha habído un error en la recepción.

;la rutina contesta al emisor directamente ack o nack.
; la bandera de salida sirve para que el procedimiento principal
;pueda contar el número de errores consecutivos y pueda detener la transmisión
; o decidir reenviar el mensaje

proc _Recive_DH  uses bx si, datos
        ;Espera SOH. ignora todo lo que llegue antes.
espera0:
        getcaux
        cmp al,dle
        jnz espera1
        getcaux
        cmp al,soh
        jnz espera0 
        ;Recogida nodo destino
        getcaux
        mov dl,al  ; recogida del nodo destino
       
        ;espera inicio de mensaje
espera1:
        getcaux
        cmp al,dle
        jnz espera1
        getcaux
        cmp al,stx
        jnz espera1
        ;recogida de mensaje
        mov bx,0       ; inicio contador e indexamiento
        mov dh,0       ; incio el checksum
        mov si,datos   ; posición del buffer
leemsg:
        getcaux
        cmp al,dle
        jz control    ; es caracter de control
copiar: 
        mov [bx+si],al
        add dh,al     ;sumo checksum
        inc bx
        jmp leemsg
       
control:  ; recogida del dle duplicado
        getcaux
        cmp al,dle
        jz copiar     ; es dle duplicado
        ; caso de ser fin de texto
        cmp al,etx    ; si no es etx es un error de recepción
        jz fin_datos
error:        ;error de mensaje  
        putcaux NACK     ; envía mensaje no reconocido 
        mov al,0ffh
        ret
    
fin_datos:    
        ;comprobamos checksum
        getcaux
        cmp dh,al
        jnz error
        putcaux ACK     ; envía mensaje reconocido
        mov al,0       ; indica recepción correcta
        mov dh,bl      ; recoge el contador de datos
   
        ret
_Recive_DH  endp

;Monta la trama DH+    dle+stx+[texto]+dle+etx+ checksum


proc _Send_dh uses bx dx cx si,nodo:byte,datos,longitud
        putcaux dle      ;Inicio de paquete
        putc
aux soh
        putcaux nodo     ;envío del nodo destino
        putcaux dle      ;STX comienzo de mensaje
        putcaux stx
        mov dl,0         ;inicio checksum
       
        ;transmision de los datos. si dato=dle se envía dle+dle
      
        mov cx,ax
        mov si,0
        mov bx,datos
resto:  mov al,[bx+si]

        cmp al,dle
        jnz no_dle
        putcaux dle
no_dle:
        mov al,[bx+si]
        add dl,al       ; añado el cara caracter al checksum
        putcaux al
        inc si
        loop resto
        putcaux dle      ;fin de mensaje
        putcaux etx
        ; fin de tansmisión de datos
       
        putcaux dl      ;envío checksum  
     
        ret
_Send_DH endp

   end


No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.