NT4/private/ntos/miniport/trantor/source/scsiport.c
2020-09-30 17:12:29 +02:00

182 lines
3.3 KiB
C

//------------------------------------------------------------------------
//
// SCSIPORT.C
//
// DOS Port Access File
//
// Contains functions to access I/O and memory ports. Some of these
// routines may not be called for some cards. IO access routines are
// called for IO mapped cards, Mem access routines are called for Mem
// mapped cards.
//
// For DOS these are simple assembly functions.
//
// Revisions:
// 01-29-93 KJB First.
// 03-03-93 KJB Improved comments.
// 03-22-93 KJB Reorged for stub function library.
// 03-25-93 JAP Fixed up typedef and prototype inconsistencies
//
//------------------------------------------------------------------------
#include CARDTXXX_H
//
// ScsiPortReadPortUchar
//
// Does an "in" instruction from i/o port p.
// Returns the value.
//
UCHAR ScsiPortReadPortUchar (PUCHAR p)
{
UCHAR rval;
_asm {
mov dx,word ptr p
in al,dx
mov rval,al
}
return rval;
}
//
// ScsiPortWritePortUchar
//
// Does an "out" instruction to i/o port p.
//
VOID ScsiPortWritePortUchar(PUCHAR p,UCHAR b)
{
_asm {
mov dx,word ptr p
mov al,b
out dx,al
}
}
//
// ScsiPortReadPortUshort
//
// Does an "in" instruction from i/o port p.
// Returns the value.
//
USHORT ScsiPortReadPortUshort(PUSHORT p)
{
USHORT rval;
_asm {
mov dx,word ptr p
in ax,dx
mov rval,ax
}
return rval;
}
//
// ScsiPortWritePortUshort
//
// Does an "out" instruction to i/o port p.
//
VOID ScsiPortWritePortUshort(PUSHORT p,USHORT w)
{
_asm {
mov dx,word ptr p
mov ax,w
out dx,ax
}
}
//
// ScsiPortWritePortBufferUshort
//
// Does an "rep outsw" instruction to i/o port p.
//
VOID ScsiPortWritePortBufferUshort(PUSHORT p, PUSHORT buffer, ULONG len)
{
_asm {
push ds
push esi
mov dx,word ptr p
mov esi,word ptr buffer
mov ds,word ptr buffer+2
mov cx,word ptr len
rep outsw
pop esi
pop ds
}
}
//
// ScsiPortReadPortBufferUshort
//
// Does an rep "insw" instruction from i/o port p.
//
VOID ScsiPortReadPortBufferUshort(PUSHORT p, PUSHORT buffer, ULONG len)
{
_asm {
push es
push edi
mov dx,word ptr p
mov di,word ptr buffer
mov es,word ptr buffer+2
mov cx,word ptr len
rep insw
pop edi
pop es
}
}
//
// ScsiPortReadPortRegisterUchar
//
// Reads a memory mapped i/o address.
// Returns the value.
//
UCHAR ScsiPortReadRegisterUchar(PUCHAR p)
{
UCHAR rval;
_asm {
push es
mov bx,word ptr p
mov es,word ptr p+2
mov al,es:[bx]
mov rval, al
pop es
}
return rval;
}
//
// ScsiPortWritePortRegisterUchar
//
// Writes a value to a memory mapped i/o address.
//
VOID ScsiPortWriteRegisterUchar(PUCHAR p,UCHAR b)
{
_asm {
push es
mov bx,word ptr p
mov es,word ptr p+2
mov al, b
mov es:[bx],al
pop es
}
}
//
// ScsiPortStallExecution
//
// Stalls executeion for time micro seconds. Should be processor,
// independent, but for now we will do just a loop.
//
VOID ScsiPortStallExecution(ULONG time)
{
ULONG i;
if (time>1) {
for (i=0;i<time;i++);
}
}