home *** CD-ROM | disk | FTP | other *** search
/ World of Graphics / WOGRAPH.BIN / 477.SV_PORTS.ASM < prev    next >
Assembly Source File  |  1993-03-07  |  4KB  |  159 lines

  1. ;****************************************************************************
  2. ;*
  3. ;*                        MegaGraph Graphics Library
  4. ;*
  5. ;*                  Copyright (C) 1993 Kendall Bennett.
  6. ;*                            All rights reserved.
  7. ;*
  8. ;* Filename:    $RCSfile: sv_ports.asm $
  9. ;* Version:        $Revision: 1.1 $
  10. ;*
  11. ;* Language:    80386 Assembler
  12. ;* Environment:    IBM PC (MS DOS)
  13. ;*
  14. ;* Description:    Number of macros to simplify the coding required to read
  15. ;*                write and modify I/O ports. A little slower than doing
  16. ;*                it directly, but more readable.
  17. ;*
  18. ;* $Id: sv_ports.asm 1.1 1993/03/03 10:46:44 kjb Exp $
  19. ;*
  20. ;* Revision History:
  21. ;* -----------------
  22. ;*
  23. ;* $Log: sv_ports.asm $
  24. ;* Revision 1.1  1993/03/03  10:46:44  kjb
  25. ;* Initial revision
  26. ;*
  27. ;****************************************************************************
  28.  
  29. MACRO    inp        port
  30.     mov        dx,port                    ;; Read a byte from port 'port' into al
  31.     in        al,dx
  32. ENDM
  33.  
  34. MACRO    outp    port, value
  35.     mov        dx,port                    ;; Write a byte to port 'port'
  36.     mov        al,value
  37.     out        dx,al
  38. ENDM
  39.  
  40. MACRO    rdinx    port, index
  41.     mov        dx,port                    ;; Read register 'port' index 'index'
  42.     mov        al,index
  43.     out        dx,al
  44.     inc        dx
  45.     in        al,dx                    ;; Result in AL
  46. ENDM
  47.  
  48. MACRO    wrinx    port, index, val
  49.     mov        al,index                ;; Write 'port' index 'index' with 'val'
  50.     mov        ah,val
  51.     mov        dx,port
  52.     out        dx,ax
  53. ENDM
  54.  
  55. MACRO    modinx    port, index, mask, nvw
  56.     mov        dx,port
  57.     mov        al,index
  58.     out        dx,al
  59.     inc        dx
  60.     in        al,dx                    ;; Read the old value
  61.     and        al,not mask                ;; Mask out bits to be changed
  62.     or        al,nvw                    ;; Or in the changed bits
  63.     out        dx,al                    ;; Write the value back again
  64. ENDM
  65.  
  66. MACRO    tstreg    port, mask
  67.     mov        bl,mask                    ; Mask in BL
  68.     mov        dx,port                    ; Port in DX
  69.     call    TestPort                ; Test if the port is alive
  70. ENDM
  71.  
  72. MACRO    tstinx    port, reg, mask
  73.     mov        bl,mask                    ; Mask in BL
  74.     mov        al,reg                    ; Index in AL
  75.     mov        dx,port                    ; Port in DX
  76.     call    TestPortIndexed            ; Test if the port is alive
  77. ENDM
  78.  
  79. MACRO    DacToPel
  80.         mov        dx,3C8h                ; Force DAC into PEL mode
  81.         in        al,dx
  82.         mov        dx,3C6h
  83. ENDM
  84.  
  85. MACRO    DacToCommand                ; Force DAC into command mode
  86.         DacToPel                    ; Force to PEL mode first
  87.         in        al,dx                ; Read exactly four times!
  88.         in        al,dx
  89.         in        al,dx
  90.         in        al,dx
  91. ENDM
  92.  
  93. ;----------------------------------------------------------------------------
  94. ; TestPort    Check to see if an I/O port is alive
  95. ;----------------------------------------------------------------------------
  96. ;
  97. ; Tests to see if the bits in the specified mask are readable and writable
  98. ; at the specified port.
  99. ;
  100. ; Entry:        BL    - Mask value
  101. ;                DX    - Port to check
  102. ;
  103. ; Exit:            ZF set if check passed
  104. ;
  105. ; Registers:    AX,BX,CX,DX
  106. ;
  107. ;----------------------------------------------------------------------------
  108. PROC    TestPort
  109.  
  110.         in        al,dx            ; Read old value from port
  111.         mov        cl,al            ; CL := old value
  112.         mov        bh,bl
  113.         not        bh                ; BH := NOT mask
  114.         and        al,bh            ; AL := old value AND (NOT mask)
  115.         out        dx,al            ; Clear all the bits in the mask
  116.         in        al,dx            ; Read value back
  117.         and        al,bl            ; Mask out bits changed
  118.         jnz        @@NoPort        ; Masked value should be all zeros if alive
  119.  
  120.         mov        al,cl
  121.         or        al,bl            ; AL := old value OR mask
  122.         out        dx,al            ; Set all bits in the mask
  123.         in        al,dx            ; Read value back
  124.         and        al,bl            ; Mask out bits changed
  125.         cmp        al,bl            ; Set ZF (all bits should be set) if alive
  126.  
  127. @@NoPort:
  128.         mov        al,cl
  129.         out        dx,al            ; Restore old value
  130.         ret
  131.  
  132. ENDP    TestPort
  133.  
  134. ;----------------------------------------------------------------------------
  135. ; TestPortIndexed   Check to see if an indexed port is alive
  136. ;----------------------------------------------------------------------------
  137. ;
  138. ; Tests to see if the bits in the specified mask are readable and writeable
  139. ; at the indexed port.
  140. ;
  141. ; Entry:        AL    - Port register index
  142. ;                BL    - Mask value
  143. ;                DX    - Port to check
  144. ;
  145. ; Exit:            ZF set if check passed
  146. ;
  147. ; Registers:    AX,BX,CX,DX
  148. ;
  149. ;----------------------------------------------------------------------------
  150. PROC    TestPortIndexed
  151.  
  152.         out        dx,al            ; Index the specified register
  153.         inc        dx                ; Increment to data register port
  154.         call    TestPort        ; And test the port
  155.         ret
  156.  
  157. ENDP    TestPortIndexed
  158.  
  159.