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
putcaux 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.