home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / pibasy.zip / ASYNCREC.ASM < prev    next >
Assembly Source File  |  1987-11-11  |  2KB  |  54 lines

  1. ;
  2. ;  Check if any characters in input comm buffer
  3. ;
  4.          MOV   AX,[>Async_Buffer_Tail]
  5.          CMP   AX,[>Async_Buffer_Head]
  6.          JNE   Rec1
  7. ;
  8. ;  Buffer is empty -- return NUL character
  9. ;
  10.          LES   DI,[BP+<C]                   ;Get character address
  11.          XOR   AX,AX                        ;Clear out unused bits
  12.      ES: MOV   [DI],AL                      ;NUL character
  13.          JMP   Return
  14. ;
  15. ;  Buffer not empty -- pick up next character.
  16. ;
  17. Rec1:    LES   DI,[>Async_Buffer_Ptr]       ;Pick up buffer address
  18.          ADD   DI,AX                        ;Add character offset
  19.      ES: MOV   BL,[DI]                      ;Get character from buffer
  20.          LES   DI,[BP+<C]                   ;Get result address
  21.      ES: MOV   [DI],BL                      ;Store character from buffer
  22.          INC   AX                           ;Increment tail pointer
  23.          CMP   AX,[>Async_Buffer_Size]      ;Past end of buffer?
  24.          JLE   Rec2                         ;No -- skip wrapping
  25.          XOR   AX,AX                        ;Yes -- point to start of buffer
  26. Rec2:    MOV   [>Async_Buffer_Tail],AX      ;Update tail pointer
  27.          DEC   Word [>Async_Buffer_Used]    ;Update buffer use count
  28. ;
  29. ; If XOFF previously sent because buffer was too full, and
  30. ; now buffer is reasonably empty, send XON to get things rolling again.
  31. ;
  32.          TEST  BYTE [<Async_XOff_Sent],1    ;Check if Xoff sent
  33.          JZ    Rec3                         ;No -- skip.
  34. ;
  35.          MOV   AX,[>Async_Buffer_Used]      ;Pick up amount of buffer used
  36.          CMP   AX,[>Async_Buffer_Low]       ;Check if low enough
  37.          JG    Rec3                         ;Still too full, skip
  38. ;
  39.          MOV   AX,>XON                      ;Else push XON onto stack
  40.          PUSH  AX
  41.          CALL  FAR [>Async_Send_Addr]       ;Call output routine
  42. ;
  43.          MOV   BYTE [>Async_XOff_Sent],0    ;Clear Xoff flag
  44. ;
  45. ;  Indicate character found
  46. ;
  47. Rec3:    MOV    AX,1
  48. ;
  49. Return:  AND    Byte [>Async_Line_Status],$FD ;Remove overflow flag
  50.          OR     AX,AX                       ;Set zero flag to indicate return status
  51.          MOV    SP,BP
  52.          POP    BP
  53.          RETF   4
  54.