<br><br><div><span class="gmail_quote">On 1/12/07, <b class="gmail_sendername">Tomas Hajny</b> <<a href="mailto:XHajT03@mbox.vol.cz">XHajT03@mbox.vol.cz</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
In general case when using plain DOS (when using virtual DOS machines<br>provided by some other platforms like WinXX or OS/2, DPMI is provided<br>directly by the platform and interface to it is part of the VDM kernel).<br>
The only "magic" is detection of DPMI (int 31h support) availability,<br>potentially launching CWSDPMI.EXE host and switching into 32-bit protected<br>mode. Interfacing to functions provided by the host is part of GO32v2 RTL
<br>(using int 31h services), or some host services just overlay the usual DOS<br>services (overridden int 21h calls).</blockquote><div><br>wow...this is some hardcore stuff...gotta read the manuals and try some code in order to understand it correctly (specially the overriden part) 
</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Just very briefly:<br><br>1) Read what our manual, wiki and mailing lists contributions state on FPC
<br>calling conventions (i.e. how parameters are passed to<br>functions/procedures and how the stack organization and processing look<br>like) - this is certainly different from TP/BP. This implies changes of<br>code using [bp].
<br><br>2) In general, you should use 32-bit registers rather than 16-bit<br>registers (I believe there's even some speed penalty on some CPUs when<br>using 16-bit registers, but more importantly, the overridden functions may
<br>even _require_ providing parameters in 32-bit registers as opposed to e.g.<br>standard DOS functions) - i.e. eax instead of ax, etc.<br><br>3) If you need to exchange data with the underlying 16-bit code like BIOS<br>
functions (yes, this includes your read/write sectore functions), the used<br>memory buffer must be placed in a memory area where the 16-bit code can<br>access it (= within the first MB of RAM) if it's your code allocating the
<br>buffer and you need to make sure that you can access it too. This is<br>achieved using DPMI functions (read DPMI specification to find out more,<br>or at least have a look at some FPC RTL code using these int 31h<br>functions).
<br><br>4) In general, you don't touch any segment registers - all your data are<br>available in flat memory model, where everything is available using 32-bit<br>addressing and ds=es=ss (i.e. no instructions like lds/les needed, no mov
<br>es:[xx],yy, etc.). There's one exception directly related to the previous<br>point related to sharing data with 16-bit code - if you pass parameters<br>to/receive results from 16-bit code/functions, you need to translate the
<br>16:16 16-bit addresses to 0:32 addresses used in 32-bit code and vice<br>versa (as described above) and then you obviously might need to change<br>some segment registers too immediately before/after the 16-bit function
<br>call (however, these cases are normally solved using helper functions like<br>the DPMI support function for calling 16-bit interrupts, i.e. your code<br>wouldn't be directly messing with segment registers anyway).
</blockquote><div><br>thanks for this...i've got myself some firmware code to write for work but as soon as i get home and setup my old box this will be studied carefully<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Tomas<br><br>_______________________________________________<br>fpc-pascal maillist  -  <a href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.org</a><br><a href="http://lists.freepascal.org/mailman/listinfo/fpc-pascal">
http://lists.freepascal.org/mailman/listinfo/fpc-pascal</a><br></blockquote></div><br><br clear="all"><br>-- <br>Daniel<br><br>"Let us change our traditional attitude to the construction of programs. Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do." (Donald Knuth)
<br><br>"Yes, technogeeks can be funny, even if only to each other." (<a href="http://www.boogieonline.com/revolution/science/humor/">http://www.boogieonline.com/revolution/science/humor/</a>)"<br><br>"Man is driven to create; I know I really love to create things. And while I'm not good at painting, drawing, or music, I can write software." (Yukihiro Matsumoto, 
a.k.a. ``Matz'')