[Back to MEMORY SWAG index]  [Back to Main SWAG index]  [Original]

{

>> I'm not sure about I/O accesses in protected mode, I haven't had to
>> fiddle with it. It should work I think, the DPMI server should give the
>> program access to all ports?

> Through virtual emulation? Otherwise, they simply don't work...
> I can post some code here if you'd like to look into it.

I'd like to have a look. To at least see if it does the same on my system.
You could try this program:
}

Program TestIO;

TYPE
  TDescriptor = Record
    Limit0015 : Word;
    Base0015  : Word;
    Base1623  : Byte;
    Rights    : Byte;   { 7=Prsnt, 6-5=Dpl, 4=App,  }
                        { 3-0=Type                  }
    Rights386 : Byte;   { 7=Gran, 6=Size32, 5=0,    }
                        { 4=Avail, 3-0=Limit1619    }
    Base2431  : Byte;
  End;

Function  GetDPL(Sel: Word): Word;
Var
  Buffer : TDescriptor;
  p      : Pointer;
BEGIN
  p := @buffer;
  ASM
    { load descriptor }
    mov ax, 000Bh
    mov bx, [sel]
    les di, [p]
    int 31h

    Mov   Ax,[Word Ptr Buffer+5]
    shr ax, 5
    and ax, 3
    mov [@result], ax
  END
End;

FUNCTION GetIOPL: Word;
BEGIN
  ASM
    pushf
    pop ax

    mov cl, 12
    shr ax, cl
    and ax, 3
    mov [@result], ax
  END
END;


VAR
  dpl, iopl : Word;
Begin
  dpl := GetDPL(CSeg);
  WriteLn('Your current privilege level (DPL)  = ', dpl);
  iopl := GetIOPL;
  WriteLn('The required privilege level (IOPL) = ', iopl);
  IF (dpl <= iopl) THEN
    WriteLn('You have direct access to all IO ports')
  ELSE
  BEGIN
    WriteLn('You do not have rights to IN/OUT instructions,');
    WriteLn('unless it is allowed for the particular port');
    Writeln('in the IO Permission bitmap.')
  END;
  ASM
    mov dx, 3F8h
    in al, dx
    inc dx
    in al, dx
  END
End.

{
If the DPL and IOPL are the same (both are 3 on my system) you should have
direct access to the ports. If the IOPL is less than 3, the DPMI server isn't
giving you access for some reason. The 'IN's at the end run fine on my PC.

 > I know, i know, but where can i find the list of
 > interrupts *not automatically translated* by the DPMI server?

    I'm sure I've seen it in the manual somewhere, but can't find it now. Most
documented DOS/BIOS interrupts should be covered, but anything else most likely
isn't. The DPMI 0.9 Spec says:
"In general, any software interrupt interface that passes parameters in the
EAX, EBX, ECX, EDX, ESI, EDI and EBP registers will work as long as none of the
registers contains a segment value. In other words, if a software interrupt
interface is completely register based without any pointers, segment register,
or stack parameters, that API could work under any DPMI implementation."

    I THINK automatic translation of common functions is provided by RTM, and
not the DPMI server directly, which at least means that it should work the same
whether you're using Borlands DPMI server or one in a Dos box etc.
}

[Back to MEMORY SWAG index]  [Back to Main SWAG index]  [Original]