delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/01/04/04:30:54

Date: Thu, 4 Jan 2001 11:05:39 +0200 (IST)
From: Eli Zaretskii <eliz AT is DOT elta DOT co DOT il>
X-Sender: eliz AT is
To: jvasquez AT getntds DOT com
cc: djgpp AT delorie DOT com
Subject: RE: Linear memory and Physical Memory
In-Reply-To: <2178200CCE4ED311974300A0CC4263FB06B3D1@accounting>
Message-ID: <Pine.SUN.3.91.1010104110437.14486M-100000@is>
MIME-Version: 1.0
Reply-To: djgpp AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

[Please keep the news group cc:'ed, don't write to me alone: I think
this discussion is useful for others as well.]

On Wed, 3 Jan 2001 jvasquez AT getntds DOT com wrote:

> Are there any sample code that will show me how to do the steps outlined in
> chapter 18.13? The paragraph discribing XMS operation is kinda cyptic.

DMA programming has ``cryptic'' written all over it.  You should get
used to this ;-)

As for code examples, search the archives of this news group for
keywords such as XMS and DMA.  I think someone posted some code here
in the past.  The archives can be searched at this URL:

  http://www.delorie.com/djgpp/mail-archives/

> I use int86x(0x2f,&inregs,&outregs,&sregs) setting inregs.x.ax to 0x4310.

Bad idea: use __dpmi_int instead.  I suggest to read sections 18.1,
18.2, and 18.4 at least, before writing such low-level code.  If you
can afford it, I suggest to read the entire Chapter 18.

> union REGS inregs,outregs;
> struct SREGS segregs
> inregs.x.ax = 0x4310;
> if (int86x(0x2f,&inregs,&outregs,&segregs) == 0)

This will most probably crash: you pass garbage in sregs.  Use
__dpmi_int instead, as I said above.

> Xms.segment = segregs.es; //=0

Why do you think Xms.segment is (or should be) zero?  I don't think it
should, in general.

> DpmiRegs.x.sp = 0;
> DpmiRegs.x.ss = 0;
> DpmiRegs.x.flags = 0;

It's much better to use memset to zero out the entire DpmiRegs
variable.


> DpmiRegs.x.es = Xms.segment; //obtain from function 4310h - value = 0
> DpmiRegs.x.di = Xms.offset16;//obtain from function 4310h - some value
> 
> DpmiRegs.x.ax = 0x900;  //function 9
> DpmiRegs.x.dx = 64;	//64 k buffers
> __dpmi_simulate_real_mode_procedure_retf(&DpmiRegs); //system hangs-up I
> must reboot

This seems very wrong: why did you put the entry point returned by
4310h into ES:DI?  The XMS spec clearly says that you should simply
_call_ that address.  This means you need to put it int CS:IP in the
DpmiRegs structure, not into ES:DI.

As written, your code leaves random garbage in CS:IP, so the CPU jumps
into the blue and gets wedged, as expected.

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019