home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************
- ;*
- ;* MegaGraph Graphics Library
- ;*
- ;* Copyright (C) 1993 Kendall Bennett.
- ;* All rights reserved.
- ;*
- ;* Filename: $RCSfile: sv_ports.asm $
- ;* Version: $Revision: 1.1 $
- ;*
- ;* Language: 80386 Assembler
- ;* Environment: IBM PC (MS DOS)
- ;*
- ;* Description: Number of macros to simplify the coding required to read
- ;* write and modify I/O ports. A little slower than doing
- ;* it directly, but more readable.
- ;*
- ;* $Id: sv_ports.asm 1.1 1993/03/03 10:46:44 kjb Exp $
- ;*
- ;* Revision History:
- ;* -----------------
- ;*
- ;* $Log: sv_ports.asm $
- ;* Revision 1.1 1993/03/03 10:46:44 kjb
- ;* Initial revision
- ;*
- ;****************************************************************************
-
- MACRO inp port
- mov dx,port ;; Read a byte from port 'port' into al
- in al,dx
- ENDM
-
- MACRO outp port, value
- mov dx,port ;; Write a byte to port 'port'
- mov al,value
- out dx,al
- ENDM
-
- MACRO rdinx port, index
- mov dx,port ;; Read register 'port' index 'index'
- mov al,index
- out dx,al
- inc dx
- in al,dx ;; Result in AL
- ENDM
-
- MACRO wrinx port, index, val
- mov al,index ;; Write 'port' index 'index' with 'val'
- mov ah,val
- mov dx,port
- out dx,ax
- ENDM
-
- MACRO modinx port, index, mask, nvw
- mov dx,port
- mov al,index
- out dx,al
- inc dx
- in al,dx ;; Read the old value
- and al,not mask ;; Mask out bits to be changed
- or al,nvw ;; Or in the changed bits
- out dx,al ;; Write the value back again
- ENDM
-
- MACRO tstreg port, mask
- mov bl,mask ; Mask in BL
- mov dx,port ; Port in DX
- call TestPort ; Test if the port is alive
- ENDM
-
- MACRO tstinx port, reg, mask
- mov bl,mask ; Mask in BL
- mov al,reg ; Index in AL
- mov dx,port ; Port in DX
- call TestPortIndexed ; Test if the port is alive
- ENDM
-
- MACRO DacToPel
- mov dx,3C8h ; Force DAC into PEL mode
- in al,dx
- mov dx,3C6h
- ENDM
-
- MACRO DacToCommand ; Force DAC into command mode
- DacToPel ; Force to PEL mode first
- in al,dx ; Read exactly four times!
- in al,dx
- in al,dx
- in al,dx
- ENDM
-
- ;----------------------------------------------------------------------------
- ; TestPort Check to see if an I/O port is alive
- ;----------------------------------------------------------------------------
- ;
- ; Tests to see if the bits in the specified mask are readable and writable
- ; at the specified port.
- ;
- ; Entry: BL - Mask value
- ; DX - Port to check
- ;
- ; Exit: ZF set if check passed
- ;
- ; Registers: AX,BX,CX,DX
- ;
- ;----------------------------------------------------------------------------
- PROC TestPort
-
- in al,dx ; Read old value from port
- mov cl,al ; CL := old value
- mov bh,bl
- not bh ; BH := NOT mask
- and al,bh ; AL := old value AND (NOT mask)
- out dx,al ; Clear all the bits in the mask
- in al,dx ; Read value back
- and al,bl ; Mask out bits changed
- jnz @@NoPort ; Masked value should be all zeros if alive
-
- mov al,cl
- or al,bl ; AL := old value OR mask
- out dx,al ; Set all bits in the mask
- in al,dx ; Read value back
- and al,bl ; Mask out bits changed
- cmp al,bl ; Set ZF (all bits should be set) if alive
-
- @@NoPort:
- mov al,cl
- out dx,al ; Restore old value
- ret
-
- ENDP TestPort
-
- ;----------------------------------------------------------------------------
- ; TestPortIndexed Check to see if an indexed port is alive
- ;----------------------------------------------------------------------------
- ;
- ; Tests to see if the bits in the specified mask are readable and writeable
- ; at the indexed port.
- ;
- ; Entry: AL - Port register index
- ; BL - Mask value
- ; DX - Port to check
- ;
- ; Exit: ZF set if check passed
- ;
- ; Registers: AX,BX,CX,DX
- ;
- ;----------------------------------------------------------------------------
- PROC TestPortIndexed
-
- out dx,al ; Index the specified register
- inc dx ; Increment to data register port
- call TestPort ; And test the port
- ret
-
- ENDP TestPortIndexed
-
-