home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / connect / tcpip / crynwr / pktd11c / lan595io.asm < prev    next >
Assembly Source File  |  1993-12-11  |  6KB  |  184 lines

  1.  
  2. ;input a word from I/O port
  3. inw    macro
  4.     call    inw_routine
  5.     endm
  6.  
  7. ; Input a word from I/O port, 16 bits at one time
  8. inw_16    PROC    NEAR
  9.     in    ax,dx
  10.     ret
  11. inw_16    ENDP
  12.  
  13. ; Input a word from I/O port, 2 8 bits reads
  14. inw_2_8    PROC    NEAR
  15.     in        al, dx            ; Read low address byte
  16.     mov        ah, al            ; Save byte
  17.     inc        dx                ; Next I/O address
  18.     in        al, dx            ; Read high address byte
  19.     xchg    ah, al            ; Swap bytes 
  20.     dec        dx                ; Restore I/O address
  21.     ret
  22. inw_2_8    ENDP
  23.  
  24. ; Write a word to an I/O port
  25. outw    macro
  26.     call    outw_routine
  27.     endm
  28.  
  29. ; Output a word to I/O port, 16 bits at one time
  30. outw_16    PROC    NEAR
  31.     out        dx, ax            ; Write to the I/O port
  32.     ret
  33. outw_16    ENDP
  34.  
  35.  
  36. ; Output a word to I/O port, 2 8 bit writes
  37. outw_2_8    PROC    NEAR
  38.     out        dx, al            ; Write low address byte
  39.     xchg    ah, al            ; Get next byte
  40.     inc        dx                ; Next I/O address
  41.     out        dx, al            ; Write high address byte
  42.     xchg    ah, al            ; Restore AX
  43.     dec        dx                ; Rrestore DX
  44.     ret
  45. outw_2_8    ENDP
  46.  
  47.  
  48.     extrn    is_186: byte        ;=0 if 808[68], =1 if 80[123]86.
  49.  
  50.     .286
  51. quick_rep_ins_16    PROC    NEAR
  52. ; Does a repeated in instruction by performing 16 bit reads (186 or better)
  53. ; CX holds the number of ins - no minimum value
  54.     shr        cx, 1            ; Convert the byte count to a word count
  55.     rep        insw            ; Does the entire transfer to the buffer
  56.     jnc        done_q_i_16        ; Jump if cx was initially even
  57.     insb                    ; Read the last byte
  58. done_q_i_16:
  59.     ret
  60. quick_rep_ins_16    ENDP
  61.     .8086
  62.  
  63.  
  64. rep_ins_16    PROC    NEAR
  65. ; Does a repeated in instruction by performing 16 bit reads.
  66. ; CX holds the number of ins - no minimum value
  67.     shr        cx, 1            ; Convert the byte count to a word count
  68.     jcxz    rep_i_16_1    ; Jump if no words to copy 
  69. next_i_16:
  70.     in        ax, dx            ; Get the next word from the port
  71.     stosw                    ; Store this word in the buffer
  72.     loop    next_i_16        ; Continue if there are more words
  73.     jnc        done_i_16        ; Jump if cx was initially even
  74. rep_i_16_1:
  75.     in        al, dx            ; Get the last byte from the low address
  76.     stosb                    ; Store this last byte in the buffer
  77. done_i_16:
  78.     ret
  79. rep_ins_16    ENDP
  80.  
  81.  
  82.     .286
  83. quick_rep_ins_2_8    PROC    NEAR
  84. ; Does a repeated in instruction by performing 2 8 bit writes (186 or better)
  85. ; CX holds the number of ins - no minimum value
  86.     shr        cx, 1            ; Convert the byte count to a word count
  87.     jcxz    rep_q_i_2_8_1    ; Jump if no words to copy 
  88. next_q_i_2_8:
  89.     insb                    ; Store the byte from the low address port
  90.     inc        dx                ; Advance to the high address port
  91.     insb                    ; Store the byte from the high address port
  92.     dec        dx                ; Go back to the low address port
  93.     loop    next_q_i_2_8    ; Continue if more words to read
  94. rep_q_i_2_8_1:
  95.     jnc        done_q_i_2_8    ; Jump if cx was initially even
  96.     insb                    ; Store the last byte from the low address port
  97. done_q_i_2_8:
  98.     ret
  99. quick_rep_ins_2_8    ENDP
  100.     .8086
  101.  
  102. rep_ins_2_8    PROC    NEAR
  103. ; Does a repeated in instruction by performing 2 8 bit writes.
  104. ; CX holds the number of ins - no minimum value
  105.     shr        cx, 1            ; Convert the byte count to a word count
  106.     jcxz    rep_i_2_8_1        ; Jump if no words to copy 
  107. next_i_2_8:
  108.     in        al, dx            ; Get the byte from the low address port
  109.     mov        ah, al            ; Store the low byte
  110.     inc        dx                ; Advance to the high adress port
  111.     in        al, dx            ; Get the byte from the high address port
  112.     xchg    al, ah            ; Swap the bytes
  113.     stosw                    ; Store the word
  114.     dec        dx                ; Go back to the low address port
  115.     loop    next_i_2_8        ; Continue if more words to read
  116. rep_i_2_8_1:
  117.     jnc        done_i_2_8        ; Jump if cx was initially even
  118.     in        al, dx            ; Get the last byte from the low address
  119.     stosb                    ; Store this last byte in the buffer
  120. done_i_2_8:
  121.     ret
  122. rep_ins_2_8    ENDP
  123.  
  124.  
  125.     .286
  126. quick_rep_outw_16    PROC    NEAR
  127. ; Does a repeated out instruction by performing 16 bit writes (186 or better)
  128. ; CX holds the number of outs and will be at least RUNT
  129.     inc        cx                ; To cope with odd packet lengths
  130.     shr        cx, 1            ; Convert the byte count to a word count
  131.     rep        outsw            ; Does the entire transfer
  132.     ret
  133. quick_rep_outw_16    ENDP
  134.     .8086
  135.  
  136.  
  137. rep_outw_16    PROC    NEAR
  138. ; Does a repeated out instruction by performing 16 bit writes.
  139. ; CX holds the number of outs and will be at least RUNT
  140.     inc        cx                ; To cope with odd packet lengths
  141.     shr        cx, 1            ; Convert the byte count to a word count
  142. next_o_16:                    ; Do the transfer of the buffer, a word at a time
  143.     lodsw                    ; Get the next word form the buffer
  144.     out        dx, ax            ; Send it to the port
  145.     loop    next_o_16        ; Continue if there are more bytes
  146. done_o_16:
  147.     ret
  148. rep_outw_16    ENDP
  149.  
  150.  
  151.     .286
  152. quick_rep_outw_2_8    PROC    NEAR
  153. ; Does a repeated out instruction by performing 2 8 bit writes (186 or better) 
  154. ; CX holds the number of outs and will be at least RUNT
  155.     inc        cx                ; To cope with odd packet lengths
  156.     shr        cx, 1            ; Convert the byte count to a word count
  157. next_q_o_2_8:
  158.     outsb                    ; Output 8 bits to the low address
  159.     inc        dx                ; Advance to the high address port
  160.     outsb                    ; Output 8 bits to the high address
  161.     dec        dx                ; Restore the low address port
  162.     loop    next_q_o_2_8    ; Continue if there are more bytes
  163.     ret
  164. quick_rep_outw_2_8        ENDP
  165.     .8086
  166.  
  167.  
  168. rep_outw_2_8    PROC    NEAR
  169. ; Does a repeated out instruction by performing 2 8 bit writes.
  170. ; CX holds the number of outs and will be at least RUNT
  171.     inc        cx                ; To cope with odd packet lengths
  172.     shr        cx, 1            ; Convert the byte count to a word count
  173. next_o_2_8:
  174.     lodsw                    ; Load the next word from the buffer
  175.     out        dx, al            ; Outputs 8 bits to the low address
  176.     inc        dx                ; Advance to the high address port
  177.     mov        al, ah            ; Get teh next byte to ouput
  178.     out        dx, al            ; Output 8 bits to the high address
  179.     dec        dx                ; Restore the low address port
  180.     loop    next_o_2_8        ; Continue if there are more bytes
  181.     ret
  182. rep_outw_2_8    ENDP
  183.  
  184.