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

    {
     SM> I have a bit of a problem with pascal 7 protected mode,
     SM> I have a TSR (assembly) that does my comms work for me.
     SM> I use intr(regs) with various settings to the registers to collect
     SM> data from the TSR. However when in protected mode my TSR seems
     SM> to be unavailable.

    I had the same problem, it seems that the DOS unit does not support protected
    mode interrupt handling. I solved it by looking though some documentation I
    found on protected mode, below is a simple unit to set and get protected
    mode interrupts.

    In my case the interrupt goes about 22Khz so it kept switching into real mode
    and back just to handle the interrupt, the result it crashed.

     SM> Do I need to switch to real mode from the app.
     SM> (if so how, I can't find it in the manual).

    No, see above.

     SM> Do I need to modify my TSR.
     SM> I presume not because I'm sure that the mouse drivers can be got
     SM> to work.

    The MOUSE is handled by the DOS extender.

    Cheers
      Rob

    P.S. I noticed that you use the same BBS, if you have any problems drop
    me a note.
    }

    Unit DPMIDos;  { This code was a quick hack job to solve my problem }
                   { don't expect it to be neat!                        }

    INTERFACE

    Function RealMode : Boolean;
    Function AllocateLDT(NumberDescriptors : Word) : Word;
    Function FreeLDT(Selector : Word) : Boolean;
    Function SegmentToDescriptor(Segment : Word) : Word;
    Function GetNextSelectorInc : Word;
    Function GetDPMIntVec(IntNumber : Byte) : Pointer;
    Procedure SetDPMIntVec(IntNumber : Byte; IntVec : Pointer);

    IMPLEMENTATION

    Function RealMode : Boolean; assembler;
    asm
      mov     ax, 01686h
      int     02Fh
    end;

    Function AllocateLDT(NumberDescriptors : Word) : Word; assembler;
    asm
       mov     ax, 0000h
       mov     ax, NumberDescriptors
       int     031h
       jnc     @Ok
       mov     ax, 0
     @Ok:
    end;

    Function FreeLDT(Selector : Word) : Boolean; assembler;
    asm
       mov     ax, 0001h
       mov     bx, Selector
       int     031h
       mov     ax, 1
       jnc     @Ok
       mov     ax, 0
     @Ok:
    end;

    Function SegmentToDescriptor(Segment : Word) : Word; assembler;
    asm
       mov     ax, 0002h
       mov     bx, Segment
       int     31h
       jnc     @Ok
       mov     ax, 0
     @Ok:
    end;

    Function GetNextSelectorInc : Word; assembler;
    asm
       mov     ax, 0003h
       int     031h
    end;

    Function GetDPMIntVec(IntNumber : Byte) : Pointer; {assembler;}
    Var S, O : Word;    { Too lazy to look in the manual! }
    Begin
      asm
         mov    ax, 0204h
         mov    bl, IntNumber
         int    031h
         mov    S, cx
         mov    O, dx
      end;
      GetDPMIntVec := Ptr(S, O);
    End;

    Procedure SetDPMIntVec(IntNumber : Byte; IntVec : Pointer); assembler;
    asm
       mov    ax, 0205h
       mov    bl, IntNumber

       les    dx, IntVec
       mov    cx, es

       int    031h
    end;

    begin
    end.

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