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