home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 098.lha / EMIT / ser.asm < prev   
Assembly Source File  |  1986-11-20  |  3KB  |  128 lines

  1. * ------------------------------------------------------------------------- *
  2. * Serial.asm -- Hardware level serial access routines.
  3. * Copyright by Justin V. McCormick 1988
  4. * ------------------------------------------------------------------------- *
  5.  
  6.     include "macros.i"
  7.  
  8.  
  9. serdatr        EQU    $dff018
  10. serdat        EQU    $dff030
  11. intreq        EQU    $dff09C
  12. intena        EQU    $dff09A
  13.  
  14. CLR_RFB        EQU    $0800
  15. SET_RFB        EQU    $8800
  16.  
  17.     XLVO    Forbid
  18.     XLVO    Disable
  19.     XLVO    Permit
  20.     XLVO    Enable
  21.  
  22. * ------------------------------------------------------------------------- *
  23. * SerialRead(buffer, bufsize)
  24. *   UBYTE *buffer;
  25. *   LONG bufsize;
  26. *   
  27. * Reads bufsize bytes from the serial port, puts them in buffer.
  28. * ------------------------------------------------------------------------- *
  29.     xdef    _SerialRead
  30. _SerialRead:
  31.     link    a5,#0
  32.     movem.l    d2-d7/a2-a3,-(sp)
  33.  
  34.     SYS    Forbid,4
  35.     SYS    Disable
  36.  
  37.     movea.l    8(a5),a3    ;Grab pointer to output buffer
  38.     move.l    12(a5),d7    ;Number of bytes to read
  39.     movea.l    #serdatr,a2    ;Grab pointer to serial data receive register
  40.     moveq    #0,d0        ;Clear out work register
  41.     move.w    #CLR_RFB,intena    ;Don't want RFB interrupts to bother us
  42.  
  43.     move.w    #CLR_RFB,intreq    ;Receive buffer not full yet
  44.  
  45.     moveq    #14,d1
  46.     move.l    #500000,d2    ;Max wait for char delay
  47.     move.l    d2,d3        ;Set timeout delay
  48.  
  49. 1$
  50.     move.w    (a2),d0        ;Grab serdatr info
  51.     btst.l    d1,d0        ;Is Receive Buffer Full?
  52.      bne.s    2$        ;Yep
  53.     subq.l    #1,d3
  54.      bgt.s    1$        ;Loop some more
  55.     bra.s    3$        ;Max timeout! exit
  56.  
  57. 2$
  58.     move.b    d0,(a3)+    ;Stash this byte
  59.     move.w    #CLR_RFB,intreq    ;Clear RFB flag
  60.     move.l    d2,d3        ;Reset timeout counter
  61.  
  62.     subq.l    #1,d7        ;One more byte done
  63.      bgt.s    1$        ;Grab next one
  64.  
  65. 3$
  66.     SYS    Enable
  67.     SYS    Permit
  68.  
  69.     movem.l    (sp)+,d2-d7/a2-a3
  70.     unlk    a5
  71.     rts
  72.  
  73. * ------------------------------------------------------------------------- *
  74. * SerialWrite(buffer, bufsize)
  75. *   UBYTE *buffer;
  76. *   LONG bufsize;
  77. *   
  78. * Writes bufsize bytes from buffer to the serial port.
  79. * ------------------------------------------------------------------------- *
  80.     xdef    _SerialWrite
  81. _SerialWrite:
  82.     link    a5,#0
  83.     movem.l    d2-d7/a2-a3,-(sp)
  84.  
  85.     movea.l    8(a5),a3    ;Grab pointer to input buffer
  86.     move.l    12(a5),d7    ;Number of bytes to write
  87.     movea.l    #serdatr,a2    ;Grab pointer to serial data receive register
  88.     movea.l    #serdat,a1    ;Grab pointer to serial data xmit register
  89.  
  90.     move.w    #1,intena    ;Don't want TBE interrupts to occur
  91.     move.w    #$8001,intreq    ;Transmit buffer starts empty
  92.  
  93.     move.l    #100000,d2    ;Max wait for char delay
  94.     move.l    d2,d3        ;Set timeout delay
  95.     move.l    #$0100,d0    ;Initialize data out
  96.  
  97.     moveq    #13,d1        ;TBE test bit
  98.  
  99. 1$
  100.     move.b    (a3)+,d0    ;Grab a byte from the buffer
  101.     move.w    d0,(a1)        ;Start sending it
  102.  
  103. 33$
  104.     move.w    (a2),d4        ;Grab serdatr info
  105.     btst.l    d1,d4        ;Is Transmit buffer empty yet?
  106.      bne.s    2$        ;Yep
  107.  
  108.     subq.l    #1,d3
  109.      bgt.s    33$        ;Loop some more
  110.     bra.s    3$        ;Max timeout! buffer won't empty, so exit
  111.  
  112. 2$
  113.     move.w    #1,intreq    ;Clear TBE flag
  114.     move.l    d2,d3        ;Reset timeout counter
  115.  
  116.     subq.l    #1,d7        ;One more byte done
  117.      bgt.s    1$        ;Grab next one
  118.  
  119. 3$
  120.  
  121.     movem.l    (sp)+,d2-d7/a2-a3
  122.     unlk    a5
  123.     rts
  124.     
  125.  
  126. * ------------------------------------------------------------------------- *
  127.     end
  128.