home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / intel8051 / i51rpck.asm < prev    next >
Assembly Source File  |  2020-01-01  |  2KB  |  101 lines

  1. ; routine to read and decode a packet
  2. ; Receive a packet and parse
  3. RPACK:    call    linput
  4.     mov    dptr,#rcvbuf
  5.     mov    b,#1
  6.     call    strstr        ; returns A with index
  7.     mov    I,a
  8.     jnz    L7100
  9.     mov    TYP,#'Q'
  10.     ret
  11. ;
  12. L7100:    mov    Mrk,a
  13.     inc    dptr
  14.     movx    a,@dptr
  15.     mov    Chk,a        ; chk = asc(mid$(rcvbuf,i+1,1)
  16.     unchar
  17.     clr    c
  18.     subb    a,#3
  19.     mov    Len,a        ; Len = chk - 32 - 3
  20.     inc    dptr
  21.     movx    a,@dptr
  22.     mov    T,a        ; T = asc(mid$(rcvbuf,i+2,1)
  23.     unchar
  24.     mov    Seq,a        ; seq = T - 32
  25.     mov    a,Chk
  26.     add    a,T
  27.     mov    Chk,a        ; Chk = Chk + T
  28.     inc    dptr
  29.     movx    a,@dptr
  30.     mov    TYP,a        ; typ = mid$(rcvbuf,i+3,1)
  31.     mov    a,Chk
  32.     add    a,TYP
  33.     mov    Chk,a        ; Chk = Chk + asc(typ)
  34.     clr    ctrl
  35.  
  36. L7200:    inc    dptr
  37.     mov    r3,dpl        ; rcvbuf pointer
  38.     mov    r4,#0        ; pktdat pointer
  39.     mov    r5,Len        ; length of packet data
  40.     mov    Ptr,#0
  41.     mov    a,Len
  42.     jz    L7420        ; no data, skip to checksum
  43. ;
  44. L7210:    mov    dph,#high rcvbuf
  45.     mov    dpl,r3
  46.     movx    a,@dptr        ; get a byte from rcvbuf
  47.     mov    T,a
  48.     add    a,Chk
  49.     mov    Chk,a        ; Chk = Chk + T
  50.     mov    a,TYP
  51.     cjne    a,#'S',L7250
  52.     sjmp    L7300        ; insert into pktdat
  53. L7250:    mov    a,T        ; get rcvbuf byte
  54.     jb    ctrl,L7260
  55.     cjne    a,CTL,L7260
  56.     setb    ctrl        ; set control flag
  57.     jmp    L7400        ; next char
  58. L7260:    anl    a,#127
  59.     mov    T7,a        ; T7 = T and 127
  60.     jnb    ctrl,L7300
  61.     clr    ctrl
  62.     clr    c
  63.     subb    a,#62
  64.     jz    L7300        ; = 62
  65.     jc    L7300        ; < 62
  66.     mov    a,T7
  67.     clr    c
  68.     subb    a,#96
  69.     jz    L7300        ; = 96
  70.     jnc    L7300        ; > 96
  71.     mov    a,T
  72.     xrl    a,#64
  73.     mov    T,a        ; T = T xor 64
  74. ;
  75. L7300:    mov    a,T
  76.     mov    dph,#high pktdat
  77.     mov    dpl,r4
  78.     movx    @dptr,a        ; put a byte to pktdat
  79.     inc    Ptr        ; pktdat count
  80.     inc    r4        ; next pktdat cell
  81. L7400:    inc    r3        ; next rcvbuf cell
  82.     djnz    r5,L7210
  83.     mov    dph,#high pktdat
  84.     mov    dpl,r4
  85.     clr    a
  86.     movx    @dptr,a        ; terminate packet string
  87. ;
  88. L7420:    mov    a,Chk
  89.     call    blkchk
  90.     mov    Chk,a
  91. L7430:    mov    dph,#high rcvbuf
  92.     mov    dpl,r3
  93.     movx    a,@dptr
  94.     unchar
  95. L7450:    clr    c        ; if chksum <> chk then typ = 'Q'
  96.     subb    a,Chk        ; = 0 if equal
  97.     jz    L7460
  98.     mov    TYP,#'Q'
  99. L7460:    ret
  100.  
  101.