home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
intel8051.tar.gz
/
intel8051.tar
/
i51rpck.asm
< prev
next >
Wrap
Assembly Source File
|
1996-06-30
|
2KB
|
101 lines
; routine to read and decode a packet
; Receive a packet and parse
RPACK: call linput
mov dptr,#rcvbuf
mov b,#1
call strstr ; returns A with index
mov I,a
jnz L7100
mov TYP,#'Q'
ret
;
L7100: mov Mrk,a
inc dptr
movx a,@dptr
mov Chk,a ; chk = asc(mid$(rcvbuf,i+1,1)
unchar
clr c
subb a,#3
mov Len,a ; Len = chk - 32 - 3
inc dptr
movx a,@dptr
mov T,a ; T = asc(mid$(rcvbuf,i+2,1)
unchar
mov Seq,a ; seq = T - 32
mov a,Chk
add a,T
mov Chk,a ; Chk = Chk + T
inc dptr
movx a,@dptr
mov TYP,a ; typ = mid$(rcvbuf,i+3,1)
mov a,Chk
add a,TYP
mov Chk,a ; Chk = Chk + asc(typ)
clr ctrl
L7200: inc dptr
mov r3,dpl ; rcvbuf pointer
mov r4,#0 ; pktdat pointer
mov r5,Len ; length of packet data
mov Ptr,#0
mov a,Len
jz L7420 ; no data, skip to checksum
;
L7210: mov dph,#high rcvbuf
mov dpl,r3
movx a,@dptr ; get a byte from rcvbuf
mov T,a
add a,Chk
mov Chk,a ; Chk = Chk + T
mov a,TYP
cjne a,#'S',L7250
sjmp L7300 ; insert into pktdat
L7250: mov a,T ; get rcvbuf byte
jb ctrl,L7260
cjne a,CTL,L7260
setb ctrl ; set control flag
jmp L7400 ; next char
L7260: anl a,#127
mov T7,a ; T7 = T and 127
jnb ctrl,L7300
clr ctrl
clr c
subb a,#62
jz L7300 ; = 62
jc L7300 ; < 62
mov a,T7
clr c
subb a,#96
jz L7300 ; = 96
jnc L7300 ; > 96
mov a,T
xrl a,#64
mov T,a ; T = T xor 64
;
L7300: mov a,T
mov dph,#high pktdat
mov dpl,r4
movx @dptr,a ; put a byte to pktdat
inc Ptr ; pktdat count
inc r4 ; next pktdat cell
L7400: inc r3 ; next rcvbuf cell
djnz r5,L7210
mov dph,#high pktdat
mov dpl,r4
clr a
movx @dptr,a ; terminate packet string
;
L7420: mov a,Chk
call blkchk
mov Chk,a
L7430: mov dph,#high rcvbuf
mov dpl,r3
movx a,@dptr
unchar
L7450: clr c ; if chksum <> chk then typ = 'Q'
subb a,Chk ; = 0 if equal
jz L7460
mov TYP,#'Q'
L7460: ret