windows-nt/Source/XPSP1/NT/base/boot/lib/i386/xxioacc.asm

363 lines
6.5 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
title "ix ioaccess"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; ixioacc.asm
;
; Abstract:
;
; Procedures to correctly touch I/O registers.
;
; Author:
;
; Bryan Willman (bryanwi) 16 May 1990
;
; Environment:
;
; User or Kernel, although privledge (IOPL) may be required.
;
; Revision History:
;
;--
.386p
include callconv.inc
.list
_TEXT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; I/O port space read and write functions.
;
; These have to be actual functions on the 386, because we need
; to use assembler, but cannot return a value if we inline it.
;
; This set of functions manipulates I/O registers in PORT space.
; (Uses x86 in and out instructions)
;
; WARNING: Port addresses must always be in the range 0 to 64K, because
; that's the range the hardware understands.
;
;--
;++
;
; UCHAR
; READ_PORT_UCHAR(
; PUCHAR Port
; )
;
; Arguments:
; (esp+4) = Port
;
; Returns:
; Value in Port.
;
;--
cPublicProc _READ_PORT_UCHAR,1
mov dx,[esp+4] ; (dx) = Port
in al,dx
stdRET _READ_PORT_UCHAR
stdENDP _READ_PORT_UCHAR
;++
;
; USHORT
; READ_PORT_USHORT(
; PUSHORT Port
; )
;
; Arguments:
; (esp+4) = Port
;
; Returns:
; Value in Port.
;
;--
cPublicProc _READ_PORT_USHORT,1
mov dx,[esp+4] ; (dx) = Port
in ax,dx
stdRET _READ_PORT_USHORT
stdENDP _READ_PORT_USHORT
;++
;
; ULONG
; READ_PORT_ULONG(
; PULONG Port
; )
;
; Arguments:
; (esp+4) = Port
;
; Returns:
; Value in Port.
;
;--
cPublicProc _READ_PORT_ULONG,1
mov dx,[esp+4] ; (dx) = Port
in eax,dx
stdRET _READ_PORT_ULONG
stdENDP _READ_PORT_ULONG
;++
;
; VOID
; READ_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_PORT_BUFFER_UCHAR,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push edi
mov edi,[esp+12] ; (edi) = (esp+8+push) = buffer
rep insb
pop edi
stdRET _READ_PORT_BUFFER_UCHAR
stdENDP _READ_PORT_BUFFER_UCHAR
;++
;
; VOID
; READ_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_PORT_BUFFER_USHORT,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push edi
mov edi,[esp+12] ; (edi) = (esp+8+push) = buffer
rep insw
pop edi
stdRET _READ_PORT_BUFFER_USHORT
stdENDP _READ_PORT_BUFFER_USHORT
;++
;
; VOID
; READ_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_PORT_BUFFER_ULONG,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push edi
mov edi,[esp+12] ; (edi) = (esp+8+push) = buffer
rep insd
pop edi
stdRET _READ_PORT_BUFFER_ULONG
stdENDP _READ_PORT_BUFFER_ULONG
;++
;
; VOID
; WRITE_PORT_UCHAR(
; PUCHAR Port,
; UCHAR Value
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Value
;
;--
cPublicProc _WRITE_PORT_UCHAR,2
mov dx,[esp+4] ; (dx) = Port
mov al,[esp+8] ; (al) = Value
out dx,al
stdRET _WRITE_PORT_UCHAR
stdENDP _WRITE_PORT_UCHAR
;++
;
; VOID
; WRITE_PORT_USHORT(
; PUSHORT Port,
; USHORT Value
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Value
;
;--
cPublicProc _WRITE_PORT_USHORT,2
mov dx,[esp+4] ; (dx) = Port
mov ax,[esp+8] ; (ax) = Value
out dx,ax
stdRET _WRITE_PORT_USHORT
stdENDP _WRITE_PORT_USHORT
;++
;
; VOID
; WRITE_PORT_ULONG(
; PULONG Port,
; ULONG Value
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Value
;
;--
cPublicProc _WRITE_PORT_ULONG,2
mov dx,[esp+4] ; (dx) = Port
mov eax,[esp+8] ; (eax) = Value
out dx,eax
stdRET _WRITE_PORT_ULONG
stdENDP _WRITE_PORT_ULONG
;++
;
; VOID
; WRITE_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_PORT_BUFFER_UCHAR,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push esi
mov esi,[esp+12] ; (esi) = (esp+8+push) = buffer
rep outsb
pop esi
stdRET _WRITE_PORT_BUFFER_UCHAR
stdENDP _WRITE_PORT_BUFFER_UCHAR
;++
;
; VOID
; WRITE_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_PORT_BUFFER_USHORT,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push esi
mov esi,[esp+12] ; (esi) = (esp+8+push) = buffer
rep outsw
pop esi
stdRET _WRITE_PORT_BUFFER_USHORT
stdENDP _WRITE_PORT_BUFFER_USHORT
;++
;
; VOID
; WRITE_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Port
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_PORT_BUFFER_ULONG,3
mov dx,[esp+4] ; (dx) = Port
mov ecx,[esp+12] ; (ecx) = transfer count
push esi
mov esi,[esp+12] ; (esi) = (esp+8+push) = buffer
rep outsd
pop esi
stdRET _WRITE_PORT_BUFFER_ULONG
stdENDP _WRITE_PORT_BUFFER_ULONG
_TEXT ends
end